polybar-dwm/include/modules/dwm.hpp

329 lines
9.0 KiB
C++
Raw Normal View History

#pragma once
#include <dwmipcpp/connection.hpp>
#include "modules/meta/event_module.hpp"
#include "modules/meta/input_handler.hpp"
POLYBAR_NS
namespace modules {
class dwm_module : public event_module<dwm_module>, public input_handler {
public:
explicit dwm_module(const bar_settings&, string);
using tag_mask_t = unsigned int;
using window_t = unsigned int;
2020-07-20 05:11:16 +00:00
/**
* Represents the relevant states a tag can have
*/
enum class state_t : uint8_t {
FOCUSED, ///< Monitor is selected and tag is selected, overrides all below
URGENT, ///< Tag is urgent, overrides all below
UNFOCUSED, ///< Monitor is not selected, but tag is selected
VISIBLE, ///< Tag is not selected, but occupied
EMPTY ///< Tag is unoccupied and unselected
};
2020-07-20 05:11:16 +00:00
/**
* Associates important properties of a tag
*/
struct tag_t {
2020-07-20 05:11:16 +00:00
/**
* Construct a tag_t object
*
* @param name Name of tag
* @param tag_mask_t Bit mask that represents this tag
* @param state Current state of the tag
* @param label Label to use for building tag on bar
*/
tag_t(string& name, tag_mask_t bit_mask, state_t state, label_t&& label)
: name(name), bit_mask(bit_mask), state(state), label(forward<label_t>(label)) {}
string name;
tag_mask_t bit_mask;
state_t state;
label_t label;
};
auto stop() -> void override;
auto has_event() -> bool;
auto update() -> bool;
auto build(builder* builder, const string& tag) const -> bool;
protected:
auto input(string&& cmd) -> bool override;
private:
static constexpr const char* DEFAULT_FORMAT_TAGS{"<label-tags> <label-layout> <label-title>"};
static constexpr const char* DEFAULT_STATE_LABEL{"%name%"};
2020-07-20 05:11:16 +00:00
/**
* The tags label is replaced with the tags. Each tag is displayed using one
2020-07-20 05:11:16 +00:00
* of the following labels based on the tag state:
* * label-focused
* * label-unfocused
* * label-visible
* * label-urgent
* * label-empty
*/
static constexpr const char* TAG_LABEL_TAGS{"<label-tags>"};
2020-07-20 05:11:16 +00:00
/**
* The layout label is replaced by the current layout symbol
*/
static constexpr const char* TAG_LABEL_LAYOUT{"<label-layout>"};
2020-07-20 05:11:16 +00:00
/**
* The title layout is replaced by the currently focused window title
*/
static constexpr const char* TAG_LABEL_TITLE{"<label-title>"};
2020-07-20 05:11:16 +00:00
/**
* All input handler commands start with this
2020-07-20 05:11:16 +00:00
*/
static constexpr const char* EVENT_PREFIX{"dwm-"};
/**
* DWM command for changing the view to a tag with the specified bit mask
*/
static constexpr const char* CMD_TAG_VIEW{"view"};
/**
* DWM command for toggling the selected state of a tag with the specified
* bit mask
*/
static constexpr const char* CMD_TAG_TOGGLE_VIEW{"toggleview"};
/**
* DWM command for setting the layout to a layout specified by the address
*/
static constexpr const char* CMD_LAYOUT_SET{"setlayoutsafe"};
2020-07-20 05:11:16 +00:00
/**
* Called by has_event on layout changes. This updates the layout label
*
* @param ev Event data
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void on_layout_change(const dwmipc::LayoutChangeEvent& ev);
2020-07-20 05:11:16 +00:00
/**
* Called by has_event when a new monitor is in focus. This updates
* m_active_mon to keep track of the currently active monitor.
*
* @param ev Event data
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void on_monitor_focus_change(const dwmipc::MonitorFocusChangeEvent& ev);
2020-07-20 05:11:16 +00:00
/**
* Called by has_event when any of the tag states change. This updates the
* m_tags array and their states/labels.
*
* @param ev Event data
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void on_tag_change(const dwmipc::TagChangeEvent& ev);
2020-07-20 05:11:16 +00:00
/**
* Called by has_event when a new client is in focus. This updates
* m_focused_client_id and updates the title label
*
* @param ev Event data
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void on_client_focus_change(const dwmipc::ClientFocusChangeEvent& ev);
2020-07-20 05:11:16 +00:00
/**
* Called by has_event when the title of the currently focused window
* changes. This updates the title label.
*
* @param ev Event data
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void on_focused_title_change(const dwmipc::FocusedTitleChangeEvent& ev);
2020-07-20 05:11:16 +00:00
/**
* Get a list of monitors from dwm, store them in m_monitors, and update the
* pointers to the active monitor and bar monitor.
*
* @param ev Event data
*/
void update_monitor_ref();
2020-07-20 05:11:16 +00:00
/**
* Update the labels for each tag based on their state
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
void update_tag_labels();
2020-07-20 05:11:16 +00:00
/**
* Get the window title of the currently focused client from dwm and update
* the title label
2020-07-20 05:11:16 +00:00
*/
void update_title_label();
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
2020-07-20 05:11:16 +00:00
/**
* Translate the tag's tag states to a state_t enum value
*
* @param bit_mask Bit mask of the tag
*
* @return state_t enum value representing the state of the tag
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
auto get_state(tag_mask_t bit_mask) const -> state_t;
2020-07-20 05:11:16 +00:00
/**
* Get the address to the layout represented by the symbol.
*/
auto find_layout(const string& sym) const -> const dwmipc::Layout*;
/**
* Get the address to the layout represented by the address.
*/
auto find_layout(uintptr_t addr) const -> const dwmipc::Layout*;
/**
* Get the address of the next layout in m_layouts.
*
* @param layout Address of the current layout
* @param wrap True to wrap around the array, false to return the same
* layout if the next layout does not exist.
*/
auto next_layout(const dwmipc::Layout& layout, bool wrap) const -> const dwmipc::Layout*;
/**
* Get the address of the previous layout in m_layouts.
*
* @param layout Address of the current layout
* @param wrap True to wrap around the array, false to return the same
* layout if the next layout does not exist.
*/
auto prev_layout(const dwmipc::Layout& layout, bool wrap) const -> const dwmipc::Layout*;
2020-07-20 05:11:16 +00:00
/**
* Check if the command matches the specified IPC command name and if so,
* parse and send the command to dwm
2020-07-20 05:11:16 +00:00
*
* @param cmd The command string given by dwm_modue::input
* @param ipc_cmd The name of dwm IPC command to check for
2020-07-20 05:11:16 +00:00
*
* @return true if the command matched, was succesfully parsed, and sent to
* dwm, false otherwise
*/
auto check_send_cmd(string cmd, const string& ipc_cmd) -> bool;
2020-07-20 05:11:16 +00:00
/**
* Helper function to build cmd string
*
* @param ipc_cmd The dwm IPC command name
* @param arg The argument to the dwm command
*/
auto static build_cmd(const char* ipc_cmd, const string& arg) -> string;
2020-07-20 05:11:16 +00:00
/**
* Attempt to connect to any disconnected dwm sockets. Catch errors.
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
auto reconnect_dwm() -> bool;
2020-07-20 05:11:16 +00:00
/**
* If true, enables the click handlers for the tags
*/
bool m_tags_click{true};
/**
* If true, enables the click handlers for the layout label
*/
bool m_layout_click{true};
/**
* If true, scrolling the layout cycle through available layouts
*/
bool m_layout_scroll{true};
/**
* If true, scrolling the layout will wrap around to the beginning
*/
bool m_layout_wrap{true};
/**
* If true, scrolling the layout will cycle layouts in the reverse direction
*/
bool m_layout_reverse{false};
/**
* If the layout symbol is clicked on, it will set the layout represented by
* this symbol. The default is monocle mode [M].
*/
string m_secondary_layout_symbol{"[M]"};
/**
* Holds the address to the secondary layout specified by the secondary
* layout symbol
*/
const dwmipc::Layout* m_secondary_layout = nullptr;
/**
* Holds the address to the current layout
*/
const dwmipc::Layout* m_current_layout = nullptr;
/**
* Holds the address to the default layout
*/
const dwmipc::Layout* m_default_layout = nullptr;
2020-07-20 05:11:16 +00:00
/**
* Holds the address to the currently active monitor in the m_monitors array
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
const dwmipc::Monitor* m_active_mon = nullptr;
2020-07-20 05:11:16 +00:00
/**
* Holds the address to the bar monitor in the m_monitors array
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
const dwmipc::Monitor* m_bar_mon = nullptr;
2020-07-20 05:11:16 +00:00
/**
* XID of the currently focused client
*/
window_t m_focused_client_id = 0;
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
2020-07-20 05:11:16 +00:00
/**
* Current layout symbol
*/
label_t m_layout_label;
2020-07-20 05:11:16 +00:00
/**
* Inserted between tags
*/
label_t m_seperator_label;
2020-07-20 05:11:16 +00:00
/**
* Title of the currently focused window on the bar's monitor
*/
label_t m_title_label;
2020-07-20 05:11:16 +00:00
/**
* Connection to DWM
*/
dwm: Reorganize module Remove EVENT_SCROLL_{UP_DOWN} since it is not being used. Change EVENT_PREFIX to include dash and event names to be just the name without the prefix, for simplified parsing. Use check_send_cmd function to parse the cmd, using the event name as the IPC command name, and the section after the event name to be the argument. The format of a cmd would be "dwm-<event name>-<arg>", so the cmd can easily be translated into an IPC command. Call member functions for all dwmipc events for better organization and to avoid cluttering the constructor. The dwmipc event functions are now just assigned to a lambda that calls a member function. Add update_tag_labels function for updating the tag labels based on their state since this code is repetetive. Add update_title_labels function since that code is also somewhat repetetive. Move reconnect code to reconnect_dwm for better organization. Use pointers to m_monitors array elements instead of holding onto indices, since most of the time, a member of the Monitor element will need to be accessed. These variables should always hold a valid address starting in the constructor, so checks for nullptr should not be necessary. A monitor will always be active and the bar will always be mapped onto a monitor. Add some comments where needed. Reorganize the constructor into a more logical format Only subscribe to events if their labels are included in the default format. Follow clang-tidy warnings and use trailing return types. Move m_ipc->get_monitors to update_monitor_ref since in most cases where the monitor references would need to be updated using geometry, m_ipc->get_monitors would need to be called.
2020-07-20 02:52:50 +00:00
unique_ptr<dwmipc::Connection> m_ipc;
2020-07-20 05:11:16 +00:00
/**
* Vector of monitors returned by m_ipc->get_monitors
*/
shared_ptr<vector<dwmipc::Monitor>> m_monitors;
2020-07-20 05:11:16 +00:00
/**
* Vector of layouts returned by m_ipc->get_layouts
*/
shared_ptr<vector<dwmipc::Layout>> m_layouts;
2020-07-20 05:11:16 +00:00
/**
* Maps state_t enum values to their corresponding labels
*/
std::unordered_map<state_t, label_t> m_state_labels;
2020-07-20 05:11:16 +00:00
/**
* Vector of all tags
*/
vector<tag_t> m_tags;
};
} // namespace modules
POLYBAR_NS_END