X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=inline;f=openbox%2Fevent.c;h=d4d921efd229cb34d94af6b23cfcaaf9db8a4513;hb=091e296a3dd1020cdd4af2acbd35735778f05788;hp=cfc823b2e78c9b2514937d59c556837cf7992f39;hpb=c018e212200dfece62b49c6ed385d379eb4e45e9;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index cfc823b2..d4d921ef 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -78,11 +78,7 @@ static void focus_delay_client_dest(ObClient *client, gpointer data); static gboolean menu_hide_delay_func(gpointer data); -/* The most recent time at which an event with a timestamp occured. */ -static Time event_lasttime = 0; -/* The time for the current event being processed - (it's the event_lasttime for events without times, if this is a bug then - use CurrentTime instead, but it seems ok) */ +/* The time for the current event being processed */ Time event_curtime = CurrentTime; /*! The value of the mask for the NumLock modifier */ @@ -216,9 +212,9 @@ static Window event_get_window(XEvent *e) return window; } -static void event_set_lasttime(XEvent *e) +static void event_set_curtime(XEvent *e) { - Time t = 0; + Time t = CurrentTime; /* grab the lasttime and hack up the state */ switch (e->type) { @@ -248,14 +244,7 @@ static void event_set_lasttime(XEvent *e) break; } - if (t > event_lasttime) { - event_lasttime = t; - event_curtime = event_lasttime; - } else if (t == 0) { - event_curtime = event_lasttime; - } else { - event_curtime = t; - } + event_curtime = t; } #define STRIP_MODS(s) \ @@ -433,7 +422,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; @@ -452,9 +441,10 @@ static void event_process(const XEvent *ec, gpointer data) ob_debug("UNKNOWN FOCUS %s (d %d, m %d) window 0x%x\n", (e->type == FocusIn ? "IN" : "OUT"), detail, mode, window); + } #endif - event_set_lasttime(e); + event_set_curtime(e); event_hack_mods(e); if (event_ignore(e, client)) { if (ed) @@ -523,13 +513,17 @@ static void event_process(const XEvent *ec, gpointer data) if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) mouse_event(client, e); - else if (e->type == KeyPress) + else if (e->type == KeyPress) { keyboard_event((focus_cycle_target ? focus_cycle_target : (focus_hilite ? focus_hilite : client)), e); + } } } } + /* if something happens and it's not from an XEvent, then we don't know + the time */ + event_curtime = CurrentTime; } static void event_handle_root(XEvent *e) @@ -661,8 +655,12 @@ 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_set_client(NULL); + /* There is no FocusIn, this means focus went to a window that + is not being managed. most likely, this went to PointerRoot + or None, meaning the window is no longer around so fallback + focus, but not to that window */ + ob_debug("Focus went to a black hole !\n"); + focus_fallback(FALSE); } else if (ce.xany.window == e->xany.window) { /* If focus didn't actually move anywhere, there is nothing to do*/ break; @@ -672,12 +670,15 @@ static void event_handle_client(ObClient *client, XEvent *e) event_process(&ce, &ed); if (ed.ignored) { /* The FocusIn was ignored, this means it was on a window - that isn't a client? How did this happen? */ - g_assert_not_reached(); + that isn't a client. */ + ob_debug("Focus went to an unmanaged window 0x%x !\n", + ce.xfocus.window); + focus_fallback(TRUE); } } /* This client is no longer focused, so show that */ + focus_hilite = NULL; frame_adjust_focus(client->frame, FALSE); client_calc_layer(client); break; @@ -1284,9 +1285,11 @@ static gboolean focus_delay_func(gpointer data) ObClient *c = data; if (focus_client != c) { - client_focus(c); - if (config_focus_raise) - client_raise(c); + if (client_validate(c)) { + client_focus(c); + if (config_focus_raise) + client_raise(c); + } } return FALSE; /* no repeat */ }