From 1b91a8df3da09d20c073866fbf45d3cb5cb0c7b0 Mon Sep 17 00:00:00 2001 From: kvj Date: Tue, 24 Oct 2023 12:46:31 +0200 Subject: [PATCH] Minor tweaks --- barinfo | 0 config.def.h.orig | 227 ++++ config.def.h.rej | 18 + config.h | 29 +- config.h.save | 249 ++++ drw.o | Bin 11240 -> 11224 bytes dwm | Bin 92144 -> 87176 bytes dwm.c | 55 +- dwm.c.orig | 2943 +++++++++++++++++++++++++++++++++++++++++++++ dwm.c.rej | 57 + dwm.o | Bin 88504 -> 87696 bytes util.o | Bin 2216 -> 2256 bytes 12 files changed, 3517 insertions(+), 61 deletions(-) mode change 100644 => 100755 barinfo create mode 100644 config.def.h.orig create mode 100644 config.def.h.rej create mode 100644 config.h.save create mode 100644 dwm.c.orig create mode 100644 dwm.c.rej diff --git a/barinfo b/barinfo old mode 100644 new mode 100755 diff --git a/config.def.h.orig b/config.def.h.orig new file mode 100644 index 0000000..c3d1e47 --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,227 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +#include +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const int user_bh = 27; /* 0 means that dwm will calculate bar height, >= + 1 means dwm will user_bh as bar height */ +static const int swallowfloating = + 0; /* 1 means swallow floating windows by default */ +static const unsigned int snap = 1; /* snap pixel */ +static const unsigned int gappih = 6; /* horiz inner gap between windows */ +static const unsigned int gappiv = 6; /* vert inner gap between windows */ +static const unsigned int gappoh = + 6; /* horiz outer gap between windows and screen edge */ +static const unsigned int gappov = + 6; /* vert outer gap between windows and screen edge */ +static const char buttonbar[] = " "; +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 int horizpadbar = 3; /* horizontal padding for statusbar */ +static const int vertpadbar = 10; /* vertical padding for statusbar */ +static const int vertpad = 0; /* vertical padding of bar */ +static const int sidepad = 0; /* horizontal padding of bar */ +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 unsigned int systrayiconsize = 20; /* systray icon size in px */ +static const int showsystray = 1; /* 0 means no systray */ +static const char *fonts[] = { + "Iosevka Nerd Font:size=12:style=Regular", + "Noto Color Emoji:size=12:antialias=true:autohint=true", + "Material Design Icons Desktop:size=11"}; +static const char dmenufont[] = "Iosevka Nerd Font:size=12"; +static const char col_back[] = "#121111"; +static const char col_gray1[] = "#212126"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#dbdfdf"; +static const char col_blue[] = "#808fbe"; +static const char col_orange[] = "#eaac79"; +static const char col_red[] = "#c15a5e"; +static const char col_green[] = "#8fa176"; +static const char col_cyan[] = "#8cb5af"; +static const char col_yellow[] = "#d8b170"; +static const char col_magenta[] = "#b183ba"; + +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = {col_gray3, col_back, col_gray2}, + [SchemeBtn] = {col_blue, col_gray1, col_gray2}, + [SchemeLt] = {col_gray4, col_back, col_gray2}, + [SchemeSel] = {col_gray4, col_blue, col_blue}, +}; +static const char *tagsel[][2] = { + {col_green, col_back}, {col_red, col_back}, {col_yellow, col_back}, + {col_blue, col_back}, {col_magenta, col_back}, {col_cyan, col_back}, +}; + +typedef struct { + const char *name; + const void *cmd; +} Sp; +const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x28", NULL}; +const char *spcmd2[] = {"st", "-n", "spmpd", "-e", "ncmpcpp", NULL}; +static Sp scratchpads[] = { + /* name cmd */ + {"spterm", spcmd1}, + {"spmpd", spcmd2}, +}; + +static const StatusCmd statuscmds[] = { + {"~/.local/bin/statusbar/power", 1}, + {"~/.local/bin/statusbar/wifi", 2}, + {"~/.local/bin/statusbar/calendar", 3}, + {"~/.local/bin/statusbar/battery", 4}, + {"~/.local/bin/statusbar/sound", 5}, + {"~/.local/bin/statusbar/mindash", 6}, + {"~/.local/bin/statusbar/mincalendar", 7}, + {"~/.local/bin/statusbar/notifications", 8}, +}; + +static const char *statuscmd[] = {"/bin/bash", "-c", NULL, NULL}; + +/* tagging */ +static char *tags[] = {"cmd", "www", "dev", "chat", "sys", "med"}; +static char *alttags[] = {"[cmd]", "[www]", "[dev]", + "[chat]", "[sys]", "[med]"}; +static const unsigned int ulinepad = + 2; /* horizontal padding between the underline and tag */ +static const unsigned int ulinestroke = + 2; /* thickness / height of the underline */ +static const unsigned int ulinevoffset = + 0; /* how far above the bottom of the bar the line should appear */ +static const int ulineall = + 0; /* 1 to show underline on all tags, 0 for just the active ones */ + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating isterminal + noswallow monitor */ + {"Gimp", NULL, NULL, 0, 1, 0, 0, -1}, + {"Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1}, + {"st-256color", NULL, NULL, 0, 0, 1, 0, -1}, + {NULL, NULL, "Event Tester", 0, 0, 0, 1, -1}, /* xev */ + {NULL, "spterm", NULL, SPTAG(0), 1, 1, 0, -1}, + {NULL, "spmpd", NULL, SPTAG(1), 1, 1, 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 */ + +#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 */ + {"//", NULL}, /* no layout function means floating behavior */ + {"[@]", spiral}, {"[\\]", dwindle}, + {"[M]", monocle}, {"|M|", centeredmaster}, + {NULL, NULL}, +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#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 const char *btncmd[] = {"rofi", "-show", "drun", NULL}; +static const Key keys[] = { + /* modifier key function argument */ + {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 | ControlMask, XK_comma, cyclelayout, {.i = -1}}, + {MODKEY | ControlMask, XK_period, cyclelayout, {.i = +1}}, + {MODKEY, XK_space, setlayout, {0}}, + {MODKEY | ShiftMask, XK_space, togglefloating, {0}}, + {MODKEY | ShiftMask, XK_f, togglefullscr, {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}}, + {MODKEY | ShiftMask, XK_b, togglescratch, {.ui = 0}}, + {MODKEY | ShiftMask, XK_v, togglescratch, {.ui = 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){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 */ + {ClkButton, 0, Button1, spawn, {.v = btncmd}}, + {ClkLtSymbol, 0, Button1, setlayout, {0}}, + {ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]}}, + {ClkStatusText, 0, Button1, spawn, {.v = statuscmd}}, + {ClkStatusText, 0, Button2, spawn, {.v = statuscmd}}, + {ClkStatusText, 0, Button3, spawn, {.v = statuscmd}}, + {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.rej b/config.def.h.rej new file mode 100644 index 0000000..7b3f6c3 --- /dev/null +++ b/config.def.h.rej @@ -0,0 +1,18 @@ +--- config.def.h ++++ config.def.h +@@ -5,7 +5,6 @@ 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 buttonbar[] = ""; + static const char *fonts[] = { "monospace:size=10" }; + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; +@@ -101,7 +100,6 @@ static Key keys[] = { + /* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ + static Button buttons[] = { + /* click event mask button function argument */ +- { ClkButton, 0, Button1, spawn, {.v = dmenucmd } }, + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, diff --git a/config.h b/config.h index 9039fd0..a131ce7 100644 --- a/config.h +++ b/config.h @@ -9,18 +9,17 @@ static const int user_bh = 27; /* 0 means that dwm will calculate bar height, >= static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const unsigned int snap = 1; /* snap pixel */ -static const unsigned int gappih = 6; /* horiz inner gap between windows */ -static const unsigned int gappiv = 6; /* vert inner gap between windows */ +static const unsigned int gappih = 7; /* horiz inner gap between windows */ +static const unsigned int gappiv = 7; /* vert inner gap between windows */ static const unsigned int gappoh = - 6; /* horiz outer gap between windows and screen edge */ + 7; /* horiz outer gap between windows and screen edge */ static const unsigned int gappov = - 6; /* vert outer gap between windows and screen edge */ -static const char buttonbar[] = " "; + 7; /* 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 int horizpadbar = 3; /* horizontal padding for statusbar */ +static const int horizpadbar = 10; /* horizontal padding for statusbar */ static const int vertpadbar = 10; /* vertical padding for statusbar */ static const int vertpad = 0; /* vertical padding of bar */ static const int sidepad = 0; /* horizontal padding of bar */ @@ -40,7 +39,7 @@ static const char *fonts[] = { "Noto Color Emoji:size=12:antialias=true:autohint=true", "Material Design Icons Desktop:size=11"}; static const char dmenufont[] = "Iosevka Nerd Font:size=12"; -static const char col_back[] = "#121111"; +static const char col_back[] = "#010101"; static const char col_gray1[] = "#212126"; static const char col_gray2[] = "#444444"; static const char col_gray3[] = "#bbbbbb"; @@ -55,10 +54,10 @@ static const char col_magenta[] = "#b183ba"; static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = {col_gray3, col_back, col_gray2}, - [SchemeBtn] = {col_blue, col_gray1, col_gray2}, - [SchemeLt] = {col_gray4, col_back, col_gray2}, - [SchemeSel] = {col_gray4, col_blue, col_blue}, + [SchemeNorm] = {col_gray3, col_back, col_gray1}, + [SchemeBtn] = {col_blue, col_gray1, col_gray1}, + [SchemeLt] = {col_gray4, col_back, col_gray1}, + [SchemeSel] = {col_gray4, col_blue, col_gray2}, }; static const char *tagsel[][2] = { {col_green, col_back}, {col_red, col_back}, {col_yellow, col_back}, @@ -70,10 +69,10 @@ typedef struct { const void *cmd; } Sp; const char *terminal[] = {"st", NULL}; -const char *scrot[] = {"scrot", NULL}; -const char *scrots[] = {"scrot", "-s", NULL}; -/*const char *launch[] = {"dmenu", "-h '37'", "-nf '#bbbbbb'", "-nb '#121111'", "-sf '#dbdfdf'", "-sb '#212126'", "-p '󱎰 |Search:'", "-fn 'Iosevka Nerd Font:size=12:style=regular'", NULL};*/ -const char *launch[] = {"dmenu_k", NULL}; +const char *scrot[] = {"screenshot_fullscreen", NULL}; +const char *scrots[] = {"screenshot_select", NULL}; +/*const char *launch[] = {"dmenu_run", "-h '37'", "-nf '#bbbbbb'", "-nb '#000000'", "-sf '#dbdfdf'", "-sb '#000000'", "-p '󱎰 |Search:'", "-fn 'Iosevka Nerd Font:size=12:style=regular," ,NULL};*/ +const char *launch[] = {"run", NULL}; static Sp scratchpads[] = { /* name cmd */ diff --git a/config.h.save b/config.h.save new file mode 100644 index 0000000..2bfb34e --- /dev/null +++ b/config.h.save @@ -0,0 +1,249 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +#include + +static const unsigned int borderpx = 2; /* border pixel of windows */ +static const int user_bh = 27; /* 0 means that dwm will calculate bar height, >= + 1 means dwm will user_bh as bar height */ +static const int swallowfloating = + 0; /* 1 means swallow floating windows by default */ +static const unsigned int snap = 1; /* snap pixel */ +static const unsigned int gappih = 6; /* horiz inner gap between windows */ +static const unsigned int gappiv = 6; /* vert inner gap between windows */ +static const unsigned int gappoh = + 6; /* horiz outer gap between windows and screen edge */ +static const unsigned int gappov = + 6; /* vert outer gap between windows and screen edge */ +static const char buttonbar[] = " "; +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 int horizpadbar = 3; /* horizontal padding for statusbar */ +static const int vertpadbar = 10; /* vertical padding for statusbar */ +static const int vertpad = 0; /* vertical padding of bar */ +static const int sidepad = 0; /* horizontal padding of bar */ +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 unsigned int systrayiconsize = 20; /* systray icon size in px */ +static const int showsystray = 1; /* 0 means no systray */ +static const char *fonts[] = { + "Iosevka Nerd Font:size=12:style=Regular", + "Noto Color Emoji:size=12:antialias=true:autohint=true", + "Material Design Icons Desktop:size=11"}; +static const char dmenufont[] = "Iosevka Nerd Font:size=12"; +static const char col_back[] = "#121111"; +static const char col_gray1[] = "#212126";:q +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#dbdfdf"; +static const char col_blue[] = "#808fbe"; +static const char col_orange[] = "#eaac79"; +static const char col_red[] = "#c15a5e"; +static const char col_green[] = "#8fa176"; +static const char col_cyan[] = "#8cb5af"; +static const char col_yellow[] = "#d8b170"; +static const char col_magenta[] = "#b183ba"; + +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = {col_gray3, col_back, col_gray2}, + [SchemeBtn] = {col_blue, col_gray1, col_gray2}, + [SchemeLt] = {col_gray4, col_back, col_gray2}, + [SchemeSel] = {col_gray4, col_blue, col_blue}, +}; +static const char *tagsel[][2] = { + {col_green, col_back}, {col_red, col_back}, {col_yellow, col_back}, + {col_blue, col_back}, {col_magenta, col_back}, {col_cyan, col_back}, +}; + +typedef struct { + const char *name; + const void *cmd; +} Sp; +const char *terminal[] = {"st", NULL}; +const char *scrot[] = {"scrot", NULL}; +const char *scrots[] = {"scrot", "-s", NULL}; +const char *launch[] = {"dmenu_run", "-h '37'", "-nf '#bbbbbb'", "-nb '#121111'", "-sf '#dbdfdf'", "-sb '#212126'", "-p '󱎰 |Search:'", "-fn 'Iosevka Nerd Font:size=12:style=regular," ,NULL}; + +static Sp scratchpads[] = { + /* name cmd */ + {"launch", launch}, + {"terminal", terminal}, + {"scrot", scrot}, + {"scrots", scrots}, +}; + +#include + +/* Add somewhere in your constants definition section */ +static const char *upvol[] = { "pactl", "set-sink-volume", "0", "+5%", NULL }; +static const char *downvol[] = { "pactl", "set-sink-volume", "0", "-5%", NULL }; +static const char *mutevol[] = { "pactl", "set-sink-mute", "0", "toggle", NULL }; + +static const StatusCmd statuscmds[] = { + {"~/.local/bin/statusbar/power", 1}, + {"~/.local/bin/statusbar/wifi", 2}, + {"~/.local/bin/statusbar/calendar", 3}, + {"~/.local/bin/statusbar/battery", 4}, + {"~/.local/bin/statusbar/sound", 5}, + {"~/.local/bin/statusbar/mindash", 6}, + {"~/.local/bin/statusbar/mincalendar", 7}, + {"~/.local/bin/statusbar/notifications", 8}, +}; + +static const char *statuscmd[] = {"/bin/bash", "-c", NULL, NULL}; + +/* tagging */ +static char *tags[] = {"cmd", "www", "dev", "chat", "sys", "med"}; +static char *alttags[] = {"[cmd]", "[www]", "[dev]", + "[chat]", "[sys]", "[med]"}; +static const unsigned int ulinepad = + 2; /* horizontal padding between the underline and tag */ +static const unsigned int ulinestroke = + 2; /* thickness / height of the underline */ +static const unsigned int ulinevoffset = + 0; /* how far above the bottom of the bar the line should appear */ +static const int ulineall = + 0; /* 1 to show underline on all tags, 0 for just the active ones */ + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating isterminal + noswallow monitor */ + {"Gimp", NULL, NULL, 0, 1, 0, 0, -1}, + {"Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1}, + {"st-256color", NULL, NULL, 0, 0, 1, 0, -1}, + {NULL, NULL, "Event Tester", 0, 0, 0, 1, -1}, /* xev */ + {NULL, "spterm", NULL, SPTAG(0), 1, 1, 0, -1}, + {NULL, "spmpd", NULL, SPTAG(1), 1, 1, 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 */ + +#define FORCE_VSPLIT \ + 1 /* nrowgrid layout: force two clients to always split vertically */ +#include "vanitygaps.c" + +/*#include "layout_grid.h" +#include "layout_grid.c"*/ +static const Layout layouts[] = { + /* symbol arrange function */ + {"[]", tile}, /* first entry is default */ + {"{}", spiral}, + {"//", NULL}, /* no layout function means floating behavior */ +/* {"[@]", spiral}, {"[\\]", dwindle},*/ + {"[M]", monocle}, {"|M|", centeredmaster}, + {NULL, NULL}, +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#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 const Key keys[] = { + /* modifier key function argument */ + {MODKEY, XK_Print, spawn, {.v = scrot} }, + {MODKEY | ShiftMask, XK_Print, spawn, {.v = scrots } }, + {MODKEY, XK_e, spawn, {.v = terminal } }, + {MODKEY, XK_d, spawn, {.v = launch } }, + {MODKEY, XK_b, togglebar, {0}}, + { 0, XK_F11, spawn, {.v = downvol } }, + { 0, XK_F10, spawn, {.v = mutevol } }, + { 0, XK_F12, spawn, {.v = upvol } }, + /*boring stuff*/ + {MODKEY, XK_j, focusstack, {.i = +1}}, + {MODKEY, XK_k, focusstack, {.i = -1}}, + {MODKEY, XK_i, 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, XK_w, killclient, {0}}, + {MODKEY, XK_t, setlayout, {.v = &layouts[0]}}, + {MODKEY | ShiftMask, XK_f, setlayout, {.v = &layouts[1]}}, + {MODKEY, XK_m, setlayout, {.v = &layouts[2]}}, + {MODKEY | ControlMask, XK_comma, cyclelayout, {.i = -1}}, + {MODKEY | ControlMask, XK_period, cyclelayout, {.i = +1}}, + {MODKEY, XK_space, setlayout, {0}}, + {MODKEY, XK_s, togglefloating, {0}}, + {MODKEY, XK_f, togglefullscr, {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}}, + {MODKEY | ShiftMask, XK_b, togglescratch, {.ui = 0}}, + {MODKEY | ShiftMask, XK_v, togglescratch, {.ui = 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){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 */ + {ClkButton, 0, Button1, spawn, {.v = launch}}, + {ClkLtSymbol, 0, Button1, setlayout, {0}}, + {ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]}}, + {ClkStatusText, 0, Button1, spawn, {.v = statuscmd}}, + {ClkStatusText, 0, Button2, spawn, {.v = statuscmd}}, + {ClkStatusText, 0, Button3, spawn, {.v = statuscmd}}, + {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/drw.o b/drw.o index ffbecbdc0b1e2c927f9455150b7c7f8679250f47..81503ee8680daa7e00e5c526b98b0662568efc48 100644 GIT binary patch delta 4015 zcmZ`+eQZLWn1D1anteF#<@-aF-wn-qgjnaxHm=7^pO8KaF&h@kO z#>AE0x$m9d`99}fCu1uvtk~@*olskun-28wYT0#lNj6k_8C;GMEF|F77+^2u71 zw>Xx5lbXwvyfEu6qAcRk%oR>8M`n>cYQ6xWbowY8rL4$Ej~eltdE@uL=Eog#$)>>v zjy^}sU}^2U+H!4Kh@D=}zIcKCh4x+FiJ_SNN)mP!Rs3w3@(rEoN{|8xbWqb-=@-%J zO0SyC|A#wqZh|D~ESZ0TCerTyzrt4{8TAf~?*0R?zmF-?`0EM+Z%&9o z@#3){yzfGx8{L)hKPe|bL^_;? zI(*ql&1sG?Gyxbedwd$Zh?urqulmH)m8OUev;o=@90UI-7t1r&wG^Q&7|5kLJ5ZmR zG(yctldz?ej!gP~_M%dveSf84wgls%nb0*|@pV7_=C=) zNQTr;)l2Gm@D+3FtV3x+3l!fPD1;UWsh2<`q~6fMnT{Zg6%hAOu&E#Fdk9BxAgXji zV4^Fp+-@8`LFrw;AbUXnCa(f8dNxXsy54JwgXWKF=;JIq~{D+ege#2jY@H zou-S@xzN5xX^7GNoeQbrqxh=*5d%o&wX%!i8xo7Onmw^#D;}j0z!K-9&r>t16ou5J z4hLu;tgH>QFEPM~D5NPIV>}U^jMc+PY-xe2__1y}aG*>L@Li}^;cHW>8j~^1SBgZA z*koZwB$P<9k?uXMX6zN;_%;|c5MA3m;H*ZgTW7!=7La9%|FDR;R5!r^8)Mf}-f(>s zT0JvN!b*|GMnmMZnmmG1A@y#mKuxA{t?&4MNd8FobdlZSuhVIrT~4`ypj>V!@o98J zssOf_yZ;@~R+EVv(dQtDAXWeyu49{gMov$Fn!QCek-T%)a%3%{EdzD~rqBdWP#4=PFtm|1_>y~OHi1qmz2W9XtWWI@(B^+Nf^qA)iiMmVt6}6z;Ofk4GR;i zS7G-(k~{HFNNoHT5ELr5%@Yl+zHHCJrCJMr-^wA!!-f-49xC$<0F`X%#hH5 z-I4>;>pkxN7}|*^^Jx9q?wi69`xkq$NC{AO++d@E180hBlcvwWvju5;1T)O8StrV1 zAMnkSrpG=Ld^kVZgO+84*;O@j=)x?+)65_h7{BL|suyTece zpXlcJM3{+;-d!OFuHg#L+~2iOO8P$+I5bsArB)630sJ$hDrMBbH550%YYVDMMOJKt znoT~m^?8_W@s0lo9Kn>2ReixJ(2sXw)E7%rf4?sGqYV30n+E89LKKx~X zP$p28N=?OIE}dP?=(CWN8t1<#tme~P#e>Phw@CH+m!q3D`P8}3)IOuG>8cIX&J6@> z=li?DfD@h!GbDbd6b(T1q;Y9;Z&SnR^H3Ms{*pp&Mkri2qI)^K`*cH%RelXkY z@_?IW7o=DME|nZ0lEjZqF^WU@2H-A-=JIUM(OkZ`^T&f_QWtg$w{f~oo&;?u4lDsxLPWc1-u<- zyP!jSxK!o`N(=cfOAEbMZC0yndbd!@+i1-N`mC{`t^78iZ8mha4c*Jje6sh54Xw7J z^Y~JqY#c$8uyFepJlS{)t;s-sosGZ1#t+)~K7I&%wcw=y3$<`+veq{8j{)6op_nQL zm96lv_>?l)`&*mtLYwaIxd!N~@D~U!)SV7b1Af5T&Nl;^vQYFpAD*n=+k8KuwRk(i zLKO9~=wyBl&>%J!7FwPRPZnLmNx4kk;%d3ve%O*h3*WZMoV4*9ZTw3%n^SE3D>iw1 zr*84~a#{V#rZv^3<+QF3^sd?XMf`TT?Dg2tW*b_@%PQo_Rd$qrR4z|mY?E2UmsY_1 z*knRB^n1LoLMH3^A&^PfWLj)8d-=x|a_nsj#Tw%OLD?F&ZI;KP7se_Q_k7_wl8G zp0X;|^%&~peRE`D@O^V`kxtJ1b@?lwM%$9q#ZUU{$bmspl}pH6zI5tSyrfzo39eN) llAXK{=wUt#^aLk0jrpB8^{^t`sHp>_ucndg=EF5}{tHeupaB2? delta 3973 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 literal 92144 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 ThTFm7|AQ(9SHcj%;1&NH&PsOi diff --git a/dwm.c b/dwm.c index 010a15e..bc91ac6 100644 --- a/dwm.c +++ b/dwm.c @@ -586,49 +586,15 @@ void buttonpress(XEvent *e) { i = x = occ = 0; /* Bitmask of occupied tags */ for (c = m->clients; c; c = c->next) - occ |= c->tags; - x += TEXTW(buttonbar); - if (ev->x < x) { - click = ClkButton; - } else { - do - x += TEXTW(occ & 1 << i ? alttags[i] : 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 - statusw - stw - 2 * sp) { - char *text, *s, ch; - *lastbutton = '0' + ev->button; - x = selmon->ww - statusw - stw - 2 * sp - getsystraywidth(); - click = ClkStatusText; - statuscmdn = 0; - for (text = s = stext; *s && x <= ev->x; s++) { - if ((unsigned char)(*s) < ' ') { - ch = *s; - *s = '\0'; - x += TEXTW(text) - lrpad; - *s = ch; - text = s + 1; - if (x >= ev->x) - break; - statuscmdn = ch; - } else if (*s == '^') { - *s = '\0'; - x += TEXTW(text) - lrpad; - *s = '^'; - if (*(++s) == 'f') - x += atoi(++s); - while (*(s++) != '^') - ; - text = s; - s--; - } - } - } - } + 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 > selmon->ww - TEXTW(stext)) + click = ClkStatusText; + } else if ((c = wintoclient(ev->window))) { focus(c); restack(selmon); @@ -1097,9 +1063,6 @@ void drawbar(Monitor *m) { urg |= c->tags; } x = 0; - w = TEXTW(buttonbar); - drw_setscheme(drw, scheme[SchemeBtn]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0); for (i = 0; i < LENGTH(tags); i++) { tagtext = occ & 1 << i ? alttags[i] : tags[i]; w = TEXTW(tagtext); diff --git a/dwm.c.orig b/dwm.c.orig new file mode 100644 index 0000000..010a15e --- /dev/null +++ b/dwm.c.orig @@ -0,0 +1,2943 @@ +/* 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 +#include +#ifdef XINERAMA +#include +#endif /* XINERAMA */ +#include +#include +#include +#ifdef __OpenBSD__ +#include +#include +#endif /* __OpenBSD */ + +#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 NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) +#define TAGMASK ((1 << NUMTAGS) - 1) +#define SPTAG(i) ((1 << LENGTH(tags)) << (i)) +#define SPTAGMASK (((1 << LENGTH(scratchpads)) - 1) << LENGTH(tags)) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +#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_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR + +/* enums */ +enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +enum { SchemeNorm, SchemeSel, SchemeBtn, SchemeLt }; /* 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, + ClkClientWin, + ClkButton, + 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; + 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, + isterminal, noswallow; + pid_t pid; + Client *next; + Client *snext; + Client *swallowing; + 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 */ + 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 *cmd; + int id; +} StatusCmd; +typedef struct { + const char *class; + const char *instance; + const char *title; + unsigned int tags; + int isfloating; + int isterminal; + int noswallow; + int monitor; +} Rule; + +typedef struct Systray Systray; +struct Systray { + Window win; + Client *icons; +}; + +/* 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 cyclelayout(const Arg *arg); +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 int drawstatusbar(Monitor *m, int bh, char *text); +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 unsigned int getsystraywidth(); +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 *c); +static void propertynotify(XEvent *e); +static void quit(const Arg *arg); +static Monitor *recttomon(int x, int y, int w, int h); +static void removesystrayicon(Client *i); +static void resize(Client *c, int x, int y, int w, int h, int interact); +static void resizebarwin(Monitor *m); +static void resizerequest(XEvent *e); +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 runautostart(void); +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 setfocus(Client *c); +static void setfullscreen(Client *c, int fullscreen); +static void setlayout(const Arg *arg); +static void setcfact(const Arg *arg); +static void setmfact(const Arg *arg); +static void setup(void); +static void setcfact(const Arg *arg); +static void seturgent(Client *c, int urg); +static void showhide(Client *c); +static void sigchld(int unused); +static void spawn(const Arg *arg); +static Monitor *systraytomon(Monitor *m); +static void tag(const Arg *arg); +static void tagmon(const Arg *arg); +static void togglebar(const Arg *arg); +static void togglefloating(const Arg *arg); +static void togglefullscr(const Arg *arg); +static void toggletag(const Arg *arg); +static void togglescratch(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 void updatesystray(void); +static void updatesystrayicongeom(Client *i, int w, int h); +static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); +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 Client *wintosystrayicon(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); + +static pid_t getparentprocess(pid_t p); +static int isdescprocess(pid_t p, pid_t c); +static Client *swallowingclient(Window w); +static Client *termforwin(const Client *c); +static pid_t winpid(Window w); + +/* variables */ +static Systray *systray = NULL; +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; +static const char broken[] = "broken"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; +static char stext[1024]; +static int statusw; +static int statuscmdn; +static char lastbutton[] = "-"; +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 vp; /* vertical padding for bar */ +static int sp; /* side padding for bar */ +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 Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; +static int running = 1; +static Cur *cursor[CurLast]; +static Clr **scheme; +static Clr **tagscheme; +static Display *dpy; +static Drw *drw; +static Monitor *mons, *selmon; +static Window root, wmcheckwin; + +static xcb_connection_t *xcon; + +/* 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->isterminal = r->isterminal; + c->noswallow = r->noswallow; + c->isfloating = r->isfloating; + c->tags |= r->tags; + if ((r->tags & SPTAGMASK) && r->isfloating) { + c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); + c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); + } + + 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] & ~SPTAGMASK); +} + +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) { + 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) { + 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 swallow(Client *p, Client *c) { + + if (c->noswallow || c->isterminal) + return; + if (c->noswallow && !swallowfloating && c->isfloating) + return; + + detach(c); + detachstack(c); + + setclientstate(c, WithdrawnState); + XUnmapWindow(dpy, p->win); + + p->swallowing = c; + c->mon = p->mon; + + Window w = p->win; + p->win = c->win; + c->win = w; + updatetitle(p); + XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h); + arrange(p->mon); + configure(p); + updateclientlist(); +} + +void unswallow(Client *c) { + c->win = c->swallowing->win; + + free(c->swallowing); + c->swallowing = NULL; + + /* unfullscreen the client */ + setfullscreen(c, 0); + updatetitle(c); + arrange(c->mon); + XMapWindow(dpy, c->win); + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + setclientstate(c, NormalState); + focus(NULL); + arrange(c->mon); +} +void buttonpress(XEvent *e) { + unsigned int i, x, click, occ; + Arg arg = {0}; + Client *c; + Monitor *m; + XButtonPressedEvent *ev = &e->xbutton; + int stw = 0; + 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 = occ = 0; + /* Bitmask of occupied tags */ + for (c = m->clients; c; c = c->next) + occ |= c->tags; + x += TEXTW(buttonbar); + if (ev->x < x) { + click = ClkButton; + } else { + do + x += TEXTW(occ & 1 << i ? alttags[i] : 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 - statusw - stw - 2 * sp) { + char *text, *s, ch; + *lastbutton = '0' + ev->button; + x = selmon->ww - statusw - stw - 2 * sp - getsystraywidth(); + click = ClkStatusText; + statuscmdn = 0; + for (text = s = stext; *s && x <= ev->x; s++) { + if ((unsigned char)(*s) < ' ') { + ch = *s; + *s = '\0'; + x += TEXTW(text) - lrpad; + *s = ch; + text = s + 1; + if (x >= ev->x) + break; + statuscmdn = ch; + } else if (*s == '^') { + *s = '\0'; + x += TEXTW(text) - lrpad; + *s = '^'; + if (*(++s) == 'f') + x += atoi(++s); + while (*(s++) != '^') + ; + text = s; + s--; + } + } + } + } + } 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); + + 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) + 1; i++) + free(scheme[i]); + 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) { + 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) { + 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); + XClassHint ch = {"dwmsystray", "dwmsystray"}; + XSetClassHint(dpy, c->win, &ch); + 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); + } +} + +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); + resizebarwin(m); + } + 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->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 cyclelayout(const Arg *arg) { + Layout *l; + for (l = (Layout *)layouts; l != selmon->lt[selmon->sellt]; l++) + ; + if (arg->i > 0) { + if (l->symbol && (l + 1)->symbol) + setlayout(&((Arg){.v = (l + 1)})); + else + setlayout(&((Arg){.v = layouts})); + } else { + if (l != layouts && (l - 1)->symbol) + setlayout(&((Arg){.v = (l - 1)})); + else + setlayout(&((Arg){.v = &layouts[LENGTH(layouts) - 2]})); + } +} + +void destroynotify(XEvent *e) { + 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(); + } else if ((c = swallowingclient(ev->window))) + unmanage(c->swallowing, 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; +} + +int drawstatusbar(Monitor *m, int bh, char *stext) { + int ret, i, j, w, x, len; + short isCode = 0; + char *text; + char *p; + + len = strlen(stext) + 1; + if (!(text = (char *)malloc(sizeof(char) * len))) + die("malloc"); + p = text; + + i = -1, j = 0; + while (stext[++i]) + if ((unsigned char)stext[i] >= ' ') + text[j++] = stext[i]; + text[j] = '\0'; + /* compute width of the status text */ + w = 0; + i = -1; + while (text[++i]) { + if (text[i] == '^') { + if (!isCode) { + isCode = 1; + text[i] = '\0'; + w += TEXTW(text) - lrpad; + text[i] = '^'; + if (text[++i] == 'f') + w += atoi(text + ++i); + } else { + isCode = 0; + text = text + i + 1; + i = -1; + } + } + } + if (!isCode) + w += TEXTW(text) - lrpad; + else + isCode = 0; + text = p; + + w += horizpadbar; /* 1px padding on both sides */ + ret = m->ww - w; + x = m->ww - w - getsystraywidth(); + + drw_setscheme(drw, scheme[LENGTH(colors)]); + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + drw_rect(drw, x, 0, w, bh, 1, 1); + x += horizpadbar / 2; + + /* process status text */ + i = -1; + while (text[++i]) { + if (text[i] == '^' && !isCode) { + isCode = 1; + + text[i] = '\0'; + w = TEXTW(text) - lrpad; + drw_text(drw, x - 2 * sp, vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); + + x += w; + + /* process code */ + while (text[++i] != '^') { + if (text[i] == 'c') { + char buf[8]; + memcpy(buf, (char *)text + i + 1, 7); + buf[7] = '\0'; + drw_clr_create(drw, &drw->scheme[ColFg], buf); + i += 7; + } else if (text[i] == 'b') { + char buf[8]; + memcpy(buf, (char *)text + i + 1, 7); + buf[7] = '\0'; + drw_clr_create(drw, &drw->scheme[ColBg], buf); + i += 7; + } else if (text[i] == 'd') { + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + } else if (text[i] == 'r') { + int rx = atoi(text + ++i); + while (text[++i] != ',') + ; + int ry = atoi(text + ++i); + while (text[++i] != ',') + ; + int rw = atoi(text + ++i); + while (text[++i] != ',') + ; + int rh = atoi(text + ++i); + drw_rect(drw, rx + x, ry + vertpadbar / 2, rw, rh, 1, 0); + } else if (text[i] == 'f') { + x += atoi(text + ++i); + } + } + + text = text + i + 1; + i = -1; + isCode = 0; + } + } + + if (!isCode) { + w = TEXTW(text) - lrpad; + drw_text(drw, x - 2 * sp, vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); + } + + drw_setscheme(drw, scheme[SchemeNorm]); + free(p); + + return ret; +} + +void drawbar(Monitor *m) { + int x, w, tw = 0, stw = 0; + unsigned int i, occ = 0, urg = 0; + const char *tagtext; + Client *c; + + if (!m->showbar) + return; + + 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 */ + tw = statusw = m->ww - drawstatusbar(m, bh, stext); + } + + resizebarwin(m); + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; + } + x = 0; + w = TEXTW(buttonbar); + drw_setscheme(drw, scheme[SchemeBtn]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0); + for (i = 0; i < LENGTH(tags); i++) { + tagtext = occ & 1 << i ? alttags[i] : tags[i]; + w = TEXTW(tagtext); + drw_setscheme(drw, (m->tagset[m->seltags] & 1 << i ? tagscheme[i] + : scheme[SchemeNorm])); + if (ulineall || + m->tagset[m->seltags] & + 1 << i) /* if there are conflicts, just move these lines directly + underneath both 'drw_setscheme' and 'drw_text' :) */ + drw_rect(drw, x + ulinepad, bh - ulinestroke - ulinevoffset, + w - (ulinepad * 2), ulinestroke, 1, 0); + drw_text(drw, x, 0, w, bh, lrpad / 2, tagtext, urg & 1 << i); + if (ulineall || + m->tagset[m->seltags] & + 1 << i) /* if there are conflicts, just move these lines directly + underneath both 'drw_setscheme' and 'drw_text' :) */ + drw_rect(drw, x + ulinepad, bh - ulinestroke - ulinevoffset, + w - (ulinepad * 2), ulinestroke, 1, 0); + x += w; + } + w = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeLt]); + x = drw_text(drw, x, 0, w, bh , lrpad / 2, m->ltsymbol, 0); + + if ((w = m->ww - tw - stw - x) > bh) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); + } + drw_map(drw, m->barwin, 0, 0, m->ww - stw, 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); + if (m == selmon) + updatesystray(); + } +} + +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 || (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) { + int di; + unsigned long 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]; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, &da, + &di, &dl, &dl, &p) == Success && + p) { + atom = *(Atom *)p; + if (da == xatom[XembedInfo] && dl == 2) + atom = ((Atom *)p)[1]; + 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; +} + +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; +} + +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->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) { + Client *c, *t = NULL, *term = NULL; + Window trans = None; + XWindowChanges wc; + + c = ecalloc(1, sizeof(Client)); + c->win = w; + c->pid = winpid(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); + term = termforwin(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->mon->mw - WIDTH(c)) / 2); + c->y = MAX(c->y, c->mon->wy + (c->mon->mh - HEIGHT(c)) / 2); + 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); + if (term) + swallow(term, c); + 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) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); + 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(); + } +} + +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 ((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 (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 removesystrayicon(Client *i) { + Client **ii; + + 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) { + 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 + sp, m->by + vp, w - 2 * sp, bh); +} + +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 resizerequest(XEvent *e) { + XResizeRequestEvent *ev = &e->xresizerequest; + Client *i; + + if ((i = wintosystrayicon(ev->window))) { + updatesystrayicongeom(i, ev->width, ev->height); + resizebarwin(selmon); + updatesystray(); + } +} + +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 runautostart(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); +} + +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(Window w, Atom proto, int mask, long d0, long d1, long d2, + long d3, long d4) { + 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 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->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], + CurrentTime, 0, 0, 0); +} + +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); +} + +void setcfact(const Arg *arg) { + float f; + Client *c; + + 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) { + 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 + horizpadbar; + bh = user_bh ? user_bh + vertpadbar : drw->fonts->h + 2 + vertpadbar; + sp = sidepad; + vp = (topbar == 1) ? vertpad : -vertpad; + 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 */ + if (LENGTH(tags) > LENGTH(tagsel)) + die("too few color schemes for the tags"); + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); + scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); + tagscheme = ecalloc(LENGTH(tagsel), sizeof(Clr *)); + for (i = 0; i < LENGTH(tagsel); i++) + tagscheme[i] = drw_scm_create(drw, tagsel[i], 2); + /* 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); +} + +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)) { + if ((c->tags & SPTAGMASK) && c->isfloating) { + c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); + c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); + } + /* 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 (fork() == 0) { + if (dpy) + close(ConnectionNumber(dpy)); + if (arg->v == statuscmd) { + for (int i = 0; i < LENGTH(statuscmds); i++) { + if (statuscmdn == statuscmds[i].id) { + statuscmd[2] = statuscmds[i].cmd; + setenv("BUTTON", lastbutton, 1); + break; + } + } + if (!statuscmd[2]) + exit(EXIT_SUCCESS); + } + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); + die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); + } +} + +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 togglebar(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); +} + +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 togglefullscr(const Arg *arg) { + if (selmon->sel) + setfullscreen(selmon->sel, !selmon->sel->isfullscreen); +} + +void togglescratch(const Arg *arg) { + Client *c; + unsigned int found = 0; + unsigned int scratchtag = SPTAG(arg->ui); + Arg sparg = {.v = scratchpads[arg->ui].cmd}; + + for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next) + ; + if (found) { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } + if (ISVISIBLE(c)) { + focus(c); + restack(selmon); + } + } else { + selmon->tagset[selmon->seltags] |= scratchtag; + spawn(&sparg); + } +} + +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; + + if (c->swallowing) { + unswallow(c); + return; + } + + Client *s = swallowingclient(c->win); + if (s) { + free(s->swallowing); + s->swallowing = NULL; + arrange(m); + focus(NULL); + return; + } + + 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); + + if (!s) { + arrange(m); + focus(NULL); + updateclientlist(); + } +} + +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); + } 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 updatebars(void) { + 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 + sp, m->by + vp, w - 2 * sp, 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 updatebarpos(Monitor *m) { + m->wy = m->my; + m->wh = m->mh; + if (m->showbar) { + m->wh = m->wh - vertpad - bh; + m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; + m->wy = m->topbar ? m->wy + bh + vp : m->wy; + } else + m->by = -bh - vp; +} + +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; + + /* 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); + 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); + c->hintsvalid = 1; +} + +void updatestatus(void) { + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) { + strcpy(stext, "dwm-" VERSION); + statusw = TEXTW(stext) - lrpad + 2; + } else { + char *text, *s, ch; + statusw = 0; + for (text = s = stext; *s; s++) { + if ((unsigned char)(*s) < ' ') { + ch = *s; + *s = '\0'; + statusw += TEXTW(text) - lrpad; + *s = ch; + text = s + 1; + } + } + statusw += TEXTW(text) - lrpad + 2; + } + drawbar(selmon); + updatesystray(); +} + +void updatesystrayicongeom(Client *i, int w, int h) { + if (!i) + return; + applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); + if (systrayiconsize >= bh) { + i->w = bh; + i->h = bh; + } else { + i->w = systrayiconsize; + i->h = systrayiconsize; + } +} + +void updatesystrayiconstate(Client *i, XPropertyEvent *ev) { + long flags; + int code = 0; + + 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); +} + +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; + + 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; + if (systrayiconsize >= bh) + i->y = 0; + else + i->y = (bh - systrayiconsize) / 2; + XMoveResizeWindow(dpy, i->win, i->x, i->y, 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 - sp, m->by + vp, w, bh); + wc.x = x - sp; + wc.y = m->by + vp; + 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) { + 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); +} + +pid_t winpid(Window w) { + + pid_t result = 0; + +#ifdef __linux__ + xcb_res_client_id_spec_t spec = {0}; + spec.client = w; + spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID; + + xcb_generic_error_t *e = NULL; + xcb_res_query_client_ids_cookie_t c = + xcb_res_query_client_ids(xcon, 1, &spec); + xcb_res_query_client_ids_reply_t *r = + xcb_res_query_client_ids_reply(xcon, c, &e); + + if (!r) + return (pid_t)0; + + xcb_res_client_id_value_iterator_t i = + xcb_res_query_client_ids_ids_iterator(r); + for (; i.rem; xcb_res_client_id_value_next(&i)) { + spec = i.data->spec; + if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) { + uint32_t *t = xcb_res_client_id_value_value(i.data); + result = *t; + break; + } + } + + free(r); + + if (result == (pid_t)-1) + result = 0; + +#endif /* __linux__ */ + +#ifdef __OpenBSD__ + Atom type; + int format; + unsigned long len, bytes; + unsigned char *prop; + pid_t ret; + + if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 0), 0, 1, + False, AnyPropertyType, &type, &format, &len, &bytes, + &prop) != Success || + !prop) + return 0; + + ret = *(pid_t *)prop; + XFree(prop); + result = ret; + +#endif /* __OpenBSD__ */ + return result; +} + +pid_t getparentprocess(pid_t p) { + unsigned int v = 0; + +#ifdef __linux__ + FILE *f; + char buf[256]; + snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p); + + if (!(f = fopen(buf, "r"))) + return 0; + + fscanf(f, "%*u %*s %*c %u", &v); + fclose(f); +#endif /* __linux__*/ + +#ifdef __OpenBSD__ + int n; + kvm_t *kd; + struct kinfo_proc *kp; + + kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL); + if (!kd) + return 0; + + kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n); + v = kp->p_ppid; +#endif /* __OpenBSD__ */ + + return (pid_t)v; +} + +int isdescprocess(pid_t p, pid_t c) { + while (p != c && c != 0) + c = getparentprocess(c); + + return (int)c; +} + +Client *termforwin(const Client *w) { + Client *c; + Monitor *m; + + if (!w->pid || w->isterminal) + return NULL; + + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) { + if (c->isterminal && !c->swallowing && c->pid && + isdescprocess(c->pid, w->pid)) + return c; + } + } + + return NULL; +} + +Client *swallowingclient(Window w) { + Client *c; + Monitor *m; + + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) { + if (c->swallowing && c->swallowing->win == w) + return c; + } + } + + return NULL; +} + +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; +} + +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) { + 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; +} + +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) { + 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); +} + +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"); + if (!(xcon = XGetXCBConnection(dpy))) + die("dwm: cannot get xcb connection\n"); + checkotherwm(); + setup(); +#ifdef __OpenBSD__ + if (pledge("stdio rpath proc exec ps", NULL) == -1) + die("pledge"); +#endif /* __OpenBSD__ */ + scan(); + runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} diff --git a/dwm.c.rej b/dwm.c.rej new file mode 100644 index 0000000..891ba04 --- /dev/null +++ b/dwm.c.rej @@ -0,0 +1,57 @@ +--- dwm.c ++++ dwm.c +@@ -64,7 +64,7 @@ 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, ClkButton, ClkWinTitle, ++enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ + + typedef union { +@@ -431,23 +431,18 @@ buttonpress(XEvent *e) + } + if (ev->window == selmon->barwin) { + i = x = 0; +- x += TEXTW(buttonbar); +- if(ev->x < x) { +- click = ClkButton; +- } else { +- 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 - TEXTW(stext)) +- click = ClkStatusText; +- else +- click = ClkWinTitle; +- } ++ 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 - TEXTW(stext)) ++ click = ClkStatusText; ++ else ++ click = ClkWinTitle; + } else if ((c = wintoclient(ev->window))) { + focus(c); + restack(selmon); +@@ -719,9 +714,6 @@ drawbar(Monitor *m) + urg |= c->tags; + } + x = 0; +- w = blw = TEXTW(buttonbar); +- drw_setscheme(drw, scheme[SchemeNorm]); +- x = drw_text(drw, x, 0, w, bh, lrpad / 2, buttonbar, 0); + for (i = 0; i < LENGTH(tags); i++) { + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); diff --git a/dwm.o b/dwm.o index 62e4375b1a4567b7de20acd4682c40c72916fe9c..483573710643d3ba08721472633f2e6d8f14aa40 100644 GIT binary patch literal 87696 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 literal 88504 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

Z?tkOPuw2 z#8qE^+$OI2{dPR8ituX35l^k-IIh+?KF;!%Vb_(&1M-&RIF6sWj&HIrjFd%qmE+}h zJg<)MTE|C>lw?S$i|`D)&iYpTj^n(5>sIK|t}>^`d7;X28}0N%+9O%IQbi`3%Pu)o07=GCNPKcKV@qU0F?B^^;8h z3~{x7ySx06g5wJOuQYuv>DA|I<8KmIpAS!0mn7LuT=n?;axZb!|IGRae$XEE7Mg!f zb9D>nJN21ve2U|E{^BafZ!-PMjxRBO(D9|lv%Zs7o1SO2-g}I9b^Jc#IgUSQyuag* z8Xx5Nlg39mzSj5@$DcD^;`j^3%N)n&o%0>vZ2CoxziNDm<9{~3%JJRCs~!K!_(sQ1 zv++T#;{%NEc0A8`o#S(jCoPWLUdxPUIQ~21S&p}~^LL?rteRj$KivB ztGr#QD0QjJWPcH@1^MQWiP>%9y~b94|J$-0|I`gMPK+$9E5W zqvK;P41BNS-z^Hf&hc%9fhQ-0cO3UV&kyq%j<>UTG97S{E>p0r=rsMG0O*~ub9BBP&uj5mV*Ezld{m|moW469f`q%_G=FvXz6{f@IUEte{ zmpLE3N2z6HcuVWlb@a19EpLXmdX91CKF4!)B`M8pJ=BZuBjWob;LYuLnB(*p8z1KQ z4C8r@&or+0y0yT6k?|_WKeprE7RUc#*MWN+pVut-;``n3zre<&_&oq{j8{t(NCC%q zd%fdJGlFir<2ZjM)(-e|IVI?`9KXzXuHyq+1$~+0OO3B~d|T_F-{|;z#`im3VE+%( z!}5wa|73iM?Mc4g#Gm7MjqzN^i`xeMa>sF< zve9vjqYgU0$HrHK?0yL1nR!O=U*-4@&J28?;}};oxBdv9n{B+&$?<25_jkNmR`4I| z_&DQB96$4{pnur$sm3=tj{9cY9mjp$X13oT{soT9*m2yiTjMyca}PQ`T@UI~j@7s%CZ_1djV=S&rlW>R89|xy)3@aUHkHaa?cibR5^G2OY=t>@Yj8BF;_YLLN#S zZ#q8kWsa8{U*kAFH|*0gtOtL5{e2%l$@yyG^`pr&0(&xmyFh9)ke;8loIIfF# zI$kv;_#AZn{DQzo*?0l*khY%1g_N%PSXH6~!g_)5;5G z6>~HHf2Xr#MIBPwX};cOkWD>TRFBdL8-CV9y)PqH z{`yrGrT~ERU*2nk? zi_w0(>)}hMT{X$>8DWhzc0Tj#V}6iK94&tbGeZqkc0XG4r*-)J>29Y=-~Lr|1xi_D z$Dc5lBw3iS_lfd;wECCyvHER&tzYZ*^_K}dTK!qK$pR?{gH4!`zghKDVd8puJ6ipj zc7c_v3#DlN+82ENi-c(vdYs^r^`kKN2t%2+!(}~PB2&7)9fs=p%eH=2JqZ)2AMf`F zKHBoD5yJGw^Ji~2W7uCnn*m}|&8=Jm9BwDmJ5hWOus(B1=Wfd2=P C51$bL diff --git a/util.o b/util.o index 6ab501f771232ee94bd1d5e3f8348ea759683421..4d65a354b41af91312a418bbe0e40412dd3a40bb 100644 GIT binary patch delta 465 zcmZ1>ctLQ224lcP%}%|2j0_A69=$#)0v?^WJbGJHK7jb$wm_2MxQmJa2Z-D0q9WnZ z>!M;X@pijzYFFlNs6VfodIrIGG--th-4{*VqgN&tU&zdKLo6typdU4ax)Iu zLz5o@Wp6-bS%5Uir7*qsCkwKOOTNY-`*pG-Q1&;HEDw@i_Q{1T;*30#J6Y_39z4nN zoKa}uVl05jADcsDLnZjn>kZ1R3*Cx xP-`Z;J>!DOD}iLi