]> code.delx.au - spectrwm/commitdiff
Add focus region bindings 'rg_<n>'
authorReginald Kennedy <rk@rejii.com>
Wed, 29 Aug 2012 13:45:30 +0000 (21:45 +0800)
committerReginald Kennedy <rk@rejii.com>
Wed, 24 Oct 2012 14:10:53 +0000 (22:10 +0800)
Default is M-Keypad_<1-9>

Add move window to region bindings 'mvrg_<n>'
Default is M-S-Keypad_<1-9>

Add invisible input window to each region for handling region focus.

On unfocused regions, set the bar border color to color_unfocus.

Add function to handle MotionNotify events on region input windows.

Fix default focus on (re)start.

Fix region-related function and macro naming.
Names referred to 'screen' instead of 'region'

Rename screen_* bindings to rg_*.
screen_* is now an alias for rg_*; old config files will still work.

Fix screen/region wording in manpage.

Sort setkeybinding calls in setup_keys.

Cleanup redundant calls when setting up the bar.

spectrwm.1
spectrwm.c
spectrwm_cz.conf
spectrwm_es.conf
spectrwm_fr.conf
spectrwm_fr_ch.conf
spectrwm_se.conf
spectrwm_us.conf

index f27d83731cd43fdef76e395db4d6af966e9071e8..66ca98daa656caf2be3cf544484e18a47013609c 100644 (file)
@@ -94,13 +94,14 @@ such as battery life.
 .It Ic bar_at_bottom
 Place the statusbar at the bottom of each region instead of the top.
 .It Ic bar_border Ns Bq Ar x
 .It Ic bar_at_bottom
 Place the statusbar at the bottom of each region instead of the top.
 .It Ic bar_border Ns Bq Ar x
-Color of the status bar border in screen
+Border color of the status bar(s) in screen
 .Ar x .
 .It Ic bar_border_width
 Set status bar border thickness in pixels.
 Disable border by setting to 0.
 .It Ic bar_color Ns Bq Ar x
 .Ar x .
 .It Ic bar_border_width
 Set status bar border thickness in pixels.
 Disable border by setting to 0.
 .It Ic bar_color Ns Bq Ar x
-Color of the status bar window in screen
+Background color of the status bar(s) in screen
+.Ar x .
 .It Ic bar_enabled
 Set default
 .Ar bar_toggle
 .It Ic bar_enabled
 Set default
 .Ar bar_toggle
@@ -219,7 +220,7 @@ This ratio is the screen size to what they will be resized.
 For example, 0.6 is 60% of the physical screen size.
 .It Ic disable_border
 Remove border when bar is disabled and there is only one window on the
 For example, 0.6 is 60% of the physical screen size.
 .It Ic disable_border
 Remove border when bar is disabled and there is only one window on the
-screen.
+region.
 .It Ic focus_close
 Window to put focus when the focused window is closed.
 Possible values are
 .It Ic focus_close
 Window to put focus when the focused window is closed.
 Possible values are
@@ -314,8 +315,8 @@ same space on the screen.
 Defined in the format screen[<idx>]:WIDTHxHEIGHT+X+Y,
 e.g.\& screen[1]:800x1200+0+0.
 .Pp
 Defined in the format screen[<idx>]:WIDTHxHEIGHT+X+Y,
 e.g.\& screen[1]:800x1200+0+0.
 .Pp
-To make a screen span multiple monitors, create a region big enough to cover
-them all, e.g. screen[1]:2048x768+0+0 makes the screen span two monitors with
+To make a region span multiple monitors, create a region big enough to cover
+them all, e.g. screen[1]:2048x768+0+0 makes the region span two monitors with
 1024x768 resolution sitting one next to the other.
 .It Ic spawn_position
 Position in stack to place newly spawned windows.
 1024x768 resolution sitting one next to the other.
 .It Ic spawn_position
 Position in stack to place newly spawned windows.
@@ -372,7 +373,7 @@ Enable or disable displaying the window name in the status bar.
 Enable by setting to 1.
 .Pp
 To prevent excessively large window names from pushing the remaining text off
 Enable by setting to 1.
 .Pp
 To prevent excessively large window names from pushing the remaining text off
-the screen, it's limited to 64 characters, by default.
+the bar, it's limited to 64 characters, by default.
 See the
 .Ic bar_format
 option for more details.
 See the
 .Ic bar_format
 option for more details.
@@ -522,6 +523,10 @@ wind_kill
 .Pf ws_ Aq Ar 1-22
 .It Cm M-S- Ns Aq Ar 1-9,0,F1-F12
 .Pf mvws_ Ns Aq Ar 1-22
 .Pf ws_ Aq Ar 1-22
 .It Cm M-S- Ns Aq Ar 1-9,0,F1-F12
 .Pf mvws_ Ns Aq Ar 1-22
+.It Cm M- Ns Aq Ar Keypad 1-9
+.Pf rg_ Aq Ar 1-9
+.It Cm M-S- Ns Aq Ar Keypad 1-9
+.Pf mvrg_ Aq Ar 1-9
 .It Cm M- Ns Aq Cm Right
 ws_next
 .It Cm M- Ns Aq Cm Left
 .It Cm M- Ns Aq Cm Right
 ws_next
 .It Cm M- Ns Aq Cm Left
@@ -533,9 +538,9 @@ ws_prev_all
 .It Cm M-a
 ws_prior
 .It Cm M-S- Ns Aq Cm Right
 .It Cm M-a
 ws_prior
 .It Cm M-S- Ns Aq Cm Right
-screen_next
+rg_next
 .It Cm M-S- Ns Aq Cm Left
 .It Cm M-S- Ns Aq Cm Left
-screen_prev
+rg_prev
 .It Cm M-s
 screenshot_all
 .It Cm M-S-s
 .It Cm M-s
 screenshot_all
 .It Cm M-S-s
@@ -649,6 +654,18 @@ Move current window to workspace
 where
 .Ar n
 is 1 through workspace_limit.
 where
 .Ar n
 is 1 through workspace_limit.
+.It Cm rg_ Ns Ar n
+Focus on region
+.Ar n ,
+where
+.Ar n
+is 1 through 9.
+.It Cm mvrg_ Ns Ar n
+Move current window to region
+.Ar n ,
+where
+.Ar n
+is 1 through 9.
 .It Cm ws_next
 Switch to next workspace with a window in it.
 .It Cm ws_prev
 .It Cm ws_next
 Switch to next workspace with a window in it.
 .It Cm ws_prev
@@ -659,10 +676,10 @@ Switch to next workspace.
 Switch to previous workspace.
 .It Cm ws_prior
 Switch to last visited workspace.
 Switch to previous workspace.
 .It Cm ws_prior
 Switch to last visited workspace.
-.It Cm screen_next
-Move pointer to next region.
-.It Cm screen_prev
-Move pointer to previous region.
+.It Cm rg_next
+Switch to next region.
+.It Cm rg_prev
+Switch to previous region.
 .It Cm screenshot_all
 Take screenshot of entire screen (if enabled)
 (see
 .It Cm screenshot_all
 Take screenshot of entire screen (if enabled)
 (see
@@ -831,7 +848,7 @@ Allow window to position itself, uncentered.
 .It XTERM_FONTADJ
 Adjust xterm fonts when resizing.
 .It FULLSCREEN
 .It XTERM_FONTADJ
 Adjust xterm fonts when resizing.
 .It FULLSCREEN
-Remove border to allow window to use full screen size.
+Remove border to allow window to use full region size.
 .It FOCUSPREV
 On exit force focus on previously focused application not previous
 application in the stack.
 .It FOCUSPREV
 On exit force focus on previously focused application not previous
 application in the stack.
index ee4839763515c6686e34b2c647dbfcf69de781c8..91b575564213eae02583e4d6e476b6020fba320c 100644 (file)
@@ -251,10 +251,11 @@ u_int32_t         swm_debug = 0
 #define SWM_FOCUS_MANUAL       (2)
 
 #define SWM_CK_NONE            0
 #define SWM_FOCUS_MANUAL       (2)
 
 #define SWM_CK_NONE            0
-#define SWM_CK_ALL             0x7
+#define SWM_CK_ALL             0xf
 #define SWM_CK_FOCUS           0x1
 #define SWM_CK_POINTER         0x2
 #define SWM_CK_FALLBACK                0x4
 #define SWM_CK_FOCUS           0x1
 #define SWM_CK_POINTER         0x2
 #define SWM_CK_FALLBACK                0x4
+#define SWM_CK_REGION          0x8
 
 #define SWM_CONF_DEFAULT       (0)
 #define SWM_CONF_KEYMAPPING    (1)
 
 #define SWM_CONF_DEFAULT       (0)
 #define SWM_CONF_KEYMAPPING    (1)
@@ -405,6 +406,7 @@ struct swm_bar {
 /* virtual "screens" */
 struct swm_region {
        TAILQ_ENTRY(swm_region) entry;
 /* virtual "screens" */
 struct swm_region {
        TAILQ_ENTRY(swm_region) entry;
+       xcb_window_t            id;
        struct swm_geometry     g;
        struct workspace        *ws;    /* current workspace on this region */
        struct workspace        *ws_prior; /* prior workspace on this region */
        struct swm_geometry     g;
        struct workspace        *ws;    /* current workspace on this region */
        struct workspace        *ws_prior; /* prior workspace on this region */
@@ -535,6 +537,7 @@ struct swm_screen {
        struct swm_region_list  orl;    /* list of old regions */
        xcb_window_t            root;
        struct workspace        ws[SWM_WS_MAX];
        struct swm_region_list  orl;    /* list of old regions */
        xcb_window_t            root;
        struct workspace        ws[SWM_WS_MAX];
+       struct swm_region       *r_focus;
 
        /* colors */
        struct {
 
        /* colors */
        struct {
@@ -566,8 +569,8 @@ union arg {
 #define SWM_ARG_ID_STACKINIT   (31)
 #define SWM_ARG_ID_CYCLEWS_UP  (40)
 #define SWM_ARG_ID_CYCLEWS_DOWN        (41)
 #define SWM_ARG_ID_STACKINIT   (31)
 #define SWM_ARG_ID_CYCLEWS_UP  (40)
 #define SWM_ARG_ID_CYCLEWS_DOWN        (41)
-#define SWM_ARG_ID_CYCLESC_UP  (42)
-#define SWM_ARG_ID_CYCLESC_DOWN        (43)
+#define SWM_ARG_ID_CYCLERG_UP  (42)
+#define SWM_ARG_ID_CYCLERG_DOWN        (43)
 #define SWM_ARG_ID_CYCLEWS_UP_ALL      (44)
 #define SWM_ARG_ID_CYCLEWS_DOWN_ALL    (45)
 #define SWM_ARG_ID_STACKINC    (50)
 #define SWM_ARG_ID_CYCLEWS_UP_ALL      (44)
 #define SWM_ARG_ID_CYCLEWS_DOWN_ALL    (45)
 #define SWM_ARG_ID_STACKINC    (50)
@@ -732,6 +735,15 @@ enum keyfuncid {
        KF_MOVE_LEFT,
        KF_MOVE_RIGHT,
        KF_MOVE_UP,
        KF_MOVE_LEFT,
        KF_MOVE_RIGHT,
        KF_MOVE_UP,
+       KF_MVRG_1,
+       KF_MVRG_2,
+       KF_MVRG_3,
+       KF_MVRG_4,
+       KF_MVRG_5,
+       KF_MVRG_6,
+       KF_MVRG_7,
+       KF_MVRG_8,
+       KF_MVRG_9,
        KF_MVWS_1,
        KF_MVWS_2,
        KF_MVWS_3,
        KF_MVWS_1,
        KF_MVWS_2,
        KF_MVWS_3,
@@ -758,6 +770,17 @@ enum keyfuncid {
        KF_QUIT,
        KF_RAISE_TOGGLE,
        KF_RESTART,
        KF_QUIT,
        KF_RAISE_TOGGLE,
        KF_RESTART,
+       KF_RG_1,
+       KF_RG_2,
+       KF_RG_3,
+       KF_RG_4,
+       KF_RG_5,
+       KF_RG_6,
+       KF_RG_7,
+       KF_RG_8,
+       KF_RG_9,
+       KF_RG_NEXT,
+       KF_RG_PREV,
        KF_SCREEN_NEXT,
        KF_SCREEN_PREV,
        KF_SEARCH_WIN,
        KF_SCREEN_NEXT,
        KF_SCREEN_PREV,
        KF_SEARCH_WIN,
@@ -853,7 +876,7 @@ int  count_win(struct workspace *, int);
 void    cursors_cleanup(void);
 void    cursors_load(void);
 void    custom_region(char *);
 void    cursors_cleanup(void);
 void    cursors_load(void);
 void    custom_region(char *);
-void    cyclescr(struct swm_region *, union arg *);
+void    cyclerg(struct swm_region *, union arg *);
 void    cyclews(struct swm_region *, union arg *);
 void    cycle_layout(struct swm_region *, union arg *);
 void    destroynotify(xcb_destroy_notify_event_t *);
 void    cyclews(struct swm_region *, union arg *);
 void    cycle_layout(struct swm_region *, union arg *);
 void    destroynotify(xcb_destroy_notify_event_t *);
@@ -882,6 +905,8 @@ void         focusin(xcb_focus_in_event_t *);
 void    focusout(xcb_focus_out_event_t *);
 #endif
 void    focus_flush(void);
 void    focusout(xcb_focus_out_event_t *);
 #endif
 void    focus_flush(void);
+void    focus_region(struct swm_region *);
+void    focusrg(struct swm_region *, union arg *);
 void    focus_win(struct ws_win *);
 void    fontset_init(void);
 void    free_window(struct ws_win *);
 void    focus_win(struct ws_win *);
 void    fontset_init(void);
 void    free_window(struct ws_win *);
@@ -928,6 +953,7 @@ void         map_window(struct ws_win *);
 void    mapnotify(xcb_map_notify_event_t *);
 void    mappingnotify(xcb_mapping_notify_event_t *);
 void    maprequest(xcb_map_request_event_t *);
 void    mapnotify(xcb_map_notify_event_t *);
 void    mappingnotify(xcb_mapping_notify_event_t *);
 void    maprequest(xcb_map_request_event_t *);
+void    motionnotify(xcb_motion_notify_event_t *);
 void    move(struct ws_win *, union arg *);
 void    move_step(struct swm_region *, union arg *);
 uint32_t name_to_pixel(const char *);
 void    move(struct ws_win *, union arg *);
 void    move_step(struct swm_region *, union arg *);
 uint32_t name_to_pixel(const char *);
@@ -962,7 +988,9 @@ void         search_resp_uniconify(const char *, unsigned long);
 void    search_win(struct swm_region *, union arg *);
 void    search_win_cleanup(void);
 void    search_workspace(struct swm_region *, union arg *);
 void    search_win(struct swm_region *, union arg *);
 void    search_win_cleanup(void);
 void    search_workspace(struct swm_region *, union arg *);
+void    send_to_rg(struct swm_region *, union arg *);
 void    send_to_ws(struct swm_region *, union arg *);
 void    send_to_ws(struct swm_region *, union arg *);
+void    set_region(struct swm_region *);
 int     setautorun(char *, char *, int);
 int     setconfbinding(char *, char *, int);
 int     setconfcolor(char *, char *, int);
 int     setautorun(char *, char *, int);
 int     setconfbinding(char *, char *, int);
 int     setconfcolor(char *, char *, int);
@@ -2302,10 +2330,6 @@ bar_toggle(struct swm_region *r, union arg *args)
 void
 bar_extra_setup(void)
 {
 void
 bar_extra_setup(void)
 {
-       struct swm_region       *r;
-       uint32_t                wa[2];
-       int                     i, num_screens;
-
        /* do this here because the conf file is in memory */
        if (bar_extra && !bar_extra_running && bar_argv[0]) {
                /* launch external status app */
        /* do this here because the conf file is in memory */
        if (bar_extra && !bar_extra_running && bar_argv[0]) {
                /* launch external status app */
@@ -2341,20 +2365,6 @@ bar_extra_setup(void)
 
                atexit(kill_bar_extra_atexit);
        }
 
                atexit(kill_bar_extra_atexit);
        }
-
-       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
-       for (i = 0; i < num_screens; i++)
-               TAILQ_FOREACH(r, &screens[i].rl, entry) {
-                       if (r->bar == NULL)
-                               continue;
-                       wa[0] = screens[i].c[SWM_S_COLOR_BAR].pixel;
-                       wa[1] = screens[i].c[SWM_S_COLOR_BAR_BORDER].pixel;
-                       xcb_change_window_attributes(conn, r->bar->id,
-                           XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
-               }
-
-       bar_draw();
-       xcb_flush(conn);
 }
 
 void
 }
 
 void
@@ -2501,9 +2511,10 @@ bar_setup(struct swm_region *r)
        WIDTH(r->bar) = WIDTH(r) - 2 * bar_border_width;
        HEIGHT(r->bar) = bar_height - 2 * bar_border_width;
 
        WIDTH(r->bar) = WIDTH(r) - 2 * bar_border_width;
        HEIGHT(r->bar) = bar_height - 2 * bar_border_width;
 
+       /* Assume region is unfocused when we create the bar. */
        r->bar->id = xcb_generate_id(conn);
        wa[0] = r->s->c[SWM_S_COLOR_BAR].pixel;
        r->bar->id = xcb_generate_id(conn);
        wa[0] = r->s->c[SWM_S_COLOR_BAR].pixel;
-       wa[1] = r->s->c[SWM_S_COLOR_BAR_BORDER].pixel;
+       wa[1] = r->s->c[SWM_S_COLOR_UNFOCUS].pixel;
        wa[2] = XCB_EVENT_MASK_EXPOSURE;
 
        xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->bar->id, r->s->root,
        wa[2] = XCB_EVENT_MASK_EXPOSURE;
 
        xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->bar->id, r->s->root,
@@ -2882,7 +2893,10 @@ root_to_region(xcb_window_t root, int check)
                if (screens[i].root == root)
                        break;
 
                if (screens[i].root == root)
                        break;
 
-       if (check & SWM_CK_FOCUS) {
+       if (check & SWM_CK_REGION)
+               r = screens[i].r_focus;
+
+       if (r == NULL && check & SWM_CK_FOCUS) {
                /* Try to find an actively focused window */
                gifr = xcb_get_input_focus_reply(conn,
                    xcb_get_input_focus(conn), NULL);
                /* Try to find an actively focused window */
                gifr = xcb_get_input_focus_reply(conn,
                    xcb_get_input_focus(conn), NULL);
@@ -3240,9 +3254,10 @@ focus_win(struct ws_win *win)
                        TAILQ_FOREACH(w, &ws->winlist, entry)
                                if (w->transient == win->id && !w->iconic)
                                        map_window(w);
                        TAILQ_FOREACH(w, &ws->winlist, entry)
                                if (w->transient == win->id && !w->iconic)
                                        map_window(w);
-
                }
 
                }
 
+               set_region(ws->r);
+
                xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
                    ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
                    &win->id);
                xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
                    ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
                    &win->id);
@@ -3303,6 +3318,66 @@ event_drain(uint8_t rt)
        }
 }
 
        }
 }
 
+void
+set_region(struct swm_region *r)
+{
+       struct swm_region       *rf;
+
+       if (r == NULL)
+               return;
+
+       /* Skip if only one region on this screen. */
+       rf = TAILQ_FIRST(&r->s->rl);
+       if (TAILQ_NEXT(rf, entry) == NULL)
+               goto out;
+
+       rf = r->s->r_focus;
+       /* Unfocus old region bar. */
+       if (rf) {
+               if (rf == r)
+                       return;
+
+               xcb_change_window_attributes(conn, rf->bar->id,
+                   XCB_CW_BORDER_PIXEL,
+                   &r->s->c[SWM_S_COLOR_UNFOCUS].pixel);
+       }
+
+       /* Set region bar border to focus_color. */
+       xcb_change_window_attributes(conn, r->bar->id,
+           XCB_CW_BORDER_PIXEL, &r->s->c[SWM_S_COLOR_BAR_BORDER].pixel);
+
+out:
+       r->s->r_focus = r;
+}
+
+void
+focus_region(struct swm_region *r)
+{
+       struct ws_win           *nfw;
+       struct swm_region       *old_r;
+
+       if (r == NULL)
+               return;
+
+       old_r = r->s->r_focus;
+       set_region(r);
+
+       nfw = get_region_focus(r);
+       if (nfw) {
+               focus_win(nfw);
+       } else {
+               /* New region is empty; need to manually unfocus win. */
+               if (old_r)
+                       unfocus_win(old_r->ws->focus);
+
+               xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT, r->s->root,
+                   XCB_CURRENT_TIME);
+
+               /* Clear bar since empty. */
+               bar_draw();
+       }
+}
+
 void
 switchws(struct swm_region *r, union arg *args)
 {
 void
 switchws(struct swm_region *r, union arg *args)
 {
@@ -3441,9 +3516,32 @@ priorws(struct swm_region *r, union arg *args)
 }
 
 void
 }
 
 void
-cyclescr(struct swm_region *r, union arg *args)
+focusrg(struct swm_region *r, union arg *args)
+{
+       int                     ridx = args->id, i, num_screens;
+       struct swm_region       *rr = NULL;
+
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       /* do nothing if we don't have more than one screen */
+       if (!(num_screens > 1 || outputs > 1))
+               return;
+
+       DNPRINTF(SWM_D_FOCUS, "focusrg: id: %d\n", ridx);
+
+       rr = TAILQ_FIRST(&r->s->rl);
+       for (i = 0; i < ridx; ++i)
+               rr = TAILQ_NEXT(rr, entry);
+
+       if (rr == NULL)
+               return;
+
+       focus_region(rr);
+       focus_flush();
+}
+
+void
+cyclerg(struct swm_region *r, union arg *args)
 {
 {
-       struct ws_win           *nfw;
        struct swm_region       *rr = NULL;
        int                     i, num_screens;
 
        struct swm_region       *rr = NULL;
        int                     i, num_screens;
 
@@ -3454,12 +3552,12 @@ cyclescr(struct swm_region *r, union arg *args)
 
        i = r->s->idx;
        switch (args->id) {
 
        i = r->s->idx;
        switch (args->id) {
-       case SWM_ARG_ID_CYCLESC_UP:
+       case SWM_ARG_ID_CYCLERG_UP:
                rr = TAILQ_NEXT(r, entry);
                if (rr == NULL)
                        rr = TAILQ_FIRST(&screens[i].rl);
                break;
                rr = TAILQ_NEXT(r, entry);
                if (rr == NULL)
                        rr = TAILQ_FIRST(&screens[i].rl);
                break;
-       case SWM_ARG_ID_CYCLESC_DOWN:
+       case SWM_ARG_ID_CYCLERG_DOWN:
                rr = TAILQ_PREV(r, swm_region_list, entry);
                if (rr == NULL)
                        rr = TAILQ_LAST(&screens[i].rl, swm_region_list);
                rr = TAILQ_PREV(r, swm_region_list, entry);
                if (rr == NULL)
                        rr = TAILQ_LAST(&screens[i].rl, swm_region_list);
@@ -3470,19 +3568,7 @@ cyclescr(struct swm_region *r, union arg *args)
        if (rr == NULL)
                return;
 
        if (rr == NULL)
                return;
 
-       nfw = get_region_focus(rr);
-       if (nfw) {
-               focus_win(nfw);
-       } else {
-               /* New region is empty; unfocus old region and warp pointer. */
-               unfocus_win(r->ws->focus);
-               xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT,
-                               rr->s[i].root, XCB_CURRENT_TIME);
-
-               /* Clear bar since empty. */
-               bar_draw();
-       }
-
+       focus_region(rr);
        focus_flush();
 }
 
        focus_flush();
 }
 
@@ -4427,6 +4513,32 @@ max_stack(struct workspace *ws, struct swm_geometry *g)
                }
 }
 
                }
 }
 
+void
+send_to_rg(struct swm_region *r, union arg *args)
+{
+       int                     ridx = args->id, i, num_screens;
+       struct swm_region       *rr = NULL;
+       union arg               a;
+
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       /* do nothing if we don't have more than one screen */
+       if (!(num_screens > 1 || outputs > 1))
+               return;
+
+       DNPRINTF(SWM_D_FOCUS, "send_to_rg: id: %d\n", ridx);
+
+       rr = TAILQ_FIRST(&r->s->rl);
+       for (i = 0; i < ridx; ++i)
+               rr = TAILQ_NEXT(rr, entry);
+
+       if (rr == NULL)
+               return;
+
+       a.id = rr->ws->idx;
+
+       send_to_ws(r, &a);
+}
+
 void
 send_to_ws(struct swm_region *r, union arg *args)
 {
 void
 send_to_ws(struct swm_region *r, union arg *args)
 {
@@ -5497,6 +5609,15 @@ struct keyfunc {
        { "move_left",          move_step,      {.id = SWM_ARG_ID_MOVELEFT} },
        { "move_right",         move_step,      {.id = SWM_ARG_ID_MOVERIGHT} },
        { "move_up",            move_step,      {.id = SWM_ARG_ID_MOVEUP} },
        { "move_left",          move_step,      {.id = SWM_ARG_ID_MOVELEFT} },
        { "move_right",         move_step,      {.id = SWM_ARG_ID_MOVERIGHT} },
        { "move_up",            move_step,      {.id = SWM_ARG_ID_MOVEUP} },
+       { "mvrg_1",             send_to_rg,     {.id = 0} },
+       { "mvrg_2",             send_to_rg,     {.id = 1} },
+       { "mvrg_3",             send_to_rg,     {.id = 2} },
+       { "mvrg_4",             send_to_rg,     {.id = 3} },
+       { "mvrg_5",             send_to_rg,     {.id = 4} },
+       { "mvrg_6",             send_to_rg,     {.id = 5} },
+       { "mvrg_7",             send_to_rg,     {.id = 6} },
+       { "mvrg_8",             send_to_rg,     {.id = 7} },
+       { "mvrg_9",             send_to_rg,     {.id = 8} },
        { "mvws_1",             send_to_ws,     {.id = 0} },
        { "mvws_2",             send_to_ws,     {.id = 1} },
        { "mvws_3",             send_to_ws,     {.id = 2} },
        { "mvws_1",             send_to_ws,     {.id = 0} },
        { "mvws_2",             send_to_ws,     {.id = 1} },
        { "mvws_3",             send_to_ws,     {.id = 2} },
@@ -5523,8 +5644,19 @@ struct keyfunc {
        { "quit",               quit,           {0} },
        { "raise_toggle",       raise_toggle,   {0} },
        { "restart",            restart,        {0} },
        { "quit",               quit,           {0} },
        { "raise_toggle",       raise_toggle,   {0} },
        { "restart",            restart,        {0} },
-       { "screen_next",        cyclescr,       {.id = SWM_ARG_ID_CYCLESC_UP} },
-       { "screen_prev",        cyclescr,       {.id = SWM_ARG_ID_CYCLESC_DOWN} },
+       { "rg_1",               focusrg,        {.id = 0} },
+       { "rg_2",               focusrg,        {.id = 1} },
+       { "rg_3",               focusrg,        {.id = 2} },
+       { "rg_4",               focusrg,        {.id = 3} },
+       { "rg_5",               focusrg,        {.id = 4} },
+       { "rg_6",               focusrg,        {.id = 5} },
+       { "rg_7",               focusrg,        {.id = 6} },
+       { "rg_8",               focusrg,        {.id = 7} },
+       { "rg_9",               focusrg,        {.id = 8} },
+       { "rg_next",            cyclerg,        {.id = SWM_ARG_ID_CYCLERG_UP} },
+       { "rg_prev",            cyclerg,        {.id = SWM_ARG_ID_CYCLERG_DOWN} },
+       { "screen_next",        cyclerg,        {.id = SWM_ARG_ID_CYCLERG_UP} },
+       { "screen_prev",        cyclerg,        {.id = SWM_ARG_ID_CYCLERG_DOWN} },
        { "search_win",         search_win,     {0} },
        { "search_workspace",   search_workspace,       {0} },
        { "spawn_custom",       NULL,           {0} },
        { "search_win",         search_win,     {0} },
        { "search_workspace",   search_workspace,       {0} },
        { "spawn_custom",       NULL,           {0} },
@@ -6106,25 +6238,94 @@ void
 setup_keys(void)
 {
 #define MODKEY_SHIFT   MODKEY | XCB_MOD_MASK_SHIFT
 setup_keys(void)
 {
 #define MODKEY_SHIFT   MODKEY | XCB_MOD_MASK_SHIFT
+       setkeybinding(MODKEY,           XK_b,           KF_BAR_TOGGLE,  NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_b,           KF_BAR_TOGGLE_WS,NULL);
+       setkeybinding(MODKEY,           XK_v,           KF_BUTTON2,     NULL);
        setkeybinding(MODKEY,           XK_space,       KF_CYCLE_LAYOUT,NULL);
        setkeybinding(MODKEY_SHIFT,     XK_backslash,   KF_FLIP_LAYOUT, NULL);
        setkeybinding(MODKEY,           XK_space,       KF_CYCLE_LAYOUT,NULL);
        setkeybinding(MODKEY_SHIFT,     XK_backslash,   KF_FLIP_LAYOUT, NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_space,       KF_STACK_RESET, NULL);
+       setkeybinding(MODKEY,           XK_t,           KF_FLOAT_TOGGLE,NULL);
+       setkeybinding(MODKEY,           XK_m,           KF_FOCUS_MAIN,  NULL);
+       setkeybinding(MODKEY,           XK_j,           KF_FOCUS_NEXT,  NULL);
+       setkeybinding(MODKEY,           XK_Tab,         KF_FOCUS_NEXT,  NULL);
+       setkeybinding(MODKEY,           XK_k,           KF_FOCUS_PREV,  NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_Tab,         KF_FOCUS_PREV,  NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_equal,       KF_HEIGHT_GROW,NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_minus,       KF_HEIGHT_SHRINK,NULL);
+       setkeybinding(MODKEY,           XK_w,           KF_ICONIFY,     NULL);
        setkeybinding(MODKEY,           XK_h,           KF_MASTER_SHRINK, NULL);
        setkeybinding(MODKEY,           XK_l,           KF_MASTER_GROW, NULL);
        setkeybinding(MODKEY,           XK_comma,       KF_MASTER_ADD,  NULL);
        setkeybinding(MODKEY,           XK_period,      KF_MASTER_DEL,  NULL);
        setkeybinding(MODKEY,           XK_h,           KF_MASTER_SHRINK, NULL);
        setkeybinding(MODKEY,           XK_l,           KF_MASTER_GROW, NULL);
        setkeybinding(MODKEY,           XK_comma,       KF_MASTER_ADD,  NULL);
        setkeybinding(MODKEY,           XK_period,      KF_MASTER_DEL,  NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_bracketright,KF_MOVE_DOWN,NULL);
+       setkeybinding(MODKEY,           XK_bracketleft, KF_MOVE_LEFT,NULL);
+       setkeybinding(MODKEY,           XK_bracketright,KF_MOVE_RIGHT,NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_bracketleft, KF_MOVE_UP,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_End,      KF_MVRG_1,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Down,     KF_MVRG_2,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Next,     KF_MVRG_3,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Left,     KF_MVRG_4,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Begin,    KF_MVRG_5,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Right,    KF_MVRG_6,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Home,     KF_MVRG_7,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Up,       KF_MVRG_8,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_KP_Prior,    KF_MVRG_9,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_1,           KF_MVWS_1,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_2,           KF_MVWS_2,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_3,           KF_MVWS_3,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_4,           KF_MVWS_4,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_5,           KF_MVWS_5,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_6,           KF_MVWS_6,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_7,           KF_MVWS_7,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_8,           KF_MVWS_8,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_9,           KF_MVWS_9,      NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_0,           KF_MVWS_10,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F1,          KF_MVWS_11,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F2,          KF_MVWS_12,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F3,          KF_MVWS_13,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F4,          KF_MVWS_14,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F5,          KF_MVWS_15,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F6,          KF_MVWS_16,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F7,          KF_MVWS_17,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F8,          KF_MVWS_18,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F9,          KF_MVWS_19,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F10,         KF_MVWS_20,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F11,         KF_MVWS_21,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_F12,         KF_MVWS_22,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_slash,       KF_NAME_WORKSPACE,NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_q,           KF_QUIT,        NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_r,           KF_RAISE_TOGGLE,NULL);
+       setkeybinding(MODKEY,           XK_q,           KF_RESTART,     NULL);
+       setkeybinding(MODKEY,           XK_KP_End,      KF_RG_1,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Down,     KF_RG_2,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Next,     KF_RG_3,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Left,     KF_RG_4,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Begin,    KF_RG_5,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Right,    KF_RG_6,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Home,     KF_RG_7,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Up,       KF_RG_8,        NULL);
+       setkeybinding(MODKEY,           XK_KP_Prior,    KF_RG_9,        NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_Right,       KF_RG_NEXT,     NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_Left,        KF_RG_PREV,     NULL);
+       setkeybinding(MODKEY,           XK_f,           KF_SEARCH_WIN,  NULL);
+       setkeybinding(MODKEY,           XK_slash,       KF_SEARCH_WORKSPACE,NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_i,           KF_SPAWN_CUSTOM,"initscr");
+       setkeybinding(MODKEY_SHIFT,     XK_Delete,      KF_SPAWN_CUSTOM,"lock");
+       setkeybinding(MODKEY,           XK_p,           KF_SPAWN_CUSTOM,"menu");
+       setkeybinding(MODKEY,           XK_s,           KF_SPAWN_CUSTOM,"screenshot_all");
+       setkeybinding(MODKEY_SHIFT,     XK_s,           KF_SPAWN_CUSTOM,"screenshot_wind");
+       setkeybinding(MODKEY_SHIFT,     XK_Return,      KF_SPAWN_CUSTOM,"term");
        setkeybinding(MODKEY_SHIFT,     XK_comma,       KF_STACK_INC,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_period,      KF_STACK_DEC,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_comma,       KF_STACK_INC,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_period,      KF_STACK_DEC,   NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_space,       KF_STACK_RESET, NULL);
        setkeybinding(MODKEY,           XK_Return,      KF_SWAP_MAIN,   NULL);
        setkeybinding(MODKEY,           XK_Return,      KF_SWAP_MAIN,   NULL);
-       setkeybinding(MODKEY,           XK_j,           KF_FOCUS_NEXT,  NULL);
-       setkeybinding(MODKEY,           XK_k,           KF_FOCUS_PREV,  NULL);
        setkeybinding(MODKEY_SHIFT,     XK_j,           KF_SWAP_NEXT,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_k,           KF_SWAP_PREV,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_j,           KF_SWAP_NEXT,   NULL);
        setkeybinding(MODKEY_SHIFT,     XK_k,           KF_SWAP_PREV,   NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_Return,      KF_SPAWN_CUSTOM,"term");
-       setkeybinding(MODKEY,           XK_p,           KF_SPAWN_CUSTOM,"menu");
-       setkeybinding(MODKEY_SHIFT,     XK_q,           KF_QUIT,        NULL);
-       setkeybinding(MODKEY,           XK_q,           KF_RESTART,     NULL);
-       setkeybinding(MODKEY,           XK_m,           KF_FOCUS_MAIN,  NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_w,           KF_UNICONIFY,   NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_v,           KF_VERSION,     NULL);
+       setkeybinding(MODKEY,           XK_equal,       KF_WIDTH_GROW,  NULL);
+       setkeybinding(MODKEY,           XK_minus,       KF_WIDTH_SHRINK,NULL);
+       setkeybinding(MODKEY,           XK_x,           KF_WIND_DEL,    NULL);
+       setkeybinding(MODKEY_SHIFT,     XK_x,           KF_WIND_KILL,   NULL);
        setkeybinding(MODKEY,           XK_1,           KF_WS_1,        NULL);
        setkeybinding(MODKEY,           XK_2,           KF_WS_2,        NULL);
        setkeybinding(MODKEY,           XK_3,           KF_WS_3,        NULL);
        setkeybinding(MODKEY,           XK_1,           KF_WS_1,        NULL);
        setkeybinding(MODKEY,           XK_2,           KF_WS_2,        NULL);
        setkeybinding(MODKEY,           XK_3,           KF_WS_3,        NULL);
@@ -6152,57 +6353,6 @@ setup_keys(void)
        setkeybinding(MODKEY,           XK_Up,          KF_WS_NEXT_ALL, NULL);
        setkeybinding(MODKEY,           XK_Down,        KF_WS_PREV_ALL, NULL);
        setkeybinding(MODKEY,           XK_a,           KF_WS_PRIOR,    NULL);
        setkeybinding(MODKEY,           XK_Up,          KF_WS_NEXT_ALL, NULL);
        setkeybinding(MODKEY,           XK_Down,        KF_WS_PREV_ALL, NULL);
        setkeybinding(MODKEY,           XK_a,           KF_WS_PRIOR,    NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_Right,       KF_SCREEN_NEXT, NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_Left,        KF_SCREEN_PREV, NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_1,           KF_MVWS_1,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_2,           KF_MVWS_2,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_3,           KF_MVWS_3,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_4,           KF_MVWS_4,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_5,           KF_MVWS_5,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_6,           KF_MVWS_6,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_7,           KF_MVWS_7,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_8,           KF_MVWS_8,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_9,           KF_MVWS_9,      NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_0,           KF_MVWS_10,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F1,          KF_MVWS_11,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F2,          KF_MVWS_12,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F3,          KF_MVWS_13,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F4,          KF_MVWS_14,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F5,          KF_MVWS_15,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F6,          KF_MVWS_16,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F7,          KF_MVWS_17,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F8,          KF_MVWS_18,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F9,          KF_MVWS_19,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F10,         KF_MVWS_20,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F11,         KF_MVWS_21,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_F12,         KF_MVWS_22,     NULL);
-       setkeybinding(MODKEY,           XK_b,           KF_BAR_TOGGLE,  NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_b,           KF_BAR_TOGGLE_WS,NULL);
-       setkeybinding(MODKEY,           XK_Tab,         KF_FOCUS_NEXT,  NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_Tab,         KF_FOCUS_PREV,  NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_x,           KF_WIND_KILL,   NULL);
-       setkeybinding(MODKEY,           XK_x,           KF_WIND_DEL,    NULL);
-       setkeybinding(MODKEY,           XK_s,           KF_SPAWN_CUSTOM,"screenshot_all");
-       setkeybinding(MODKEY_SHIFT,     XK_s,           KF_SPAWN_CUSTOM,"screenshot_wind");
-       setkeybinding(MODKEY,           XK_t,           KF_FLOAT_TOGGLE,NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_v,           KF_VERSION,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_Delete,      KF_SPAWN_CUSTOM,"lock");
-       setkeybinding(MODKEY_SHIFT,     XK_i,           KF_SPAWN_CUSTOM,"initscr");
-       setkeybinding(MODKEY,           XK_w,           KF_ICONIFY,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_w,           KF_UNICONIFY,   NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_r,           KF_RAISE_TOGGLE,NULL);
-       setkeybinding(MODKEY,           XK_v,           KF_BUTTON2,     NULL);
-       setkeybinding(MODKEY,           XK_equal,       KF_WIDTH_GROW,  NULL);
-       setkeybinding(MODKEY,           XK_minus,       KF_WIDTH_SHRINK,NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_equal,       KF_HEIGHT_GROW,NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_minus,       KF_HEIGHT_SHRINK,NULL);
-       setkeybinding(MODKEY,           XK_bracketleft, KF_MOVE_LEFT,NULL);
-       setkeybinding(MODKEY,           XK_bracketright,KF_MOVE_RIGHT,NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_bracketleft, KF_MOVE_UP,     NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_bracketright,KF_MOVE_DOWN,NULL);
-       setkeybinding(MODKEY_SHIFT,     XK_slash,       KF_NAME_WORKSPACE,NULL);
-       setkeybinding(MODKEY,           XK_slash,       KF_SEARCH_WORKSPACE,NULL);
-       setkeybinding(MODKEY,           XK_f,           KF_SEARCH_WIN,  NULL);
 #ifdef SWM_DEBUG
        setkeybinding(MODKEY_SHIFT,     XK_d,           KF_DUMPWINS,    NULL);
 #endif
 #ifdef SWM_DEBUG
        setkeybinding(MODKEY_SHIFT,     XK_d,           KF_DUMPWINS,    NULL);
 #endif
@@ -7940,7 +8090,7 @@ void
 enternotify(xcb_enter_notify_event_t *e)
 {
        struct ws_win           *win;
 enternotify(xcb_enter_notify_event_t *e)
 {
        struct ws_win           *win;
-       struct swm_region       *old_r, *r;
+       struct swm_region       *r;
 
        DNPRINTF(SWM_D_FOCUS, "enternotify: time: %u, win (x,y): 0x%x "
            "(%d,%d), mode: %s(%d), detail: %s(%d), root (x,y): 0x%x (%d,%d), "
 
        DNPRINTF(SWM_D_FOCUS, "enternotify: time: %u, win (x,y): 0x%x "
            "(%d,%d), mode: %s(%d), detail: %s(%d), root (x,y): 0x%x (%d,%d), "
@@ -7969,29 +8119,17 @@ enternotify(xcb_enter_notify_event_t *e)
                                return;
                        }
 
                                return;
                        }
 
-                       if (TAILQ_EMPTY(&r->ws->winlist)) {
-                               old_r = root_to_region(e->root, SWM_CK_FOCUS);
-                               if (old_r && old_r != r)
-                                       unfocus_win(old_r->ws->focus);
-
-                               xcb_set_input_focus(conn,
-                                   XCB_INPUT_FOCUS_PARENT, e->root, e->time);
-
-                               /* Clear bar since empty. */
-                               bar_draw();
-
-                               focus_flush();
-                       }
+                       focus_region(r);
                } else {
                        DNPRINTF(SWM_D_EVENT, "enternotify: window is NULL; "
                            "ignoring\n");
                } else {
                        DNPRINTF(SWM_D_EVENT, "enternotify: window is NULL; "
                            "ignoring\n");
+                       return;
                }
                }
-               return;
+       } else {
+               focus_win(get_focus_magic(win));
        }
 
        }
 
-       focus_win(get_focus_magic(win));
-
-       xcb_flush(conn);
+       focus_flush();
 }
 
 #ifdef SWM_DEBUG
 }
 
 #ifdef SWM_DEBUG
@@ -8084,6 +8222,35 @@ out:
        DNPRINTF(SWM_D_EVENT, "maprequest: done.\n");
 }
 
        DNPRINTF(SWM_D_EVENT, "maprequest: done.\n");
 }
 
+void
+motionnotify(xcb_motion_notify_event_t *e)
+{
+       struct swm_region       *r;
+       int                     i, num_screens;
+
+       DNPRINTF(SWM_D_FOCUS, "motionnotify: time: %u, win (x,y): 0x%x "
+           "(%d,%d), detail: %s(%d), root (x,y): 0x%x (%d,%d), "
+           "child: 0x%x, same_screen_focus: %s, state: %d\n",
+           e->time, e->event, e->event_x, e->event_y,
+           get_notify_detail_label(e->detail), e->detail,
+           e->root, e->root_x, e->root_y, e->child,
+           YESNO(e->same_screen), e->state);
+
+       last_event_time = e->time;
+
+       num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
+       for (i = 0; i < num_screens; i++)
+               if (screens[i].root == e->root)
+                       break;
+
+       TAILQ_FOREACH(r, &screens[i].rl, entry)
+               if (X(r) <= e->root_x && e->root_x < MAX_X(r) &&
+                   Y(r) <= e->root_y && e->root_y < MAX_Y(r))
+                       break;
+
+       focus_region(r);
+}
+
 #ifdef SWM_DEBUG
 char *
 get_atom_name(xcb_atom_t atom)
 #ifdef SWM_DEBUG
 char *
 get_atom_name(xcb_atom_t atom)
@@ -8393,6 +8560,7 @@ new_region(struct swm_screen *s, int x, int y, int w, int h)
        struct swm_region       *r, *n;
        struct workspace        *ws = NULL;
        int                     i;
        struct swm_region       *r, *n;
        struct workspace        *ws = NULL;
        int                     i;
+       uint32_t                wa[1];
 
        DNPRINTF(SWM_D_MISC, "new region: screen[%d]:%dx%d+%d+%d\n",
             s->idx, w, h, x, y);
 
        DNPRINTF(SWM_D_MISC, "new region: screen[%d]:%dx%d+%d+%d\n",
             s->idx, w, h, x, y);
@@ -8402,14 +8570,13 @@ new_region(struct swm_screen *s, int x, int y, int w, int h)
        while (n) {
                r = n;
                n = TAILQ_NEXT(r, entry);
        while (n) {
                r = n;
                n = TAILQ_NEXT(r, entry);
-               if (X(r) < (x + w) &&
-                   (X(r) + WIDTH(r)) > x &&
-                   Y(r) < (y + h) &&
-                   (Y(r) + HEIGHT(r)) > y) {
+               if (X(r) < (x + w) && (X(r) + WIDTH(r)) > x &&
+                   Y(r) < (y + h) && (Y(r) + HEIGHT(r)) > y) {
                        if (r->ws->r != NULL)
                                r->ws->old_r = r->ws->r;
                        r->ws->r = NULL;
                        bar_cleanup(r);
                        if (r->ws->r != NULL)
                                r->ws->old_r = r->ws->r;
                        r->ws->r = NULL;
                        bar_cleanup(r);
+                       xcb_destroy_window(conn, r->id);
                        TAILQ_REMOVE(&s->rl, r, entry);
                        TAILQ_INSERT_TAIL(&s->orl, r, entry);
                }
                        TAILQ_REMOVE(&s->rl, r, entry);
                        TAILQ_INSERT_TAIL(&s->orl, r, entry);
                }
@@ -8460,6 +8627,17 @@ new_region(struct swm_screen *s, int x, int y, int w, int h)
        ws->r = r;
        outputs++;
        TAILQ_INSERT_TAIL(&s->rl, r, entry);
        ws->r = r;
        outputs++;
        TAILQ_INSERT_TAIL(&s->rl, r, entry);
+
+       /* Invisible region window to detect pointer events on empty regions. */
+       r->id = xcb_generate_id(conn);
+       wa[0] = XCB_EVENT_MASK_POINTER_MOTION |
+           XCB_EVENT_MASK_POINTER_MOTION_HINT;
+
+       xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->id, r->s->root,
+           X(r), Y(r), WIDTH(r), HEIGHT(r), 0, XCB_WINDOW_CLASS_INPUT_ONLY,
+           XCB_COPY_FROM_PARENT, XCB_CW_EVENT_MASK, wa);
+
+       xcb_map_window(conn, r->id);
 }
 
 void
 }
 
 void
@@ -8491,6 +8669,7 @@ scan_xrandr(int i)
        while ((r = TAILQ_FIRST(&screens[i].rl)) != NULL) {
                r->ws->old_r = r->ws->r = NULL;
                bar_cleanup(r);
        while ((r = TAILQ_FIRST(&screens[i].rl)) != NULL) {
                r->ws->old_r = r->ws->r = NULL;
                bar_cleanup(r);
+               xcb_destroy_window(conn, r->id);
                TAILQ_REMOVE(&screens[i].rl, r, entry);
                TAILQ_INSERT_TAIL(&screens[i].orl, r, entry);
        }
                TAILQ_REMOVE(&screens[i].rl, r, entry);
                TAILQ_INSERT_TAIL(&screens[i].orl, r, entry);
        }
@@ -8572,11 +8751,14 @@ screenchange(xcb_randr_screen_change_notify_event_t *e)
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);
        stack();
                TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);
        stack();
+       bar_draw();
+       focus_flush();
 }
 
 void
 grab_windows(void)
 {
 }
 
 void
 grab_windows(void)
 {
+       struct swm_region       *r = NULL;
        xcb_window_t            *wins = NULL, trans;
        int                     no;
        int                     i, j, num_screens;
        xcb_window_t            *wins = NULL, trans;
        int                     no;
        int                     i, j, num_screens;
@@ -8584,8 +8766,8 @@ grab_windows(void)
 
        xcb_query_tree_cookie_t                 qtc;
        xcb_query_tree_reply_t                  *qtr;
 
        xcb_query_tree_cookie_t                 qtc;
        xcb_query_tree_reply_t                  *qtr;
-       xcb_get_window_attributes_cookie_t      c;
-       xcb_get_window_attributes_reply_t       *r;
+       xcb_get_window_attributes_cookie_t      gac;
+       xcb_get_window_attributes_reply_t       *gar;
        xcb_get_property_cookie_t               pc;
 
        DNPRINTF(SWM_D_INIT, "grab_windows: begin\n");
        xcb_get_property_cookie_t               pc;
 
        DNPRINTF(SWM_D_INIT, "grab_windows: begin\n");
@@ -8601,17 +8783,30 @@ grab_windows(void)
                /* normal windows */
                DNPRINTF(SWM_D_INIT, "grab_windows: grab top level windows.\n");
                for (j = 0; j < no; j++) {
                /* normal windows */
                DNPRINTF(SWM_D_INIT, "grab_windows: grab top level windows.\n");
                for (j = 0; j < no; j++) {
-                       c = xcb_get_window_attributes(conn, wins[j]);
-                       r = xcb_get_window_attributes_reply(conn, c, NULL);
-                       if (!r) {
+                       TAILQ_FOREACH(r, &screens[i].rl, entry) {
+                               if (r->id == wins[j]) {
+                                       DNPRINTF(SWM_D_INIT, "grab_windows: "
+                                           "skip %#x; region input window.\n",
+                                           wins[j]);
+                                       break;
+                               }
+                       }
+
+                       if (r)
+                               continue;
+
+                       gac = xcb_get_window_attributes(conn, wins[j]);
+                       gar = xcb_get_window_attributes_reply(conn, gac, NULL);
+                       if (!gar) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "doesn't exist.\n", wins[j]);
                                continue;
                        }
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "doesn't exist.\n", wins[j]);
                                continue;
                        }
-                       if (r->override_redirect) {
+
+                       if (gar->override_redirect) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "override_redirect set.\n", wins[j]);
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "override_redirect set.\n", wins[j]);
-                               free(r);
+                               free(gar);
                                continue;
                        }
 
                                continue;
                        }
 
@@ -8620,42 +8815,43 @@ grab_windows(void)
                            &trans, NULL)) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "is transient for %#x.\n", wins[j], trans);
                            &trans, NULL)) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "is transient for %#x.\n", wins[j], trans);
-                               free(r);
+                               free(gar);
                                continue;
                        }
 
                        state = getstate(wins[j]);
                        manage = state != XCB_ICCCM_WM_STATE_WITHDRAWN;
                                continue;
                        }
 
                        state = getstate(wins[j]);
                        manage = state != XCB_ICCCM_WM_STATE_WITHDRAWN;
-                       mapped = r->map_state != XCB_MAP_STATE_UNMAPPED;
+                       mapped = gar->map_state != XCB_MAP_STATE_UNMAPPED;
                        if (mapped || manage)
                                manage_window(wins[j], mapped);
                        if (mapped || manage)
                                manage_window(wins[j], mapped);
-                       free(r);
+                       free(gar);
                }
                /* transient windows */
                DNPRINTF(SWM_D_INIT, "grab_windows: grab transient windows.\n");
                for (j = 0; j < no; j++) {
                }
                /* transient windows */
                DNPRINTF(SWM_D_INIT, "grab_windows: grab transient windows.\n");
                for (j = 0; j < no; j++) {
-                       c = xcb_get_window_attributes(conn, wins[j]);
-                       r = xcb_get_window_attributes_reply(conn, c, NULL);
-                       if (!r) {
+                       gac = xcb_get_window_attributes(conn, wins[j]);
+                       gar = xcb_get_window_attributes_reply(conn, gac, NULL);
+                       if (!gar) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "doesn't exist.\n", wins[j]);
                                continue;
                        }
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "doesn't exist.\n", wins[j]);
                                continue;
                        }
-                       if (r->override_redirect) {
+
+                       if (gar->override_redirect) {
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "override_redirect set.\n", wins[j]);
                                DNPRINTF(SWM_D_INIT, "grab_windows: skip %#x; "
                                    "override_redirect set.\n", wins[j]);
-                               free(r);
+                               free(gar);
                                continue;
                        }
 
                        state = getstate(wins[j]);
                        manage = state != XCB_ICCCM_WM_STATE_WITHDRAWN;
                                continue;
                        }
 
                        state = getstate(wins[j]);
                        manage = state != XCB_ICCCM_WM_STATE_WITHDRAWN;
-                       mapped = r->map_state != XCB_MAP_STATE_UNMAPPED;
+                       mapped = gar->map_state != XCB_MAP_STATE_UNMAPPED;
                        pc = xcb_icccm_get_wm_transient_for(conn, wins[j]);
                        if (xcb_icccm_get_wm_transient_for_reply(conn, pc,
                            &trans, NULL) && manage)
                                manage_window(wins[j], mapped);
                        pc = xcb_icccm_get_wm_transient_for(conn, wins[j]);
                        if (xcb_icccm_get_wm_transient_for_reply(conn, pc,
                            &trans, NULL) && manage)
                                manage_window(wins[j], mapped);
-                       free(r);
+                       free(gar);
                }
                free(qtr);
        }
                }
                free(qtr);
        }
@@ -8700,6 +8896,8 @@ setup_screens(void)
        for (i = 0; i < num_screens; i++) {
                DNPRINTF(SWM_D_WS, "setup_screens: init screen: %d\n", i);
                screens[i].idx = i;
        for (i = 0; i < num_screens; i++) {
                DNPRINTF(SWM_D_WS, "setup_screens: init screen: %d\n", i);
                screens[i].idx = i;
+               screens[i].r_focus = NULL;
+
                TAILQ_INIT(&screens[i].rl);
                TAILQ_INIT(&screens[i].orl);
                if ((screen = get_screen(i)) == NULL)
                TAILQ_INIT(&screens[i].rl);
                TAILQ_INIT(&screens[i].orl);
                if ((screen = get_screen(i)) == NULL)
@@ -8895,7 +9093,7 @@ event_handle(xcb_generic_event_t *evt)
        EVENT(XCB_MAP_NOTIFY, mapnotify);
        EVENT(XCB_MAP_REQUEST, maprequest);
        EVENT(XCB_MAPPING_NOTIFY, mappingnotify);
        EVENT(XCB_MAP_NOTIFY, mapnotify);
        EVENT(XCB_MAP_REQUEST, maprequest);
        EVENT(XCB_MAPPING_NOTIFY, mappingnotify);
-       /*EVENT(XCB_MOTION_NOTIFY, );*/
+       EVENT(XCB_MOTION_NOTIFY, motionnotify);
        /*EVENT(XCB_NO_EXPOSURE, );*/
        EVENT(XCB_PROPERTY_NOTIFY, propertynotify);
        /*EVENT(XCB_REPARENT_NOTIFY, );*/
        /*EVENT(XCB_NO_EXPOSURE, );*/
        EVENT(XCB_PROPERTY_NOTIFY, propertynotify);
        /*EVENT(XCB_REPARENT_NOTIFY, );*/
@@ -8914,11 +9112,10 @@ event_handle(xcb_generic_event_t *evt)
 int
 main(int argc, char *argv[])
 {
 int
 main(int argc, char *argv[])
 {
-       struct swm_region       *r, *rr;
-       struct ws_win           *winfocus = NULL;
+       struct swm_region       *r;
        char                    conf[PATH_MAX], *cfile = NULL;
        struct stat             sb;
        char                    conf[PATH_MAX], *cfile = NULL;
        struct stat             sb;
-       int                     xfd, i, num_screens;
+       int                     xfd, i, num_screens, startup = 1;
        struct sigaction        sact;
        xcb_generic_event_t     *evt;
        struct timeval          tv;
        struct sigaction        sact;
        xcb_generic_event_t     *evt;
        struct timeval          tv;
@@ -9044,14 +9241,12 @@ noconfig:
        /* setup all bars */
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
        for (i = 0; i < num_screens; i++)
        /* setup all bars */
        num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
        for (i = 0; i < num_screens; i++)
-               TAILQ_FOREACH(r, &screens[i].rl, entry) {
-                       if (winfocus == NULL)
-                               winfocus = TAILQ_FIRST(&r->ws->winlist);
+               TAILQ_FOREACH(r, &screens[i].rl, entry)
                        bar_setup(r);
                        bar_setup(r);
-               }
 
        grabkeys();
        stack();
 
        grabkeys();
        stack();
+       bar_draw();
 
        xcb_ungrab_server(conn);
        xcb_flush(conn);
 
        xcb_ungrab_server(conn);
        xcb_flush(conn);
@@ -9067,18 +9262,17 @@ noconfig:
                }
 
                /* If just (re)started, set default focus if needed. */
                }
 
                /* If just (re)started, set default focus if needed. */
-               if (winfocus && focus_mode != SWM_FOCUS_FOLLOW) {
-                       rr = winfocus->ws->r;
-                       if (rr == NULL) {
-                               /* not a visible window */
-                               winfocus = NULL;
+               if (startup) {
+                       startup = 0;
+
+                       if (focus_mode != SWM_FOCUS_FOLLOW) {
+                               r = TAILQ_FIRST(&screens[0].rl);
+                               if (r) {
+                                       focus_region(r);
+                                       focus_flush();
+                               }
                                continue;
                        }
                                continue;
                        }
-
-                       focus_win(get_region_focus(rr));
-                       focus_flush();
-                       winfocus = NULL;
-                       continue;
                }
 
                FD_ZERO(&rd);
                }
 
                FD_ZERO(&rd);
index 802e75efb4039deb1b8aff3faf33990442614b8e..654f43d20af4aa94c3a6c08795213b59826d57da 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+plus
 bind[mvws_2]           = MOD+Shift+ecaron
 bind[mvws_3]           = MOD+Shift+scaron
 bind[mvws_1]           = MOD+Shift+plus
 bind[mvws_2]           = MOD+Shift+ecaron
 bind[mvws_3]           = MOD+Shift+scaron
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
index 1eaa40408f4e6afbd03b41cdac8f96f4bc973d01..351a2e53faa4ca27c276ecf44da173ce84c18fb5 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
index ace7e2c3aa15cbdb0b089c14d2e1ae1d0bd8de6d..9fc9778d38d49192ac615c65a583b3b15ec2a508 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+ampersand
 bind[mvws_2]           = MOD+Shift+eacute
 bind[mvws_3]           = MOD+Shift+quotedbl
 bind[mvws_1]           = MOD+Shift+ampersand
 bind[mvws_2]           = MOD+Shift+eacute
 bind[mvws_3]           = MOD+Shift+quotedbl
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
index 5923a1c242f048578018f6fdfeb6fae1729d4e66..264f611b2cf1534e90e8df11bf19dbf5b3501876 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
index 1234670676be8b9a9460a5c0fa8f296b2f5b110f..72939250cc18fe63b1b0ff1e7247c9554960c490 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
index 9cdcaed2db172e2caaa82184d774251c84a74e1e..89b4ebd312e090b1aaeb63043c234e30008638e0 100644 (file)
@@ -46,8 +46,6 @@ bind[ws_prev]         = MOD+Left
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
 bind[ws_next_all]      = MOD+Up
 bind[ws_prev_all]      = MOD+Down
 bind[ws_prior]         = MOD+a
-bind[screen_next]      = MOD+Shift+Right
-bind[screen_prev]      = MOD+Shift+Left
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
 bind[mvws_1]           = MOD+Shift+1
 bind[mvws_2]           = MOD+Shift+2
 bind[mvws_3]           = MOD+Shift+3
@@ -70,6 +68,26 @@ bind[mvws_19]                = MOD+Shift+F9
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
 bind[mvws_20]          = MOD+Shift+F10
 bind[mvws_21]          = MOD+Shift+F11
 bind[mvws_22]          = MOD+Shift+F12
+bind[rg_1]             = MOD+KP_End
+bind[rg_2]             = MOD+KP_Down
+bind[rg_3]             = MOD+KP_Next
+bind[rg_4]             = MOD+KP_Left
+bind[rg_5]             = MOD+KP_Begin
+bind[rg_6]             = MOD+KP_Right
+bind[rg_7]             = MOD+KP_Home
+bind[rg_8]             = MOD+KP_Up
+bind[rg_9]             = MOD+KP_Prior
+bind[rg_next]          = MOD+Shift+Right
+bind[rg_prev]          = MOD+Shift+Left
+bind[mvrg_1]           = MOD+Shift+KP_End
+bind[mvrg_2]           = MOD+Shift+KP_Down
+bind[mvrg_3]           = MOD+Shift+KP_Next
+bind[mvrg_4]           = MOD+Shift+KP_Left
+bind[mvrg_5]           = MOD+Shift+KP_Begin
+bind[mvrg_6]           = MOD+Shift+KP_Right
+bind[mvrg_7]           = MOD+Shift+KP_Home
+bind[mvrg_8]           = MOD+Shift+KP_Up
+bind[mvrg_9]           = MOD+Shift+KP_Prior
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab
 bind[bar_toggle]       = MOD+b
 bind[focus_next]       = MOD+Tab
 bind[focus_prev]       = MOD+Shift+Tab