summaryrefslogtreecommitdiff
path: root/.wmii/wmiirc
blob: 8d773948683519b6a686956ba1bf18dd429d1019 (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
#!/bin/bash
# Let any running instances of wmiirc know that we're starting
wmiir xwrite /event Start

. "$HOME/.wmii/include.sh"

echo ' ==> Starting wmiirc'
mkdir -p "$WMII_DIR"
9mount -i "unix!$WMII_NAMESPACE/wmii" "$WMII_DIR"

MODKEY=Mod4 # super
UP=p
DOWN=n
LEFT=b
RIGHT=f

# Colors tuples: "<text> <background> <border>"
. `conffile theme-solarized-dark`

# Menu history
hist="`conffile history`"

# Tagging Rules
echo '/Emacs|Navigator/ -> +sel' >> $WMII_DIR/tagrules
echo '/Eclipse/ -> +sel' >> $WMII_DIR/tagrules
echo '/panel/ -> /.*/' >> $WMII_DIR/tagrules

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
			echo ' ==> Stopping wmiirc'
			echo "  -> unmounting WMII_DIR=$WMII_DIR..."
			# might complain about /etc/mtab if the x server has already stopped
			9umount "$WMII_DIR"
			echo "  -> rmdir'ing WMII_DIR=$WMII_DIR..."
			rmdir "$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 x-terminal-emulator & ;;

		## 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        xft:Monospace-8   |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 &

if [ -f "`conffile wmiirc_local`" ]; then
	. "`conffile wmiirc_local`"
fi

trap "Event Quit" EXIT

# use wmiir so it doesn't look like an open file
wmiir read /event 2>/dev/null | while read event; do
	Event $event
done