diff --git a/include/components/eventloop.hpp b/include/components/eventloop.hpp index 3a9e49cb..db49826d 100644 --- a/include/components/eventloop.hpp +++ b/include/components/eventloop.hpp @@ -28,17 +28,29 @@ struct cb_helper { } }; -struct SignalHandle { - SignalHandle(uv_loop_t* loop, std::function fun) { - handle = std::make_unique(); - UV(uv_signal_init, loop, handle.get()); - cb = cb_helper{fun}; - +template +struct UVHandle { + UVHandle(std::function fun) { + handle = std::make_unique(); + cb = cb_helper{fun}; handle->data = &cb; - }; + } - std::unique_ptr handle; - cb_helper cb; + std::unique_ptr handle; + cb_helper cb; +}; + +struct SignalHandle : public UVHandle { + SignalHandle(uv_loop_t* loop, std::function fun) : UVHandle(fun) { + UV(uv_signal_init, loop, handle.get()); + }; +}; + +struct PollHandle : public UVHandle { + // TODO wrap callback and handle negative status + PollHandle(uv_loop_t* loop, int fd, std::function fun) : UVHandle(fun) { + UV(uv_poll_init, loop, handle.get(), fd); + }; }; class eventloop { @@ -63,6 +75,12 @@ class eventloop { m_sig_handles.push_back(std::move(handle)); } + void poll_handler(int events, int fd, std::function fun) { + auto handle = std::make_unique(get(), fd, fun); + UV(uv_poll_start, handle->handle.get(), events, &handle->cb.callback); + m_poll_handles.push_back(std::move(handle)); + } + protected: template static void generic_cb(H* handle, Args&&... args) { @@ -73,6 +91,7 @@ class eventloop { std::unique_ptr m_loop{nullptr}; vector> m_sig_handles; + vector> m_poll_handles; }; POLYBAR_NS_END diff --git a/src/components/controller.cpp b/src/components/controller.cpp index ea89fdda..5c2e5292 100644 --- a/src/components/controller.cpp +++ b/src/components/controller.cpp @@ -257,10 +257,8 @@ void controller::read_events() { eloop = std::make_unique(); auto loop = eloop->get(); - uv_poll_init(loop, conn_handle.get(), m_connection.get_file_descriptor()); - conn_handle->data = this; - - uv_poll_start(conn_handle.get(), UV_READABLE, conn_cb_wrapper); + eloop->poll_handler( + UV_READABLE, m_connection.get_file_descriptor(), [this](int status, int events) { conn_cb(status, events); }); for (auto s : {SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGALRM}) { eloop->signal_handler(s, [this](int signum) { signal_handler(signum); }); diff --git a/src/modules/xwindow.cpp b/src/modules/xwindow.cpp index a6eccef5..010750c1 100644 --- a/src/modules/xwindow.cpp +++ b/src/modules/xwindow.cpp @@ -86,7 +86,6 @@ namespace modules { * Handler for XCB_PROPERTY_NOTIFY events */ void xwindow_module::handle(const evt::property_notify& evt) { - m_log.notice("%s: handle Thread id: %i", name(), concurrency_util::thread_id(this_thread::get_id())); if (evt->atom == _NET_ACTIVE_WINDOW) { update(true); } else if (evt->atom == _NET_CURRENT_DESKTOP) {