#!/hint/bash MODKEY=Mod4 # "super" UP=p DOWN=n LEFT=b RIGHT=f HIST="$XDG_CACHE_HOME/wmii/history" mkdir -p -- "${HIST%/*}" # Colors tuples: " " . theme-abyss log() { echo "wmiirc[$$]: $*" } Event() { local event=$1; shift; case "$event" in ## Mouse event meanings: ## MouseDown = mouse down ## Click = mouse up ## DND = hover, while dragging something (Drag 'n' Drop) ## The associated mouse button is always "1" ## ## Mouse-button IDs: ## 1 = left ## 2 = middle ## 3 = right ## 4 = scroll up ## 5 = scroll down ## Custom (non-WMII-generated) events WmiircStart) ## No args log " ==> Starting wmiirc[$$]" is_mounted $WMII_DIR && Event WmiircUnmount Event WmiircMount # Configure wmii < "`conffile rules`" expand_variables >> $WMII_DIR/rules < "`conffile ctl-init`" expand_variables >> $WMII_DIR/ctl scansection Key | cut -sf2 >> $WMII_DIR/keys #hsetroot -solid "$WMII_BACKGROUND" # Clear the LBar and RBar find $WMII_DIR/{l,r}bar -type f -delete # Populate the LBar by emulating [Create|Focus]Tag events local tag seltag="$(sed 1q $WMII_DIR/tag/sel/ctl)" while read -r tag; do Event CreateTag "$tag" if [ "$tag" = "$seltag" ]; then Event FocusTag "$tag" fi done < <(lstags) ;; WmiircQuit) ## No args trap - EXIT log " ==> Stopping wmiirc[$$]" exit;; WmiircMount) ## No args log " -> Creating mountpoint WMII_DIR=$WMII_DIR..." mkdir -p "$WMII_DIR" log " -> Mounting WMII_DIR=$WMII_DIR..." mount.9p "$WMII_ADDRESS" "$WMII_DIR" ;; WmiircUnmount) ## No args log " -> Unmounting WMII_DIR=$WMII_DIR..." umount.9p "$WMII_DIR" log " -> Removing mountpoint WMII_DIR=$WMII_DIR..." rmdir -p "$WMII_DIR" 2>/dev/null;; ## WMII-meta events Quit) ## No args trap - EXIT systemd-notify STOPPING=1 || true Event WmiircUnmount Event WmiircQuit;; Warning) ## $@=string notify-send "wmii warning: $*";; Key) ## $1=keystroke Key "$@";; ## WMII Window management events FocusFloating) ## No args ;; AreaFocus) ## $1=area ;; DestroyArea) ## $1=area ;; ColumnFocus) ## $1=column ;; CreateColumn) ## $1=column ;; ## Client events CreateClient) ## $1=client ;; DestroyClient) ## $1=client ;; Urgent) ## $1=client $2=[Manager|Client] ;; NotUrgent) ## $1=client $2=[Manager|Client] ;; ClientMouseDown) ## $1=client $2=button local client=$1 local button=$2 case $button in 1) ;; 2) ;; 3) { case $(wmii9menu Delete Fullscreen ToggleFloat SendLeft SendRight) in Delete) echo kill >> $WMII_DIR/client/$client/ctl;; Fullscreen) echo Fullscreen on >> $WMII_DIR/client/$client/ctl;; ToggleFloat) echo send $client toggle >> $WMII_DIR/tag/sel/ctl;; SendLeft) echo send sel left >> $WMII_DIR/tag/sel/ctl;; SendRight) echo send sel right >> $WMII_DIR/tag/sel/ctl;; esac }& ;; 4) ;; 5) ;; esac;; ClientClick) ## $1=client $2=button ;; Unresponsive) ## $1=client local client=$1 local client_name=$(< $WMII_DIR/client/$client/label) local msg resp msg="The client \`${client_name}' is not responding." msg+=" What would you like to do?" { resp=$(wihack -transient $client \ xmessage -nearmouse -buttons Kill,Wait -print "$msg") if [ "$resp" = Kill ]; then echo slay >> $WMII_DIR/client/$client/ctl fi }& ;; Fullscreen) ## $1=client $2=[on|off] # TODO: hide any clients with the 'panel' class ;; ## Tag events CreateTag) ## $1=tag echo label "$*" >> $WMII_DIR/lbar/$1;; DestroyTag) ## $1=tag rm $WMII_DIR/lbar/$1;; FocusTag) ## $1=tag echo colors "$WMII_FOCUSCOLORS" >> $WMII_DIR/lbar/$1;; UnfocusTag) ## $1=tag echo colors "$WMII_NORMCOLORS" >> $WMII_DIR/lbar/$1;; UrgentTag) ## $1=[Manager|Client] $2=tag echo colors "$WMII_URGENTCOLORS" >> $WMII_DIR/lbar/$2;; NotUrgentTag) ## $1=[Manager|Client] $2=tag echo colors "$WMII_NORMCOLORS" >> $WMII_DIR/lbar/$2;; ## LeftBar events (usually tag buttons) LeftBarMouseDown) ## $1=button $2=bar_item ;; LeftBarClick) ## $1=button $2=bar_item shift # ignore the button echo view "$@" >> $WMII_DIR/ctl;; LeftMouseDND) ## $1=button $2=bar_item Event LeftBarClick "$@";; ## RightBar events RightBarMouseDown) ## $1=button $2=bar_item local button=$1 local item=$2 local name=${item#[0-9][0-9]_} name=${name%.*} Action "rbar_$name" "$button" & ;; RightBarClick) ## $1=button $2=bar_item ;; RightMouseDND) ## $1=button $2=bar_item Event RightBarClick "$@";; esac } Key() { local key=$1 case "$key" in ## Moving around $MODKEY-$LEFT) ## Select the client to the left echo select left >> $WMII_DIR/tag/sel/ctl;; $MODKEY-$RIGHT) ## Select the client to the right echo select right >> $WMII_DIR/tag/sel/ctl;; $MODKEY-$UP) ## Select the client above echo select up >> $WMII_DIR/tag/sel/ctl;; $MODKEY-$DOWN) ## Select the client below echo select down >> $WMII_DIR/tag/sel/ctl;; $MODKEY-space) ## Toggle between floating and managed layers echo select toggle >> $WMII_DIR/tag/sel/ctl;; ## Moving clients around $MODKEY-Shift-$LEFT) ## Move selected client to the left echo send sel left >> $WMII_DIR/tag/sel/ctl;; $MODKEY-Shift-$RIGHT) ## Move selected client to the right echo send sel right >> $WMII_DIR/tag/sel/ctl;; $MODKEY-Shift-$UP) ## Move selected client up echo send sel up >> $WMII_DIR/tag/sel/ctl;; $MODKEY-Shift-$DOWN) ## Move selected client down echo send sel down >> $WMII_DIR/tag/sel/ctl;; $MODKEY-Shift-space) ## Toggle selected client between floating and managed layers echo send sel toggle >> $WMII_DIR/tag/sel/ctl;; ## Moving through stacks $MODKEY-Control-$UP) ## Select the stack above echo select up stack >> $WMII_DIR/tag/sel/ctl;; $MODKEY-Control-$DOWN) ## Select the stack below echo select down stack >> $WMII_DIR/tag/sel/ctl;; ## Client actions $MODKEY-shift-1) ## Toggle selected client's fullsceen state echo Fullscreen toggle >> $WMII_DIR/client/sel/ctl;; $MODKEY-shift-0) ## Close client echo kill >> $WMII_DIR/client/sel/ctl;; ## Changing column modes $MODKEY-d) ## Set column to default mode echo colmode sel default-max >> $WMII_DIR/tag/sel/ctl;; $MODKEY-s) ## Set column to stack mode echo colmode sel stack-max >> $WMII_DIR/tag/sel/ctl;; $MODKEY-m) ## Set column to max mode echo colmode sel stack+max >> $WMII_DIR/tag/sel/ctl;; ## Running programs $MODKEY-a) ## Open wmii actions menu local action action="$(path_ls "$WMII_CONFPATH" | wimenu -p 'S-a' -h "${HIST}.actions" -n 5000)" || return Action "$action" & ;; $MODKEY-x) ## Open program menu local command command="$(path_ls "$_PATH" | wimenu -p 'S-x' -h "${HIST}.progs" -n 5000)" || return runcmd "$command" & ;; $MODKEY-Return) ## Launch a terminal runcmd x-terminal-emulator & ;; ## Tag actions $MODKEY-t) ## Change to another tag local tag tag=$(lstags | wimenu -p 'S-t' -h "${HIST}.tags" -n 50) || return echo view "$tag" >> $WMII_DIR/ctl;; $MODKEY-Shift-t) ## Retag the selected client local sel tag sel=$(sed 1q $WMII_DIR/client/sel/ctl) tag=$(lstags | wimenu -p 'S-T' -h "${HIST}.tags" -n 50) || return echo "$tag" >> $WMII_DIR/client/$sel/tags;; ## Hardware keys XF86RotateWindows) ## Toggle between 'normal' an 'right' local old new old="$(xrotate|cut -d $'\t' -f3|sort -u)" case "$old" in normal) new=right;; *) new=normal;; esac xrotate "$new" ;; $MODKEY-XF86RotateWindows) ## Rotate in 90° steps local old new old="$(xrotate|cut -d $'\t' -f3|sort -u)" case "$old" in normal) new=right;; right) new=inverted;; inverted) new=left;; left) new=normal;; esac xrotate "$new" ;; esac } runcmd() ( PATH=$_PATH unset NOTIFY_SOCKET # systemd unset WMII_CONFPATH # wmii unset WMII_ADDRESS # wmii unset _PATH WMII_NAMESPACE WMII_DIR # wmiirc exec 8>&- # xinit/systemd handshake exec systemd-run --user --scope -- sh -c "$*" ) Action() { local prog=$(path_which "$WMII_CONFPATH" "$1"); shift if [ -n "$prog" ]; then exec "$prog" "$@" else exec false fi }