blob: f211d7f15f794f7cb5216a4630593a9ff8685747 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
|
#!/bin/bash
# Let any running instances of wmiirc know that we're starting
echo ' ==> Starting wmiirc'
wmiir xwrite /event Start
export WMII_NAMESPACE=`wmiir namespace`
mount9p=/opt/plan9/bin/9pfuse
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
# Colors tuples: "<text> <background> <border>"
. $HOME/.wmii/theme-solarized-dark
# Menu history
hist="${WMII_CONFPATH%%:*}/history"
# Tagging Rules
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
}
path_which() {
mypath=$1
prog=$2
which=`which which`
PATH="$mypath" "$which" -- "$prog" 2>/dev/null
}
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
}
Action() {
prog=`path_which "$WMII_CONFPATH" $1`; shift
if [ -n "$prog" ]; then
"$prog" "$@"
return $?
else
return 1
fi
}
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
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
# 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" &
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
Event FocusTag "$tag"
fi
done
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
|