dwm-warp-6.2.diff (1402B)
1 diff --git a/dwm.c b/dwm.c 2 index 4465af1..bf74f60 100644 3 --- a/dwm.c 4 +++ b/dwm.c 5 @@ -227,6 +227,7 @@ static void updatetitle(Client *c); 6 static void updatewindowtype(Client *c); 7 static void updatewmhints(Client *c); 8 static void view(const Arg *arg); 9 +static void warp(const Client *c); 10 static Client *wintoclient(Window w); 11 static Monitor *wintomon(Window w); 12 static int xerror(Display *dpy, XErrorEvent *ee); 13 @@ -827,6 +828,7 @@ focusmon(const Arg *arg) 14 unfocus(selmon->sel, 0); 15 selmon = m; 16 focus(NULL); 17 + warp(selmon->sel); 18 } 19 20 void 21 @@ -1367,6 +1369,8 @@ restack(Monitor *m) 22 } 23 XSync(dpy, False); 24 while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); 25 + if (m == selmon && (m->tagset[m->seltags] & m->sel->tags) && selmon->lt[selmon->sellt] != &layouts[2]) 26 + warp(m->sel); 27 } 28 29 void 30 @@ -2044,6 +2048,28 @@ view(const Arg *arg) 31 arrange(selmon); 32 } 33 34 +void 35 +warp(const Client *c) 36 +{ 37 + int x, y; 38 + 39 + if (!c) { 40 + XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->wx + selmon->ww/2, selmon->wy + selmon->wh/2); 41 + return; 42 + } 43 + 44 + if (!getrootptr(&x, &y) || 45 + (x > c->x - c->bw && 46 + y > c->y - c->bw && 47 + x < c->x + c->w + c->bw*2 && 48 + y < c->y + c->h + c->bw*2) || 49 + (y > c->mon->by && y < c->mon->by + bh) || 50 + (c->mon->topbar && !y)) 51 + return; 52 + 53 + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w / 2, c->h / 2); 54 +} 55 + 56 Client * 57 wintoclient(Window w) 58 {