X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=f1d364127731e0c41d59d17da6fd1d711b37a464;hb=12ea925076c4f1c013502651b0be90c05e0febac;hp=5f6ffe3d2b65f063c0a37124d17e7cd376ca3628;hpb=b6aa84e51b315d9e6d6b111b36ac6901f505ddd8;p=dwm.git diff --git a/dwm.c b/dwm.c index 5f6ffe3..f1d3641 100644 --- a/dwm.c +++ b/dwm.c @@ -60,7 +60,7 @@ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */ enum { ClkLtSymbol = 64, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkLast }; /* clicks */ + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ /* typedefs */ typedef unsigned int uint; @@ -84,12 +84,12 @@ typedef struct { typedef struct Client Client; struct Client { char name[256]; + float mina, maxa; int x, y, w, h; int basew, baseh, incw, inch, maxw, maxh, minw, minh; - float mina, maxa; int bw, oldbw; - Bool isbanned, isfixed, isfloating, ismoved, isurgent; uint tags; + Bool isbanned, isfixed, isfloating, isurgent; Client *next; Client *snext; Window win; @@ -168,6 +168,7 @@ static void killclient(const Arg *arg); static void manage(Window w, XWindowAttributes *wa); static void mappingnotify(XEvent *e); static void maprequest(XEvent *e); +static void monocle(void); static void movemouse(const Arg *arg); static Client *nexttiled(Client *c); static void propertynotify(XEvent *e); @@ -178,6 +179,7 @@ static void restack(void); static void run(void); static void scan(void); static void setclientstate(Client *c, long state); +static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); static void spawn(const Arg *arg); @@ -186,8 +188,6 @@ static int textnw(const char *text, uint len); static void tile(void); static void togglebar(const Arg *arg); static void togglefloating(const Arg *arg); -static void togglelayout(const Arg *arg); -static void togglemax(const Arg *arg); static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); static void unmanage(Client *c); @@ -225,7 +225,6 @@ static void (*handler[LASTEvent]) (XEvent *) = { [UnmapNotify] = unmapnotify }; static Atom wmatom[WMLast], netatom[NetLast]; -static Bool ismax = False; static Bool otherwm, readin; static Bool running = True; static uint tagset[] = {1, 1}; /* after start, first tag is selected */ @@ -275,21 +274,17 @@ arrange(void) { for(c = clients; c; c = c->next) if(c->tags & tagset[seltags]) { /* is visible */ - if(ismax && !c->isfixed) { - XMoveResizeWindow(dpy, c->win, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw); - c->ismoved = True; - } - else if(!lt->arrange || c->isfloating) + if(!lt->arrange || c->isfloating) resize(c, c->x, c->y, c->w, c->h, True); c->isbanned = False; } else if(!c->isbanned) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); - c->isbanned = c->ismoved = True; + c->isbanned = True; } focus(NULL); - if(lt->arrange && !ismax) + if(lt->arrange) lt->arrange(); restack(); } @@ -312,7 +307,7 @@ buttonpress(XEvent *e) { Client *c; XButtonPressedEvent *ev = &e->xbutton; - click = ClkLast; + click = ClkRootWin; if(ev->window == barwin) { i = x = 0; do @@ -327,8 +322,10 @@ buttonpress(XEvent *e) { else click = ClkWinTitle; } - else if((c = getclient(ev->window))) + else if((c = getclient(ev->window))) { + focus(c); click = ClkClientWin; + } for(i = 0; i < LENGTH(buttons); i++) if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button @@ -416,8 +413,6 @@ configurerequest(XEvent *e) { if((c = getclient(ev->window))) { if(ev->value_mask & CWBorderWidth) c->bw = ev->border_width; - 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; @@ -505,7 +500,7 @@ drawbar(void) { } if(blw > 0) { dc.w = blw; - drawtext(lt->symbol, dc.norm, ismax); + drawtext(lt->symbol, dc.norm, False); x = dc.x + dc.w; } else @@ -911,7 +906,8 @@ manage(Window w, XWindowAttributes *wa) { if(c->y + c->h + 2 * c->bw > sy + sh) c->y = sy + sh - c->h - 2 * c->bw; c->x = MAX(c->x, sx); - c->y = MAX(c->y, by == 0 ? bh : sy); + /* only fix client y-offset, if the client center might cover the bar */ + c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= wx) && (c->x + (c->w / 2) < wx + ww)) ? bh : sy); c->bw = borderpx; } @@ -964,6 +960,14 @@ maprequest(XEvent *e) { } void +monocle(void) { + Client *c; + + for(c = nexttiled(clients); c; c = nexttiled(c->next)) + resize(c, wx, wy, ww, wh, resizehints); +} + +void movemouse(const Arg *arg) { int x1, y1, ocx, ocy, di, nx, ny; uint dui; @@ -980,11 +984,6 @@ movemouse(const Arg *arg) { None, cursor[CurMove], CurrentTime) != GrabSuccess) return; XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); - if(x1 < c->x || x1 > c->x + c->w || y1 < c->y || y1 > c->y + c->h) { - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, 0, 0); - x1 = c->x + 1; - y1 = c->y + 1; - } for(;;) { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); switch (ev.type) { @@ -1096,11 +1095,11 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { w = MAX(w, c->minw); h = MAX(h, c->minh); - - if (c->maxw) + + if(c->maxw) w = MIN(w, c->maxw); - if (c->maxh) + if(c->maxh) h = MIN(h, c->maxh); } if(w <= 0 || h <= 0) @@ -1117,8 +1116,7 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { h = bh; if(w < bh) w = bh; - if(c->x != x || c->y != y || c->w != w || c->h != h || c->ismoved) { - c->ismoved = False; + if(c->x != x || c->y != y || c->w != w || c->h != h) { c->x = wc.x = x; c->y = wc.y = y; c->w = wc.width = w; @@ -1188,9 +1186,9 @@ restack(void) { drawbar(); if(!sel) return; - if(ismax || sel->isfloating || !lt->arrange) + if(sel->isfloating || !lt->arrange) XRaiseWindow(dpy, sel->win); - if(!ismax && lt->arrange) { + if(lt->arrange) { wc.stack_mode = Below; wc.sibling = barwin; for(c = stack; c; c = c->snext) @@ -1298,6 +1296,22 @@ setclientstate(Client *c, long state) { PropModeReplace, (unsigned char *)data, 2); } +void +setlayout(const Arg *arg) { + static Layout *prevlt = &layouts[1 % LENGTH(layouts)]; + + if(!arg || !arg->v || arg->v == lt) + lt = prevlt; + else { + prevlt = lt; + lt = (Layout *)arg->v; + } + if(sel) + arrange(); + else + drawbar(); +} + /* arg > 1.0 will set mfact absolutly */ void setmfact(const Arg *arg) { @@ -1379,7 +1393,7 @@ setup(void) { PropModeReplace, (unsigned char *) netatom, NetLast); /* select for events */ - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask + wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask |EnterWindowMask|LeaveWindowMask|StructureNotifyMask; XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); XSelectInput(dpy, root, wa.event_mask); @@ -1479,33 +1493,23 @@ togglefloating(const Arg *arg) { } void -togglelayout(const Arg *arg) { - if(arg && arg->v) - lt = (Layout *)arg->v; - else if(++lt == &layouts[LENGTH(layouts)]) - lt = &layouts[0]; - if(sel) - arrange(); - else - drawbar(); -} - -void -togglemax(const Arg *arg) { - ismax = !ismax; - arrange(); -} - -void toggletag(const Arg *arg) { - if(sel && (sel->tags ^= (arg->ui & TAGMASK))) + uint mask = sel->tags ^ (arg->ui & TAGMASK); + + if(sel && mask) { + sel->tags = mask; arrange(); + } } void toggleview(const Arg *arg) { - if((tagset[seltags] ^= (arg->ui & TAGMASK))) + uint mask = tagset[seltags] ^ (arg->ui & TAGMASK); + + if(mask) { + tagset[seltags] = mask; arrange(); + } } void @@ -1687,7 +1691,7 @@ void zoom(const Arg *arg) { Client *c = sel; - if(ismax || !lt->arrange || (sel && sel->isfloating)) + if(!lt->arrange || lt->arrange == monocle || (sel && sel->isfloating)) return; if(c == nexttiled(clients)) if(!c || !(c = nexttiled(c->next)))