]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
focus nwe transients when another window in their transient tree is focused
[chaz/openbox] / openbox / client.c
index e63f78678018361bd346a493d32cfd9408fc1be7..0952909c0b3e223869b165e54a122af27383d5d3 100644 (file)
@@ -183,9 +183,6 @@ void client_manage_all()
        }
     }
     XFree(children);
-
-    if (config_focus_new)
-        focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS);
 }
 
 void client_manage(Window window)
@@ -280,7 +277,8 @@ void client_manage(Window window)
     client_restore_session_stacking(self);
 
     /* focus the new window? */
-    if (ob_state() != OB_STATE_STARTING && config_focus_new &&
+    if (ob_state() != OB_STATE_STARTING &&
+        (config_focus_new || client_search_focus_tree_full(self)) &&
         /* note the check against Type_Normal/Dialog, not client_normal(self),
            which would also include other types. in this case we want more
            strict rules for focus */
@@ -2074,7 +2072,14 @@ static void client_iconify_recursive(ObClient *self,
 
         if (iconic) {
             if (self->functions & OB_CLIENT_FUNC_ICONIFY) {
+                long old;
+
+                old = self->wmstate;
                 self->wmstate = IconicState;
+                if (old != self->wmstate)
+                    PROP_MSG(self->window, kde_wm_change_state,
+                             self->wmstate, 1, 0, 0);
+
                 self->ignore_unmaps++;
                 /* we unmap the client itself so that we can get MapRequest
                    events, and because the ICCCM tells us to! */
@@ -2088,9 +2093,17 @@ static void client_iconify_recursive(ObClient *self,
                 changed = TRUE;
             }
         } else {
+            long old;
+
             if (curdesk)
                 client_set_desktop(self, screen_desktop, FALSE);
+
+            old = self->wmstate;
             self->wmstate = self->shaded ? IconicState : NormalState;
+            if (old != self->wmstate)
+                PROP_MSG(self->window, kde_wm_change_state,
+                         self->wmstate, 1, 0, 0);
+
             XMapWindow(ob_display, self->window);
 
             /* this puts it after the current focused window */
@@ -2239,8 +2252,16 @@ void client_shade(ObClient *self, gboolean shade)
        self->shaded == shade) return;     /* already done */
 
     /* when we're iconic, don't change the wmstate */
-    if (!self->iconic)
-       self->wmstate = shade ? IconicState : NormalState;
+    if (!self->iconic) {
+        long old;
+
+        old = self->wmstate;
+        self->wmstate = shade ? IconicState : NormalState;
+        if (old != self->wmstate)
+            PROP_MSG(self->window, kde_wm_change_state,
+                     self->wmstate, 1, 0, 0);
+    }
+
     self->shaded = shade;
     client_change_state(self);
     /* resize the frame to just the titlebar */
@@ -2594,11 +2615,12 @@ gboolean client_focus(ObClient *self)
 
 void client_unfocus(ObClient *self)
 {
-    g_assert(focus_client == self);
+    if (focus_client == self) {
 #ifdef DEBUG_FOCUS
-    ob_debug("client_unfocus for %lx\n", self->window);
+        ob_debug("client_unfocus for %lx\n", self->window);
 #endif
-    focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING);
+        focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING);
+    }
 }
 
 void client_activate(ObClient *self, gboolean here)
@@ -3010,9 +3032,29 @@ int client_directional_edge_search(ObClient *c, ObDirection dir)
     case OB_DIRECTION_NORTHWEST:
     case OB_DIRECTION_SOUTHWEST:
         /* not implemented */
-        break;
     default:
-            g_assert_not_reached();
+        g_assert_not_reached();
     }
     return dest;
 }
+
+ObClient* client_under_pointer()
+{
+    int x, y;
+    GList *it;
+    ObClient *ret = NULL;
+
+    if (screen_pointer_pos(&x, &y)) {
+        for (it = stacking_list; it != NULL; it = it->next) {
+            if (WINDOW_IS_CLIENT(it->data)) {
+                ObClient *c = WINDOW_AS_CLIENT(it->data);
+                if (c->desktop == screen_desktop &&
+                    RECT_CONTAINS(c->frame->area, x, y)) {
+                    ret = c;
+                    break;
+                }
+            }
+        }
+    }
+    return ret;
+}
This page took 0.025664 seconds and 4 git commands to generate.