1#!sh
2# WMII Configuration
3load std string regex expr echo
4
5argv0 = $0
6
7#mount -Aa {os dial unix!/tmp/ns.kris.:1/wmii >[1=0]} / || raise mount
8#mount -Aa {styxmon {os rc -c 'dial $WMII_ADDRESS' >[1=0]}} / || raise mount
9mount -Aa {os rc -c 'dial $WMII_ADDRESS' >[1=0]} / || raise mount
10
11{`{read} && echo halt>/dev/sysctl}&
12
13MODKEY=Mod1
14UP=k
15DOWN=j
16LEFT=h
17RIGHT=l
18
19WMII_FONT=fixed
20WMII_NORMCOLORS=('#222222' '#5FBF77' '#2A7F3F')
21WMII_FOCUSCOLORS=('#ffffff' '#153F1F' '#2A7F3F')
22WMII_BACKGROUND='#333333'
23
24WMII_TERM=urxvt
25
26fn wmiimenu {
27	(nf nb nil sf sb nil) := ($WMII_NORMCOLORS $WMII_FOCUSCOLORS)
28	os -d ${hostenv HOME} (
29		dmenu -b -fn $WMII_FONT
30		-nf $nf -nb $nb -sf $sf -sb $sb)
31}
32
33fn 9menu {
34	os -d ${hostenv HOME} (
35		wmii9menu -font ${hd ${split , $WMII_FONT}}
36		-^(nf nb br)^$WMII_NORMCOLORS
37		-^(sf sb br)^$WMII_FOCUSCOLORS $*)
38}
39
40# Column Rules
41echo '/./ -> 60+40' >/colrules
42
43# Tagging Rules
44echo '
45/Firefox/ -> www
46/XMMS.*/ -> ~
47/MPlayer.*/ -> ~
48/.*/ -> !
49/.*/ -> 1
50' >/tagrules
51
52subfn seq {
53	result=${expr $* seq}
54}
55
56subfn hostenv {
57	arg := $"*
58	result="{os rc -c 'echo -n $'^$arg </dev/null}
59}
60
61subfn ftl {
62	result=${tl $*}
63	result=$"result
64}
65
66subfn lines {
67	ifs := "{echo}
68	arg := $*
69	result = `{$arg}
70}
71
72fn 'fn?' {
73	args := $*
74	~ ("{rescue '*' {} {whatis $args >[2]/dev/null}}
75	   'load std; fn '*)
76}
77
78fn ifx {
79	(pred fn val args) := $*
80	if {$pred $val} {$fn $val $args}
81}
82
83fn dofn {
84	ifx 'fn?' {$*} $*
85}
86
87fn run_command {
88	os -b -d ${hostenv HOME} $* &
89}
90
91fn dprint {
92	arg := $*
93	or {~ $#debug 0} {~ $debug '' 0} { echo $arg }
94}
95
96subfn config_whatis {
97	result=${lines {os rc -c 'PATH=$WMII_CONFPATH which $*' $* </dev/null} $*}
98}
99
100# Status Bar Info
101fn status {
102	echo ${re mg '[0-9]+\.[0-9]+' "{os uptime}} '|' `{date}
103}
104
105for(i in Key Event Action) {
106	'{fn $i { fn '$i'-$1 ${tl $*} }}'
107}
108
109# Events
110Event Start {
111	if {~ $1 wmiirc} {
112		rm -f $progs_file
113		exit
114	}
115}
116
117Event Key {
118	dprint Key-$1
119	Key-$1 $1
120}
121
122Event CreateTag { echo $WMII_NORMCOLORS $* > /lbar/$"* }
123Event DestroyTag { rm /lbar/$"* }
124Event FocusTag { echo $WMII_FOCUSCOLORS $* > /lbar/$"* }
125Event UnfocusTag { echo $WMII_NORMCOLORS $* > /lbar/$"* }
126Event UrgentTag { echo '*'${ftl $*} > /lbar/${ftl $*} }
127Event NotUrgentTag { echo ${tl $*} > /lbar/${ftl $*} }
128
129Event LeftBarClick {
130	(button name) := $*
131	if {~ $button 1} { echo view $name >/ctl }
132}
133Event LeftBarMouseDown {
134	(button name) := $*
135	if {~ $button 3} { echo view "{9menu ${lines read_tags}} >/ctl & }
136}
137lastcmd=''
138Event ClientMouseDown {
139	(client button) := $*
140	if {~ $button 3} {
141		lastcmd = `{9menu -initial $lastcmd Nop Delete Fullscreen}
142		cmp := {~ $lastcmd $*}
143		if {$cmp Nop} {
144		} {$cmp Delete} { echo kill >/client/$client/ctl
145		} {$cmp Fullscreen} { echo Fullscreen toggle >/client/$client/ctl
146		}
147	}
148}
149
150# Actions
151Action quit { echo quit >>/ctl }
152Action rehash {
153	flag x -
154	proglist ${hostenv PATH} >$progs_file
155}
156Action status {
157	flag x -
158	if {rm /rbar/status >[2]/dev/null} { sleep 1 }
159	echo $WMII_NORMCOLORS >/rbar/status
160	while {status >/rbar/status} { sleep 1 }
161}
162
163ifx {ftest -x $*} {run $*} $home/.wmii-3.5/sh.wmii.local
164fn Key { ifx {! 'fn?' $*} {fn $*} Key-$1 ${tl $*} }
165
166fn Action {
167	(action args) := $*
168	or {dofn Action-$action $args} {
169		ifx {! ~ $#* 0} {run_command $*} ${config_whatis $action} $args
170	}
171}
172
173# Key Bindings
174Key $MODKEY-Control-t {
175	if { ~ `{wc -l /keys} 0 1} {
176		initkeys
177		grabmod $MODKEY >/ctl
178	} {
179		echo $MODKEY-Control-t >/keys
180		echo grabmod Mod3 >/ctl
181	}
182}
183
184Key $MODKEY-$LEFT { echo select left >/tag/sel/ctl }
185Key $MODKEY-$RIGHT { echo select right >/tag/sel/ctl }
186Key $MODKEY-$UP { echo select up >/tag/sel/ctl }
187Key $MODKEY-$DOWN { echo select down >/tag/sel/ctl }
188
189Key $MODKEY-Shift-$LEFT { echo send sel left >/tag/sel/ctl }
190Key $MODKEY-Shift-$RIGHT { echo send sel right >/tag/sel/ctl }
191Key $MODKEY-Shift-$DOWN { echo send sel down >/tag/sel/ctl }
192Key $MODKEY-Shift-$UP { echo send sel up >/tag/sel/ctl }
193
194Key $MODKEY-space { echo select toggle >/tag/sel/ctl }
195Key $MODKEY-Shift-space { echo send sel toggle >/tag/sel/ctl }
196
197Key $MODKEY-d { echo colmode sel default >/tag/sel/ctl }
198Key $MODKEY-s { echo colmode sel stack >/tag/sel/ctl }
199Key $MODKEY-m { echo colmode sel max >/tag/sel/ctl }
200
201Key $MODKEY-f { echo Fullscreen toggle >/client/sel/ctl }
202
203Key $MODKEY-Shift-c { echo kill >/client/sel/ctl }
204
205Key $MODKEY-a { Action `{actionlist | wmiimenu} & }
206Key $MODKEY-p { run_command rc -c "{wmiimenu <$progs_file} & }
207Key $MODKEY-Return { run_command $WMII_TERM & }
208Key $MODKEY-t { echo view `{read_tags | wmiimenu} >/ctl & }
209Key $MODKEY-Shift-t {
210	sel := "{cat /client/sel/ctl}
211	read_tags | wmiimenu >/client/$sel/tags
212}
213
214Key $MODKEY-^${seq 0 9} { echo view ${tl ${splitr $1 -}} >/ctl }
215Key Shift-$MODKEY-${seq 0 9} { echo ${tl ${splitr $1 -}} >/client/sel/tags}
216
217# Functions
218fn proglist {
219	os find ${split : $"*} -maxdepth 1 -type f </dev/null | sed 's,.*/,,' | sort | uniq
220	#for(d in /n/local^${split : $"*}) {
221	#	fs filter {mode -d} $d
222	#} | sed 's,.*/,,' | sort | uniq
223}
224
225fn getfuns {
226	ls -p /env | sed -n 's/^fn-' ^ $1 ^ '-//p'
227}
228
229fn actionlist {
230	{	rescue '*' {} {
231			proglist ${hostenv WMII_CONFPATH}
232		}
233	 	getfuns Action
234	} | sort | uniq
235}
236
237fn initkeys {
238	getfuns Key >/keys
239}
240
241fn read_tags {
242	ls -p /tag | grep -v '^sel$'
243}
244
245# WM Configuration
246{
247	echo grabmod $MODKEY
248	echo border 2
249	echo font $WMII_FONT
250	echo focuscolors $WMII_FOCUSCOLORS
251	echo normcolors $WMII_NORMCOLORS
252} >/ctl
253
254# Misc Setup
255os xsetroot -solid $WMII_BACKGROUND </dev/null
256
257dofn Local-Overrides
258
259Action status &
260progs_file=/tmp/proglist.${pid}
261Action rehash &
262
263# Tag Bar Setup
264seltag=${lines sed 1q /tag/sel/ctl}
265comm -13 ${pipe from {read_tags}} ${pipe from {ls -p /lbar/*}} |
266	getlines { rm /lbar/$line }
267read_tags | getlines {
268	if {~ $line $seltag} {
269		echo $WMII_FOCUSCOLORS $line
270	} {
271		echo $WMII_NORMCOLORS $line
272	} >/lbar/$line
273}
274
275# Keygrab Setup
276initkeys
277
278echo Start wmiirc >/event
279
280# Event Loop
281getlines {
282	(event args) := ${split ' 	' $line}
283	dprint Event-$event: $args
284	rescue '*' { dprint Exception: $exception } {
285		dofn Event-$event $args
286	} </dev/null
287	dprint loop
288} </event
289
290