comparison client.c @ 400:052657ff2e7b

applied Sanders max_and_focus.patch
author Anselm R. Garbe <arg@10kloc.org>
date Mon, 04 Sep 2006 08:55:49 +0200
parents b00cc483d13b
children 6413ea66b1c2
comparison
equal deleted inserted replaced
399:74739798b0b2 400:052657ff2e7b
80 } 80 }
81 81
82 void 82 void
83 focus(Client *c) 83 focus(Client *c)
84 { 84 {
85 Client *old = sel; 85 Client *old;
86 86
87 if(!issel) 87 if(!issel)
88 return; 88 return;
89 if(!sel) 89 if(!sel)
90 sel = c; 90 sel = c;
91 else if(sel != c) { 91 else if(sel != c) {
92 if(sel->ismax) 92 if(maximized)
93 togglemax(NULL); 93 togglemax(NULL);
94 old = sel;
94 sel = c; 95 sel = c;
95 grabbuttons(old, False); 96 if(old) {
96 drawtitle(old); 97 grabbuttons(old, False);
97 } 98 drawtitle(old);
98 grabbuttons(c, True); 99 }
99 drawtitle(c); 100 }
100 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); 101 if(c) {
102 grabbuttons(c, True);
103 drawtitle(c);
104 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
105 }
106 else
107 XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
101 } 108 }
102 109
103 Client * 110 Client *
104 getclient(Window w) 111 getclient(Window w)
105 { 112 {
245 clients->prev = c; 252 clients->prev = c;
246 c->next = clients; 253 c->next = clients;
247 clients = c; 254 clients = c;
248 255
249 settitle(c); 256 settitle(c);
250 if(isvisible(c))
251 sel = c;
252 arrange(NULL); 257 arrange(NULL);
253 XMapWindow(dpy, c->win); 258 XMapWindow(dpy, c->win);
254 XMapWindow(dpy, c->twin); 259 XMapWindow(dpy, c->twin);
255 if(isvisible(c)) 260 if(isvisible(c))
256 focus(c); 261 focus(c);
364 369
365 void 370 void
366 togglemax(Arg *arg) 371 togglemax(Arg *arg)
367 { 372 {
368 int ox, oy, ow, oh; 373 int ox, oy, ow, oh;
374 Client *c;
369 XEvent ev; 375 XEvent ev;
370 376
371 if(!sel) 377 if(!sel)
372 return; 378 return;
373 379
374 if((sel->ismax = !sel->ismax)) { 380 if((maximized = !maximized)) {
375 ox = sel->x; 381 ox = sel->x;
376 oy = sel->y; 382 oy = sel->y;
377 ow = sel->w; 383 ow = sel->w;
378 oh = sel->h; 384 oh = sel->h;
379 sel->x = sx; 385 sel->x = sx;
380 sel->y = sy + bh; 386 sel->y = sy + bh;
381 sel->w = sw - 2; 387 sel->w = sw - 2;
382 sel->h = sh - 2 - bh; 388 sel->h = sh - 2 - bh;
383 389
384 restack(); 390 restack();
391 for(c = getnext(clients); c; c = getnext(c->next))
392 if(c != sel)
393 ban(c);
385 resize(sel, arrange == dofloat, TopLeft); 394 resize(sel, arrange == dofloat, TopLeft);
386 395
387 sel->x = ox; 396 sel->x = ox;
388 sel->y = oy; 397 sel->y = oy;
389 sel->w = ow; 398 sel->w = ow;
390 sel->h = oh; 399 sel->h = oh;
391 } 400 }
392 else 401 else
393 resize(sel, False, TopLeft); 402 arrange(NULL);
394 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); 403 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
395 } 404 }
396 405
397 void 406 void
398 unmanage(Client *c) 407 unmanage(Client *c)
399 { 408 {
400 Client *tc; 409 Client *tc, *fc;
401 Window trans; 410 Window trans;
402 XGrabServer(dpy); 411 XGrabServer(dpy);
403 XSetErrorHandler(xerrordummy); 412 XSetErrorHandler(xerrordummy);
404 413
405 XGetTransientForHint(dpy, c->win, &trans); 414 detach(c);
415 if(sel == c) {
416 XGetTransientForHint(dpy, c->win, &trans);
417 if(trans && (tc = getclient(trans)) && isvisible(tc))
418 fc = tc;
419 else
420 fc = getnext(clients);
421 focus(fc);
422 }
406 423
407 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); 424 XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
408 XDestroyWindow(dpy, c->twin); 425 XDestroyWindow(dpy, c->twin);
409 426
410 detach(c);
411 if(sel == c) {
412 if(trans && (tc = getclient(trans)) && isvisible(tc))
413 sel = tc;
414 else
415 sel = getnext(clients);
416 }
417 free(c->tags); 427 free(c->tags);
418 free(c); 428 free(c);
419 429
420 XSync(dpy, False); 430 XSync(dpy, False);
421 XSetErrorHandler(xerror); 431 XSetErrorHandler(xerror);
422 XUngrabServer(dpy); 432 XUngrabServer(dpy);
423 if(sel)
424 focus(sel);
425 arrange(NULL); 433 arrange(NULL);
426 } 434 }