polybar-dwm/include/modules/dwm.hpp

298 lines
8.2 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-state> <label-layout> <label-title>"};
static constexpr const char* DEFAULT_STATE_LABEL{"%name%"};
2020-07-20 05:11:16 +00:00
/**
* The state label is used to represent a tag. This label is replaced by one
* 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_STATE{"<label-state>"};
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>"};
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
static constexpr const char* EVENT_PREFIX{"dwm-"};
2020-07-20 05:11:16 +00:00
/**
* Event name is same as the IPC command name to view the tag clicked on
*/
static constexpr const char* EVENT_TAG_LCLICK{"view"};
2020-07-20 05:11:16 +00:00
/**
* Event name is same as IPC command name to toggle the view of the tag
* clicked on
*/
static constexpr const char* EVENT_TAG_RCLICK{"toggleview"};
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
/**
* Event name is same as the IPC command name to set the layout to the
* secondary layout when the layout symbol is clicked
*/
static constexpr const char* EVENT_LAYOUT_LCLICK{"setlayoutsafe"};
/**
* Event name is same as the IPC command name to set the layout to the
* last layout.
*/
static constexpr const char* EVENT_LAYOUT_RCLICK{"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 specified client from dwm and update the
* title label
*
* @param client_id The window XID of the client
*/
void update_title_label(window_t client_id);
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*;
2020-07-20 05:11:16 +00:00
/**
* Check if the command matches the specified event name and if so, send a
* command to dwm after parsing the command.
*
* @param cmd The command string given by dwm_modue::input
* @param ev_name The name of the event to check for (should be the same as
* the dwm command name)
*
* @return true if the command matched, was succesfully parsed, and sent to
* dwm, false otherwise
*/
auto check_send_cmd(string cmd, const string& ev_name) -> bool;
2020-07-20 05:11:16 +00:00
/**
* Helper function to build cmd string
*
* @param ev The event name (should be same as dwm command name)
* @param arg The argument to the dwm command
*/
auto static build_cmd(const char* ev, 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_click{true};
/**
* 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