summaryrefslogtreecommitdiff
path: root/openbox/event.c
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 /openbox/event.c
parent8612fcfb99f4ed97f49c3617fd2ae291877c8c8e (diff)
add a comparitor to timers. use this in event.c to let you remove timers from the queue selectively for delayed focus
Diffstat (limited to 'openbox/event.c')
-rw-r--r--openbox/event.c60
1 files changed, 36 insertions, 24 deletions
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);
}