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:
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