summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-04-22 04:16:00 +0000
committerDana Jansens <danakj@orodu.net>2007-04-22 04:16:00 +0000
commit939fbcfd31e07a6e0f1cdbfcef9b04f63e6af700 (patch)
treefb5ba9c9de6eb445cac162c50b220a2a091345eb
parent8612fcfb99f4ed97f49c3617fd2ae291877c8c8e (diff)
add a comparitor to timers. use this in event.c to let you remove timers from the queue selectively for delayed focus
-rw-r--r--openbox/dock.c4
-rw-r--r--openbox/event.c60
-rw-r--r--openbox/focus.c3
-rw-r--r--openbox/frame.c1
-rw-r--r--openbox/keyboard.c3
-rw-r--r--openbox/mainloop.c5
-rw-r--r--openbox/mainloop.h1
-rw-r--r--openbox/menuframe.c2
-rw-r--r--openbox/startupnotify.c2
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);