From 8dffa5a1e770a13c1ce140ef026dbfe13947727e Mon Sep 17 00:00:00 2001 From: jon Date: Sun, 13 Jan 2019 18:28:55 -0600 Subject: [PATCH] Merged warp patch --- drw.o | Bin 9512 -> 9512 bytes dwm | Bin 46392 -> 52112 bytes dwm.c | 26 + dwm.c.orig | 2306 ---------------------------------------------------- dwm.o | Bin 54944 -> 60016 bytes util.o | Bin 1992 -> 1992 bytes 6 files changed, 26 insertions(+), 2306 deletions(-) delete mode 100644 dwm.c.orig diff --git a/drw.o b/drw.o index 1d14d09d82f040d2dd6491f3a6106b14064a18e4..7071148519da17f5bd7818adec2193c31a5e2f99 100644 GIT binary patch delta 853 zcmZ4CwZdzI7>}%xo}q$~fuV(=k)f%AMo?;sf=6PBf`uMXT-R)~F;6QGBg^ES67E2f zQBoX8N=ky*iIU=yEDQ_`fC3XmE_DToQ8 zNV1lU5NVdlflyg-B-tjoY$H@w5=r(pTy~=r$ekypFl}#Tf|)NUjp_bva9KyFtTdAO zm*BF6P+4S`D>1`NUMQ^(wEZGfjRukl`k(*<0$@nWKy23s@?atJ0xoL^mDNO&HD(3r z1nEtbaR-O05s(MdJDVLW36wnu)vJdjo6iB0{U`$p8BSTukXZ^>6DSLEeCM delta 853 zcmZY6KTE?v6aerfT5P3Dp&GAE+UQh=Hn|j`3J#S*q+9(40UbpOet`-dbSoJOI&}~_ zS_*<=N5{H}Ah@}@3woD(_ju5Q97lfdA9vI4wEMK3cX@+*VZd9#K@fVivx{@@G`{v) z4e`Iu=gs^uZ(7OAP9%1d*Hw4x{Xm_S8S2L(Qi}^x=*y3(Ydh`rMDUqeb~^tfZPVrtE|=^ zN8U`%UA>t{jOn>@{z1CWTs3ElRQtrpFVG{R*_`fGsHog3(GF@Gv_kX_wGVnsw797& sPeAGYcTkt0CnWbC-_ES6sXU?)z8wdpH*es(#GrMOd#U@*N7ZrWA3ER=F8}}l diff --git a/dwm b/dwm index b77b9aa1fe4cbfcf847981aa54f2dae37973f44f..2905a4c9fbe0b9fc27fd4b11078c065479625050 100755 GIT binary patch literal 52112 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 literal 46392 zcmeFadwf$>)<1mG3xrz|m1;$ls6|@^Z4j^lsyS^!Pa%as3ltDZX$viuwzdfrMJT2P zj)y8UI1bKDp23-M93Am8h^SB~P{3OOM^RMj{e*y4&{APEzwg@noc6$w-}}7(y#KtO z4`l6i*=w)8_HFIGPns1T@Ax>ANzk7-;SPaex40OIe+oj~KXnN~a0wYgAADXV3=(>Q zoQVIroJ&jTuuD^|L$jtP9xws_GvYWQBhJMVIvmW&f(~^H2~v4Ik4sB(xNjXtbtnjS zMxcCTYug_g3g~AE9Tr$Qz4}rP^?YO=oP_UA3gGx+NxVduzHhzlFgYkjg>@ZYpNK3AaJ4)|M9&= zKQ6m**$V>)FW|%Oek3k=Z3SCTo0Gx6$`bae9 z#pwNF(Cru$7n6S@hW&{#^sJ6y=b;$&8WMv(Ee3r6d~P@RT~Bt#u>T)1=ru9?=8Hie zAERDh#GoIKVgHpe{I)2Doqs|FFV-$;G3;Crqui-6+VN}*J*6?~b#n~+e;-57iWv3! zJO({8hW_C(h6W|IZlm|A-;~j~Mk@7=wNy2K~_( z^=*kkUmwGsrWpSJC9cE{!q1YGc^>WDGqOG3>l62HhM({~Iy<_U{N_k(Kc5?;+_5qAJ7U=Lj~IS$Bn!LWhcmR1W75WM7LtN+S zImhg@2qnSu=>p>QLWhF_^wGlHxeFFmRnDyq6x9Ug&J_xCN&_>>D@&@Dh=D*&`MhAD zv{oq02Qg17uM8kf0(rigsz6n7RR!mbuc|3sP*WAGED;LF*OZp#BWL9TZ+UG%D4bZj zw79CIw4e%!+NFzxx#gARAiGN|N&}@(Q(amUSSl1wDy<867ME6nl~YqR&sT-QN^69| zX_bqLs<}ZzVO~+~J(`fav^G#vwN&TiFRd&lezz#BEP%?M0QmIswtr|$$Fu* zrj`~5U|mJ2P&l=8eobj@83g8471fl$5!Gk`E}U0YQa-=D6oyp`bLYeTLSZgBw^9sL zE#e}29e8bfoHnhJOk~CK=3~uB?MZ#2vP5f)sYT_r-Db}ys;Ta_ntDS{HtRsy6;-vR z?y4n~um{<*tE!iZXcOX9pdz`I)j>3Vez3Z_swPnDttu{}iovVd6-BkR;D~ix))E#SzDr?Dfj22#-?5fK7g3qcPU!5RBt~xg0%(4A$3RAtGip1Mm=O}iWU{o(02$rmRl

hcny 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 diff --git a/dwm.c b/dwm.c index 96db14a..39a7ecd 100644 --- a/dwm.c +++ b/dwm.c @@ -245,6 +245,7 @@ static void updatewindowtype(Client *c); static void updatetitle(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); +static void warp(const Client *c); static pid_t winpid(Window w); static Client *wintoclient(Window w); static Monitor *wintomon(Window w); @@ -951,6 +952,7 @@ focusmon(const Arg *arg) in gedit and anjuta */ selmon = m; focus(NULL); + warp(selmon->sel); } void @@ -1525,6 +1527,8 @@ restack(Monitor *m) } XSync(dpy, False); while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + if (m == selmon && (m->tagset[m->seltags] & m->sel->tags)) + warp(m->sel); } void @@ -2384,6 +2388,28 @@ swallowingclient(Window w) return NULL; } +void +warp(const Client *c) +{ + int x, y; + + if (!c) { + XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2); + return; + } + + if (!getrootptr(&x, &y) || + (x > c->x - c->bw && + y > c->y - c->bw && + x < c->x + c->w + c->bw*2 && + y < c->y + c->h + c->bw*2) || + (y > c->mon->by && y < c->mon->by + bh) || + (c->mon->topbar && !y)) + return; + + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2); +} + Client * wintoclient(Window w) { diff --git a/dwm.c.orig b/dwm.c.orig deleted file mode 100644 index dd3595e..0000000 --- a/dwm.c.orig +++ /dev/null @@ -1,2306 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TAGSLENGTH (LENGTH(tags)) -#define TEXTW(X) (drw_text(drw, 0, 0, 0, 0, (X), 0) + drw->fonts[0]->h) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel, SchemeLast }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetDesktopNames, NetDesktopViewport, NetNumberOfDesktops, NetCurrentDesktop, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -typedef struct Pertag Pertag; -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; - Pertag *pertag; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clearurgent(Client *c); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -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(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setcurrentdesktop(void); -static void setdesktopnames(void); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setnumdesktops(void); -static void setup(void); -static void setviewport(void); -static void showhide(Client *c); -static void sigchld(int unused); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatecurrentdesktop(void); -static int updategeom(void); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatewindowtype(Client *c); -static void updatetitle(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -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; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static ClrScheme scheme[SchemeLast]; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -struct Pertag { - unsigned int curtag, prevtag; /* current and previous tag */ - int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ - float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ - unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ - const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ - Bool showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ - Client *prevzooms[LENGTH(tags) + 1]; /* store zoom information */ -}; - -/* compile-time check if all tags fit into an unsigned int bit array. */ -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 = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - 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 || 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) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - unsigned int occ = 0; - for(c = m->clients; c; c = c->next) - occ |= c->tags; - do { - /* do not reserve space for vacant tags */ - if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - x += TEXTW(tags[i]); - } while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + blw) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(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 - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < SchemeLast; i++) { - drw_clr_free(scheme[i].border); - drw_clr_free(scheme[i].bg); - drw_clr_free(scheme[i].fg); - } - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clearurgent(Client *c) -{ - XWMHints *wmh; - - c->isurgent = 0; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - int i; - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (!ISVISIBLE(c)) { - c->mon->seltags ^= 1; - c->mon->tagset[c->mon->seltags] = c->tags; - for(i=0; !(c->tags & 1 << i); i++); - view(&(Arg){.ui = 1 << i}); - } - pop(c); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - if (!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag)))) - die("fatal: could not malloc() %u bytes\n", sizeof(Pertag)); - m->pertag->curtag = m->pertag->prevtag = 1; - for(i=0; i <= LENGTH(tags); i++) { - /* init nmaster */ - m->pertag->nmasters[i] = m->nmaster; - - /* init mfacts */ - m->pertag->mfacts[i] = m->mfact; - - /* init layouts */ - m->pertag->ltidxs[i][0] = m->lt[0]; - m->pertag->ltidxs[i][1] = m->lt[1]; - m->pertag->sellts[i] = m->sellt; - - /* init showbar */ - m->pertag->showbars[i] = m->showbar; - - /* swap focus and zoomswap*/ - m->pertag->prevzooms[i] = NULL; - } - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, xx, w, dx; - unsigned int i, occ = 0, urg = 0; - Client *c; - - dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4; - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - /* do not draw vacant tags */ - if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) - continue; - w = TEXTW(tags[i]); - drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i); - drw_rect(drw, x + 1, 1, dx, dx, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - 0, urg & 1 << i); - x += w; - } - w = blw = TEXTW(m->ltsymbol); - drw_setscheme(drw, &scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, m->ltsymbol, 0); - x += w; - xx = x; - if (m == selmon) { /* status is only drawn on selected monitor */ - w = TEXTW(stext); - x = m->ww - w; - if (x < xx) { - x = xx; - w = m->ww - xx; - } - drw_text(drw, x, 0, w, bh, stext, 0); - } else - x = m->ww; - if ((w = x - xx) > bh) { - x = xx; - if (m->sel) { - drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, m->sel->name, 0); - drw_rect(drw, x + 1, 1, dx, dx, m->sel->isfixed, m->sel->isfloating, 0); - } else { - drw_setscheme(drw, &scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 0, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - /* was if (selmon->sel) */ - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - clearurgent(c); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel].border->pix); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); /* s/1/0/ fixes input focus issues - in gedit and anjuta */ - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - XGetTextProperty(dpy, w, &name, atom); - if (!name.nitems) - return 0; - if (name.encoding == XA_STRING) - strncpy(text, (char *)name.value, size - 1); - else { - if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (focused) { - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } else - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - KeyCode code; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < LENGTH(keys); i++) - if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, - True, GrabModeAsync, GrabModeAsync); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - 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) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) - c->x = c->mon->mx + c->mon->mw - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) - c->y = c->mon->my + c->mon->mh - HEIGHT(c); - c->x = MAX(c->x, c->mon->mx); - /* only fix client y-offset, if the client center might cover the bar */ - c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) - && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm].border->pix); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa)) - return; - if (wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (nx >= selmon->wx && nx <= selmon->wx + selmon->ww - && 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) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - 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)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - updatesizehints(c); - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - unsigned int n; - unsigned int gapoffset; - unsigned int gapincr; - Client *nbc; - - wc.border_width = c->bw; - - /* Get number of clients for the selected monitor */ - for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); - - /* Do nothing if layout is floating */ - if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { - gapincr = gapoffset = 0; - } else { - /* Remove border and gap if layout is monocle or only one client */ - if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { - gapoffset = 0; - gapincr = -2 * borderpx; - wc.border_width = 0; - } else { - gapoffset = gappx; - gapincr = 2 * gappx; - } - } - - c->oldx = c->x; c->x = wc.x = x + gapoffset; - c->oldy = c->y; c->y = wc.y = y + gapoffset; - c->oldw = c->w; c->w = wc.width = w - gapincr; - c->oldh = c->h; c->h = wc.height = h - gapincr; - - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (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, 1); - break; - } - } 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)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} -void -setcurrentdesktop(void){ - long data[] = { 0 }; - XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); -} - -void -setdesktopnames(void){ - XTextProperty text; - Xutf8TextListToTextProperty(dpy, tags, TAGSLENGTH, XUTF8StringStyle, &text); - XSetTextProperty(dpy, root, &text, netatom[NetDesktopNames]); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) { - selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; - } - if (arg && arg->v) - selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutly */ -void -setmfact(const Arg *arg) -{ - float f; - - 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) - return; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); -} -void -setnumdesktops(void){ - long data[] = { TAGSLENGTH }; - XChangeProperty(dpy, root, netatom[NetNumberOfDesktops], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); -} - -void -setup(void) -{ - XSetWindowAttributes wa; - - /* clean up any zombies immediately */ - sigchld(0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - drw_load_fonts(drw, fonts, LENGTH(fonts)); - if (!drw->fontcount) - die("no fonts could be loaded.\n"); - bh = drw->fonts[0]->h + 2; - updategeom(); - /* init atoms */ - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - netatom[NetDesktopViewport] = XInternAtom(dpy, "_NET_DESKTOP_VIEWPORT", False); - netatom[NetNumberOfDesktops] = XInternAtom(dpy, "_NET_NUMBER_OF_DESKTOPS", False); - netatom[NetCurrentDesktop] = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False); - netatom[NetDesktopNames] = XInternAtom(dpy, "_NET_DESKTOP_NAMES", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme[SchemeNorm].border = drw_clr_create(drw, normbordercolor); - scheme[SchemeNorm].bg = drw_clr_create(drw, normbgcolor); - scheme[SchemeNorm].fg = drw_clr_create(drw, normfgcolor); - scheme[SchemeSel].border = drw_clr_create(drw, selbordercolor); - scheme[SchemeSel].bg = drw_clr_create(drw, selbgcolor); - scheme[SchemeSel].fg = drw_clr_create(drw, selfgcolor); - /* init bars */ - updatebars(); - updatestatus(); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - setnumdesktops(); - setcurrentdesktop(); - setdesktopnames(); - setviewport(); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select for events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask|PointerMotionMask - |EnterWindowMask|LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -setviewport(void){ - long data[] = { 0, 0 }; - XChangeProperty(dpy, root, netatom[NetDesktopViewport], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 2); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) - die("can't install SIGCHLD handler:"); - while (0 < waitpid(-1, NULL, WNOHANG)); -} - -void -spawn(const Arg *arg) -{ - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); - fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); - perror(" failed"); - exit(EXIT_SUCCESS); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } - updatecurrentdesktop(); -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - int i; - - if (newtagset) { - if (newtagset == ~0) { - selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->pertag->curtag = 0; - } - /* test if the user did not select the same tag */ - if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { - selmon->pertag->prevtag = selmon->pertag->curtag; - for (i=0; !(newtagset & 1 << i); i++) ; - selmon->pertag->curtag = i + 1; - } - selmon->tagset[selmon->seltags] = newtagset; - - /* apply settings for this view */ - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->pix); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - /* The server grab construct avoids race conditions. */ - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -void -updatecurrentdesktop(void){ - long rawdata[] = { selmon->tagset[selmon->seltags] }; - int i=0; - while(*rawdata >> i+1){ - i++; - } - long data[] = { i }; - XChangeProperty(dpy, root, netatom[NetCurrentDesktop], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - if (n <= nn) { - for (i = 0; i < (nn - n); i++) { /* new monitors available */ - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || (unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh)) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - } else { - /* less monitors available nn < n */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while (m->clients) { - dirty = 1; - c = m->clients; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - } - free(unique); - } else -#endif /* XINERAMA */ - /* default monitor setup */ - { - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->minw && c->maxh && c->minh - && c->maxw == c->minw && c->maxh == c->minh); -} - -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 -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - int i; - unsigned int tmptag; - - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) { - selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - if (arg->ui == ~0) - selmon->pertag->curtag = 0; - else { - for (i=0; !(arg->ui & 1 << i); i++) ; - selmon->pertag->curtag = i + 1; - } - } else { - tmptag = selmon->pertag->prevtag; - selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->pertag->curtag = tmptag; - } - selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; - selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; - selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; - selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; - if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) - togglebar(NULL); - focus(NULL); - arrange(selmon); - updatecurrentdesktop(); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running\n"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) - return; - if (c == nexttiled(selmon->clients)) - if (!c || !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION "\n"); - else if (argc != 1) - die("usage: dwm [-v]\n"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display\n"); - checkotherwm(); - setup(); - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/dwm.o b/dwm.o index e467f5d7667fd746b55233bc037162829f33cc7f..ec83d904ca725b1e82627ff0e04430233cbeb01d 100644 GIT binary patch literal 60016 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 diff --git a/util.o b/util.o index b73b2dad1e80bc3fa4f154865264015bc23ed90b..941c17e4cfcd761c066e0df04fa9e7155866d5a4 100644 GIT binary patch delta 97 zcmX@Xe}aF5H>0ePo}q$~fuV(=k)f%AMo?;sf=6PBf`uMXT-R)K2BQQMBg^DQW^o`n nlUW}~o@CaSWMN=n-~-}6{~_Q#kPQMXlLc9TDmQDg%x4Aw&}|vt delta 97 zcmX@Xe}aF5H>0efo}q$~fuV(gsezG#Mo?;sf=6PBf`uMXT-R`O2BQQMBh%zYW^o`n nlUW}~o@CaSWMW`o-~-}6{~_Q#kPQM%lLc9TDmQDg%x4Aw%zPQj