JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
search_win's key binding should be M-f on the manpage.
[spectrwm.git] / scrotwm.c
index c43b0ea..37cdf48 100644 (file)
--- a/scrotwm.c
+++ b/scrotwm.c
@@ -2428,8 +2428,13 @@ focus_prev(struct ws_win *win)
        if (winfocus == NULL || winfocus == win)
                winfocus = TAILQ_NEXT(cur_focus, entry);
 done:
-       if (winfocus == winlostfocus || winfocus == NULL)
+       if (winfocus == winlostfocus || winfocus == NULL) {
+               /* update the bar so that title/class/name will be cleared. */
+               if (window_name_enabled || title_name_enabled || title_class_enabled)
+                       bar_update();
+               
                return;
+       }
 
        focus_magic(winfocus);
 }
@@ -2441,6 +2446,7 @@ focus(struct swm_region *r, union arg *args)
        struct ws_win           *cur_focus = NULL;
        struct ws_win_list      *wl = NULL;
        struct workspace        *ws = NULL;
+       int                     all_iconics;
 
        if (!(r && r->ws))
                return;
@@ -2466,6 +2472,17 @@ focus(struct swm_region *r, union arg *args)
                return;
        ws = r->ws;
        wl = &ws->winlist;
+       if (TAILQ_EMPTY(wl))
+               return;
+       /* make sure there is at least one uniconified window */
+       all_iconics = 1;
+       TAILQ_FOREACH(winfocus, wl, entry)
+               if (winfocus->iconic == 0) {
+                       all_iconics = 0;
+                       break;
+               }
+       if (all_iconics)
+               return;
 
        winlostfocus = cur_focus;
 
@@ -2484,9 +2501,13 @@ focus(struct swm_region *r, union arg *args)
 
                /* skip iconics */
                if (winfocus && winfocus->iconic) {
-                       TAILQ_FOREACH_REVERSE(winfocus, wl, ws_win_list, entry)
+                       while (winfocus != cur_focus) {
+                               if (winfocus == NULL)
+                                       winfocus = TAILQ_LAST(wl, ws_win_list);
                                if (winfocus->iconic == 0)
                                        break;
+                               winfocus = TAILQ_PREV(winfocus, ws_win_list, entry);
+                       }
                }
                break;
 
@@ -2498,9 +2519,13 @@ focus(struct swm_region *r, union arg *args)
 
                /* skip iconics */
                if (winfocus && winfocus->iconic) {
-                       TAILQ_FOREACH(winfocus, wl, entry)
+                       while (winfocus != cur_focus) {
+                               if (winfocus == NULL)
+                                       winfocus = TAILQ_FIRST(wl);
                                if (winfocus->iconic == 0)
                                        break;
+                               winfocus = TAILQ_NEXT(winfocus, entry);
+                       }
                }
                break;
 
@@ -2513,8 +2538,13 @@ focus(struct swm_region *r, union arg *args)
        default:
                return;
        }
-       if (winfocus == winlostfocus || winfocus == NULL)
+       if (winfocus == winlostfocus || winfocus == NULL) {
+               /* update the bar so that title/class/name will be cleared. */
+               if (window_name_enabled || title_name_enabled || title_class_enabled)
+                       bar_update();
+
                return;
+       }
 
        focus_magic(winfocus);
 }
@@ -3100,7 +3130,7 @@ send_to_ws(struct swm_region *r, union arg *args)
        unsigned char           ws_idx_str[SWM_PROPLEN];
        union arg               a;
 
-       if (r && r->ws)
+       if (r && r->ws && r->ws->focus)
                win = r->ws->focus;
        else
                return;
@@ -3128,6 +3158,8 @@ send_to_ws(struct swm_region *r, union arg *args)
        unmap_window(win);
        TAILQ_REMOVE(&ws->winlist, win, entry);
        TAILQ_INSERT_TAIL(&nws->winlist, win, entry);
+       if (TAILQ_EMPTY(&ws->winlist))
+               r->ws->focus = NULL;
        win->ws = nws;
 
        /* Try to update the window's workspace property */
@@ -6184,8 +6216,8 @@ propertynotify(XEvent *e)
        }
 
        switch (ev->atom) {
-       case XA_WM_NORMAL_HINTS:
 #if 0
+       case XA_WM_NORMAL_HINTS:
                long            mask;
                XGetWMNormalHints(display, win->id, &win->sh, &mask);
                fprintf(stderr, "normal hints: flag 0x%x\n", win->sh.flags);
@@ -6197,6 +6229,11 @@ propertynotify(XEvent *e)
                XMoveResizeWindow(display, win->id,
                    win->g.x, win->g.y, win->g.w, win->g.h);
 #endif
+       case XA_WM_CLASS:
+               if (title_name_enabled || title_class_enabled)
+                       bar_update();
+               break;
+       case XA_WM_NAME:
                if (window_name_enabled)
                        bar_update();
                break;