X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=c63f6fea7bf3728924a43c5ad5f49fcb61510d1d;hb=2b135c53565547779719348ec3164311be8191fe;hp=a75d7711032d6342234c7c02a59e917ea69adff0;hpb=4940d007cce43a135f1b448902f5a3571dbce62a;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index a75d7711..c63f6fea 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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); } } @@ -1064,6 +1064,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 +1076,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; @@ -1420,9 +1425,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); @@ -1863,11 +1875,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,19 +1889,17 @@ 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 (e->xany.serial > r->end) { + if ((glong)(e->xany.serial - r->end) > 0) { + /* past the end */ ignore_serials = g_slist_delete_link(ignore_serials, it); g_free(r); } - else if (e->xany.serial >= r->start) + else if ((glong)(e->xany.serial - r->start) >= 0) return TRUE; } return FALSE;