all repos — openbox @ bba37f0cd103e033d77ed24cc1da92aa3d57f778

openbox fork - make it a bit more like ryudo

ignore enter events without disrupting the event queue
Dana Jansens danakj@orodu.net
commit

bba37f0cd103e033d77ed24cc1da92aa3d57f778

parent

18ef3dce1c0c93b5370c7b8bb322ba8ddd5deea3

1 files changed, 18 insertions(+), 28 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -1717,39 +1717,29 @@ {

ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); } +static Bool event_look_for_enters(Display *d, XEvent *e, XPointer arg) +{ + guint *count = (guint*)arg; + if (e->type == EnterNotify) { + ObWindow *win; + + win = g_hash_table_lookup(window_map, &e->xany.window); + if (win && WINDOW_IS_CLIENT(win)) + ++(*count); + } + return False; /* don't disrupt the focus order, just count them */ +} + void event_ignore_queued_enters() { - GSList *saved = NULL, *it; - XEvent *e; - gint i = 0; + XEvent e; XSync(ob_display, FALSE); - /* count the events */ - while (TRUE) { - e = g_new(XEvent, 1); - if (XCheckTypedEvent(ob_display, EnterNotify, e)) { - ObWindow *win; - - win = g_hash_table_lookup(window_map, &e->xany.window); - /* check to make sure we're not ignoring the same event multiple - times */ - if (win && WINDOW_IS_CLIENT(win) && i >= ignore_enter_focus) - ++ignore_enter_focus; - - saved = g_slist_append(saved, e); - ++i; - } else { - g_free(e); - break; - } - } - /* put the events back */ - for (it = saved; it; it = g_slist_next(it)) { - XPutBackEvent(ob_display, it->data); - g_free(it->data); - } - g_slist_free(saved); + /* count the events without disrupting them */ + XCheckIfEvent(ob_display, &e, event_look_for_enters, + (XPointer)&ignore_enter_focus); + } gboolean event_time_after(Time t1, Time t2)