From 939fbcfd31e07a6e0f1cdbfcef9b04f63e6af700 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 22 Apr 2007 04:16:00 +0000 Subject: [PATCH] add a comparitor to timers. use this in event.c to let you remove timers from the queue selectively for delayed focus --- openbox/dock.c | 4 +-- openbox/event.c | 60 ++++++++++++++++++++++++----------------- openbox/focus.c | 3 --- openbox/frame.c | 1 + openbox/keyboard.c | 3 ++- openbox/mainloop.c | 5 +++- openbox/mainloop.h | 1 + openbox/menuframe.c | 2 +- openbox/startupnotify.c | 2 ++ 9 files changed, 49 insertions(+), 32 deletions(-) diff --git a/openbox/dock.c b/openbox/dock.c index 53c79139..70e11272 100644 --- a/openbox/dock.c +++ b/openbox/dock.c @@ -616,14 +616,14 @@ void dock_hide(gboolean hide) if (!hide) { if (dock->hidden && config_dock_hide) { ob_main_loop_timeout_add(ob_main_loop, config_dock_show_delay, - show_timeout, NULL, NULL); + show_timeout, NULL, g_direct_equal, NULL); } else if (!dock->hidden && config_dock_hide) { ob_main_loop_timeout_remove(ob_main_loop, hide_timeout); } } else { if (!dock->hidden && config_dock_hide) { ob_main_loop_timeout_add(ob_main_loop, config_dock_hide_delay, - hide_timeout, NULL, NULL); + hide_timeout, NULL, g_direct_equal, NULL); } else if (dock->hidden && config_dock_hide) { ob_main_loop_timeout_remove(ob_main_loop, show_timeout); } diff --git a/openbox/event.c b/openbox/event.c index 67afabc9..9a1e13dc 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -79,6 +79,8 @@ static void event_handle_dockapp(ObDockApp *app, XEvent *e); static void event_handle_client(ObClient *c, XEvent *e); static void event_handle_group(ObGroup *g, XEvent *e); +static void focus_delay_dest(gpointer data); +static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2); static gboolean focus_delay_func(gpointer data); static void focus_delay_client_dest(ObClient *client, gpointer data); @@ -104,11 +106,6 @@ static guint ignore_enter_focus = 0; static gboolean menu_can_hide; -static ObFocusDelayData focus_delay_data = { .client = NULL, - .time = CurrentTime }; - - - #ifdef USE_SM static void ice_handler(gint fd, gpointer conn) { @@ -542,7 +539,7 @@ static void event_process(const XEvent *ec, gpointer data) ob_main_loop_timeout_add(ob_main_loop, config_menu_hide_delay * 1000, menu_hide_delay_func, - NULL, NULL); + NULL, g_direct_equal, NULL); if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) @@ -627,19 +624,23 @@ void event_enter_client(ObClient *client) if (client_normal(client) && client_can_focus(client)) { if (config_focus_delay) { + ObFocusDelayData *data; + ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); - focus_delay_data.client = client; - focus_delay_data.time = event_curtime; + data = g_new(ObFocusDelayData, 1); + data->client = client; + data->time = event_curtime; ob_main_loop_timeout_add(ob_main_loop, config_focus_delay, focus_delay_func, - NULL, NULL); + data, focus_delay_cmp, focus_delay_dest); } else { - focus_delay_data.client = client; - focus_delay_data.time = event_curtime; - focus_delay_func(NULL); + ObFocusDelayData data; + data.client = client; + data.time = event_curtime; + focus_delay_func(&data); } } } @@ -760,11 +761,10 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: - if (config_focus_follow && config_focus_delay && - focus_delay_data.client == client) - { - event_halt_focus_delay(); - } + if (config_focus_follow && config_focus_delay) + ob_main_loop_timeout_remove_data(ob_main_loop, + focus_delay_func, + client, FALSE); break; default: break; @@ -1340,13 +1340,26 @@ static gboolean menu_hide_delay_func(gpointer data) return FALSE; /* no repeat */ } +static void focus_delay_dest(gpointer data) +{ + g_free(data); +} + +static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2) +{ + const ObFocusDelayData *f1 = d1, *f2 = d2; + return f1->client == f2->client; +} + static gboolean focus_delay_func(gpointer data) { + ObFocusDelayData *d = data; Time old = event_curtime; - event_curtime = focus_delay_data.time; - if (focus_client != focus_delay_data.client) { - if (client_focus(focus_delay_data.client) && config_focus_raise) - client_raise(focus_delay_data.client); + + event_curtime = d->time; + if (focus_client != d->client) { + if (client_focus(d->client) && config_focus_raise) + client_raise(d->client); } event_curtime = old; return FALSE; /* no repeat */ @@ -1354,8 +1367,8 @@ static gboolean focus_delay_func(gpointer data) static void focus_delay_client_dest(ObClient *client, gpointer data) { - if (focus_delay_data.client == client) - event_halt_focus_delay(); + ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, + client, FALSE); } static void event_client_dest(ObClient *client, gpointer data) @@ -1366,7 +1379,6 @@ static void event_client_dest(ObClient *client, gpointer data) void event_halt_focus_delay() { - focus_delay_data.client = NULL; ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func); } diff --git a/openbox/focus.c b/openbox/focus.c index 32a715ef..197948e9 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -282,9 +282,6 @@ void focus_fallback(gboolean allow_refocus) */ focus_set_client(NULL); - /* If some delayed focusing is going on, cancel it */ - event_halt_focus_delay(); - if ((new = focus_fallback_target(allow_refocus, old))) client_focus(new); } diff --git a/openbox/frame.c b/openbox/frame.c index 554e7b55..052f12df 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -977,6 +977,7 @@ void frame_flash_start(ObFrame *self) G_USEC_PER_SEC * 0.6, flash_timeout, self, + g_direct_equal, flash_done); g_get_current_time(&self->flash_end); g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 5); diff --git a/openbox/keyboard.c b/openbox/keyboard.c index b95b0805..01b54b4c 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -271,7 +271,8 @@ void keyboard_event(ObClient *client, const XEvent *e) ob_main_loop_timeout_remove(ob_main_loop, chain_timeout); /* 5 second timeout for chains */ ob_main_loop_timeout_add(ob_main_loop, 5 * G_USEC_PER_SEC, - chain_timeout, NULL, NULL); + chain_timeout, NULL, + g_direct_equal, NULL); grab_keys(FALSE); curpos = p; grab_keys(TRUE); diff --git a/openbox/mainloop.c b/openbox/mainloop.c index e6914f89..62261dde 100644 --- a/openbox/mainloop.c +++ b/openbox/mainloop.c @@ -99,6 +99,7 @@ struct _ObMainLoopTimer gulong delay; GSourceFunc func; gpointer data; + GEqualFunc equal; GDestroyNotify destroy; /* The timer needs to be freed */ @@ -585,12 +586,14 @@ void ob_main_loop_timeout_add(ObMainLoop *loop, gulong microseconds, GSourceFunc handler, gpointer data, + GEqualFunc cmp, GDestroyNotify notify) { ObMainLoopTimer *t = g_new(ObMainLoopTimer, 1); t->delay = microseconds; t->func = handler; t->data = data; + t->equal = cmp; t->destroy = notify; t->del_me = FALSE; g_get_current_time(&loop->now); @@ -619,7 +622,7 @@ void ob_main_loop_timeout_remove_data(ObMainLoop *loop, GSourceFunc handler, for (it = loop->timers; it; it = g_slist_next(it)) { ObMainLoopTimer *t = it->data; - if (t->func == handler && t->data == data) { + if (t->func == handler && t->equal(t->data, data)) { t->del_me = TRUE; if (cancel_dest) t->destroy = NULL; diff --git a/openbox/mainloop.h b/openbox/mainloop.h index 9530f2a6..47591850 100644 --- a/openbox/mainloop.h +++ b/openbox/mainloop.h @@ -61,6 +61,7 @@ void ob_main_loop_timeout_add(ObMainLoop *loop, gulong microseconds, GSourceFunc handler, gpointer data, + GEqualFunc cmp, GDestroyNotify notify); void ob_main_loop_timeout_remove(ObMainLoop *loop, GSourceFunc handler); diff --git a/openbox/menuframe.c b/openbox/menuframe.c index 6a8b2c4e..f359c985 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -918,7 +918,7 @@ void menu_frame_select(ObMenuFrame *self, ObMenuEntryFrame *entry) ob_main_loop_timeout_add(ob_main_loop, config_submenu_show_delay * 1000, menu_entry_frame_submenu_timeout, - self->selected, + self->selected, g_direct_equal, NULL); } else { menu_entry_frame_show_submenu(self->selected); diff --git a/openbox/startupnotify.c b/openbox/startupnotify.c index bf1f44ac..5b5723e5 100644 --- a/openbox/startupnotify.c +++ b/openbox/startupnotify.c @@ -144,6 +144,7 @@ static void sn_event_func(SnMonitorEvent *ev, gpointer data) have a timeout */ ob_main_loop_timeout_add(ob_main_loop, 30 * G_USEC_PER_SEC, sn_wait_timeout, seq, + g_direct_equal, (GDestroyNotify)sn_startup_sequence_unref); change = TRUE; break; @@ -256,6 +257,7 @@ void sn_setup_spawn_environment(gchar *program, gchar *name, sn_launcher_context_ref(sn_launcher); ob_main_loop_timeout_add(ob_main_loop, 30 * G_USEC_PER_SEC, sn_launch_wait_timeout, sn_launcher, + g_direct_equal, (GDestroyNotify)sn_launcher_context_unref); setenv("DESKTOP_STARTUP_ID", id, TRUE); -- 2.44.0