Blame


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