diff options
| -rw-r--r-- | config.def.h | 232 | ||||
| -rw-r--r-- | config.h | 233 | ||||
| -rw-r--r-- | drw.o | bin | 11000 -> 11128 bytes | |||
| -rw-r--r-- | dwm | bin | 78000 -> 85960 bytes | |||
| -rw-r--r-- | dwm.c | 393 | ||||
| -rw-r--r-- | dwm.o | bin | 69520 -> 73088 bytes | |||
| -rw-r--r-- | util.o | bin | 2224 -> 2296 bytes |
7 files changed, 492 insertions, 366 deletions
diff --git a/config.def.h b/config.def.h index d5ee5ff..b55a0c7 100644 --- a/config.def.h +++ b/config.def.h @@ -1,9 +1,7 @@ -#include <X11/XF86keysym.h> /* See LICENSE file for copyright and license details. */ -/* Definitions */ -#define TERMINAL "urxvtc" -#define FLOATTERM "st" +/* Constants */ +#define TERMINAL "xterm" #define BROWSER "librewolf" /* appearance */ @@ -13,21 +11,27 @@ static const unsigned int gappx = 5; /* gaps between windows */ static const int swallowfloating = 1; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "cozette:size=12:autohint=true" }; -static const char dmenufont[] = "cozette:size=12:autohint=true"; -static const char col_gray1[] = "#000000"; // Colour of the background of the bar -static const char col_gray2[] = "#000000"; // Colour of the border of the inactive window -static const char col_gray3[] = "#bbbbbb"; // Colour of the foreground of the bar -static const char col_gray4[] = "#000000"; // Colour of the wallpaper by default -static const char col_cyan[] = "#bbbbbb"; // Colour of the border of the active window +static const char *fonts[] = { "CyberpunkWaifus:size=12:autohint=true, fontawesome:size=12" }; +static const char dmenufont[] = "CyberpunkWaifus:size=12:autohint=true, fontawesome:size=12"; +static const char col_gray1[] = "#000000"; +static const char col_gray2[] = "#bbbbbb"; +static const char col_gray3[] = "#4CAF50"; // Not selected +static const char col_gray4[] = "#000000"; +static const char col_cyan[] = "#FF8C00"; // Selected static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeNorm] = { col_gray3, col_gray1, col_gray1 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeHid] = { col_gray2, col_gray1, col_gray1 }, + [SchemeStatus] = { col_gray3, col_gray1, "#000000" }, // Statusbar right {text,background,not used but cannot be empty} + [SchemeTagsSel] = { col_cyan, col_gray1, "#000000" }, // Tagbar left selected {text,background,not used but cannot be empty} + [SchemeTagsNorm] = { col_gray3, col_gray1, "#000000" }, // Tagbar left unselected {text,background,not used but cannot be empty} + [SchemeInfoSel] = { col_cyan, col_gray1, "#000000" }, // infobar middle selected {text,background,not used but cannot be empty} + [SchemeInfoNorm] = { col_gray3, col_gray1, "#000000" }, // infobar middle unselected {text,background,not used but cannot be empty} }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; // These are what is visually displayed in the bar, you can change them to whatever. +static const char *tags[] = { "1", "2", "3", "4", "5" }; // These are what is visually displayed in the bar, you can change them to whatever. static const Rule rules[] = { /* xprop(1): @@ -35,21 +39,18 @@ static const Rule rules[] = { * WM_NAME(STRING) = title */ /* class instance title tags mask isfloating isterminal noswallow monitor */ - { NULL, NULL, NULL, 0, 0, 0, 0, -1 }, - { "discord", "discord", NULL, 0, 1, 0, 0, -1 }, - { NULL, "steamwebhelper", NULL, 0, 1, 0, 0, -1 }, - { NULL, "steamwebhelper", "Steam", 0, 0, 0, 0, -1 }, - { "qemu-system-x86_64","qemu-system-x86_64",NULL, 0, 1, 0, 0, -1 }, - { "Virt-manager",NULL, NULL, 0, 0, 0, 0, -1 }, - { "qBittorrent", NULL, NULL, 0, 1, 0, 0, -1 }, - { "St", NULL, NULL, 0, 1, 1, 0, -1 }, - { "URxvt", NULL, NULL, 0, 0, 1, 0, -1 }, - { "Nvidia-settings", "nvidia-settings",NULL, 0, 1, 0, 0, -1 }, - { "scrcpy", NULL, NULL, 0, 1, 0, 0, -1 }, - { "LibreWolf", "Alert", NULL, 0, 1, 0, 0, -1 }, - { "Nsxiv", NULL, NULL, 0, 1, 0, 0, -1 }, - { "mpv", NULL, NULL, 0, 1, 0, 0, -1 }, - { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, + { "steam", "steamwebhelper", NULL, 0, 1, 0, 0, -1 }, + { "steam", "steamwebhelper", "Steam", 0, 0, 0, 0, -1 }, + { "steam", NULL, "Steam Settings", 0, 1, 0, 0, -1 }, + { "qemu-system-x86_64","qemu-system-x86_64",NULL, 0, 1, 0, 0, -1 }, + { "Virt-manager",NULL, NULL, 0, 0, 0, 0, -1 }, + { "qBittorrent", NULL, NULL, 0, 1, 0, 0, -1 }, + { "qBittorrent", "qbittorrent", NULL, 0, 0, 0, 0, -1 }, + { "St", "st", NULL, 0, 0, 1, 0, -1 }, + { "scrcpy", NULL, NULL, 0, 1, 0, 0, -1 }, + { "LibreWolf", "Alert", NULL, 0, 1, 0, 0, -1 }, + { "Nsxiv", NULL, NULL, 0, 1, 0, 0, -1 }, + { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, }; /* layout(s) */ @@ -60,126 +61,113 @@ static const int lockfullscreen = 0; /* 1 will force focus on the fullscreen win static const Layout layouts[] = { /* symbol arrange function */ - { "[T]", tile }, /* first entry is default */ - { "[F]", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, + { "", tile }, /* first entry is default */ + { "", NULL }, /* no layout function means floating behavior */ + { "", monocle }, }; /* 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} }, + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_gray4, "-sf", col_cyan, NULL }; static const char *termcmd[] = { TERMINAL, NULL }; static const char *sutermcmd[] = { TERMINAL,"-e", "su", NULL }; -static const char *floattermcmd[] = { "st", NULL }; -static const char *volumeup[] = { "amixer", "sset", "Master", "5%+", NULL }; -static const char *volumedown[] = { "amixer", "sset", "Master", "5%-", NULL }; -static const char *volumetoggle[] = { "amixer", "sset", "Master", "toggle", NULL }; -static const char *mictoggle[] = { "amixer", "sset", "Capture", "toggle", NULL}; -static const char *brightnessup[] = { "xbacklight", "-inc", "3", NULL }; -static const char *brightnessdown[] = { "xbacklight", "-dec", "3", NULL }; -static const char *fasterbrightnessup[] = { "xbacklight", "-inc", "10", NULL }; -static const char *fasterbrightnessdown[] = { "xbacklight", "-dec", "10", NULL }; -static const char *slock[] = { "slock", NULL }; -static const char *browser[] = { BROWSER, NULL }; -static const char *steam[] = { "steam", NULL }; +#include <X11/XF86keysym.h> static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, XK_space, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_u, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { Mod1Mask, XK_Tab, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY, XK_q, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, - { MODKEY, XK_Return, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_r, quit, {0} }, + /* modifier key function argument */ + { MODKEY, XK_d, spawn, {.v = dmenucmd } }, + { MODKEY, XK_space, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstackvis, {.i = +1 } }, + { MODKEY, XK_k, focusstackvis, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_u, incnmaster, {.i = -1 } }, + { MODKEY, XK_o, setmfact, {.f = -0.05} }, + { MODKEY, XK_p, setmfact, {.f = +0.05} }, + { Mod1Mask, XK_Tab, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY, XK_q, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, + { MODKEY, XK_Return, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + { MODKEY|ShiftMask, XK_End, quit, {0} }, /* Non-default commands i.e. commands added in by me and patches */ - { MODKEY|ShiftMask, XK_space, spawn, {.v = sutermcmd } }, - { MODKEY|ControlMask, XK_space, spawn, {.v = floattermcmd } }, + { MODKEY|ShiftMask, XK_space, spawn, {.v = sutermcmd } }, { MODKEY, XK_minus, setgaps, {.i = -1 } }, { MODKEY, XK_equal, setgaps, {.i = +1 } }, { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - { MODKEY|ShiftMask, XK_j, rotatestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, rotatestack, {.i = -1 } }, - { MODKEY, XK_g, spawn, SHCMD("~/.local/bin/./dmenu_games") }, - { MODKEY|ShiftMask, XK_m, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "neomutt", NULL } }}, - { MODKEY|ShiftMask, XK_n, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "nvim", NULL } }}, - { MODKEY|ShiftMask, XK_h, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "htop", NULL } }}, - { MODKEY, XK_e, spawn, {.v = (const char*[]){ "pcmanfm", NULL } }}, - { MODKEY, XK_Print, spawn, SHCMD("scrot -q 100 ~/Pictures/%Y-%m.jpg") }, - { MODKEY, XK_Up, spawn, {.v = volumeup } }, - { MODKEY, XK_Down, spawn, {.v = volumedown } }, - { MODKEY, XK_Right, spawn, {.v = fasterbrightnessup } }, - { MODKEY, XK_Left, spawn, {.v = fasterbrightnessdown } }, - { MODKEY|ControlMask, XK_Right, spawn, {.v = brightnessup } }, - { MODKEY|ControlMask, XK_Left, spawn, {.v = brightnessdown } }, - { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volumeup } }, - { 0, XF86XK_AudioLowerVolume, spawn, {.v = volumedown } }, - { 0, XF86XK_AudioMute, spawn, {.v = volumetoggle } }, - { 0, XF86XK_MonBrightnessUp, spawn, {.v = fasterbrightnessup } }, - { 0, XF86XK_MonBrightnessDown, spawn, {.v = fasterbrightnessdown } }, - { 0, XF86XK_AudioMicMute, spawn, {.v = mictoggle } }, - { MODKEY, XK_w, spawn, {.v = browser } }, - { MODKEY, XK_s, spawn, {.v = steam } }, - { Mod1Mask|ControlMask, XK_Delete, spawn, {.v = slock } }, - { MODKEY, XK_Insert, spawn, SHCMD("setxkmap gb; xdotool type $(grep -v '^#' ~/.local/bin/bookmarksfile | dmenu -i -l 50)") }, - { MODKEY, XK_v, spawn, SHCMD("~/.local/bin/qemu-dmenu") }, - { MODKEY, XK_c, spawn, SHCMD("~/.local/bin/calculator") }, - { MODKEY|ShiftMask, XK_End, spawn, SHCMD("pkill X") }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY, XK_f, togglefullscr, {0} }, + { MODKEY, XK_BackSpace, hide, {0} }, + { MODKEY, XK_a, showall, {0} }, + { MODKEY, XK_g, spawn, SHCMD("dmenu_games") }, + { MODKEY|ShiftMask, XK_m, spawn, SHCMD(TERMINAL" -e neomutt")}, + { MODKEY|ShiftMask, XK_n, spawn, SHCMD(TERMINAL" -e nvim")}, + { MODKEY, XK_Escape, spawn, SHCMD(TERMINAL" -e htop")}, + { MODKEY, XK_n, spawn, SHCMD(TERMINAL" -e newsboat")}, + { MODKEY, XK_e, spawn, SHCMD(TERMINAL" -e lfub")}, + { MODKEY, XK_Print, spawn, SHCMD("maimpick") }, + { MODKEY, XK_Up, spawn, SHCMD("dwmvol up") }, + { MODKEY, XK_Down, spawn, SHCMD("dwmvol down") }, + { MODKEY, XK_Right, spawn, SHCMD("dwmlight up") }, + { MODKEY, XK_Left, spawn, SHCMD("dwmlight down") }, + { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("dwmvol up") }, + { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("dwmvol down") }, + { 0, XF86XK_AudioMute, spawn, SHCMD("dwmvol toggle") }, + { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("dwmlight up") }, + { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("dwmlight down") }, + { MODKEY, XK_F11, spawn, SHCMD("dwmstats") }, + { MODKEY, XK_F12, spawn, SHCMD("dwmext") }, + { MODKEY, XK_F8, spawn, SHCMD("dwmnet") }, + { MODKEY, XK_slash, spawn, SHCMD("demu") }, + { MODKEY, XK_s, spawn, SHCMD("steam") }, + { Mod1Mask|ControlMask, XK_Delete, spawn, SHCMD("slock") }, + { MODKEY, XK_w, spawn, SHCMD(BROWSER) }, + { MODKEY, XK_c, spawn, SHCMD("cliphist add") }, + { MODKEY, XK_v, spawn, SHCMD("cliphist sel") }, + { MODKEY, XK_x, spawn, SHCMD("xkill") }, + { MODKEY, XK_h, shiftview, { .i = -1 } }, + { MODKEY, XK_l, shiftview, { .i = +1 } }, + { MODKEY|ShiftMask, XK_r, quit, {1} }, + + /* Unused keys */ + // { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, }; /* button definitions */ /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ static const Button buttons[] = { /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -// { ClkTagBar, 0, Button1, view, {0} }, -// { ClkTagBar, 0, Button3, toggleview, {0} }, -// { ClkTagBar, MODKEY, Button1, tag, {0} }, -// { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, }; @@ -1,9 +1,7 @@ -#include <X11/XF86keysym.h> /* See LICENSE file for copyright and license details. */ -/* Definitions */ -#define TERMINAL "urxvtc" -#define FLOATTERM "st" +/* Constants */ +#define TERMINAL "xterm" #define BROWSER "librewolf" /* appearance */ @@ -13,21 +11,27 @@ static const unsigned int gappx = 5; /* gaps between windows */ static const int swallowfloating = 1; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "cozette:size=12:autohint=true" }; -static const char dmenufont[] = "cozette:size=12:autohint=true"; -static const char col_gray1[] = "#000000"; // Colour of the background of the bar -static const char col_gray2[] = "#000000"; // Colour of the border of the inactive window -static const char col_gray3[] = "#bbbbbb"; // Colour of the foreground of the bar -static const char col_gray4[] = "#000000"; // Colour of the wallpaper by default -static const char col_cyan[] = "#bbbbbb"; // Colour of the border of the active window +static const char *fonts[] = { "CyberpunkWaifus:size=12:autohint=true, fontawesome:size=12" }; +static const char dmenufont[] = "CyberpunkWaifus:size=12:autohint=true, fontawesome:size=12"; +static const char col_gray1[] = "#000000"; +static const char col_gray2[] = "#bbbbbb"; +static const char col_gray3[] = "#4CAF50"; // Not selected +static const char col_gray4[] = "#000000"; +static const char col_cyan[] = "#FF8C00"; // Selected static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeNorm] = { col_gray3, col_gray1, col_gray1 }, [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeHid] = { col_gray2, col_gray1, col_gray1 }, + [SchemeStatus] = { col_gray3, col_gray1, "#000000" }, // Statusbar right {text,background,not used but cannot be empty} + [SchemeTagsSel] = { col_cyan, col_gray1, "#000000" }, // Tagbar left selected {text,background,not used but cannot be empty} + [SchemeTagsNorm] = { col_gray3, col_gray1, "#000000" }, // Tagbar left unselected {text,background,not used but cannot be empty} + [SchemeInfoSel] = { col_cyan, col_gray1, "#000000" }, // infobar middle selected {text,background,not used but cannot be empty} + [SchemeInfoNorm] = { col_gray3, col_gray1, "#000000" }, // infobar middle unselected {text,background,not used but cannot be empty} }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; // These are what is visually displayed in the bar, you can change them to whatever. +static const char *tags[] = { "1", "2", "3", "4", "5" }; // These are what is visually displayed in the bar, you can change them to whatever. static const Rule rules[] = { /* xprop(1): @@ -35,21 +39,18 @@ static const Rule rules[] = { * WM_NAME(STRING) = title */ /* class instance title tags mask isfloating isterminal noswallow monitor */ - { NULL, NULL, NULL, 0, 0, 0, 0, -1 }, - { "discord", "discord", NULL, 0, 1, 0, 0, -1 }, - { NULL, "steamwebhelper", NULL, 0, 1, 0, 0, -1 }, - { NULL, "steamwebhelper", "Steam", 0, 0, 0, 0, -1 }, - { "qemu-system-x86_64","qemu-system-x86_64",NULL, 0, 1, 0, 0, -1 }, - { "Virt-manager",NULL, NULL, 0, 0, 0, 0, -1 }, - { "qBittorrent", NULL, NULL, 0, 1, 0, 0, -1 }, - { "St", NULL, NULL, 0, 1, 1, 0, -1 }, - { "URxvt", NULL, NULL, 0, 0, 1, 0, -1 }, - { "Nvidia-settings", "nvidia-settings",NULL, 0, 1, 0, 0, -1 }, - { "scrcpy", NULL, NULL, 0, 1, 0, 0, -1 }, - { "LibreWolf", "Alert", NULL, 0, 1, 0, 0, -1 }, - { "Nsxiv", NULL, NULL, 0, 1, 0, 0, -1 }, - { "mpv", NULL, NULL, 0, 1, 0, 0, -1 }, - { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, + { "steam", "steamwebhelper", NULL, 0, 1, 0, 0, -1 }, + { "steam", "steamwebhelper", "Steam", 0, 0, 0, 0, -1 }, + { "steam", NULL, "Steam Settings", 0, 1, 0, 0, -1 }, + { "qemu-system-x86_64","qemu-system-x86_64",NULL, 0, 1, 0, 0, -1 }, + { "Virt-manager",NULL, NULL, 0, 0, 0, 0, -1 }, + { "qBittorrent", NULL, NULL, 0, 1, 0, 0, -1 }, + { "qBittorrent", "qbittorrent", NULL, 0, 0, 0, 0, -1 }, + { "St", "st", NULL, 0, 0, 1, 0, -1 }, + { "scrcpy", NULL, NULL, 0, 1, 0, 0, -1 }, + { "LibreWolf", "Alert", NULL, 0, 1, 0, 0, -1 }, + { "Nsxiv", NULL, NULL, 0, 1, 0, 0, -1 }, + { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, }; /* layout(s) */ @@ -60,127 +61,113 @@ static const int lockfullscreen = 0; /* 1 will force focus on the fullscreen win static const Layout layouts[] = { /* symbol arrange function */ - { "[T]", tile }, /* first entry is default */ - { "[F]", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, + { "", tile }, /* first entry is default */ + { "", NULL }, /* no layout function means floating behavior */ + { "", monocle }, }; /* 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} }, + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_gray4, "-sf", col_cyan, NULL }; static const char *termcmd[] = { TERMINAL, NULL }; static const char *sutermcmd[] = { TERMINAL,"-e", "su", NULL }; -static const char *floattermcmd[] = { "st", NULL }; -static const char *volumeup[] = { "amixer", "sset", "Master", "5%+", NULL }; -static const char *volumedown[] = { "amixer", "sset", "Master", "5%-", NULL }; -static const char *volumetoggle[] = { "amixer", "sset", "Master", "toggle", NULL }; -static const char *mictoggle[] = { "amixer", "sset", "Capture", "toggle", NULL}; -static const char *brightnessup[] = { "xbacklight", "-inc", "3", NULL }; -static const char *brightnessdown[] = { "xbacklight", "-dec", "3", NULL }; -static const char *fasterbrightnessup[] = { "xbacklight", "-inc", "10", NULL }; -static const char *fasterbrightnessdown[] = { "xbacklight", "-dec", "10", NULL }; -static const char *slock[] = { "slock", NULL }; -static const char *browser[] = { BROWSER, NULL }; -static const char *steam[] = { "steam", NULL }; +#include <X11/XF86keysym.h> static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, XK_space, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_u, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { Mod1Mask, XK_Tab, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY, XK_q, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, - { MODKEY, XK_Return, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_r, quit, {0} }, + /* modifier key function argument */ + { MODKEY, XK_d, spawn, {.v = dmenucmd } }, + { MODKEY, XK_space, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstackvis, {.i = +1 } }, + { MODKEY, XK_k, focusstackvis, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_u, incnmaster, {.i = -1 } }, + { MODKEY, XK_o, setmfact, {.f = -0.05} }, + { MODKEY, XK_p, setmfact, {.f = +0.05} }, + { Mod1Mask, XK_Tab, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY, XK_q, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY|ShiftMask, XK_Return, setlayout, {0} }, + { MODKEY, XK_Return, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + { MODKEY|ShiftMask, XK_End, quit, {0} }, /* Non-default commands i.e. commands added in by me and patches */ - { MODKEY|ShiftMask, XK_space, spawn, {.v = sutermcmd } }, - { MODKEY|ControlMask, XK_space, spawn, {.v = floattermcmd } }, + { MODKEY|ShiftMask, XK_space, spawn, {.v = sutermcmd } }, { MODKEY, XK_minus, setgaps, {.i = -1 } }, { MODKEY, XK_equal, setgaps, {.i = +1 } }, { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - { MODKEY|ShiftMask, XK_j, rotatestack, {.i = +1 } }, - { MODKEY|ShiftMask, XK_k, rotatestack, {.i = -1 } }, - { MODKEY, XK_g, spawn, SHCMD("~/.local/bin/./dmenu_games") }, - { MODKEY|ShiftMask, XK_m, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "neomutt", NULL } }}, - { MODKEY|ShiftMask, XK_n, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "nvim", NULL } }}, - { MODKEY|ShiftMask, XK_h, spawn, {.v = (const char*[]){ FLOATTERM, "-e", "htop", NULL } }}, - { MODKEY, XK_e, spawn, {.v = (const char*[]){ "pcmanfm", NULL } }}, - { MODKEY, XK_Print, spawn, SHCMD("scrot -q 100 ~/Pictures/%Y-%m.jpg") }, - { MODKEY, XK_Up, spawn, {.v = volumeup } }, - { MODKEY, XK_Down, spawn, {.v = volumedown } }, - { MODKEY, XK_Right, spawn, {.v = fasterbrightnessup } }, - { MODKEY, XK_Left, spawn, {.v = fasterbrightnessdown } }, - { MODKEY|ControlMask, XK_Right, spawn, {.v = brightnessup } }, - { MODKEY|ControlMask, XK_Left, spawn, {.v = brightnessdown } }, - { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volumeup } }, - { 0, XF86XK_AudioLowerVolume, spawn, {.v = volumedown } }, - { 0, XF86XK_AudioMute, spawn, {.v = volumetoggle } }, - { 0, XF86XK_MonBrightnessUp, spawn, {.v = fasterbrightnessup } }, - { 0, XF86XK_MonBrightnessDown, spawn, {.v = fasterbrightnessdown } }, - { 0, XF86XK_AudioMicMute, spawn, {.v = mictoggle } }, - { MODKEY, XK_w, spawn, {.v = browser } }, - { MODKEY, XK_s, spawn, {.v = steam } }, - { Mod1Mask|ControlMask, XK_Delete, spawn, {.v = slock } }, - { MODKEY, XK_Insert, spawn, SHCMD("setxkmap gb; xdotool type $(grep -v '^#' ~/.local/bin/bookmarksfile | dmenu -i -l 50)") }, - { MODKEY, XK_v, spawn, SHCMD("~/.local/bin/qemu-dmenu") }, - { MODKEY, XK_c, spawn, SHCMD("~/.local/bin/calculator") }, - { MODKEY, XK_x, spawn, SHCMD("xkill") }, - { MODKEY|ShiftMask, XK_End, spawn, SHCMD("pkill X") }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY, XK_f, togglefullscr, {0} }, + { MODKEY, XK_BackSpace, hide, {0} }, + { MODKEY, XK_a, showall, {0} }, + { MODKEY, XK_g, spawn, SHCMD("dmenu_games") }, + { MODKEY|ShiftMask, XK_m, spawn, SHCMD(TERMINAL" -e neomutt")}, + { MODKEY|ShiftMask, XK_n, spawn, SHCMD(TERMINAL" -e nvim")}, + { MODKEY, XK_Escape, spawn, SHCMD(TERMINAL" -e htop")}, + { MODKEY, XK_n, spawn, SHCMD(TERMINAL" -e newsboat")}, + { MODKEY, XK_e, spawn, SHCMD(TERMINAL" -e lfub")}, + { MODKEY, XK_Print, spawn, SHCMD("maimpick") }, + { MODKEY, XK_Up, spawn, SHCMD("dwmvol up") }, + { MODKEY, XK_Down, spawn, SHCMD("dwmvol down") }, + { MODKEY, XK_Right, spawn, SHCMD("dwmlight up") }, + { MODKEY, XK_Left, spawn, SHCMD("dwmlight down") }, + { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("dwmvol up") }, + { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("dwmvol down") }, + { 0, XF86XK_AudioMute, spawn, SHCMD("dwmvol toggle") }, + { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("dwmlight up") }, + { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("dwmlight down") }, + { MODKEY, XK_F11, spawn, SHCMD("dwmstats") }, + { MODKEY, XK_F12, spawn, SHCMD("dwmext") }, + { MODKEY, XK_F8, spawn, SHCMD("dwmnet") }, + { MODKEY, XK_slash, spawn, SHCMD("demu") }, + { MODKEY, XK_s, spawn, SHCMD("steam") }, + { Mod1Mask|ControlMask, XK_Delete, spawn, SHCMD("slock") }, + { MODKEY, XK_w, spawn, SHCMD(BROWSER) }, + { MODKEY, XK_c, spawn, SHCMD("cliphist add") }, + { MODKEY, XK_v, spawn, SHCMD("cliphist sel") }, + { MODKEY, XK_x, spawn, SHCMD("xkill") }, + { MODKEY, XK_h, shiftview, { .i = -1 } }, + { MODKEY, XK_l, shiftview, { .i = +1 } }, + { MODKEY|ShiftMask, XK_r, quit, {1} }, + + /* Unused keys */ + // { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, }; /* button definitions */ /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ static const Button buttons[] = { /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -// { ClkTagBar, 0, Button1, view, {0} }, -// { ClkTagBar, 0, Button3, toggleview, {0} }, -// { ClkTagBar, MODKEY, Button1, tag, {0} }, -// { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, }; @@ -36,9 +36,7 @@ #include <X11/Xlib.h> #include <X11/Xproto.h> #include <X11/Xutil.h> -#ifdef XINERAMA #include <X11/extensions/Xinerama.h> -#endif /* XINERAMA */ #include <X11/Xft/Xft.h> #include <X11/Xlib-xcb.h> #include <xcb/res.h> @@ -56,6 +54,7 @@ #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 HIDDEN(C) ((getstate(C->win) == IconicState)) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) @@ -65,7 +64,7 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeHid, SchemeStatus, SchemeTagsSel, SchemeTagsNorm, SchemeInfoSel, SchemeInfoNorm }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ @@ -125,6 +124,8 @@ struct Monitor { int nmaster; int num; int by; /* bar geometry */ + int btw; /* width of tasks portion of bar */ + int bt; /* number of tasks */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ int gappx; /* gaps between windows */ @@ -133,6 +134,7 @@ struct Monitor { unsigned int tagset[2]; int showbar; int topbar; + int hidsel; Client *clients; Client *sel; Client *stack; @@ -158,7 +160,6 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac static void arrange(Monitor *m); static void arrangemon(Monitor *m); static void attach(Client *c); -static void attachbottom(Client *c); static void attachstack(Client *c); static void buttonpress(XEvent *e); static void checkotherwm(void); @@ -175,20 +176,23 @@ static void detachstack(Client *c); static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); -static void enqueue(Client *c); -static void enqueuestack(Client *c); 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 void focusstackvis(const Arg *arg); +static void movestack(const Arg *arg); +static void shiftview(const Arg *arg); +static void focusstack(int inc, int vis); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); +static void hide(const Arg *arg); +static void hidewin(Client *c); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); static void killclient(const Arg *arg); @@ -207,7 +211,6 @@ static void resize(Client *c, int x, int y, int w, int h, int interact); static void resizeclient(Client *c, int x, int y, int w, int h); static void resizemouse(const Arg *arg); static void restack(Monitor *m); -static void rotatestack(const Arg *arg); static void run(void); static void scan(void); static int sendevent(Client *c, Atom proto); @@ -220,13 +223,18 @@ static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); static void seturgent(Client *c, int urg); +static void showall(const Arg *arg); +static void showwin(Client *c); static void showhide(Client *c); +static void sighup(int unused); +static void sigterm(int unused); static void spawn(const Arg *arg); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *m); 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 toggleview(const Arg *arg); static void unfocus(Client *c, int setfocus); @@ -282,6 +290,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { [UnmapNotify] = unmapnotify }; static Atom wmatom[WMLast], netatom[NetLast]; +static int restart = 0; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -435,17 +444,6 @@ attach(Client *c) } void -attachbottom(Client *c) -{ - Client *below = c->mon->clients; - for (; below && below->next; below = below->next); - c->next = NULL; - if (below) - below->next = c; - else - c->mon->clients = c; -} -void attachstack(Client *c) { c->snext = c->mon->stack; @@ -525,10 +523,25 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + TEXTW(selmon->ltsymbol)) click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) + /* 2px right padding */ + else if (ev->x > selmon->ww - TEXTW(stext) + lrpad - 2) click = ClkStatusText; - else - click = ClkWinTitle; + else { + x += TEXTW(selmon->ltsymbol); + c = m->clients; + + if (c) { + do { + if (!ISVISIBLE(c)) + continue; + else + x +=(1.0 / (double)m->bt) * m->btw; + } while (ev->x > x && (c = c->next)); + + click = ClkWinTitle; + arg.v = c; + } + } } else if ((c = wintoclient(ev->window))) { focus(c); restack(selmon); @@ -538,7 +551,7 @@ buttonpress(XEvent *e) 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); + buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); } void @@ -786,9 +799,7 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; + int x, w, tw = 0, n = 0, scm; unsigned int i, occ = 0, urg = 0; Client *c; @@ -797,12 +808,14 @@ drawbar(Monitor *m) /* draw status first so it can be overdrawn by tags later */ if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); + drw_setscheme(drw, scheme[SchemeStatus]); tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); } for (c = m->clients; c; c = c->next) { + if (ISVISIBLE(c)) + n++; occ |= c->tags; if (c->isurgent) urg |= c->tags; @@ -811,32 +824,44 @@ drawbar(Monitor *m) for (i = 0; i < LENGTH(tags); i++) { w = TEXTW(tags[i]); if (!(m->tagset[m->seltags] & 1 << i || occ & 1 <<i)) continue; /*Only displays tags occupied by a window*/ - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeTagsSel : SchemeTagsNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - // if (occ & 1 << i) /*Doesn't draw the rectangle to indicate an occupied tag*/ - // drw_rect(drw, x + boxs, boxs, boxw, boxw, - // m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - // urg & 1 << i); x += w; } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + if (n > 0) { + int remainder = w % n; + int tabw = (1.0 / (double)n) * w + 1; + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + if (m->sel == c) + scm = SchemeInfoSel; + else if (HIDDEN(c)) + scm = SchemeHid; + else + scm = SchemeInfoNorm; + drw_setscheme(drw, scheme[scm]); + + if (remainder >= 0) { + if (remainder == 0) { + tabw--; + } + remainder--; + } + drw_text(drw, x, 0, tabw, bh, (TEXTW(c->name) < tabw ? (tabw - c->incw - TEXTW(c->name) + lrpad) / 2 : lrpad / 2), c->name, 0); + x += tabw; + } } else { - drw_setscheme(drw, scheme[SchemeNorm]); + drw_setscheme(drw, scheme[SchemeTagsNorm]); drw_rect(drw, x, 0, w, bh, 1, 1); } } + m->bt = n; + m->btw = w; drw_map(drw, m->barwin, 0, 0, m->ww, bh); } - void drawbars(void) { @@ -847,28 +872,6 @@ drawbars(void) } void -enqueue(Client *c) -{ - Client *l; - for (l = c->mon->clients; l && l->next; l = l->next); - if (l) { - l->next = c; - c->next = NULL; - } -} - -void -enqueuestack(Client *c) -{ - Client *l; - for (l = c->mon->stack; l && l->snext; l = l->snext); - if (l) { - l->snext = c; - c->snext = NULL; - } -} - -void enternotify(XEvent *e) { Client *c; @@ -901,9 +904,17 @@ void focus(Client *c) { if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) + for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); + if (selmon->sel && selmon->sel != c) { unfocus(selmon->sel, 0); + + if (selmon->hidsel) { + hidewin(selmon->sel); + if (c) + arrange(c->mon); + selmon->hidsel = 0; + } + } if (c) { if (c->mon != selmon) selmon = c->mon; @@ -949,28 +960,113 @@ focusmon(const Arg *arg) } void -focusstack(const Arg *arg) +focusstackvis(const Arg *arg) +{ + focusstack(arg->i, 0); +} + +void +movestack(const Arg *arg) +{ + Client *c = NULL, *p = NULL, *pc = NULL, *i; + + if(arg->i > 0) { + /* find the client after selmon->sel */ + for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); + if(!c) + for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next); + + } + else { + /* find the client before selmon->sel */ + for(i = selmon->clients; i != selmon->sel; i = i->next) + if(ISVISIBLE(i) && !i->isfloating) + c = i; + if(!c) + for(; i; i = i->next) + if(ISVISIBLE(i) && !i->isfloating) + c = i; + } + /* find the client before selmon->sel and c */ + for(i = selmon->clients; i && (!p || !pc); i = i->next) { + if(i->next == selmon->sel) + p = i; + if(i->next == c) + pc = i; + } + + /* swap c and selmon->sel selmon->clients in the selmon->clients list */ + if(c && c != selmon->sel) { + Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next; + selmon->sel->next = c->next==selmon->sel?c:c->next; + c->next = temp; + + if(p && p != c) + p->next = c; + if(pc && pc != selmon->sel) + pc->next = selmon->sel; + + if(selmon->sel == selmon->clients) + selmon->clients = c; + else if(c == selmon->clients) + selmon->clients = selmon->sel; + + arrange(selmon); + } +} + +void +shiftview(const Arg *arg) +{ + Arg shifted; + if(arg->i > 0) + shifted.ui = (selmon->tagset[selmon->seltags] << arg->i) + | (selmon->tagset[selmon->seltags] >> (LENGTH(tags) - arg->i)); + + else + shifted.ui = selmon->tagset[selmon->seltags] >> (- arg->i) + | selmon->tagset[selmon->seltags] << (LENGTH(tags) + arg->i); + + view(&shifted); +} + +void +focusstack(int inc, int hid) { Client *c = NULL, *i; - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) + if ((!selmon->sel && !hid) || (selmon->sel && selmon->sel->isfullscreen && lockfullscreen)) + return; + if (!selmon->clients) return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (inc > 0) { + if (selmon->sel) + for (c = selmon->sel->next; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + for (c = selmon->clients; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; + if (selmon->sel) { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } else + c = selmon->clients; if (!c) for (; i; i = i->next) - if (ISVISIBLE(i)) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) c = i; } if (c) { focus(c); restack(selmon); + if (HIDDEN(c)) { + showwin(c); + c->mon->hidsel = 1; + } XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); } } @@ -1092,6 +1188,36 @@ grabkeys(void) } void +hide(const Arg *arg) +{ + hidewin(selmon->sel); + focus(NULL); + arrange(selmon); +} + +void +hidewin(Client *c) { + if (!c || HIDDEN(c)) + return; + + Window w = c->win; + static XWindowAttributes ra, ca; + + // more or less taken directly from blackbox's hide() function + XGrabServer(dpy); + XGetWindowAttributes(dpy, root, &ra); + XGetWindowAttributes(dpy, w, &ca); + // prevent UnmapNotify events + XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); + XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); + XUnmapWindow(dpy, w); + setclientstate(c, IconicState); + XSelectInput(dpy, root, ra.your_event_mask); + XSelectInput(dpy, w, ca.your_event_mask); + XUngrabServer(dpy); +} + +void incnmaster(const Arg *arg) { selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); @@ -1192,17 +1318,19 @@ manage(Window w, XWindowAttributes *wa) c->isfloating = c->oldstate = trans != None || c->isfixed; if (c->isfloating) XRaiseWindow(dpy, c->win); - attachbottom(c); + 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 (!HIDDEN(c)) + setclientstate(c, NormalState); if (c->mon == selmon) unfocus(selmon->sel, 0); c->mon->sel = c; arrange(c->mon); - XMapWindow(dpy, c->win); + if (!HIDDEN(c)) + XMapWindow(dpy, c->win); if (c && c->mon == selmon) XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); focus(NULL); @@ -1269,7 +1397,6 @@ movemouse(const Arg *arg) Client *c; Monitor *m; XEvent ev; - Time lasttime = 0; if (!(c = selmon->sel)) return; @@ -1292,9 +1419,6 @@ movemouse(const Arg *arg) 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); @@ -1325,7 +1449,7 @@ movemouse(const Arg *arg) Client * nexttiled(Client *c) { - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); return c; } @@ -1378,6 +1502,16 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { + Monitor *m; + Client *c; + for (m = mons; m; m = m->next) { + if (m) { + for (c = m->stack; c; c = c->next) + if (c && HIDDEN(c)) showwin(c); + } + } + + if(arg->i) restart = 1; running = 0; } @@ -1429,7 +1563,6 @@ resizemouse(const Arg *arg) int di; unsigned int dui; Window dummy; - Time lasttime = 0; if (!(c = selmon->sel)) return; @@ -1459,9 +1592,6 @@ resizemouse(const Arg *arg) handler[ev.type](&ev); break; case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; nx = horizcorner && ocx2 - ev.xmotion.x >= c->minw ? ev.xmotion.x : c->x; ny = vertcorner && ocy2 - ev.xmotion.y >= c->minh ? ev.xmotion.y : c->y; @@ -1523,38 +1653,6 @@ restack(Monitor *m) } void -rotatestack(const Arg *arg) -{ - Client *c = NULL, *f; - - if (!selmon->sel) - return; - f = selmon->sel; - if (arg->i > 0) { - for (c = nexttiled(selmon->clients); c && nexttiled(c->next); c = nexttiled(c->next)); - if (c){ - detach(c); - attach(c); - detachstack(c); - attachstack(c); - } - } else { - if ((c = nexttiled(selmon->clients))){ - detach(c); - enqueue(c); - detachstack(c); - enqueuestack(c); - } - } - if (c){ - arrange(selmon); - //unfocus(f, 1); - focus(f); - restack(selmon); - } -} - -void run(void) { XEvent ev; @@ -1602,7 +1700,7 @@ sendmon(Client *c, Monitor *m) detachstack(c); c->mon = m; attach(c); - attachbottom(c); + attach(c); attachstack(c); focus(NULL); arrange(NULL); @@ -1738,6 +1836,9 @@ setup(void) /* clean up any zombies (inherited from .xinitrc etc) immediately */ while (waitpid(-1, NULL, WNOHANG) > 0); + signal(SIGHUP, sighup); + signal(SIGTERM, sigterm); + /* init screen */ screen = DefaultScreen(dpy); sw = DisplayWidth(dpy, screen); @@ -1812,6 +1913,34 @@ seturgent(Client *c, int urg) } void +showall(const Arg *arg) +{ + Client *c = NULL; + selmon->hidsel = 0; + for (c = selmon->clients; c; c = c->next) { + if (ISVISIBLE(c)) + showwin(c); + } + if (!selmon->sel) { + for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + if (c) + focus(c); + } + restack(selmon); +} + +void +showwin(Client *c) +{ + if (!c || !HIDDEN(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); + arrange(c->mon); +} + +void showhide(Client *c) { if (!c) @@ -1830,6 +1959,20 @@ showhide(Client *c) } void +sighup(int unused) +{ + Arg a = {.i = 1}; + quit(&a); +} + +void +sigterm(int unused) +{ + Arg a = {.i = 0}; + quit(&a); +} + +void spawn(const Arg *arg) { struct sigaction sa; @@ -1921,6 +2064,13 @@ togglefloating(const Arg *arg) } void +togglefullscr(const Arg *arg) +{ + if(selmon->sel) + setfullscreen(selmon->sel, !selmon->sel->isfullscreen); +} + +void toggletag(const Arg *arg) { unsigned int newtags; @@ -2333,7 +2483,7 @@ getparentprocess(pid_t p) if (!(f = fopen(buf, "r"))) return 0; - fscanf(f, "%*u %*s %*c %u", &v); + // fscanf(f, "%*u %*s %*c %u", &v); fclose(f); #endif /* __linux__*/ @@ -2496,6 +2646,7 @@ main(int argc, char *argv[]) #endif /* __OpenBSD__ */ scan(); run(); + if(restart) execvp(argv[0], argv); cleanup(); XCloseDisplay(dpy); return EXIT_SUCCESS; Binary files differBinary files differ |
