X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=dbc49972399c1acd54018a8191880459fa7a8545;hp=4a826d9f34c01787ef3286d9c9b59750ff192e30;hb=88e6eb4a3a3552d6b503481164aafc1c994d5a50;hpb=92f3c181c3c3f106361a9c9f7e354ce29ae37e62 diff --git a/dwm.c b/dwm.c index 4a826d9..dbc4997 100644 --- a/dwm.c +++ b/dwm.c @@ -69,7 +69,6 @@ struct Client { int x, y, w, h; int basew, baseh, incw, inch, maxw, maxh, minw, minh; int minax, maxax, minay, maxay; - long flags; int bw, oldbw; Bool isbanned, isfixed, isfloating, ismoved, isurgent; uint tags; @@ -167,7 +166,7 @@ void setmfact(const void *arg); void setup(void); void spawn(const void *arg); void tag(const void *arg); -uint textnw(const char *text, uint len); +int textnw(const char *text, uint len); void tile(void); void togglebar(const void *arg); void togglefloating(const void *arg); @@ -183,7 +182,6 @@ void updatesizehints(Client *c); void updatetitle(Client *c); void updatewmhints(Client *c); void view(const void *arg); -void viewprevtag(const void *arg); int xerror(Display *dpy, XErrorEvent *ee); int xerrordummy(Display *dpy, XErrorEvent *ee); int xerrorstart(Display *dpy, XErrorEvent *ee); @@ -298,7 +296,8 @@ attachstack(Client *c) { void buttonpress(XEvent *e) { - uint i, x, mask; + uint i, mask; + int x; Client *c; XButtonPressedEvent *ev = &e->xbutton; @@ -419,7 +418,9 @@ configurerequest(XEvent *e) { if((c = getclient(ev->window))) { if(ev->value_mask & CWBorderWidth) c->bw = ev->border_width; - if(c->isfixed || c->isfloating || !lt->arrange) { + if(ismax && !c->isbanned && !c->isfixed) + XMoveResizeWindow(dpy, c->win, wx, wy, ww - 2 * c->bw, wh + 2 * c->bw); + else if(c->isfloating || !lt->arrange) { if(ev->value_mask & CWX) c->x = sx + ev->x; if(ev->value_mask & CWY) @@ -551,8 +552,7 @@ drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]) { void drawtext(const char *text, ulong col[ColLast], Bool invert) { - int x, y, w, h; - uint len, olen; + int i, x, y, h, len, olen; XRectangle r = { dc.x, dc.y, dc.w, dc.h }; char buf[256]; @@ -563,22 +563,15 @@ drawtext(const char *text, ulong col[ColLast], Bool invert) { olen = strlen(text); len = MIN(olen, sizeof buf); memcpy(buf, text, len); - w = 0; h = dc.font.ascent + dc.font.descent; y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; x = dc.x + (h / 2); /* shorten text if necessary */ - for(; len && (w = textnw(buf, len)) > dc.w - h; len--); + for(; len && (i = textnw(buf, len)) > dc.w - h; len--); if(!len) return; - if(len < olen) { - if(len > 1) - buf[len - 1] = '.'; - if(len > 2) - buf[len - 2] = '.'; - if(len > 3) - buf[len - 3] = '.'; - } + if(len < olen) + for(i = len; i >= MAX(0, len - 3); buf[i--] = '.'); XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); if(dc.font.set) XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); @@ -619,7 +612,7 @@ expose(XEvent *e) { void focus(Client *c) { - if(!c || (c && c->isbanned)) + if(!c || c->isbanned) for(c = stack; c && c->isbanned; c = c->snext); if(sel && sel != c) { grabbuttons(sel, False); @@ -629,14 +622,12 @@ focus(Client *c) { detachstack(c); attachstack(c); grabbuttons(c, True); - } - sel = c; - if(c) { XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } else XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + sel = c; drawbar(); } @@ -746,8 +737,7 @@ void grabbuttons(Client *c, Bool focused) { int i, j; uint buttons[] = { Button1, Button2, Button3 }; - uint modifiers[] = { MODKEY, MODKEY|LockMask, MODKEY|numlockmask, - MODKEY|numlockmask|LockMask} ; + uint modifiers[] = { MODKEY, MODKEY|LockMask, MODKEY|numlockmask, MODKEY|numlockmask|LockMask }; XUngrabButton(dpy, AnyButton, AnyModifier, c->win); if(focused) @@ -946,6 +936,8 @@ manage(Window w, XWindowAttributes *wa) { applyrules(c); if(!c->isfloating) c->isfloating = (rettrans == Success) || c->isfixed; + if(c->isfloating) + XRaiseWindow(dpy, c->win); attach(c); attachstack(c); XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ @@ -1124,7 +1116,7 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { if(w < bh) w = bh; if(c->x != x || c->y != y || c->w != w || c->h != h || c->ismoved) { - c->isbanned = c->ismoved = False; + c->ismoved = False; c->x = wc.x = x; c->y = wc.y = y; c->w = wc.width = w; @@ -1306,7 +1298,7 @@ void setmfact(const void *arg) { double d = *((double*) arg); - if(!d || lt->arrange) + if(!d || !lt->arrange) return; d = d < 1.0 ? d + mfact : d - 1.0; if(d < 0.1 || d > 0.9) @@ -1317,7 +1309,8 @@ setmfact(const void *arg) { void setup(void) { - uint i, w; + uint i; + int w; XSetWindowAttributes wa; /* init screen */ @@ -1422,7 +1415,7 @@ tag(const void *arg) { } } -uint +int textnw(const char *text, uint len) { XRectangle r; @@ -1446,13 +1439,13 @@ tile(void) { /* master */ c = nexttiled(clients); mw = mfact * ww; - resize(c, wx, wy, ((n == 1) ? ww : mw) - 2 * c->bw, wh - 2 * c->bw, resizehints); + resize(c, wx, wy, (n == 1 ? ww : mw) - 2 * c->bw, wh - 2 * c->bw, resizehints); if(--n == 0) return; /* tile stack */ - x = (wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : ww - mw; + x = (wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : wx + mw; y = wy; w = (wx + mw > c->x + c->w) ? wx + ww - x : ww - mw; h = wh / n; @@ -1570,8 +1563,8 @@ updatebar(void) { void updategeom(void) { - int i; #ifdef XINERAMA + int i; XineramaScreenInfo *info = NULL; /* window area geometry */ @@ -1601,42 +1594,40 @@ updatesizehints(Client *c) { long msize; XSizeHints size; - if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) - size.flags = PSize; - c->flags = size.flags; - if(c->flags & PBaseSize) { + XGetWMNormalHints(dpy, c->win, &size, &msize); + if(size.flags & PBaseSize) { c->basew = size.base_width; c->baseh = size.base_height; } - else if(c->flags & PMinSize) { + else if(size.flags & PMinSize) { c->basew = size.min_width; c->baseh = size.min_height; } else c->basew = c->baseh = 0; - if(c->flags & PResizeInc) { + if(size.flags & PResizeInc) { c->incw = size.width_inc; c->inch = size.height_inc; } else c->incw = c->inch = 0; - if(c->flags & PMaxSize) { + if(size.flags & PMaxSize) { c->maxw = size.max_width; c->maxh = size.max_height; } else c->maxw = c->maxh = 0; - if(c->flags & PMinSize) { + if(size.flags & PMinSize) { c->minw = size.min_width; c->minh = size.min_height; } - else if(c->flags & PBaseSize) { + else if(size.flags & PBaseSize) { c->minw = size.base_width; c->minh = size.base_height; } else c->minw = c->minh = 0; - if(c->flags & PAspect) { + if(size.flags & PAspect) { c->minax = size.min_aspect.x; c->maxax = size.max_aspect.x; c->minay = size.min_aspect.y; @@ -1669,16 +1660,9 @@ updatewmhints(Client *c) { void view(const void *arg) { - if(*(int *)arg & TAGMASK) { - seltags ^= 1; /* toggle sel tagset */ - tagset[seltags] = *(int *)arg & TAGMASK; - arrange(); - } -} - -void -viewprevtag(const void *arg) { seltags ^= 1; /* toggle sel tagset */ + if(arg && (*(int *)arg & TAGMASK)) + tagset[seltags] = *(int *)arg & TAGMASK; arrange(); }