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 3ddda821 2004-12-28 devnull
17 3ddda821 2004-12-28 devnull int virt;
18 3ddda821 2004-12-28 devnull
19 3ddda821 2004-12-28 devnull Client * currents[NUMVIRTUALS] =
20 3ddda821 2004-12-28 devnull {
21 3ddda821 2004-12-28 devnull NULL, NULL, NULL, NULL,
22 3ddda821 2004-12-28 devnull };
23 3ddda821 2004-12-28 devnull
24 3ddda821 2004-12-28 devnull char *b2items[NUMVIRTUALS+1] =
25 3ddda821 2004-12-28 devnull {
26 3ddda821 2004-12-28 devnull "One",
27 3ddda821 2004-12-28 devnull "Two",
28 3ddda821 2004-12-28 devnull "Three",
29 3ddda821 2004-12-28 devnull "Four",
30 3ddda821 2004-12-28 devnull "Five",
31 3ddda821 2004-12-28 devnull "Six",
32 3ddda821 2004-12-28 devnull "Seven",
33 3ddda821 2004-12-28 devnull "Eight",
34 3ddda821 2004-12-28 devnull "Nine",
35 3ddda821 2004-12-28 devnull "Ten",
36 3ddda821 2004-12-28 devnull "Eleven",
37 3ddda821 2004-12-28 devnull "Twelve",
38 3ddda821 2004-12-28 devnull 0,
39 3ddda821 2004-12-28 devnull };
40 3ddda821 2004-12-28 devnull
41 3ddda821 2004-12-28 devnull Menu b2menu =
42 3ddda821 2004-12-28 devnull {
43 3ddda821 2004-12-28 devnull b2items,
44 3ddda821 2004-12-28 devnull };
45 038e9089 2004-03-21 devnull
46 038e9089 2004-03-21 devnull char *b3items[B3FIXED+MAXHIDDEN+1] =
47 038e9089 2004-03-21 devnull {
48 038e9089 2004-03-21 devnull "New",
49 038e9089 2004-03-21 devnull "Reshape",
50 038e9089 2004-03-21 devnull "Move",
51 038e9089 2004-03-21 devnull "Delete",
52 038e9089 2004-03-21 devnull "Hide",
53 038e9089 2004-03-21 devnull 0,
54 038e9089 2004-03-21 devnull };
55 038e9089 2004-03-21 devnull
56 038e9089 2004-03-21 devnull Menu b3menu =
57 038e9089 2004-03-21 devnull {
58 038e9089 2004-03-21 devnull b3items,
59 038e9089 2004-03-21 devnull };
60 038e9089 2004-03-21 devnull
61 038e9089 2004-03-21 devnull Menu egg =
62 038e9089 2004-03-21 devnull {
63 038e9089 2004-03-21 devnull version,
64 038e9089 2004-03-21 devnull };
65 038e9089 2004-03-21 devnull
66 038e9089 2004-03-21 devnull void
67 038e9089 2004-03-21 devnull button(XButtonEvent *e)
68 038e9089 2004-03-21 devnull {
69 038e9089 2004-03-21 devnull int n, shift;
70 038e9089 2004-03-21 devnull Client *c;
71 038e9089 2004-03-21 devnull Window dw;
72 038e9089 2004-03-21 devnull ScreenInfo *s;
73 038e9089 2004-03-21 devnull
74 038e9089 2004-03-21 devnull curtime = e->time;
75 038e9089 2004-03-21 devnull s = getscreen(e->root);
76 038e9089 2004-03-21 devnull if (s == 0)
77 038e9089 2004-03-21 devnull return;
78 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
79 892de798 2004-04-19 devnull if(c){
80 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",
81 1cb3fa80 2004-03-29 devnull e->x, e->y, c->x, c->y, c->dx, c->dy, BORDER);
82 892de798 2004-04-19 devnull if(borderorient(c, e->x, e->y) != BorderUnknown){
83 1cb3fa80 2004-03-29 devnull switch (e->button) {
84 1cb3fa80 2004-03-29 devnull case Button1:
85 1cb3fa80 2004-03-29 devnull case Button2:
86 1cb3fa80 2004-03-29 devnull reshape(c, e->button, pull, e);
87 1cb3fa80 2004-03-29 devnull return;
88 1cb3fa80 2004-03-29 devnull case Button3:
89 1cb3fa80 2004-03-29 devnull move(c, Button3);
90 1cb3fa80 2004-03-29 devnull return;
91 1cb3fa80 2004-03-29 devnull default:
92 1cb3fa80 2004-03-29 devnull return;
93 1cb3fa80 2004-03-29 devnull }
94 892de798 2004-04-19 devnull }
95 038e9089 2004-03-21 devnull e->x += c->x - BORDER;
96 038e9089 2004-03-21 devnull e->y += c->y - BORDER;
97 892de798 2004-04-19 devnull } else if (e->window != e->root) {
98 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "but no client: e x=%d y=%d\n",
99 1cb3fa80 2004-03-29 devnull e->x, e->y);
100 038e9089 2004-03-21 devnull XTranslateCoordinates(dpy, e->window, s->root, e->x, e->y,
101 038e9089 2004-03-21 devnull &e->x, &e->y, &dw);
102 1cb3fa80 2004-03-29 devnull }
103 038e9089 2004-03-21 devnull switch (e->button) {
104 038e9089 2004-03-21 devnull case Button1:
105 038e9089 2004-03-21 devnull if (c) {
106 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
107 038e9089 2004-03-21 devnull top(c);
108 038e9089 2004-03-21 devnull active(c);
109 038e9089 2004-03-21 devnull }
110 038e9089 2004-03-21 devnull return;
111 038e9089 2004-03-21 devnull case Button2:
112 3ddda821 2004-12-28 devnull if (c) {
113 3ddda821 2004-12-28 devnull XMapRaised(dpy, c->parent);
114 3ddda821 2004-12-28 devnull active(c);
115 3ddda821 2004-12-28 devnull XAllowEvents (dpy, ReplayPointer, curtime);
116 3ddda821 2004-12-28 devnull } else if ((e->state&(ShiftMask|ControlMask))==(ShiftMask|ControlMask)) {
117 038e9089 2004-03-21 devnull menuhit(e, &egg);
118 3ddda821 2004-12-28 devnull } else if(numvirtuals > 1 && (n = menuhit(e, &b2menu)) > -1)
119 3ddda821 2004-12-28 devnull button2(n);
120 038e9089 2004-03-21 devnull return;
121 038e9089 2004-03-21 devnull case Button3:
122 038e9089 2004-03-21 devnull break;
123 3015b831 2004-12-29 devnull case Button4:
124 3015b831 2004-12-29 devnull /* scroll up changes to previous virtual screen */
125 08166a45 2004-12-30 devnull if(!c && e->type == ButtonPress)
126 3015b831 2004-12-29 devnull if(numvirtuals > 1 && virt > 0)
127 3015b831 2004-12-29 devnull switch_to(virt - 1);
128 08166a45 2004-12-30 devnull return;
129 08166a45 2004-12-30 devnull case Button5:
130 08166a45 2004-12-30 devnull /* scroll down changes to next virtual screen */
131 08166a45 2004-12-30 devnull if(!c && e->type == ButtonPress)
132 08166a45 2004-12-30 devnull if(numvirtuals > 1 && virt < numvirtuals - 1)
133 08166a45 2004-12-30 devnull switch_to(virt + 1);
134 3015b831 2004-12-29 devnull return;
135 3015b831 2004-12-29 devnull default:
136 3015b831 2004-12-29 devnull return;
137 038e9089 2004-03-21 devnull }
138 038e9089 2004-03-21 devnull
139 038e9089 2004-03-21 devnull if (current && current->screen == s)
140 038e9089 2004-03-21 devnull cmapnofocus(s);
141 038e9089 2004-03-21 devnull switch (n = menuhit(e, &b3menu)) {
142 038e9089 2004-03-21 devnull case 0: /* New */
143 038e9089 2004-03-21 devnull spawn(s);
144 038e9089 2004-03-21 devnull break;
145 038e9089 2004-03-21 devnull case 1: /* Reshape */
146 1cb3fa80 2004-03-29 devnull reshape(selectwin(1, 0, s), Button3, sweep, 0);
147 038e9089 2004-03-21 devnull break;
148 038e9089 2004-03-21 devnull case 2: /* Move */
149 1cb3fa80 2004-03-29 devnull move(selectwin(0, 0, s), Button3);
150 038e9089 2004-03-21 devnull break;
151 038e9089 2004-03-21 devnull case 3: /* Delete */
152 038e9089 2004-03-21 devnull shift = 0;
153 038e9089 2004-03-21 devnull c = selectwin(1, &shift, s);
154 038e9089 2004-03-21 devnull delete(c, shift);
155 038e9089 2004-03-21 devnull break;
156 038e9089 2004-03-21 devnull case 4: /* Hide */
157 038e9089 2004-03-21 devnull hide(selectwin(1, 0, s));
158 038e9089 2004-03-21 devnull break;
159 038e9089 2004-03-21 devnull default: /* unhide window */
160 038e9089 2004-03-21 devnull unhide(n - B3FIXED, 1);
161 038e9089 2004-03-21 devnull break;
162 038e9089 2004-03-21 devnull case -1: /* nothing */
163 038e9089 2004-03-21 devnull break;
164 038e9089 2004-03-21 devnull }
165 038e9089 2004-03-21 devnull if (current && current->screen == s)
166 038e9089 2004-03-21 devnull cmapfocus(current);
167 038e9089 2004-03-21 devnull }
168 038e9089 2004-03-21 devnull
169 038e9089 2004-03-21 devnull void
170 038e9089 2004-03-21 devnull spawn(ScreenInfo *s)
171 038e9089 2004-03-21 devnull {
172 e62ba5ec 2004-03-21 devnull /*
173 e62ba5ec 2004-03-21 devnull * ugly dance to cause sweeping for terminals.
174 e62ba5ec 2004-03-21 devnull * the very next window created will require sweeping.
175 e62ba5ec 2004-03-21 devnull * hope it's created by the program we're about to
176 e62ba5ec 2004-03-21 devnull * exec!
177 e62ba5ec 2004-03-21 devnull */
178 e62ba5ec 2004-03-21 devnull isNew = 1;
179 038e9089 2004-03-21 devnull /*
180 3ddda821 2004-12-28 devnull * ugly dance to avoid leaving zombies. Could use SIGCHLD,
181 038e9089 2004-03-21 devnull * but it's not very portable.
182 038e9089 2004-03-21 devnull */
183 038e9089 2004-03-21 devnull if (fork() == 0) {
184 038e9089 2004-03-21 devnull if (fork() == 0) {
185 038e9089 2004-03-21 devnull close(ConnectionNumber(dpy));
186 038e9089 2004-03-21 devnull if (s->display[0] != '\0')
187 038e9089 2004-03-21 devnull putenv(s->display);
188 e5c26b01 2004-09-20 devnull signal(SIGINT, SIG_DFL);
189 e5c26b01 2004-09-20 devnull signal(SIGTERM, SIG_DFL);
190 e5c26b01 2004-09-20 devnull signal(SIGHUP, SIG_DFL);
191 038e9089 2004-03-21 devnull if (termprog != NULL) {
192 038e9089 2004-03-21 devnull execl(shell, shell, "-c", termprog, 0);
193 aa808685 2004-04-19 devnull fprintf(stderr, "rio: exec %s", shell);
194 038e9089 2004-03-21 devnull perror(" failed");
195 038e9089 2004-03-21 devnull }
196 08166a45 2004-12-30 devnull execlp("9term", "9term", scrolling ? "-ws" : "-w", 0);
197 038e9089 2004-03-21 devnull execlp("xterm", "xterm", "-ut", 0);
198 aa808685 2004-04-19 devnull perror("rio: exec 9term/xterm failed");
199 038e9089 2004-03-21 devnull exit(1);
200 038e9089 2004-03-21 devnull }
201 038e9089 2004-03-21 devnull exit(0);
202 038e9089 2004-03-21 devnull }
203 038e9089 2004-03-21 devnull wait((int *) 0);
204 038e9089 2004-03-21 devnull }
205 038e9089 2004-03-21 devnull
206 038e9089 2004-03-21 devnull void
207 1cb3fa80 2004-03-29 devnull reshape(Client *c, int but, int (*fn)(Client*, int, XButtonEvent *), XButtonEvent *e)
208 038e9089 2004-03-21 devnull {
209 038e9089 2004-03-21 devnull int odx, ody;
210 038e9089 2004-03-21 devnull
211 038e9089 2004-03-21 devnull if (c == 0)
212 038e9089 2004-03-21 devnull return;
213 038e9089 2004-03-21 devnull odx = c->dx;
214 038e9089 2004-03-21 devnull ody = c->dy;
215 1cb3fa80 2004-03-29 devnull if (fn(c, but, e) == 0)
216 038e9089 2004-03-21 devnull return;
217 038e9089 2004-03-21 devnull active(c);
218 038e9089 2004-03-21 devnull top(c);
219 038e9089 2004-03-21 devnull XRaiseWindow(dpy, c->parent);
220 038e9089 2004-03-21 devnull XMoveResizeWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER,
221 038e9089 2004-03-21 devnull c->dx+2*BORDER, c->dy+2*BORDER);
222 038e9089 2004-03-21 devnull if (c->dx == odx && c->dy == ody)
223 038e9089 2004-03-21 devnull sendconfig(c);
224 038e9089 2004-03-21 devnull else
225 038e9089 2004-03-21 devnull XMoveResizeWindow(dpy, c->window, BORDER, BORDER, c->dx, c->dy);
226 038e9089 2004-03-21 devnull }
227 038e9089 2004-03-21 devnull
228 038e9089 2004-03-21 devnull void
229 1cb3fa80 2004-03-29 devnull move(Client *c, int but)
230 038e9089 2004-03-21 devnull {
231 038e9089 2004-03-21 devnull if (c == 0)
232 038e9089 2004-03-21 devnull return;
233 1cb3fa80 2004-03-29 devnull if (drag(c, but) == 0)
234 038e9089 2004-03-21 devnull return;
235 038e9089 2004-03-21 devnull active(c);
236 038e9089 2004-03-21 devnull top(c);
237 038e9089 2004-03-21 devnull XRaiseWindow(dpy, c->parent);
238 038e9089 2004-03-21 devnull XMoveWindow(dpy, c->parent, c->x-BORDER, c->y-BORDER);
239 038e9089 2004-03-21 devnull sendconfig(c);
240 038e9089 2004-03-21 devnull }
241 038e9089 2004-03-21 devnull
242 038e9089 2004-03-21 devnull void
243 038e9089 2004-03-21 devnull delete(Client *c, int shift)
244 038e9089 2004-03-21 devnull {
245 038e9089 2004-03-21 devnull if (c == 0)
246 038e9089 2004-03-21 devnull return;
247 038e9089 2004-03-21 devnull if ((c->proto & Pdelete) && !shift)
248 bf00efba 2004-08-06 devnull sendcmessage(c->window, wm_protocols, wm_delete, 0, 0);
249 038e9089 2004-03-21 devnull else
250 038e9089 2004-03-21 devnull XKillClient(dpy, c->window); /* let event clean up */
251 038e9089 2004-03-21 devnull }
252 038e9089 2004-03-21 devnull
253 038e9089 2004-03-21 devnull void
254 038e9089 2004-03-21 devnull hide(Client *c)
255 038e9089 2004-03-21 devnull {
256 038e9089 2004-03-21 devnull if (c == 0 || numhidden == MAXHIDDEN)
257 038e9089 2004-03-21 devnull return;
258 038e9089 2004-03-21 devnull if (hidden(c)) {
259 aa808685 2004-04-19 devnull fprintf(stderr, "rio: already hidden: %s\n", c->label);
260 038e9089 2004-03-21 devnull return;
261 038e9089 2004-03-21 devnull }
262 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->parent);
263 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->window);
264 038e9089 2004-03-21 devnull setstate(c, IconicState);
265 038e9089 2004-03-21 devnull if (c == current)
266 038e9089 2004-03-21 devnull nofocus();
267 038e9089 2004-03-21 devnull hiddenc[numhidden] = c;
268 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = c->label;
269 038e9089 2004-03-21 devnull numhidden++;
270 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = 0;
271 038e9089 2004-03-21 devnull }
272 038e9089 2004-03-21 devnull
273 038e9089 2004-03-21 devnull void
274 038e9089 2004-03-21 devnull unhide(int n, int map)
275 038e9089 2004-03-21 devnull {
276 038e9089 2004-03-21 devnull Client *c;
277 038e9089 2004-03-21 devnull int i;
278 038e9089 2004-03-21 devnull
279 038e9089 2004-03-21 devnull if (n >= numhidden) {
280 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhide: n %d numhidden %d\n", n, numhidden);
281 038e9089 2004-03-21 devnull return;
282 038e9089 2004-03-21 devnull }
283 038e9089 2004-03-21 devnull c = hiddenc[n];
284 038e9089 2004-03-21 devnull if (!hidden(c)) {
285 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhide: not hidden: %s(0x%x)\n",
286 e62ba5ec 2004-03-21 devnull c->label, (int)c->window);
287 038e9089 2004-03-21 devnull return;
288 038e9089 2004-03-21 devnull }
289 3015b831 2004-12-29 devnull c->virt = virt;
290 038e9089 2004-03-21 devnull
291 038e9089 2004-03-21 devnull if (map) {
292 038e9089 2004-03-21 devnull XMapWindow(dpy, c->window);
293 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
294 038e9089 2004-03-21 devnull setstate(c, NormalState);
295 038e9089 2004-03-21 devnull active(c);
296 038e9089 2004-03-21 devnull top(c);
297 038e9089 2004-03-21 devnull }
298 038e9089 2004-03-21 devnull
299 038e9089 2004-03-21 devnull numhidden--;
300 038e9089 2004-03-21 devnull for (i = n; i < numhidden; i ++) {
301 038e9089 2004-03-21 devnull hiddenc[i] = hiddenc[i+1];
302 038e9089 2004-03-21 devnull b3items[B3FIXED+i] = b3items[B3FIXED+i+1];
303 038e9089 2004-03-21 devnull }
304 038e9089 2004-03-21 devnull b3items[B3FIXED+numhidden] = 0;
305 038e9089 2004-03-21 devnull }
306 038e9089 2004-03-21 devnull
307 038e9089 2004-03-21 devnull void
308 038e9089 2004-03-21 devnull unhidec(Client *c, int map)
309 038e9089 2004-03-21 devnull {
310 038e9089 2004-03-21 devnull int i;
311 038e9089 2004-03-21 devnull
312 038e9089 2004-03-21 devnull for (i = 0; i < numhidden; i++)
313 038e9089 2004-03-21 devnull if (c == hiddenc[i]) {
314 038e9089 2004-03-21 devnull unhide(i, map);
315 038e9089 2004-03-21 devnull return;
316 038e9089 2004-03-21 devnull }
317 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unhidec: not hidden: %s(0x%x)\n",
318 e62ba5ec 2004-03-21 devnull c->label, (int)c->window);
319 038e9089 2004-03-21 devnull }
320 038e9089 2004-03-21 devnull
321 038e9089 2004-03-21 devnull void
322 038e9089 2004-03-21 devnull renamec(Client *c, char *name)
323 038e9089 2004-03-21 devnull {
324 038e9089 2004-03-21 devnull int i;
325 038e9089 2004-03-21 devnull
326 038e9089 2004-03-21 devnull if (name == 0)
327 038e9089 2004-03-21 devnull name = "???";
328 038e9089 2004-03-21 devnull c->label = name;
329 038e9089 2004-03-21 devnull if (!hidden(c))
330 038e9089 2004-03-21 devnull return;
331 038e9089 2004-03-21 devnull for (i = 0; i < numhidden; i++)
332 038e9089 2004-03-21 devnull if (c == hiddenc[i]) {
333 038e9089 2004-03-21 devnull b3items[B3FIXED+i] = name;
334 038e9089 2004-03-21 devnull return;
335 3ddda821 2004-12-28 devnull }
336 3ddda821 2004-12-28 devnull }
337 3ddda821 2004-12-28 devnull
338 3ddda821 2004-12-28 devnull void
339 3ddda821 2004-12-28 devnull button2(int n)
340 3ddda821 2004-12-28 devnull {
341 3ddda821 2004-12-28 devnull switch_to(n);
342 3ddda821 2004-12-28 devnull if (current)
343 3ddda821 2004-12-28 devnull cmapfocus(current);
344 3ddda821 2004-12-28 devnull }
345 3ddda821 2004-12-28 devnull
346 3ddda821 2004-12-28 devnull void
347 3ddda821 2004-12-28 devnull switch_to_c(int n, Client *c)
348 3ddda821 2004-12-28 devnull {
349 3ddda821 2004-12-28 devnull if (c && c->next)
350 3ddda821 2004-12-28 devnull switch_to_c(n,c->next);
351 3ddda821 2004-12-28 devnull
352 3ddda821 2004-12-28 devnull if (c->parent == DefaultRootWindow(dpy))
353 3ddda821 2004-12-28 devnull return;
354 3ddda821 2004-12-28 devnull
355 3ddda821 2004-12-28 devnull if (c->virt != virt && c->state == NormalState) {
356 3ddda821 2004-12-28 devnull XUnmapWindow(dpy, c->parent);
357 3ddda821 2004-12-28 devnull XUnmapWindow(dpy, c->window);
358 3ddda821 2004-12-28 devnull setstate(c, IconicState);
359 3ddda821 2004-12-28 devnull if (c == current)
360 3ddda821 2004-12-28 devnull nofocus();
361 3ddda821 2004-12-28 devnull } else if (c->virt == virt && c->state == IconicState) {
362 3ddda821 2004-12-28 devnull int i;
363 3ddda821 2004-12-28 devnull
364 3ddda821 2004-12-28 devnull for (i = 0; i < numhidden; i++)
365 3ddda821 2004-12-28 devnull if (c == hiddenc[i])
366 3ddda821 2004-12-28 devnull break;
367 3ddda821 2004-12-28 devnull
368 3ddda821 2004-12-28 devnull if (i == numhidden) {
369 3ddda821 2004-12-28 devnull XMapWindow(dpy, c->window);
370 3ddda821 2004-12-28 devnull XMapWindow(dpy, c->parent);
371 3ddda821 2004-12-28 devnull setstate(c, NormalState);
372 3ddda821 2004-12-28 devnull if (currents[virt] == c)
373 3ddda821 2004-12-28 devnull active(c);
374 038e9089 2004-03-21 devnull }
375 3ddda821 2004-12-28 devnull }
376 038e9089 2004-03-21 devnull }
377 3ddda821 2004-12-28 devnull
378 3ddda821 2004-12-28 devnull void
379 3ddda821 2004-12-28 devnull switch_to(int n)
380 3ddda821 2004-12-28 devnull {
381 3ddda821 2004-12-28 devnull if (n == virt)
382 3ddda821 2004-12-28 devnull return;
383 3ddda821 2004-12-28 devnull currents[virt] = current;
384 3ddda821 2004-12-28 devnull virt = n;
385 08166a45 2004-12-30 devnull
386 08166a45 2004-12-30 devnull /* redundant when called from a menu switch
387 08166a45 2004-12-30 devnull * but needed for scroll-button switches
388 08166a45 2004-12-30 devnull */
389 08166a45 2004-12-30 devnull b2menu.lasthit = n;
390 08166a45 2004-12-30 devnull
391 3ddda821 2004-12-28 devnull switch_to_c(n, clients);
392 3ddda821 2004-12-28 devnull current = currents[virt];
393 3ddda821 2004-12-28 devnull }
394 3ddda821 2004-12-28 devnull
395 3ddda821 2004-12-28 devnull void
396 3ddda821 2004-12-28 devnull initb2menu(int n)
397 3ddda821 2004-12-28 devnull {
398 3ddda821 2004-12-28 devnull b2items[n] = 0;
399 3ddda821 2004-12-28 devnull }