Commit Graph

1829 Commits

Author SHA1 Message Date
Mihir Lad
567b31bcc6 Remove dwm make dependency
dwm is not required to compile; it is only required to run the module, so
there's no reason to add it as a hard dependency.
2020-12-19 19:50:12 -05:00
Mihir Lad
de3748122f dwm: Get socket path from config, not env or cmake
Don't get the socket path from cmake or from an environment variable. Instead,
get it from the polybar config. If it's not specified, the default is
/tmp/dwm.sock which is default for the IPC patch.

This way is easier for the user to configure.
2020-12-19 19:48:48 -05:00
Mihir Lad
a0fa04d6a6 dwm: Fix log typo
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
2020-12-19 19:48:48 -05:00
Mihir Lad
f17aef943c src/CMakeLists.txt: Remove dwm.cpp if dwm disabled 2020-12-19 19:48:48 -05:00
Mihir Lad
56135fbf62 dwm: Make compatible with jsoncpp v1.7.4
This version of jsoncpp requires a cast when calling run_command to disambiguate
the function call.
2020-12-19 19:48:48 -05:00
Mihir Lad
48aede9f63 README.md: Add dwm module 2020-12-19 19:48:26 -05:00
Mihir Lad
30e5008450 Fix build fail when xcb-util-xrm not installed
When this package is not installed, the struct randr type never gets fully
defined because randr.hpp never gets included. This causes the build to fail in
update_monitor_ref.

See issue mihirlad55/polybar-dwm-module#10.
2020-12-19 19:46:47 -05:00
Mihir Lad
feadaecf88 build.sh: Add -d to all features echo 2020-12-19 19:46:47 -05:00
Mihir Lad
e60f8f6dc7 config.cmake: Imporove dwm module comments 2020-12-19 19:43:05 -05:00
Mihir Lad
d1cdd70dd8 dwmipcpp: Update submodule 2020-12-19 19:43:05 -05:00
Mihir Lad
8c1085d6bd dwm: Only find secondary_layout if m_layout_click
Secondary layout would not be used otherwise.
2020-12-19 19:43:05 -05:00
Mihir Lad
7342b03240 dwm: Remove duplicate get_layouts 2020-12-19 19:43:05 -05:00
Mihir Lad
7b1a384c22 dwm: Add more info logging
To help with debugging.
2020-12-19 19:43:05 -05:00
Mihir Lad
48d661d51a dwm: Remove duplicate update_floating_label
This already exists further down in the constructor
2020-12-19 19:43:05 -05:00
Mihir Lad
8e205eeb15 dwm: Connect to socket in try-catch
Catch dwmipc errors and throw a module error if connecting to the socket fails.
2020-12-19 19:43:05 -05:00
Mihir Lad
16f90bea83 dwm: Reset m_ipc with nullptr
Reset with nullptr to properly release and delete m_ipc.
2020-12-19 19:43:05 -05:00
Mihir Lad
565fc7f329 dwmipcpp: Update submodule 2020-12-19 19:43:05 -05:00
Mihir Lad
bacfca5c3a dwm: Sleep before attempting to reconnect to dwm
Sleep before trying to reconnect to the dwm socket after a detected
disconnection. If dwm is restarted in place, in most cases the reconnect will
fail before dwm gets a change to re-setup itself and the socket. A 1-second
delay can provide enough time for dwm to reinitalize itself before polybar
attempts to reconnect. As a result, the module can recovoer instead of the
entire application just quitting.
2020-12-19 19:43:05 -05:00
Mihir Lad
339d059441 dwm: Only initialize and use tags if label is used
Check the formatter for the tags label, and if it doesn't exist, there's no need
to initialize the tags array or listen to tag change events. Also, check to see
if tags are being used before trying to update them from the
on_monitor_focus_change function.
2020-12-19 19:43:05 -05:00
Mihir Lad
b6c2dc0dee dwm: Use functions to update labels
To keep consistency, use functions to update all labels. Since the labels have
tokens that have to be replaced, if this needed to be changed, or if the label
updating code needed to be changed, it could easily be done in one place without
having to scour the code for all places where the label is updated. It improves
refactorability.

This decouples the token replacement of labels from other functions and keeps
that code contained to the update label functions.

Since functions like update_title_label and update_floating_label already exist,
it makes sense to stick with this pattern of using functions to update the
labels. For updating the labels in different ways, overloaded functions can
simply be used.
2020-12-19 19:43:05 -05:00
Mihir Lad
4533cf5003 dwm: Catch IPCError instead of generic exceptions
Don't catch generic exceptions to avoid masking bugs. Only catch IPCError
exceptions since those are all minor errors.
2020-12-19 19:43:05 -05:00
Mihir Lad
871b9f8ba2 dwm: Add comments to config.cmake
Add documentation and comments to describe labels and formatting options.
2020-12-19 19:43:05 -05:00
Mihir Lad
3b430ee962 dwm: Rename layout token from %layout% to %symbol%
This token name is more indicative of what the token will be replaced with.
2020-12-19 19:43:05 -05:00
Mihir Lad
02bd2e060d dwm: Add label-floating
This label is visible when the currently focused client is in floating mode and
detached from the layout. It uses the focused_state_change_event as well as the
focused_client_change_event to check if the focused client is floating and
updates m_is_floating accordingly which will enable/disbale the floating label
in the final output.

update_floating_label is called when the floating state of the client is not
known. The function queries dwm for the properties of the focused client and
sets m_is_floating accordingly.

This fixes issue #2.
2020-12-19 19:43:05 -05:00
Mihir Lad
3fa404e9ff dwmipcpp: Update submodule for IPC patch v1.5.0 2020-12-19 19:43:05 -05:00
Mihir Lad
b3bf969a0a dwm: Simplify layout scroll command build
This way reduces the code a couple lines, takes less indentation, while still
being clear in functionality.
2020-12-19 19:43:05 -05:00
Mihir Lad
33c8fb2ac7 dwm: Define command name instead of event name
Instead of defining the event name for each event, define the command name that
is to be called for that event. This simplifies the code since many events call
the same command. It is already clear from the cmd function which event is being
registered, so it is more clear to see the association between the command and
the event in the code this way.
2020-12-19 19:43:05 -05:00
Mihir Lad
f3047ab1e5 dwm: Add layout-reverse-scroll option
This option simply reverses the direction in which the scroll cycles through the
layouts.
2020-12-19 19:43:05 -05:00
Mihir Lad
a22b2ffcc3 dwm: Add layout scroll; rename settings
Rename settings and allow more flexible configuration by allowing the user to
enable click handlers for the tags and the layout label separately.

Add a scroll handler for the layout label so the user can scroll through the
available layouts. Enabling layout-scroll-wrap allows wrapping back to the
beginning/end of the array of available layouts.

next_layout and prev_layout take the address of a layout and returns the
next/previous layout in the m_layouts array if possible, wrapping if specified,
otherwise returns the same layout. This is used to for the layout scroll
handlers to cycle through layouts.
2020-12-19 19:43:05 -05:00
Mihir Lad
33a8226827 dwm: Rename label-state to label-tags
label-tags is more indicative of what the label represents.
2020-12-19 19:43:05 -05:00
Mihir Lad
5967ac3b0b dwm: Remove id param from update_title_label
Use m_focused_client_id to update the label. It makes more sense to use this
variable instead of passing a client id to the function.
2020-12-19 19:43:05 -05:00
Mihir Lad
bc16268d30 dwm: Add click handlers to label-layout
secondary-layout-symbol is the symbol of the layout to switch to when the layout
symbol is left-clicked. This symbol is used to look up the memory address of the
layout to set. The default is the monocle layout.

setlayoutsafe is the dwm command name for setting layouts. The argument is the
layout memory address. Left-clicking switches to the layout represented by
secondary-layout-symbol, and right-clicking switches to the previous layout
(specified by an argument of 0).

To keep track of the different layouts, the layouts are retrieved in the
constructor if the layout label is included and stored in m_layouts.
m_current_layout is updated with the address of the current layout.
m_default_layout is updated in the constructor to the first layout in the array
which is the default layout in dwm. m_secondary_layout is updated to the address
of the layout identified by secondary-layout-symbol.

The builder adds click handlers (if layout label is included) to the layout
symbol as described above. Left-clicking toggles between the secondary layout
and the default layout. Right-clicking toggles between the previous layout and
the current layout.

find_layout are a pair of functions for finding a layout by address or symbol
from the m_layouts array.
2020-12-19 19:43:05 -05:00
Mihir Lad
ecc881b9b3 dwm: Add build_cmd helper and rename events
build_cmd simplifies building a command string and helps avoid typo errors when
adding new commands since most commands follow the same format.

Rename EVENT_LCLICK and EVENT_RCLICK and to EVENT_TAG_LCLICK and
EVENT_TAG_RCLICK for clarity and to allow specifying multiple click commands in
the future without confusion.

Also remove std:: from vector since it is not needed.
2020-12-19 19:43:05 -05:00
Mihir Lad
f91fc2c7ab dwm: Add comments and documentation 2020-12-19 19:43:05 -05:00
Mihir Lad
27ea9773c6 dwm: Use type aliases for bit mask and window id
Do this for consistency and to avoid potential bugs by using the incorrect type.
2020-12-19 19:43:05 -05:00
Mihir Lad
b37ae4f25a dwm: Use notice to log socket reconnection
Info does not normally show this info which is useful to know after a
disconnection.
2020-12-19 19:43:05 -05:00
Mihir Lad
7dba8ea2dd dwm: Recovery from main socket disconnection
Catch ClosedSocketErrors and attempt reconnection.
2020-12-19 19:43:05 -05:00
Mihir Lad
a30a9b1e1b dwm: Replace pin-tags with label-empty
If pin-tags is set, there is no format defined for tags that are not occupied.
However defining a format for unoccupied tags makes the pin-tags setting
redundant since then the label can just be set to empty to not show unoccupied
tags.

Following the above reasoning, the pin tags setting is removed, and
state_t::NONE is renamed to state_t::EMPTY. This way if a user wants to display
empty tags, they can specify the format, otherwise they can simply set the label
to an empty string.
2020-12-19 19:43:05 -05:00
Mihir Lad
7883ef82fe dwm: Rename DEFAULT_TAG_LABEL to ..._STATE_LABEL
State makes more sense than tag.
2020-12-19 19:43:05 -05:00
Mihir Lad
a7e9dcb0db dwm: Fix title initialization
Title was being set on module startup to the active monitor's selected window
title instead of the bar monitor's.
2020-12-19 19:43:05 -05:00
Mihir Lad
399a797b45 dwm: Fix input handling
The command strings were not updated since the event variable formats changed.

Also, the EVENT_PREFIX already contained a dash, so an extra character would be
erased when adding 1.

Don't move the cmd string into the check_send_cmd function since if the first
event doesn't match, the cmd string would have been modified when passed to
the function again to check if the second event matches.
2020-12-19 19:43:05 -05:00
Mihir Lad
866c88c1d3 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-12-19 19:43:05 -05:00
Mihir Lad
ee56fc48ab dwm: Only change layout symbol for bar monitor
Since the layout_change_event is raised for all monitors, check to make sure the
monitor of the bar matches the monitor on which the layout was changed before
setting the layout label.
2020-12-19 19:43:05 -05:00
Mihir Lad
ce74fae822 dwm: Get and set title on module startup
When the module starts up, the title is not set until the client focus changes.
This commit fixes that by getting the window title of the currently selected
client in the module constructor.
2020-12-19 19:43:05 -05:00
Mihir Lad
8e5b5258e2 Use focused_title_change_event to update titles
This fixes issue mihirlad55/polybar-dwm-module#4 where the title would not
update if the title of the currently focused window changed. The
focused_title_change_event is raised exactly when the focused window's
title changes, so this should automatically update the title using the callback
when necessary.
2020-12-19 19:43:05 -05:00
Mihir Lad
136fc3efed Fix event names for dwmipcpp update
The event names were renamed in the most recent update of dwmipcpp. This commit
makes the module compilable.
2020-12-19 19:43:05 -05:00
Mihir Lad
3cd05a83f9 Update dwmipcpp submodule (IPC patch v1.4.0)
This version of the library includes the focused_title_change_event which is
raised when a focused client's window title changes.
2020-12-19 19:43:05 -05:00
Mihir Lad
79f262fb18 Add dwm module
The module is currently working, but not fully stable. All tags specified in
config.cmake for internal/dwm are supported. This was implemented following the
i3 and bspwm modules. There is still some cleaning/refactoring to do to polish
the module up.
2020-12-19 19:43:01 -05:00
Mihir Lad
64aa2013c2 Add dwm example config to config.cmake
label-state will be the label used for each tag. label-layout will show the
current layout. label-title will show the current window title.

label-title allows each monitor to show its selected window's title on the bar.
The xwindow module only shows the currently focused window on all monitors.

pin-tags will show all tags whether or not they are selected.

label-separator is inserted between workspaces.

enable-click will allow the user to view tags and toggle the view on tags.
2020-12-19 19:30:04 -05:00
Mihir Lad
af6b2754b4 Add dwm module to unsupported.hpp 2020-12-19 19:30:00 -05:00