X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=9e049c651ecac45c48e2f0eda6c978b4f2fb541c;hp=d47da3feafd45039cec4dee79481af438628ef4a;hb=8b17f5517b12a84a52e9073ace4c8bb9eb6bb941;hpb=5dd92c765570caa6d96ab125aa655e30cf82eb20 diff --git a/dwm.c b/dwm.c index d47da3f..9e049c6 100644 --- a/dwm.c +++ b/dwm.c @@ -11,9 +11,9 @@ * in O(1) time. * * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a global - * linked client list, the focus history is remembered through a global - * stack list. Each client contains a bit array to indicate the tags of a + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a * client. * * Keys and tagging rules are organized as arrays and defined in config.h. @@ -164,6 +164,7 @@ static void destroynotify(XEvent *e); static void detach(Client *c); static void detachstack(Client *c); static void die(const char *errstr, ...); +static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); @@ -180,7 +181,6 @@ static long getstate(Window w); static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, Bool focused); static void grabkeys(void); -static Monitor *idxtomon(unsigned int n); static void initfont(const char *fontstr); static Bool isprotodel(Client *c); static void keypress(XEvent *e); @@ -237,7 +237,7 @@ static void zoom(const Arg *arg); /* variables */ static char stext[256]; static int screen; -static int sw, sh; /* X display screen geometry x, y, width, height */ +static int sw, sh; /* X display screen geometry x, y, width, height */ static int bh, blw = 0; /* bar geometry */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; @@ -264,6 +264,7 @@ static DC dc; static Layout *lt[] = { NULL, NULL }; static Monitor *mons = NULL, *selmon = NULL; static Window root; + /* configuration, allows nested code to access above variables */ #include "config.h" @@ -284,7 +285,8 @@ applyrules(Client *c) { r = &rules[i]; if((!r->title || strstr(c->name, r->title)) && (!r->class || (ch.res_class && strstr(ch.res_class, r->class))) - && (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance)))) { + && (!r->instance || (ch.res_name && strstr(ch.res_name, r->instance)))) + { c->isfloating = r->isfloating; c->tags |= r->tags; } @@ -305,7 +307,6 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) { /* set minimum possible */ *w = MAX(1, *w); *h = MAX(1, *h); - if(interact) { if(*x > sw) *x = sw - WIDTH(c); @@ -621,6 +622,23 @@ die(const char *errstr, ...) { exit(EXIT_FAILURE); } +Monitor * +dirtomon(int dir) { + Monitor *m = NULL; + + if(dir > 0) { + if(!(m = selmon->next)) + m = mons; + } + else { + if(selmon == mons) + for(m = mons; m->next; m = m->next); + else + for(m = mons; m->next != selmon; m = m->next); + } + return m; +} + void drawbar(Monitor *m) { int x; @@ -797,10 +815,11 @@ focusin(XEvent *e) { /* there are some broken focus acquiring clients */ void focusmon(const Arg *arg) { - Monitor *m; + Monitor *m = NULL; - if(!(m = idxtomon(arg->ui)) || m == selmon) + if(!mons->next) return; + m = dirtomon(arg->i); unfocus(selmon->sel); selmon = m; focus(NULL); @@ -885,7 +904,8 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { strncpy(text, (char *)name.value, size - 1); else { if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success - && n > 0 && *list) { + && n > 0 && *list) + { strncpy(text, *list, size - 1); XFreeStringList(list); } @@ -910,7 +930,8 @@ grabbuttons(Client *c, Bool focused) { buttons[i].mask | modifiers[j], c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - } else + } + else XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); } @@ -934,15 +955,6 @@ grabkeys(void) { } } -Monitor * -idxtomon(unsigned int n) { - unsigned int i; - Monitor *m; - - for(m = mons, i = 0; m && i != n; m = m->next, i++); - return m; -} - void initfont(const char *fontstr) { char *def, **missing; @@ -1376,7 +1388,7 @@ sendmon(Client *c, Monitor *m) { void setclientstate(Client *c, long state) { - long data[] = {state, None}; + long data[] = { state, None }; XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, PropModeReplace, (unsigned char *)data, 2); @@ -1512,11 +1524,9 @@ tag(const Arg *arg) { void tagmon(const Arg *arg) { - Monitor *m; - - if(!selmon->sel || !(m = idxtomon(arg->ui))) + if(!selmon->sel || !mons->next) return; - sendmon(selmon->sel, m); + sendmon(selmon->sel, dirtomon(arg->i)); } int