fix stupid apps focusing. yah.
This commit is contained in:
parent
2f5727ffe9
commit
c1a5ad45a8
1 changed files with 35 additions and 12 deletions
|
@ -421,20 +421,43 @@ static void event_process(const XEvent *ec, gpointer data)
|
||||||
event_handle_menu(e);
|
event_handle_menu(e);
|
||||||
} else if (e->type == FocusIn) {
|
} else if (e->type == FocusIn) {
|
||||||
if (e->xfocus.detail == NotifyPointerRoot ||
|
if (e->xfocus.detail == NotifyPointerRoot ||
|
||||||
e->xfocus.detail == NotifyDetailNone)
|
e->xfocus.detail == NotifyDetailNone ||
|
||||||
|
e->xfocus.detail == NotifyInferior)
|
||||||
{
|
{
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
|
XEvent ce;
|
||||||
/* Focus has been reverted to the root window or nothing.
|
ob_debug_type(OB_DEBUG_FOCUS,
|
||||||
|
"Focus went to pointer root/none or to our frame "
|
||||||
|
"window\n");
|
||||||
|
|
||||||
|
/* If another FocusIn is in the queue then don't fallback yet. This
|
||||||
|
fixes the fun case of:
|
||||||
|
window map -> send focusin
|
||||||
|
window unmap -> get focusout
|
||||||
|
window map -> send focusin
|
||||||
|
get first focus out -> fall back to something (new window
|
||||||
|
hasn't received focus yet, so something else) -> send focusin
|
||||||
|
which means the "something else" is the last thing to get a
|
||||||
|
focusin sent to it, so the new window doesn't end up with focus.
|
||||||
|
*/
|
||||||
|
if (XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) {
|
||||||
|
XPutBackEvent(ob_display, &ce);
|
||||||
|
ob_debug_type(OB_DEBUG_FOCUS,
|
||||||
|
" but another FocusIn is coming\n)");
|
||||||
|
} else {
|
||||||
|
/* Focus has been reverted to the root window, nothing, or to
|
||||||
|
our frame window.
|
||||||
|
|
||||||
FocusOut events come after UnmapNotify, so we don't need to
|
FocusOut events come after UnmapNotify, so we don't need to
|
||||||
worry about focusing an invalid window
|
worry about focusing an invalid window
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* In this case we know focus is in our screen */
|
||||||
|
if (e->xfocus.detail == NotifyInferior)
|
||||||
|
focus_left_screen = FALSE;
|
||||||
|
|
||||||
if (!focus_left_screen)
|
if (!focus_left_screen)
|
||||||
focus_fallback(TRUE);
|
focus_fallback(TRUE);
|
||||||
} else if (e->xfocus.detail == NotifyInferior) {
|
}
|
||||||
ob_debug_type(OB_DEBUG_FOCUS,
|
|
||||||
"Focus went to root or our frame window");
|
|
||||||
/* Focus has been given to the root window. */
|
|
||||||
focus_fallback(TRUE);
|
|
||||||
} else if (client && client != focus_client) {
|
} else if (client && client != focus_client) {
|
||||||
focus_left_screen = FALSE;
|
focus_left_screen = FALSE;
|
||||||
frame_adjust_focus(client->frame, TRUE);
|
frame_adjust_focus(client->frame, TRUE);
|
||||||
|
|
Loading…
Reference in a new issue