20
20
21
21
# ## STUMPwm Interactive SHell.
22
22
23
+ # use a busy-waiting delay of 1 second if floats are not supported by sleep
23
24
DELAY=0.01
24
25
25
26
if ! sleep $DELAY 2> /dev/null >&2
@@ -37,11 +38,34 @@ if [ "$(echo -e foo)" = foo ]; then
37
38
echo () { builtin echo -e " $@ " ; }
38
39
fi
39
40
41
+ stumpwm_pid ()
42
+ {
43
+ local pid=$$
44
+
45
+ while :
46
+ do
47
+ if [ $pid -eq 1 ]
48
+ then
49
+ echo " StumpWM not found in the process tree, are you sure a graphical " 1>&2
50
+ echo " session is running and StumpWM is your WM? If you think this is " 1>&2
51
+ echo " a bug in stumpish, please report it." 1>&2
52
+ echo 1>&2
53
+ exit 1
54
+ elif [ " $( cat /proc/${pid} /comm) " = " stumpwm" ]
55
+ then
56
+ STUMPWM_PID=$pid
57
+ break
58
+ else
59
+ pid=$( cut -f 4 -d " " < /proc/$pid /stat)
60
+ fi
61
+ done
62
+ }
63
+
40
64
wait_result ()
41
65
{
42
66
while true
43
67
do
44
- RESULT=$( xprop -root -f STUMPWM_COMMAND_RESULT 8s \
68
+ RESULT=$( xprop -root -f STUMPWM_COMMAND_RESULT 8u \
45
69
STUMPWM_COMMAND_RESULT 2> /dev/null |
46
70
sed -E ' s/\\([[:digit:]]+)/\\0\1/g' )
47
71
if echo " $RESULT " | grep -v -q ' not found.$'
@@ -70,6 +94,9 @@ wait_result ()
70
94
71
95
send_cmd ()
72
96
{
97
+ (
98
+ flock -n 3 || fail " Cannot obtain a file lock to exclusively talk to StumpWM."
99
+
73
100
local cmd=" $1 "
74
101
75
102
if [ " $cmd " = " stumpwm-quit" ]
@@ -80,9 +107,10 @@ send_cmd ()
80
107
exit
81
108
fi
82
109
83
- xprop -root -f STUMPWM_COMMAND 8s -set STUMPWM_COMMAND " $cmd "
110
+ xprop -root -f STUMPWM_COMMAND 8u -set STUMPWM_COMMAND " $cmd "
84
111
85
112
wait_result
113
+ ) 3> " ${TMPDIR:-/ tmp} /.stumpish.lock.$STUMPWM_PID "
86
114
}
87
115
88
116
usage ()
138
166
if [ $# -gt 0 ]
139
167
then
140
168
[ " $1 " = " --help" ] && usage
169
+
170
+ stumpwm_pid
171
+
141
172
if [ " $1 " = " -e" ]
142
173
then
143
174
if [ $# -ne 2 ]
154
185
send_cmd " $* "
155
186
fi
156
187
else
188
+ stumpwm_pid
189
+
157
190
if [ -t 0 ]
158
191
then
159
192
if ! type rlwrap 2> /dev/null >&2
180
213
tput me sgr0
181
214
echo \ for a list of commands.
182
215
183
- while ( echo -n ' > ' ; read -r REPLY)
216
+ while { echo -n ' > ' ; read -r REPLY; }
184
217
do
185
218
tput md bold
186
219
tput AF setaf 2
0 commit comments