]> Dogcows Code - chaz/openbox/commitdiff
use the timestamp from the original enter when delay-focusing a window
authorDana Jansens <danakj@orodu.net>
Sun, 22 Apr 2007 02:34:05 +0000 (02:34 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 22 Apr 2007 02:34:05 +0000 (02:34 +0000)
openbox/event.c

index 1f5bae13287b6427cc29cc0b2e17dcc1fc33db89..8329f0287b3c35c94b49e52f84c32ae88b3daacf 100644 (file)
@@ -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 */
 }
 
This page took 0.027752 seconds and 4 git commands to generate.