JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix follow_cursor focus mode and rename option value to 'focus'.
authorReginald Kennedy <rk@rejii.com>
Tue, 21 Aug 2012 18:24:09 +0000 (02:24 +0800)
committerReginald Kennedy <rk@rejii.com>
Tue, 21 Aug 2012 18:24:20 +0000 (02:24 +0800)
Note that previous value of 'focus_cursor' is still valid.

spectrwm.1
spectrwm.c

index ea66e9b..5875d5a 100644 (file)
@@ -240,11 +240,11 @@ and
 .It Ic focus_mode
 Window focus behavior with respect to the mouse cursor. Possible values:
 .Pp
 .It Ic focus_mode
 Window focus behavior with respect to the mouse cursor. Possible values:
 .Pp
-.Bl -tag -width "follow_cursor" -offset indent -compact
+.Bl -tag -width "default" -offset indent -compact
 .It Cm default
 Set window focus on border crossings caused by cursor motion and
 window interaction.
 .It Cm default
 Set window focus on border crossings caused by cursor motion and
 window interaction.
-.It Cm follow_cursor
+.It Cm follow
 Set window focus on all cursor border crossings, including workspace switches
 and changes to layout.
 .It Cm manual
 Set window focus on all cursor border crossings, including workspace switches
 and changes to layout.
 .It Cm manual
index 12465bb..fb07f0e 100644 (file)
@@ -2872,9 +2872,10 @@ switchws(struct swm_region *r, union arg *args)
                TAILQ_FOREACH(win, &old_ws->winlist, entry)
                        unmap_window(win);
 
                TAILQ_FOREACH(win, &old_ws->winlist, entry)
                        unmap_window(win);
 
-       new_ws->focus_pending = get_region_focus(new_ws->r);
+       if (focus_mode != SWM_FOCUS_FOLLOW)
+               new_ws->focus_pending = get_region_focus(new_ws->r);
 
 
-       if (new_ws->focus_pending) {
+       if (new_ws->focus_pending && focus_mode != SWM_FOCUS_FOLLOW) {
                /* if workspaces were swapped, then don't wait to set focus */
                if (old_ws->r)
                        focus_win(new_ws->focus_pending);
                /* if workspaces were swapped, then don't wait to set focus */
                if (old_ws->r)
                        focus_win(new_ws->focus_pending);
@@ -3883,7 +3884,7 @@ send_to_ws(struct swm_region *r, union arg *args)
 {
        int                     wsid = args->id;
        struct ws_win           *win = NULL, *parent;
 {
        int                     wsid = args->id;
        struct ws_win           *win = NULL, *parent;
-       struct workspace        *ws, *nws;
+       struct workspace        *ws, *nws, *pws;
        char                    ws_idx_str[SWM_PROPLEN];
 
        if (wsid >= workspace_limit)
        char                    ws_idx_str[SWM_PROPLEN];
 
        if (wsid >= workspace_limit)
@@ -3905,20 +3906,27 @@ send_to_ws(struct swm_region *r, union arg *args)
 
        /* Update the window's workspace property: _SWM_WS */
        if (snprintf(ws_idx_str, SWM_PROPLEN, "%d", nws->idx) < SWM_PROPLEN) {
 
        /* Update the window's workspace property: _SWM_WS */
        if (snprintf(ws_idx_str, SWM_PROPLEN, "%d", nws->idx) < SWM_PROPLEN) {
-               ws->focus_pending = get_focus_prev(win);
+               if (focus_mode != SWM_FOCUS_FOLLOW)
+                       ws->focus_pending = get_focus_prev(win);
 
                /* Move the parent if this is a transient window. */
                if (win->transient) {
                        parent = find_window(win->transient);
                        if (parent) {
 
                /* Move the parent if this is a transient window. */
                if (win->transient) {
                        parent = find_window(win->transient);
                        if (parent) {
+                               pws = parent->ws;
                                /* Set new focus in parent's ws if needed. */
                                /* Set new focus in parent's ws if needed. */
-                               if (parent->ws->focus == parent) {
-                                       parent->ws->focus_pending =
-                                           get_focus_prev(parent);
+                               if (pws->focus == parent) {
+                                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                                               pws->focus_pending =
+                                                   get_focus_prev(parent);
+
                                        unfocus_win(parent);
                                        unfocus_win(parent);
-                                       parent->ws->focus =
-                                           parent->ws->focus_pending;
-                                       parent->ws->focus_pending = NULL;
+
+                                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                                               pws->focus = pws->focus_pending;
+
+                                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                                               pws->focus_pending = NULL;
                                }
 
                                /* Don't unmap parent if new ws is visible */
                                }
 
                                /* Don't unmap parent if new ws is visible */
@@ -3961,8 +3969,11 @@ send_to_ws(struct swm_region *r, union arg *args)
 
                /* Restack and set new focus. */
                stack();
 
                /* Restack and set new focus. */
                stack();
-               focus_win(ws->focus_pending);
-               ws->focus_pending = NULL;
+
+               if (focus_mode != SWM_FOCUS_FOLLOW) {
+                       focus_win(ws->focus_pending);
+                       ws->focus_pending = NULL;
+               }
 
                focus_flush();
        }
 
                focus_flush();
        }
@@ -6221,7 +6232,8 @@ setconfvalue(char *selector, char *value, int flags)
        case SWM_S_FOCUS_MODE:
                if (!strcmp(value, "default"))
                        focus_mode = SWM_FOCUS_DEFAULT;
        case SWM_S_FOCUS_MODE:
                if (!strcmp(value, "default"))
                        focus_mode = SWM_FOCUS_DEFAULT;
-               else if (!strcmp(value, "follow_cursor"))
+               else if (!strcmp(value, "follow") ||
+                   !strcmp(value, "follow_cursor"))
                        focus_mode = SWM_FOCUS_FOLLOW;
                else if (!strcmp(value, "manual"))
                        focus_mode = SWM_FOCUS_MANUAL;
                        focus_mode = SWM_FOCUS_FOLLOW;
                else if (!strcmp(value, "manual"))
                        focus_mode = SWM_FOCUS_MANUAL;
@@ -7333,16 +7345,20 @@ destroynotify(xcb_destroy_notify_event_t *e)
                return;
        }
 
                return;
        }
 
-       /* If we were focused, make sure we focus on something else. */
-       if (win == win->ws->focus)
-               win->ws->focus_pending = get_focus_prev(win);
+       if (focus_mode != SWM_FOCUS_FOLLOW) {
+               /* If we were focused, make sure we focus on something else. */
+               if (win == win->ws->focus)
+                       win->ws->focus_pending = get_focus_prev(win);
+       }
 
        unmanage_window(win);
        stack();
 
 
        unmanage_window(win);
        stack();
 
-       if (win->ws->focus_pending) {
-               focus_win(win->ws->focus_pending);
-               win->ws->focus_pending = NULL;
+       if (focus_mode != SWM_FOCUS_FOLLOW) {
+               if (win->ws->focus_pending) {
+                       focus_win(win->ws->focus_pending);
+                       win->ws->focus_pending = NULL;
+               }
        }
 
        free_window(win);
        }
 
        free_window(win);
@@ -7477,9 +7493,11 @@ mapnotify(xcb_map_notify_event_t *e)
        win->mapped = 1;
        set_win_state(win, XCB_ICCCM_WM_STATE_NORMAL);
 
        win->mapped = 1;
        set_win_state(win, XCB_ICCCM_WM_STATE_NORMAL);
 
-       if (win->ws->focus_pending == win) {
-               focus_win(win);
-               win->ws->focus_pending = NULL;
+       if (focus_mode != SWM_FOCUS_FOLLOW) {
+               if (win->ws->focus_pending == win) {
+                       focus_win(win);
+                       win->ws->focus_pending = NULL;
+               }
        }
 
        xcb_flush(conn);
        }
 
        xcb_flush(conn);
@@ -7525,7 +7543,8 @@ maprequest(xcb_map_request_event_t *e)
                stack();
 
        /* The new window should get focus. */
                stack();
 
        /* The new window should get focus. */
-       win->ws->focus_pending = get_focus_magic(win);
+       if (focus_mode != SWM_FOCUS_FOLLOW)
+               win->ws->focus_pending = get_focus_magic(win);
 
        /* Ignore EnterNotify to handle the mapnotify without interference. */
        if (focus_mode == SWM_FOCUS_DEFAULT)
 
        /* Ignore EnterNotify to handle the mapnotify without interference. */
        if (focus_mode == SWM_FOCUS_DEFAULT)
@@ -7589,19 +7608,25 @@ propertynotify(xcb_property_notify_event_t *e)
 
        if (e->atom == a_swm_iconic) {
                if (e->state == XCB_PROPERTY_NEW_VALUE) {
 
        if (e->atom == a_swm_iconic) {
                if (e->state == XCB_PROPERTY_NEW_VALUE) {
-                       win->ws->focus_pending = get_focus_prev(win);
+                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                               win->ws->focus_pending = get_focus_prev(win);
+
                        unfocus_win(win);
                        unmap_window(win);
 
                        if (win->ws->r) {
                                stack();
                        unfocus_win(win);
                        unmap_window(win);
 
                        if (win->ws->r) {
                                stack();
-                               focus_win(win->ws->focus_pending);
-                               win->ws->focus_pending = NULL;
+                               if (focus_mode != SWM_FOCUS_FOLLOW) {
+                                       focus_win(win->ws->focus_pending);
+                                       win->ws->focus_pending = NULL;
+                               }
                                focus_flush();
                        }
                } else if (e->state == XCB_PROPERTY_DELETE) {
                        /* The window is no longer iconic, restack ws. */
                                focus_flush();
                        }
                } else if (e->state == XCB_PROPERTY_DELETE) {
                        /* The window is no longer iconic, restack ws. */
-                       win->ws->focus_pending = get_focus_magic(win);
+                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                               win->ws->focus_pending = get_focus_magic(win);
+
                        stack();
 
                        /* Flush EnterNotify for mapnotify, if needed. */
                        stack();
 
                        /* Flush EnterNotify for mapnotify, if needed. */
@@ -7610,9 +7635,12 @@ propertynotify(xcb_property_notify_event_t *e)
        } else if (e->atom == a_state) {
                /* State just changed, make sure it gets focused if mapped. */
                if (e->state == XCB_PROPERTY_NEW_VALUE) {
        } else if (e->atom == a_state) {
                /* State just changed, make sure it gets focused if mapped. */
                if (e->state == XCB_PROPERTY_NEW_VALUE) {
-                       if (win->mapped && win->ws->focus_pending == win) {
-                               win->ws->focus_pending = NULL;
-                               focus_win(win);
+                       if (focus_mode != SWM_FOCUS_FOLLOW) {
+                               if (win->mapped &&
+                                   win->ws->focus_pending == win) {
+                                       focus_win(win->ws->focus_pending);
+                                       win->ws->focus_pending = NULL;
+                               }
                        }
                }
        } else if (e->atom == XCB_ATOM_WM_CLASS ||
                        }
                }
        } else if (e->atom == XCB_ATOM_WM_CLASS ||
@@ -7638,7 +7666,8 @@ unmapnotify(xcb_unmap_notify_event_t *e)
        if (getstate(e->window) == XCB_ICCCM_WM_STATE_NORMAL) {
                /* If we were focused, make sure we focus on something else. */
                if (win == win->ws->focus)
        if (getstate(e->window) == XCB_ICCCM_WM_STATE_NORMAL) {
                /* If we were focused, make sure we focus on something else. */
                if (win == win->ws->focus)
-                       win->ws->focus_pending = get_focus_prev(win);
+                       if (focus_mode != SWM_FOCUS_FOLLOW)
+                               win->ws->focus_pending = get_focus_prev(win);
 
                win->mapped = 0;
                set_win_state(win, XCB_ICCCM_WM_STATE_ICONIC);
 
                win->mapped = 0;
                set_win_state(win, XCB_ICCCM_WM_STATE_ICONIC);
@@ -7646,9 +7675,11 @@ unmapnotify(xcb_unmap_notify_event_t *e)
                unmanage_window(win);
                stack();
 
                unmanage_window(win);
                stack();
 
-               if (win->ws->focus_pending) {
-                       focus_win(win->ws->focus_pending);
-                       win->ws->focus_pending = NULL;
+               if (focus_mode != SWM_FOCUS_FOLLOW) {
+                       if (win->ws->focus_pending) {
+                               focus_win(win->ws->focus_pending);
+                               win->ws->focus_pending = NULL;
+                       }
                }
 
                focus_flush();
                }
 
                focus_flush();