X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=05c0199a19b86c04312adec0d9382c8f00c86b8e;hb=1edf6a7866ebe219bfa81a1b289fa5c8d0cdfbee;hp=29af1bd29499d67dbf7b212b822fef51a54ddc70;hpb=016dca4f694cb51c7db77aeeefcb55b8869f3842;p=dwm.git diff --git a/dwm.c b/dwm.c index 29af1bd..05c0199 100644 --- a/dwm.c +++ b/dwm.c @@ -59,10 +59,28 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ 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, ClkRootWin, ClkLast }; /* clicks */ /* typedefs */ typedef unsigned int uint; typedef unsigned long ulong; + +typedef union { + int i; + uint ui; + float f; + void *v; +} Arg; + +typedef struct { + uint click; + uint mask; + uint button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + typedef struct Client Client; struct Client { char name[256]; @@ -92,13 +110,6 @@ typedef struct { } font; } DC; /* draw context */ -typedef union { - int i; - uint ui; - float f; - void *v; -} Arg; - typedef struct { uint mod; KeySym keysym; @@ -157,12 +168,12 @@ 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 movemouse(Client *c); +static void movemouse(const Arg *arg); static Client *nexttiled(Client *c); static void propertynotify(XEvent *e); static void quit(const Arg *arg); static void resize(Client *c, int x, int y, int w, int h, Bool sizehints); -static void resizemouse(Client *c); +static void resizemouse(const Arg *arg); static void restack(void); static void run(void); static void scan(void); @@ -297,50 +308,32 @@ attachstack(Client *c) { void buttonpress(XEvent *e) { - uint i, mask; - int x; + uint i, x, click; Client *c; XButtonPressedEvent *ev = &e->xbutton; + click = ClkRootWin; if(ev->window == barwin) { - x = 0; - for(i = 0; i < LENGTH(tags); i++) { + i = x = 0; + do x += TEXTW(tags[i]); - if(ev->x < x) { - mask = 1 << i; - if(ev->button == Button1) { - if(ev->state & MODKEY) - tag((Arg*)&mask); - else - view((Arg*)&mask); - } - else if(ev->button == Button3) { - if(ev->state & MODKEY) - toggletag((Arg*)&mask); - else - toggleview((Arg*)&mask); - } - return; - } - } - if(ev->x < x + blw) { - if(ev->button == Button1) - togglelayout(NULL); - else if(ev->button == Button3) - togglemax(NULL); - } - } - else if((c = getclient(ev->window))) { - focus(c); - if(CLEANMASK(ev->state) != MODKEY || (ismax && !c->isfixed)) - return; - if(ev->button == Button1) - movemouse(c); - else if(ev->button == Button2) - togglefloating(NULL); - else if(ev->button == Button3 && !c->isfixed) - resizemouse(c); + while(ev->x >= x && ++i < LENGTH(tags)); + if(i < LENGTH(tags)) + click = i; + else if(ev->x < x + blw) + click = ClkLtSymbol; + else if(ev->x > wx + ww - TEXTW(stext)) + click = ClkStatusText; + else + click = ClkWinTitle; } + else if((c = getclient(ev->window))) + click = ClkClientWin; + + 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)) + buttons[i].func(&buttons[i].arg); } void @@ -971,12 +964,15 @@ maprequest(XEvent *e) { } void -movemouse(Client *c) { +movemouse(const Arg *arg) { int x1, y1, ocx, ocy, di, nx, ny; uint dui; + Client *c; Window dummy; XEvent ev; + if(!(c = sel)) + return; restack(); ocx = nx = c->x; ocy = ny = c->y; @@ -984,6 +980,11 @@ movemouse(Client *c) { 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) { @@ -1131,11 +1132,14 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { } void -resizemouse(Client *c) { +resizemouse(const Arg *arg) { int ocx, ocy; int nw, nh; + Client *c; XEvent ev; + if(!(c = sel)) + return; restack(); ocx = c->x; ocy = c->y; @@ -1317,12 +1321,12 @@ setup(void) { /* init screen */ screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); - initfont(FONT); + initfont(font); sx = 0; sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); - bh = dc.font.height + 2; + bh = dc.h = dc.font.height + 2; lt = layouts; updategeom(); @@ -1340,14 +1344,12 @@ setup(void) { cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); /* init appearance */ - dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR); - dc.norm[ColBG] = getcolor(NORMBGCOLOR); - dc.norm[ColFG] = getcolor(NORMFGCOLOR); - dc.sel[ColBorder] = getcolor(SELBORDERCOLOR); - dc.sel[ColBG] = getcolor(SELBGCOLOR); - dc.sel[ColFG] = getcolor(SELFGCOLOR); - initfont(FONT); - dc.h = bh; + dc.norm[ColBorder] = getcolor(normbordercolor); + dc.norm[ColBG] = getcolor(normbgcolor); + dc.norm[ColFG] = getcolor(normfgcolor); + dc.sel[ColBorder] = getcolor(selbordercolor); + dc.sel[ColBG] = getcolor(selbgcolor); + dc.sel[ColFG] = getcolor(selfgcolor); dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); dc.gc = XCreateGC(dpy, root, 0, 0); XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); @@ -1377,7 +1379,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); @@ -1554,10 +1556,10 @@ updategeom(void) { /* window area geometry */ if(XineramaIsActive(dpy)) { info = XineramaQueryScreens(dpy, &i); - wx = info[0].x_org; - wy = showbar && topbar ? info[0].y_org + bh : info[0].y_org; - ww = info[0].width; - wh = showbar ? info[0].height - bh : info[0].height; + wx = info[xidx].x_org; + wy = showbar && topbar ? info[xidx].y_org + bh : info[xidx].y_org; + ww = info[xidx].width; + wh = showbar ? info[xidx].height - bh : info[xidx].height; XFree(info); } else