Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/creativecodecat/dk-wm
https://github.com/creativecodecat/dk-wm
Last synced: 14 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/creativecodecat/dk-wm
- Owner: CreativeCodeCat
- License: mit
- Created: 2023-04-17T08:38:38.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2023-04-17T08:39:01.000Z (almost 2 years ago)
- Last Synced: 2025-01-08T05:16:29.637Z (20 days ago)
- Language: C
- Size: 3.28 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![](dk.png)
A list based tiling window manager in the vein of dwm, bspwm, and xmonad.
Some basics:
- Fully scriptable.
- Dynamic workspaces.
- More dynamic tile layout.
- Gaps, fancy borders, extra layouts and more.
- Better support for mouse and floating windows.
- Startup script for configuration and running programs.
- Status info is output to a file for use in bars or scripts.
- No built-in extras *(bar, font drawing, or key bindings)*.
- Sane support for
[icccm](https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#client_to_window_manager_communication),
[ewmh](https://specifications.freedesktop.org/wm-spec/wm-spec-latest.html), and
[motif](http://www.ist.co.uk/motif/books/vol6A/ch-20.fm.html#963509).### Installation
You need the xcb headers
Arch
```
xcb-proto xcb-util xcb-util-wm xcb-util-cursor xcb-util-keysyms
```Void
```
libxcb-devel xcb-proto xcb-util-devel xcb-util-wm-devel xcb-util-cursor-devel xcb-util-keysyms-devel
```Debian/Ubuntu
```
libxcb-randr0-dev libxcb-util-dev libxcb-icccm4-dev libxcb-cursor-dev libxcb-keysyms1-dev
```Other systems should have packages with similar names.
As mentioned above dk has no keybind support so you'll need a separate
program like `sxhkd` to launch programs and control the window manager.To compile run
```
make
```Edit `config.h` if needed, then run *(as root if needed)*
```
make install
```If at any time you want to uninstall, run
```
make uninstall
```### Usage
To start dk you can add the following to your `~/.xinitrc`
```
exec dk
```Optionally copy the example dkrc and/or sxhkdrc to `~/.config/dk/`
```
mkdir -p ~/.config/dk
cp /usr/local/share/doc/dk/dkrc ~/.config/dk/
cp /usr/local/share/doc/dk/sxhkdrc ~/.config/dk/
```### Configuration
There are example `dkrc` and `sxhkdrc` files in `doc/` or
`/usr/local/share/doc/dk` after installation.dk looks for an rc file in the following order
```
$DKRC # user specified location
$HOME/.config/dk/dkrc # default location
```
and tries to run it, **it must be executable in order for this to happen**.Advanced changes and configuration like new layouts, callbacks, or commands
can be done by copying the default config header `config.def.h` to `config.h`,
editing it and recompiling. This file isn't tracked by git so you can keep your
configuration and avoid conflicts when pulling new updates.### dkcmd
Most of your interaction with the window manager will be using `dkcmd`
which writes one or more commands into the socket where it is then read
and parsed by the window manager *(see Commands section below)*.### Syntax Outline
The commands have a very basic syntax and parsing, the input is broken
down into smaller pieces *(tokens)* which are then passed to the matching
keyword function, otherwise an error is returned.Tokens are delimited by one or more:
- whitespace *(space or tab)*
- quotation mark *(`'` or `"`)*
- equal sign *(`=`)*
This means the following inputs are all equivalent.
```
setting=value
setting value
setting="value"
setting = 'value'
setting "value"
setting "value"
```
and result in two tokens: `setting` and `value`---
Quotation exists as a way to preserve whitespace and avoid interpretation by the shell,
otherwise we have no way of determining whether an argument is a continuation of the
previous or the beginning of the next. Consider the following
```
title="^open files$"
```If the value being matched has quotes in it, they can be escaped or strong quoted
```
title="^\"preserved quotes\"$"
title='^"preserved quotes"$'
```---
For various commands dk will expect a certain data type or format to be given.
- string: normal plain text, must be less than 256 characters.
- boolean: `true`, `false`, `1`, or `0`.
- hex: `(0x/#)XXXXXXXX`, used for window ids
- integer: `(+/-)1`, if it is preceded by a sign it is considered relative.
- float: `(+/-)0.1`, same as integer but must contain a decimal value.
- colour: `(0x/#)[AA]RRGGBB`, hex value, if no alpha channel is given the colour is opaque.
---
### Commands
```
dkcmd COMMAND
```
#### WM- `quit` exit dk.
- `restart` re-execute dk.#### Ws and Mon
`mon` and `ws` operate on monitors and workspaces respectively.- `CLIENT` (hex) The window id in hex to operate on, if unspecified the active window is used.
- `TARGET` (integer/string) Name or number of the workspace or monitor to target or strings
- `next` relative forward
- `prev` relative backward
- `last` last viewed
- `nextne` next non-empty
- `prevne` previous non-empty```
ws [SUBCOMMAND] [CLIENT] TARGET
mon [SUBCOMMAND] [CLIENT] TARGET
```###### Subcommands
`view` View the TARGET, default if no subcommand is given.
```
ws view TARGET
ws TARGET
```
---`send` Send CLIENT to the TARGET.
```
mon send [CLIENT] TARGET
```
---`follow` Follow CLIENT to the TARGET.
```
ws follow [CLIENT] TARGET
```#### Rule
`rule` operates on window rules.- `MATCH` one or more regex strings to be used when matching window properties.
- `SETTING` one or more window setting to be applied when a matched window is encountered.```
rule [SUBCOMMAND] MATCH SETTING
```###### Subcommands
`apply` applies RULE to all matching windows, if RULE is `*` apply all rules and MATCH is ignored.
```
rule apply RULE [MATCH]
```
---`remove` removes RULE, if RULE is `*` remove all rules and MATCH is ignored.
```
rule remove RULE [MATCH]
```###### Settings
`class` `instance` `title` `type` (string) regex to match the window class, instance, title, and
type respectively *(may be prefixed with match_ for clarity)*. Regex matching is always done **case insensitive**
with extended regex mode enabled.
```
rule [SUBCOMMAND] class="^firefox$" instance="^navigator$" title="^mozilla firefox$" type=dialog [SETTING]
````type` currently only supports `dialog` and `splash` windows, all others are treated as normal windows.
---
`ws` (integer/string) determine what workspace the window should be on.
```
rule MATCH ws=1 # using index
rule MATCH ws=term # using name
```
---`mon` (integer/string) determine what monitor the window should be on.
```
rule MATCH mon=1 # using index
rule MATCH mon=HDMI-A-0 # using name
```
---`x` `y` `w` `width` `h` `height` `bw` `border_width` (integer/string) determine the window location and size.
- `x` change the x coordinate, can be an integer or one of the following.
- `center left` and `right` gravitate on the x coordinate.- `y` change the y coordinate, can be an integer or one of the following.
- `center top` and `bottom` gravitate on the y coordinate.- `w` `width` change the window width.
- `h` `height` change the window height.
- `bw` `border_width` change the window border width.```
rule MATCH x=20 y=100 w=1280 h=720 bw=0 # using absolute values
rule MATCH x=center y=center w=1280 h=720 bw=0 # using gravities
```
---`callback` (string) determine a callback function to be invoked on window open and close.
These are defined in the config header and compiled into the source, one example is provided.
```
rule MATCH callback=albumart
```
---`float` `stick` (boolean) determine if the window should be floating or stick respectively.
```
rule MATCH float=true stick=true
```
---`ignore` (boolean) determine if the window should ignore configure request events.
```
rule MATCH ignore=true
```
---`focus` (boolean) determine if the window should be focused and `view` it's workspace.
If `mon` is also set it will be activated first before viewing the workspace.
```
rule MATCH focus=true
```
---#### Set
`set` operates on workspace or global configuration settings.- `SETTING` one or more settings to be changed.
- `WS` the workspace which subcommand should apply to, if unspecified the current is used.
`_` is a special workspace used to define default values for new workspaces which
haven't been created yet.```
set [WS] SETTING
set ws=_ [apply] SETTING
```###### Settings
`numws` (integer) change the number of workspaces to allocate.
```
set numws=10
```
---`name` (string) change the WS name.
```
set ws=1 name="term"
```
---`static_ws` (boolean) disable dynamic workspaces for multi-head systems.
```
set static_ws=false
```
---`mon` (integer/string) change which monitor WS should be on (requires `static_ws=true`).
```
set ws=1 mon=HDMI-A-0
set ws=1 mon=1
```
---`master` `stack` (integer) change the number of windows to occupy the master area (tile layout).
```
set [WS] stack 3 # absolute values have no signs
set [WS] master +1 stack -1 # relative change with signed integers (+/-)
```
---`msplit` `ssplit` (float) change the workspace master or stack split ratios respectively.
```
set [WS] msplit +0.1
set [WS] ssplit 0.55
```
---`gap` (integer) change the workspace gap width.
```
set [WS] gap 10
```
---`tile_hints` (boolean) obey size hints in tiled layouts.
```
set tile_hints=true
```
---`tile_tohead` (boolean) place new windows at the head of the list in tiled layouts.
```
set tile_tohead=true
```
---`smart_gap` (boolean) remove gaps on workspaces with only one tiled window.
```
set smart_gap=true
```
---`smart_border` (boolean) remove borders on workspaces with only one tiled window.
```
set smart_border=true
```
---`focus_urgent` (boolean) focus windows that request it through client messages.
```
set focus_urgent=true
```
---`focus_open` (boolean) disable focus-on-open.
```
set focus_open=false
```
---`focus_mouse` (boolean) disable focus-follows-mouse.
```
set focus_mouse=false
```
---`win_minxy` (integer) amount of window (in pixels) to be kept on the screen when moving.
```
set win_minxy=20
```
---`win_minwh` (integer) minimum window size.
```
set win_minwh=50
```
---`apply` when changing the default `_` workspace apply settings to existing real workspaces.
```
set ws=_ apply SETTING
```
---`layout` (string) change the workspace window layout.
- `tile` default tile layout
- `rtile` tile layout with master area on the right
- `mono` windows arranged maximized and stacked
- `grid` all windows try to occupy equal space
- `spiral` windows shrink by 1/2 towards the center of the screen
- `dwindle` windows shrink by 1/2 towards the bottom right of the screen
- `none` floating, no layout```
set [WS] layout mono
```
---`border` change the window border sizes and colours.
- `w` `width` (integer) change the overall window border width.
- `ow` `outer` `outer_width` (integer) change the outer border width (greater than 0 makes double borders).
- `colour` `color` (string) change the border (overall and outer) colour for various window states.
- `f` `focus` (colour) the active window border overall colour.
- `r` `urgent` (colour) urgent window border overall colour.
- `u` `unfocus` (colour) normal window border overall colour.
- `of` `outer_focus` (colour) the active window outer border colour.
- `or` `outer_urgent` (colour) urgent window outer border colour.
- `ou` `outer_unfocus` (colour) normal window outer border colour.```
set border w=5 ow=3 colour f='#6699cc' u='#444444' r='#ee5555' of='#222222' ou='#222222' or='#222222'
```
---`pad` change the workspace padding.
- `l` `left` (integer) change the workspace left side padding.
- `r` `right` (integer) change the workspace right side padding.
- `t` `top` (integer) change the workspace top padding.
- `b` `bottom` (integer) change the workspace bottom padding.```
set [WS] pad l=50 r=50 t=50 b=50
```
---`mouse` change the mouse binds for move and resize (global, does not take a workspace).
- `mod` (string) change the modifier used in combination with move resize buttons.
- `alt` `mod1` Alt key (default).
- `super` `mod4` Win key.
- `ctrl` `control` Ctrl key.- `move` `resize` (string) change the button used for move and resize respectively.
- `button1` left mouse button.
- `button2` right mouse button.
- `button3` middle mouse button.```
set mouse move=button1 resize=button2 mod=mod1
```
---#### Win
`win` operates on windows.- `CLIENT` (hex) the window id, if unspecified the current window is used.
```
win [CLIENT] ACTION
```###### Settings
`cycle` cycle windows in place.
```
win cycle
```
---`float` change the window floating state.
```
win [CLIENT] float
```
---`full` change the window fullscreen state.
```
win [CLIENT] full
```
---`fakefull` change the window fake fullscreen state (allow moving, resizing, and tiling when fullscreen).
```
win [CLIENT] fakefull
```
---`stick` change the window sticky state.
```
win [CLIENT] stick
```
---`swap` change the window between it's current location and master.
```
win [CLIENT] swap
```
---`kill` close the window.
```
win [CLIENT] kill
```
---`focus` (integer/string) change the focused window.
- `next` focus the next window.
- `prev` focus the previous window.```
win CLIENT focus # focus window by id
win focus next # focus the next window
win focus +2 # focus two windows ahead
```
---`mvstack` (integer/string) move a tiled window around the stack.
- `up` move the tiled window up the stack.
- `down` move the tiled window down the stack.```
win [CLIENT] mvstack up
```
---`resize` change the window size, location, and border width.
- `x` change the x coordinate, can be an integer or one of the following.
- `center left` and `right` gravitate on the x coordinate.- `y` change the y coordinate, can be an integer or one of the following.
- `center top` and `bottom` gravitate on the y coordinate.- `w` `width` change the window width.
- `h` `height` change the window height.
- `bw` `border_width` change the window border width.```
win [CLIENT] resize x=100 y=100 w=1280 h=720 bw=1
win [CLIENT] resize x=center y=center w=1280 h=720 bw=1
```
---
#### Status
`status` print status information to a file or stdout.```
status [TYPE] [FILE] [NUM]
```###### Subcommands
`type` (string) the type of status info to output.- `ws` output workspace info.
- `win` output current window title.
- `layout` output current workspace layout name.
- `bar` output simple info for use in bars *(win, layout, and ws combined)*.
- `full` output the full wm and managed client state.```
status type=ws [FILE] [NUM]
```
---`file` (string) the location of the status file.
```
status file=/tmp/dk.status [TYPE] [NUM]
```
---`num` (integer) the number of times to output, -1 is infinite and default if not specified.
```
status [TYPE] [FILE] # output forever
status num=1 [TYPE] [FILE] # output once
```### Todo
- Simplification.
### Contributing
I'm very open to contributions or ideas.
To enable internal stderr debug output
```
make debug
```Te enable debug and get function calls
```
make fdebug
```To leave debug symbols in *(for gdb, valgrind, etc.)*.
```
make nostrip
```### Credits
See the LICENSE file for a list of authors/contributors.
Huge thanks to Kjetil Molteberg *(@badkarma)* on the Archlabs forum for the logo.
Non contributors that I owe a huge thanks to:
[dwm](https://dmw.suckless.org), [bspwm](https://github.com/baskerville/bspwm),
[xmonad](https://xmonad.org), [evilwm](http://www.6809.org.uk/evilwm/),
[monsterwm-xcb](https://github.com/Cloudef/monsterwm-xcb),
[4wm](https://github.com/dct2012/4wm), and [frankenwm](https://github.com/sulami/FrankenWM).