wmii

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

commit f55337ef2b489b7b647f75a7b5cb35a67e29dff1
parent d951419167c01c28e7b520abf169c006930643c9
Author: Kris Maglione <jg@suckless.org>
Date:   Thu, 29 May 2008 17:22:56 -0400

Sorry, I lost track. See diff.

Diffstat:
TODO | 2+-
cmd/Makefile | 1+
cmd/wmii.sh.sh | 55++++++++++++++++++++++++++++++++++++++++---------------
cmd/wmii/column.c | 7++++++-
cmd/wmii/frame.c | 22+++++++++++++++++-----
cmd/wmii/view.c | 3+++
cmd/wmiistartrc.sh | 2+-
config.mk | 4++++
mk/hdr.mk | 8++++++++
rc/Makefile | 1+
rc/wmiirc.sh | 41+++++++++++++++++++++++++++++++++--------
11 files changed, 115 insertions(+), 31 deletions(-)

diff --git a/TODO b/TODO @@ -5,6 +5,6 @@ BUGS 4.0 * Opaque managed moves. I know I've argued against it, but it may be doable. -* Resizable managed area +* Resizable managed area. Maybe. Struts seem to do everything this might. * New dmenu, with real cursor; snarfable. diff --git a/cmd/Makefile b/cmd/Makefile @@ -18,6 +18,7 @@ FILTER = sed "s|CONFPREFIX|$(ETC)|g; \ s|CONFVERSION|$(CONFVERSION)|g; \ s|P9PATHS|$(P9PATHS)|g; \ s|LIBDIR|$(LIBDIR)|g; \ + s|BINSH|$(BINSH)|g; \ s|AWKPATH|$(AWKPATH)|g" LDFLAGS += -lfmt -lutf diff --git a/cmd/wmii.sh.sh b/cmd/wmii.sh.sh @@ -14,6 +14,10 @@ _wi_script() { narg = 1; body = ""; } + function quote(s) { + gsub(/"'"/, "'\\''", s) + return "'" s "'" + } function addevent() { var = arg[1] "s" for(i=2; i <= narg; i++) { @@ -24,11 +28,11 @@ _wi_script() { if(i == 2) { # There's a bug here. Can you spot it? gsub("[^a-zA-Z_0-9]", "_", arg[2]); - body = sprintf("%s_%s \"$@\"", arg[1], arg[2]) + body = sprintf("%s %s \"$@\"", arg[1], arg[2]) } } } - /^(Event|Key|Action)[ \t]/ { + /^(Event|Key|Action|Menu)[ \t]/ { addevent() split($0, arg) narg = NF @@ -43,13 +47,16 @@ _wi_script() { for(k in a) { split(k, b, SUBSEP) c[b[1]] = c[b[1]] b[2] "\n" - gsub("[^a-zA-Z_0-9]", "_", b[2]); if(body != "") - printf "%s_%s() { %s\n }\n", b[1], b[2], a[k] + d[b[1]] = d[b[1]] quote(b[2]) ")" a[k] ";;\n" } - for(k in c) { - gsub("'", "'\"'\"'", c[k]) - printf "%ss='%s'\n", k, c[k] + for(k in c) + printf "%ss=%s\n", k, quote(c[k]) + for(k in d) { + printf "%s() {\n", k + printf " %s=$1; shift\n", tolower(k) + printf "case $%s in\n%s\nesac\n", tolower(k), d[k] + printf "}\n" } } ! @@ -62,8 +69,7 @@ Event Start exit fi Event Key - fn=$(echo "$@" | sed 's/[^a-zA-Z_0-9]/_/g') - Key_$fn "$@" + Key "$@" ! eval "cat <<! $(sed "$_sed" | sed '/^[ ]/s/\([$`]\)/\\\1/g') @@ -76,6 +82,7 @@ wi_events() { _sed="s/^$2//" shift 2 fi + #cho "$(_wi_text | awk "$(_wi_script)")" | cat -n eval "$(_wi_text | awk "$(_wi_script)")" } @@ -105,6 +112,19 @@ wi_9menu() { wi_9menu "$@" } +wi_fnmenu() { + group="$1-$2"; shift 2 + _last="$(echo $group|tr - _)_last" + eval "last=\"\$$_last\"" + res=$(set -- $(echo "$Menus" | awk -v "s=$group" 'BEGIN{n=length(s)} + substr($1,1,n) == s{print substr($1,n+2)}') + [ $# != 0 ] && wi_9menu -initial "$last" "$@") + if [ -n "$res" ]; then + eval "$_last="'"$res"' + Menu $group-$res "$@" + fi +} + wi_proglist() { ls -lL $(echo $* | sed 'y/:/ /') 2>/dev/null \ | awk '$1 ~ /^[^d].*x/ { print $NF }' \ @@ -153,24 +173,29 @@ wi_tags() { wmiir ls /tag | sed 's,/,,; /^sel$/d' } +wi_seltag() { + wmiir read /tag/sel/ctl | sed 1q | tr -d '\012' +} + wi_eventloop() { echo "$Keys" | wmiir write /keys wmiir read /event | while read wi_event do - OIFS="$IFS"; IFS="$wi_nl" + IFS="$wi_nl" wi_arg=$(echo "$wi_event" | sed 's/^[^ ]* //') - IFS="$OIFS" + unset IFS set -- $wi_event event=$1; shift - Event_$event $@ - done 2>/dev/null + Event $event "$@" + done } -Action() { +action() { action=$1; shift if [ -n "$action" ]; then - Action_$action "$@" \ + set +x + Action $action "$@" \ || wi_runconf $action "$@" fi } diff --git a/cmd/wmii/column.c b/cmd/wmii/column.c @@ -369,8 +369,11 @@ comp_frame(const void *a, const void *b) { return ia < ib ? -1 : ia > ib ? 1 : /* Favor the selected client. */ + /* No... don't. Windows shouldn't jump when the mouse + * enters them. fa == fa->area->sel ? -1 : fb == fa->area->sel ? 1 : + */ 0; } @@ -488,7 +491,9 @@ column_arrange(Area *a, bool dirty) { } column_scale(a); resize: - area_setsel(a, a->sel); + /* XXX */ + if(a->sel->collapsed) + area_setsel(a, a->sel); if(v == screen->sel) { //view_restack(v); client_resize(a->sel->client, a->sel->r); diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -568,7 +568,7 @@ move_focus(Frame *old_f, Frame *f) { void frame_focus(Frame *f) { - Frame *old_f; + Frame *old_f, *ff; View *v; Area *a, *old_a; @@ -576,10 +576,20 @@ frame_focus(Frame *f) { a = f->area; old_a = v->sel; - for(; f->collapsed && f->anext; f=f->anext) - ; - for(; f->collapsed && f->aprev; f=f->aprev) - ; + if(0 && f->collapsed) { + for(ff=f; ff->collapsed && ff->anext; ff=ff->anext) + ; + for(; ff->collapsed && ff->aprev; ff=ff->aprev) + ; + /* XXX */ + f->colr.max.y = f->colr.min.y + Dy(ff->colr); + ff->colr.max.y = ff->colr.min.y + labelh(def.font); + }else { + for(; f->collapsed && f->anext; f=f->anext) + ; + for(; f->collapsed && f->aprev; f=f->aprev) + ; + } old_f = old_a->sel; a->sel = f; @@ -595,7 +605,9 @@ frame_focus(Frame *f) { move_focus(old_f, f); client_focus(f->client); + /* if(!a->floating && ((a->mode == Colstack) || (a->mode == Colmax))) + */ column_arrange(a, false); } diff --git a/cmd/wmii/view.c b/cmd/wmii/view.c @@ -220,6 +220,8 @@ view_update(View *v) { if(v != screen->sel) return; + if(starting) + return; frames_update_sel(v); view_arrange(v); @@ -313,6 +315,7 @@ view_attach(View *v, Frame *f) { if(c->sel == nil) c->sel = f; + view_update(v); } void diff --git a/cmd/wmiistartrc.sh b/cmd/wmiistartrc.sh @@ -1,4 +1,4 @@ -#!/bin/sh -f +#!BINSH -f # start wmiirc export home="$HOME" diff --git a/config.mk b/config.mk @@ -28,6 +28,10 @@ AR = ar crs AWKPATH = $$(which awk) P9PATHS = ${PLAN9}:"'$${HOME}/plan9'":/usr/local/plan9:/usr/local/9:/opt/plan9:/opt/9:/usr/plan9:/usr/9 +# Your make shell. By default, the first found of /bin/dash, /bin/ksh, +# /bin/sh. Except with bsdmake, which assumes /bin/sh is sane. bash and zsh +# are painfully slow, and should be avoided. +#BINSH = /bin/ash INCX11 = -I/usr/X11R6/include LIBX11 = -L/usr/X11R6/lib -lX11 diff --git a/mk/hdr.mk b/mk/hdr.mk @@ -14,6 +14,14 @@ MKCFGSH=if test -f $(ROOT)/config.local.mk; then echo $(ROOT)/config.local.mk; e MKCFG:=${shell $(MKCFGSH)} MKCFG!=${MKCFGSH} include $(MKCFG) +# and this: +# Try to find a sane shell. /bin/sh is a last resort, because it's +# usually bash on Linux, which means, it's painfully slow. +BINSH := $(shell \ + if [ -x /bin/dash ]; then echo /bin/dash; \ + elif [ -x /bin/ksh ]; then echo /bin/ksh; \ + else echo /bin/sh; fi) +BINSH != echo /bin/sh .SILENT: .SUFFIXES: .O .o .o_pic .c .sh .rc .$(SOEXT) .awk .1 .man1 .depend .install .uninstall .clean diff --git a/rc/Makefile b/rc/Makefile @@ -10,6 +10,7 @@ TARG = rc.wmii \ FILTER = sed "s|CONFPREFIX|${ETC}|g; \ s|CONFVERSION|${CONFVERSION}|g; \ s|P9PATHS|${P9PATHS}|g; \ + s|BINSH|$(BINSH)|g; \ s|AWKPATH|${AWKPATH}|g" include ${ROOT}/mk/many.mk diff --git a/rc/wmiirc.sh b/rc/wmiirc.sh @@ -1,4 +1,4 @@ -#!/bin/sh -f +#!BINSH -f # Configure wmii wmiiscript=wmiirc # For wmii.sh . wmii.sh @@ -22,8 +22,8 @@ WMII_BACKGROUND='#333333' WMII_FONT='-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*' set -- $(echo $WMII_NORMCOLORS $WMII_FOCUSCOLORS) -WMII_MENU="dmenu -b -fn '\$WMII_FONT' -nf '$1' -nb '$2' -sf '$4' -sb '$5'" -WMII_9MENU="wmii9menu -font '\$WMII_FONT' -nf '$1' -nb '$2' -sf '$4' -sb '$5' -br '$6'" +WMII_MENU='dmenu -b -fn "$WMII_FONT"'" -nf '$1' -nb '$2' -sf '$4' -sb '$5'" +WMII_9MENU='wmii9menu -font "$WMII_FONT"'" -nf '$1' -nb '$2' -sf '$4' -sb '$5' -br '$6'" WMII_TERM="xterm" # Column Rules @@ -47,7 +47,7 @@ wi_runconf -s wmiirc_local echo $WMII_NORMCOLORS | wmiir create $noticebar # Event processing -events="$( +events() { sed 's/^ //' <<'!' # Events Event CreateTag @@ -97,6 +97,31 @@ events="$( 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-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 quit wmiir xwrite /ctl quit @@ -138,7 +163,7 @@ events="$( Key $MODKEY-t wmiir xwrite /ctl view $(wi_tags | wi_menu) & Key $MODKEY-Return - eval $WMII_TERM & + eval wmiir setsid $WMII_TERM & Key $MODKEY-Shift-space wmiir xwrite /tag/sel/ctl send sel toggle Key $MODKEY-f @@ -172,9 +197,9 @@ events="$( wmiir xwrite /client/sel/tags "$i" ! done -)" +} wi_events <<! -$events +$(events) $local_events ! unset events local_events @@ -195,7 +220,7 @@ export WMII_FOCUSCOLORS WMII_SELCOLORS WMII_NORMCOLORS # Misc progsfile="$(wmiir namespace)/.proglist" -Action status & +action status & wi_proglist $PATH >$progsfile & # Setup Tag Bar