X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=71d7e63f3b2d5c04953048fd717f8388d302725a;hp=5822944ebecc1b57aee26b71760ebfece928b1ae;hb=450b08dde2409846201175e226158ad4e2c61ea1;hpb=8420fb1cedf067ce230d5d69e5d4edb3031745e7 diff --git a/dwm.c b/dwm.c index 5822944..71d7e63 100644 --- a/dwm.c +++ b/dwm.c @@ -51,7 +51,7 @@ #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) #define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((int)((1LL << LENGTH(tags)) - 1)) +#define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height) /* enums */ @@ -121,8 +121,8 @@ typedef struct { } Layout; struct Monitor { - int screen_number; float mfact; + int num; int by; /* bar geometry */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ @@ -145,6 +145,7 @@ typedef struct { const char *title; unsigned int tags; Bool isfloating; + int monitor; } Rule; /* function declarations */ @@ -236,9 +237,10 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); /* variables */ +static const char broken[] = "broken"; static char stext[256], ntext[8]; static int screen; -static int sw, sh; /* X display screen geometry x, y, width, height */ +static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; @@ -269,26 +271,33 @@ static Window root; #include "config.h" /* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; }; +struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; /* function implementations */ void applyrules(Client *c) { + const char *class, *instance; unsigned int i; const Rule *r; + Monitor *m; XClassHint ch = { 0 }; /* rule matching */ c->isfloating = c->tags = 0; if(XGetClassHint(dpy, c->win, &ch)) { + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; for(i = 0; i < LENGTH(rules); i++) { 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->class || strstr(class, r->class)) + && (!r->instance || strstr(instance, r->instance))) { c->isfloating = r->isfloating; c->tags |= r->tags; + for(m = mons; m && m->num != r->monitor; m = m->next); + if(m) + c->mon = m; } } if(ch.res_class) @@ -371,7 +380,6 @@ void arrange(void) { Monitor *m; - /* optimise two loops into one, check focus(NULL) */ for(m = mons; m; m = m->next) showhide(m->stack); focus(NULL); @@ -411,9 +419,9 @@ buttonpress(XEvent *e) { } if(ev->window == selmon->barwin) { i = x = 0; - do + do { x += TEXTW(tags[i]); - while(ev->x >= x && ++i < LENGTH(tags)); + } while(ev->x >= x && ++i < LENGTH(tags)); if(i < LENGTH(tags)) { click = ClkTagBar; arg.ui = 1 << i; @@ -431,7 +439,7 @@ buttonpress(XEvent *e) { } for(i = 0; i < LENGTH(buttons); i++) if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) + && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); } @@ -876,7 +884,7 @@ getstate(Window w) { Atom real; status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p); + &real, &format, &n, &extra, (unsigned char **)&p); if(status != Success) return -1; if(n != 0) @@ -900,9 +908,7 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { if(name.encoding == XA_STRING) strncpy(text, (char *)name.value, size - 1); else { - if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success - && n > 0 && *list) - { + if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { strncpy(text, *list, size - 1); XFreeStringList(list); } @@ -968,6 +974,7 @@ initfont(const char *fontstr) { XFontSetExtents *font_extents; XFontStruct **xfonts; char **font_names; + dc.font.ascent = dc.font.descent = 0; font_extents = XExtentsOfFontSet(dc.font.set); n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); @@ -1012,8 +1019,8 @@ keypress(XEvent *e) { keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); for(i = 0; i < LENGTH(keys); i++) if(keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) keys[i].func(&(keys[i].arg)); } @@ -1047,6 +1054,7 @@ manage(Window w, XWindowAttributes *wa) { die("fatal: could not malloc() %u bytes\n", sizeof(Client)); *c = cz; c->win = w; + updatetitle(c); if(XGetTransientForHint(dpy, w, &trans)) t = wintoclient(trans); if(t) { @@ -1086,7 +1094,6 @@ manage(Window w, XWindowAttributes *wa) { updatesizehints(c); XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); grabbuttons(c, False); - updatetitle(c); if(!c->isfloating) c->isfloating = trans != None || c->isfixed; if(c->isfloating) @@ -1158,7 +1165,7 @@ movemouse(const Arg *arg) { nx = ocx + (ev.xmotion.x - x); ny = ocy + (ev.xmotion.y - y); if(snap && nx >= selmon->wx && nx <= selmon->wx + selmon->ww - && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) { + && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) { if(abs(selmon->wx - nx) < snap) nx = selmon->wx; else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) @@ -1168,15 +1175,14 @@ movemouse(const Arg *arg) { else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) ny = selmon->wy + selmon->wh - HEIGHT(c); if(!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) + && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) togglefloating(NULL); } if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, nx, ny, c->w, c->h, True); break; } - } - while(ev.type != ButtonRelease); + } while(ev.type != ButtonRelease); XUngrabPointer(dpy, CurrentTime); if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { sendmon(c, m); @@ -1270,7 +1276,7 @@ resizemouse(const Arg *arg) { ocx = c->x; ocy = c->y; if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize], CurrentTime) != GrabSuccess) + None, cursor[CurResize], CurrentTime) != GrabSuccess) return; XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); do { @@ -1285,17 +1291,17 @@ resizemouse(const Arg *arg) { nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); 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) { + && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) + { if(!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) togglefloating(NULL); } if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, nw, nh, True); break; } - } - while(ev.type != ButtonRelease); + } while(ev.type != ButtonRelease); XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); XUngrabPointer(dpy, CurrentTime); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); @@ -1338,7 +1344,7 @@ run(void) { XSync(dpy, False); while(running && !XNextEvent(dpy, &ev)) if(handler[ev.type]) - (handler[ev.type])(&ev); /* call handler */ + handler[ev.type](&ev); /* call handler */ } void @@ -1465,8 +1471,8 @@ setup(void) { /* select for events */ wa.cursor = cursor[CurNormal]; wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask - |EnterWindowMask|LeaveWindowMask|StructureNotifyMask - |PropertyChangeMask; + |EnterWindowMask|LeaveWindowMask|StructureNotifyMask + |PropertyChangeMask; XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); XSelectInput(dpy, root, wa.event_mask); grabkeys(); @@ -1698,7 +1704,7 @@ updategeom(void) { #ifdef XINERAMA if(XineramaIsActive(dpy)) { for(i = 0, m = newmons; m; m = m->next, i++) { - m->screen_number = info[i].screen_number; + m->num = info[i].screen_number; m->mx = m->wx = info[i].x_org; m->my = m->wy = info[i].y_org; m->mw = m->ww = info[i].width; @@ -1710,7 +1716,7 @@ updategeom(void) { #endif /* XINERAMA */ /* default monitor setup */ { - m->screen_number = 0; + m->num = 0; m->mx = m->wx = 0; m->my = m->wy = 0; m->mw = m->ww = sw; @@ -1814,6 +1820,8 @@ void updatetitle(Client *c) { if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if(c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); } void