X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=267659f3835c9da586a022f170280e4229beaa80;hp=613a029ba8c02eba5411610bb0b09e3f1e37f681;hb=61c3095f2f9b35a0b330b37c172daefae0278663;hpb=a9e145fe6d8af4848e6706131ac41e99003cd997 diff --git a/dwm.c b/dwm.c index 613a029..267659f 100644 --- a/dwm.c +++ b/dwm.c @@ -136,6 +136,7 @@ struct Monitor { Client *stack; Monitor *next; Window barwin; + Layout *lt[2]; }; typedef struct { @@ -237,7 +238,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; @@ -261,9 +262,9 @@ static Bool running = True; static Cursor cursor[CurLast]; static Display *dpy; 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); @@ -375,8 +376,8 @@ arrange(void) { showhide(m->stack); focus(NULL); for(m = mons; m; m = m->next) { - if(lt[m->sellt]->arrange) - lt[m->sellt]->arrange(m); + if(m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); restack(m); } } @@ -455,7 +456,7 @@ cleanup(void) { Monitor *m; view(&a); - lt[selmon->sellt] = &foo; + selmon->lt[selmon->sellt] = &foo; for(m = mons; m; m = m->next) while(m->stack) unmanage(m->stack); @@ -546,7 +547,7 @@ configurerequest(XEvent *e) { if((c = wintoclient(ev->window))) { if(ev->value_mask & CWBorderWidth) c->bw = ev->border_width; - else if(c->isfloating || !lt[selmon->sellt]->arrange) { + else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) { m = c->mon; if(ev->value_mask & CWX) c->x = m->mx + ev->x; @@ -625,9 +626,10 @@ Monitor * dirtomon(int dir) { Monitor *m = NULL; - if(dir > 0) + if(dir > 0) { if(!(m = selmon->next)) m = mons; + } else { if(selmon == mons) for(m = mons; m->next; m = m->next); @@ -666,7 +668,7 @@ drawbar(Monitor *m) { } if(blw > 0) { dc.w = blw; - drawtext(lt[m->sellt]->symbol, dc.norm, False); + drawtext(m->lt[m->sellt]->symbol, dc.norm, False); x = dc.x + dc.w; } else @@ -902,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); } @@ -927,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); } @@ -1166,11 +1170,11 @@ movemouse(const Arg *arg) { ny = selmon->wy; else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) ny = selmon->wy + selmon->wh - HEIGHT(c); - if(!c->isfloating && lt[selmon->sellt]->arrange + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) togglefloating(NULL); } - if(!lt[selmon->sellt]->arrange || c->isfloating) + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, nx, ny, c->w, c->h, True); break; } @@ -1285,11 +1289,11 @@ resizemouse(const Arg *arg) { nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) { - if(!c->isfloating && lt[selmon->sellt]->arrange + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) togglefloating(NULL); } - if(!lt[selmon->sellt]->arrange || c->isfloating) + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, nw, nh, True); break; } @@ -1314,9 +1318,9 @@ restack(Monitor *m) { drawbars(); if(!m->sel) return; - if(m->sel->isfloating || !lt[m->sellt]->arrange) + if(m->sel->isfloating || !m->lt[m->sellt]->arrange) XRaiseWindow(dpy, m->sel->win); - if(lt[m->sellt]->arrange) { + if(m->lt[m->sellt]->arrange) { wc.stack_mode = Below; wc.sibling = m->barwin; for(c = m->stack; c; c = c->snext) @@ -1384,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); @@ -1392,10 +1396,10 @@ setclientstate(Client *c, long state) { void setlayout(const Arg *arg) { - if(!arg || !arg->v || arg->v != lt[selmon->sellt]) + if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) selmon->sellt ^= 1; if(arg && arg->v) - lt[selmon->sellt] = (Layout *)arg->v; + selmon->lt[selmon->sellt] = (Layout *)arg->v; if(selmon->sel) arrange(); else @@ -1407,7 +1411,7 @@ void setmfact(const Arg *arg) { float f; - if(!arg || !lt[selmon->sellt]->arrange) + if(!arg || !selmon->lt[selmon->sellt]->arrange) return; f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; if(f < 0.1 || f > 0.9) @@ -1429,8 +1433,6 @@ setup(void) { sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); bh = dc.h = dc.font.height + 2; - lt[0] = &layouts[0]; - lt[1] = &layouts[1 % LENGTH(layouts)]; updategeom(); /* init atoms */ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -1480,7 +1482,7 @@ showhide(Client *c) { return; if(ISVISIBLE(c)) { /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); - if(!lt[c->mon->sellt]->arrange || c->isfloating) + if(!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, c->w, c->h, False); showhide(c->snext); } @@ -1521,7 +1523,7 @@ tag(const Arg *arg) { void tagmon(const Arg *arg) { if(!selmon->sel || !mons->next) - return + return; sendmon(selmon->sel, dirtomon(arg->i)); } @@ -1691,7 +1693,8 @@ updategeom(void) { #endif /* XINERAMA */ /* allocate monitor(s) for the new geometry setup */ for(i = 0; i < n; i++) { - m = (Monitor *)malloc(sizeof(Monitor)); + if(!(m = (Monitor *)malloc(sizeof(Monitor)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Monitor)); m->next = newmons; newmons = m; } @@ -1726,6 +1729,8 @@ updategeom(void) { m->mfact = mfact; m->showbar = SHOWBAR; m->topbar = TOPBAR; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; updatebarpos(m); } /* reassign left over clients of disappeared monitors */ @@ -1912,8 +1917,8 @@ void zoom(const Arg *arg) { Client *c = selmon->sel; - if(!lt[selmon->sellt]->arrange - || lt[selmon->sellt]->arrange == monocle + if(!selmon->lt[selmon->sellt]->arrange + || selmon->lt[selmon->sellt]->arrange == monocle || (selmon->sel && selmon->sel->isfloating)) return; if(c == nexttiled(selmon->clients))