]> Dogcows Code - chaz/openbox/blobdiff - openbox/focus.c
change some of the hooks, and add all the hooks to the code so that they run
[chaz/openbox] / openbox / focus.c
index 68b0b7f90ecba6f07061939b4c847fef99b4b3ce..5eb27bc4be574aec7a14a7eef29ad3da65de750b 100644 (file)
@@ -27,6 +27,7 @@
 #include "focus_cycle.h"
 #include "screen.h"
 #include "keyboard.h"
+#include "hooks.h"
 #include "focus.h"
 #include "stacking.h"
 #include "obt/prop.h"
@@ -57,6 +58,14 @@ void focus_shutdown(gboolean reconfig)
 
 static void push_to_top(ObClient *client)
 {
+    ObClient *p;
+
+    /* if it is modal for a single window, then put that window at the top
+       of the focus order first, so it will be right after ours. the same is
+       done with stacking */
+    if (client->modal && (p = client_direct_parent(client)))
+        push_to_top(p);
+
     focus_order = g_list_remove(focus_order, client);
     focus_order = g_list_prepend(focus_order, client);
 }
@@ -64,6 +73,7 @@ static void push_to_top(ObClient *client)
 void focus_set_client(ObClient *client)
 {
     Window active;
+    ObClient *old;
 
     ob_debug_type(OB_DEBUG_FOCUS,
                   "focus_set_client 0x%lx", client ? client->window : 0);
@@ -79,6 +89,7 @@ void focus_set_client(ObClient *client)
     focus_cycle_stop(focus_client);
     focus_cycle_stop(client);
 
+    old = focus_client;
     focus_client = client;
 
     if (client != NULL) {
@@ -93,6 +104,9 @@ void focus_set_client(ObClient *client)
         active = client ? client->window : None;
         OBT_PROP_SET32(obt_root(ob_screen), NET_ACTIVE_WINDOW, WINDOW, active);
     }
+
+    hooks_run(OB_HOOK_WIN_UNFOCUS, old);
+    hooks_run(OB_HOOK_WIN_FOCUS, client);
 }
 
 static ObClient* focus_fallback_target(gboolean allow_refocus,
@@ -188,13 +202,6 @@ void focus_nothing(void)
     /* nothing is focused, update the colormap and _the root property_ */
     focus_set_client(NULL);
 
-    /* if there is a grab going on, then we need to cancel it. if we move
-       focus during the grab, applications will get NotifyWhileGrabbed events
-       and ignore them !
-
-       actions should not rely on being able to move focus during an
-       interactive grab.
-    */
     event_cancel_all_key_grabs();
 
     /* when nothing will be focused, send focus to the backup target */
This page took 0.02667 seconds and 4 git commands to generate.