]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
add <underMouse> focus option
[chaz/openbox] / openbox / client.c
index e5666c0a55e098179dc1620ce065da1fab5442b9..9b4932a0fe2f1c940db314166b04a2982ccab68c 100644 (file)
@@ -644,9 +644,11 @@ void client_unmanage(ObClient *self)
     /* flush to send the hide to the server quickly */
     XFlush(ob_display);
 
-    /* ignore enter events from the unmap so it doesnt mess with the
-       focus */
-    event_ignore_all_queued_enters();
+    if (!client_focused(self) || !config_focus_under_mouse) {
+        /* ignore enter events from the unmap so it doesnt mess with the
+           focus */
+        event_ignore_all_queued_enters();
+    }
 
     mouse_grab_for_client(self, FALSE);
 
@@ -2310,7 +2312,7 @@ static void client_change_wm_state(ObClient *self)
 
 static void client_change_state(ObClient *self)
 {
-    gulong netstate[11];
+    gulong netstate[12];
     guint num;
 
     num = 0;
@@ -2898,7 +2900,20 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
     if (fmoved || fresized)
         frame_adjust_area(self->frame, fmoved, fresized, FALSE);
 
-    if ((!user || (user && final)) && !resized)
+    /* This is kinda tricky and should not be changed.. let me explain!
+
+       When user = FALSE, then the request is coming from the application
+       itself, and we are more strict about when to send a synthetic
+       ConfigureNotify.  We strictly follow the rules of the ICCCM sec 4.1.5
+       in this case.
+
+       When user = TRUE, then the request is coming from "us", like when we
+       maximize a window or sometihng.  In this case we are more lenient.  We
+       used to follow the same rules as above, but _Java_ Swing can't handle
+       this. So just to appease Swing, when user = TRUE, we always send
+       a synthetic ConfigureNotify to give the window its root coordinates.
+    */
+    if ((!user && !resized) || (user && final))
     {
         XEvent event;
 
@@ -3233,8 +3248,7 @@ void client_set_desktop_recursive(ObClient *self,
                 client_set_desktop_recursive(it->data, target, donthide);
 }
 
-void client_set_desktop(ObClient *self, guint target,
-                        gboolean donthide)
+void client_set_desktop(ObClient *self, guint target, gboolean donthide)
 {
     self = client_search_top_normal_parent(self);
     client_set_desktop_recursive(self, target, donthide);
@@ -3864,13 +3878,12 @@ ObClient *client_search_transient(ObClient *self, ObClient *search)
 }
 
 #define WANT_EDGE(cur, c) \
-            if(cur == c)                                                      \
-                continue;                                                     \
-            if(!client_normal(cur))                                           \
+            if (cur == c)                                                     \
                 continue;                                                     \
-            if(screen_desktop != cur->desktop && cur->desktop != DESKTOP_ALL) \
+            if (c->desktop != cur->desktop && cur->desktop != DESKTOP_ALL &&  \
+                cur->desktop != screen_desktop)                               \
                 continue;                                                     \
-            if(cur->iconic)                                                   \
+            if (cur->iconic)                                                  \
                 continue;
 
 #define HIT_EDGE(my_edge_start, my_edge_end, his_edge_start, his_edge_end) \
This page took 0.02384 seconds and 4 git commands to generate.