From afb783b2736615292cd111601eaa9bc1a2a75d59 Mon Sep 17 00:00:00 2001 From: Shweet Date: Sun, 28 May 2023 16:20:39 -0400 Subject: [PATCH] first commit --- config.def.h | 115 +++ config.def.h.orig | 115 +++ config.h | 4 +- drw.c | 13 - drw.o | Bin 0 -> 10328 bytes dwm | Bin 0 -> 65872 bytes dwm.c.orig | 2152 +++++++++++++++++++++++++++++++++++++++++++++ dwm.c.rej | 39 + dwm.o | Bin 0 -> 55864 bytes patches/gaps.diff | 53 ++ util.o | Bin 0 -> 2216 bytes 11 files changed, 2476 insertions(+), 15 deletions(-) create mode 100755 config.def.h create mode 100755 config.def.h.orig create mode 100644 drw.o create mode 100755 dwm create mode 100755 dwm.c.orig create mode 100755 dwm.c.rej create mode 100644 dwm.o create mode 100755 patches/gaps.diff create mode 100644 util.o diff --git a/config.def.h b/config.def.h new file mode 100755 index 0000000..b56f4fe --- /dev/null +++ b/config.def.h @@ -0,0 +1,115 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 3; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 0; /* 0 means bottom bar */ +static const char *fonts[] = { "W95FA:size=12" }; +static const char dmenufont[] = "W95FA:size=12"; +static const char col_gray1[] = "#110022"; +static const char col_gray2[] = "#330066"; +static const char col_gray3[] = "#6600bb"; +static const char col_gray4[] = "#aa00ee"; +static const char col_green[] = "#00ff00"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_green, col_green }, +}; + +/* 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 Layout layouts[] = { + /* symbol arrange function */ + { "[]", tile }, /* first entry is default */ + { "<>", NULL }, /* no layout function means floating behavior */ + { "()", monocle }, +}; + +/* 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_green, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; + +static 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, XK_Return, zoom, {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 Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { 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/config.def.h.orig b/config.def.h.orig new file mode 100755 index 0000000..6ee120e --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,115 @@ +/* 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 int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=12" }; +static const char dmenufont[] = "monospace:size=12"; +static const char col_gray1[] = "#110022"; +static const char col_gray2[] = "#330066"; +static const char col_gray3[] = "#6600bb"; +static const char col_gray4[] = "#aa00ee"; +static const char col_green[] = "#00ff00"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_green, col_green }, +}; + +/* 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 Layout layouts[] = { + /* symbol arrange function */ + { "[]", tile }, /* first entry is default */ + { "<>", NULL }, /* no layout function means floating behavior */ + { "()", monocle }, +}; + +/* 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_green, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; + +static 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, XK_Return, zoom, {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 Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { 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/config.h b/config.h index 2e8fe68..a1504ed 100755 --- a/config.h +++ b/config.h @@ -5,8 +5,8 @@ static const unsigned int borderpx = 2; /* border pixel of windows */ static const unsigned int snap = 16; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "terminus:size=12" }; -static const char dmenufont[] = "terminus:size=12"; +static const char *fonts[] = { "terminus:size=10" }; +static const char dmenufont[] = "terminus:size=10"; static const char col_text_no_sel[] = "#99cccc"; /* non-selected text */ static const char col_text_sel[] = "#ccffff"; /* select text */ static const char col_bg_no_sel[] = "#333366"; /* non-selected background */ diff --git a/drw.c b/drw.c index 4cdbcbe..c1c265c 100755 --- a/drw.c +++ b/drw.c @@ -133,19 +133,6 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) die("no font specified."); } - /* Do not allow using color fonts. This is a workaround for a BadLength - * error from Xft with color glyphs. Modelled on the Xterm workaround. See - * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - * https://lists.suckless.org/dev/1701/30932.html - * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 - * and lots more all over the internet. - */ - FcBool iscol; - if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { - XftFontClose(drw->dpy, xfont); - return NULL; - } - font = ecalloc(1, sizeof(Fnt)); font->xfont = xfont; font->pattern = pattern; diff --git a/drw.o b/drw.o new file mode 100644 index 0000000000000000000000000000000000000000..955729d0cd1ccd9f699dd47a2ddaa8eec9fbf0ba GIT binary patch literal 10328 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 T8@Nb#Uohg36rIob+s*$!E9)RK literal 0 HcmV?d00001 diff --git a/dwm b/dwm new file mode 100755 index 0000000000000000000000000000000000000000..3fb6b3faeed357e43fc0886ee574cebb17cf0533 GIT binary patch literal 65872 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 ~AE*W6|BQ(_r&S~8!o9z}hSb3Wn` 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 literal 0 HcmV?d00001 diff --git a/dwm.c.orig b/dwm.c.orig new file mode 100755 index 0000000..664c527 --- /dev/null +++ b/dwm.c.orig @@ -0,0 +1,2152 @@ +/* See LICENSE file for copyright and license details. + * + * dynamic window manager is designed like any other X client as well. It is + * driven through handling X events. In contrast to other X clients, a window + * manager selects for SubstructureRedirectMask on the root window, to receive + * events about window (dis-)appearance. Only one X connection at a time is + * allowed to select for this event mask. + * + * The event handlers of dwm are organized in an array which is accessed + * whenever a new event has been fetched. This allows event dispatching + * in O(1) time. + * + * Each child of the root window is called a client, except windows which have + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a + * client. + * + * Keys and tagging rules are organized as arrays and defined in config.h. + * + * To understand everything else, start reading main(). + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef XINERAMA +#include +#endif /* XINERAMA */ +#include + +#include "drw.h" +#include "util.h" + +/* macros */ +#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) +#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#define MOUSEMASK (BUTTONMASK|PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define TAGMASK ((1 << LENGTH(tags)) - 1) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +/* enums */ +enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ +enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ + +typedef union { + int i; + unsigned int ui; + float f; + const void *v; +} Arg; + +typedef struct { + unsigned int click; + unsigned int mask; + unsigned int button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + +typedef struct Monitor Monitor; +typedef struct Client Client; +struct Client { + char name[256]; + float mina, maxa; + int x, y, w, h; + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int bw, oldbw; + unsigned int tags; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + Client *next; + Client *snext; + Monitor *mon; + Window win; +}; + +typedef struct { + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Key; + +typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +} Layout; + +struct Monitor { + char ltsymbol[16]; + float mfact; + int nmaster; + int num; + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; + int showbar; + int topbar; + Client *clients; + Client *sel; + Client *stack; + Monitor *next; + Window barwin; + const Layout *lt[2]; +}; + +typedef struct { + const char *class; + const char *instance; + const char *title; + unsigned int tags; + int isfloating; + int monitor; +} Rule; + +/* function declarations */ +static void applyrules(Client *c); +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); +static void attach(Client *c); +static void attachstack(Client *c); +static void buttonpress(XEvent *e); +static void checkotherwm(void); +static void cleanup(void); +static void cleanupmon(Monitor *mon); +static void clientmessage(XEvent *e); +static void configure(Client *c); +static void configurenotify(XEvent *e); +static void configurerequest(XEvent *e); +static Monitor *createmon(void); +static void destroynotify(XEvent *e); +static void detach(Client *c); +static void detachstack(Client *c); +static Monitor *dirtomon(int dir); +static void drawbar(Monitor *m); +static void drawbars(void); +static void enternotify(XEvent *e); +static void expose(XEvent *e); +static void focus(Client *c); +static void focusin(XEvent *e); +static void focusmon(const Arg *arg); +static void focusstack(const Arg *arg); +static Atom getatomprop(Client *c, Atom prop); +static int getrootptr(int *x, int *y); +static long getstate(Window w); +static int gettextprop(Window w, Atom atom, char *text, unsigned int size); +static void grabbuttons(Client *c, int focused); +static void grabkeys(void); +static void incnmaster(const Arg *arg); +static void keypress(XEvent *e); +static void killclient(const Arg *arg); +static void manage(Window w, XWindowAttributes *wa); +static void mappingnotify(XEvent *e); +static void maprequest(XEvent *e); +static void monocle(Monitor *m); +static void motionnotify(XEvent *e); +static void movemouse(const Arg *arg); +static Client *nexttiled(Client *c); +static void pop(Client *); +static void propertynotify(XEvent *e); +static void quit(const Arg *arg); +static Monitor *recttomon(int x, int y, int w, int h); +static void resize(Client *c, int x, int y, int w, int h, int interact); +static void resizeclient(Client *c, int x, int y, int w, int h); +static void resizemouse(const Arg *arg); +static void restack(Monitor *m); +static void run(void); +static void scan(void); +static int sendevent(Client *c, Atom proto); +static void sendmon(Client *c, Monitor *m); +static void setclientstate(Client *c, long state); +static void setfocus(Client *c); +static void setfullscreen(Client *c, int fullscreen); +static void setlayout(const Arg *arg); +static void setmfact(const Arg *arg); +static void setup(void); +static void seturgent(Client *c, int urg); +static void showhide(Client *c); +static void sigchld(int unused); +static void spawn(const Arg *arg); +static void tag(const Arg *arg); +static void tagmon(const Arg *arg); +static void tile(Monitor *); +static void togglebar(const Arg *arg); +static void togglefloating(const Arg *arg); +static void toggletag(const Arg *arg); +static void toggleview(const Arg *arg); +static void unfocus(Client *c, int setfocus); +static void unmanage(Client *c, int destroyed); +static void unmapnotify(XEvent *e); +static void updatebarpos(Monitor *m); +static void updatebars(void); +static void updateclientlist(void); +static int updategeom(void); +static void updatenumlockmask(void); +static void updatesizehints(Client *c); +static void updatestatus(void); +static void updatetitle(Client *c); +static void updatewindowtype(Client *c); +static void updatewmhints(Client *c); +static void view(const Arg *arg); +static Client *wintoclient(Window w); +static Monitor *wintomon(Window w); +static int xerror(Display *dpy, XErrorEvent *ee); +static int xerrordummy(Display *dpy, XErrorEvent *ee); +static int xerrorstart(Display *dpy, XErrorEvent *ee); +static void zoom(const Arg *arg); + +/* variables */ +static const char broken[] = "broken"; +static char stext[256]; +static int screen; +static int sw, sh; /* X display screen geometry width, height */ +static int bh, blw = 0; /* bar geometry */ +static int 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, + [UnmapNotify] = unmapnotify +}; +static Atom wmatom[WMLast], netatom[NetLast]; +static int running = 1; +static Cur *cursor[CurLast]; +static Clr **scheme; +static Display *dpy; +static Drw *drw; +static Monitor *mons, *selmon; +static Window root, wmcheckwin; + +/* configuration, allows nested code to access above variables */ +#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]; }; + +/* function implementations */ +void +applyrules(Client *c) +{ + const char *class, *instance; + unsigned int i; + const Rule *r; + Monitor *m; + XClassHint ch = { NULL, NULL }; + + /* rule matching */ + c->isfloating = 0; + c->tags = 0; + XGetClassHint(dpy, c->win, &ch); + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; + + for (i = 0; i < LENGTH(rules); i++) { + r = &rules[i]; + if ((!r->title || strstr(c->name, r->title)) + && (!r->class || strstr(class, r->class)) + && (!r->instance || strstr(instance, r->instance))) + { + c->isfloating = r->isfloating; + c->tags |= r->tags; + for (m = mons; m && m->num != r->monitor; m = m->next); + if (m) + c->mon = m; + } + } + if (ch.res_class) + XFree(ch.res_class); + if (ch.res_name) + XFree(ch.res_name); + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; +} + +int +applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) +{ + int baseismin; + Monitor *m = c->mon; + + /* set minimum possible */ + *w = MAX(1, *w); + *h = MAX(1, *h); + if (interact) { + if (*x > sw) + *x = sw - WIDTH(c); + if (*y > sh) + *y = sh - HEIGHT(c); + if (*x + *w + 2 * c->bw < 0) + *x = 0; + if (*y + *h + 2 * c->bw < 0) + *y = 0; + } else { + if (*x >= m->wx + m->ww) + *x = m->wx + m->ww - WIDTH(c); + if (*y >= m->wy + m->wh) + *y = m->wy + m->wh - HEIGHT(c); + if (*x + *w + 2 * c->bw <= m->wx) + *x = m->wx; + if (*y + *h + 2 * c->bw <= m->wy) + *y = m->wy; + } + if (*h < bh) + *h = bh; + if (*w < bh) + *w = bh; + if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + /* see last two sentences in ICCCM 4.1.2.3 */ + baseismin = c->basew == c->minw && c->baseh == c->minh; + if (!baseismin) { /* temporarily remove base dimensions */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for aspect limits */ + if (c->mina > 0 && c->maxa > 0) { + if (c->maxa < (float)*w / *h) + *w = *h * c->maxa + 0.5; + else if (c->mina < (float)*h / *w) + *h = *w * c->mina + 0.5; + } + if (baseismin) { /* increment calculation requires this */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for increment value */ + if (c->incw) + *w -= *w % c->incw; + if (c->inch) + *h -= *h % c->inch; + /* restore base dimensions */ + *w = MAX(*w + c->basew, c->minw); + *h = MAX(*h + c->baseh, c->minh); + if (c->maxw) + *w = MIN(*w, c->maxw); + if (c->maxh) + *h = MIN(*h, c->maxh); + } + return *x != c->x || *y != c->y || *w != c->w || *h != c->h; +} + +void +arrange(Monitor *m) +{ + if (m) + showhide(m->stack); + else for (m = mons; m; m = m->next) + showhide(m->stack); + if (m) { + arrangemon(m); + restack(m); + } else for (m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) +{ + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if (m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); +} + +void +attach(Client *c) +{ + c->next = c->mon->clients; + c->mon->clients = c; +} + +void +attachstack(Client *c) +{ + c->snext = c->mon->stack; + c->mon->stack = c; +} + +void +buttonpress(XEvent *e) +{ + unsigned int i, x, click; + Arg arg = {0}; + Client *c; + Monitor *m; + XButtonPressedEvent *ev = &e->xbutton; + + click = ClkRootWin; + /* focus monitor if necessary */ + if ((m = wintomon(ev->window)) && m != selmon) { + unfocus(selmon->sel, 1); + selmon = m; + focus(NULL); + } + if (ev->window == selmon->barwin) { + i = x = 0; + 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 + blw) + click = ClkLtSymbol; + else if (ev->x > selmon->ww - (int)TEXTW(stext)) + 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) +{ + xerrorxlib = XSetErrorHandler(xerrorstart); + /* this causes an error if some other window manager is running */ + XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); + XSync(dpy, False); + XSetErrorHandler(xerror); + XSync(dpy, False); +} + +void +cleanup(void) +{ + Arg a = {.ui = ~0}; + Layout foo = { "", NULL }; + Monitor *m; + size_t i; + + view(&a); + selmon->lt[selmon->sellt] = &foo; + for (m = mons; m; m = m->next) + while (m->stack) + unmanage(m->stack, 0); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) + free(scheme[i]); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); +} + +void +cleanupmon(Monitor *mon) +{ + Monitor *m; + + if (mon == mons) + mons = mons->next; + else { + for (m = mons; m && m->next != mon; m = m->next); + m->next = mon->next; + } + XUnmapWindow(dpy, mon->barwin); + XDestroyWindow(dpy, mon->barwin); + free(mon); +} + +void +clientmessage(XEvent *e) +{ + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + 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) +{ + XConfigureEvent ce; + + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->bw; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); +} + +void +configurenotify(XEvent *e) +{ + Monitor *m; + 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); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + } + focus(NULL); + arrange(NULL); + } + } +} + +void +configurerequest(XEvent *e) +{ + Client *c; + Monitor *m; + XConfigureRequestEvent *ev = &e->xconfigurerequest; + XWindowChanges wc; + + if ((c = wintoclient(ev->window))) { + if (ev->value_mask & CWBorderWidth) + c->bw = ev->border_width; + else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + m = c->mon; + if (ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if (ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } + if (ev->value_mask & CWWidth) { + c->oldw = c->w; + c->w = ev->width; + } + if (ev->value_mask & CWHeight) { + c->oldh = c->h; + c->h = ev->height; + } + if ((c->x + c->w) > m->mx + m->mw && c->isfloating) + c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ + if ((c->y + c->h) > m->my + m->mh && c->isfloating) + c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ + if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) + configure(c); + if (ISVISIBLE(c)) + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + } else + configure(c); + } else { + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; + wc.border_width = ev->border_width; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); + } + XSync(dpy, False); +} + +Monitor * +createmon(void) +{ + Monitor *m; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; + m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + return m; +} + +void +destroynotify(XEvent *e) +{ + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); +} + +void +detach(Client *c) +{ + Client **tc; + + for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; +} + +void +detachstack(Client *c) +{ + Client **tc, *t; + + for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); + *tc = c->snext; + + if (c == c->mon->sel) { + for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); + c->mon->sel = t; + } +} + +Monitor * +dirtomon(int dir) +{ + Monitor *m = NULL; + + if (dir > 0) { + if (!(m = selmon->next)) + m = mons; + } else if (selmon == mons) + for (m = mons; m->next; m = m->next); + else + for (m = mons; m->next != selmon; m = m->next); + return m; +} + +void +drawbar(Monitor *m) +{ + int x, w, tw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; + + /* 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; /* 2px right padding */ + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); + } + + 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 = blw = 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 - 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, bh); +} + +void +drawbars(void) +{ + Monitor *m; + + for (m = mons; m; m = m->next) + drawbar(m); +} + +void +enternotify(XEvent *e) +{ + Client *c; + Monitor *m; + XCrossingEvent *ev = &e->xcrossing; + + if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) + return; + c = wintoclient(ev->window); + m = c ? c->mon : wintomon(ev->window); + if (m != selmon) { + unfocus(selmon->sel, 1); + selmon = m; + } else if (!c || c == selmon->sel) + return; + focus(c); +} + +void +expose(XEvent *e) +{ + Monitor *m; + XExposeEvent *ev = &e->xexpose; + + if (ev->count == 0 && (m = wintomon(ev->window))) + drawbar(m); +} + +void +focus(Client *c) +{ + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + 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) +{ + XFocusChangeEvent *ev = &e->xfocus; + + if (selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); +} + +void +focusmon(const Arg *arg) +{ + Monitor *m; + + if (!mons->next) + return; + if ((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, 0); + selmon = m; + focus(NULL); +} + +void +focusstack(const Arg *arg) +{ + Client *c = NULL, *i; + + if (!selmon->sel) + return; + if (arg->i > 0) { + for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (!c) + for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + } else { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i)) + c = i; + if (!c) + for (; i; i = i->next) + if (ISVISIBLE(i)) + c = i; + } + if (c) { + focus(c); + restack(selmon); + } +} + +Atom +getatomprop(Client *c, Atom prop) +{ + int di; + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; + XFree(p); + } + return atom; +} + +int +getrootptr(int *x, int *y) +{ + int di; + unsigned int dui; + Window dummy; + + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); +} + +long +getstate(Window w) +{ + int format; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], + &real, &format, &n, &extra, (unsigned char **)&p) != Success) + return -1; + if (n != 0) + result = *p; + XFree(p); + return result; +} + +int +gettextprop(Window w, Atom atom, char *text, unsigned int size) +{ + char **list = NULL; + int n; + XTextProperty name; + + if (!text || size == 0) + return 0; + text[0] = '\0'; + 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) +{ + 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) +{ + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + KeyCode code; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + for (i = 0; i < LENGTH(keys); i++) + if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, + True, GrabModeAsync, GrabModeAsync); + } +} + +void +incnmaster(const Arg *arg) +{ + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); +} + +#ifdef XINERAMA +static int +isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +{ + while (n--) + if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org + && unique[n].width == info->width && unique[n].height == info->height) + return 0; + return 1; +} +#endif /* XINERAMA */ + +void +keypress(XEvent *e) +{ + unsigned int i; + KeySym keysym; + XKeyEvent *ev; + + ev = &e->xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + for (i = 0; i < LENGTH(keys); i++) + if (keysym == keys[i].keysym + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) + keys[i].func(&(keys[i].arg)); +} + +void +killclient(const Arg *arg) +{ + if (!selmon->sel) + return; + if (!sendevent(selmon->sel, wmatom[WMDelete])) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); + XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } +} + +void +manage(Window w, XWindowAttributes *wa) +{ + Client *c, *t = NULL; + Window trans = None; + XWindowChanges wc; + + c = ecalloc(1, sizeof(Client)); + c->win = w; + /* 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; + + 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->mx + c->mon->mw) + c->x = c->mon->mx + c->mon->mw - WIDTH(c); + if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) + c->y = c->mon->my + c->mon->mh - HEIGHT(c); + c->x = MAX(c->x, c->mon->mx); + /* only fix client y-offset, if the client center might cover the bar */ + c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + c->bw = borderpx; + + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][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); + attach(c); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ + setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); + XMapWindow(dpy, c->win); + focus(NULL); +} + +void +mappingnotify(XEvent *e) +{ + XMappingEvent *ev = &e->xmapping; + + XRefreshKeyboardMapping(ev); + if (ev->request == MappingKeyboard) + grabkeys(); +} + +void +maprequest(XEvent *e) +{ + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + + if (!XGetWindowAttributes(dpy, ev->window, &wa)) + return; + if (wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); +} + +void +monocle(Monitor *m) +{ + unsigned int n = 0; + Client *c; + + for (c = m->clients; c; c = c->next) + if (ISVISIBLE(c)) + n++; + if (n > 0) /* override layout symbol */ + snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); + for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); +} + +void +motionnotify(XEvent *e) +{ + static Monitor *mon = NULL; + Monitor *m; + XMotionEvent *ev = &e->xmotion; + + if (ev->window != root) + return; + if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + unfocus(selmon->sel, 1); + selmon = m; + focus(NULL); + } + mon = m; +} + +void +movemouse(const Arg *arg) +{ + int x, y, ocx, ocy, nx, ny; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) + return; + if (!getrootptr(&x, &y)) + return; + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nx = ocx + (ev.xmotion.x - x); + ny = ocy + (ev.xmotion.y - y); + if (abs(selmon->wx - nx) < snap) + nx = selmon->wx; + else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) + nx = selmon->wx + selmon->ww - WIDTH(c); + if (abs(selmon->wy - ny) < snap) + ny = selmon->wy; + else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) + ny = selmon->wy + selmon->wh - HEIGHT(c); + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) + togglefloating(NULL); + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, nx, ny, c->w, c->h, 1); + break; + } + } while (ev.type != ButtonRelease); + XUngrabPointer(dpy, CurrentTime); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +Client * +nexttiled(Client *c) +{ + for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + return c; +} + +void +pop(Client *c) +{ + detach(c); + attach(c); + focus(c); + arrange(c->mon); +} + +void +propertynotify(XEvent *e) +{ + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) + return; /* ignore */ + else if ((c = wintoclient(ev->window))) { + switch(ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && + (c->isfloating = (wintoclient(trans)) != NULL)) + arrange(c->mon); + break; + case XA_WM_NORMAL_HINTS: + updatesizehints(c); + break; + case XA_WM_HINTS: + updatewmhints(c); + drawbars(); + break; + } + if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { + updatetitle(c); + if (c == c->mon->sel) + drawbar(c->mon); + } + if (ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); + } +} + +void +quit(const Arg *arg) +{ + running = 0; +} + +Monitor * +recttomon(int x, int y, int w, int h) +{ + Monitor *m, *r = selmon; + int a, area = 0; + + for (m = mons; m; m = m->next) + if ((a = INTERSECT(x, y, w, h, m)) > area) { + area = a; + r = m; + } + return r; +} + +void +resize(Client *c, int x, int y, int w, int h, int interact) +{ + if (applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); +} + +void +resizeclient(Client *c, int x, int y, int w, int h) +{ + XWindowChanges wc; + + 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) +{ + int ocx, ocy, nw, nh; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) + return; + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); + nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); + if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww + && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) + { + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) + togglefloating(NULL); + } + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, c->x, c->y, nw, nh, 1); + break; + } + } while (ev.type != ButtonRelease); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + XUngrabPointer(dpy, CurrentTime); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +void +restack(Monitor *m) +{ + Client *c; + XEvent ev; + XWindowChanges wc; + + drawbar(m); + if (!m->sel) + return; + if (m->sel->isfloating || !m->lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); + if (m->lt[m->sellt]->arrange) { + wc.stack_mode = Below; + wc.sibling = m->barwin; + for (c = m->stack; c; c = c->snext) + if (!c->isfloating && ISVISIBLE(c)) { + XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); + wc.sibling = c->win; + } + } + XSync(dpy, False); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +run(void) +{ + XEvent ev; + /* main event loop */ + XSync(dpy, False); + while (running && !XNextEvent(dpy, &ev)) + if (handler[ev.type]) + handler[ev.type](&ev); /* call handler */ +} + +void +scan(void) +{ + unsigned int i, num; + Window d1, d2, *wins = NULL; + XWindowAttributes wa; + + if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for (i = 0; i < num; i++) { + if (!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) + manage(wins[i], &wa); + } + for (i = 0; i < num; i++) { /* now the transients */ + if (!XGetWindowAttributes(dpy, wins[i], &wa)) + continue; + if (XGetTransientForHint(dpy, wins[i], &d1) + && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) + manage(wins[i], &wa); + } + if (wins) + XFree(wins); + } +} + +void +sendmon(Client *c, Monitor *m) +{ + if (c->mon == m) + return; + unfocus(c, 1); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); +} + +void +setclientstate(Client *c, long state) +{ + long data[] = { state, None }; + + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); +} + +int +sendevent(Client *c, Atom proto) +{ + int n; + Atom *protocols; + int exists = 0; + XEvent ev; + + if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + if (exists) { + ev.type = ClientMessage; + ev.xclient.window = c->win; + ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.format = 32; + ev.xclient.data.l[0] = proto; + ev.xclient.data.l[1] = CurrentTime; + XSendEvent(dpy, c->win, False, NoEventMask, &ev); + } + return exists; +} + +void +setfocus(Client *c) +{ + if (!c->neverfocus) { + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + XChangeProperty(dpy, root, netatom[NetActiveWindow], + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } + sendevent(c, wmatom[WMTakeFocus]); +} + +void +setfullscreen(Client *c, int fullscreen) +{ + if (fullscreen && !c->isfullscreen) { + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + c->isfullscreen = 1; + c->oldstate = c->isfloating; + c->oldbw = c->bw; + c->bw = 0; + c->isfloating = 1; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } else if (!fullscreen && c->isfullscreen){ + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + c->isfullscreen = 0; + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + arrange(c->mon); + } +} + +void +setlayout(const Arg *arg) +{ + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->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); +} + +/* arg > 1.0 will set mfact absolutely */ +void +setmfact(const Arg *arg) +{ + float f; + + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; + selmon->mfact = f; + arrange(selmon); +} + +void +setup(void) +{ + int i; + XSetWindowAttributes wa; + Atom utf8string; + + /* clean up any zombies immediately */ + sigchld(0); + + /* init screen */ + screen = DefaultScreen(dpy); + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + drw = drw_create(dpy, screen, root, sw, sh); + 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[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); + /* 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 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); +} + + +void +seturgent(Client *c, int urg) +{ + 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); +} + +void +showhide(Client *c) +{ + if (!c) + return; + if (ISVISIBLE(c)) { + /* show clients top down */ + XMoveWindow(dpy, c->win, c->x, c->y); + if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) + resize(c, c->x, c->y, c->w, c->h, 0); + showhide(c->snext); + } else { + /* hide clients bottom up */ + showhide(c->snext); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + } +} + +void +sigchld(int unused) +{ + if (signal(SIGCHLD, sigchld) == SIG_ERR) + die("can't install SIGCHLD handler:"); + while (0 < waitpid(-1, NULL, WNOHANG)); +} + +void +spawn(const Arg *arg) +{ + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; + if (fork() == 0) { + if (dpy) + close(ConnectionNumber(dpy)); + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); + perror(" failed"); + exit(EXIT_SUCCESS); + } +} + +void +tag(const Arg *arg) +{ + if (selmon->sel && arg->ui & TAGMASK) { + selmon->sel->tags = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); + } +} + +void +tagmon(const Arg *arg) +{ + if (!selmon->sel || !mons->next) + return; + sendmon(selmon->sel, dirtomon(arg->i)); +} + +void +tile(Monitor *m) +{ + unsigned int i, n, h, mw, my, ty; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + if (n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + mw = m->ww; + for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + h = (m->wh - my) / (MIN(n, m->nmaster) - i); + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + if (my + HEIGHT(c) < m->wh) + my += HEIGHT(c); + } else { + h = (m->wh - ty) / (n - i); + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + if (ty + HEIGHT(c) < m->wh) + ty += HEIGHT(c); + } +} + +void +togglebar(const Arg *arg) +{ + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +} + +void +togglefloating(const Arg *arg) +{ + if (!selmon->sel) + return; + if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ + return; + selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; + if (selmon->sel->isfloating) + resize(selmon->sel, selmon->sel->x, selmon->sel->y, + selmon->sel->w, selmon->sel->h, 0); + arrange(selmon); +} + +void +toggletag(const Arg *arg) +{ + unsigned int newtags; + + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) { + selmon->sel->tags = newtags; + focus(NULL); + arrange(selmon); + } +} + +void +toggleview(const Arg *arg) +{ + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } +} + +void +unfocus(Client *c, int setfocus) +{ + 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 +unmanage(Client *c, int destroyed) +{ + Monitor *m = c->mon; + XWindowChanges wc; + + detach(c); + detachstack(c); + if (!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ + XSetErrorHandler(xerrordummy); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } + free(c); + focus(NULL); + updateclientlist(); + arrange(m); +} + +void +unmapnotify(XEvent *e) +{ + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if ((c = wintoclient(ev->window))) { + if (ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, 0); + } +} + +void +updatebars(void) +{ + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixmap = ParentRelative, + .event_mask = ButtonPressMask|ExposureMask + }; + XClassHint ch = {"dwm", "dwm"}; + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +} + +void +updatebarpos(Monitor *m) +{ + m->wy = m->my; + m->wh = m->mh; + if (m->showbar) { + m->wh -= bh; + m->by = m->topbar ? m->wy : m->wy + m->wh; + m->wy = m->topbar ? m->wy + bh : m->wy; + } else + m->by = -bh; +} + +void +updateclientlist() +{ + Client *c; + Monitor *m; + + XDeleteProperty(dpy, root, netatom[NetClientList]); + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + XChangeProperty(dpy, root, netatom[NetClientList], + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +} + +int +updategeom(void) +{ + int dirty = 0; + +#ifdef XINERAMA + if (XineramaIsActive(dpy)) { + int i, j, n, nn; + Client *c; + Monitor *m; + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); + XineramaScreenInfo *unique = NULL; + + for (n = 0, m = mons; m; m = m->next, n++); + /* only consider unique geometries as separate screens */ + unique = ecalloc(nn, sizeof(XineramaScreenInfo)); + for (i = 0, j = 0; i < nn; i++) + if (isuniquegeom(unique, j, &info[i])) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; + if (n <= nn) { /* new monitors available */ + for (i = 0; i < (nn - n); 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); + } + } else { /* less monitors available nn < n */ + 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); + attachstack(c); + } + if (m == selmon) + selmon = mons; + cleanupmon(m); + } + } + free(unique); + } else +#endif /* XINERAMA */ + { /* default monitor setup */ + if (!mons) + mons = createmon(); + if (mons->mw != sw || mons->mh != sh) { + dirty = 1; + mons->mw = mons->ww = sw; + mons->mh = mons->wh = sh; + updatebarpos(mons); + } + } + if (dirty) { + selmon = mons; + selmon = wintomon(root); + } + return dirty; +} + +void +updatenumlockmask(void) +{ + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) + for (j = 0; j < modmap->max_keypermod; j++) + if (modmap->modifiermap[i * modmap->max_keypermod + j] + == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + +void +updatesizehints(Client *c) +{ + long msize; + XSizeHints size; + + if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) + /* size is uninitialized, ensure that size.flags aren't used */ + size.flags = PSize; + if (size.flags & PBaseSize) { + c->basew = size.base_width; + c->baseh = size.base_height; + } else if (size.flags & PMinSize) { + c->basew = size.min_width; + c->baseh = size.min_height; + } else + c->basew = c->baseh = 0; + if (size.flags & PResizeInc) { + c->incw = size.width_inc; + c->inch = size.height_inc; + } else + c->incw = c->inch = 0; + if (size.flags & PMaxSize) { + c->maxw = size.max_width; + c->maxh = size.max_height; + } else + c->maxw = c->maxh = 0; + if (size.flags & PMinSize) { + c->minw = size.min_width; + c->minh = size.min_height; + } else if (size.flags & PBaseSize) { + c->minw = size.base_width; + c->minh = size.base_height; + } else + c->minw = c->minh = 0; + if (size.flags & PAspect) { + c->mina = (float)size.min_aspect.y / size.min_aspect.x; + c->maxa = (float)size.max_aspect.x / size.max_aspect.y; + } else + c->maxa = c->mina = 0.0; + c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); +} + +void +updatestatus(void) +{ + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); +} + +void +updatetitle(Client *c) +{ + if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if (c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); +} + +void +updatewindowtype(Client *c) +{ + Atom state = getatomprop(c, netatom[NetWMState]); + Atom wtype = getatomprop(c, netatom[NetWMWindowType]); + + if (state == netatom[NetWMFullscreen]) + setfullscreen(c, 1); + if (wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = 1; +} + +void +updatewmhints(Client *c) +{ + XWMHints *wmh; + + if ((wmh = XGetWMHints(dpy, c->win))) { + if (c == selmon->sel && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } else + c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; + if (wmh->flags & InputHint) + c->neverfocus = !wmh->input; + else + c->neverfocus = 0; + XFree(wmh); + } +} + +void +view(const Arg *arg) +{ + 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 *c; + Monitor *m; + + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + if (c->win == w) + return c; + return NULL; +} + +Monitor * +wintomon(Window w) +{ + int x, y; + Client *c; + Monitor *m; + + if (w == root && getrootptr(&x, &y)) + return recttomon(x, y, 1, 1); + for (m = mons; m; m = m->next) + if (w == m->barwin) + return m; + if ((c = wintoclient(w))) + return c->mon; + return selmon; +} + +/* There's no way to check accesses to destroyed windows, thus those cases are + * ignored (especially on UnmapNotify's). Other types of errors call Xlibs + * default error handler, which may call exit. */ +int +xerror(Display *dpy, XErrorEvent *ee) +{ + if (ee->error_code == BadWindow + || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) + || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) + || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) + || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) + || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) + || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) + || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) + || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) + return 0; + fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", + ee->request_code, ee->error_code); + return xerrorxlib(dpy, ee); /* may call exit */ +} + +int +xerrordummy(Display *dpy, XErrorEvent *ee) +{ + return 0; +} + +/* Startup Error handler to check if another window manager + * is already running. */ +int +xerrorstart(Display *dpy, XErrorEvent *ee) +{ + die("dwm: another window manager is already running"); + return -1; +} + +void +zoom(const Arg *arg) +{ + Client *c = selmon->sel; + + if (!selmon->lt[selmon->sellt]->arrange + || (selmon->sel && selmon->sel->isfloating)) + return; + if (c == nexttiled(selmon->clients)) + if (!c || !(c = nexttiled(c->next))) + return; + pop(c); +} + +int +main(int argc, char *argv[]) +{ + if (argc == 2 && !strcmp("-v", argv[1])) + die("dwm-"VERSION); + 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"); +#endif /* __OpenBSD__ */ + scan(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} diff --git a/dwm.c.rej b/dwm.c.rej new file mode 100755 index 0000000..96cdbd9 --- /dev/null +++ b/dwm.c.rej @@ -0,0 +1,39 @@ +--- dwm.c ++++ dwm.c +@@ -1703,7 +1703,7 @@ textnw(const char *text, unsigned int len) { + + void + tile(Monitor *m) { +- unsigned int i, n, h, mw, my, ty; ++ unsigned int i, n, h, r, g = 0, mw, my, ty; + Client *c; + + for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); +@@ -1711,19 +1711,21 @@ tile(Monitor *m) { + return; + + if(n > m->nmaster) +- mw = m->nmaster ? m->ww * m->mfact : 0; ++ mw = m->nmaster ? (m->ww - (g = gappx)) * m->mfact : 0; + else + mw = m->ww; + for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if(i < m->nmaster) { +- h = (m->wh - my) / (MIN(n, m->nmaster) - i); ++ r = MIN(n, m->nmaster) - i; ++ h = (m->wh - my - gappx * (r - 1)) / r; + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False); +- my += HEIGHT(c); ++ my += HEIGHT(c) + gappx; + } + else { +- h = (m->wh - ty) / (n - i); +- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), False); +- ty += HEIGHT(c); ++ r = n - i; ++ h = (m->wh - ty - gappx * (r - 1)) / r; ++ resize(c, m->wx + mw + g, m->wy + ty, m->ww - mw - g - (2*c->bw), h - (2*c->bw), False); ++ ty += HEIGHT(c) + gappx; + } + } + diff --git a/dwm.o b/dwm.o new file mode 100644 index 0000000000000000000000000000000000000000..0c36dccc3edfcd68143d29b8434894cb9728bbdb GIT binary patch literal 55864 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 z{qErOwq8clients); c; c = nexttiled(c->next), n++); +@@ -1711,19 +1711,21 @@ tile(Monitor *m) { + return; + + if(n > m->nmaster) +- mw = m->nmaster ? m->ww * m->mfact : 0; ++ mw = m->nmaster ? (m->ww - (g = gappx)) * m->mfact : 0; + else + mw = m->ww; + for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if(i < m->nmaster) { +- h = (m->wh - my) / (MIN(n, m->nmaster) - i); ++ r = MIN(n, m->nmaster) - i; ++ h = (m->wh - my - gappx * (r - 1)) / r; + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False); +- my += HEIGHT(c); ++ my += HEIGHT(c) + gappx; + } + else { +- h = (m->wh - ty) / (n - i); +- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), False); +- ty += HEIGHT(c); ++ r = n - i; ++ h = (m->wh - ty - gappx * (r - 1)) / r; ++ resize(c, m->wx + mw + g, m->wy + ty, m->ww - mw - g - (2*c->bw), h - (2*c->bw), False); ++ ty += HEIGHT(c) + gappx; + } + } + diff --git a/util.o b/util.o new file mode 100644 index 0000000000000000000000000000000000000000..b1b45c326835f724632a67a3815c8745f2d7da1a GIT binary patch literal 2216 zcmbtVJ!n%=6h5!5Hr6zWZHG!7B3vbb`e+J5NmZha_9;PXRn#t;CNDOaKVNPnRl$mN z2qnHbf`g!=(4d2>qmy+M>QDy{=7Uon>yE} zX&_C5Q?NUeEI?$>uAi{o1O%WTE*p()zCXB`vmM|JAW~3TPHj_f{`f`iM zgV7|r6^y1>B^Z6imQWsyK4+^ozF=!MzGiQ1e8*ZgzGt5iv&Kr#kq9~l7L3GN#>z>Y z;Owi>TxMG$Fl;ohu#nMAvawG|7V;sDI5Z~0;qU0c(j*uw$I0WPMq`5-_Sper1-+$* z-R*d7a6OE1n~k+?*z8;Hlhiuxjm=(i5}&qeexqr3WD|2AGwDL1oQVTWPff+ck?D(9 zqv6=N9@D88=)n=jLEDKT=mM=poZNFw%=aNjHskd>ivSJ-$g_6Vf4vJPea-X z;YePd59rm!B2UjFa?8O5=~-qWt#h-^LC>an8ua;U6?Cgi6OzaD80eXDv1pc1QYv#( z$ESC!%F~%UVt%_+(<@dP&y6o)Dit&rZsx3X(UhJ2ABHiVwt~)9wS<@qh<%bV*AzxD zK>L@F0)Z9UY&4%p*pEKB&iiz}6BIuxcp)dswpsT=f_KxS$WzUK&5vO&)f~s6np|J@ zD`Rqfi3tplZ+}Fk2yspb1{IE6nJ4kQ!l}}t6sV+!_6BnF&eXd~DHW0L?#umq?xL2Y z?)){8KSRY7bLST@=5_vcBGKgfbpG_dWj=jh$-LGkp8hY$CIr%(rjqV_s_8y^q#z>5 ZGc-|5l-ptG`|p+iQuO~|N9j23{J$Ja3UB}b literal 0 HcmV?d00001