X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fevent.c;h=7e66cc28ed6318c550bad537d96665a8127e68a6;hb=eb2a0feb0154e86a1c6c117fd0f6d1a18959b694;hp=7eef80174ad14a2084c4b60597294ec0c11682bc;hpb=ebbcacae15d51a7e36ebc27a8bb80bbe2b7c0a5f;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 7eef8017..7e66cc28 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -312,6 +312,7 @@ static gboolean wanted_focusevent(XEvent *e) { gint mode = e->xfocus.mode; gint detail = e->xfocus.detail; + Window win = e->xany.window; if (e->type == FocusIn) { @@ -326,6 +327,15 @@ static gboolean wanted_focusevent(XEvent *e) /* These are the ones we want.. */ + if (win == RootWindow(ob_display, ob_screen)) { + /* This means focus reverted off of a client */ + if (detail == NotifyPointerRoot || detail == NotifyDetailNone || + detail == NotifyInferior) + return TRUE; + else + return FALSE; + } + /* This means focus moved from the root window to a client */ if (detail == NotifyVirtual) return TRUE; @@ -333,6 +343,10 @@ static gboolean wanted_focusevent(XEvent *e) if (detail == NotifyNonlinearVirtual) return TRUE; + /* This means focus reverted off of a client */ + if (detail == NotifyInferior) + return TRUE; + /* Otherwise.. */ return FALSE; } else { @@ -345,6 +359,10 @@ static gboolean wanted_focusevent(XEvent *e) if (mode == NotifyGrab) return FALSE; + /* Focus left the root window revertedto state */ + if (win == RootWindow(ob_display, ob_screen)) + return FALSE; + /* These are the ones we want.. */ /* This means focus moved from a client to the root window */ @@ -422,7 +440,7 @@ static void event_process(const XEvent *ec, gpointer data) } } -#if 0 /* focus debugging stuff */ +#if 1 /* focus debugging stuff */ if (e->type == FocusIn || e->type == FocusOut) { gint mode = e->xfocus.mode; gint detail = e->xfocus.detail; @@ -542,6 +560,7 @@ static void event_handle_root(XEvent *e) msgtype = e->xclient.message_type; if (msgtype == prop_atoms.net_current_desktop) { guint d = e->xclient.data.l[0]; + event_curtime = e->xclient.data.l[1]; if (d < screen_num_desktops) screen_set_desktop(d); } else if (msgtype == prop_atoms.net_number_of_desktops) { @@ -655,19 +674,34 @@ static void event_handle_client(ObClient *client, XEvent *e) case FocusOut: /* Look for the followup FocusIn */ if (!XCheckIfEvent(ob_display, &ce, look_for_focusin, NULL)) { - /* There is no FocusIn, move focus where we can still hear events*/ - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); + /* There is no FocusIn, this means focus went to a window that + is not being managed, or a window on another screen. */ + ob_debug("Focus went to a black hole !\n"); } else if (ce.xany.window == e->xany.window) { /* If focus didn't actually move anywhere, there is nothing to do*/ break; + } else if (ce.xfocus.detail == NotifyPointerRoot || + ce.xfocus.detail == NotifyDetailNone) { + ob_debug("Focus went to root\n"); + /* Focus has been reverted to the root window or nothing, so fall + back to something other than the window which just had it. */ + focus_fallback(FALSE); + } else if (ce.xfocus.detail == NotifyInferior) { + ob_debug("Focus went to parent\n"); + /* Focus has been reverted to parent, which is our frame window, + or the root window, so fall back to something other than the + window which had it. */ + focus_fallback(FALSE); } else { /* Focus did move, so process the FocusIn event */ - ObEventData ed; + ObEventData ed = { .ignored = FALSE }; event_process(&ce, &ed); if (ed.ignored) { /* The FocusIn was ignored, this means it was on a window that isn't a client. */ - focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); + ob_debug("Focus went to an unmanaged window 0x%x !\n", + ce.xfocus.window); + focus_fallback(TRUE); } } @@ -874,6 +908,10 @@ static void event_handle_client(ObClient *client, XEvent *e) } break; case UnmapNotify: + ob_debug("UnmapNotify for window 0x%x eventwin 0x%x sendevent %d " + "ignores left %d\n", + client->window, e->xunmap.event, e->xunmap.from_configure, + client->ignore_unmaps); if (client->ignore_unmaps) { client->ignore_unmaps--; break; @@ -881,6 +919,7 @@ static void event_handle_client(ObClient *client, XEvent *e) client_unmanage(client); break; case DestroyNotify: + ob_debug("DestroyNotify for window 0x%x\n", client->window); client_unmanage(client); break; case ReparentNotify: @@ -898,6 +937,7 @@ static void event_handle_client(ObClient *client, XEvent *e) X server to deal with after we unmanage the window */ XPutBackEvent(ob_display, e); + ob_debug("ReparentNotify for window 0x%x\n", client->window); client_unmanage(client); break; case MapRequest: @@ -907,7 +947,7 @@ static void event_handle_client(ObClient *client, XEvent *e) it can happen now when the window is on another desktop, but we still don't want it! */ - client_activate(client, FALSE, TRUE, CurrentTime); + client_activate(client, FALSE, TRUE); break; case ClientMessage: /* validate cuz we query stuff off the client here */ @@ -966,11 +1006,11 @@ static void event_handle_client(ObClient *client, XEvent *e) (e->xclient.data.l[0] == 0 ? "unknown" : (e->xclient.data.l[0] == 1 ? "application" : (e->xclient.data.l[0] == 2 ? "user" : "INVALID")))); - /* XXX make use of data.l[1] and [2] ! */ + /* XXX make use of data.l[2] ! */ + event_curtime = e->xclient.data.l[1]; client_activate(client, FALSE, (e->xclient.data.l[0] == 0 || - e->xclient.data.l[0] == 2), - e->xclient.data.l[1]); + e->xclient.data.l[0] == 2)); } else if (msgtype == prop_atoms.net_wm_moveresize) { ob_debug("net_wm_moveresize for 0x%lx direction %d\n", client->window, e->xclient.data.l[2]);