fix(xcb): Deallocate using deleter
This commit is contained in:
parent
086e498388
commit
ef9b37447b
@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
POLYBAR_NS
|
||||
@ -10,6 +12,14 @@ namespace factory_util {
|
||||
void operator()(T*) const {}
|
||||
};
|
||||
|
||||
struct fd_deleter {
|
||||
void operator()(int* fd) const {
|
||||
if (fd != nullptr && *fd > 0) {
|
||||
close(*fd);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <class InstanceType, class... Deps>
|
||||
unique_ptr<InstanceType> generic_instance(Deps... deps) {
|
||||
return make_unique<InstanceType>(deps...);
|
||||
|
@ -20,6 +20,8 @@ class connection : public xpp_connection {
|
||||
public:
|
||||
explicit connection() {}
|
||||
explicit connection(xcb_connection_t* conn) : xpp_connection(conn) {}
|
||||
explicit connection(xcb_connection_t* conn, int connection_fd)
|
||||
: xpp_connection(conn), m_connection_fd(connection_fd) {}
|
||||
|
||||
connection& operator=(const connection&) {
|
||||
return *this;
|
||||
@ -92,7 +94,8 @@ class connection : public xpp_connection {
|
||||
|
||||
protected:
|
||||
registry m_registry{*this};
|
||||
xcb_screen_t* m_screen = nullptr;
|
||||
xcb_screen_t* m_screen{nullptr};
|
||||
int m_connection_fd{0};
|
||||
};
|
||||
|
||||
di::injector<connection&> configure_connection();
|
||||
|
@ -12,8 +12,6 @@ struct position;
|
||||
using ewmh_connection_t = memory_util::malloc_ptr_t<xcb_ewmh_connection_t>;
|
||||
|
||||
namespace ewmh_util {
|
||||
extern ewmh_connection_t g_ewmh_connection;
|
||||
|
||||
ewmh_connection_t initialize();
|
||||
|
||||
bool supports(xcb_ewmh_connection_t* ewmh, xcb_atom_t atom, int screen = 0);
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <xcb/xcb_util.h>
|
||||
|
||||
#include "common.hpp"
|
||||
#include "utils/memory.hpp"
|
||||
#include "x11/randr.hpp"
|
||||
|
||||
POLYBAR_NS
|
||||
@ -13,6 +14,7 @@ class config;
|
||||
|
||||
namespace xutils {
|
||||
xcb_connection_t* get_connection();
|
||||
int get_connection_fd();
|
||||
|
||||
uint32_t event_timer_ms(const config& conf, const xcb_button_press_event_t&);
|
||||
uint32_t event_timer_ms(const config& conf, const xcb_randr_notify_event_t&);
|
||||
|
@ -118,7 +118,6 @@ controller::~controller() {
|
||||
}
|
||||
|
||||
m_connection.flush();
|
||||
m_connection.disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
|
17
src/main.cpp
17
src/main.cpp
@ -20,10 +20,6 @@ struct exit_success {};
|
||||
struct exit_failure {};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
uint8_t exit_code{EXIT_SUCCESS};
|
||||
bool reload{false};
|
||||
int xfd;
|
||||
|
||||
// clang-format off
|
||||
const command_line::options opts{
|
||||
command_line::option{"-h", "--help", "Show help options"},
|
||||
@ -40,21 +36,20 @@ int main(int argc, char** argv) {
|
||||
|
||||
logger& logger{configure_logger<decltype(logger)>(loglevel::WARNING).create<decltype(logger)>()};
|
||||
|
||||
uint8_t exit_code{EXIT_SUCCESS};
|
||||
bool reload{false};
|
||||
|
||||
try {
|
||||
//==================================================
|
||||
// Connect to X server
|
||||
//==================================================
|
||||
XInitThreads();
|
||||
|
||||
xcb_connection_t* connection{nullptr};
|
||||
|
||||
if ((connection = xutils::get_connection()) == nullptr) {
|
||||
if (!xutils::get_connection()) {
|
||||
logger.err("A connection to X could not be established... ");
|
||||
throw exit_failure{};
|
||||
}
|
||||
|
||||
xfd = xcb_get_file_descriptor(connection);
|
||||
|
||||
//==================================================
|
||||
// Parse command line arguments
|
||||
//==================================================
|
||||
@ -139,10 +134,6 @@ int main(int argc, char** argv) {
|
||||
exit_code = EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (xfd != 0) {
|
||||
close(xfd);
|
||||
}
|
||||
|
||||
if (!reload) {
|
||||
logger.info("Reached end of application...");
|
||||
return exit_code;
|
||||
|
@ -12,7 +12,8 @@ POLYBAR_NS
|
||||
* Configure injection module
|
||||
*/
|
||||
di::injector<connection&> configure_connection() {
|
||||
return di::make_injector(di::bind<>().to(factory_util::generic_singleton<connection>(xutils::get_connection())));
|
||||
return di::make_injector(di::bind<>().to(
|
||||
factory_util::generic_singleton<connection>(xutils::get_connection(), xutils::get_connection_fd())));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6,7 +6,6 @@ POLYBAR_NS
|
||||
|
||||
namespace ewmh_util {
|
||||
ewmh_connection_t g_ewmh_connection{nullptr};
|
||||
|
||||
ewmh_connection_t initialize() {
|
||||
if (!g_ewmh_connection) {
|
||||
g_ewmh_connection = memory_util::make_malloc_ptr<xcb_ewmh_connection_t>(
|
||||
|
@ -10,16 +10,29 @@
|
||||
POLYBAR_NS
|
||||
|
||||
namespace xutils {
|
||||
xcb_connection_t* g_connection_ptr{nullptr};
|
||||
shared_ptr<int> g_connection_fd;
|
||||
shared_ptr<xcb_connection_t> g_connection_ptr;
|
||||
|
||||
xcb_connection_t* get_connection() {
|
||||
if (g_connection_ptr == nullptr) {
|
||||
if (!g_connection_ptr) {
|
||||
Display* dsp{xlib::get_display()};
|
||||
|
||||
if (dsp != nullptr) {
|
||||
XSetEventQueueOwner(dsp, XCBOwnsEventQueue);
|
||||
g_connection_ptr = XGetXCBConnection(dsp);
|
||||
g_connection_ptr = shared_ptr<xcb_connection_t>(XGetXCBConnection(dsp), bind(xcb_disconnect, placeholders::_1));
|
||||
}
|
||||
}
|
||||
return g_connection_ptr;
|
||||
|
||||
return g_connection_ptr.get();
|
||||
}
|
||||
|
||||
int get_connection_fd() {
|
||||
if (!g_connection_fd) {
|
||||
auto fd = xcb_get_file_descriptor(get_connection());
|
||||
g_connection_fd = shared_ptr<int>(new int{fd}, factory_util::fd_deleter{});
|
||||
}
|
||||
|
||||
return *g_connection_fd.get();
|
||||
}
|
||||
|
||||
uint32_t event_timer_ms(const config& conf, const xcb_button_press_event_t&) {
|
||||
|
Loading…
Reference in New Issue
Block a user