new version
This commit is contained in:
parent
a1fd738a42
commit
41b3f64b20
24 changed files with 1538 additions and 1471 deletions
56
.gitignore
vendored
56
.gitignore
vendored
|
@ -1,56 +1,2 @@
|
||||||
config.h
|
|
||||||
|
|
||||||
# Prerequisites
|
|
||||||
*.d
|
|
||||||
|
|
||||||
# Object files
|
|
||||||
*.o
|
|
||||||
*.ko
|
|
||||||
*.obj
|
|
||||||
*.elf
|
|
||||||
|
|
||||||
# Linker output
|
|
||||||
*.ilk
|
|
||||||
*.map
|
|
||||||
*.exp
|
|
||||||
|
|
||||||
# Precompiled Headers
|
|
||||||
*.gch
|
|
||||||
*.pch
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
*.lib
|
|
||||||
*.a
|
|
||||||
*.la
|
|
||||||
*.lo
|
|
||||||
|
|
||||||
# Shared objects (inc. Windows DLLs)
|
|
||||||
*.dll
|
|
||||||
*.so
|
|
||||||
*.so.*
|
|
||||||
*.dylib
|
|
||||||
|
|
||||||
# Executables
|
|
||||||
*.exe
|
|
||||||
*.out
|
|
||||||
*.app
|
|
||||||
*.i*86
|
|
||||||
*.x86_64
|
|
||||||
*.hex
|
|
||||||
dwm
|
dwm
|
||||||
stest
|
*.o
|
||||||
|
|
||||||
# Debug files
|
|
||||||
*.dSYM/
|
|
||||||
*.su
|
|
||||||
*.idb
|
|
||||||
*.pdb
|
|
||||||
|
|
||||||
# Kernel Module Compile Results
|
|
||||||
*.mod*
|
|
||||||
*.cmd
|
|
||||||
.tmp_versions/
|
|
||||||
modules.order
|
|
||||||
Module.symvers
|
|
||||||
Mkfile.old
|
|
||||||
dkms.conf
|
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -6,13 +6,7 @@ include config.mk
|
||||||
SRC = drw.c dwm.c util.c
|
SRC = drw.c dwm.c util.c
|
||||||
OBJ = ${SRC:.c=.o}
|
OBJ = ${SRC:.c=.o}
|
||||||
|
|
||||||
all: options dwm
|
all: dwm
|
||||||
|
|
||||||
options:
|
|
||||||
@echo dwm build options:
|
|
||||||
@echo "CFLAGS = ${CFLAGS}"
|
|
||||||
@echo "LDFLAGS = ${LDFLAGS}"
|
|
||||||
@echo "CC = ${CC}"
|
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
${CC} -c ${CFLAGS} $<
|
${CC} -c ${CFLAGS} $<
|
||||||
|
@ -48,4 +42,4 @@ uninstall:
|
||||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
||||||
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||||
|
|
||||||
.PHONY: all options clean dist install uninstall
|
.PHONY: all clean dist install uninstall
|
||||||
|
|
48
README
Normal file
48
README
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
dwm - dynamic window manager
|
||||||
|
============================
|
||||||
|
dwm is an extremely fast, small, and dynamic window manager for X.
|
||||||
|
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
In order to build dwm you need the Xlib header files.
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
Edit config.mk to match your local setup (dwm is installed into
|
||||||
|
the /usr/local namespace by default).
|
||||||
|
|
||||||
|
Afterwards enter the following command to build and install dwm (if
|
||||||
|
necessary as root):
|
||||||
|
|
||||||
|
make clean install
|
||||||
|
|
||||||
|
|
||||||
|
Running dwm
|
||||||
|
-----------
|
||||||
|
Add the following line to your .xinitrc to start dwm using startx:
|
||||||
|
|
||||||
|
exec dwm
|
||||||
|
|
||||||
|
In order to connect dwm to a specific display, make sure that
|
||||||
|
the DISPLAY environment variable is set correctly, e.g.:
|
||||||
|
|
||||||
|
DISPLAY=foo.bar:1 exec dwm
|
||||||
|
|
||||||
|
(This will start dwm on display :1 of the host foo.bar.)
|
||||||
|
|
||||||
|
In order to display status info in the bar, you can do something
|
||||||
|
like this in your .xinitrc:
|
||||||
|
|
||||||
|
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
|
||||||
|
do
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
exec dwm
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
The configuration of dwm is done by creating a custom config.h
|
||||||
|
and (re)compiling the source code.
|
42
README.md
42
README.md
|
@ -1,42 +0,0 @@
|
||||||
# My personal dwm build
|
|
||||||
|
|
||||||
## Description
|
|
||||||
My personal repository for a custom dwm build currently using the Gruvbox theme.
|
|
||||||
|
|
||||||
## Patches applied to suckless' software
|
|
||||||
Applied via \*.diff files found in suckless.org, in the appearing order.
|
|
||||||
Unsuccessful patches generated a \*.rej file which was moved to the corresponding "patches/manpatch/" directory for each program, and renamed \*.manpatch. This was then used to manually patch the source code.
|
|
||||||
|
|
||||||
### dwm
|
|
||||||
(2147 lines of code unpatched, added +424 lines for 2571 total)
|
|
||||||
- swallow
|
|
||||||
- pertag
|
|
||||||
- fullgaps
|
|
||||||
- movestack
|
|
||||||
- notitle
|
|
||||||
- attachbottom
|
|
||||||
- warp
|
|
||||||
- alwayscenter
|
|
||||||
- sticky
|
|
||||||
|
|
||||||
## Dependencies (Archlinux names)
|
|
||||||
ttf-nerd-fonts-symbols-2048-em-mono.
|
|
||||||
make,
|
|
||||||
libxcb
|
|
||||||
libX11-devel,
|
|
||||||
libXft-devel,
|
|
||||||
libXinerama-devel,
|
|
||||||
alsa-utils,
|
|
||||||
cilpmenu,
|
|
||||||
scrot,
|
|
||||||
dunst,
|
|
||||||
|
|
||||||
## Default apps
|
|
||||||
librewolf,
|
|
||||||
mpv,
|
|
||||||
vim,
|
|
||||||
nnn,
|
|
||||||
|
|
||||||
## Not necessary but useful in laptops
|
|
||||||
iwd,
|
|
||||||
brightnessctl,
|
|
124
config.def.h
124
config.def.h
|
@ -1,37 +1,27 @@
|
||||||
/* See LICENSE file for copyright and license details. */
|
/* See LICENSE file for copyright and license details. */
|
||||||
#include <X11/XF86keysym.h>
|
|
||||||
|
|
||||||
/* appearance */
|
/* appearance */
|
||||||
static const unsigned int borderpx = 2; /* border pixel of windows */
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||||
static const Gap default_gap = {.isgap = 1, .realgap = 5, .gappx = 5};
|
static const unsigned int gappx = 5; /* gaps between windows */
|
||||||
static const unsigned int snap = 5; /* snap pixel */
|
static const unsigned int snap = 32; /* snap pixel */
|
||||||
static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
|
static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
|
||||||
static const int showbar = 1; /* 0 means no bar */
|
static const int showbar = 1; /* 0 means no bar */
|
||||||
static const int topbar = 1; /* 0 means bottom bar */
|
static const int topbar = 1; /* 0 means bottom bar */
|
||||||
static const char *fonts[] = { "JetBrainsMono:bold:size=10" };
|
static const char *fonts[] = { "monospace:size=10" };
|
||||||
static const char dmenufont[] = "JetBrainsMono:bold:size=10";
|
static const char dmenufont[] = "monospace:size=10";
|
||||||
static const char col_gray1[] = "#222222";
|
static const char col_gray1[] = "#222222";
|
||||||
static const char col_gray2[] = "#444444";
|
static const char col_gray2[] = "#444444";
|
||||||
static const char col_gray3[] = "#bbbbbb";
|
static const char col_gray3[] = "#bbbbbb";
|
||||||
static const char col_gray4[] = "#eeeeee";
|
static const char col_gray4[] = "#eeeeee";
|
||||||
static const char col_cyan[] = "#005577";
|
static const char col_cyan[] = "#005577";
|
||||||
/* custom colors */
|
|
||||||
static const char col_white[] = "#ffffff";
|
|
||||||
static const char col_black[] = "#000000";
|
|
||||||
static const char col_light[] = "#689d6a";
|
|
||||||
static const char col_dark[] = "#1d2021";
|
|
||||||
static const char col_main_light[] = "#fabd2f";
|
|
||||||
static const char col_main_dark[] = "#1d2021";
|
|
||||||
static const char col_main_contr[] = "#012b27";
|
|
||||||
static const char *colors[][3] = {
|
static const char *colors[][3] = {
|
||||||
/* --------------- */
|
|
||||||
/* fg bg border */
|
/* fg bg border */
|
||||||
[SchemeNorm] = { col_light, col_main_contr, col_main_dark },
|
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||||
[SchemeSel] = { col_dark, col_main_light, col_main_light },
|
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* tagging */
|
/* tagging */
|
||||||
static const char *tags[] = { " I ", " II ", " III ", " IV ", " V " };
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
|
||||||
static const Rule rules[] = {
|
static const Rule rules[] = {
|
||||||
/* xprop(1):
|
/* xprop(1):
|
||||||
|
@ -39,8 +29,9 @@ static const Rule rules[] = {
|
||||||
* WM_NAME(STRING) = title
|
* WM_NAME(STRING) = title
|
||||||
*/
|
*/
|
||||||
/* class instance title tags mask isfloating isterminal noswallow monitor */
|
/* class instance title tags mask isfloating isterminal noswallow monitor */
|
||||||
{ "st", NULL, NULL, 0, 0, 1, 0, -1 },
|
{ "Gimp", NULL, NULL, 0, 1, 0, 0, -1 },
|
||||||
{ "Display-im6.q16", NULL, NULL, 0, 1, 1, 0, -1 },
|
{ "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 },
|
||||||
|
{ "St", NULL, NULL, 0, 0, 1, 0, -1 },
|
||||||
{ NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
|
{ NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,16 +39,17 @@ static const Rule rules[] = {
|
||||||
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
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 nmaster = 1; /* number of clients in master area */
|
||||||
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
||||||
static const int lockfullscreen = 0; /* 1 will force focus on the fullscreen window */
|
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
|
||||||
|
|
||||||
static const Layout layouts[] = {
|
static const Layout layouts[] = {
|
||||||
/* symbol arrange function */
|
/* symbol arrange function */
|
||||||
{ "", tile }, /* first entry is default */
|
{ "[]=", tile }, /* first entry is default */
|
||||||
|
{ "><>", NULL }, /* no layout function means floating behavior */
|
||||||
{ "[M]", monocle },
|
{ "[M]", monocle },
|
||||||
};
|
};
|
||||||
|
|
||||||
/* key definitions */
|
/* key definitions */
|
||||||
#define MODKEY Mod4Mask
|
#define MODKEY Mod1Mask
|
||||||
#define TAGKEYS(KEY,TAG) \
|
#define TAGKEYS(KEY,TAG) \
|
||||||
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
|
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
|
||||||
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
|
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
|
||||||
|
@ -67,100 +59,60 @@ static const Layout layouts[] = {
|
||||||
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
||||||
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
||||||
|
|
||||||
#define STATUSBAR "dwmblocks"
|
|
||||||
|
|
||||||
/* commands */
|
/* commands */
|
||||||
static const char *menucmd[] = { "menu", "Run:", "run", NULL };
|
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||||
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||||
static const char *termcmd[] = { "st", NULL };
|
static const char *termcmd[] = { "st", NULL };
|
||||||
/* custom commands */
|
|
||||||
static const char *filemanager[] = { "thunar", NULL };
|
|
||||||
static const char *dbookmarks[] = { "menu-bookmarks", NULL };
|
|
||||||
static const char *dpass[] = { "dwmpass", NULL };
|
|
||||||
static const char *dpassotp[] = { "dwmotp", NULL };
|
|
||||||
static const char *klayout[] = { "setxkbmap-next", NULL };
|
|
||||||
static const char *doutput[] = { "menu-output", NULL };
|
|
||||||
static const char *dinput[] = { "menu-input", NULL };
|
|
||||||
static const char *dpower[] = { "menu-power", NULL };
|
|
||||||
static const char *browser[] = { "firefox-hardened", NULL };
|
|
||||||
static const char *wpa_gui[] = { "wpa_gui", NULL };
|
|
||||||
static const char *brightdown[] = { "brightdown", NULL };
|
|
||||||
static const char *brightup[] = { "brightup", NULL };
|
|
||||||
static const char *clipmenu[] = { "clipmenu", NULL };
|
|
||||||
static const char *voldown[] = { "voldown", NULL };
|
|
||||||
static const char *volup[] = { "volup", NULL };
|
|
||||||
static const char *micdown[] = { "micdown", NULL };
|
|
||||||
static const char *micup[] = { "micup", NULL };
|
|
||||||
static const char *prtsc[] = { "prtsc", NULL };
|
|
||||||
static const char *mute[] = { "mute", NULL };
|
|
||||||
static const char *micmute[] = { "micmute", NULL };
|
|
||||||
/* --------------- */
|
|
||||||
|
|
||||||
#include "movestack.c"
|
#include "movestack.c"
|
||||||
static const Key keys[] = {
|
static const Key keys[] = {
|
||||||
/* modifier key function argument */
|
/* modifier key function argument */
|
||||||
{ MODKEY, XK_r, spawn, {.v = menucmd } },
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||||
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
|
||||||
{ MODKEY|ShiftMask, XK_b, togglebar, {0} },
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
{ MODKEY|ShiftMask, XK_i, incnmaster, {.i = +1 } },
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_d, incnmaster, {.i = -1 } },
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||||
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
{ MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||||
{ MODKEY|ShiftMask, XK_Return, zoom, {0} },
|
{ MODKEY, XK_Return, zoom, {0} },
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
{ MODKEY, XK_c, killclient, {0} },
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||||
{ MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[0]} },
|
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
|
||||||
{ MODKEY|ShiftMask, XK_m, setlayout, {.v = &layouts[1]} },
|
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
|
||||||
{ MODKEY, XK_t, togglefloating, {0} },
|
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
|
||||||
{ MODKEY, XK_s, togglesticky, {0} },
|
{ MODKEY, XK_space, setlayout, {0} },
|
||||||
|
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
||||||
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
||||||
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
||||||
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
||||||
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
||||||
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
||||||
{ MODKEY, XK_minus, setgaps, {.i = -5 } },
|
{ MODKEY, XK_minus, setgaps, {.i = -1 } },
|
||||||
{ MODKEY, XK_equal, setgaps, {.i = +5 } },
|
{ MODKEY, XK_equal, setgaps, {.i = +1 } },
|
||||||
{ MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } },
|
{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } },
|
||||||
{ MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} },
|
|
||||||
TAGKEYS( XK_1, 0)
|
TAGKEYS( XK_1, 0)
|
||||||
TAGKEYS( XK_2, 1)
|
TAGKEYS( XK_2, 1)
|
||||||
TAGKEYS( XK_3, 2)
|
TAGKEYS( XK_3, 2)
|
||||||
TAGKEYS( XK_4, 3)
|
TAGKEYS( XK_4, 3)
|
||||||
TAGKEYS( XK_5, 4)
|
TAGKEYS( XK_5, 4)
|
||||||
|
TAGKEYS( XK_6, 5)
|
||||||
|
TAGKEYS( XK_7, 6)
|
||||||
|
TAGKEYS( XK_8, 7)
|
||||||
|
TAGKEYS( XK_9, 8)
|
||||||
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
/* custom binds */
|
|
||||||
{ MODKEY, XK_f, spawn, {.v = filemanager } },
|
|
||||||
{ MODKEY, XK_b, spawn, {.v = dbookmarks } },
|
|
||||||
{ MODKEY|ShiftMask, XK_w, spawn, {.v = wpa_gui } },
|
|
||||||
{ MODKEY|ShiftMask, XK_o, spawn, {.v = dpassotp } },
|
|
||||||
{ MODKEY|ShiftMask, XK_c, spawn, {.v = clipmenu } },
|
|
||||||
{ MODKEY, XK_w, spawn, {.v = browser } },
|
|
||||||
{ MODKEY, XK_o, spawn, {.v = doutput } },
|
|
||||||
{ MODKEY, XK_space, spawn, {.v = klayout } },
|
|
||||||
{ MODKEY, XK_p, spawn, {.v = dpower } },
|
|
||||||
{ MODKEY, XK_i, spawn, {.v = dinput } },
|
|
||||||
{ MODKEY|ShiftMask, XK_p, spawn, {.v = dpass } },
|
|
||||||
{ 0, XF86XK_MonBrightnessDown, spawn, {.v = brightdown } },
|
|
||||||
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brightup } },
|
|
||||||
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = voldown } },
|
|
||||||
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } },
|
|
||||||
{ 0, XF86XK_AudioMute, spawn, {.v = mute } },
|
|
||||||
{ ShiftMask, XF86XK_AudioLowerVolume, spawn, {.v = micdown } },
|
|
||||||
{ ShiftMask, XF86XK_AudioRaiseVolume, spawn, {.v = micup } },
|
|
||||||
{ ShiftMask, XF86XK_AudioMute, spawn, {.v = micmute } },
|
|
||||||
{ 0, XF86XK_AudioMicMute, spawn, {.v = micmute } },
|
|
||||||
{ 0, XK_Print, spawn, {.v = prtsc } },
|
|
||||||
/* ------------ */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* button definitions */
|
/* button definitions */
|
||||||
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
||||||
static const Button buttons[] = {
|
static const Button buttons[] = {
|
||||||
/* click event mask button function argument */
|
/* click event mask button function argument */
|
||||||
|
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
|
||||||
|
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
|
||||||
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
|
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
|
||||||
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
||||||
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
||||||
|
|
172
config.h
Normal file
172
config.h
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <X11/XF86keysym.h>
|
||||||
|
|
||||||
|
/* appearance */
|
||||||
|
static const unsigned int borderpx = 2; /* border pixel of windows */
|
||||||
|
static const unsigned int gappx = 5; /* gaps between windows */
|
||||||
|
static const unsigned int snap = 5; /* snap pixel */
|
||||||
|
static const int swallowfloating = 0; /* 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[] = { "JetBrainsMono:bold:size=10" };
|
||||||
|
static const char dmenufont[] = "JetBrainsMono:bold:size=10";
|
||||||
|
static const char col_gray1[] = "#222222";
|
||||||
|
static const char col_gray2[] = "#444444";
|
||||||
|
static const char col_gray3[] = "#bbbbbb";
|
||||||
|
static const char col_gray4[] = "#eeeeee";
|
||||||
|
static const char col_cyan[] = "#005577";
|
||||||
|
/* custom colors */
|
||||||
|
static const char col_light[] = "#689d6a";
|
||||||
|
static const char col_dark[] = "#1d2021";
|
||||||
|
static const char col_main_light[] = "#fabd2f";
|
||||||
|
static const char col_main_dark[] = "#1d2021";
|
||||||
|
static const char col_main_contr[] = "#012b27";
|
||||||
|
static const char *colors[][3] = {
|
||||||
|
/* --------------- */
|
||||||
|
/* fg bg border */
|
||||||
|
[SchemeNorm] = { col_light, col_main_contr, col_main_dark },
|
||||||
|
[SchemeSel] = { col_dark, col_main_light, col_main_light },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* tagging */
|
||||||
|
static const char *tags[] = { " I ", " II ", " III ", " IV ", " V " };
|
||||||
|
|
||||||
|
static const Rule rules[] = {
|
||||||
|
/* xprop(1):
|
||||||
|
* WM_CLASS(STRING) = instance, class
|
||||||
|
* WM_NAME(STRING) = title
|
||||||
|
*/
|
||||||
|
/* class instance title tags mask isfloating isterminal noswallow monitor */
|
||||||
|
{ "st", NULL, NULL, 0, 0, 1, 0, -1 },
|
||||||
|
{ "Display-im6.q16", NULL, NULL, 0, 1, 1, 0, -1 },
|
||||||
|
{ NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* layout(s) */
|
||||||
|
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
||||||
|
static const int nmaster = 1; /* number of clients in master area */
|
||||||
|
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
||||||
|
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
|
||||||
|
|
||||||
|
static const Layout layouts[] = {
|
||||||
|
/* symbol arrange function */
|
||||||
|
{ "", tile }, /* first entry is default */
|
||||||
|
{ "[M]", 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} },
|
||||||
|
|
||||||
|
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
||||||
|
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
||||||
|
|
||||||
|
#define STATUSBAR "dwmblocks"
|
||||||
|
|
||||||
|
/* commands */
|
||||||
|
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||||
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||||
|
static const char *termcmd[] = { "st", NULL };
|
||||||
|
|
||||||
|
/* custom commands */
|
||||||
|
static const char *menucmd[] = { "menu", "Run:", "run", NULL };
|
||||||
|
static const char *filemanager[] = { "thunar", NULL };
|
||||||
|
static const char *dbookmarks[] = { "menu-bookmarks", NULL };
|
||||||
|
static const char *dpass[] = { "dwmpass", NULL };
|
||||||
|
static const char *dpassotp[] = { "dwmotp", NULL };
|
||||||
|
static const char *klayout[] = { "setxkbmap-next", NULL };
|
||||||
|
static const char *doutput[] = { "menu-output", NULL };
|
||||||
|
static const char *dinput[] = { "menu-input", NULL };
|
||||||
|
static const char *dpower[] = { "menu-power", NULL };
|
||||||
|
static const char *browser[] = { "firefox-hardened", NULL };
|
||||||
|
static const char *wpa_gui[] = { "wpa_gui", NULL };
|
||||||
|
static const char *brightdown[] = { "brightdown", NULL };
|
||||||
|
static const char *brightup[] = { "brightup", NULL };
|
||||||
|
static const char *clipmenu[] = { "clipmenu", NULL };
|
||||||
|
static const char *voldown[] = { "voldown", NULL };
|
||||||
|
static const char *volup[] = { "volup", NULL };
|
||||||
|
static const char *micdown[] = { "micdown", NULL };
|
||||||
|
static const char *micup[] = { "micup", NULL };
|
||||||
|
static const char *prtsc[] = { "prtsc", NULL };
|
||||||
|
static const char *mute[] = { "mute", NULL };
|
||||||
|
static const char *micmute[] = { "micmute", NULL };
|
||||||
|
/* --------------- */
|
||||||
|
|
||||||
|
#include "movestack.c"
|
||||||
|
static const Key keys[] = {
|
||||||
|
/* modifier key function argument */
|
||||||
|
{ MODKEY, XK_r, spawn, {.v = menucmd } },
|
||||||
|
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
||||||
|
{ MODKEY|ShiftMask, 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_j, movestack, {.i = +1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_Return, zoom, {0} },
|
||||||
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
|
{ MODKEY, XK_c, killclient, {0} },
|
||||||
|
{ MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[0]} },
|
||||||
|
{ MODKEY|ShiftMask, XK_m, setlayout, {.v = &layouts[1]} },
|
||||||
|
{ MODKEY, XK_t, togglefloating, {0} },
|
||||||
|
{ MODKEY, XK_s, togglesticky, {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, XK_minus, setgaps, {.i = -5 } },
|
||||||
|
{ MODKEY, XK_equal, setgaps, {.i = +5 } },
|
||||||
|
TAGKEYS( XK_1, 0)
|
||||||
|
TAGKEYS( XK_2, 1)
|
||||||
|
TAGKEYS( XK_3, 2)
|
||||||
|
TAGKEYS( XK_4, 3)
|
||||||
|
TAGKEYS( XK_5, 4)
|
||||||
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
|
/* custom binds */
|
||||||
|
{ MODKEY, XK_f, spawn, {.v = filemanager } },
|
||||||
|
{ MODKEY, XK_b, spawn, {.v = dbookmarks } },
|
||||||
|
{ MODKEY|ShiftMask, XK_w, spawn, {.v = wpa_gui } },
|
||||||
|
{ MODKEY|ShiftMask, XK_o, spawn, {.v = dpassotp } },
|
||||||
|
{ MODKEY|ShiftMask, XK_c, spawn, {.v = clipmenu } },
|
||||||
|
{ MODKEY, XK_w, spawn, {.v = browser } },
|
||||||
|
{ MODKEY, XK_o, spawn, {.v = doutput } },
|
||||||
|
{ MODKEY, XK_space, spawn, {.v = klayout } },
|
||||||
|
{ MODKEY, XK_p, spawn, {.v = dpower } },
|
||||||
|
{ MODKEY, XK_i, spawn, {.v = dinput } },
|
||||||
|
{ MODKEY|ShiftMask, XK_p, spawn, {.v = dpass } },
|
||||||
|
{ 0, XF86XK_MonBrightnessDown, spawn, {.v = brightdown } },
|
||||||
|
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brightup } },
|
||||||
|
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = voldown } },
|
||||||
|
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } },
|
||||||
|
{ 0, XF86XK_AudioMute, spawn, {.v = mute } },
|
||||||
|
{ ShiftMask, XF86XK_AudioLowerVolume, spawn, {.v = micdown } },
|
||||||
|
{ ShiftMask, XF86XK_AudioRaiseVolume, spawn, {.v = micup } },
|
||||||
|
{ ShiftMask, XF86XK_AudioMute, spawn, {.v = micmute } },
|
||||||
|
{ 0, XF86XK_AudioMicMute, spawn, {.v = micmute } },
|
||||||
|
{ 0, XK_Print, spawn, {.v = prtsc } },
|
||||||
|
/* ------------ */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* button definitions */
|
||||||
|
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
||||||
|
static const Button buttons[] = {
|
||||||
|
/* click event mask button function argument */
|
||||||
|
{ 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} },
|
||||||
|
};
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# dwm version
|
# dwm version
|
||||||
VERSION = 6.4
|
VERSION = 6.5
|
||||||
|
|
||||||
# Customize below to fit your system
|
# Customize below to fit your system
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ INCS = -I${X11INC} -I${FREETYPEINC}
|
||||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB}
|
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB}
|
||||||
|
|
||||||
# flags
|
# flags
|
||||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||||
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
||||||
LDFLAGS = ${LIBS}
|
LDFLAGS = ${LIBS}
|
||||||
|
|
1161
dwm-6.5-tavo.diff
Normal file
1161
dwm-6.5-tavo.diff
Normal file
File diff suppressed because it is too large
Load diff
190
dwm.c
190
dwm.c
|
@ -63,17 +63,14 @@
|
||||||
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
||||||
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
||||||
|
|
||||||
#define GAP_TOGGLE 100
|
|
||||||
#define GAP_RESET 0
|
|
||||||
|
|
||||||
/* enums */
|
/* enums */
|
||||||
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
||||||
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
||||||
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
||||||
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
NetWMFullscreen, NetWMSticky, NetActiveWindow, NetWMWindowType,
|
||||||
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
||||||
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
||||||
enum { ClkTagBar, ClkStatusText, ClkClientWin,
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin,
|
||||||
ClkRootWin, ClkLast }; /* clicks */
|
ClkRootWin, ClkLast }; /* clicks */
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
|
@ -122,12 +119,6 @@ typedef struct {
|
||||||
void (*arrange)(Monitor *);
|
void (*arrange)(Monitor *);
|
||||||
} Layout;
|
} Layout;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int isgap;
|
|
||||||
int realgap;
|
|
||||||
int gappx;
|
|
||||||
} Gap;
|
|
||||||
|
|
||||||
typedef struct Pertag Pertag;
|
typedef struct Pertag Pertag;
|
||||||
struct Monitor {
|
struct Monitor {
|
||||||
char ltsymbol[16];
|
char ltsymbol[16];
|
||||||
|
@ -137,7 +128,7 @@ struct Monitor {
|
||||||
int by; /* bar geometry */
|
int by; /* bar geometry */
|
||||||
int mx, my, mw, mh; /* screen size */
|
int mx, my, mw, mh; /* screen size */
|
||||||
int wx, wy, ww, wh; /* window area */
|
int wx, wy, ww, wh; /* window area */
|
||||||
Gap *gap;
|
int gappx; /* gaps between windows */
|
||||||
unsigned int seltags;
|
unsigned int seltags;
|
||||||
unsigned int sellt;
|
unsigned int sellt;
|
||||||
unsigned int tagset[2];
|
unsigned int tagset[2];
|
||||||
|
@ -192,7 +183,6 @@ static void focus(Client *c);
|
||||||
static void focusin(XEvent *e);
|
static void focusin(XEvent *e);
|
||||||
static void focusmon(const Arg *arg);
|
static void focusmon(const Arg *arg);
|
||||||
static void focusstack(const Arg *arg);
|
static void focusstack(const Arg *arg);
|
||||||
static void gap_copy(Gap *to, const Gap *from);
|
|
||||||
static Atom getatomprop(Client *c, Atom prop);
|
static Atom getatomprop(Client *c, Atom prop);
|
||||||
static int getrootptr(int *x, int *y);
|
static int getrootptr(int *x, int *y);
|
||||||
static long getstate(Window w);
|
static long getstate(Window w);
|
||||||
|
@ -224,13 +214,13 @@ static void sendmon(Client *c, Monitor *m);
|
||||||
static void setclientstate(Client *c, long state);
|
static void setclientstate(Client *c, long state);
|
||||||
static void setfocus(Client *c);
|
static void setfocus(Client *c);
|
||||||
static void setfullscreen(Client *c, int fullscreen);
|
static void setfullscreen(Client *c, int fullscreen);
|
||||||
|
static void setsticky(Client *c, int sticky);
|
||||||
static void setgaps(const Arg *arg);
|
static void setgaps(const Arg *arg);
|
||||||
static void setlayout(const Arg *arg);
|
static void setlayout(const Arg *arg);
|
||||||
static void setmfact(const Arg *arg);
|
static void setmfact(const Arg *arg);
|
||||||
static void setup(void);
|
static void setup(void);
|
||||||
static void seturgent(Client *c, int urg);
|
static void seturgent(Client *c, int urg);
|
||||||
static void showhide(Client *c);
|
static void showhide(Client *c);
|
||||||
static void sigchld(int unused);
|
|
||||||
static void spawn(const Arg *arg);
|
static void spawn(const Arg *arg);
|
||||||
static void tag(const Arg *arg);
|
static void tag(const Arg *arg);
|
||||||
static void tagmon(const Arg *arg);
|
static void tagmon(const Arg *arg);
|
||||||
|
@ -542,7 +532,8 @@ buttonpress(XEvent *e)
|
||||||
if (i < LENGTH(tags)) {
|
if (i < LENGTH(tags)) {
|
||||||
click = ClkTagBar;
|
click = ClkTagBar;
|
||||||
arg.ui = 1 << i;
|
arg.ui = 1 << i;
|
||||||
}
|
} else if (ev->x < x + TEXTW(selmon->ltsymbol))
|
||||||
|
click = ClkLtSymbol;
|
||||||
else
|
else
|
||||||
click = ClkStatusText;
|
click = ClkStatusText;
|
||||||
} else if ((c = wintoclient(ev->window))) {
|
} else if ((c = wintoclient(ev->window))) {
|
||||||
|
@ -625,6 +616,10 @@ clientmessage(XEvent *e)
|
||||||
|| cme->data.l[2] == netatom[NetWMFullscreen])
|
|| cme->data.l[2] == netatom[NetWMFullscreen])
|
||||||
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
|
setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */
|
||||||
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
|
|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
|
||||||
|
|
||||||
|
if (cme->data.l[1] == netatom[NetWMSticky]
|
||||||
|
|| cme->data.l[2] == netatom[NetWMSticky])
|
||||||
|
setsticky(c, (cme->data.l[0] == 1 || (cme->data.l[0] == 2 && !c->issticky)));
|
||||||
} else if (cme->message_type == netatom[NetActiveWindow]) {
|
} else if (cme->message_type == netatom[NetActiveWindow]) {
|
||||||
if (c != selmon->sel && !c->isurgent)
|
if (c != selmon->sel && !c->isurgent)
|
||||||
seturgent(c, 1);
|
seturgent(c, 1);
|
||||||
|
@ -742,8 +737,7 @@ createmon(void)
|
||||||
m->nmaster = nmaster;
|
m->nmaster = nmaster;
|
||||||
m->showbar = showbar;
|
m->showbar = showbar;
|
||||||
m->topbar = topbar;
|
m->topbar = topbar;
|
||||||
m->gap = malloc(sizeof(Gap));
|
m->gappx = gappx;
|
||||||
gap_copy(m->gap, &default_gap);
|
|
||||||
m->lt[0] = &layouts[0];
|
m->lt[0] = &layouts[0];
|
||||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
||||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
||||||
|
@ -1068,16 +1062,26 @@ grabkeys(void)
|
||||||
{
|
{
|
||||||
updatenumlockmask();
|
updatenumlockmask();
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j, k;
|
||||||
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
||||||
KeyCode code;
|
int start, end, skip;
|
||||||
|
KeySym *syms;
|
||||||
|
|
||||||
XUngrabKey(dpy, AnyKey, AnyModifier, root);
|
XUngrabKey(dpy, AnyKey, AnyModifier, root);
|
||||||
|
XDisplayKeycodes(dpy, &start, &end);
|
||||||
|
syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
|
||||||
|
if (!syms)
|
||||||
|
return;
|
||||||
|
for (k = start; k <= end; k++)
|
||||||
for (i = 0; i < LENGTH(keys); i++)
|
for (i = 0; i < LENGTH(keys); i++)
|
||||||
if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
|
/* skip modifier codes, we do that ourselves */
|
||||||
|
if (keys[i].keysym == syms[(k - start) * skip])
|
||||||
for (j = 0; j < LENGTH(modifiers); j++)
|
for (j = 0; j < LENGTH(modifiers); j++)
|
||||||
XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
|
XGrabKey(dpy, k,
|
||||||
True, GrabModeAsync, GrabModeAsync);
|
keys[i].mod | modifiers[j],
|
||||||
|
root, True,
|
||||||
|
GrabModeAsync, GrabModeAsync);
|
||||||
|
XFree(syms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1482,10 +1486,10 @@ restack(Monitor *m)
|
||||||
wc.sibling = c->win;
|
wc.sibling = c->win;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && m->lt[m->sellt]->arrange != &monocle)
|
||||||
|
warp(m->sel);
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
||||||
if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2])
|
|
||||||
warp(m->sel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1617,31 +1621,29 @@ setfullscreen(Client *c, int fullscreen)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gap_copy(Gap *to, const Gap *from)
|
setsticky(Client *c, int sticky)
|
||||||
{
|
{
|
||||||
to->isgap = from->isgap;
|
|
||||||
to->realgap = from->realgap;
|
if(sticky && !c->issticky) {
|
||||||
to->gappx = from->gappx;
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
PropModeReplace, (unsigned char *) &netatom[NetWMSticky], 1);
|
||||||
|
c->issticky = 1;
|
||||||
|
} else if(!sticky && c->issticky){
|
||||||
|
XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
|
||||||
|
PropModeReplace, (unsigned char *)0, 0);
|
||||||
|
c->issticky = 0;
|
||||||
|
arrange(c->mon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
setgaps(const Arg *arg)
|
setgaps(const Arg *arg)
|
||||||
{
|
{
|
||||||
Gap *p = selmon->gap;
|
if ((arg->i == 0) || (selmon->gappx + arg->i < 0))
|
||||||
switch(arg->i)
|
selmon->gappx = 0;
|
||||||
{
|
else
|
||||||
case GAP_TOGGLE:
|
selmon->gappx += arg->i;
|
||||||
p->isgap = 1 - p->isgap;
|
|
||||||
break;
|
|
||||||
case GAP_RESET:
|
|
||||||
gap_copy(p, &default_gap);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
p->realgap += arg->i;
|
|
||||||
p->isgap = 1;
|
|
||||||
}
|
|
||||||
p->realgap = MAX(p->realgap, 0);
|
|
||||||
p->gappx = p->realgap * p->isgap;
|
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1680,9 +1682,16 @@ setup(void)
|
||||||
int i;
|
int i;
|
||||||
XSetWindowAttributes wa;
|
XSetWindowAttributes wa;
|
||||||
Atom utf8string;
|
Atom utf8string;
|
||||||
|
struct sigaction sa;
|
||||||
|
|
||||||
/* clean up any zombies immediately */
|
/* do not transform children into zombies when they terminate */
|
||||||
sigchld(0);
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART;
|
||||||
|
sa.sa_handler = SIG_IGN;
|
||||||
|
sigaction(SIGCHLD, &sa, NULL);
|
||||||
|
|
||||||
|
/* clean up any zombies (inherited from .xinitrc etc) immediately */
|
||||||
|
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||||
|
|
||||||
/* init screen */
|
/* init screen */
|
||||||
screen = DefaultScreen(dpy);
|
screen = DefaultScreen(dpy);
|
||||||
|
@ -1707,6 +1716,7 @@ setup(void)
|
||||||
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
|
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
|
||||||
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
|
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
|
||||||
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
|
netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
|
||||||
|
netatom[NetWMSticky] = XInternAtom(dpy, "_NET_WM_STATE_STICKY", False);
|
||||||
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
|
||||||
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
|
||||||
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
|
||||||
|
@ -1775,21 +1785,23 @@ showhide(Client *c)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
sigchld(int unused)
|
|
||||||
{
|
|
||||||
if (signal(SIGCHLD, sigchld) == SIG_ERR)
|
|
||||||
die("can't install SIGCHLD handler:");
|
|
||||||
while (0 < waitpid(-1, NULL, WNOHANG));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
spawn(const Arg *arg)
|
spawn(const Arg *arg)
|
||||||
{
|
{
|
||||||
|
struct sigaction sa;
|
||||||
|
|
||||||
|
if (arg->v == dmenucmd)
|
||||||
|
dmenumon[0] = '0' + selmon->num;
|
||||||
if (fork() == 0) {
|
if (fork() == 0) {
|
||||||
if (dpy)
|
if (dpy)
|
||||||
close(ConnectionNumber(dpy));
|
close(ConnectionNumber(dpy));
|
||||||
setsid();
|
setsid();
|
||||||
|
|
||||||
|
sigemptyset(&sa.sa_mask);
|
||||||
|
sa.sa_flags = 0;
|
||||||
|
sa.sa_handler = SIG_DFL;
|
||||||
|
sigaction(SIGCHLD, &sa, NULL);
|
||||||
|
|
||||||
execvp(((char **)arg->v)[0], (char **)arg->v);
|
execvp(((char **)arg->v)[0], (char **)arg->v);
|
||||||
die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
|
die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
|
||||||
}
|
}
|
||||||
|
@ -1826,18 +1838,18 @@ tile(Monitor *m)
|
||||||
if (n > m->nmaster)
|
if (n > m->nmaster)
|
||||||
mw = m->nmaster ? m->ww * m->mfact : 0;
|
mw = m->nmaster ? m->ww * m->mfact : 0;
|
||||||
else
|
else
|
||||||
mw = m->ww - m->gap->gappx;
|
mw = m->ww - m->gappx;
|
||||||
for (i = 0, my = ty = m->gap->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
if (i < m->nmaster) {
|
if (i < m->nmaster) {
|
||||||
h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gap->gappx;
|
h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx;
|
||||||
resize(c, m->wx + m->gap->gappx, m->wy + my, mw - (2*c->bw) - m->gap->gappx, h - (2*c->bw), 0);
|
resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0);
|
||||||
if (my + HEIGHT(c) + m->gap->gappx < m->wh)
|
if (my + HEIGHT(c) + m->gappx < m->wh)
|
||||||
my += HEIGHT(c) + m->gap->gappx;
|
my += HEIGHT(c) + m->gappx;
|
||||||
} else {
|
} else {
|
||||||
h = (m->wh - ty) / (n - i) - m->gap->gappx;
|
h = (m->wh - ty) / (n - i) - m->gappx;
|
||||||
resize(c, m->wx + mw + m->gap->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gap->gappx, h - (2*c->bw), 0);
|
resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0);
|
||||||
if (ty + HEIGHT(c) + m->gap->gappx < m->wh)
|
if (ty + HEIGHT(c) + m->gappx < m->wh)
|
||||||
ty += HEIGHT(c) + m->gap->gappx;
|
ty += HEIGHT(c) + m->gappx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1869,7 +1881,7 @@ togglesticky(const Arg *arg)
|
||||||
{
|
{
|
||||||
if (!selmon->sel)
|
if (!selmon->sel)
|
||||||
return;
|
return;
|
||||||
selmon->sel->issticky = !selmon->sel->issticky;
|
setsticky(selmon->sel, !selmon->sel->issticky);
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2094,7 +2106,9 @@ updategeom(void)
|
||||||
m->clients = c->next;
|
m->clients = c->next;
|
||||||
detachstack(c);
|
detachstack(c);
|
||||||
c->mon = mons;
|
c->mon = mons;
|
||||||
|
attach(c);
|
||||||
attachbottom(c);
|
attachbottom(c);
|
||||||
|
attachstack(c);
|
||||||
}
|
}
|
||||||
if (m == selmon)
|
if (m == selmon)
|
||||||
selmon = mons;
|
selmon = mons;
|
||||||
|
@ -2205,6 +2219,9 @@ updatewindowtype(Client *c)
|
||||||
|
|
||||||
if (state == netatom[NetWMFullscreen])
|
if (state == netatom[NetWMFullscreen])
|
||||||
setfullscreen(c, 1);
|
setfullscreen(c, 1);
|
||||||
|
if (state == netatom[NetWMSticky]) {
|
||||||
|
setsticky(c, 1);
|
||||||
|
}
|
||||||
if (wtype == netatom[NetWMWindowTypeDialog])
|
if (wtype == netatom[NetWMWindowTypeDialog])
|
||||||
c->isfloating = 1;
|
c->isfloating = 1;
|
||||||
}
|
}
|
||||||
|
@ -2266,6 +2283,28 @@ view(const Arg *arg)
|
||||||
arrange(selmon);
|
arrange(selmon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
warp(const Client *c)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!c) {
|
||||||
|
XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww / 2, selmon->wy + selmon->wh / 2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getrootptr(&x, &y) ||
|
||||||
|
(x > c->x - c->bw &&
|
||||||
|
y > c->y - c->bw &&
|
||||||
|
x < c->x + c->w + c->bw*2 &&
|
||||||
|
y < c->y + c->h + c->bw*2) ||
|
||||||
|
(y > c->mon->by && y < c->mon->by + bh) ||
|
||||||
|
(c->mon->topbar && !y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
winpid(Window w)
|
winpid(Window w)
|
||||||
{
|
{
|
||||||
|
@ -2396,28 +2435,6 @@ swallowingclient(Window w)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
warp(const Client *c)
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
|
|
||||||
if (!c) {
|
|
||||||
XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!getrootptr(&x, &y) ||
|
|
||||||
(x > c->x - c->bw &&
|
|
||||||
y > c->y - c->bw &&
|
|
||||||
x < c->x + c->w + c->bw*2 &&
|
|
||||||
y < c->y + c->h + c->bw*2) ||
|
|
||||||
(y > c->mon->by && y < c->mon->by + bh) ||
|
|
||||||
(c->mon->topbar && !y))
|
|
||||||
return;
|
|
||||||
|
|
||||||
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Client *
|
Client *
|
||||||
wintoclient(Window w)
|
wintoclient(Window w)
|
||||||
{
|
{
|
||||||
|
@ -2521,3 +2538,4 @@ main(int argc, char *argv[])
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff -up dwm/dwm.c dwmmod/dwm.c
|
|
||||||
--- dwm/dwm.c 2020-06-25 00:21:30.383692180 -0300
|
|
||||||
+++ dwmmod/dwm.c 2020-06-25 00:20:35.643692330 -0300
|
|
||||||
@@ -1057,6 +1057,8 @@ manage(Window w, XWindowAttributes *wa)
|
|
||||||
updatewindowtype(c);
|
|
||||||
updatesizehints(c);
|
|
||||||
updatewmhints(c);
|
|
||||||
+ c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2;
|
|
||||||
+ c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2;
|
|
||||||
XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
|
|
||||||
grabbuttons(c, 0);
|
|
||||||
if (!c->isfloating)
|
|
|
@ -1,54 +0,0 @@
|
||||||
diff -up dwm-6.3/dwm.c dwm-6.3-attachbottom/dwm.c
|
|
||||||
--- dwm-6.3/dwm.c 2022-01-07 12:42:18.000000000 +0100
|
|
||||||
+++ dwm-6.3-attachbottom/dwm.c 2022-08-17 22:14:41.813809073 +0200
|
|
||||||
@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int
|
|
||||||
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);
|
|
||||||
@@ -408,6 +409,15 @@ attach(Client *c)
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
+attachbottom(Client *c)
|
|
||||||
+{
|
|
||||||
+ Client **tc;
|
|
||||||
+ c->next = NULL;
|
|
||||||
+ for (tc = &c->mon->clients; *tc; tc = &(*tc)->next);
|
|
||||||
+ *tc = c;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
attachstack(Client *c)
|
|
||||||
{
|
|
||||||
c->snext = c->mon->stack;
|
|
||||||
@@ -1066,7 +1076,7 @@ manage(Window w, XWindowAttributes *wa)
|
|
||||||
c->isfloating = c->oldstate = trans != None || c->isfixed;
|
|
||||||
if (c->isfloating)
|
|
||||||
XRaiseWindow(dpy, c->win);
|
|
||||||
- attach(c);
|
|
||||||
+ attachbottom(c);
|
|
||||||
attachstack(c);
|
|
||||||
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
|
|
||||||
(unsigned char *) &(c->win), 1);
|
|
||||||
@@ -1421,7 +1431,7 @@ sendmon(Client *c, Monitor *m)
|
|
||||||
detachstack(c);
|
|
||||||
c->mon = m;
|
|
||||||
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
|
|
||||||
- attach(c);
|
|
||||||
+ attachbottom(c);
|
|
||||||
attachstack(c);
|
|
||||||
focus(NULL);
|
|
||||||
arrange(NULL);
|
|
||||||
@@ -1903,7 +1913,7 @@ updategeom(void)
|
|
||||||
m->clients = c->next;
|
|
||||||
detachstack(c);
|
|
||||||
c->mon = mons;
|
|
||||||
- attach(c);
|
|
||||||
+ attachbottom(c);
|
|
||||||
attachstack(c);
|
|
||||||
}
|
|
||||||
if (m == selmon)
|
|
|
@ -1,148 +0,0 @@
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index 1c0b587..b172f63 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
|
|
||||||
/* appearance */
|
|
||||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
|
||||||
+static const Gap default_gap = {.isgap = 1, .realgap = 10, .gappx = 10};
|
|
||||||
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 */
|
|
||||||
@@ -84,6 +85,10 @@ static Key keys[] = {
|
|
||||||
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
|
||||||
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
|
||||||
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
|
||||||
+ { MODKEY, XK_minus, setgaps, {.i = -5 } },
|
|
||||||
+ { MODKEY, XK_equal, setgaps, {.i = +5 } },
|
|
||||||
+ { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } },
|
|
||||||
+ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} },
|
|
||||||
TAGKEYS( XK_1, 0)
|
|
||||||
TAGKEYS( XK_2, 1)
|
|
||||||
TAGKEYS( XK_3, 2)
|
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index 664c527..25bc9b7 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -57,6 +57,9 @@
|
|
||||||
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
|
||||||
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
|
||||||
|
|
||||||
+#define GAP_TOGGLE 100
|
|
||||||
+#define GAP_RESET 0
|
|
||||||
+
|
|
||||||
/* enums */
|
|
||||||
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
|
|
||||||
enum { SchemeNorm, SchemeSel }; /* color schemes */
|
|
||||||
@@ -111,6 +114,12 @@ typedef struct {
|
|
||||||
void (*arrange)(Monitor *);
|
|
||||||
} Layout;
|
|
||||||
|
|
||||||
+typedef struct {
|
|
||||||
+ int isgap;
|
|
||||||
+ int realgap;
|
|
||||||
+ int gappx;
|
|
||||||
+} Gap;
|
|
||||||
+
|
|
||||||
struct Monitor {
|
|
||||||
char ltsymbol[16];
|
|
||||||
float mfact;
|
|
||||||
@@ -119,6 +128,7 @@ struct Monitor {
|
|
||||||
int by; /* bar geometry */
|
|
||||||
int mx, my, mw, mh; /* screen size */
|
|
||||||
int wx, wy, ww, wh; /* window area */
|
|
||||||
+ Gap *gap;
|
|
||||||
unsigned int seltags;
|
|
||||||
unsigned int sellt;
|
|
||||||
unsigned int tagset[2];
|
|
||||||
@@ -169,6 +179,7 @@ static void focus(Client *c);
|
|
||||||
static void focusin(XEvent *e);
|
|
||||||
static void focusmon(const Arg *arg);
|
|
||||||
static void focusstack(const Arg *arg);
|
|
||||||
+static void gap_copy(Gap *to, const Gap *from);
|
|
||||||
static Atom getatomprop(Client *c, Atom prop);
|
|
||||||
static int getrootptr(int *x, int *y);
|
|
||||||
static long getstate(Window w);
|
|
||||||
@@ -200,6 +211,7 @@ 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 setgaps(const Arg *arg);
|
|
||||||
static void setlayout(const Arg *arg);
|
|
||||||
static void setmfact(const Arg *arg);
|
|
||||||
static void setup(void);
|
|
||||||
@@ -639,6 +651,8 @@ createmon(void)
|
|
||||||
m->nmaster = nmaster;
|
|
||||||
m->showbar = showbar;
|
|
||||||
m->topbar = topbar;
|
|
||||||
+ m->gap = malloc(sizeof(Gap));
|
|
||||||
+ gap_copy(m->gap, &default_gap);
|
|
||||||
m->lt[0] = &layouts[0];
|
|
||||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
|
||||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
|
||||||
@@ -1498,6 +1512,35 @@ setfullscreen(Client *c, int fullscreen)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+void
|
|
||||||
+gap_copy(Gap *to, const Gap *from)
|
|
||||||
+{
|
|
||||||
+ to->isgap = from->isgap;
|
|
||||||
+ to->realgap = from->realgap;
|
|
||||||
+ to->gappx = from->gappx;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
+setgaps(const Arg *arg)
|
|
||||||
+{
|
|
||||||
+ Gap *p = selmon->gap;
|
|
||||||
+ switch(arg->i)
|
|
||||||
+ {
|
|
||||||
+ case GAP_TOGGLE:
|
|
||||||
+ p->isgap = 1 - p->isgap;
|
|
||||||
+ break;
|
|
||||||
+ case GAP_RESET:
|
|
||||||
+ gap_copy(p, &default_gap);
|
|
||||||
+ break;
|
|
||||||
+ default:
|
|
||||||
+ p->realgap += arg->i;
|
|
||||||
+ p->isgap = 1;
|
|
||||||
+ }
|
|
||||||
+ p->realgap = MAX(p->realgap, 0);
|
|
||||||
+ p->gappx = p->realgap * p->isgap;
|
|
||||||
+ arrange(selmon);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
void
|
|
||||||
setlayout(const Arg *arg)
|
|
||||||
{
|
|
||||||
@@ -1684,18 +1727,18 @@ tile(Monitor *m)
|
|
||||||
if (n > m->nmaster)
|
|
||||||
mw = m->nmaster ? m->ww * m->mfact : 0;
|
|
||||||
else
|
|
||||||
- mw = m->ww;
|
|
||||||
- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
+ mw = m->ww - m->gap->gappx;
|
|
||||||
+ for (i = 0, my = ty = m->gap->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
|
||||||
if (i < m->nmaster) {
|
|
||||||
- h = (m->wh - my) / (MIN(n, m->nmaster) - i);
|
|
||||||
- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
|
|
||||||
- if (my + HEIGHT(c) < m->wh)
|
|
||||||
- my += HEIGHT(c);
|
|
||||||
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gap->gappx;
|
|
||||||
+ resize(c, m->wx + m->gap->gappx, m->wy + my, mw - (2*c->bw) - m->gap->gappx, h - (2*c->bw), 0);
|
|
||||||
+ if (my + HEIGHT(c) + m->gap->gappx < m->wh)
|
|
||||||
+ my += HEIGHT(c) + m->gap->gappx;
|
|
||||||
} else {
|
|
||||||
- h = (m->wh - ty) / (n - i);
|
|
||||||
- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
|
|
||||||
- if (ty + HEIGHT(c) < m->wh)
|
|
||||||
- ty += HEIGHT(c);
|
|
||||||
+ h = (m->wh - ty) / (n - i) - m->gap->gappx;
|
|
||||||
+ resize(c, m->wx + mw + m->gap->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gap->gappx, h - (2*c->bw), 0);
|
|
||||||
+ if (ty + HEIGHT(c) + m->gap->gappx < m->wh)
|
|
||||||
+ ty += HEIGHT(c) + m->gap->gappx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001
|
|
||||||
From: BrunoCooper17 <BrunoCooper17@outlook.com>
|
|
||||||
Date: Mon, 15 Nov 2021 14:04:53 -0600
|
|
||||||
Subject: [PATCH] MoveStack patch
|
|
||||||
|
|
||||||
This plugin allows you to move clients around in the stack and swap them
|
|
||||||
with the master. It emulates the behavior off mod+shift+j and mod+shift+k
|
|
||||||
in Xmonad. movestack(+1) will swap the client with the current focus with
|
|
||||||
the next client. movestack(-1) will swap the client with the current focus
|
|
||||||
with the previous client.
|
|
||||||
---
|
|
||||||
config.def.h | 3 +++
|
|
||||||
movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 51 insertions(+)
|
|
||||||
create mode 100644 movestack.c
|
|
||||||
|
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index a2ac963..33efa5b 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
|
|
||||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
|
||||||
static const char *termcmd[] = { "st", NULL };
|
|
||||||
|
|
||||||
+#include "movestack.c"
|
|
||||||
static Key keys[] = {
|
|
||||||
/* modifier key function argument */
|
|
||||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
|
||||||
@@ -71,6 +72,8 @@ static Key keys[] = {
|
|
||||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
|
||||||
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
|
||||||
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } },
|
|
||||||
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
|
|
||||||
{ MODKEY, XK_Return, zoom, {0} },
|
|
||||||
{ MODKEY, XK_Tab, view, {0} },
|
|
||||||
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
|
||||||
diff --git a/movestack.c b/movestack.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..520f4ae
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/movestack.c
|
|
||||||
@@ -0,0 +1,48 @@
|
|
||||||
+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);
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
\ No newline at end of file
|
|
||||||
--
|
|
||||||
2.33.1
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
From 969dbbc548f16da5d94630e3d54e9c96c5296520 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ryan Kes <alrayyes@gmail.com>
|
|
||||||
Date: Thu, 28 Mar 2019 14:36:07 +0100
|
|
||||||
Subject: [PATCH] dwm-notitle-6.2
|
|
||||||
|
|
||||||
---
|
|
||||||
config.def.h | 1 -
|
|
||||||
dwm.c | 20 ++++----------------
|
|
||||||
2 files changed, 4 insertions(+), 17 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index 1c0b587..19330cd 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -102,7 +102,6 @@ static Button buttons[] = {
|
|
||||||
/* click event mask button function argument */
|
|
||||||
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
|
|
||||||
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
|
|
||||||
- { ClkWinTitle, 0, Button2, zoom, {0} },
|
|
||||||
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
|
|
||||||
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
|
||||||
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index 4465af1..bcf5cb1 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -64,8 +64,8 @@ enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
|
|
||||||
NetWMFullscreen, NetActiveWindow, NetWMWindowType,
|
|
||||||
NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
|
|
||||||
enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
|
|
||||||
-enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
|
||||||
- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
|
|
||||||
+enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkClientWin,
|
|
||||||
+ ClkRootWin, ClkLast }; /* clicks */
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
int i;
|
|
||||||
@@ -439,10 +439,8 @@ buttonpress(XEvent *e)
|
|
||||||
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;
|
|
||||||
+ click = ClkStatusText;
|
|
||||||
} else if ((c = wintoclient(ev->window))) {
|
|
||||||
focus(c);
|
|
||||||
restack(selmon);
|
|
||||||
@@ -729,15 +727,8 @@ drawbar(Monitor *m)
|
|
||||||
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
|
|
||||||
|
|
||||||
if ((w = m->ww - sw - x) > bh) {
|
|
||||||
- if (m->sel) {
|
|
||||||
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
|
||||||
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
|
|
||||||
- if (m->sel->isfloating)
|
|
||||||
- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
|
|
||||||
- } else {
|
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
|
||||||
drw_rect(drw, x, 0, w, bh, 1, 1);
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
|
|
||||||
}
|
|
||||||
@@ -1235,11 +1226,8 @@ propertynotify(XEvent *e)
|
|
||||||
drawbars();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
- if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
|
|
||||||
+ if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName])
|
|
||||||
updatetitle(c);
|
|
||||||
- if (c == c->mon->sel)
|
|
||||||
- drawbar(c->mon);
|
|
||||||
- }
|
|
||||||
if (ev->atom == netatom[NetWMWindowType])
|
|
||||||
updatewindowtype(c);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.21.0
|
|
||||||
|
|
|
@ -1,177 +0,0 @@
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index 664c527..ac8e4ec 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -111,6 +111,7 @@ typedef struct {
|
|
||||||
void (*arrange)(Monitor *);
|
|
||||||
} Layout;
|
|
||||||
|
|
||||||
+typedef struct Pertag Pertag;
|
|
||||||
struct Monitor {
|
|
||||||
char ltsymbol[16];
|
|
||||||
float mfact;
|
|
||||||
@@ -130,6 +131,7 @@ struct Monitor {
|
|
||||||
Monitor *next;
|
|
||||||
Window barwin;
|
|
||||||
const Layout *lt[2];
|
|
||||||
+ Pertag *pertag;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
@@ -272,6 +274,15 @@ static Window root, wmcheckwin;
|
|
||||||
/* configuration, allows nested code to access above variables */
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
+struct Pertag {
|
|
||||||
+ unsigned int curtag, prevtag; /* current and previous tag */
|
|
||||||
+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
|
|
||||||
+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
|
|
||||||
+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
|
|
||||||
+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
|
|
||||||
+ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
/* compile-time check if all tags fit into an unsigned int bit array. */
|
|
||||||
struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
|
|
||||||
|
|
||||||
@@ -632,6 +643,7 @@ Monitor *
|
|
||||||
createmon(void)
|
|
||||||
{
|
|
||||||
Monitor *m;
|
|
||||||
+ unsigned int i;
|
|
||||||
|
|
||||||
m = ecalloc(1, sizeof(Monitor));
|
|
||||||
m->tagset[0] = m->tagset[1] = 1;
|
|
||||||
@@ -642,6 +654,20 @@ createmon(void)
|
|
||||||
m->lt[0] = &layouts[0];
|
|
||||||
m->lt[1] = &layouts[1 % LENGTH(layouts)];
|
|
||||||
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
|
|
||||||
+ m->pertag = ecalloc(1, sizeof(Pertag));
|
|
||||||
+ m->pertag->curtag = m->pertag->prevtag = 1;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i <= LENGTH(tags); i++) {
|
|
||||||
+ m->pertag->nmasters[i] = m->nmaster;
|
|
||||||
+ m->pertag->mfacts[i] = m->mfact;
|
|
||||||
+
|
|
||||||
+ m->pertag->ltidxs[i][0] = m->lt[0];
|
|
||||||
+ m->pertag->ltidxs[i][1] = m->lt[1];
|
|
||||||
+ m->pertag->sellts[i] = m->sellt;
|
|
||||||
+
|
|
||||||
+ m->pertag->showbars[i] = m->showbar;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -967,7 +993,7 @@ grabkeys(void)
|
|
||||||
void
|
|
||||||
incnmaster(const Arg *arg)
|
|
||||||
{
|
|
||||||
- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
|
|
||||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1502,9 +1528,9 @@ void
|
|
||||||
setlayout(const Arg *arg)
|
|
||||||
{
|
|
||||||
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
|
|
||||||
- selmon->sellt ^= 1;
|
|
||||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
|
|
||||||
if (arg && arg->v)
|
|
||||||
- selmon->lt[selmon->sellt] = (Layout *)arg->v;
|
|
||||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
|
|
||||||
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
|
|
||||||
if (selmon->sel)
|
|
||||||
arrange(selmon);
|
|
||||||
@@ -1523,7 +1549,7 @@ setmfact(const Arg *arg)
|
|
||||||
f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
|
|
||||||
if (f < 0.05 || f > 0.95)
|
|
||||||
return;
|
|
||||||
- selmon->mfact = f;
|
|
||||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1702,7 +1728,7 @@ tile(Monitor *m)
|
|
||||||
void
|
|
||||||
togglebar(const Arg *arg)
|
|
||||||
{
|
|
||||||
- selmon->showbar = !selmon->showbar;
|
|
||||||
+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
|
|
||||||
updatebarpos(selmon);
|
|
||||||
XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
|
|
||||||
arrange(selmon);
|
|
||||||
@@ -1741,9 +1767,33 @@ void
|
|
||||||
toggleview(const Arg *arg)
|
|
||||||
{
|
|
||||||
unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
|
|
||||||
+ int i;
|
|
||||||
|
|
||||||
if (newtagset) {
|
|
||||||
selmon->tagset[selmon->seltags] = newtagset;
|
|
||||||
+
|
|
||||||
+ if (newtagset == ~0) {
|
|
||||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
|
||||||
+ selmon->pertag->curtag = 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* test if the user did not select the same tag */
|
|
||||||
+ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
|
|
||||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
|
||||||
+ for (i = 0; !(newtagset & 1 << i); i++) ;
|
|
||||||
+ selmon->pertag->curtag = i + 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* apply settings for this view */
|
|
||||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
|
||||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
|
||||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
|
||||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
|
||||||
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
|
||||||
+
|
|
||||||
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
|
||||||
+ togglebar(NULL);
|
|
||||||
+
|
|
||||||
focus(NULL);
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
@@ -2038,11 +2088,37 @@ updatewmhints(Client *c)
|
|
||||||
void
|
|
||||||
view(const Arg *arg)
|
|
||||||
{
|
|
||||||
+ int i;
|
|
||||||
+ unsigned int tmptag;
|
|
||||||
+
|
|
||||||
if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
|
|
||||||
return;
|
|
||||||
selmon->seltags ^= 1; /* toggle sel tagset */
|
|
||||||
- if (arg->ui & TAGMASK)
|
|
||||||
+ if (arg->ui & TAGMASK) {
|
|
||||||
selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
|
|
||||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
|
||||||
+
|
|
||||||
+ if (arg->ui == ~0)
|
|
||||||
+ selmon->pertag->curtag = 0;
|
|
||||||
+ else {
|
|
||||||
+ for (i = 0; !(arg->ui & 1 << i); i++) ;
|
|
||||||
+ selmon->pertag->curtag = i + 1;
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ tmptag = selmon->pertag->prevtag;
|
|
||||||
+ selmon->pertag->prevtag = selmon->pertag->curtag;
|
|
||||||
+ selmon->pertag->curtag = tmptag;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
|
|
||||||
+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
|
|
||||||
+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
|
|
||||||
+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
|
|
||||||
+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
|
|
||||||
+
|
|
||||||
+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
|
|
||||||
+ togglebar(NULL);
|
|
||||||
+
|
|
||||||
focus(NULL);
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index 7054c06..9b5d5b8 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -76,6 +76,7 @@ static Key keys[] = {
|
|
||||||
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
|
|
||||||
{ MODKEY, XK_space, setlayout, {0} },
|
|
||||||
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
|
||||||
+ { MODKEY, XK_s, togglesticky, {0} },
|
|
||||||
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
|
||||||
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
|
||||||
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index 0362114..0ef5c7f 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -49,7 +49,7 @@
|
|
||||||
#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 ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky)
|
|
||||||
#define LENGTH(X) (sizeof X / sizeof X[0])
|
|
||||||
#define MOUSEMASK (BUTTONMASK|PointerMotionMask)
|
|
||||||
#define WIDTH(X) ((X)->w + 2 * (X)->bw)
|
|
||||||
@@ -92,7 +92,7 @@ struct Client {
|
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
||||||
int bw, oldbw;
|
|
||||||
unsigned int tags;
|
|
||||||
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
|
|
||||||
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky;
|
|
||||||
Client *next;
|
|
||||||
Client *snext;
|
|
||||||
Monitor *mon;
|
|
||||||
@@ -211,6 +211,7 @@ static void tagmon(const Arg *arg);
|
|
||||||
static void tile(Monitor *);
|
|
||||||
static void togglebar(const Arg *arg);
|
|
||||||
static void togglefloating(const Arg *arg);
|
|
||||||
+static void togglesticky(const Arg *arg);
|
|
||||||
static void toggletag(const Arg *arg);
|
|
||||||
static void toggleview(const Arg *arg);
|
|
||||||
static void unfocus(Client *c, int setfocus);
|
|
||||||
@@ -1713,6 +1714,15 @@ togglefloating(const Arg *arg)
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
+togglesticky(const Arg *arg)
|
|
||||||
+{
|
|
||||||
+ if (!selmon->sel)
|
|
||||||
+ return;
|
|
||||||
+ selmon->sel->issticky = !selmon->sel->issticky;
|
|
||||||
+ arrange(selmon);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+void
|
|
||||||
toggletag(const Arg *arg)
|
|
||||||
{
|
|
||||||
unsigned int newtags;
|
|
|
@ -1,412 +0,0 @@
|
||||||
From 0cf9a007511f7dfd7dd94171b172562ebac9b6d5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tom Schwindl <schwindl@posteo.de>
|
|
||||||
Date: Sat, 10 Sep 2022 12:51:09 +0200
|
|
||||||
Subject: [PATCH] 6.3 swallow patch
|
|
||||||
|
|
||||||
---
|
|
||||||
config.def.h | 9 +-
|
|
||||||
config.mk | 3 +-
|
|
||||||
dwm.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++++--
|
|
||||||
3 files changed, 237 insertions(+), 10 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/config.def.h b/config.def.h
|
|
||||||
index 061ad662f82a..0b2b8ffd30d5 100644
|
|
||||||
--- a/config.def.h
|
|
||||||
+++ b/config.def.h
|
|
||||||
@@ -3,6 +3,7 @@
|
|
||||||
/* appearance */
|
|
||||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
|
||||||
static const unsigned int snap = 32; /* snap pixel */
|
|
||||||
+static const int swallowfloating = 0; /* 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[] = { "monospace:size=10" };
|
|
||||||
@@ -26,9 +27,11 @@ static const Rule rules[] = {
|
|
||||||
* WM_CLASS(STRING) = instance, class
|
|
||||||
* WM_NAME(STRING) = title
|
|
||||||
*/
|
|
||||||
- /* class instance title tags mask isfloating monitor */
|
|
||||||
- { "Gimp", NULL, NULL, 0, 1, -1 },
|
|
||||||
- { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
|
|
||||||
+ /* 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", NULL, NULL, 0, 0, 1, 0, -1 },
|
|
||||||
+ { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* layout(s) */
|
|
||||||
diff --git a/config.mk b/config.mk
|
|
||||||
index 81c493ef4aff..52d1ebf30bec 100644
|
|
||||||
--- a/config.mk
|
|
||||||
+++ b/config.mk
|
|
||||||
@@ -20,10 +20,11 @@ FREETYPEINC = /usr/include/freetype2
|
|
||||||
# OpenBSD (uncomment)
|
|
||||||
#FREETYPEINC = ${X11INC}/freetype2
|
|
||||||
#MANPREFIX = ${PREFIX}/man
|
|
||||||
+#KVMLIB = -lkvm
|
|
||||||
|
|
||||||
# includes and libs
|
|
||||||
INCS = -I${X11INC} -I${FREETYPEINC}
|
|
||||||
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
|
|
||||||
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB}
|
|
||||||
|
|
||||||
# flags
|
|
||||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index e5efb6a22806..e68294b6b679 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -40,6 +40,12 @@
|
|
||||||
#include <X11/extensions/Xinerama.h>
|
|
||||||
#endif /* XINERAMA */
|
|
||||||
#include <X11/Xft/Xft.h>
|
|
||||||
+#include <X11/Xlib-xcb.h>
|
|
||||||
+#include <xcb/res.h>
|
|
||||||
+#ifdef __OpenBSD__
|
|
||||||
+#include <sys/sysctl.h>
|
|
||||||
+#include <kvm.h>
|
|
||||||
+#endif /* __OpenBSD */
|
|
||||||
|
|
||||||
#include "drw.h"
|
|
||||||
#include "util.h"
|
|
||||||
@@ -92,9 +98,11 @@ struct Client {
|
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid;
|
|
||||||
int bw, oldbw;
|
|
||||||
unsigned int tags;
|
|
||||||
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
|
|
||||||
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow;
|
|
||||||
+ pid_t pid;
|
|
||||||
Client *next;
|
|
||||||
Client *snext;
|
|
||||||
+ Client *swallowing;
|
|
||||||
Monitor *mon;
|
|
||||||
Window win;
|
|
||||||
};
|
|
||||||
@@ -138,6 +146,8 @@ typedef struct {
|
|
||||||
const char *title;
|
|
||||||
unsigned int tags;
|
|
||||||
int isfloating;
|
|
||||||
+ int isterminal;
|
|
||||||
+ int noswallow;
|
|
||||||
int monitor;
|
|
||||||
} Rule;
|
|
||||||
|
|
||||||
@@ -235,6 +245,12 @@ 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 const char broken[] = "broken";
|
|
||||||
static char stext[256];
|
|
||||||
@@ -269,6 +285,8 @@ 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"
|
|
||||||
|
|
||||||
@@ -298,6 +316,8 @@ applyrules(Client *c)
|
|
||||||
&& (!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;
|
|
||||||
for (m = mons; m && m->num != r->monitor; m = m->next);
|
|
||||||
@@ -416,6 +436,53 @@ attachstack(Client *c)
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
@@ -656,6 +723,9 @@ destroynotify(XEvent *e)
|
|
||||||
|
|
||||||
if ((c = wintoclient(ev->window)))
|
|
||||||
unmanage(c, 1);
|
|
||||||
+
|
|
||||||
+ else if ((c = swallowingclient(ev->window)))
|
|
||||||
+ unmanage(c->swallowing, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
@@ -1022,12 +1092,13 @@ killclient(const Arg *arg)
|
|
||||||
void
|
|
||||||
manage(Window w, XWindowAttributes *wa)
|
|
||||||
{
|
|
||||||
- Client *c, *t = NULL;
|
|
||||||
+ 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;
|
|
||||||
@@ -1042,6 +1113,7 @@ manage(Window w, XWindowAttributes *wa)
|
|
||||||
} else {
|
|
||||||
c->mon = selmon;
|
|
||||||
applyrules(c);
|
|
||||||
+ term = termforwin(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww)
|
|
||||||
@@ -1076,6 +1148,8 @@ manage(Window w, XWindowAttributes *wa)
|
|
||||||
c->mon->sel = c;
|
|
||||||
arrange(c->mon);
|
|
||||||
XMapWindow(dpy, c->win);
|
|
||||||
+ if (term)
|
|
||||||
+ swallow(term, c);
|
|
||||||
focus(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1763,6 +1837,20 @@ 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) {
|
|
||||||
@@ -1778,9 +1866,12 @@ unmanage(Client *c, int destroyed)
|
|
||||||
XUngrabServer(dpy);
|
|
||||||
}
|
|
||||||
free(c);
|
|
||||||
- focus(NULL);
|
|
||||||
- updateclientlist();
|
|
||||||
- arrange(m);
|
|
||||||
+
|
|
||||||
+ if (!s) {
|
|
||||||
+ arrange(m);
|
|
||||||
+ focus(NULL);
|
|
||||||
+ updateclientlist();
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
@@ -2044,6 +2135,136 @@ view(const Arg *arg)
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
@@ -2133,10 +2354,12 @@ main(int argc, char *argv[])
|
|
||||||
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", NULL) == -1)
|
|
||||||
+ if (pledge("stdio rpath proc exec ps", NULL) == -1)
|
|
||||||
die("pledge");
|
|
||||||
#endif /* __OpenBSD__ */
|
|
||||||
scan();
|
|
||||||
--
|
|
||||||
2.37.2
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
diff --git a/dwm.c b/dwm.c
|
|
||||||
index 4465af1..bf74f60 100644
|
|
||||||
--- a/dwm.c
|
|
||||||
+++ b/dwm.c
|
|
||||||
@@ -227,6 +227,7 @@ static void updatetitle(Client *c);
|
|
||||||
static void updatewindowtype(Client *c);
|
|
||||||
static void updatewmhints(Client *c);
|
|
||||||
static void view(const Arg *arg);
|
|
||||||
+static void warp(const Client *c);
|
|
||||||
static Client *wintoclient(Window w);
|
|
||||||
static Monitor *wintomon(Window w);
|
|
||||||
static int xerror(Display *dpy, XErrorEvent *ee);
|
|
||||||
@@ -827,6 +828,7 @@ focusmon(const Arg *arg)
|
|
||||||
unfocus(selmon->sel, 0);
|
|
||||||
selmon = m;
|
|
||||||
focus(NULL);
|
|
||||||
+ warp(selmon->sel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
@@ -1367,6 +1369,8 @@ restack(Monitor *m)
|
|
||||||
}
|
|
||||||
XSync(dpy, False);
|
|
||||||
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
|
||||||
+ if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2])
|
|
||||||
+ warp(m->sel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
@@ -2044,6 +2048,28 @@ view(const Arg *arg)
|
|
||||||
arrange(selmon);
|
|
||||||
}
|
|
||||||
|
|
||||||
+void
|
|
||||||
+warp(const Client *c)
|
|
||||||
+{
|
|
||||||
+ int x, y;
|
|
||||||
+
|
|
||||||
+ if (!c) {
|
|
||||||
+ XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!getrootptr(&x, &y) ||
|
|
||||||
+ (x > c->x - c->bw &&
|
|
||||||
+ y > c->y - c->bw &&
|
|
||||||
+ x < c->x + c->w + c->bw*2 &&
|
|
||||||
+ y < c->y + c->h + c->bw*2) ||
|
|
||||||
+ (y > c->mon->by && y < c->mon->by + bh) ||
|
|
||||||
+ (c->mon->topbar && !y))
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
Client *
|
|
||||||
wintoclient(Window w)
|
|
||||||
{
|
|
|
@ -1,10 +0,0 @@
|
||||||
--- config.def.h
|
|
||||||
+++ config.def.h
|
|
||||||
@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
|
|
||||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
|
||||||
static const char *termcmd[] = { "st", NULL };
|
|
||||||
|
|
||||||
+#include "movestack.c"
|
|
||||||
static Key keys[] = {
|
|
||||||
/* modifier key function argument */
|
|
||||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
|
|
@ -1,10 +0,0 @@
|
||||||
--- config.def.h
|
|
||||||
+++ config.def.h
|
|
||||||
@@ -76,6 +76,7 @@ static Key keys[] = {
|
|
||||||
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
|
|
||||||
{ MODKEY, XK_space, setlayout, {0} },
|
|
||||||
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
|
||||||
+ { MODKEY, XK_s, togglesticky, {0} },
|
|
||||||
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
|
||||||
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
|
||||||
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
|
|
@ -1,15 +0,0 @@
|
||||||
--- dwm.c
|
|
||||||
+++ dwm.c
|
|
||||||
@@ -114,6 +117,12 @@ typedef struct {
|
|
||||||
void (*arrange)(Monitor *);
|
|
||||||
} Layout;
|
|
||||||
|
|
||||||
+typedef struct {
|
|
||||||
+ int isgap;
|
|
||||||
+ int realgap;
|
|
||||||
+ int gappx;
|
|
||||||
+} Gap;
|
|
||||||
+
|
|
||||||
struct Monitor {
|
|
||||||
char ltsymbol[16];
|
|
||||||
float mfact;
|
|
|
@ -1,30 +0,0 @@
|
||||||
--- dwm.c
|
|
||||||
+++ dwm.c
|
|
||||||
@@ -439,10 +439,8 @@ buttonpress(XEvent *e)
|
|
||||||
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;
|
|
||||||
+ click = ClkStatusText;
|
|
||||||
} else if ((c = wintoclient(ev->window))) {
|
|
||||||
focus(c);
|
|
||||||
restack(selmon);
|
|
||||||
@@ -729,15 +727,8 @@ drawbar(Monitor *m)
|
|
||||||
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
|
|
||||||
|
|
||||||
if ((w = m->ww - sw - x) > bh) {
|
|
||||||
- if (m->sel) {
|
|
||||||
- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
|
|
||||||
- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
|
|
||||||
- if (m->sel->isfloating)
|
|
||||||
- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
|
|
||||||
- } else {
|
|
||||||
drw_setscheme(drw, scheme[SchemeNorm]);
|
|
||||||
drw_rect(drw, x, 0, w, bh, 1, 1);
|
|
||||||
- }
|
|
||||||
}
|
|
||||||
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
--- dwm.c 2022-01-07 12:42:18.000000000 +0100
|
|
||||||
+++ dwm.c 2022-08-17 22:14:41.813809073 +0200
|
|
||||||
@@ -1913,7 +1923,7 @@ updategeom(void)
|
|
||||||
m->clients = c->next;
|
|
||||||
detachstack(c);
|
|
||||||
c->mon = mons;
|
|
||||||
- attach(c);
|
|
||||||
+ attachbottom(c);
|
|
||||||
attachstack(c);
|
|
||||||
}
|
|
||||||
if (m == selmon)
|
|
|
@ -1,11 +0,0 @@
|
||||||
--- dwm.c
|
|
||||||
+++ dwm.c
|
|
||||||
@@ -92,7 +92,7 @@ struct Client {
|
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
||||||
int bw, oldbw;
|
|
||||||
unsigned int tags;
|
|
||||||
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
|
|
||||||
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky;
|
|
||||||
Client *next;
|
|
||||||
Client *snext;
|
|
||||||
Monitor *mon;
|
|
Loading…
Reference in a new issue