comparison client.c @ 127:1480e19f6377

using double-linked list in order to get correct prev focus handling
author arg@10ksloc.org
date Thu, 20 Jul 2006 16:54:20 +0200
parents 75576e44c1d8
children 0a407fbb8092
comparison
equal deleted inserted replaced
126:1489f6b97714 127:1480e19f6377
75 75
76 if(!(c = getnext(sel->next, tsel))) 76 if(!(c = getnext(sel->next, tsel)))
77 c = getnext(clients, tsel); 77 c = getnext(clients, tsel);
78 if(c) { 78 if(c) {
79 higher(c); 79 higher(c);
80 c->revert = sel;
81 focus(c); 80 focus(c);
82 } 81 }
83 } 82 }
84 83
85 void 84 void
91 return; 90 return;
92 91
93 if(sel->ismax) 92 if(sel->ismax)
94 togglemax(NULL); 93 togglemax(NULL);
95 94
96 if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { 95 if(!(c = getprev(sel->prev))) {
96 for(c = clients; c && c->next; c = c->next);
97 c = getprev(c);
98 }
99 if(c) {
97 higher(c); 100 higher(c);
98 focus(c); 101 focus(c);
99 } 102 }
100 } 103 }
101 104
125 gravitate(Client *c, Bool invert) 128 gravitate(Client *c, Bool invert)
126 { 129 {
127 int dx = 0, dy = 0; 130 int dx = 0, dy = 0;
128 131
129 switch(c->grav) { 132 switch(c->grav) {
133 default:
134 break;
130 case StaticGravity: 135 case StaticGravity:
131 case NorthWestGravity: 136 case NorthWestGravity:
132 case NorthGravity: 137 case NorthGravity:
133 case NorthEastGravity: 138 case NorthEastGravity:
134 dy = c->border; 139 dy = c->border;
141 case SouthEastGravity: 146 case SouthEastGravity:
142 case SouthGravity: 147 case SouthGravity:
143 case SouthWestGravity: 148 case SouthWestGravity:
144 dy = -(c->h); 149 dy = -(c->h);
145 break; 150 break;
151 }
152
153 switch (c->grav) {
146 default: 154 default:
147 break; 155 break;
148 }
149
150 switch (c->grav) {
151 case StaticGravity: 156 case StaticGravity:
152 case NorthWestGravity: 157 case NorthWestGravity:
153 case WestGravity: 158 case WestGravity:
154 case SouthWestGravity: 159 case SouthWestGravity:
155 dx = c->border; 160 dx = c->border;
162 case NorthEastGravity: 167 case NorthEastGravity:
163 case EastGravity: 168 case EastGravity:
164 case SouthEastGravity: 169 case SouthEastGravity:
165 dx = -(c->w + c->border); 170 dx = -(c->w + c->border);
166 break; 171 break;
167 default:
168 break;
169 } 172 }
170 173
171 if(invert) { 174 if(invert) {
172 dx = -dx; 175 dx = -dx;
173 dy = -dy; 176 dy = -dy;
202 } 205 }
203 206
204 void 207 void
205 manage(Window w, XWindowAttributes *wa) 208 manage(Window w, XWindowAttributes *wa)
206 { 209 {
207 int diff;
208 Client *c; 210 Client *c;
209 Window trans; 211 Window trans;
210 XSetWindowAttributes twa; 212 XSetWindowAttributes twa;
211 213
212 c = emallocz(sizeof(Client)); 214 c = emallocz(sizeof(Client));
222 224
223 c->border = 1; 225 c->border = 1;
224 c->proto = getproto(c->win); 226 c->proto = getproto(c->win);
225 setsize(c); 227 setsize(c);
226 XSelectInput(dpy, c->win, 228 XSelectInput(dpy, c->win,
227 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); 229 StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
228 XGetTransientForHint(dpy, c->win, &trans); 230 XGetTransientForHint(dpy, c->win, &trans);
229 twa.override_redirect = 1; 231 twa.override_redirect = 1;
230 twa.background_pixmap = ParentRelative; 232 twa.background_pixmap = ParentRelative;
231 twa.event_mask = ExposureMask; 233 twa.event_mask = ExposureMask;
232 234
235 DefaultVisual(dpy, screen), 237 DefaultVisual(dpy, screen),
236 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); 238 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
237 239
238 settags(c); 240 settags(c);
239 241
242 if(clients)
243 clients->prev = c;
240 c->next = clients; 244 c->next = clients;
241 clients = c; 245 clients = c;
242 246
243 XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonPressMask, 247 XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonPressMask,
244 GrabModeAsync, GrabModeSync, None, None); 248 GrabModeAsync, GrabModeSync, None, None);
262 focus(c); 266 focus(c);
263 } 267 }
264 else { 268 else {
265 XMapRaised(dpy, c->win); 269 XMapRaised(dpy, c->win);
266 XMapRaised(dpy, c->title); 270 XMapRaised(dpy, c->title);
271
267 } 272 }
268 } 273 }
269 274
270 void 275 void
271 pop(Client *c) 276 pop(Client *c)
272 { 277 {
273 Client **l; 278 Client **l;
274 279
275 for(l = &clients; *l && *l != c; l = &(*l)->next); 280 for(l = &clients; *l && *l != c; l = &(*l)->next);
281 if(c->prev)
282 c->prev->next = c->next;
283 if(c->next)
284 c->next->prev = c->prev;
276 *l = c->next; 285 *l = c->next;
277 286
278 c->next = clients; /* pop */ 287 if(clients)
288 clients->prev = c;
289 c->next = clients;
279 clients = c; 290 clients = c;
280 arrange(NULL); 291 arrange(NULL);
281 } 292 }
282 293
283 void 294 void
437 448
438 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); 449 XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
439 XDestroyWindow(dpy, c->title); 450 XDestroyWindow(dpy, c->title);
440 451
441 for(l = &clients; *l && *l != c; l = &(*l)->next); 452 for(l = &clients; *l && *l != c; l = &(*l)->next);
453 if(c->prev)
454 c->prev->next = c->next;
455 if(c->next)
456 c->next->prev = c->prev;
442 *l = c->next; 457 *l = c->next;
443 for(l = &clients; *l; l = &(*l)->next) 458 if(sel == c) {
444 if((*l)->revert == c) 459 sel = getnext(c->next, tsel);
445 (*l)->revert = NULL; 460 if(!sel)
446 if(sel == c) 461 sel = getprev(c->prev);
447 sel = sel->revert ? sel->revert : clients; 462 if(!sel)
448 463 sel = clients;
464 }
449 free(c); 465 free(c);
450 466
451 XSync(dpy, False); 467 XSync(dpy, False);
452 XSetErrorHandler(xerror); 468 XSetErrorHandler(xerror);
453 XUngrabServer(dpy); 469 XUngrabServer(dpy);