Skip to content

Commit 4274139

Browse files
committedNov 27, 2024
warp
1 parent 5db8226 commit 4274139

File tree

3 files changed

+123
-89
lines changed

3 files changed

+123
-89
lines changed
 

‎README

+1
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,4 @@ cfacts
6060
push
6161
dragfact (bakkeby)
6262
tiledmove
63+
warp

‎config.def.h

+90-85
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ static const Layout layouts[] = {
6969
{ MODKEY|ControlMask|Mod1Mask, KEY, toggletag, {.ui = 1 << TAG} }, \
7070
{ MODKEY|ControlMask|ShiftMask, KEY, spawn, { .v = (const char*[]){ "display-toggle", (const char[]){ TAG + '0', '\0' }, NULL } } },
7171

72+
#define MAP(MOD, KEY_PAIR, FUNC, ARG) \
73+
{ MOD, KEY_PAIR[0], FUNC, ARG }, \
74+
{ MOD, KEY_PAIR[1], FUNC, ARG }
75+
76+
static const KeySym left[] = { XK_Left, XK_h };
77+
static const KeySym right[] = { XK_Right, XK_l };
78+
static const KeySym down[] = { XK_Down, XK_j };
79+
static const KeySym up[] = { XK_Up, XK_k };
80+
7281
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
7382
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
7483

@@ -82,91 +91,87 @@ static const char *termcmd[] = { TERMINAL, NULL };
8291
#include <X11/XF86keysym.h>
8392

8493
static Key keys[] = {
85-
/* modifier key function argument */
86-
{ MODKEY, XK_d, spawn, {.v = dmenucmd } },
87-
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
88-
{ MODKEY, XK_f, spawn, SHCMD("_START_LFCD=1 " TERMINAL) },
89-
{ MODKEY, XK_n, spawn, SHCMD("$BROWSER") },
90-
{ MODKEY|ControlMask, XK_n, spawn, SHCMD("$BROWSER --incognito") },
91-
{ MODKEY|ShiftMask, XK_n, spawn, SHCMD("$BROWSER --tor") },
92-
{ MODKEY|Mod1Mask, XK_n, spawn, SHCMD("bookmarks") },
93-
{ MODKEY, XK_m, spawn, SHCMD("code") },
94-
{ MODKEY, XK_comma, spawn, SHCMD("alacritty --class git -e lazygit") },
95-
{ MODKEY, XK_period, spawn, SHCMD("insomnia") },
96-
{ MODKEY, XK_slash, spawn, SHCMD("roku") },
97-
{ MODKEY, XK_F8, spawn, SHCMD("comms") },
98-
{ MODKEY|ShiftMask, XK_F8, spawn, SHCMD("comms -q") },
99-
{ MODKEY, XK_F12, spawn, SHCMD("dmenucalc") },
100-
{ MODKEY, XK_b, togglebar, {0} },
101-
{ MODKEY, XK_space, zoom, {0} },
102-
{ MODKEY, XK_Tab, focusmon, {.i = +1 } },
103-
{ MODKEY, XK_j, focusstack, {.i = +1 } },
104-
{ MODKEY, XK_k, focusstack, {.i = -1 } },
105-
{ MODKEY|Mod1Mask, XK_j, tagmon, {.i = +1 } },
106-
{ MODKEY|Mod1Mask, XK_k, tagmon, {.i = -1 } },
107-
{ MODKEY|ControlMask, XK_j, focusmon, {.i = +1 } },
108-
{ MODKEY|ControlMask, XK_k, focusmon, {.i = -1 } },
109-
{ MODKEY, XK_h, pushup, {0} },
110-
{ MODKEY, XK_l, pushdown, {0} },
111-
{ MODKEY, XK_Left, focusstack, {.i = -1 } },
112-
{ MODKEY, XK_Right, focusstack, {.i = +1 } },
113-
{ MODKEY, XK_Up, pushup, {0} },
114-
{ MODKEY, XK_Down, pushdown, {0} },
115-
{ MODKEY|Mod1Mask, XK_Tab, tagmon, {.i = -1 } },
116-
{ MODKEY|Mod1Mask, XK_Page_Up, incnmaster, {.i = +1 } },
117-
{ MODKEY|Mod1Mask, XK_Page_Down, incnmaster, {.i = -1 } },
118-
{ MODKEY|ControlMask, XK_End, setcfact, {.f = 0.00} },
119-
{ MODKEY|ControlMask, XK_Up, setcfact, {.f = +0.25} },
120-
{ MODKEY|ControlMask, XK_Down, setcfact, {.f = -0.25} },
121-
{ MODKEY|ControlMask, XK_Left, setmfact, {.f = -0.03} },
122-
{ MODKEY|ControlMask, XK_Right, setmfact, {.f = +0.03} },
123-
{ MODKEY, XK_z, killclient, {0} },
124-
{ MODKEY|Mod1Mask, XK_t, setlayout, {.v = &layouts[0]} },
125-
{ MODKEY|Mod1Mask, XK_f, setlayout, {.v = &layouts[1]} },
126-
{ MODKEY|Mod1Mask, XK_m, setlayout, {.v = &layouts[2]} },
127-
{ MODKEY|Mod1Mask, XK_u, setlayout, {.v = &layouts[3]} },
128-
{ MODKEY|Mod1Mask, XK_space, togglefloating, {0} },
129-
{ MODKEY, XK_0, view, {.ui = ~0 } },
130-
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
131-
{ MODKEY|ControlMask, XK_p, spawn, SHCMD("display-switch") },
132-
{ MODKEY|ShiftMask, XK_p, spawn, SHCMD("display-select") },
133-
{ 0, XK_Print, spawn, SHCMD("maimpick -a") },
134-
{ ShiftMask, XK_Print, spawn, SHCMD("maimpick") },
135-
{ MODKEY, XK_equal, spawn, SHCMD("pamixer --allow-boost -i 5; kill -39 $(pidof dwmblocks)") },
136-
{ MODKEY, XK_minus, spawn, SHCMD("pamixer --allow-boost -d 5; kill -39 $(pidof dwmblocks)") },
137-
{ MODKEY, XK_F9, spawn, SHCMD("dmenumount") },
138-
{ MODKEY, XK_F10, spawn, SHCMD("dmenuumount") },
139-
{ MODKEY|ShiftMask, XK_l, spawn, SHCMD("slock || kill -9 -1") },
140-
{ MODKEY, XK_Pause, spawn, SHCMD("dunstctl set-paused toggle") },
141-
{ ShiftMask, XK_Pause, spawn, SHCMD("dunstctl history-pop") },
142-
{ ControlMask, XK_Pause, spawn, SHCMD("dunst-config") },
143-
{ MODKEY|ShiftMask, XK_q, spawn, SHCMD("sysact") },
144-
TAGKEYS( XK_1, 0)
145-
TAGKEYS( XK_2, 1)
146-
TAGKEYS( XK_3, 2)
147-
TAGKEYS( XK_4, 3)
148-
TAGKEYS( XK_5, 4)
149-
TAGKEYS( XK_6, 5)
150-
TAGKEYS( XK_7, 6)
151-
TAGKEYS( XK_8, 7)
152-
TAGKEYS( XK_9, 8)
153-
TAGKEYS( XK_q, 0)
154-
TAGKEYS( XK_w, 1)
155-
TAGKEYS( XK_e, 2)
156-
TAGKEYS( XK_r, 3)
157-
TAGKEYS( XK_t, 4)
158-
TAGKEYS( XK_y, 5)
159-
TAGKEYS( XK_u, 6)
160-
TAGKEYS( XK_i, 7)
161-
TAGKEYS( XK_o, 8)
162-
{ 0, XF86XK_AudioPlay, spawn, SHCMD("media-control Play") },
163-
{ 0, XF86XK_AudioPause, spawn, SHCMD("media-control Pause") },
164-
{ 0, XF86XK_AudioStop, spawn, SHCMD("media-control Pause") },
165-
{ 0, XF86XK_AudioNext, spawn, SHCMD("media-control Next") },
166-
{ 0, XF86XK_AudioPrev, spawn, SHCMD("media-control Previous") },
167-
{ 0, XF86XK_AudioMute, spawn, SHCMD("BLOCK_BUTTON=3 volume") },
168-
{ 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("BLOCK_BUTTON=4 volume") },
169-
{ 0, XF86XK_AudioLowerVolume, spawn, SHCMD("BLOCK_BUTTON=5 volume") },
94+
/* modifier key function argument */
95+
{ MODKEY, XK_d, spawn, {.v = dmenucmd } },
96+
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
97+
{ MODKEY, XK_f, spawn, SHCMD("_START_LFCD=1 " TERMINAL) },
98+
{ MODKEY, XK_n, spawn, SHCMD("$BROWSER") },
99+
{ MODKEY|ControlMask, XK_n, spawn, SHCMD("$BROWSER --incognito") },
100+
{ MODKEY|ShiftMask, XK_n, spawn, SHCMD("$BROWSER --tor") },
101+
{ MODKEY|Mod1Mask, XK_n, spawn, SHCMD("bookmarks") },
102+
{ MODKEY, XK_m, spawn, SHCMD("code") },
103+
{ MODKEY, XK_comma, spawn, SHCMD("alacritty --class git -e lazygit") },
104+
{ MODKEY, XK_period, spawn, SHCMD("insomnia") },
105+
{ MODKEY, XK_slash, spawn, SHCMD("roku") },
106+
{ MODKEY, XK_F8, spawn, SHCMD("comms") },
107+
{ MODKEY|ShiftMask, XK_F8, spawn, SHCMD("comms -q") },
108+
{ MODKEY, XK_F12, spawn, SHCMD("dmenucalc") },
109+
MAP(MODKEY, left, focusstack, {.i = -1 }),
110+
MAP(MODKEY, right, focusstack, {.i = +1 }),
111+
MAP(MODKEY, up, pushup, {0}),
112+
MAP(MODKEY, down, pushdown, {0}),
113+
MAP(MODKEY|Mod1Mask, left, focusmon, {.i = +1 }),
114+
MAP(MODKEY|Mod1Mask, right, focusmon, {.i = -1 }),
115+
MAP(MODKEY|Mod1Mask, up, tagmon, {.i = -1 }),
116+
MAP(MODKEY|Mod1Mask, down, tagmon, {.i = +1 }),
117+
MAP(MODKEY|ControlMask, left, setmfact, {.f = -0.03}),
118+
MAP(MODKEY|ControlMask, right, setmfact, {.f = +0.03}),
119+
MAP(MODKEY|ControlMask, up, setcfact, {.f = +0.25}),
120+
MAP(MODKEY|ControlMask, down, setcfact, {.f = -0.25}),
121+
{ MODKEY, XK_b, togglebar, {0} },
122+
{ MODKEY, XK_space, zoom, {0} },
123+
{ MODKEY, XK_Tab, focusmon, {.i = +1 } },
124+
{ MODKEY|Mod1Mask, XK_Tab, tagmon, {.i = -1 } },
125+
{ MODKEY|Mod1Mask, XK_Page_Up, incnmaster, {.i = +1 } },
126+
{ MODKEY|Mod1Mask, XK_Page_Down, incnmaster, {.i = -1 } },
127+
{ MODKEY|ControlMask, XK_End, setcfact, {.f = 0.00} },
128+
{ MODKEY, XK_z, killclient, {0} },
129+
{ MODKEY|Mod1Mask, XK_t, setlayout, {.v = &layouts[0]} },
130+
{ MODKEY|Mod1Mask, XK_f, setlayout, {.v = &layouts[1]} },
131+
{ MODKEY|Mod1Mask, XK_m, setlayout, {.v = &layouts[2]} },
132+
{ MODKEY|Mod1Mask, XK_u, setlayout, {.v = &layouts[3]} },
133+
{ MODKEY|Mod1Mask, XK_space, togglefloating, {0} },
134+
{ MODKEY, XK_0, view, {.ui = ~0 } },
135+
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
136+
{ MODKEY|ControlMask, XK_p, spawn, SHCMD("display-switch") },
137+
{ MODKEY|ShiftMask, XK_p, spawn, SHCMD("display-select") },
138+
{ 0, XK_Print, spawn, SHCMD("maimpick -a") },
139+
{ ShiftMask, XK_Print, spawn, SHCMD("maimpick") },
140+
{ MODKEY, XK_equal, spawn, SHCMD("pamixer --allow-boost -i 5; kill -39 $(pidof dwmblocks)") },
141+
{ MODKEY, XK_minus, spawn, SHCMD("pamixer --allow-boost -d 5; kill -39 $(pidof dwmblocks)") },
142+
{ MODKEY, XK_F9, spawn, SHCMD("dmenumount") },
143+
{ MODKEY, XK_F10, spawn, SHCMD("dmenuumount") },
144+
{ MODKEY|ShiftMask, XK_l, spawn, SHCMD("slock || kill -9 -1") },
145+
{ MODKEY, XK_Pause, spawn, SHCMD("dunstctl set-paused toggle") },
146+
{ ShiftMask, XK_Pause, spawn, SHCMD("dunstctl history-pop") },
147+
{ ControlMask, XK_Pause, spawn, SHCMD("dunst-config") },
148+
{ MODKEY|ShiftMask, XK_q, spawn, SHCMD("sysact") },
149+
TAGKEYS( XK_1, 0)
150+
TAGKEYS( XK_2, 1)
151+
TAGKEYS( XK_3, 2)
152+
TAGKEYS( XK_4, 3)
153+
TAGKEYS( XK_5, 4)
154+
TAGKEYS( XK_6, 5)
155+
TAGKEYS( XK_7, 6)
156+
TAGKEYS( XK_8, 7)
157+
TAGKEYS( XK_9, 8)
158+
TAGKEYS( XK_q, 0)
159+
TAGKEYS( XK_w, 1)
160+
TAGKEYS( XK_e, 2)
161+
TAGKEYS( XK_r, 3)
162+
TAGKEYS( XK_t, 4)
163+
TAGKEYS( XK_y, 5)
164+
TAGKEYS( XK_u, 6)
165+
TAGKEYS( XK_i, 7)
166+
TAGKEYS( XK_o, 8)
167+
{ 0, XF86XK_AudioPlay, spawn, SHCMD("media-control Play") },
168+
{ 0, XF86XK_AudioPause, spawn, SHCMD("media-control Pause") },
169+
{ 0, XF86XK_AudioStop, spawn, SHCMD("media-control Pause") },
170+
{ 0, XF86XK_AudioNext, spawn, SHCMD("media-control Next") },
171+
{ 0, XF86XK_AudioPrev, spawn, SHCMD("media-control Previous") },
172+
{ 0, XF86XK_AudioMute, spawn, SHCMD("BLOCK_BUTTON=3 volume") },
173+
{ 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("BLOCK_BUTTON=4 volume") },
174+
{ 0, XF86XK_AudioLowerVolume, spawn, SHCMD("BLOCK_BUTTON=5 volume") },
170175
};
171176

172177
/* button definitions */

‎dwm.c

+32-4
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ static void updatetitle(Client *c);
273273
static void updatewindowtype(Client *c);
274274
static void updatewmhints(Client *c);
275275
static void view(const Arg *arg);
276+
static void warp(const Client *c);
276277
static Client *wintoclient(Window w);
277278
static Monitor *wintomon(Window w);
278279
static Client *wintosystrayicon(Window w);
@@ -1072,6 +1073,7 @@ focusmon(const Arg *arg)
10721073
unfocus(selmon->sel, 0);
10731074
selmon = m;
10741075
focus(NULL);
1076+
warp(selmon->sel);
10751077
}
10761078

10771079
void
@@ -1516,7 +1518,7 @@ movemouse(const Arg *arg)
15161518

15171519
if (cc) {
15181520
Client *cl1, *cl2, ocl1;
1519-
1521+
15201522
if (!selmon->lt[selmon->sellt]->arrange) return;
15211523

15221524
cl1 = c;
@@ -1528,19 +1530,19 @@ movemouse(const Arg *arg)
15281530
cl1->y = cl2->y;
15291531
cl1->w = cl2->w;
15301532
cl1->h = cl2->h;
1531-
1533+
15321534
cl2->win = ocl1.win;
15331535
strcpy(cl2->name, ocl1.name);
15341536
cl2->x = ocl1.x;
15351537
cl2->y = ocl1.y;
15361538
cl2->w = ocl1.w;
15371539
cl2->h = ocl1.h;
1538-
1540+
15391541
selmon->sel = cl2;
15401542

15411543
c = cc;
15421544
focus(c);
1543-
1545+
15441546
arrange(cl1->mon);
15451547
}
15461548
}
@@ -1844,6 +1846,8 @@ restack(Monitor *m)
18441846
wc.sibling = c->win;
18451847
}
18461848
}
1849+
if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && m->lt[m->sellt]->arrange != &monocle)
1850+
warp(m->sel);
18471851
XSync(dpy, False);
18481852
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
18491853
}
@@ -2195,6 +2199,7 @@ tag(const Arg *arg)
21952199
focus(NULL);
21962200
arrange(selmon);
21972201
}
2202+
view(arg);
21982203
}
21992204

22002205
void
@@ -2203,6 +2208,7 @@ tagmon(const Arg *arg)
22032208
if (!selmon->sel || !mons->next)
22042209
return;
22052210
sendmon(selmon->sel, dirtomon(arg->i));
2211+
focusmon(arg);
22062212
}
22072213

22082214
void
@@ -2799,6 +2805,28 @@ view(const Arg *arg)
27992805
arrange(selmon);
28002806
}
28012807

2808+
void
2809+
warp(const Client *c)
2810+
{
2811+
int x, y;
2812+
2813+
if (!c) {
2814+
XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww / 2, selmon->wy + selmon->wh / 2);
2815+
return;
2816+
}
2817+
2818+
if (!getrootptr(&x, &y) ||
2819+
(x > c->x - c->bw &&
2820+
y > c->y - c->bw &&
2821+
x < c->x + c->w + c->bw*2 &&
2822+
y < c->y + c->h + c->bw*2) ||
2823+
(y > c->mon->by && y < c->mon->by + bh) ||
2824+
(c->mon->topbar && !y))
2825+
return;
2826+
2827+
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2);
2828+
}
2829+
28022830
Client *
28032831
wintoclient(Window w)
28042832
{

0 commit comments

Comments
 (0)
Please sign in to comment.