#pragma once #include #include #include "common.hpp" #include "settings.hpp" #include "events/signal_fwd.hpp" #include "events/signal_receiver.hpp" #include "events/types.hpp" #include "utils/file.hpp" #include "x11/events.hpp" #include "x11/types.hpp" POLYBAR_NS // fwd decl {{{ enum class alignment : uint8_t; class bar; class command; class config; class connection; class inotify_watch; class ipc; class logger; class signal_emitter; namespace modules { struct module_interface; class input_handler; } using module_t = unique_ptr; using modulemap_t = std::map>; // }}} class controller : public signal_receiver { public: using make_type = unique_ptr; static make_type make(unique_ptr&& ipc, unique_ptr&& config_watch); explicit controller(connection&, signal_emitter&, const logger&, const config&, unique_ptr&&, unique_ptr&&, unique_ptr&&); ~controller(); bool run(bool writeback = false); bool enqueue(event&& evt); bool enqueue(string&& input_data); protected: void read_events(); void process_eventqueue(); void process_inputdata(); bool process_update(bool force); bool on(const signals::eventqueue::notify_change& evt); bool on(const signals::eventqueue::notify_forcechange& evt); bool on(const signals::eventqueue::exit_terminate& evt); bool on(const signals::eventqueue::exit_reload& evt); bool on(const signals::eventqueue::check_state& evt); bool on(const signals::ui::ready& evt); bool on(const signals::ui::button_press& evt); bool on(const signals::ipc::action& evt); bool on(const signals::ipc::command& evt); bool on(const signals::ipc::hook& evt); private: connection& m_connection; signal_emitter& m_sig; const logger& m_log; const config& m_conf; unique_ptr m_bar; unique_ptr m_ipc; unique_ptr m_confwatch; unique_ptr m_command; array, 2> m_queuefd{}; /** * @brief State flag */ std::atomic m_process_events{false}; /** * @brief Controls weather the output gets printed to stdout */ bool m_writeback{false}; /** * @brief Internal event queue */ moodycamel::BlockingConcurrentQueue m_queue; /** * @brief Loaded modules */ modulemap_t m_modules; /** * @brief Module input handlers */ vector m_inputhandlers; /** * @brief Maximum number of subsequent events to swallow */ size_t m_swallow_limit{5U}; /** * @brief Time to wait for subsequent events */ std::chrono::milliseconds m_swallow_update{10}; /** * @brief Time to throttle input events */ std::chrono::milliseconds m_swallow_input{30}; /** * @brief Time of last handled input event */ std::chrono::time_point m_lastinput; /** * @brief Input data */ string m_inputdata; /** * @brief Thread for the eventqueue loop */ std::thread m_event_thread; }; POLYBAR_NS_END