]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
don't focus splash screens and toolbars and menus when you click on them. or enter...
[chaz/openbox] / openbox / client.c
index 8592aa93506a023bce7a2a0070aaa3842b15e587..21a0accf84db861698bb46476a609ce3bc2881a9 100644 (file)
@@ -2394,6 +2394,22 @@ gboolean client_helper(ObClient *self)
             self->type == OB_CLIENT_TYPE_TOOLBAR);
 }
 
+gboolean client_mouse_focusable(ObClient *self)
+{
+    return !(self->type == OB_CLIENT_TYPE_MENU ||
+             self->type == OB_CLIENT_TYPE_TOOLBAR ||
+             self->type == OB_CLIENT_TYPE_SPLASH ||
+             self->type == OB_CLIENT_TYPE_DOCK);
+}
+
+gboolean client_enter_focusable(ObClient *self)
+{
+    /* you can focus desktops but it shouldn't on enter */
+    return (client_mouse_focusable(self) &&
+            self->type != OB_CLIENT_TYPE_DESKTOP);
+}
+
+
 static void client_apply_startup_state(ObClient *self, gint x, gint y)
 {
     gboolean pos = FALSE; /* has the window's position been configured? */
@@ -2813,7 +2829,7 @@ static void client_iconify_recursive(ObClient *self,
 
             if (curdesk && self->desktop != screen_desktop &&
                 self->desktop != DESKTOP_ALL)
-                client_set_desktop(self, screen_desktop, FALSE, FALSE);
+                client_set_desktop(self, screen_desktop, FALSE);
 
             /* this puts it after the current focused window */
             focus_order_remove(self);
@@ -2994,8 +3010,7 @@ void client_hilite(ObClient *self, gboolean hilite)
 
 void client_set_desktop_recursive(ObClient *self,
                                   guint target,
-                                  gboolean donthide,
-                                  gboolean focus_nonintrusive)
+                                  gboolean donthide)
 {
     guint old;
     GSList *it;
@@ -3006,10 +3021,6 @@ void client_set_desktop_recursive(ObClient *self,
 
         g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
 
-        /* remove from the old desktop(s) */
-        if (!focus_nonintrusive)
-            focus_order_remove(self);
-
         old = self->desktop;
         self->desktop = target;
         PROP_SET32(self->window, net_wm_desktop, cardinal, target);
@@ -3024,14 +3035,6 @@ void client_set_desktop_recursive(ObClient *self,
         if (STRUT_EXISTS(self->strut))
             screen_update_areas();
 
-        /* add to the new desktop(s) */
-        if (!focus_nonintrusive) {
-            if (config_focus_new)
-                focus_order_to_top(self);
-            else
-                focus_order_to_bottom(self);
-        }
-
         /* call the notifies */
         GSList *it;
         for (it = client_desktop_notifies; it; it = g_slist_next(it)) {
@@ -3044,15 +3047,14 @@ void client_set_desktop_recursive(ObClient *self,
     for (it = self->transients; it; it = g_slist_next(it))
         if (it->data != self)
             if (client_is_direct_child(self, it->data))
-                client_set_desktop_recursive(it->data, target,
-                                             donthide, focus_nonintrusive);
+                client_set_desktop_recursive(it->data, target, donthide);
 }
 
 void client_set_desktop(ObClient *self, guint target,
-                        gboolean donthide, gboolean focus_nonintrusive)
+                        gboolean donthide)
 {
     self = client_search_top_normal_parent(self);
-    client_set_desktop_recursive(self, target, donthide, focus_nonintrusive);
+    client_set_desktop_recursive(self, target, donthide);
 }
 
 gboolean client_is_direct_child(ObClient *parent, ObClient *child)
@@ -3115,6 +3117,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
     gboolean modal = self->modal;
     gboolean iconic = self->iconic;
     gboolean demands_attention = self->demands_attention;
+    gboolean above = self->above;
+    gboolean below = self->below;
     gint i;
 
     if (!(action == prop_atoms.net_wm_state_add ||
@@ -3191,11 +3195,11 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
             } else if (state == prop_atoms.net_wm_state_fullscreen) {
                 fullscreen = TRUE;
             } else if (state == prop_atoms.net_wm_state_above) {
-                self->above = TRUE;
-                self->below = FALSE;
+                above = TRUE;
+                below = FALSE;
             } else if (state == prop_atoms.net_wm_state_below) {
-                self->above = FALSE;
-                self->below = TRUE;
+                above = FALSE;
+                below = TRUE;
             } else if (state == prop_atoms.net_wm_state_demands_attention) {
                 demands_attention = TRUE;
             } else if (state == prop_atoms.openbox_wm_state_undecorated) {
@@ -3220,9 +3224,9 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
             } else if (state == prop_atoms.net_wm_state_fullscreen) {
                 fullscreen = FALSE;
             } else if (state == prop_atoms.net_wm_state_above) {
-                self->above = FALSE;
+                above = FALSE;
             } else if (state == prop_atoms.net_wm_state_below) {
-                self->below = FALSE;
+                below = FALSE;
             } else if (state == prop_atoms.net_wm_state_demands_attention) {
                 demands_attention = FALSE;
             } else if (state == prop_atoms.openbox_wm_state_undecorated) {
@@ -3267,6 +3271,12 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2)
     if (demands_attention != self->demands_attention)
         client_hilite(self, demands_attention);
 
+    if (above != self->above || below != self->below) {
+        self->above = above;
+        self->below = below;
+        client_calc_layer(self);
+    }
+
     client_change_state(self); /* change the hint to reflect these changes */
 }
 
@@ -3386,7 +3396,7 @@ static void client_present(ObClient *self, gboolean here, gboolean raise)
         self->desktop != screen_desktop)
     {
         if (here)
-            client_set_desktop(self, screen_desktop, FALSE, FALSE);
+            client_set_desktop(self, screen_desktop, FALSE);
         else
             screen_set_desktop(self->desktop, FALSE);
     } else if (!self->frame->visible)
@@ -3412,37 +3422,18 @@ void client_activate(ObClient *self, gboolean here, gboolean user)
 {
     guint32 last_time = focus_client ? focus_client->user_time : CurrentTime;
     gboolean allow = FALSE;
-    gboolean relative = FALSE;
 
-    if (user || !focus_client)
+    /* if the request came from the user, or if nothing is focused, then grant
+       the request.
+       if the currently focused app doesn't set a user_time, then it can't
+       benefit from any focus stealing prevention.
+    */
+    if (user || !focus_client || !last_time)
         allow = TRUE;
-    /* if the request came from an application and something already has focus
-       then do some checks; */
-    else {
-        GSList *it;
-
-        /* search if someone related to us by transience already has focus */
-        for (it = client_search_all_top_parents(self); it && !relative;
-             it = g_slist_next(it))
-        {
-            if (client_search_transient(it->data, focus_client))
-                relative = TRUE;
-        }
-
-        /* search if someone in the group already has focus */
-        for (it = client_search_all_top_parents(self); it && !relative;
-             it = g_slist_next(it))
-        {
-            if (client_search_transient(it->data, focus_client))
-                relative = TRUE;
-        }
-
-        /* if a relative has focus, then if the time is newer (or we can't
-           check the time - very lenient), allow focus to move */
-        allow = relative && (!event_curtime || !last_time ||
-                             event_time_after(event_curtime, last_time));
-    }
-    
+    /* otherwise, if they didn't give a time stamp or if it is too old, they
+       don't get focus */
+    else
+        allow = event_curtime && event_time_after(event_curtime, last_time);
 
     ob_debug_type(OB_DEBUG_FOCUS,
                   "Want to activate window 0x%x with time %u (last time %u), "
@@ -3471,7 +3462,7 @@ static void client_bring_helper_windows_recursive(ObClient *self,
     if (client_helper(self) &&
         self->desktop != desktop && self->desktop != DESKTOP_ALL)
     {
-        client_set_desktop(self, desktop, FALSE, TRUE);
+        client_set_desktop(self, desktop, FALSE);
     }
 }
 
@@ -3913,17 +3904,3 @@ gboolean client_has_group_siblings(ObClient *self)
 {
     return self->group && self->group->members->next;
 }
-
-gboolean client_has_non_helper_group_siblings(ObClient *self)
-{
-    GSList *it;
-
-    if (!self->group) return FALSE;
-
-    for (it = self->group->members; it; it = g_slist_next(it)) {
-        ObClient *c = it->data;
-        if (c != self && client_normal(c) && !client_helper(c))
-            return TRUE;
-    }
-    return FALSE;
-}
This page took 0.027555 seconds and 4 git commands to generate.