wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 5c506656f5bb7a285eb65ba990ad5b1bbb30c85e
parent 2a8d326db5997c8f45eab2b43ed06e09cf000519
Author: Kris Maglione <jg@suckless.org>
Date:   Fri,  9 Oct 2009 16:40:33 -0400

Cleanup wmiirc scripts.

Diffstat:
README | 4++--
alternative_wmiircs/plan9port/wmiirc | 4++--
alternative_wmiircs/python/pygmi/events.py | 53+++++++++++++++++++++++++++--------------------------
alternative_wmiircs/python/wmiirc.py | 190++++++++++++++++++++++++++++++++++++++++---------------------------------------
cmd/wmii.rc.rc | 6+++---
cmd/wmii.sh.sh | 30++++++++++++++++++------------
rc/wmiirc.sh | 340+++++++++++++++++++++++++++++++++++++++----------------------------------------
7 files changed, 317 insertions(+), 310 deletions(-)

diff --git a/README b/README @@ -46,8 +46,8 @@ Configuration ------------- The configuration of wmii is done by customizing the rc script rc.wmii.local, which remotely controls the window manager and handles various events. -The main rc.wmii script lives in PREFIX/etc/wmii-3.5/, while rc.wmii.local -goes in $HOME/.wmii-3.5/. +The main rc.wmii script lives in PREFIX/etc/wmii@CONFPREFIX@/, while rc.wmii.local +goes in $HOME/.wmii@CONFPREFIX@/. If you wish to unbind keys bound by rc.wmii in rc.wmii.local, you must do so inside the function Action-overridekeys. You may, diff --git a/alternative_wmiircs/plan9port/wmiirc b/alternative_wmiircs/plan9port/wmiirc @@ -91,7 +91,7 @@ fn Event-Unresponsive { msg = 'The following client is not responding. What would you like to do?' resp = `{wihack -transient $client \ xmessage -nearmouse -buttons Kill,Wait -print \ - $msg $wi_nl '' `{wmiir read /client/$client/label}} + $msg $wi_newline '' `{wmiir read /client/$client/label}} if(~ $resp Kill) wmiir xwrite /client/$client/ctl slay }&} @@ -258,7 +258,7 @@ Action status & Action rehash & # Tag Bar Setup -ifs=$wi_nl{ +ifs=$wi_newline { rc -c 'wmiir rm /lbar/^$*' >[2]/dev/null \ `{comm -23 <{wmiir ls /lbar} \ <{wi_tags}} diff --git a/alternative_wmiircs/python/pygmi/events.py b/alternative_wmiircs/python/pygmi/events.py @@ -6,8 +6,7 @@ import traceback import pygmi from pygmi import monitor, client, curry, call, program_list, _ -__all__ = ('keys', 'bind_events', 'event_loop', 'event', 'Match', - 'Desc') +__all__ = ('keys', 'bind_events', 'event_loop', 'event', 'Match') keydefs = {} events = {} @@ -55,14 +54,6 @@ def bind_events(items={}, **kwargs): def event(fn): bind_events({fn.__name__: fn}) -class Desc(object): - def __init__(self, doc): - self.doc = doc - def __unicode__(self): - return self.doc - def __str__(self): - return str(self.doc) - class Keys(object): def __init__(self): self.modes = {} @@ -72,8 +63,13 @@ class Keys(object): def _add_mode(self, mode): if mode not in self.modes: - self.modes[mode] = { 'name': mode, 'desc': {}, 'groups': [], - 'keys': {}, 'import': {} } + self.modes[mode] = { + 'name': mode, + 'desc': {}, + 'groups': [], + 'keys': {}, + 'import': {}, + } self.modelist.append(mode) def _set_mode(self, mode): @@ -81,7 +77,8 @@ class Keys(object): self._mode = mode self._keys = dict((k % keydefs, v) for k, v in self.modes[mode]['keys'].items() + - self.modes[mode]['keys'].items()); + self.modes[mode]['import'].items()); + client.write('/keys', '\n'.join(self._keys.keys()) + '\n') mode = property(lambda self: self._mode, _set_mode) @@ -91,7 +88,7 @@ class Keys(object): ('Mode %s\n' % mode['name']) + '\n\n'.join((' %s\n' % str(group or '')) + '\n'.join(' %- 20s %s' % (key % keydefs, - mode['desc'][key]) + mode['keys'][key].__doc__) for key in mode['desc'][group]) for group in mode['groups']) for mode in (self.modes[name] @@ -101,28 +98,32 @@ class Keys(object): self._add_mode(mode) mode = self.modes[mode] group = None - key = None def add_desc(key, desc): - mode['desc'][key] = desc if group not in mode['desc']: mode['desc'][group] = [] mode['groups'].append(group) if key not in mode['desc'][group]: mode['desc'][group].append(key); - for k in keys: - if key and isinstance(k, Desc): - add_desc(key, k) - elif isinstance(k, Desc): - group = str(k) - elif key: - mode['keys'][key] = k - key = None + if isinstance(keys, dict): + keys = keys.iteritems() + for obj in keys: + if isinstance(obj, tuple) and len(obj) in (2, 3): + if len(obj) == 2: + key, val = obj + desc = '' + elif len(obj) == 3: + key, desc, val = obj + mode['keys'][key] = val + add_desc(key, desc) + val.__doc__ = str(desc) else: - key = k + group = obj + def wrap_import(mode, key): + return lambda k: self.modes[mode]['keys'][key](k) for k, v in flatten((v, k) for k, v in import_.iteritems()): - mode['import'][k % keydefs] = v + mode['import'][k % keydefs] = wrap_import(v, k) def dispatch(self, key): mode = self.modes[self.mode] diff --git a/alternative_wmiircs/python/wmiirc.py b/alternative_wmiircs/python/wmiirc.py @@ -161,117 +161,121 @@ class Notice(Button): notice = Notice() keys.bind('main', ( - Desc("Moving around"), - '%(mod)s-%(left)s', Desc("Select the client to the left"), - lambda k: Tag('sel').select('left'), - '%(mod)s-%(right)s', Desc("Select the client to the right"), - lambda k: Tag('sel').select('right'), - '%(mod)s-%(up)s', Desc("Select the client above"), - lambda k: Tag('sel').select('up'), - '%(mod)s-%(down)s', Desc("Select the client below"), - lambda k: Tag('sel').select('down'), - - '%(mod)s-space', Desc("Toggle between floating and managed layers"), - lambda k: Tag('sel').select('toggle'), - - Desc("Moving through stacks"), - '%(mod)s-Control-%(up)s', Desc("Select the stack above"), - lambda k: Tag('sel').select('up', stack=True), - '%(mod)s-Control-%(down)s', Desc("Select the stack below"), - lambda k: Tag('sel').select('down', stack=True), - - - Desc("Moving clients around"), - '%(mod)s-Shift-%(left)s', Desc("Move selected client to the left"), - lambda k: Tag('sel').send(Client('sel'), 'left'), - '%(mod)s-Shift-%(right)s', Desc("Move selected client to the right"), - lambda k: Tag('sel').send(Client('sel'), 'right'), - '%(mod)s-Shift-%(up)s', Desc("Move selected client up"), - lambda k: Tag('sel').send(Client('sel'), 'up'), - '%(mod)s-Shift-%(down)s', Desc("Move selected client down"), - lambda k: Tag('sel').send(Client('sel'), 'down'), - - '%(mod)s-Shift-space', Desc("Toggle selected client between floating and managed layers"), - lambda k: Tag('sel').send(Client('sel'), 'toggle'), - - Desc("Client actions"), - '%(mod)s-f', Desc("Toggle selected client's fullsceen state"), - lambda k: Client('sel').set('Fullscreen', 'toggle'), - '%(mod)s-Shift-c', Desc("Close client"), - lambda k: Client('sel').kill(), - - Desc("Changing column modes"), - '%(mod)s-d', Desc("Set column to default mode"), - lambda k: setattr(Tag('sel').selcol, 'mode', 'default-max'), - '%(mod)s-s', Desc("Set column to stack mode"), - lambda k: setattr(Tag('sel').selcol, 'mode', 'stack-max'), - '%(mod)s-m', Desc("Set column to max mode"), - lambda k: setattr(Tag('sel').selcol, 'mode', 'stack+max'), - - Desc("Running programs"), - '%(mod)s-a', Desc("Open wmii actions menu"), - lambda k: action_menu.call(), - '%(mod)s-p', Desc("Open program menu"), - lambda k: program_menu.call(), - - '%(mod)s-Return', Desc("Launch a terminal"), - lambda k: call(*terminal, background=True), - - Desc("Tag actions"), - '%(mod)s-t', Desc("Change to another tag"), - lambda k: tags.select(tag_menu.call()), - '%(mod)s-Shift-t', Desc("Retag the selected client"), - lambda k: setattr(Client('sel'), 'tags', tag_menu.call()), - - '%(mod)s-n', Desc("Move to the view to the left"), - lambda k: tags.select(tags.next()), - '%(mod)s-b', Desc("Move to the view to the right"), - lambda k: tags.select(tags.next(True)), - '%(mod)s-i', Desc("Move to the newer tag in the tag stack"), - lambda k: tags.select(tags.NEXT), - '%(mod)s-o', Desc("Move to the older tag in the tag stack"), - lambda k: tags.select(tags.PREV), + "Moving around", + ('%(mod)s-%(left)s', "Select the client to the left", + lambda k: Tag('sel').select('left')), + ('%(mod)s-%(right)s', "Select the client to the right", + lambda k: Tag('sel').select('right')), + ('%(mod)s-%(up)s', "Select the client above", + lambda k: Tag('sel').select('up')), + ('%(mod)s-%(down)s', "Select the client below", + lambda k: Tag('sel').select('down')), + + ('%(mod)s-space', "Toggle between floating and managed layers", + lambda k: Tag('sel').select('toggle')), + + "Moving through stacks", + ('%(mod)s-Control-%(up)s', "Select the stack above", + lambda k: Tag('sel').select('up', stack=True)), + ('%(mod)s-Control-%(down)s', "Select the stack below", + lambda k: Tag('sel').select('down', stack=True)), + + + "Moving clients around", + ('%(mod)s-Shift-%(left)s', "Move selected client to the left", + lambda k: Tag('sel').send(Client('sel'), 'left')), + ('%(mod)s-Shift-%(right)s', "Move selected client to the right", + lambda k: Tag('sel').send(Client('sel'), 'right')), + ('%(mod)s-Shift-%(up)s', "Move selected client up", + lambda k: Tag('sel').send(Client('sel'), 'up')), + ('%(mod)s-Shift-%(down)s', "Move selected client down", + lambda k: Tag('sel').send(Client('sel'), 'down')), + + ('%(mod)s-Shift-space', "Toggle selected client between floating and managed layers", + lambda k: Tag('sel').send(Client('sel'), 'toggle')), + + "Client actions", + ('%(mod)s-f', "Toggle selected client's fullsceen state", + lambda k: Client('sel').set('Fullscreen', 'toggle')), + ('%(mod)s-Shift-c', "Close client", + lambda k: Client('sel').kill()), + + "Changing column modes", + ('%(mod)s-d', "Set column to default mode", + lambda k: setattr(Tag('sel').selcol, 'mode', 'default-max')), + ('%(mod)s-s', "Set column to stack mode", + lambda k: setattr(Tag('sel').selcol, 'mode', 'stack-max')), + ('%(mod)s-m', "Set column to max mode", + lambda k: setattr(Tag('sel').selcol, 'mode', 'stack+max')), + + "Running programs", + ('%(mod)s-a', "Open wmii actions menu", + lambda k: action_menu.call()), + ('%(mod)s-p', "Open program menu", + lambda k: program_menu.call()), + + ('%(mod)s-Return', "Launch a terminal", + lambda k: call(*terminal, background=True)), + + "Tag actions", + ('%(mod)s-t', "Change to another tag", + lambda k: tags.select(tag_menu.call())), + ('%(mod)s-Shift-t', "Retag the selected client", + lambda k: setattr(Client('sel'), 'tags', tag_menu.call())), + + ('%(mod)s-n', "Move to the view to the left", + lambda k: tags.select(tags.next())), + ('%(mod)s-b', "Move to the view to the right", + lambda k: tags.select(tags.next(True))), + ('%(mod)s-i', "Move to the newer tag in the tag stack", + lambda k: tags.select(tags.NEXT)), + ('%(mod)s-o', "Move to the older tag in the tag stack", + lambda k: tags.select(tags.PREV)), )) def bind_num(i): keys.bind('main', ( - Desc("Tag actions"), - '%%(mod)s-%d' % i, Desc("Move to view '%d'" % i), - lambda k: tags.select(str(i)), - '%%(mod)s-Shift-%d' % i, Desc("Retag selected client with tag '%d'" % i), - lambda k: setattr(Client('sel'), 'tags', i), + "Tag actions", + ('%%(mod)s-%d' % i, "Move to view '%d'" % i, + lambda k: tags.select(str(i))), + ('%%(mod)s-Shift-%d' % i, "Retag selected client with tag '%d'" % i, + lambda k: setattr(Client('sel'), 'tags', i)), )) map(bind_num, range(0, 10)) keys.bind('main', ( - Desc("Changing modes"), - '%(mod)s-Control-r', Desc("Enter resize mode"), - lambda k: setattr(keys, 'mode', 'resize'), - '%(mod)s-Control-t', Desc("Enter passthrough mode"), - lambda k: setattr(keys, 'mode', 'passthrough'), + "Changing modes", + ('%(mod)s-Control-r', "Enter resize mode", + lambda k: setattr(keys, 'mode', 'resize')), + ('%(mod)s-Control-t', "Enter passthrough mode", + lambda k: setattr(keys, 'mode', 'passthrough')), )); keys.bind('passthrough', ( - Desc("Changing modes"), - '%(mod)s-Control-t', Desc("Leave passthrough mode"), - lambda k: setattr(keys, 'mode', 'main'), + "Changing modes", + ('%(mod)s-Control-t', "Leave passthrough mode", + lambda k: setattr(keys, 'mode', 'main')), )); keys.bind('resize', ( - 'Escape', Desc("Leave resize mode"), - lambda k: setattr(keys, 'mode', 'main'), + ('Escape', "Leave resize mode", + lambda k: setattr(keys, 'mode', 'main')), ), import_={'main': ('%(mod)s-%(left)s', '%(mod)s-%(right)s', '%(mod)s-%(up)s', '%(mod)s-%(down)s', '%(mod)s-Space')}) def addresize(mod, desc, cmd, *args): keys.bind('resize', ( - mod + '%(left)s', Desc("%s selected client to the left" % desc), - lambda k: Tag('sel').ctl(cmd, 'sel sel', 'left', *args), - mod + '%(right)s', Desc("%s selected client to the right" % desc), - lambda k: Tag('sel').ctl(cmd, 'sel sel', 'right', *args), - mod + '%(up)s', Desc("%s selected client up" % desc), - lambda k: Tag('sel').ctl(cmd, 'sel sel', 'up', *args), - mod + '%(down)s', Desc("%s selected client down" % desc), - lambda k: Tag('sel').ctl(cmd, 'sel sel', 'down', *args), + (mod + '%(left)s', "%s selected client to the left" % desc, + lambda k: Tag('sel').ctl(cmd, 'sel sel', 'left', + *args)), + (mod + '%(right)s', "%s selected client to the right" % desc, + lambda k: Tag('sel').ctl(cmd, 'sel sel', 'right', + *args)), + (mod + '%(up)s', "%s selected client up" % desc, + lambda k: Tag('sel').ctl(cmd, 'sel sel', 'up', + *args)), + (mod + '%(down)s', "%s selected client down" % desc, + lambda k: Tag('sel').ctl(cmd, 'sel sel', 'down', + *args)), )); addresize('', 'Grow', 'grow') addresize('Control-', 'Shrink', 'grow', '-1') diff --git a/cmd/wmii.rc.rc b/cmd/wmii.rc.rc @@ -10,7 +10,7 @@ wmiiscript=$1 wmiikeys=() -wi_nl=' +wi_newline=' ' echo Start $wmiiscript | wmiir write /event >[2]/dev/null \ @@ -145,8 +145,8 @@ fn wi_eventloop { wi_initkeys wi_readevent | - while(ifs=$wi_nl{wi_event=`{read}}) { - ifs=$wi_nl{ + while(ifs=$wi_ewlinel{wi_event=`{read}}) { + ifs=$wi_newline{ wi_arg=`{echo $wi_event | sed 's/^[^ ]+ //'}} * = `{echo $wi_event} event = $1; shift diff --git a/cmd/wmii.sh.sh b/cmd/wmii.sh.sh @@ -1,13 +1,24 @@ -if [ -z "$scriptname" ]; then - scriptname="$wmiiscript"; fi +[ -z "$scriptname" ] && scriptname="$wmiiscript" echo Start $wmiiscript | wmiir write /event 2>/dev/null || exit 1 -wi_nl=' +wi_newline=' ' _wi_script() { + # Awk script to mangle key/event/action definition spec + # into switch-case functions and lists of the cases. Also + # generates a simple key binding help text based on KeyGroup + # clauses and comments that appear on key lines. + # + # Each clause (Key, Event, Action) generates a function of the + # same name which executes the indented text after the matching + # clause. Clauses are selected based on the first argument passed + # to the mangled function. Additionally, a variable is created named + # for the plouralized version of the clause name (Keys, Events, + # Actions) which lists each case value. These are used for actions + # menus and to write wmii's /keys file. cat <<'!' BEGIN { arg[1] = "Nop" @@ -83,19 +94,14 @@ Event Key Key "$@" ! eval "cat <<! -$(sed "$_sed" | sed '/^[ ]/s/\([$`]\)/\\\1/g') +$( (test ! -t 0 && cat; for a; do eval "$a"; done) | sed '/^[ ]/s/\([$`\\]\)/\\\1/g') ! " } wi_events() { - _sed="" - if [ "$1" = -s ]; then - _sed="s/^$2//" - shift 2 - fi - #cho "$(_wi_text | awk "$(_wi_script)")" | cat -n - eval "$(_wi_text | awk "$(_wi_script)")" + #cho "$(_wi_text "$@" | awk "$(_wi_script)")" | cat -n + eval "$(_wi_text "$@" | awk "$(_wi_script)")" } wi_fatal() { @@ -189,7 +195,7 @@ wi_eventloop() { wmiir read /event | while read wi_event do - IFS="$wi_nl" + IFS="$wi_newline" wi_arg=$(echo "$wi_event" | sed 's/^[^ ]* //') unset IFS set -- $wi_event diff --git a/rc/wmiirc.sh b/rc/wmiirc.sh @@ -15,14 +15,14 @@ noticetimeout=5 noticebar=/rbar/!notice # Colors tuples: "<text> <background> <border>" -WMII_NORMCOLORS='#000000 #c1c48b #81654f' -WMII_FOCUSCOLORS='#000000 #81654f #000000' +export WMII_NORMCOLORS='#000000 #c1c48b #81654f' +export WMII_FOCUSCOLORS='#000000 #81654f #000000' -WMII_BACKGROUND='#333333' -WMII_FONT='-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*' +export WMII_BACKGROUND='#333333' +export WMII_FONT='-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*' set -- $(echo $WMII_NORMCOLORS $WMII_FOCUSCOLORS) -WMII_TERM="@TERMINAL@" +export WMII_TERM="@TERMINAL@" # Menu history hist="${WMII_CONFPATH%%:*}/history" @@ -52,176 +52,175 @@ echo $WMII_NORMCOLORS | wmiir create $noticebar # Event processing 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_nl" - resp=$(wihack -transient $client \ - xmessage -nearmouse -buttons Kill,Wait -print \ - "$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 = $! - 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 & - 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 "$@" & - # Actions - Action showkeys - xmessage -file - -fn ${WMII_FONT%%,*} <<EOF - $KeysHelp - EOF - Action quit - wmiir xwrite /ctl quit - Action exec - wmiir xwrite /ctl exec "$@" - Action rehash - proglist $PATH >$progsfile - Action status - set +xv - if wmiir remove /rbar/status 2>/dev/null; then - sleep 2 +# 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 - echo "$WMII_NORMCOLORS" | wmiir create /rbar/status - while status | wmiir write /rbar/status; do - sleep 1 - done - # 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 through stacks - Key $MODKEY-Control-$UP # Select the stack above - wmiir xwrite /taglsel/ctl select up stack - Key $MODKEY-Control-$DOWN # Select the stack below - wmiir xwrite /taglsel/ctl select down stack - - 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 Client actions - Key $MODKEY-f # Toggle selected client's fullsceen state - wmiir xwrite /client/sel/ctl Fullscreen toggle - Key $MODKEY-Shift-c # 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-p # 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;; - esac - - 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) & + }& +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 = $! + +# 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 & + +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 "$@" & + +# Actions +Action showkeys + echo "$KeysHelp" | xmessage -file - -fn ${WMII_FONT%%,*} +Action quit + wmiir xwrite /ctl quit +Action exec + wmiir xwrite /ctl exec "$@" +Action rehash + proglist $PATH >$progsfile +Action status + set +xv + if wmiir remove /rbar/status 2>/dev/null; then + sleep 2 + fi + echo "$WMII_NORMCOLORS" | wmiir create /rbar/status + while status | wmiir write /rbar/status; do + sleep 1 + done + +# 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 through stacks +Key $MODKEY-Control-$UP # Select the stack above + wmiir xwrite /taglsel/ctl select up stack +Key $MODKEY-Control-$DOWN # Select the stack below + wmiir xwrite /taglsel/ctl select down stack + +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 Client actions +Key $MODKEY-f # Toggle selected client's fullsceen state + wmiir xwrite /client/sel/ctl Fullscreen toggle +Key $MODKEY-Shift-c # 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-p # 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;; + esac + +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" +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 | sed 's/^ \|^ //') -$(local_events) -! -unset events local_events +wi_events events local_events # WM Configuration wmiir write /ctl <<! @@ -233,16 +232,13 @@ wmiir write /ctl <<! ! xsetroot -solid "$WMII_BACKGROUND" & -export WMII_FONT WMII_TERM -export WMII_FOCUSCOLORS WMII_SELCOLORS WMII_NORMCOLORS - # Misc progsfile="$(wmiir namespace)/.proglist" action status & wi_proglist $PATH >$progsfile & # Setup Tag Bar -IFS="$wi_nl" +IFS="$wi_newline" wmiir rm $(wmiir ls /lbar | sed 's,^,/lbar/,') >/dev/null seltag=$(wmiir read /tag/sel/ctl | sed 1q) unset IFS