From ae6a9b20ce19ff7bb595b012b1604fd0a7f0e157 Mon Sep 17 00:00:00 2001 From: Marco Peereboom Date: Tue, 27 Jan 2009 19:56:47 +0000 Subject: [PATCH] Add cycle through regions; aka move pointer. Fix bug where windows from another ws remained mapped after restart. Fix focus bug where sometimes the pointer was NULL. --- scrotwm.1 | 8 ++++++-- scrotwm.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/scrotwm.1 b/scrotwm.1 index 2d17462..72d86bc 100644 --- a/scrotwm.1 +++ b/scrotwm.1 @@ -95,10 +95,14 @@ Destroy current window in workspace. Switch to workspace [Number]. .It Ic M-S-[Number] Move current window to workspace [Number]. -.It Ic M-[RighArrow] +.It Ic M-[Right] Switch to next workspace with a window in it. -.It Ic M-[LeftArrow] +.It Ic M-[Left] Switch to previous workspace with a window in it. +.It Ic M-S-[Right] +Move pointer to next region. +.It Ic M-S-[Left] +Move pointer to previous region. .It Ic M-s Take screenshot of entire screen (if enabled). .It Ic M-S-s diff --git a/scrotwm.c b/scrotwm.c index b44e116..029548f 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -302,6 +302,8 @@ union arg { #define SWM_ARG_ID_STACKINIT (11) #define SWM_ARG_ID_CYCLEWS_UP (12) #define SWM_ARG_ID_CYCLEWS_DOWN (13) +#define SWM_ARG_ID_CYCLESC_UP (14) +#define SWM_ARG_ID_CYCLESC_DOWN (15) #define SWM_ARG_ID_SS_ALL (0) #define SWM_ARG_ID_SS_WINDOW (1) char **argv; @@ -723,6 +725,18 @@ quit(struct swm_region *r, union arg *args) } void +unmap_all(void) +{ + struct ws_win *win; + int i, j; + + for (i = 0; i < ScreenCount(display); i++) + for (j = 0; j < SWM_WS_MAX; j++) + TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) + XUnmapWindow(display, win->id); +} + +void restart(struct swm_region *r, union arg *args) { DNPRINTF(SWM_D_MISC, "restart: %s\n", start_argv[0]); @@ -734,6 +748,7 @@ restart(struct swm_region *r, union arg *args) bar_extra_stop(); bar_extra = 1; + unmap_all(); XCloseDisplay(display); execvp(start_argv[0], start_argv); fprintf(stderr, "execvp failed\n"); @@ -905,7 +920,6 @@ switchws(struct swm_region *r, union arg *args) TAILQ_FOREACH(win, &old_ws->winlist, entry) XUnmapWindow(display, win->id); - old_ws->r = NULL; old_ws->restack = 1; } else { @@ -934,7 +948,6 @@ cyclews(struct swm_region *r, union arg *args) r->s->idx, WIDTH(r), HEIGHT(r), X(r), Y(r), r->ws->idx); a.id = r->ws->idx; - do { switch (args->id) { case SWM_ARG_ID_CYCLEWS_UP: @@ -963,6 +976,33 @@ cyclews(struct swm_region *r, union arg *args) } void +cyclescr(struct swm_region *r, union arg *args) +{ + struct swm_region *rr; + int i; + + i = r->s->idx; + switch (args->id) { + case SWM_ARG_ID_CYCLESC_UP: + rr = TAILQ_NEXT(r, entry); + if (rr == NULL) + rr = TAILQ_FIRST(&screens[i].rl); + break; + case SWM_ARG_ID_CYCLESC_DOWN: + rr = TAILQ_PREV(r, swm_region_list, entry); + if (rr == NULL) + rr = TAILQ_LAST(&screens[i].rl, swm_region_list); + break; + default: + return; + }; + unfocus_all(); + XSetInputFocus(display, PointerRoot, RevertToPointerRoot, CurrentTime); + XWarpPointer(display, None, rr->s[i].root, 0, 0, 0, 0, rr->g.x, + rr->g.y + bar_enabled ? bar_height : 0); +} + +void swapwin(struct swm_region *r, union arg *args) { struct ws_win *target; @@ -1047,7 +1087,7 @@ focus(struct swm_region *r, union arg *args) return; } - if (winfocus == winlostfocus) + if (winfocus == winlostfocus || winfocus == NULL) return; XMapRaised(display, winfocus->id); @@ -1527,6 +1567,8 @@ struct key { { MODKEY, XK_0, switchws, {.id = 9} }, { MODKEY, XK_Right, cyclews, {.id = SWM_ARG_ID_CYCLEWS_UP} }, { MODKEY, XK_Left, cyclews, {.id = SWM_ARG_ID_CYCLEWS_DOWN} }, + { MODKEY | ShiftMask, XK_Right, cyclescr, {.id = SWM_ARG_ID_CYCLESC_UP} }, + { MODKEY | ShiftMask, XK_Left, cyclescr, {.id = SWM_ARG_ID_CYCLESC_DOWN} }, { MODKEY | ShiftMask, XK_1, send_to_ws, {.id = 0} }, { MODKEY | ShiftMask, XK_2, send_to_ws, {.id = 1} }, { MODKEY | ShiftMask, XK_3, send_to_ws, {.id = 2} }, -- 1.7.10.4