summaryrefslogtreecommitdiff
path: root/.wmii/wmiirc
diff options
context:
space:
mode:
Diffstat (limited to '.wmii/wmiirc')
-rwxr-xr-x.wmii/wmiirc528
1 files changed, 292 insertions, 236 deletions
diff --git a/.wmii/wmiirc b/.wmii/wmiirc
index d41f392..f211d7f 100755
--- a/.wmii/wmiirc
+++ b/.wmii/wmiirc
@@ -1,269 +1,325 @@
-#!/bin/dash -f
-# -*- mode: sh; -*-
+#!/bin/bash
+# Let any running instances of wmiirc know that we're starting
-# Configure wmii
-wmiiscript=wmiirc # For wmii.sh
-. wmii.sh
+echo ' ==> Starting wmiirc'
+wmiir xwrite /event Start
+export WMII_NAMESPACE=`wmiir namespace`
+mount9p=/opt/plan9/bin/9pfuse
-export WMII_FONT='xft:Monospace-8'
-export WMII_TERM=x-terminal-emulator
-. $HOME/.wmii/wmiirc_local
+mkdir -p $WMII_NAMESPACE/mnt
+$mount9p $WMII_NAMESPACE/{wmii,mnt}
+export WMII_DIR=$WMII_NAMESPACE/mnt
+
+# a -- a work-around for buggy IO append in 9pfuse
+# useing '|a' should be just like using '>>', but will work
+# when 9pfuse decides to bug out.
+a() {
+ f="${1/#${WMII_DIR}/}"
+ if [ "$f" = "$1" ]; then
+ cat >> "$1"
+ else
+ if wmiir ls "$f" &>/dev/null; then
+ wmiir write "$f"
+ else
+ wmiir create "$f"
+ fi
+ fi
+}
+# I like wmiir's setsid better than linux-utils'
+setsid() { wmiir setsid "$@"; }
+WMII_FONT='xft:Monospace-8'
+WMII_TERM=x-terminal-emulator
+. $HOME/.wmii/wmiirc_local
# Configuration Variables
UP=p
DOWN=n
LEFT=b
RIGHT=f
-# Bars
-noticetimeout=5
-noticebar=/rbar/!notice
-
# Colors tuples: "<text> <background> <border>"
-. $HOME/.wmii/wmiirc_solarized_dark
+. $HOME/.wmii/theme-solarized-dark
# Menu history
hist="${WMII_CONFPATH%%:*}/history"
-histnum=5000
-
-# Column Rules
-wmiir write /colrules <<!
-/gimp/ -> 17+83+41
-/.*/ -> 62+38 # Golden Ratio
-!
# Tagging Rules
-wmiir write /tagrules <<!
-/MPlayer|VLC/ -> ~
-/Gimp/ -> ~+gimp
-/Emacs|Navigator/ -> +sel
-!
-
-local_events() { true; }
-wi_runconf -s wmiirc_local
-
-echo $WMII_NORMCOLORS | wmiir create $noticebar
-
-# Event processing
-events() {
- events_events
- events_menus
- events_actions
- events_keybindings
+echo '/Emacs|Navigator/ -> +sel' |a $WMII_DIR/tagrules
+echo '/panel/ -> /.*/' |a $WMII_DIR/tagrules
+
+if [ -f "${WMII_CONFPATH%%:*}/wmiirc_local" ]; then
+ . "${WMII_CONFPATH%%:*}/wmiirc_local"
+fi
+
+path_ls() {
+ find -L `echo "$@"|sed 'y/:/ /'` -maxdepth 1 -type f -executable -printf '%f\n' 2>/dev/null| sort -u
}
-events_events() {
- cat <<'!'
-# Events
-Event CreateTag
- echo "$WMII_NORMCOLORS" "$@" | wmiir create "/lbar/$@"
-Event DestroyTag
- wmiir remove "/lbar/$@"
-Event FocusTag
- wmiir xwrite "/lbar/$@" "$WMII_FOCUSCOLORS" "$@"
-Event UnfocusTag
- wmiir xwrite "/lbar/$@" "$WMII_NORMCOLORS" "$@"
-Event UrgentTag
- shift
- wmiir xwrite "/lbar/$@" "*$@"
-Event NotUrgentTag
- shift
- wmiir xwrite "/lbar/$@" "$@"
-Event LeftBarClick LeftBarDND
- shift
- wmiir xwrite /ctl view "$@"
-Event Unresponsive
- {
- client=$1; shift
- msg="The following client is not responding. What would you like to do?$wi_newline"
- resp=$(wihack -transient $client \
- xmessage -nearmouse -buttons Kill,Wait -print
- -fn "${WMII_FONT%%,*}" "$msg $(wmiir read /client/sel/label)")
- if [ "$resp" = Kill ]; then
- wmiir xwrite /client/$client/ctl slay &
- fi
- }&
-Event Notice
- wmiir xwrite $noticebar $wi_arg
-
- kill $xpid 2>/dev/null # Let's hope this isn't reused...
- { sleep $noticetimeout; wmiir xwrite $noticebar ' '; }&
- xpid = $!
-!
+
+path_which() {
+ mypath=$1
+ prog=$2
+ which=`which which`
+ PATH="$mypath" "$which" -- "$prog" 2>/dev/null
}
-events_menus() {
- cat <<'!'
-# Window menus
-Menu Client-3-Delete
- wmiir xwrite /client/$1/ctl kill
-#Menu Client-3-Kill
-# wmiir xwrite /client/$1/ctl slay
-Menu Client-3-Fullscreen
- wmiir xwrite /client/$1/ctl Fullscreen on
-Event ClientMouseDown
- wi_fnmenu Client $2 $1 &
-
-# LBar menus
-Menu LBar-3-Delete
- tag=$1; clients=$(wmiir read "/tag/$tag/index" | awk '/[^#]/{print $2}')
- for c in $clients; do
- if [ "$tag" = "$(wmiir read /client/$c/tags)" ]; then
- wmiir xwrite /client/$c/ctl kill
- else
- wmiir xwrite /client/$c/tags -$tag
- fi
- if [ "$tag" = "$(wi_seltag)" ]; then
- newtag=$(wi_tags | awk -v't='$tag '
- $1 == t { if(!l) getline l
- print l
- exit }
- { l = $0 }')
- wmiir xwrite /ctl view $newtag
- fi
- done
-Event LeftBarMouseDown
- wi_fnmenu LBar "$@" &
-!
+
+lstags() {
+ ls $WMII_DIR/tag | sed '/^sel$/d'
+}
+
+scansection() {
+ file=`path_which "$WMII_CONFPATH" wmiirc`
+ sec=$1
+ tmp=`mktemp`
+ if [ -n "$sec" ]; then
+ < "$file" sed -n "/^\s*$sec\s*()/,/##\s*End $sec/p" | sed '1d;$d'> $tmp
+ else
+ < "$file" sed "/\s*}\s*##\s*End\s/d" > $tmp
+ fi
+ < $tmp sed -n '/##/p'|sed -r 's/^\s*(.*)\)\s*## ?/\t\1\t/;s/\s*## ?//'
+ rm $tmp
}
-events_actions() {
- cat <<'!'
-# Actions
-Action showkeys
- echo "$KeysHelp" | xmessage -file - -fn ${WMII_FONT%%,*}
-Action quit
- wmiir xwrite /ctl quit
-Action exec
- wmiir xwrite /ctl exec "$@"
-Action rehash
- wi_proglist $PATH >$progsfile
-Action status
- set +xv
- if wmiir remove /rbar/status 2>/dev/null; then
- sleep 2
+Action() {
+ prog=`path_which "$WMII_CONFPATH" $1`; shift
+ if [ -n "$prog" ]; then
+ "$prog" "$@"
+ return $?
+ else
+ return 1
fi
- echo "$WMII_NORMCOLORS" | wmiir create /rbar/status
- while status | wmiir write /rbar/status; do
- sleep 1
- done
-!
}
-events_keybindings() {
- cat <<'!'
+Event() {
+ 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
+
+ ## WMII-meta events
+ Quit) ## No args
+ fusermount -u $WMII_DIR
+ exit $?;;
+ 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
+ client=$1
+ button=$2
+ case $button in
+ 1) ;;
+ 2) ;;
+ 3)
+ {
+ case `wmii9menu Delete Fullscreen` in
+ Delete)
+ echo kill |a $WMII_DIR/client/$client/ctl;;
+ Fullscreen)
+ echo Fullscreen on |a $WMII_DIR/client/$1/ctl;;
+ esac
+ }& ;;
+ esac;;
+ ClientClick) ## $1=client $2=button
+ ;;
+ Unresponsive) ## $1=client
+ client=$1
+ client_name=`cat $WMII_DIR/client/$client/label`
+ 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 |a $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 "$WMII_NORMCOLORS" $@ |a $WMII_DIR/lbar/$1;;
+ DestroyTag) ## $1=tag
+ rm $WMII_DIR/lbar/$1;;
+ FocusTag) ## $1=tag
+ echo "$WMII_FOCUSCOLORS" $1 |a $WMII_DIR/lbar/$1;;
+ UnfocusTag) ## $1=tag
+ echo "$WMII_NORMCOLORS" $1 |a $WMII_DIR/lbar/$1;;
+ UrgentTag) ## $1=tag $2=[Manager|Client]
+ echo "$WMII_URGENTCOLORS" $1 |a $WMII_DIR/lbar/$1;;
+ NotUrgentTag) ## $1=tag $2=[Manager|Client]
+ echo "$WMII_NORMCOLORS" $1 |a $WMII_DIR/lbar/$1;;
+
+ ## LeftBar events (usually tag buttons)
+ LeftBarMouseDown) ## $1=button $2=bar_item
+ ;;
+ LeftBarClick) ## $1=button $2=bar_item
+ shift # ignore the button
+ echo view "$@" |a $WMII_DIR/ctl;;
+ LeftMouseDND) ## $1=button $2=bar_item
+ Event LeftBarClick "$@";;
+
+ ## RightBar events
+ RightBarMouseDown) ## $1=button $2=bar_item
+ ;;
+ RightBarClick) ## $1=button $2=bar_item
+ ;;
+ RightMouseDND) ## $1=button $2=bar_item
+ Event RightBarClick "$@";;
+
+ ## Custom (non-WMII-generated) events
+ Start) ## No args
+ Event Quit;; # get out of the way for a new event loop
+ esac
+} ## End Event
+
# Key Bindings
-KeyGroup Moving around
-Key $MODKEY-$LEFT # Select the client to the left
- wmiir xwrite /tag/sel/ctl select left
-Key $MODKEY-$RIGHT # Select the client to the right
- wmiir xwrite /tag/sel/ctl select right
-Key $MODKEY-$UP # Select the client above
- wmiir xwrite /tag/sel/ctl select up
-Key $MODKEY-$DOWN # Select the client below
- wmiir xwrite /tag/sel/ctl select down
-
-Key $MODKEY-space # Toggle between floating and managed layers
- wmiir xwrite /tag/sel/ctl select toggle
-
-KeyGroup Moving clients around
-Key $MODKEY-Shift-$LEFT # Move selected client to the left
- wmiir xwrite /tag/sel/ctl send sel left
-Key $MODKEY-Shift-$RIGHT # Move selected client to the right
- wmiir xwrite /tag/sel/ctl send sel right
-Key $MODKEY-Shift-$UP # Move selected client up
- wmiir xwrite /tag/sel/ctl send sel up
-Key $MODKEY-Shift-$DOWN # Move selected client down
- wmiir xwrite /tag/sel/ctl send sel down
-
-Key $MODKEY-Shift-space # Toggle selected client between floating and managed layers
- wmiir xwrite /tag/sel/ctl send sel toggle
-
-KeyGroup Moving through stacks
-Key $MODKEY-Control-$UP # Select the stack above
- wmiir xwrite /tag/sel/ctl select up stack
-Key $MODKEY-Control-$DOWN # Select the stack below
- wmiir xwrite /tag/sel/ctl select down stack
-
-KeyGroup Client actions
-Key $MODKEY-shift-1 # Toggle selected client's fullsceen state
- wmiir xwrite /client/sel/ctl Fullscreen toggle
-Key $MODKEY-shift-0 # Close client
- wmiir xwrite /client/sel/ctl kill
-
-KeyGroup Changing column modes
-Key $MODKEY-d # Set column to default mode
- wmiir xwrite /tag/sel/ctl colmode sel default-max
-Key $MODKEY-s # Set column to stack mode
- wmiir xwrite /tag/sel/ctl colmode sel stack-max
-Key $MODKEY-m # Set column to max mode
- wmiir xwrite /tag/sel/ctl colmode sel stack+max
-
-KeyGroup Running programs
-Key $MODKEY-a # Open wmii actions menu
- action $(wi_actions | wimenu -h "${hist}.actions" -n $histnum) &
-Key $MODKEY-x # Open program menu
- eval wmiir setsid "$(wimenu -h "${hist}.progs" -n $histnum <$progsfile)" &
-Key $MODKEY-Return # Launch a terminal
- eval wmiir setsid $WMII_TERM &
-
-KeyGroup Other
-Key $MODKEY-Control-t # Toggle all other key bindings
- case $(wmiir read /keys | wc -l | tr -d ' \t\n') in
- 0|1)
- echo -n "$Keys" | wmiir write /keys
- wmiir xwrite /ctl grabmod $MODKEY;;
- *)
- wmiir xwrite /keys $MODKEY-Control-t
- wmiir xwrite /ctl grabmod Mod3;;
+Key() {
+ key=$1
+ case "$key" in
+ ## Moving around
+
+ $MODKEY-$LEFT) ## Select the client to the left
+ echo select left |a $WMII_DIR/tag/sel/ctl;;
+ $MODKEY-$RIGHT) ## Select the client to the right
+ echo select right |a $WMII_DIR/tag/sel/ctl;;
+ $MODKEY-$UP) ## Select the client above
+ echo select up |a $WMII_DIR/tag/sel/ctl;;
+ $MODKEY-$DOWN) ## Select the client below
+ echo select down |a $WMII_DIR/tag/sel/ctl;;
+
+ $MODKEY-space) ## Toggle between floating and managed layers
+ echo select toggle |a $WMII_DIR/tag/sel/ctl;;
+
+ ## Moving clients around
+
+ $MODKEY-Shift-$LEFT) ## Move selected client to the left
+ wmiir xwrite /tag/sel/ctl send sel left;;
+ $MODKEY-Shift-$RIGHT) ## Move selected client to the right
+ wmiir xwrite /tag/sel/ctl send sel right;;
+ $MODKEY-Shift-$UP) ## Move selected client up
+ wmiir xwrite /tag/sel/ctl send sel up;;
+ $MODKEY-Shift-$DOWN) ## Move selected client down
+ wmiir xwrite /tag/sel/ctl send sel down;;
+
+ $MODKEY-Shift-space) ## Toggle selected client between floating and managed layers
+ wmiir xwrite /tag/sel/ctl send sel toggle;;
+
+ ## Moving through stacks
+ $MODKEY-Control-$UP) ## Select the stack above
+ wmiir xwrite /tag/sel/ctl select up stack;;
+ $MODKEY-Control-$DOWN) # Select the stack below
+ wmiir xwrite /tag/sel/ctl select down stack;;
+
+ ## Client actions
+ $MODKEY-shift-1) ## Toggle selected client's fullsceen state
+ wmiir xwrite /client/sel/ctl Fullscreen toggle;;
+ $MODKEY-shift-0) ## Close client
+ wmiir xwrite /client/sel/ctl kill;;
+
+ ## Changing column modes
+ $MODKEY-d) ## Set column to default mode
+ wmiir xwrite /tag/sel/ctl colmode sel default-max;;
+ $MODKEY-s) ## Set column to stack mode
+ wmiir xwrite /tag/sel/ctl colmode sel stack-max;;
+ $MODKEY-m) ## Set column to max mode
+ wmiir xwrite /tag/sel/ctl colmode sel stack+max;;
+
+ ## Running programs
+ $MODKEY-a) ## Open wmii actions menu
+ Action $(path_ls $WMII_CONFPATH | wimenu -h "${hist}.actions" -n 5000) & ;;
+ $MODKEY-x) ## Open program menu
+ setsid $(wimenu -h "${hist}.progs" -n 5000 <$progsfile) & ;;
+ $MODKEY-Return) ## Launch a terminal
+ setsid $WMII_TERM & ;;
+
+ ## Other
+ $MODKEY-Control-t) ## Toggle all other key bindings
+ case $(wmiir read /keys | wc -l | tr -d ' \t\n') in
+ 0|1)
+ echo -n "$Keys" | wmiir write /keys
+ wmiir xwrite /ctl grabmod $MODKEY;;
+ *)
+ wmiir xwrite /keys $MODKEY-Control-t
+ wmiir xwrite /ctl grabmod Mod3;;
+ esac;;
+
+ ## Tag actions
+ $MODKEY-t) ## Change to another tag
+ {
+ tag=$(lstags | wimenu -h "${hist}.tags" -n 50) || return
+ wmiir xwrite /ctl view $tag
+ }& ;;
+ $MODKEY-Shift-t) ## Retag the selected client
+ sel=$(sed 1q $WMII_DIR/client/sel/ctl)
+ {
+ tag=$(lstags | wimenu -h "${hist}.tags" -n 50) || return
+ wmiir xwrite /client/$sel/tags $tag
+ }& ;;
esac
+} ## End Key
-KeyGroup Tag actions
-Key $MODKEY-t # Change to another tag
- (tag=$(wi_tags | wimenu -h "${hist}.tags" -n 50) && wmiir xwrite /ctl view $tag) &
-Key $MODKEY-Shift-t # Retag the selected client
- c=$(wi_selclient)
- (tag=$(wi_tags | wimenu -h "${hist}.tags" -n 50) && wmiir xwrite /client/$c/tags $tag) &
-!
- for i in 0 1 2 3 4 5 6 7 8 9; do
- cat <<'!'
-Key $MODKEY-$i # Move to the numbered view
- wmiir xwrite /ctl view "$i"
-#Key $MODKEY-Shift-$i # Retag selected client with the numbered tag
-# wmiir xwrite /client/sel/tags "$i"
-!
- done
-}
-wi_events events local_events
-
-# WM Configureation
-wmiir write /ctl <<!
- font $WMII_FONT
- focuscolors $WMII_FOCUSCOLORS
- normcolors $WMII_NORMCOLORS
- grabmod $MODKEY
- border 1
-!
+# WM Configuration
+echo font $WMII_FONT |a $WMII_DIR/ctl
+echo focuscolors $WMII_FOCUSCOLORS |a $WMII_DIR/ctl
+echo normcolors $WMII_NORMCOLORS |a $WMII_DIR/ctl
+echo grabmod $MODKEY |a $WMII_DIR/ctl
+echo border 1 |a $WMII_DIR/ctl
xsetroot -solid "$WMII_BACKGROUND" &
-# Misc
-progsfile="$(wmiir namespace)/.proglist"
-action status &
-wi_proglist $PATH >$progsfile &
-
-# Setup Tag Bar
-IFS="$wi_newline"
-wmiir rm $(wmiir ls /lbar | sed 's,^,/lbar/,') >/dev/null
-seltag=$(wmiir read /tag/sel/ctl | sed 1q)
-unset IFS
-wi_tags | while read tag
-do
+progsfile=$WMII_NAMESPACE/.proglist
+path_ls $PATH > $progsfile &
+
+eval arg `scansection Key|cut -sf2` |a $WMII_DIR/keys
+
+# Clear the LBar
+find $WMII_DIR/lbar -type f -delete
+
+# Emulate [Create|Focus]Tag events
+seltag=`sed 1q $WMII_DIR/tag/sel/ctl`
+lstags | while read tag; do
+ Event CreateTag "$tag"
if [ "$tag" = "$seltag" ]; then
- echo "$WMII_FOCUSCOLORS" "$tag"
- else
- echo "$WMII_NORMCOLORS" "$tag"
- fi | wmiir create "/lbar/$tag"
+ Event FocusTag "$tag"
+ fi
done
-wi_eventloop
+Action autostart 2>/dev/null &
+# use wmiir so it doesn't look like an open file
+wmiir read /event | while read event; do
+ Event $event
+done