#!/bin/sh # example dkrc to provide a close-to-default setup and # show some basic command usage with error reporting # determine where to place the log file logfile="$HOME/.dkrc.log" [ -d "$HOME/.local/share/xorg" ] && logfile="$HOME/.local/share/xorg/dkrc.log" : > "$logfile" # load sxhkd for keybinds pgrep sxhkd || sxhkd -c "$HOME/.config/dk/sxhkdrc" & # spawn a scratchpad terminal if not already (see sxhkdrc and rules for binds/setup) # pgrep -f "st -c scratchpad" || st -c scratchpad & # adjust border widths based on the DPI of the monitor px=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+x[0-9]\+' | cut -d'x' -f2) mm=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+mm' | tail -n1 | sed 's/mm//') dpi=$(( (px / mm) * 25 )) if [ $dpi -ge 140 ]; then border_width=5 border_outer_width=3 elif [ $dpi -ge 120 ]; then border_width=4 border_outer_width=2 else border_width=2 border_outer_width=1 fi { # compound command to redirect all output # workspace settings # ------------------------ # initialize 6 workspaces (1-6) (default: 1/monitor) dkcmd set numws=6 # default workspace '_' values used when allocating new workspaces # can be applied to all existing workspaces when passed 'apply' after ws=_ dkcmd set ws=_ apply layout=tile master=1 stack=5 gap=0 msplit=0.55 ssplit=0.45 # use grid layout, padding, and gaps on last workspace #dkcmd set ws=6 layout=grid pad left=200 right=200 top=100 bottom=100 gap=50 # change workspace names (default: number == name -> 1:1, 2:2, 3:3....) # dkcmd set \ # ws=1 name="edit" \ # ws=2 name="web" \ # ws=3 name="😀" \ # ws=4 name="😠" \ # ws=5 name="5" \ # ws=6 name="6" \ # enable static workspaces assigned to monitors (relevant for multiple monitors) # aside - # If you come from this workspace model, try embracing the default behaviour # and access to all workspaces from any monitor, you might end up liking it :) # # this could be done in the names section above if being used # # mon1='DisplayPort-0' # mon2='HDMI-A-0' # dkcmd set static_ws=true \ # ws=1 mon=$mon1 \ # ws=2 mon=$mon1 \ # ws=3 mon=$mon1 \ # ws=4 mon=$mon2 \ # ws=5 mon=$mon2 \ # ws=6 mon=$mon2 \ # global settings # --------------------- # focus windows when receiving activation and enable focus-follows-mouse #dkcmd set focus_open=true focus_urgent=true focus_mouse=true dkcmd set focus_open=true focus_urgent=true focus_mouse=false # place clients at the tail and ignore size hints on tiled windows dkcmd set tile_tohead=0 tile_hints=false # minimum width/height for resizing, and minimum allowed on-screen when moving dkcmd set win_minwh=50 win_minxy=10 # disable gaps and borders in single window layouts dkcmd set smart_gap=true smart_border=true # define mouse mod and move/resize buttons dkcmd set mouse mod=super move=button1 resize=button3 # obey motif border hints on windows that draw their own (steam, easyeffects, etc.) dkcmd set obey_motif=true # borders # --------- # traditional # set border width and colour for each window state #dkcmd set border width=$border_width colour focus='#a4a500' unfocus='#000000' urgent='#ee5555' # alternative # enable split borders and colours, width is overall width, outer_width consumes some of width. # outer_width must be less than width, outer_width of 0 will be single borders dkcmd set border width=$border_width outer_width=$border_outer_width \ colour \ focus='#a4a500' \ unfocus='#444444' \ urgent='#ee5555' \ outer_focus='#222222' \ outer_unfocus='#222222' \ outer_urgent='#222222' # window rules # -------------- # rule class, instance, and title regex are *always* case INSENSITIVE # open window(s) on a specific workspace (assigned monitor) # dkcmd rule class="^gimp$" ws=2 # open window(s) on a monitor by number or name (active workspace on monitor) # dkcmd rule class="^chromium$" mon="HDMI-A-0" # open window(s) and use a callback function (user defined in config.h) # we also ignore_cfg=true to stop the window from being resized on it's own from events # eg. mpv --x11-name=albumart /path/to/media # dkcmd rule class="^mpv$" instance="^albumart$" float=true ignore_cfg=true callback=albumart bw=0 # open window(s) in a floating state dkcmd rule class="^(pavucontrol|transmission-gtk|steam|lxappearance)$" float=true # open window(s) with a specific geometry and coordinates (floating only!) # dkcmd rule class="^google-chrome$" title="^open files$" float=true w=1280 h=720 # open window(s) with ignore_msg=true to avoid focus being grabbed and changing workspace # dkcmd rule class="^TelegramDesktop$" ignore_msg=true # define some terminals and allow them to be absorbed by spawned windows dkcmd rule class="^(st|st-256color|urxvt|kitty|alacritty|xterm|xterm-256color)$" terminal=true # set a window to never absorb other windows, like the xev event tester dkcmd rule title="^Event Tester$" no_absorb=true # send a window to the scratchpad dkcmd rule class="^scratchpad$" scratch=true # focus window and workspace on opening # dkcmd rule class="^firefox$" ws=1 focus=true # update or remove an existing rule with the same match patterns # dkcmd rule class="^firefox$" mon="HDMI-A-0" # dkcmd rule remove class="^firefox$" # apply current rule set to all existing windows (used mainly for WM restart) dkcmd rule apply '*' # delete all rules # dkcmd rule remove '*' } >> "$logfile" 2>&1 # append responses # inform of any errors in a notification if grep -q 'error:' "$logfile"; then hash notify-send && notify-send -t 0 -u critical "dkrc has errors" \ "$(awk '/error:/ {sub(/^error: /, ""); gsub(/