ignore enter events without disrupting the event queue

This commit is contained in:
Dana Jansens 2007-05-17 23:20:50 +00:00
parent 18ef3dce1c
commit bba37f0cd1

View file

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