add the focusDelay option
authorDana Jansens <danakj@orodu.net>
Wed, 3 Sep 2003 08:12:07 +0000 (08:12 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 3 Sep 2003 08:12:07 +0000 (08:12 +0000)
data/rc.xml
openbox/config.c
openbox/config.h
openbox/event.c

index 40c6b07..0ae56bd 100644 (file)
@@ -15,6 +15,7 @@
   <followMouse>no</followMouse>
   <focusLast>yes</focusLast>
   <focusLastOnDesktop>yes</focusLastOnDesktop>
+  <focusDelay>150000</focusDelay>
 </focus>
 
 <theme>
index 72ccd3b..e2ca29f 100644 (file)
@@ -10,6 +10,7 @@ gboolean config_focus_new;
 gboolean config_focus_follow;
 gboolean config_focus_last;
 gboolean config_focus_last_on_desktop;
+guint    config_focus_delay;
 
 char *config_theme;
 
@@ -205,6 +206,8 @@ static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
         config_focus_last = parse_bool(doc, n);
     if ((n = parse_find_node("focusLastOnDesktop", node)))
         config_focus_last_on_desktop = parse_bool(doc, n);
+    if ((n = parse_find_node("focusDelay", node)))
+        config_focus_delay = parse_int(doc, n);
 }
 
 static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
@@ -358,6 +361,7 @@ void config_startup(ObParseInst *i)
     config_focus_follow = FALSE;
     config_focus_last = TRUE;
     config_focus_last_on_desktop = TRUE;
+    config_focus_delay = 150000;
 
     parse_register(i, "focus", parse_focus, NULL);
 
index 02ee245..3312adb 100644 (file)
@@ -16,8 +16,9 @@ extern gboolean config_focus_follow;
 extern gboolean config_focus_last;
 /*! Focus the last focused window as a fallback when switching desktops */
 extern gboolean config_focus_last_on_desktop;
-/*! The number of slits to create 
-  extern int config_slit_number;*/
+/*! Timeout for focusing windows on focus follows mouse, in microseconds */
+extern guint    config_focus_delay;
+
 /*! When true windows' contents are refreshed while they are resized; otherwise
   they are not updated until the resize is complete */
 extern gboolean config_redraw_resize;
index dda1d22..00036b4 100644 (file)
@@ -46,6 +46,9 @@ static void event_handle_dock(ObDock *s, XEvent *e);
 static void event_handle_dockapp(ObDockApp *app, XEvent *e);
 static void event_handle_client(ObClient *c, XEvent *e);
 
+static gboolean focus_delay_func(gpointer data);
+static void focus_delay_client_dest(gpointer data);
+
 #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
                             (e)->xfocus.detail == NotifyAncestor || \
                             (e)->xfocus.detail > NotifyNonlinearVirtual)
@@ -137,10 +140,13 @@ void event_startup()
 #ifdef USE_LIBSN
     ob_main_loop_x_add(ob_main_loop, sn_handler, ob_sn_display, NULL);
 #endif
+
+    client_add_destructor(focus_delay_client_dest);
 }
 
 void event_shutdown()
 {
+    client_remove_destructor(focus_delay_client_dest);
     XFreeModifiermap(modmap);
 }
 
@@ -648,6 +654,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
             client->frame->close_hover = FALSE;
             frame_adjust_state(client->frame);
             break;
+        case OB_FRAME_CONTEXT_FRAME:
+            /* XXX if doing a 'reconfigure' make sure you kill this timer,
+               maybe all timers.. */
+            if (config_focus_delay)
+                ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
         default:
             break;
         }
@@ -690,7 +701,14 @@ static void event_handle_client(ObClient *client, XEvent *e)
                     ob_debug("EnterNotify on %lx, focusing window\n",
                              client->window);
 #endif
-                    client_focus(client);
+                    if (config_focus_delay) {
+                        ob_main_loop_timeout_add(ob_main_loop,
+                                                 config_focus_delay,
+                                                 focus_delay_func,
+                                                 client,
+                                                 NULL);
+                    } else
+                        client_focus(client);
                 }
             }
             break;
@@ -1157,3 +1175,15 @@ static void event_handle_menu(XEvent *ev)
         break;
     }
 }
+
+static gboolean focus_delay_func(gpointer data)
+{
+    ObClient *c = data;
+    client_focus(c);
+    return FALSE; /* no repeat */
+}
+
+static void focus_delay_client_dest(gpointer data)
+{
+    ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
+}