]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
very cool struts. partial struts actually are partial struts now. possibly way broken...
[chaz/openbox] / openbox / event.c
index 9f1146a323bdff759e2c08d8bb4dc6ef442898a6..ccf4bb65ece5402ac0b5960fed327a6bbfa05c4b 100644 (file)
@@ -499,7 +499,7 @@ static void event_process(const XEvent *ec, gpointer data)
 
             focus_left_screen = FALSE;
 
-            focus_fallback(FALSE, FALSE);
+            focus_fallback(FALSE, config_focus_under_mouse, TRUE);
 
             /* We don't get a FocusOut for this case, because it's just moving
                from our Inferior up to us. This happens when iconifying a
@@ -551,7 +551,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 */
 
                 if (!focus_left_screen)
-                    focus_fallback(FALSE, FALSE);
+                    focus_fallback(FALSE, config_focus_under_mouse, TRUE);
             }
         }
         else if (!client)
@@ -607,7 +607,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 ob_debug_type(OB_DEBUG_FOCUS,
                               "Focus went to an unmanaged window 0x%x !\n",
                               ce.xfocus.window);
-                focus_fallback(TRUE, FALSE);
+                focus_fallback(TRUE, config_focus_under_mouse, TRUE);
             }
         }
 
@@ -723,6 +723,7 @@ static void event_handle_root(XEvent *e)
         } else if (msgtype == prop_atoms.net_showing_desktop) {
             screen_show_desktop(e->xclient.data.l[0] != 0, NULL);
         } else if (msgtype == prop_atoms.ob_control) {
+            ob_debug("OB_CONTROL: %d\n", e->xclient.data.l[0]);
             if (e->xclient.data.l[0] == 1)
                 ob_reconfigure();
             else if (e->xclient.data.l[0] == 2)
@@ -730,8 +731,10 @@ static void event_handle_root(XEvent *e)
         }
         break;
     case PropertyNotify:
-        if (e->xproperty.atom == prop_atoms.net_desktop_names)
+        if (e->xproperty.atom == prop_atoms.net_desktop_names) {
+            ob_debug("UPDATE DESKTOP NAMES\n");
             screen_update_desktop_names();
+        }
         else if (e->xproperty.atom == prop_atoms.net_desktop_layout)
             screen_update_layout();
         break;
@@ -1064,6 +1067,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         if (e->xconfigurerequest.value_mask & CWStackMode) {
             ObClient *sibling = NULL;
+            gulong ignore_start;
 
             /* get the sibling */
             if (e->xconfigurerequest.value_mask & CWSibling) {
@@ -1075,9 +1079,13 @@ static void event_handle_client(ObClient *client, XEvent *e)
             }
 
             /* activate it rather than just focus it */
+            if (!config_focus_under_mouse)
+                ignore_start = event_start_ignore_all_enters();
             stacking_restack_request(client, sibling,
                                      e->xconfigurerequest.detail,
                                      TRUE);
+            if (!config_focus_under_mouse)
+                event_end_ignore_all_enters(ignore_start);
 
             /* if a stacking change moves the window without resizing */
             move = TRUE;
@@ -1150,8 +1158,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
                notify is sent or not */
         }
 
-        if (move || resize) {
+        {
             gint lw,lh;
+            gulong ignore_start;
 
             client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
 
@@ -1168,18 +1177,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
             client_find_onscreen(client, &x, &y, w, h, FALSE);
 
-            /* if they requested something that moves the window, or if
-               the window is actually being changed then configure it and
-               send a configure notify to them */
-            if (move || !RECT_EQUAL_DIMS(client->area, x, y, w, h)) {
-                gulong ignore_start;
-
-                ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
-                         x, y, w, h);
-                ignore_start = event_start_ignore_all_enters();
-                client_configure(client, x, y, w, h, FALSE, TRUE);
-                event_end_ignore_all_enters(ignore_start);
-            }
+            ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
+                     x, y, w, h);
+            ignore_start = event_start_ignore_all_enters();
+            client_configure(client, x, y, w, h, FALSE, TRUE);
+            event_end_ignore_all_enters(ignore_start);
         }
         break;
     }
@@ -1420,9 +1422,16 @@ static void event_handle_client(ObClient *client, XEvent *e)
                     e->xclient.data.l[2] == TopIf ||
                     e->xclient.data.l[2] == Opposite)
                 {
+                    gulong ignore_start;
+
+                    if (!config_focus_under_mouse)
+                        ignore_start = event_start_ignore_all_enters();
                     /* just raise, don't activate */
                     stacking_restack_request(client, sibling,
                                              e->xclient.data.l[2], FALSE);
+                    if (!config_focus_under_mouse)
+                        event_end_ignore_all_enters(ignore_start);
+
                     /* send a synthetic ConfigureNotify, cuz this is supposed
                        to be like a ConfigureRequest. */
                     client_reconfigure(client);
@@ -1472,9 +1481,27 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         msgtype = e->xproperty.atom;
         if (msgtype == XA_WM_NORMAL_HINTS) {
+            gint x, y, w, h, lw, lh;
+
+            ob_debug("Update NORMAL hints\n");
             client_update_normal_hints(client);
             /* normal hints can make a window non-resizable */
-            client_setup_decor_and_functions(client, TRUE);
+            client_setup_decor_and_functions(client, FALSE);
+
+            /* make sure the client's sizes are within its bounds, but only
+               reconfigure the window if it needs to. emacs will update its
+               normal hints every time it receives a conigurenotify */
+            RECT_TO_DIMS(client->area, x, y, w, h);
+            client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
+            if (!RECT_EQUAL_DIMS(client->area, x, y, w, h)) {
+                gulong ignore_start;
+
+                ob_debug("Configuring client x %d y %d w %d h %d\n",
+                         x, y, w, h);
+                ignore_start = event_start_ignore_all_enters();
+                client_configure(client, x, y, w, h, FALSE, TRUE);
+                event_end_ignore_all_enters(ignore_start);
+            }
         } else if (msgtype == XA_WM_HINTS) {
             client_update_wmhints(client);
         } else if (msgtype == XA_WM_TRANSIENT_FOR) {
@@ -1803,10 +1830,9 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
                in the case where it is animating before disappearing */
             if (!client || !frame_iconify_animating(client->frame))
                 mouse_event(client, e);
-        } else if (e->type == KeyPress) {
+        } else
             keyboard_event((focus_cycle_target ? focus_cycle_target :
                             (client ? client : focus_client)), e);
-        }
     }
 }
 
@@ -1863,11 +1889,9 @@ void event_end_ignore_all_enters(gulong start)
     r->start = start;
     r->end = LastKnownRequestProcessed(ob_display);
     ignore_serials = g_slist_prepend(ignore_serials, r);
-    ob_debug("ignoring serials %u-%u\n", r->start, r->end);
 
     /* increment the serial so we don't ignore events we weren't meant to */
     XSync(ob_display, FALSE);
-    ob_debug("now last serial %u\n", LastKnownRequestProcessed(ob_display));
 }
 
 static gboolean is_enter_focus_event_ignored(XEvent *e)
@@ -1879,14 +1903,11 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
                e->xcrossing.mode == NotifyUngrab ||
                e->xcrossing.detail == NotifyInferior));
 
-    ob_debug("checking serial %u\n", e->xany.serial);
     for (it = ignore_serials; it; it = next) {
         ObSerialRange *r = it->data;
 
         next = g_slist_next(it);
 
-        /* XXX wraparound... */
-        ob_debug("  ignore range %u-%u\n", r->start, r->end);
         if ((glong)(e->xany.serial - r->end) > 0) {
             /* past the end */
             ignore_serials = g_slist_delete_link(ignore_serials, it);
@@ -1900,21 +1921,20 @@ static gboolean is_enter_focus_event_ignored(XEvent *e)
 
 void event_cancel_all_key_grabs()
 {
-    if (keyboard_interactively_grabbed())
+    if (keyboard_interactively_grabbed()) {
         keyboard_interactive_cancel();
-    else if (menu_frame_visible)
+        ob_debug("KILLED interactive event\n");
+    }
+    else if (menu_frame_visible) {
         menu_frame_hide_all();
-    else if (grab_on_keyboard())
+        ob_debug("KILLED open menus\n");
+    }
+    else if (grab_on_keyboard()) {
         ungrab_keyboard();
+        ob_debug("KILLED active grab on keyboard\n");
+    }
     else
-        /* If we don't have the keyboard grabbed, then ungrab it with
-           XUngrabKeyboard, so that there is not a passive grab left
-           on from the KeyPress. If the grab is left on, and focus
-           moves during that time, it will be NotifyWhileGrabbed, and
-           applications like to ignore those! */
-        if (!keyboard_interactively_grabbed())
-            XUngrabKeyboard(ob_display, CurrentTime);
-
+        ungrab_passive_key();
 }
 
 gboolean event_time_after(Time t1, Time t2)
This page took 0.029979 seconds and 4 git commands to generate.