From 5fc22a70f04510e6fec944344d662a800c609d71 Mon Sep 17 00:00:00 2001 From: lucy Date: Wed, 18 Mar 2026 10:45:27 +0100 Subject: [PATCH] add restartsig patch --- config.def.h | 1 + config.def.h.orig | 161 ++ dwm | Bin 89280 -> 89416 bytes dwm.1 | 10 + dwm.1.orig | 199 +++ dwm.c | 25 +- dwm.c.orig | 4196 +++++++++++++++++++++++---------------------- dwm.c.rej | 81 +- dwm.o | Bin 84528 -> 85128 bytes 9 files changed, 2604 insertions(+), 2069 deletions(-) create mode 100644 config.def.h.orig create mode 100644 dwm.1.orig diff --git a/config.def.h b/config.def.h index 9afbe99..5c85f58 100644 --- a/config.def.h +++ b/config.def.h @@ -140,6 +140,7 @@ static const Key keys[] = { TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, }; /* button definitions */ diff --git a/config.def.h.orig b/config.def.h.orig new file mode 100644 index 0000000..9afbe99 --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,161 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ +static const int showsystray = 1; /* 0 means no systray */ +static const unsigned int gappih = 20; /* horiz inner gap between windows */ +static const unsigned int gappiv = 10; /* vert inner gap between windows */ +static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */ +static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */ +static int smartgaps = 0; /* 1 means no outer gap when there is only one window */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#005577"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ +static const int refreshrate = 120; /* refresh rate (per second) for client move/resize */ + +#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */ +#include "vanitygaps.c" + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "[M]", monocle }, + { "[@]", spiral }, + { "[\\]", dwindle }, + { "H[]", deck }, + { "TTT", bstack }, + { "===", bstackhoriz }, + { "HHH", grid }, + { "###", nrowgrid }, + { "---", horizgrid }, + { ":::", gaplessgrid }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, + { "><>", NULL }, /* no layout function means floating behavior */ + { NULL, NULL }, +}; + +/* key definitions */ +#define MODKEY Mod1Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; + +static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} }, + { MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} }, + { MODKEY|ShiftMask, XK_o, setcfact, {.f = 0.00} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY|Mod4Mask, XK_u, incrgaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_u, incrgaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_i, incrigaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_i, incrigaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_o, incrogaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_o, incrogaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_6, incrihgaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_6, incrihgaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_7, incrivgaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_7, incrivgaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_8, incrohgaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_8, incrohgaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_9, incrovgaps, {.i = +1 } }, + { MODKEY|Mod4Mask|ShiftMask, XK_9, incrovgaps, {.i = -1 } }, + { MODKEY|Mod4Mask, XK_0, togglegaps, {0} }, + { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* click event mask button function argument */ + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/dwm b/dwm index 7505fc973beb9b8c780273863d65d530564b9b15..47c4556dea97d939137c6c28008428acb781e571 100755 GIT binary patch delta 30014 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 delta 29827 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 + restart = 1; + running = 0; +} Monitor *recttomon(int x, int y, int w, int h) { @@ -1948,6 +1955,18 @@ void setmfact(const Arg *arg) arrange(selmon); } +void sighup(int unused) +{ + Arg a = {.i = 1}; + quit(&a); +} + +void sigterm(int unused) +{ + Arg a = {.i = 0}; + quit(&a); +} + void setup(void) { int i; @@ -1964,6 +1983,8 @@ void setup(void) /* clean up any zombies (inherited from .xinitrc etc) immediately */ while (waitpid(-1, NULL, WNOHANG) > 0) ; + signal(SIGHUP, sighup); + signal(SIGTERM, sigterm); /* init screen */ screen = DefaultScreen(dpy); @@ -2728,6 +2749,8 @@ int main(int argc, char *argv[]) scan(); runautostart(); run(); + if (restart) + execvp(argv[0], argv); cleanup(); XCloseDisplay(dpy); return EXIT_SUCCESS; diff --git a/dwm.c.orig b/dwm.c.orig index 743a4b7..884f614 100644 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -20,6 +20,12 @@ * * To understand everything else, start reading main(). */ +#include +#include +#include +#include +#include +#include #include #include #include @@ -27,16 +33,10 @@ #include #include #include -#include -#include #include +#include #include -#include -#include -#include -#include -#include -#include +#include #ifdef XINERAMA #include #endif /* XINERAMA */ @@ -46,126 +46,178 @@ #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 ISVISIBLEONTAG(C, T) ((C->tags & T)) -#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#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 ISVISIBLEONTAG(C, T) ((C->tags & T)) +#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) +#define MOUSEMASK (BUTTONMASK | PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define TAGMASK ((1 << LENGTH(tags)) - 1) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_REQUEST_DOCK 0 /* XEMBED messages */ -#define XEMBED_EMBEDDED_NOTIFY 0 -#define XEMBED_WINDOW_ACTIVATE 1 -#define XEMBED_FOCUS_IN 4 -#define XEMBED_MODALITY_ON 10 -#define XEMBED_MAPPED (1 << 0) -#define XEMBED_WINDOW_ACTIVATE 1 -#define XEMBED_WINDOW_DEACTIVATE 2 -#define VERSION_MAJOR 0 -#define VERSION_MINOR 0 +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_MODALITY_ON 10 +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 #define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR /* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +enum +{ + CurNormal, + CurResize, + CurMove, + CurLast +}; /* cursor */ +enum +{ + SchemeNorm, + SchemeSel +}; /* color schemes */ +enum +{ + NetSupported, + NetWMName, + NetWMState, + NetWMCheck, + NetSystemTray, + NetSystemTrayOP, + NetSystemTrayOrientation, + NetSystemTrayOrientationHorz, + NetWMFullscreen, + NetActiveWindow, + NetWMWindowType, + NetWMWindowTypeDialog, + NetClientList, + NetClientInfo, + NetLast +}; /* EWMH atoms */ +enum +{ + Manager, + Xembed, + XembedInfo, + XLast +}; /* Xembed 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; +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; +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; - float cfact; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; +struct Client +{ + char name[256]; + float mina, maxa; + float cfact; + int x, y, w, h; + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; + 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; +typedef struct +{ + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; } Key; -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); +typedef struct +{ + const char *symbol; + void (*arrange)(Monitor *); } Layout; -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 */ - int gappih; /* horizontal gap between windows */ - int gappiv; /* vertical gap between windows */ - int gappoh; /* horizontal outer gaps */ - int gappov; /* vertical outer gaps */ - 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]; +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 */ + int gappih; /* horizontal gap between windows */ + int gappiv; /* vertical gap between windows */ + int gappoh; /* horizontal outer gaps */ + int gappov; /* vertical outer gaps */ + 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]; }; -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; +typedef struct +{ + const char *class; + const char *instance; + const char *title; + unsigned int tags; + int isfloating; + int monitor; } Rule; -typedef struct Systray Systray; -struct Systray { - Window win; - Client *icons; +typedef struct Systray Systray; +struct Systray +{ + Window win; + Client *icons; }; /* function declarations */ @@ -232,6 +284,7 @@ static void scan(void); static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); static void sendmon(Client *c, Monitor *m); static void setclientstate(Client *c, long state); +static void setclienttagprop(Client *c); static void setfocus(Client *c); static void setfullscreen(Client *c, int fullscreen); static void setlayout(const Arg *arg); @@ -282,28 +335,14 @@ static const char dwmdir[] = "dwm"; static const char localshare[] = ".local/share"; static char stext[256]; static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ +static int sw, sh; /* X display screen geometry width, height */ +static int bh; /* bar height */ +static int lrpad; /* sum of left and right padding for text */ 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, - [ResizeRequest] = resizerequest, - [UnmapNotify] = unmapnotify -}; +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, [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify}; static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; static int running = 1; static Cur *cursor[CurLast]; @@ -317,2324 +356,2379 @@ static Window root, wmcheckwin; #include "config.h" /* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; +struct NumTags +{ + char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; +}; /* function implementations */ -void -applyrules(Client *c) +void applyrules(Client *c) { - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; + 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; + /* 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]; + 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 applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) { - int baseismin; - Monitor *m = c->mon; + 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) { - if (!c->hintsvalid) - updatesizehints(c); - /* 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; + /* 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) + { + if (!c->hintsvalid) + updatesizehints(c); + /* 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) +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); + 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) +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); + 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) +void attach(Client *c) { - c->next = c->mon->clients; - c->mon->clients = c; + c->next = c->mon->clients; + c->mon->clients = c; } -void -attachBelow(Client *c) +void attachBelow(Client *c) { - //If there is nothing on the monitor or the selected client is floating, attach as normal - if(c->mon->sel == NULL || c->mon->sel->isfloating) { - Client *at = nexttagged(c); - if(!at) { - attach(c); - return; - } - c->next = at->next; - at->next = c; - return; - } - - //Set the new client's next property to the same as the currently selected clients next - c->next = c->mon->sel->next; - //Set the currently selected clients next property to the new client - c->mon->sel->next = c; + // If there is nothing on the monitor or the selected client is floating, attach as normal + if (c->mon->sel == NULL || c->mon->sel->isfloating) + { + Client *at = nexttagged(c); + if (!at) + { + attach(c); + return; + } + c->next = at->next; + at->next = c; + return; + } + // Set the new client's next property to the same as the currently selected clients next + c->next = c->mon->sel->next; + // Set the currently selected clients next property to the new client + c->mon->sel->next = c; } -void -attachstack(Client *c) +void attachstack(Client *c) { - c->snext = c->mon->stack; - c->mon->stack = c; + c->snext = c->mon->stack; + c->mon->stack = c; } -void -buttonpress(XEvent *e) +void buttonpress(XEvent *e) { - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; + 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; - do - 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 + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - 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); + 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; + do + 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 + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; + else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) + click = ClkStatusText; + else + click = ClkWinTitle; + } + else if ((c = wintoclient(ev->window))) + { + focus(c); + restack(selmon); + XAllowEvents(dpy, ReplayPointer, CurrentTime); + 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) +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); + 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) +void cleanup(void) { - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; + 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); + 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); - if (showsystray) { - XUnmapWindow(dpy, systray->win); - XDestroyWindow(dpy, systray->win); - free(systray); - } + if (showsystray) + { + XUnmapWindow(dpy, systray->win); + XDestroyWindow(dpy, systray->win); + free(systray); + } - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - drw_scm_free(drw, scheme[i], 3); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) + drw_scm_free(drw, scheme[i], 3); + free(scheme); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); } -void -cleanupmon(Monitor *mon) +void cleanupmon(Monitor *mon) { - Monitor *m; + 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); + 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 -clientmessage(XEvent *e) +void clientmessage(XEvent *e) { - XWindowAttributes wa; - XSetWindowAttributes swa; - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); + XWindowAttributes wa; + XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); - if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { - /* add systray icons */ - if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { - if (!(c = (Client *)calloc(1, sizeof(Client)))) - die("fatal: could not malloc() %u bytes\n", sizeof(Client)); - if (!(c->win = cme->data.l[2])) { - free(c); - return; - } - c->mon = selmon; - c->next = systray->icons; - systray->icons = c; - if (!XGetWindowAttributes(dpy, c->win, &wa)) { - /* use sane defaults */ - wa.width = bh; - wa.height = bh; - wa.border_width = 0; - } - c->x = c->oldx = c->y = c->oldy = 0; - c->w = c->oldw = wa.width; - c->h = c->oldh = wa.height; - c->oldbw = wa.border_width; - c->bw = 0; - c->isfloating = True; - /* reuse tags field as mapped status */ - c->tags = 1; - updatesizehints(c); - updatesystrayicongeom(c, wa.width, wa.height); - XAddToSaveSet(dpy, c->win); - XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); - XReparentWindow(dpy, c->win, systray->win, 0, 0); - /* use parents background color */ - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); - sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); - /* FIXME not sure if I have to send these events, too */ - sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); - sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); - sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); - XSync(dpy, False); - resizebarwin(selmon); - updatesystray(); - setclientstate(c, NormalState); - } - return; - } + if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) + { + /* add systray icons */ + if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) + { + if (!(c = (Client *)calloc(1, sizeof(Client)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Client)); + if (!(c->win = cme->data.l[2])) + { + free(c); + return; + } + c->mon = selmon; + c->next = systray->icons; + systray->icons = c; + if (!XGetWindowAttributes(dpy, c->win, &wa)) + { + /* use sane defaults */ + wa.width = bh; + wa.height = bh; + wa.border_width = 0; + } + c->x = c->oldx = c->y = c->oldy = 0; + c->w = c->oldw = wa.width; + c->h = c->oldh = wa.height; + c->oldbw = wa.border_width; + c->bw = 0; + c->isfloating = True; + /* reuse tags field as mapped status */ + c->tags = 1; + updatesizehints(c); + updatesystrayicongeom(c, wa.width, wa.height); + XAddToSaveSet(dpy, c->win); + XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); + XReparentWindow(dpy, c->win, systray->win, 0, 0); + /* use parents background color */ + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0, systray->win, XEMBED_EMBEDDED_VERSION); + /* FIXME not sure if I have to send these events, too */ + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0, systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0, systray->win, XEMBED_EMBEDDED_VERSION); + XSync(dpy, False); + resizebarwin(selmon); + updatesystray(); + setclientstate(c, NormalState); + } + return; + } - 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 (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } + 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 (c != selmon->sel && !c->isurgent) + seturgent(c, 1); + } } -void -configure(Client *c) +void configure(Client *c) { - XConfigureEvent ce; + 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); + 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) +void configurenotify(XEvent *e) { - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; + Monitor *m; + Client *c; + 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) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - resizebarwin(m); - } - focus(NULL); - arrange(NULL); - } - } + /* 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) + { + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); + resizebarwin(m); + } + focus(NULL); + arrange(NULL); + } + } } -void -configurerequest(XEvent *e) +void configurerequest(XEvent *e) { - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; + 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); + 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 *createmon(void) { - Monitor *m; + Monitor *m; - 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->gappih = gappih; - m->gappiv = gappiv; - m->gappoh = gappoh; - m->gappov = gappov; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; + 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->gappih = gappih; + m->gappiv = gappiv; + m->gappoh = gappoh; + m->gappov = gappov; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + return m; } -void -destroynotify(XEvent *e) +void destroynotify(XEvent *e) { - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; - if ((c = wintoclient(ev->window))) - unmanage(c, 1); - else if ((c = wintosystrayicon(ev->window))) { - removesystrayicon(c); - resizebarwin(selmon); - updatesystray(); - } + if ((c = wintoclient(ev->window))) + unmanage(c, 1); + else if ((c = wintosystrayicon(ev->window))) + { + removesystrayicon(c); + resizebarwin(selmon); + updatesystray(); + } } -void -detach(Client *c) +void detach(Client *c) { - Client **tc; + Client **tc; - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; + for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next) + ; + *tc = c->next; } -void -detachstack(Client *c) +void detachstack(Client *c) { - Client **tc, *t; + Client **tc, *t; - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; + 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; - } + 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 *dirtomon(int dir) { - Monitor *m = NULL; + 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; + 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) +void drawbar(Monitor *m) { - int x, w, tw = 0, stw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; + int x, w, tw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; - if (!m->showbar) - return; + if (!m->showbar) + return; - if(showsystray && m == systraytomon(m) && !systrayonleft) - stw = getsystraywidth(); + if (showsystray && m == systraytomon(m) && !systrayonleft) + stw = getsystraywidth(); - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ - drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); - } + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) + { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); + tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ + drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); + } - resizebarwin(m); - 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++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + resizebarwin(m); + 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++) + { + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); + if (occ & 1 << i) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, urg & 1 << i); + x += w; + } + w = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - if ((w = m->ww - tw - stw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); + if ((w = m->ww - tw - stw - x) > bh) + { + if (m->sel) + { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } + else + { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } + drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); } -void -drawbars(void) +void drawbars(void) { - Monitor *m; + Monitor *m; - for (m = mons; m; m = m->next) - drawbar(m); + for (m = mons; m; m = m->next) + drawbar(m); } -void -enternotify(XEvent *e) +void enternotify(XEvent *e) { - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; + 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); + 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) +void expose(XEvent *e) { - Monitor *m; - XExposeEvent *ev = &e->xexpose; + Monitor *m; + XExposeEvent *ev = &e->xexpose; - if (ev->count == 0 && (m = wintomon(ev->window))) { - drawbar(m); - if (m == selmon) - updatesystray(); - } + if (ev->count == 0 && (m = wintomon(ev->window))) + { + drawbar(m); + if (m == selmon) + updatesystray(); + } } -void -focus(Client *c) +void focus(Client *c) { - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext) + ; + if (selmon->sel && selmon->sel != c) + unfocus(selmon->sel, 0); + if (c) + { + if (c->mon != selmon) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); + detachstack(c); + attachstack(c); + grabbuttons(c, 1); + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + setfocus(c); + } + else + { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } + selmon->sel = c; + drawbars(); } /* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) +void focusin(XEvent *e) { - XFocusChangeEvent *ev = &e->xfocus; + XFocusChangeEvent *ev = &e->xfocus; - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); + if (selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); } -void -focusmon(const Arg *arg) +void focusmon(const Arg *arg) { - Monitor *m; + Monitor *m; - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); + if (!mons->next) + return; + if ((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, 0); + selmon = m; + focus(NULL); } -void -focusstack(const Arg *arg) +void focusstack(const Arg *arg) { - Client *c = NULL, *i; + Client *c = NULL, *i; - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - 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); - } + if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) + 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) +Atom getatomprop(Client *c, Atom prop) { - int di; - unsigned long nitems, dl; - unsigned char *p = NULL; - Atom da, atom = None; + int di; + unsigned long nitems, dl; + unsigned char *p = NULL; + Atom da, atom = None; - /* FIXME getatomprop should return the number of items and a pointer to - * the stored data instead of this workaround */ - Atom req = XA_ATOM; - if (prop == xatom[XembedInfo]) - req = xatom[XembedInfo]; + /* FIXME getatomprop should return the number of items and a pointer to + * the stored data instead of this workaround */ + Atom req = XA_ATOM; + if (prop == xatom[XembedInfo]) + req = xatom[XembedInfo]; - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, - &da, &di, &nitems, &dl, &p) == Success && p) { - atom = *(Atom *)p; - if (da == xatom[XembedInfo] && nitems == 2) - atom = ((Atom *)p)[1]; - XFree(p); - } - return atom; + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, &da, &di, &nitems, &dl, &p) == Success && p) + { + atom = *(Atom *)p; + if (da == xatom[XembedInfo] && nitems == 2) + atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; } -unsigned int -getsystraywidth() +unsigned int getsystraywidth() { - unsigned int w = 0; - Client *i; - if(showsystray) - for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; - return w ? w + systrayspacing : 1; + unsigned int w = 0; + Client *i; + if (showsystray) + for (i = systray->icons; i; w += i->w + systrayspacing, i = i->next) + ; + return w ? w + systrayspacing : 1; } -int -getrootptr(int *x, int *y) +int getrootptr(int *x, int *y) { - int di; - unsigned int dui; - Window dummy; + int di; + unsigned int dui; + Window dummy; - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); } -long -getstate(Window w) +long getstate(Window w) { - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; + 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, &p) != Success) - return -1; - if (n != 0 && format == 32) - result = *(long *)p; - XFree(p); - return result; + if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], &real, &format, &n, &extra, &p) != Success) + return -1; + if (n != 0 && format == 32) + result = *(long *)p; + XFree(p); + return result; } -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) +int gettextprop(Window w, Atom atom, char *text, unsigned int size) { - char **list = NULL; - int n; - XTextProperty name; + char **list = NULL; + int n; + XTextProperty name; - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !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; + if (!text || size == 0) + return 0; + text[0] = '\0'; + if (!XGetTextProperty(dpy, w, &name, atom) || !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) +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) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - 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); - } + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = {0, LockMask, numlockmask, numlockmask | LockMask}; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + if (!focused) + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, GrabModeSync, GrabModeSync, None, None); + 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); + } } -void -grabkeys(void) +void grabkeys(void) { - updatenumlockmask(); - { - unsigned int i, j, k; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - int start, end, skip; - KeySym *syms; + updatenumlockmask(); + { + unsigned int i, j, k; + unsigned int modifiers[] = {0, LockMask, numlockmask, numlockmask | LockMask}; + int start, end, skip; + KeySym *syms; - XUngrabKey(dpy, AnyKey, AnyModifier, root); - XDisplayKeycodes(dpy, &start, &end); - syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); - if (!syms) - return; - for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) - /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, k, - keys[i].mod | modifiers[j], - root, True, - GrabModeAsync, GrabModeAsync); - XFree(syms); - } + XUngrabKey(dpy, AnyKey, AnyModifier, root); + XDisplayKeycodes(dpy, &start, &end); + syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); + if (!syms) + return; + for (k = start; k <= end; k++) + for (i = 0; i < LENGTH(keys); i++) + /* skip modifier codes, we do that ourselves */ + if (keys[i].keysym == syms[(k - start) * skip]) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, k, keys[i].mod | modifiers[j], root, True, GrabModeAsync, GrabModeAsync); + XFree(syms); + } } -void -incnmaster(const Arg *arg) +void incnmaster(const Arg *arg) { - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); } #ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +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; + 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) +void keypress(XEvent *e) { - unsigned int i; - KeySym keysym; - XKeyEvent *ev; + 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)); + 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) +void killclient(const Arg *arg) { - if (!selmon->sel) - return; + if (!selmon->sel) + return; - if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0, 0, 0)) + { + 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) +void manage(Window w, XWindowAttributes *wa) { - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; + Client *c, *t = NULL; + Window trans = None; + XWindowChanges wc; - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* 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; - c->cfact = 1.0; + c = ecalloc(1, sizeof(Client)); + c->win = w; + /* 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; + c->cfact = 1.0; - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } + updatetitle(c); + if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) + { + c->mon = t->mon; + c->tags = t->tags; + } + else + { + c->mon = selmon; + applyrules(c); + } - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; + if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) + c->x = c->mon->wx + c->mon->ww - WIDTH(c); + if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) + c->y = c->mon->wy + c->mon->wh - HEIGHT(c); + c->x = MAX(c->x, c->mon->wx); + c->y = MAX(c->y, c->mon->wy); + c->bw = borderpx; - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - 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); - attachBelow(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); + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); + configure(c); /* propagates border_width, if size doesn't change */ + updatewindowtype(c); + updatesizehints(c); + updatewmhints(c); + { + int format; + unsigned long *data, n, extra; + Monitor *m; + Atom atom; + if (XGetWindowProperty(dpy, c->win, netatom[NetClientInfo], 0L, 2L, False, XA_CARDINAL, &atom, &format, &n, &extra, (unsigned char **)&data) == Success && n == 2) + { + c->tags = *data; + for (m = mons; m; m = m->next) + { + if (m->num == *(data + 1)) + { + c->mon = m; + break; + } + } + } + if (n > 0) + XFree(data); + } + setclienttagprop(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); + attachBelow(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) +void mappingnotify(XEvent *e) { - XMappingEvent *ev = &e->xmapping; + XMappingEvent *ev = &e->xmapping; - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); + XRefreshKeyboardMapping(ev); + if (ev->request == MappingKeyboard) + grabkeys(); } -void -maprequest(XEvent *e) +void maprequest(XEvent *e) { - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; - Client *i; - if ((i = wintosystrayicon(ev->window))) { - sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); - resizebarwin(selmon); - updatesystray(); - } + Client *i; + if ((i = wintosystrayicon(ev->window))) + { + sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + resizebarwin(selmon); + updatesystray(); + } - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); } -void -monocle(Monitor *m) +void monocle(Monitor *m) { - unsigned int n = 0; - Client *c; + 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); + 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) +void motionnotify(XEvent *e) { - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; + 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; + 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) +void movemouse(const Arg *arg) { - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; + 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 / refreshrate)) - continue; - lasttime = ev.xmotion.time; + 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 / refreshrate)) + continue; + lasttime = ev.xmotion.time; - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - 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); - } + nx = ocx + (ev.xmotion.x - x); + ny = ocy + (ev.xmotion.y - y); + 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 * -nexttagged(Client *c) { - Client *walked = c->mon->clients; - for(; - walked && (walked->isfloating || !ISVISIBLEONTAG(walked, c->tags)); - walked = walked->next - ); - return walked; -} - -Client * -nexttiled(Client *c) +Client *nexttagged(Client *c) { - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; + Client *walked = c->mon->clients; + for (; walked && (walked->isfloating || !ISVISIBLEONTAG(walked, c->tags)); walked = walked->next) + ; + return walked; } -void -pop(Client *c) +Client *nexttiled(Client *c) { - detach(c); - attach(c); - focus(c); - arrange(c->mon); + for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next) + ; + return c; } -void -propertynotify(XEvent *e) +void pop(Client *c) { - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((c = wintosystrayicon(ev->window))) { - if (ev->atom == XA_WM_NORMAL_HINTS) { - updatesizehints(c); - updatesystrayicongeom(c, c->w, c->h); - } - else - updatesystrayiconstate(c, ev); - resizebarwin(selmon); - updatesystray(); - } - - 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: - c->hintsvalid = 0; - 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); - } + detach(c); + attach(c); + focus(c); + arrange(c->mon); } -void -quit(const Arg *arg) +void propertynotify(XEvent *e) { - running = 0; + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if ((c = wintosystrayicon(ev->window))) + { + if (ev->atom == XA_WM_NORMAL_HINTS) + { + updatesizehints(c); + updatesystrayicongeom(c, c->w, c->h); + } + else + updatesystrayiconstate(c, ev); + resizebarwin(selmon); + updatesystray(); + } + + 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: + c->hintsvalid = 0; + 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); + } } -Monitor * -recttomon(int x, int y, int w, int h) +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; + 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; + for (m = mons; m; m = m->next) + if ((a = INTERSECT(x, y, w, h, m)) > area) + { + area = a; + r = m; + } + return r; } -void -removesystrayicon(Client *i) +void removesystrayicon(Client *i) { - Client **ii; + Client **ii; - if (!showsystray || !i) - return; - for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); - if (ii) - *ii = i->next; - free(i); + if (!showsystray || !i) + return; + for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next) + ; + if (ii) + *ii = i->next; + free(i); } -void -resize(Client *c, int x, int y, int w, int h, int interact) +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); + if (applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); } -void -resizebarwin(Monitor *m) { - unsigned int w = m->ww; - if (showsystray && m == systraytomon(m) && !systrayonleft) - w -= getsystraywidth(); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) +void resizebarwin(Monitor *m) { - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); + unsigned int w = m->ww; + if (showsystray && m == systraytomon(m) && !systrayonleft) + w -= getsystraywidth(); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); } -void -resizerequest(XEvent *e) +void resizeclient(Client *c, int x, int y, int w, int h) { - XResizeRequestEvent *ev = &e->xresizerequest; - Client *i; + XWindowChanges wc; - if ((i = wintosystrayicon(ev->window))) { - updatesystrayicongeom(i, ev->width, ev->height); - resizebarwin(selmon); - updatesystray(); - } + c->oldx = c->x; + c->x = wc.x = x; + c->oldy = c->y; + c->y = wc.y = y; + c->oldw = c->w; + c->w = wc.width = w; + c->oldh = c->h; + c->h = wc.height = h; + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); } -void -resizemouse(const Arg *arg) +void resizerequest(XEvent *e) { - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; + XResizeRequestEvent *ev = &e->xresizerequest; + Client *i; - 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 / refreshrate)) - 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); - } + if ((i = wintosystrayicon(ev->window))) + { + updatesystrayicongeom(i, ev->width, ev->height); + resizebarwin(selmon); + updatesystray(); + } } -void -restack(Monitor *m) +void resizemouse(const Arg *arg) { - Client *c; - XEvent ev; - XWindowChanges wc; + int ocx, ocy, nw, nh; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; - 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)); + 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 / refreshrate)) + 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 -run(void) +void restack(Monitor *m) { - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ + 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 -runautostart(void) +void run(void) { - char *pathpfx; - char *path; - char *xdgdatahome; - char *home; - struct stat sb; - - if ((home = getenv("HOME")) == NULL) - /* this is almost impossible */ - return; - - /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, - * otherwise use ~/.local/share/dwm as autostart script directory - */ - xdgdatahome = getenv("XDG_DATA_HOME"); - if (xdgdatahome != NULL && *xdgdatahome != '\0') { - /* space for path segments, separators and nul */ - pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); - - if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { - free(pathpfx); - return; - } - } else { - /* space for path segments, separators and nul */ - pathpfx = ecalloc(1, strlen(home) + strlen(localshare) - + strlen(dwmdir) + 3); - - if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { - free(pathpfx); - return; - } - } - - /* check if the autostart script directory exists */ - if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { - /* the XDG conformant path does not exist or is no directory - * so we try ~/.dwm instead - */ - char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); - if(pathpfx_new == NULL) { - free(pathpfx); - return; - } - pathpfx = pathpfx_new; - - if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { - free(pathpfx); - return; - } - } - - /* try the blocking script first */ - path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); - if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { - free(path); - free(pathpfx); - } - - if (access(path, X_OK) == 0) - system(path); - - /* now the non-blocking script */ - if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { - free(path); - free(pathpfx); - } - - if (access(path, X_OK) == 0) - system(strcat(path, " &")); - - free(pathpfx); - free(path); + 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) +void runautostart(void) { - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; + char *pathpfx; + char *path; + char *xdgdatahome; + char *home; + struct stat sb; - 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); - } + if ((home = getenv("HOME")) == NULL) + /* this is almost impossible */ + return; + + /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, + * otherwise use ~/.local/share/dwm as autostart script directory + */ + xdgdatahome = getenv("XDG_DATA_HOME"); + if (xdgdatahome != NULL && *xdgdatahome != '\0') + { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); + + if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) + { + free(pathpfx); + return; + } + } + else + { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(home) + strlen(localshare) + strlen(dwmdir) + 3); + + if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) + { + free(pathpfx); + return; + } + } + + /* check if the autostart script directory exists */ + if (!(stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) + { + /* the XDG conformant path does not exist or is no directory + * so we try ~/.dwm instead + */ + char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); + if (pathpfx_new == NULL) + { + free(pathpfx); + return; + } + pathpfx = pathpfx_new; + + if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) + { + free(pathpfx); + return; + } + } + + /* try the blocking script first */ + path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); + if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) + { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(path); + + /* now the non-blocking script */ + if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) + { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(strcat(path, " &")); + + free(pathpfx); + free(path); } -void -sendmon(Client *c, Monitor *m) +void scan(void) { - 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 */ - attachBelow(c); - attachstack(c); - focus(NULL); - arrange(NULL); + 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 -setclientstate(Client *c, long state) +void sendmon(Client *c, Monitor *m) { - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); + 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 */ + attachBelow(c); + attachstack(c); + setclienttagprop(c); + focus(NULL); + arrange(NULL); } -int -sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) +void setclientstate(Client *c, long state) { - int n; - Atom *protocols, mt; - int exists = 0; - XEvent ev; + long data[] = {state, None}; - if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { - mt = wmatom[WMProtocols]; - if (XGetWMProtocols(dpy, w, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - } - else { - exists = True; - mt = proto; - } - - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = w; - ev.xclient.message_type = mt; - ev.xclient.format = 32; - ev.xclient.data.l[0] = d0; - ev.xclient.data.l[1] = d1; - ev.xclient.data.l[2] = d2; - ev.xclient.data.l[3] = d3; - ev.xclient.data.l[4] = d4; - XSendEvent(dpy, w, False, mask, &ev); - } - return exists; + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, PropModeReplace, (unsigned char *)data, 2); } -void -setfocus(Client *c) +int sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) { - 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->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); + int n; + Atom *protocols, mt; + int exists = 0; + XEvent ev; + + if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) + { + mt = wmatom[WMProtocols]; + if (XGetWMProtocols(dpy, w, &protocols, &n)) + { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + } + else + { + exists = True; + mt = proto; + } + + if (exists) + { + ev.type = ClientMessage; + ev.xclient.window = w; + ev.xclient.message_type = mt; + ev.xclient.format = 32; + ev.xclient.data.l[0] = d0; + ev.xclient.data.l[1] = d1; + ev.xclient.data.l[2] = d2; + ev.xclient.data.l[3] = d3; + ev.xclient.data.l[4] = d4; + XSendEvent(dpy, w, False, mask, &ev); + } + return exists; } -void -setfullscreen(Client *c, int fullscreen) +void setfocus(Client *c) { - 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); - } + 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->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } -void -setlayout(const Arg *arg) +void setfullscreen(Client *c, int fullscreen) { - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); + 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 -setcfact(const Arg *arg) { - float f; - Client *c; +void setlayout(const Arg *arg) +{ + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->sellt ^= 1; + if (arg && arg->v) + selmon->lt[selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); + else + drawbar(selmon); +} - c = selmon->sel; +void setcfact(const Arg *arg) +{ + float f; + Client *c; - if(!arg || !c || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f + c->cfact; - if(arg->f == 0.0) - f = 1.0; - else if(f < 0.25 || f > 4.0) - return; - c->cfact = f; - arrange(selmon); + c = selmon->sel; + + if (!arg || !c || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f + c->cfact; + if (arg->f == 0.0) + f = 1.0; + else if (f < 0.25 || f > 4.0) + return; + c->cfact = f; + arrange(selmon); } /* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) +void setmfact(const Arg *arg) { - float f; + 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.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; + selmon->mfact = f; + arrange(selmon); } -void -setup(void) +void setup(void) { - int i; - XSetWindowAttributes wa; - Atom utf8string; - struct sigaction sa; + int i; + XSetWindowAttributes wa; + Atom utf8string; + struct sigaction sa; - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); + /* do not transform children into zombies when they terminate */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; + sa.sa_handler = SIG_IGN; + sigaction(SIGCHLD, &sa, NULL); - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); + /* clean up any zombies (inherited from .xinitrc etc) immediately */ + while (waitpid(-1, NULL, WNOHANG) > 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); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - 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[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); - netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); - netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); - netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", 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); - xatom[Manager] = XInternAtom(dpy, "MANAGER", False); - xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); - xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", 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 = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init system tray */ - updatesystray(); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select 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); + /* 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); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + bh = drw->fonts->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); + 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[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); + netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); + netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", 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[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False); + xatom[Manager] = XInternAtom(dpy, "MANAGER", False); + xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); + xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", 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 = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); + /* init system tray */ + updatesystray(); + /* init bars */ + updatebars(); + updatestatus(); + /* supporting window for NetWMCheck */ + wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, PropModeReplace, (unsigned char *)&wmcheckwin, 1); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, PropModeReplace, (unsigned char *)"dwm", 3); + XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, PropModeReplace, (unsigned char *)&wmcheckwin, 1); + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, PropModeReplace, (unsigned char *)netatom, NetLast); + XDeleteProperty(dpy, root, netatom[NetClientList]); + XDeleteProperty(dpy, root, netatom[NetClientInfo]); + /* select 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 -seturgent(Client *c, int urg) +void seturgent(Client *c, int urg) { - XWMHints *wmh; + XWMHints *wmh; - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); + c->isurgent = urg; + if (!(wmh = XGetWMHints(dpy, c->win))) + return; + wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); } -void -showhide(Client *c) +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); - } + 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 -spawn(const Arg *arg) +void spawn(const Arg *arg) { - struct sigaction sa; + struct sigaction sa; - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; + if (fork() == 0) + { + if (dpy) + close(ConnectionNumber(dpy)); + setsid(); - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; - sigaction(SIGCHLD, &sa, NULL); + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = SIG_DFL; + sigaction(SIGCHLD, &sa, NULL); - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } + execvp(((char **)arg->v)[0], (char **)arg->v); + die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); + } } -void -tag(const Arg *arg) +void setclienttagprop(Client *c) { - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } + long data[] = {(long)c->tags, (long)c->mon->num}; + XChangeProperty(dpy, c->win, netatom[NetClientInfo], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)data, 2); } -void -tagmon(const Arg *arg) +void tag(const Arg *arg) { - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); + Client *c; + if (selmon->sel && arg->ui & TAGMASK) + { + c = selmon->sel; + selmon->sel->tags = arg->ui & TAGMASK; + setclienttagprop(c); + focus(NULL); + arrange(selmon); + } } -void -togglebar(const Arg *arg) +void tagmon(const Arg *arg) { - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - resizebarwin(selmon); - if (showsystray) { - XWindowChanges wc; - if (!selmon->showbar) - wc.y = -bh; - else if (selmon->showbar) { - wc.y = 0; - if (!selmon->topbar) - wc.y = selmon->mh - bh; - } - XConfigureWindow(dpy, systray->win, CWY, &wc); - } - arrange(selmon); + if (!selmon->sel || !mons->next) + return; + sendmon(selmon->sel, dirtomon(arg->i)); } -void -togglefloating(const Arg *arg) +void togglebar(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); + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); + resizebarwin(selmon); + if (showsystray) + { + XWindowChanges wc; + if (!selmon->showbar) + wc.y = -bh; + else if (selmon->showbar) + { + wc.y = 0; + if (!selmon->topbar) + wc.y = selmon->mh - bh; + } + XConfigureWindow(dpy, systray->win, CWY, &wc); + } + arrange(selmon); } -void -toggletag(const Arg *arg) +void togglefloating(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); - } + 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 -toggleview(const Arg *arg) +void toggletag(const Arg *arg) { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + unsigned int newtags; - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) + { + selmon->sel->tags = newtags; + setclienttagprop(selmon->sel); + focus(NULL); + arrange(selmon); + } } -void -unfocus(Client *c, int setfocus) +void toggleview(const Arg *arg) { - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + + if (newtagset) + { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } } -void -unmanage(Client *c, int destroyed) +void unfocus(Client *c, int setfocus) { - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - 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); + if (!c) + return; + grabbuttons(c, 0); + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + if (setfocus) + { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } } -void -unmapnotify(XEvent *e) +void unmanage(Client *c, int destroyed) { - Client *c; - XUnmapEvent *ev = &e->xunmap; + Monitor *m = c->mon; + XWindowChanges wc; - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } - else if ((c = wintosystrayicon(ev->window))) { - /* KLUDGE! sometimes icons occasionally unmap their windows, but do - * _not_ destroy them. We map those windows back */ - XMapRaised(dpy, c->win); - updatesystray(); - } + detach(c); + detachstack(c); + if (!destroyed) + { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ + XSetErrorHandler(xerrordummy); + XSelectInput(dpy, c->win, NoEventMask); + 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 -updatebars(void) +void unmapnotify(XEvent *e) { - unsigned int w; - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - w = m->ww; - if (showsystray && m == systraytomon(m)) - w -= getsystraywidth(); - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - if (showsystray && m == systraytomon(m)) - XMapRaised(dpy, systray->win); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if ((c = wintoclient(ev->window))) + { + if (ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, 0); + } + else if ((c = wintosystrayicon(ev->window))) + { + /* KLUDGE! sometimes icons occasionally unmap their windows, but do + * _not_ destroy them. We map those windows back */ + XMapRaised(dpy, c->win); + updatesystray(); + } } -void -updatebarpos(Monitor *m) +void updatebars(void) { - 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; + unsigned int w; + Monitor *m; + XSetWindowAttributes wa = {.override_redirect = True, .background_pixmap = ParentRelative, .event_mask = ButtonPressMask | ExposureMask}; + XClassHint ch = {"dwm", "dwm"}; + for (m = mons; m; m = m->next) + { + if (m->barwin) + continue; + w = m->ww; + if (showsystray && m == systraytomon(m)) + w -= getsystraywidth(); + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + if (showsystray && m == systraytomon(m)) + XMapRaised(dpy, systray->win); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } } -void -updateclientlist(void) +void updatebarpos(Monitor *m) { - 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); + 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; } -int -updategeom(void) +void updateclientlist(void) { - int dirty = 0; + 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); +} + +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; + 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; + 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; - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - 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); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachBelow(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; + /* new monitors if nn > n */ + for (i = n; i < nn; i++) + { + 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); + } + /* removed monitors if n > nn */ + for (i = nn; i < n; i++) + { + for (m = mons; m && m->next; m = m->next) + ; + while ((c = m->clients)) + { + dirty = 1; + m->clients = c->next; + detachstack(c); + c->mon = mons; + attach(c); + attachBelow(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) +void updatenumlockmask(void) { - unsigned int i, j; - XModifierKeymap *modmap; + 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); + 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) +void updatesizehints(Client *c) { - long msize; - XSizeHints size; + 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->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; + 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->maxh && c->maxw == c->minw && c->maxh == c->minh); + c->hintsvalid = 1; } -void -updatestatus(void) +void updatestatus(void) { - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); - updatesystray(); + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-" VERSION); + drawbar(selmon); + updatesystray(); } - -void -updatesystrayicongeom(Client *i, int w, int h) +void updatesystrayicongeom(Client *i, int w, int h) { - if (i) { - i->h = bh; - if (w == h) - i->w = bh; - else if (h == bh) - i->w = w; - else - i->w = (int) ((float)bh * ((float)w / (float)h)); - applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); - /* force icons into the systray dimensions if they don't want to */ - if (i->h > bh) { - if (i->w == i->h) - i->w = bh; - else - i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); - i->h = bh; - } - } + if (i) + { + i->h = bh; + if (w == h) + i->w = bh; + else if (h == bh) + i->w = w; + else + i->w = (int)((float)bh * ((float)w / (float)h)); + applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); + /* force icons into the systray dimensions if they don't want to */ + if (i->h > bh) + { + if (i->w == i->h) + i->w = bh; + else + i->w = (int)((float)bh * ((float)i->w / (float)i->h)); + i->h = bh; + } + } } -void -updatesystrayiconstate(Client *i, XPropertyEvent *ev) +void updatesystrayiconstate(Client *i, XPropertyEvent *ev) { - long flags; - int code = 0; + long flags; + int code = 0; - if (!showsystray || !i || ev->atom != xatom[XembedInfo] || - !(flags = getatomprop(i, xatom[XembedInfo]))) - return; + if (!showsystray || !i || ev->atom != xatom[XembedInfo] || !(flags = getatomprop(i, xatom[XembedInfo]))) + return; - if (flags & XEMBED_MAPPED && !i->tags) { - i->tags = 1; - code = XEMBED_WINDOW_ACTIVATE; - XMapRaised(dpy, i->win); - setclientstate(i, NormalState); - } - else if (!(flags & XEMBED_MAPPED) && i->tags) { - i->tags = 0; - code = XEMBED_WINDOW_DEACTIVATE; - XUnmapWindow(dpy, i->win); - setclientstate(i, WithdrawnState); - } - else - return; - sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, - systray->win, XEMBED_EMBEDDED_VERSION); + if (flags & XEMBED_MAPPED && !i->tags) + { + i->tags = 1; + code = XEMBED_WINDOW_ACTIVATE; + XMapRaised(dpy, i->win); + setclientstate(i, NormalState); + } + else if (!(flags & XEMBED_MAPPED) && i->tags) + { + i->tags = 0; + code = XEMBED_WINDOW_DEACTIVATE; + XUnmapWindow(dpy, i->win); + setclientstate(i, WithdrawnState); + } + else + return; + sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, systray->win, XEMBED_EMBEDDED_VERSION); } -void -updatesystray(void) +void updatesystray(void) { - XSetWindowAttributes wa; - XWindowChanges wc; - Client *i; - Monitor *m = systraytomon(NULL); - unsigned int x = m->mx + m->mw; - unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; - unsigned int w = 1; + XSetWindowAttributes wa; + XWindowChanges wc; + Client *i; + Monitor *m = systraytomon(NULL); + unsigned int x = m->mx + m->mw; + unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; + unsigned int w = 1; - if (!showsystray) - return; - if (systrayonleft) - x -= sw + lrpad / 2; - if (!systray) { - /* init systray */ - if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) - die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); - systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); - wa.event_mask = ButtonPressMask | ExposureMask; - wa.override_redirect = True; - wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - XSelectInput(dpy, systray->win, SubstructureNotifyMask); - XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, - PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); - XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); - XMapRaised(dpy, systray->win); - XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); - if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { - sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); - XSync(dpy, False); - } - else { - fprintf(stderr, "dwm: unable to obtain system tray.\n"); - free(systray); - systray = NULL; - return; - } - } - for (w = 0, i = systray->icons; i; i = i->next) { - /* make sure the background color stays the same */ - wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); - XMapRaised(dpy, i->win); - w += systrayspacing; - i->x = w; - XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); - w += i->w; - if (i->mon != m) - i->mon = m; - } - w = w ? w + systrayspacing : 1; - x -= w; - XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); - wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; - wc.stack_mode = Above; wc.sibling = m->barwin; - XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); - XMapWindow(dpy, systray->win); - XMapSubwindows(dpy, systray->win); - /* redraw background */ - XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); - XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); - XSync(dpy, False); + if (!showsystray) + return; + if (systrayonleft) + x -= sw + lrpad / 2; + if (!systray) + { + /* init systray */ + if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); + systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); + wa.event_mask = ButtonPressMask | ExposureMask; + wa.override_redirect = True; + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XSelectInput(dpy, systray->win, SubstructureNotifyMask); + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); + XChangeWindowAttributes(dpy, systray->win, CWEventMask | CWOverrideRedirect | CWBackPixel, &wa); + XMapRaised(dpy, systray->win); + XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); + if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) + { + sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); + XSync(dpy, False); + } + else + { + fprintf(stderr, "dwm: unable to obtain system tray.\n"); + free(systray); + systray = NULL; + return; + } + } + for (w = 0, i = systray->icons; i; i = i->next) + { + /* make sure the background color stays the same */ + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); + XMapRaised(dpy, i->win); + w += systrayspacing; + i->x = w; + XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); + w += i->w; + if (i->mon != m) + i->mon = m; + } + w = w ? w + systrayspacing : 1; + x -= w; + XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); + wc.x = x; + wc.y = m->by; + wc.width = w; + wc.height = bh; + wc.stack_mode = Above; + wc.sibling = m->barwin; + XConfigureWindow(dpy, systray->win, CWX | CWY | CWWidth | CWHeight | CWSibling | CWStackMode, &wc); + XMapWindow(dpy, systray->win); + XMapSubwindows(dpy, systray->win); + /* redraw background */ + XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); + XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); + XSync(dpy, False); } -void -updatetitle(Client *c) +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); + 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 -updatewindowtype(Client *c) +void updatewindowtype(Client *c) { - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); + 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; + if (state == netatom[NetWMFullscreen]) + setfullscreen(c, 1); + if (wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = 1; } -void -updatewmhints(Client *c) +void updatewmhints(Client *c) { - XWMHints *wmh; + 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); - } + 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) +void view(const Arg *arg) { - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ + if (arg->ui & TAGMASK) + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); } -Client * -wintoclient(Window w) +Client *wintoclient(Window w) { - Client *c; - Monitor *m; + 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; + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + if (c->win == w) + return c; + return NULL; } -Client * -wintosystrayicon(Window w) { - Client *i = NULL; - - if (!showsystray || !w) - return i; - for (i = systray->icons; i && i->win != w; i = i->next) ; - return i; -} - -Monitor * -wintomon(Window w) +Client *wintosystrayicon(Window w) { - int x, y; - Client *c; - Monitor *m; + Client *i = NULL; - 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; + if (!showsystray || !w) + return i; + for (i = systray->icons; i && i->win != w; i = i->next) + ; + return i; +} + +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) +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 */ + 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; -} +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) +int xerrorstart(Display *dpy, XErrorEvent *ee) { - die("dwm: another window manager is already running"); - return -1; + die("dwm: another window manager is already running"); + return -1; } -Monitor * -systraytomon(Monitor *m) { - Monitor *t; - int i, n; - if(!systraypinning) { - if(!m) - return selmon; - return m == selmon ? m : NULL; - } - for(n = 1, t = mons; t && t->next; n++, t = t->next) ; - for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; - if(systraypinningfailfirst && n < systraypinning) - return mons; - return t; +Monitor *systraytomon(Monitor *m) +{ + Monitor *t; + int i, n; + if (!systraypinning) + { + if (!m) + return selmon; + return m == selmon ? m : NULL; + } + for (n = 1, t = mons; t && t->next; n++, t = t->next) + ; + for (i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) + ; + if (systraypinningfailfirst && n < systraypinning) + return mons; + return t; } -void -zoom(const Arg *arg) +void zoom(const Arg *arg) { - Client *c = selmon->sel; + Client *c = selmon->sel; - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); + if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) + return; + if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) + return; + pop(c); } -int -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); + if (argc == 2 && !strcmp("-v", argv[1])) + die("dwm-" VERSION); + else if (argc != 1) + die("usage: dwm [-v]"); + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display"); + checkotherwm(); + setup(); #ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); + if (pledge("stdio rpath proc exec", NULL) == -1) + die("pledge"); #endif /* __OpenBSD__ */ - scan(); - runautostart(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; + scan(); + runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; } diff --git a/dwm.c.rej b/dwm.c.rej index 13aacf0..256f11f 100644 --- a/dwm.c.rej +++ b/dwm.c.rej @@ -1,19 +1,66 @@ --- dwm.c +++ dwm.c -@@ -62,7 +62,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ - enum { SchemeNorm, SchemeSel }; /* color schemes */ - enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, -- NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -+ NetWMWindowTypeDialog, NetClientList, NetClientInfo, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ - enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -@@ -1588,6 +1610,7 @@ setup(void) - 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[NetClientInfo] = XInternAtom(dpy, "_NET_CLIENT_INFO", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -205,6 +205,8 @@ static void setup(void); + static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void sigchld(int unused); ++static void sighup(int unused); ++static void sigterm(int unused); + static void spawn(const Arg *arg); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); +@@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { + [UnmapNotify] = unmapnotify + }; + static Atom wmatom[WMLast], netatom[NetLast]; ++static int restart = 0; + static int running = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; +@@ -1248,6 +1251,7 @@ propertynotify(XEvent *e) + void + quit(const Arg *arg) + { ++ if(arg->i) restart = 1; + running = 0; + } + +@@ -1536,6 +1540,9 @@ setup(void) + /* clean up any zombies immediately */ + sigchld(0); + ++ signal(SIGHUP, sighup); ++ signal(SIGTERM, sigterm); ++ + /* init screen */ + screen = DefaultScreen(dpy); + sw = DisplayWidth(dpy, screen); +@@ -1637,6 +1644,20 @@ sigchld(int unused) + } + + void ++sighup(int unused) ++{ ++ Arg a = {.i = 1}; ++ quit(&a); ++} ++ ++void ++sigterm(int unused) ++{ ++ Arg a = {.i = 0}; ++ quit(&a); ++} ++ ++void + spawn(const Arg *arg) + { + if (arg->v == dmenucmd) +@@ -2139,6 +2160,7 @@ main(int argc, char *argv[]) + setup(); + scan(); + run(); ++ if(restart) execvp(argv[0], argv); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; diff --git a/dwm.o b/dwm.o index a899982ce57228b2e8534816836b05c2e84dbefe..11e834033e7fc74475f3754272fad0710b8fc1c1 100644 GIT binary patch delta 31338 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 ZZ5^HRo`G8XyHT--zA!)FFHLb9{y*lvk=y_P delta 30630 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
  • q&12;#C(61nUNYLkt&|jc1-;CQSW9)F|NcR6mitpbYUxaFWJBTKO)i|0V zM-`!mF#QzKD~iywndWu-h9dM9rk^42T}9}#Og~5Tfg*H`J6x{@ruID1@ns7eg(r}C zej1nrH)j~QnML>Wry#vQ-Oyo+4*F}6<~zksx9I+U9?+?L-_fNO&3E2hW8r*X(+w8> zl%LW9qVaufk63hyp9ORmz71`BIg>N)K5Qx9gxR3x9Em-1o)!x<%g~|o1x7-e|J5y# z{Ae^V&ENN%6`>oqByScE7omqR9Z#q8^dj_Zrdd3*2)%`A7N1^(KFjoI5?@+`uF;B8 zV{y3(P4;^+&EmU?ct6eb0TMq_gkH^bB^qw{kHlC^uN`Uy^Ki0X?oLQy8K8+sLBYRq z#$v46G97PF2d|}KG4wd5d57V*jY9errVR+scql@D!8D6c7W6XzZ=05@<7Iy1)|5GW zFD>FdglUc~7tYE4?AGoMx09dN2G*kdBn7pLX!B&{#MCpQ#pGI6o^P-@^HPc+JA|l8kOV ztxQ=TPskYG8DSCp)PzYE&QDEPVd4CA1bOd648jjV$hYkI?A)fLiGRJtybc&at5nXE zpMo&S!uk0Ji!Gd=f3VZS`8fy2uj91;`9TNQt`lZA@N*6lX<^C<@pBGFSvWt*pezkm zw&$k~)VJ_|B6Js?uto4=2PRlJKXzc1h4WJfj#xN9b)ZtL83UXUKW`w?(<1nh0@E#= zA1QFe!mpprX#K(g_>ltX7S4|mm|$@8s~I}+a|EVa4*VQ}#TNc+E7PJ47S7KR*k|GV z7=cQ(E-{J1{^#ciG%7+k4u93{Y2p0sJ>A0jn!p4L=SvCGEnGiF0FOU@R0Ve(KSyA< zj>u}UcMbKMTc(T4Gz`O_tir;V$Ac4ycV{nL&88p#91>+drb-Y>)0$5b#|&XAN7;Fxh+c9|IEbL(A$5gn|nv>hVj%H%AHuz-`vfu6WBK1KibW0hud0V zw_WV8M~ulVe{|Sw5qkuG!iKWKUkM)r=b!YCf>mI8J-=3}+s=*mGg965fyuY~uffN_ zuIc_!ggf|2-QD)F=`)O0ybd?1yIUtVlc3vF&QqSht-G5TczuSNGO>zU^HdBxZ7ngd zVuoL<2PATZESveGdq5(Y_`5%pM1LiGtX%(9BYpm6v&G*p5BQgRxD8{gZZS|fKe;D3 Q&h2Cz4`D>L^r@Kt2cQ+*O8@`>