#pragma once #include "common.hpp" #include "components/config.hpp" #include "components/types.hpp" #include "modules/meta/static_module.hpp" #include "x11/events.hpp" #include "x11/window.hpp" #include "x11/xkb.hpp" POLYBAR_NS class connection; namespace modules { /** * Keyboard module using the X keyboard extension */ class xkeyboard_module : public static_module, public xpp::event::sink { public: explicit xkeyboard_module(const bar_settings& bar, string name_); void teardown(); void update(); bool build(builder* builder, const string& tag) const; bool handle_event(string cmd); bool receive_events() const { return true; } protected: bool query_keyboard(); bool blacklisted(const string& indicator_name); void handle(const evt::xkb_new_keyboard_notify& evt); void handle(const evt::xkb_state_notify& evt); void handle(const evt::xkb_indicator_state_notify& evt); private: static constexpr const char* TAG_LABEL_LAYOUT{""}; static constexpr const char* TAG_LABEL_INDICATOR{""}; static constexpr const char* FORMAT_DEFAULT{" "}; static constexpr const char* EVENT_SWITCH{"xkeyboard/switch"}; connection& m_connection; event_timer m_xkbnotify{}; unique_ptr m_keyboard; label_t m_layout; label_t m_indicator; map m_indicators; vector m_blacklist; }; } POLYBAR_NS_END