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 e62ba5ec 2004-03-21 devnull #include <unistd.h>
4 e62ba5ec 2004-03-21 devnull #include <stdlib.h>
5 e62ba5ec 2004-03-21 devnull #include <string.h>
6 038e9089 2004-03-21 devnull #include <X11/X.h>
7 038e9089 2004-03-21 devnull #include <X11/Xlib.h>
8 038e9089 2004-03-21 devnull #include <X11/Xutil.h>
9 038e9089 2004-03-21 devnull #include "dat.h"
10 038e9089 2004-03-21 devnull #include "fns.h"
11 038e9089 2004-03-21 devnull
12 038e9089 2004-03-21 devnull Client *clients;
13 038e9089 2004-03-21 devnull Client *current;
14 038e9089 2004-03-21 devnull
15 038e9089 2004-03-21 devnull void
16 038e9089 2004-03-21 devnull setactive(Client *c, int on)
17 038e9089 2004-03-21 devnull {
18 038e9089 2004-03-21 devnull if (c->parent == c->screen->root) {
19 aa808685 2004-04-19 devnull fprintf(stderr, "rio: bad parent in setactive; dumping core\n");
20 038e9089 2004-03-21 devnull abort();
21 038e9089 2004-03-21 devnull }
22 038e9089 2004-03-21 devnull if (on) {
23 038e9089 2004-03-21 devnull XUngrabButton(dpy, AnyButton, AnyModifier, c->parent);
24 038e9089 2004-03-21 devnull XSetInputFocus(dpy, c->window, RevertToPointerRoot, timestamp());
25 038e9089 2004-03-21 devnull if (c->proto & Ptakefocus)
26 2c1b986e 2004-08-13 devnull sendcmessage(c->window, wm_protocols, wm_take_focus, 0, 1);
27 038e9089 2004-03-21 devnull cmapfocus(c);
28 c005568a 2004-03-30 devnull } else {
29 c005568a 2004-03-30 devnull if (c->proto & Plosefocus)
30 2c1b986e 2004-08-13 devnull sendcmessage(c->window, wm_protocols, wm_lose_focus, 0, 1);
31 038e9089 2004-03-21 devnull XGrabButton(dpy, AnyButton, AnyModifier, c->parent, False,
32 038e9089 2004-03-21 devnull ButtonMask, GrabModeAsync, GrabModeSync, None, None);
33 c005568a 2004-03-30 devnull }
34 038e9089 2004-03-21 devnull draw_border(c, on);
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 draw_border(Client *c, int active)
39 038e9089 2004-03-21 devnull {
40 038e9089 2004-03-21 devnull unsigned long pixel;
41 038e9089 2004-03-21 devnull
42 038e9089 2004-03-21 devnull if(active){
43 038e9089 2004-03-21 devnull if(c->hold)
44 038e9089 2004-03-21 devnull pixel = c->screen->activeholdborder;
45 038e9089 2004-03-21 devnull else
46 038e9089 2004-03-21 devnull pixel = c->screen->activeborder;
47 038e9089 2004-03-21 devnull }else{
48 038e9089 2004-03-21 devnull if(c->hold)
49 038e9089 2004-03-21 devnull pixel = c->screen->inactiveholdborder;
50 038e9089 2004-03-21 devnull else
51 038e9089 2004-03-21 devnull pixel = c->screen->inactiveborder;
52 038e9089 2004-03-21 devnull }
53 038e9089 2004-03-21 devnull
54 c005568a 2004-03-30 devnull if (debug) fprintf(stderr, "draw_border %p pixel %ld active %d hold %d\n", c, pixel, active, c->hold);
55 038e9089 2004-03-21 devnull XSetWindowBackground(dpy, c->parent, pixel);
56 038e9089 2004-03-21 devnull XClearWindow(dpy, c->parent);
57 038e9089 2004-03-21 devnull }
58 038e9089 2004-03-21 devnull
59 038e9089 2004-03-21 devnull void
60 038e9089 2004-03-21 devnull active(Client *c)
61 038e9089 2004-03-21 devnull {
62 038e9089 2004-03-21 devnull Client *cc;
63 038e9089 2004-03-21 devnull
64 038e9089 2004-03-21 devnull if (c == 0) {
65 aa808685 2004-04-19 devnull fprintf(stderr, "rio: active(c==0)\n");
66 038e9089 2004-03-21 devnull return;
67 038e9089 2004-03-21 devnull }
68 038e9089 2004-03-21 devnull if (c == current)
69 038e9089 2004-03-21 devnull return;
70 038e9089 2004-03-21 devnull if (current) {
71 038e9089 2004-03-21 devnull setactive(current, 0);
72 038e9089 2004-03-21 devnull if (current->screen != c->screen)
73 038e9089 2004-03-21 devnull cmapnofocus(current->screen);
74 038e9089 2004-03-21 devnull }
75 038e9089 2004-03-21 devnull setactive(c, 1);
76 038e9089 2004-03-21 devnull for (cc = clients; cc; cc = cc->next)
77 038e9089 2004-03-21 devnull if (cc->revert == c)
78 038e9089 2004-03-21 devnull cc->revert = c->revert;
79 038e9089 2004-03-21 devnull c->revert = current;
80 038e9089 2004-03-21 devnull while (c->revert && !normal(c->revert))
81 038e9089 2004-03-21 devnull c->revert = c->revert->revert;
82 038e9089 2004-03-21 devnull current = c;
83 038e9089 2004-03-21 devnull #ifdef DEBUG
84 038e9089 2004-03-21 devnull if (debug)
85 038e9089 2004-03-21 devnull dump_revert();
86 038e9089 2004-03-21 devnull #endif
87 038e9089 2004-03-21 devnull }
88 038e9089 2004-03-21 devnull
89 038e9089 2004-03-21 devnull void
90 038e9089 2004-03-21 devnull nofocus(void)
91 038e9089 2004-03-21 devnull {
92 038e9089 2004-03-21 devnull static Window w = 0;
93 038e9089 2004-03-21 devnull int mask;
94 038e9089 2004-03-21 devnull XSetWindowAttributes attr;
95 038e9089 2004-03-21 devnull Client *c;
96 038e9089 2004-03-21 devnull
97 038e9089 2004-03-21 devnull if (current) {
98 038e9089 2004-03-21 devnull setactive(current, 0);
99 038e9089 2004-03-21 devnull for (c = current->revert; c; c = c->revert)
100 038e9089 2004-03-21 devnull if (normal(c)) {
101 038e9089 2004-03-21 devnull active(c);
102 038e9089 2004-03-21 devnull return;
103 038e9089 2004-03-21 devnull }
104 038e9089 2004-03-21 devnull cmapnofocus(current->screen);
105 038e9089 2004-03-21 devnull /* if no candidates to revert to, fall through */
106 038e9089 2004-03-21 devnull }
107 038e9089 2004-03-21 devnull current = 0;
108 038e9089 2004-03-21 devnull if (w == 0) {
109 c005568a 2004-03-30 devnull mask = CWOverrideRedirect/*|CWColormap*/;
110 038e9089 2004-03-21 devnull attr.override_redirect = 1;
111 c005568a 2004-03-30 devnull /* attr.colormap = screens[0].def_cmap;*/
112 038e9089 2004-03-21 devnull w = XCreateWindow(dpy, screens[0].root, 0, 0, 1, 1, 0,
113 c005568a 2004-03-30 devnull 0 /*screens[0].depth*/, InputOnly, screens[0].vis, mask, &attr);
114 038e9089 2004-03-21 devnull XMapWindow(dpy, w);
115 038e9089 2004-03-21 devnull }
116 038e9089 2004-03-21 devnull XSetInputFocus(dpy, w, RevertToPointerRoot, timestamp());
117 038e9089 2004-03-21 devnull }
118 038e9089 2004-03-21 devnull
119 038e9089 2004-03-21 devnull void
120 038e9089 2004-03-21 devnull top(Client *c)
121 038e9089 2004-03-21 devnull {
122 038e9089 2004-03-21 devnull Client **l, *cc;
123 038e9089 2004-03-21 devnull
124 038e9089 2004-03-21 devnull l = &clients;
125 038e9089 2004-03-21 devnull for (cc = *l; cc; cc = *l) {
126 038e9089 2004-03-21 devnull if (cc == c) {
127 038e9089 2004-03-21 devnull *l = c->next;
128 038e9089 2004-03-21 devnull c->next = clients;
129 038e9089 2004-03-21 devnull clients = c;
130 038e9089 2004-03-21 devnull return;
131 038e9089 2004-03-21 devnull }
132 038e9089 2004-03-21 devnull l = &cc->next;
133 038e9089 2004-03-21 devnull }
134 aa808685 2004-04-19 devnull fprintf(stderr, "rio: %p not on client list in top()\n", c);
135 038e9089 2004-03-21 devnull }
136 038e9089 2004-03-21 devnull
137 038e9089 2004-03-21 devnull Client *
138 038e9089 2004-03-21 devnull getclient(Window w, int create)
139 038e9089 2004-03-21 devnull {
140 038e9089 2004-03-21 devnull Client *c;
141 038e9089 2004-03-21 devnull
142 038e9089 2004-03-21 devnull if (w == 0 || getscreen(w))
143 038e9089 2004-03-21 devnull return 0;
144 038e9089 2004-03-21 devnull
145 038e9089 2004-03-21 devnull for (c = clients; c; c = c->next)
146 038e9089 2004-03-21 devnull if (c->window == w || c->parent == w)
147 038e9089 2004-03-21 devnull return c;
148 038e9089 2004-03-21 devnull
149 038e9089 2004-03-21 devnull if (!create)
150 038e9089 2004-03-21 devnull return 0;
151 038e9089 2004-03-21 devnull
152 038e9089 2004-03-21 devnull c = (Client *)malloc(sizeof(Client));
153 038e9089 2004-03-21 devnull memset(c, 0, sizeof(Client));
154 038e9089 2004-03-21 devnull c->window = w;
155 038e9089 2004-03-21 devnull /* c->parent will be set by the caller */
156 038e9089 2004-03-21 devnull c->parent = None;
157 038e9089 2004-03-21 devnull c->reparenting = 0;
158 038e9089 2004-03-21 devnull c->state = WithdrawnState;
159 038e9089 2004-03-21 devnull c->init = 0;
160 038e9089 2004-03-21 devnull c->cmap = None;
161 038e9089 2004-03-21 devnull c->label = c->class = 0;
162 038e9089 2004-03-21 devnull c->revert = 0;
163 038e9089 2004-03-21 devnull c->is9term = 0;
164 038e9089 2004-03-21 devnull c->hold = 0;
165 038e9089 2004-03-21 devnull c->ncmapwins = 0;
166 038e9089 2004-03-21 devnull c->cmapwins = 0;
167 038e9089 2004-03-21 devnull c->wmcmaps = 0;
168 038e9089 2004-03-21 devnull c->next = clients;
169 3ddda821 2004-12-28 devnull c->virt = virt;
170 038e9089 2004-03-21 devnull clients = c;
171 038e9089 2004-03-21 devnull return c;
172 038e9089 2004-03-21 devnull }
173 038e9089 2004-03-21 devnull
174 038e9089 2004-03-21 devnull void
175 038e9089 2004-03-21 devnull rmclient(Client *c)
176 038e9089 2004-03-21 devnull {
177 038e9089 2004-03-21 devnull Client *cc;
178 038e9089 2004-03-21 devnull
179 038e9089 2004-03-21 devnull for (cc = current; cc && cc->revert; cc = cc->revert)
180 038e9089 2004-03-21 devnull if (cc->revert == c)
181 038e9089 2004-03-21 devnull cc->revert = cc->revert->revert;
182 038e9089 2004-03-21 devnull
183 038e9089 2004-03-21 devnull if (c == clients)
184 038e9089 2004-03-21 devnull clients = c->next;
185 038e9089 2004-03-21 devnull for (cc = clients; cc && cc->next; cc = cc->next)
186 038e9089 2004-03-21 devnull if (cc->next == c)
187 038e9089 2004-03-21 devnull cc->next = cc->next->next;
188 038e9089 2004-03-21 devnull
189 038e9089 2004-03-21 devnull if (hidden(c))
190 038e9089 2004-03-21 devnull unhidec(c, 0);
191 038e9089 2004-03-21 devnull
192 038e9089 2004-03-21 devnull if (c->parent != c->screen->root)
193 038e9089 2004-03-21 devnull XDestroyWindow(dpy, c->parent);
194 038e9089 2004-03-21 devnull
195 038e9089 2004-03-21 devnull c->parent = c->window = None; /* paranoia */
196 038e9089 2004-03-21 devnull if (current == c) {
197 038e9089 2004-03-21 devnull current = c->revert;
198 038e9089 2004-03-21 devnull if (current == 0)
199 038e9089 2004-03-21 devnull nofocus();
200 038e9089 2004-03-21 devnull else {
201 038e9089 2004-03-21 devnull if (current->screen != c->screen)
202 038e9089 2004-03-21 devnull cmapnofocus(c->screen);
203 038e9089 2004-03-21 devnull setactive(current, 1);
204 038e9089 2004-03-21 devnull }
205 038e9089 2004-03-21 devnull }
206 038e9089 2004-03-21 devnull if (c->ncmapwins != 0) {
207 038e9089 2004-03-21 devnull XFree((char *)c->cmapwins);
208 038e9089 2004-03-21 devnull free((char *)c->wmcmaps);
209 038e9089 2004-03-21 devnull }
210 038e9089 2004-03-21 devnull if (c->iconname != 0)
211 038e9089 2004-03-21 devnull XFree((char*) c->iconname);
212 038e9089 2004-03-21 devnull if (c->name != 0)
213 038e9089 2004-03-21 devnull XFree((char*) c->name);
214 038e9089 2004-03-21 devnull if (c->instance != 0)
215 038e9089 2004-03-21 devnull XFree((char*) c->instance);
216 038e9089 2004-03-21 devnull if (c->class != 0)
217 038e9089 2004-03-21 devnull XFree((char*) c->class);
218 038e9089 2004-03-21 devnull memset(c, 0, sizeof(Client)); /* paranoia */
219 038e9089 2004-03-21 devnull free(c);
220 038e9089 2004-03-21 devnull }
221 038e9089 2004-03-21 devnull
222 038e9089 2004-03-21 devnull #ifdef DEBUG
223 038e9089 2004-03-21 devnull void
224 038e9089 2004-03-21 devnull dump_revert(void)
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 i = 0;
230 038e9089 2004-03-21 devnull for (c = current; c; c = c->revert) {
231 038e9089 2004-03-21 devnull fprintf(stderr, "%s(%x:%d)", c->label ? c->label : "?", c->window, c->state);
232 038e9089 2004-03-21 devnull if (i++ > 100)
233 038e9089 2004-03-21 devnull break;
234 038e9089 2004-03-21 devnull if (c->revert)
235 038e9089 2004-03-21 devnull fprintf(stderr, " -> ");
236 038e9089 2004-03-21 devnull }
237 038e9089 2004-03-21 devnull if (current == 0)
238 038e9089 2004-03-21 devnull fprintf(stderr, "empty");
239 038e9089 2004-03-21 devnull fprintf(stderr, "\n");
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 dump_clients(void)
244 038e9089 2004-03-21 devnull {
245 038e9089 2004-03-21 devnull Client *c;
246 038e9089 2004-03-21 devnull
247 038e9089 2004-03-21 devnull for (c = clients; c; c = c->next)
248 038e9089 2004-03-21 devnull fprintf(stderr, "w 0x%x parent 0x%x @ (%d, %d)\n", c->window, c->parent, c->x, c->y);
249 038e9089 2004-03-21 devnull }
250 038e9089 2004-03-21 devnull #endif