Blame


1 038e9089 2004-03-21 devnull /* Copyright (c) 1994-1996 David Hogan, see README for licence details */
2 038e9089 2004-03-21 devnull #include <stdio.h>
3 038e9089 2004-03-21 devnull #include <signal.h>
4 e62ba5ec 2004-03-21 devnull #include <unistd.h>
5 e62ba5ec 2004-03-21 devnull #include <stdlib.h>
6 e62ba5ec 2004-03-21 devnull #include <sys/wait.h>
7 038e9089 2004-03-21 devnull #include <X11/X.h>
8 038e9089 2004-03-21 devnull #include <X11/Xlib.h>
9 038e9089 2004-03-21 devnull #include <X11/Xutil.h>
10 038e9089 2004-03-21 devnull #include "dat.h"
11 038e9089 2004-03-21 devnull #include "fns.h"
12 038e9089 2004-03-21 devnull
13 038e9089 2004-03-21 devnull Client *hiddenc[MAXHIDDEN];
14 038e9089 2004-03-21 devnull
15 038e9089 2004-03-21 devnull int numhidden;
16 038e9089 2004-03-21 devnull
17 038e9089 2004-03-21 devnull char *b3items[B3FIXED+MAXHIDDEN+1] =
18 038e9089 2004-03-21 devnull {
19 038e9089 2004-03-21 devnull "New",
20 038e9089 2004-03-21 devnull "Reshape",
21 038e9089 2004-03-21 devnull "Move",
22 038e9089 2004-03-21 devnull "Delete",
23 038e9089 2004-03-21 devnull "Hide",
24 038e9089 2004-03-21 devnull 0,
25 038e9089 2004-03-21 devnull };
26 038e9089 2004-03-21 devnull
27 038e9089 2004-03-21 devnull Menu b3menu =
28 038e9089 2004-03-21 devnull {
29 038e9089 2004-03-21 devnull b3items,
30 038e9089 2004-03-21 devnull };
31 038e9089 2004-03-21 devnull
32 038e9089 2004-03-21 devnull Menu egg =
33 038e9089 2004-03-21 devnull {
34 038e9089 2004-03-21 devnull version,
35 038e9089 2004-03-21 devnull };
36 038e9089 2004-03-21 devnull
37 038e9089 2004-03-21 devnull void
38 038e9089 2004-03-21 devnull button(XButtonEvent *e)
39 038e9089 2004-03-21 devnull {
40 038e9089 2004-03-21 devnull int n, shift;
41 038e9089 2004-03-21 devnull Client *c;
42 038e9089 2004-03-21 devnull Window dw;
43 038e9089 2004-03-21 devnull ScreenInfo *s;
44 038e9089 2004-03-21 devnull
45 038e9089 2004-03-21 devnull curtime = e->time;
46 038e9089 2004-03-21 devnull s = getscreen(e->root);
47 038e9089 2004-03-21 devnull if (s == 0)
48 038e9089 2004-03-21 devnull return;
49 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
50 892de798 2004-04-19 devnull if(c){
51 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "but: e x=%d y=%d c x=%d y=%d dx=%d dy=%d BORDR %d\n",
52 1cb3fa80 2004-03-29 devnull e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER);
53 892de798 2004-04-19 devnull if(borderorient(c, e->x, e->y) != BorderUnknown){
54 1cb3fa80 2004-03-29 devnull switch (e->button) {
55 1cb3fa80 2004-03-29 devnull case Button1:
56 1cb3fa80 2004-03-29 devnull case Button2:
57 1cb3fa80 2004-03-29 devnull reshape(c, e->button, pull, e);
58 1cb3fa80 2004-03-29 devnull return;
59 1cb3fa80 2004-03-29 devnull case Button3:
60 1cb3fa80 2004-03-29 devnull move(c, Button3);
61 1cb3fa80 2004-03-29 devnull return;
62 1cb3fa80 2004-03-29 devnull default:
63 1cb3fa80 2004-03-29 devnull return;
64 1cb3fa80 2004-03-29 devnull }
65 892de798 2004-04-19 devnull }
66 038e9089 2004-03-21 devnull e->x += c->x - BORDER;
67 038e9089 2004-03-21 devnull e->y += c->y - BORDER;
68 892de798 2004-04-19 devnull } else if (e->window != e->root) {
69 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "but no client: e x=%d y=%d\n",
70 1cb3fa80 2004-03-29 devnull e->x, e->y);
71 038e9089 2004-03-21 devnull XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
72 038e9089 2004-03-21 devnull &e->x, &e->y, &dw);
73 1cb3fa80 2004-03-29 devnull }
74 038e9089 2004-03-21 devnull switch (e->button) {
75 038e9089 2004-03-21 devnull case Button1:
76 038e9089 2004-03-21 devnull if (c) {
77 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
78 038e9089 2004-03-21 devnull top(c);
79 038e9089 2004-03-21 devnull active(c);
80 038e9089 2004-03-21 devnull }
81 038e9089 2004-03-21 devnull return;
82 038e9089 2004-03-21 devnull case Button2:
83 038e9089 2004-03-21 devnull if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask))
84 038e9089 2004-03-21 devnull menuhit(e, &egg);
85 038e9089 2004-03-21 devnull return;
86 038e9089 2004-03-21 devnull default:
87 038e9089 2004-03-21 devnull return;
88 038e9089 2004-03-21 devnull case Button3:
89 038e9089 2004-03-21 devnull break;
90 038e9089 2004-03-21 devnull }
91 038e9089 2004-03-21 devnull
92 038e9089 2004-03-21 devnull if (current && current->screen == s)
93 038e9089 2004-03-21 devnull cmapnofocus(s);
94 038e9089 2004-03-21 devnull switch (n = menuhit(e, &b3menu)) {
95 038e9089 2004-03-21 devnull case 0: /* New */
96 038e9089 2004-03-21 devnull spawn(s);
97 038e9089 2004-03-21 devnull break;
98 038e9089 2004-03-21 devnull case 1: /* Reshape */
99 1cb3fa80 2004-03-29 devnull reshape(selectwin(1, 0, s), Button3, sweep, 0);
100 038e9089 2004-03-21 devnull break;
101 038e9089 2004-03-21 devnull case 2: /* Move */
102 1cb3fa80 2004-03-29 devnull move(selectwin(0, 0, s), Button3);
103 038e9089 2004-03-21 devnull break;
104 038e9089 2004-03-21 devnull case 3: /* Delete */
105 038e9089 2004-03-21 devnull shift = 0;
106 038e9089 2004-03-21 devnull c = selectwin(1, &shift, s);
107 038e9089 2004-03-21 devnull delete(c, shift);
108 038e9089 2004-03-21 devnull break;
109 038e9089 2004-03-21 devnull case 4: /* Hide */
110 038e9089 2004-03-21 devnull hide(selectwin(1, 0, s));
111 038e9089 2004-03-21 devnull break;
112 038e9089 2004-03-21 devnull default: /* unhide window */
113 038e9089 2004-03-21 devnull unhide(n - B3FIXED, 1);
114 038e9089 2004-03-21 devnull break;
115 038e9089 2004-03-21 devnull case -1: /* nothing */
116 038e9089 2004-03-21 devnull break;
117 038e9089 2004-03-21 devnull }
118 038e9089 2004-03-21 devnull if (current && current->screen == s)
119 038e9089 2004-03-21 devnull cmapfocus(current);
120 038e9089 2004-03-21 devnull }
121 038e9089 2004-03-21 devnull
122 038e9089 2004-03-21 devnull void
123 038e9089 2004-03-21 devnull spawn(ScreenInfo *s)
124 038e9089 2004-03-21 devnull {
125 e62ba5ec 2004-03-21 devnull /*
126 e62ba5ec 2004-03-21 devnull * ugly dance to cause sweeping for terminals.
127 e62ba5ec 2004-03-21 devnull * the very next window created will require sweeping.
128 e62ba5ec 2004-03-21 devnull * hope it's created by the program we're about to
129 e62ba5ec 2004-03-21 devnull * exec!
130 e62ba5ec 2004-03-21 devnull */
131 e62ba5ec 2004-03-21 devnull isNew = 1;
132 038e9089 2004-03-21 devnull /*
133 038e9089 2004-03-21 devnull * ugly dance to avoid leaving zombies. Could use SIGCHLD,
134 038e9089 2004-03-21 devnull * but it's not very portable.
135 038e9089 2004-03-21 devnull */
136 038e9089 2004-03-21 devnull if (fork() == 0) {
137 038e9089 2004-03-21 devnull if (fork() == 0) {
138 038e9089 2004-03-21 devnull close(ConnectionNumber(dpy));
139 038e9089 2004-03-21 devnull if (s->display[0] != '\0')
140 038e9089 2004-03-21 devnull putenv(s->display);
141 038e9089 2004-03-21 devnull if (termprog != NULL) {
142 038e9089 2004-03-21 devnull execl(shell, shell, "-c", termprog, 0);
143 aa808685 2004-04-19 devnull fprintf(stderr, "rio: exec %s", shell);
144 038e9089 2004-03-21 devnull perror(" failed");
145 038e9089 2004-03-21 devnull }
146 038e9089 2004-03-21 devnull execlp("9term", "9term", "-w", 0);
147 038e9089 2004-03-21 devnull execlp("xterm", "xterm", "-ut", 0);
148 aa808685 2004-04-19 devnull perror("rio: exec 9term/xterm failed");
149 038e9089 2004-03-21 devnull exit(1);
150 038e9089 2004-03-21 devnull }
151 038e9089 2004-03-21 devnull exit(0);
152 038e9089 2004-03-21 devnull }
153 038e9089 2004-03-21 devnull wait((int *) 0);
154 038e9089 2004-03-21 devnull }
155 038e9089 2004-03-21 devnull
156 038e9089 2004-03-21 devnull void
157 1cb3fa80 2004-03-29 devnull reshape(Client *c, int but, int (*fn)(Client*, int, XButtonEvent *), XButtonEvent *e)
158 038e9089 2004-03-21 devnull {
159 038e9089 2004-03-21 devnull int odx, ody;
160 038e9089 2004-03-21 devnull
161 038e9089 2004-03-21 devnull if (c == 0)
162 038e9089 2004-03-21 devnull return;
163 038e9089 2004-03-21 devnull odx = c->dx;
164 038e9089 2004-03-21 devnull ody = c->dy;
165 1cb3fa80 2004-03-29 devnull if (fn(c, but, e) == 0)
166 038e9089 2004-03-21 devnull return;
167 038e9089 2004-03-21 devnull active(c);
168 038e9089 2004-03-21 devnull top(c);
169 038e9089 2004-03-21 devnull XRaiseWindow(dpy, c->parent);
170 038e9089 2004-03-21 devnull XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
171 038e9089 2004-03-21 devnull c->dx+2*BORDER, c->dy+2*BORDER);
172 038e9089 2004-03-21 devnull if (c->dx == odx && c->dy == ody)
173 038e9089 2004-03-21 devnull sendconfig(c);
174 038e9089 2004-03-21 devnull else
175 038e9089 2004-03-21 devnull XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
176 038e9089 2004-03-21 devnull }
177 038e9089 2004-03-21 devnull
178 038e9089 2004-03-21 devnull void
179 1cb3fa80 2004-03-29 devnull move(Client *c, int but)
180 038e9089 2004-03-21 devnull {
181 038e9089 2004-03-21 devnull if (c == 0)
182 038e9089 2004-03-21 devnull return;
183 1cb3fa80 2004-03-29 devnull if (drag(c, but) == 0)
184 038e9089 2004-03-21 devnull return;
185 038e9089 2004-03-21 devnull active(c);
186 038e9089 2004-03-21 devnull top(c);
187 038e9089 2004-03-21 devnull XRaiseWindow(dpy, c->parent);
188 038e9089 2004-03-21 devnull XMoveWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER);
189 038e9089 2004-03-21 devnull sendconfig(c);
190 038e9089 2004-03-21 devnull }
191 038e9089 2004-03-21 devnull
192 038e9089 2004-03-21 devnull void
193 038e9089 2004-03-21 devnull delete(Client *c, int shift)
194 038e9089 2004-03-21 devnull {
195 038e9089 2004-03-21 devnull if (c == 0)
196 038e9089 2004-03-21 devnull return;
197 038e9089 2004-03-21 devnull if ((c->proto & Pdelete) && !shift)
198 038e9089 2004-03-21 devnull sendcmessage(c->window, wm_protocols, wm_delete, 0);
199 038e9089 2004-03-21 devnull else
200 038e9089 2004-03-21 devnull XKillClient(dpy, c->window); /* let event clean up */
201 038e9089 2004-03-21 devnull }
202 038e9089 2004-03-21 devnull
203 038e9089 2004-03-21 devnull void
204 038e9089 2004-03-21 devnull hide(Client *c)
205 038e9089 2004-03-21 devnull {
206 038e9089 2004-03-21 devnull if (c == 0 || numhidden == MAXHIDDEN)
207 038e9089 2004-03-21 devnull return;
208 038e9089 2004-03-21 devnull if (hidden(c)) {
209 aa808685 2004-04-19 devnull fprintf(stderr, "rio: already hidden: %s\n", c->label);
210 038e9089 2004-03-21 devnull return;
211 038e9089 2004-03-21 devnull }
212 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->parent);
213 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->window);
214 038e9089 2004-03-21 devnull setstate(c, IconicState);
215 038e9089 2004-03-21 devnull if (c == current)
216 038e9089 2004-03-21 devnull nofocus();
217 038e9089 2004-03-21 devnull hiddenc[numhidden] = c;
218 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = c->label;
219 038e9089 2004-03-21 devnull numhidden++;
220 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = 0;
221 038e9089 2004-03-21 devnull }
222 038e9089 2004-03-21 devnull
223 038e9089 2004-03-21 devnull void
224 038e9089 2004-03-21 devnull unhide(int n, int map)
225 038e9089 2004-03-21 devnull {
226 038e9089 2004-03-21 devnull Client *c;
227 038e9089 2004-03-21 devnull int i;
228 038e9089 2004-03-21 devnull
229 038e9089 2004-03-21 devnull if (n >= numhidden) {
230 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhide: n %d numhidden %d\n", n, numhidden);
231 038e9089 2004-03-21 devnull return;
232 038e9089 2004-03-21 devnull }
233 038e9089 2004-03-21 devnull c = hiddenc[n];
234 038e9089 2004-03-21 devnull if (!hidden(c)) {
235 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhide: not hidden: %s(0x%x)\n",
236 e62ba5ec 2004-03-21 devnull c->label, (int)c->window);
237 038e9089 2004-03-21 devnull return;
238 038e9089 2004-03-21 devnull }
239 038e9089 2004-03-21 devnull
240 038e9089 2004-03-21 devnull if (map) {
241 038e9089 2004-03-21 devnull XMapWindow(dpy, c->window);
242 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
243 038e9089 2004-03-21 devnull setstate(c, NormalState);
244 038e9089 2004-03-21 devnull active(c);
245 038e9089 2004-03-21 devnull top(c);
246 038e9089 2004-03-21 devnull }
247 038e9089 2004-03-21 devnull
248 038e9089 2004-03-21 devnull numhidden--;
249 038e9089 2004-03-21 devnull for (i = n; i < numhidden; i ++) {
250 038e9089 2004-03-21 devnull hiddenc[i] = hiddenc[i+1];
251 038e9089 2004-03-21 devnull b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
252 038e9089 2004-03-21 devnull }
253 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = 0;
254 038e9089 2004-03-21 devnull }
255 038e9089 2004-03-21 devnull
256 038e9089 2004-03-21 devnull void
257 038e9089 2004-03-21 devnull unhidec(Client *c, int map)
258 038e9089 2004-03-21 devnull {
259 038e9089 2004-03-21 devnull int i;
260 038e9089 2004-03-21 devnull
261 038e9089 2004-03-21 devnull for (i = 0; i < numhidden; i++)
262 038e9089 2004-03-21 devnull if (c == hiddenc[i]) {
263 038e9089 2004-03-21 devnull unhide(i, map);
264 038e9089 2004-03-21 devnull return;
265 038e9089 2004-03-21 devnull }
266 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhidec: not hidden: %s(0x%x)\n",
267 e62ba5ec 2004-03-21 devnull c->label, (int)c->window);
268 038e9089 2004-03-21 devnull }
269 038e9089 2004-03-21 devnull
270 038e9089 2004-03-21 devnull void
271 038e9089 2004-03-21 devnull renamec(Client *c, char *name)
272 038e9089 2004-03-21 devnull {
273 038e9089 2004-03-21 devnull int i;
274 038e9089 2004-03-21 devnull
275 038e9089 2004-03-21 devnull if (name == 0)
276 038e9089 2004-03-21 devnull name = "???";
277 038e9089 2004-03-21 devnull c->label = name;
278 038e9089 2004-03-21 devnull if (!hidden(c))
279 038e9089 2004-03-21 devnull return;
280 038e9089 2004-03-21 devnull for (i = 0; i < numhidden; i++)
281 038e9089 2004-03-21 devnull if (c == hiddenc[i]) {
282 038e9089 2004-03-21 devnull b3items[B3FIXED+i] = name;
283 038e9089 2004-03-21 devnull return;
284 038e9089 2004-03-21 devnull }
285 038e9089 2004-03-21 devnull }