summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-04-22 02:34:05 +0000
committerDana Jansens <danakj@orodu.net>2007-04-22 02:34:05 +0000
commit5009498d5934944c70b6c520ca45a727800e9528 (patch)
tree8ee38dd8fefdeb7c4a6541b9a08666c8f9b3e356
parenta5caab959cc5d99ed570d7346fd022e32900c103 (diff)
use the timestamp from the original enter when delay-focusing a window
-rw-r--r--openbox/event.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/openbox/event.c b/openbox/event.c
index 1f5bae13..8329f028 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -64,6 +64,12 @@ typedef struct
gboolean ignored;
} ObEventData;
+typedef struct
+{
+ ObClient *client;
+ Time time;
+} ObFocusDelayData;
+
static void event_process(const XEvent *e, gpointer data);
static void event_client_dest(ObClient *client, gpointer data);
static void event_handle_root(XEvent *e);
@@ -73,6 +79,7 @@ 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_destroy(gpointer data);
static gboolean focus_delay_func(gpointer data);
static void focus_delay_client_dest(ObClient *client, gpointer data);
@@ -98,6 +105,11 @@ 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)
{
@@ -617,12 +629,16 @@ void event_enter_client(ObClient *client)
if (client_normal(client) && client_can_focus(client)) {
if (config_focus_delay) {
ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
+
+ focus_delay_data.client = client;
+ focus_delay_data.time = event_curtime;
+
ob_main_loop_timeout_add(ob_main_loop,
config_focus_delay,
focus_delay_func,
- client, NULL);
+ NULL, focus_delay_destroy);
} else
- focus_delay_func(client);
+ focus_delay_func(NULL);
}
}
@@ -1316,14 +1332,21 @@ static gboolean menu_hide_delay_func(gpointer data)
return FALSE; /* no repeat */
}
-static gboolean focus_delay_func(gpointer data)
+static void focus_delay_destroy(gpointer data)
{
- ObClient *c = data;
+ focus_delay_data.client = NULL;
+ focus_delay_data.time = CurrentTime;
+}
- if (focus_client != c) {
- if (client_focus(c) && config_focus_raise)
- client_raise(c);
+static gboolean focus_delay_func(gpointer 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 = old;
return FALSE; /* no repeat */
}