X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=client.c;h=169c01e59c3a69c7688f5cd727d148ee9b69740b;hp=63fb1e58df7fce3554d4bddf54f0d1146206d42f;hb=dba23062bad40afb1a90f60b6897cf9e1ca5035b;hpb=29355bd38284ed9aec8d3ffabde61db73947c9f9 diff --git a/client.c b/client.c index 63fb1e5..169c01e 100644 --- a/client.c +++ b/client.c @@ -11,27 +11,15 @@ #include "dwm.h" -static Rule rule[] = { - /* class instance tags floating */ - { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, -}; - -Client * -next(Client *c) -{ - for(; c && !c->tags[tsel]; c = c->next); - return c; -} - void -ban_client(Client *c) +ban(Client *c) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); } static void -resize_title(Client *c) +resizetitle(Client *c) { int i; @@ -48,7 +36,7 @@ resize_title(Client *c) } void -update_name(Client *c) +settitle(Client *c) { XTextProperty name; int n; @@ -72,11 +60,11 @@ update_name(Client *c) } } XFree(name.value); - resize_title(c); + resizetitle(c); } void -update_size(Client *c) +setsize(Client *c) { XSizeHints size; long msize; @@ -114,7 +102,7 @@ update_size(Client *c) } void -craise(Client *c) +higher(Client *c) { XRaiseWindow(dpy, c->win); XRaiseWindow(dpy, c->title); @@ -136,49 +124,13 @@ focus(Client *c) XFlush(dpy); sel = c; if(old && old != c) - draw_client(old); - draw_client(c); + drawtitle(old); + drawtitle(c); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); XFlush(dpy); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } -static void -init_tags(Client *c) -{ - XClassHint ch; - static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; - unsigned int i, j; - Bool matched = False; - - if(!len) { - c->tags[tsel] = tags[tsel]; - return; - } - - if(XGetClassHint(dpy, c->win, &ch)) { - if(ch.res_class && ch.res_name) { - for(i = 0; i < len; i++) - if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) - && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) - { - for(j = 0; j < TLast; j++) - c->tags[j] = rule[i].tags[j]; - c->floating = rule[i].floating; - matched = True; - break; - } - } - if(ch.res_class) - XFree(ch.res_class); - if(ch.res_name) - XFree(ch.res_name); - } - - if(!matched) - c->tags[tsel] = tags[tsel]; -} - void manage(Window w, XWindowAttributes *wa) { @@ -196,8 +148,8 @@ manage(Window w, XWindowAttributes *wa) c->h = wa->height; c->th = bh; c->border = 1; - c->proto = win_proto(c->win); - update_size(c); + c->proto = getproto(c->win); + setsize(c); XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | EnterWindowMask); XGetTransientForHint(dpy, c->win, &trans); @@ -210,8 +162,8 @@ manage(Window w, XWindowAttributes *wa) DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); - update_name(c); - init_tags(c); + settitle(c); + settags(c); for(l = &clients; *l; l = &(*l)->next); c->next = *l; /* *l == nil */ @@ -224,8 +176,8 @@ manage(Window w, XWindowAttributes *wa) XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, GrabModeAsync, GrabModeSync, None, None); - if(!c->floating) - c->floating = trans + if(!c->dofloat) + c->dofloat = trans || ((c->maxw == c->minw) && (c->maxh == c->minh)); arrange(NULL); @@ -236,7 +188,7 @@ manage(Window w, XWindowAttributes *wa) focus(c); } else { - ban_client(c); + ban(c); XMapRaised(dpy, c->win); XMapRaised(dpy, c->title); } @@ -321,7 +273,7 @@ resize(Client *c, Bool inc) c->w = c->maxw; if(c->maxh && c->h > c->maxh) c->h = c->maxh; - resize_title(c); + resizetitle(c); XSetWindowBorderWidth(dpy, c->win, 1); XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); e.type = ConfigureNotify; @@ -339,7 +291,7 @@ resize(Client *c, Bool inc) } static int -dummy_error_handler(Display *dsply, XErrorEvent *err) +xerrordummy(Display *dsply, XErrorEvent *ee) { return 0; } @@ -350,7 +302,7 @@ unmanage(Client *c) Client **l; XGrabServer(dpy); - XSetErrorHandler(dummy_error_handler); + XSetErrorHandler(xerrordummy); XUngrabButton(dpy, AnyButton, AnyModifier, c->win); XDestroyWindow(dpy, c->title); @@ -366,7 +318,7 @@ unmanage(Client *c) free(c); XFlush(dpy); - XSetErrorHandler(error_handler); + XSetErrorHandler(xerror); XUngrabServer(dpy); arrange(NULL); if(sel) @@ -374,7 +326,7 @@ unmanage(Client *c) } Client * -gettitle(Window w) +getctitle(Window w) { Client *c; for(c = clients; c; c = c->next) @@ -392,3 +344,80 @@ getclient(Window w) return c; return NULL; } + +void +zoom(Arg *arg) +{ + Client **l, *c; + + if(!sel) + return; + + if(sel == getnext(clients) && sel->next) { + if((c = getnext(sel->next))) + sel = c; + } + + for(l = &clients; *l && *l != sel; l = &(*l)->next); + *l = sel->next; + + sel->next = clients; /* pop */ + clients = sel; + arrange(NULL); + focus(sel); +} + +void +maximize(Arg *arg) +{ + if(!sel) + return; + sel->x = sx; + sel->y = sy + bh; + sel->w = sw - 2 * sel->border; + sel->h = sh - 2 * sel->border - bh; + higher(sel); + resize(sel, False); +} + +void +focusprev(Arg *arg) +{ + Client *c; + + if(!sel) + return; + + if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { + higher(c); + focus(c); + } +} + +void +focusnext(Arg *arg) +{ + Client *c; + + if(!sel) + return; + + if(!(c = getnext(sel->next))) + c = getnext(clients); + if(c) { + higher(c); + c->revert = sel; + focus(c); + } +} + +void +killclient(Arg *arg) +{ + if(!sel) + return; + if(sel->proto & WM_PROTOCOL_DELWIN) + sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]); + else + XKillClient(dpy, sel->win); +}