]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
add a reconfigure action, also reconfigure on SIGUSR2.
[chaz/openbox] / openbox / event.c
index 3f529ec269c7aa016ffe0154dd5ec5d6d86298c1..0510dab29e9f7d2ad912c3294966071bec2caaf3 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)
@@ -69,6 +72,8 @@ static const int mask_table[] = {
 };
 static int mask_table_size;
 
+static ObClient *focus_delay_client;
+
 #ifdef USE_SM
 static void ice_handler(int fd, gpointer conn)
 {
@@ -101,8 +106,10 @@ static void sn_handler(const XEvent *e, gpointer display)
 #endif
 
 
-void event_startup()
+void event_startup(gboolean reconfig)
 {
+    if (reconfig) return;
+
     mask_table_size = sizeof(mask_table) / sizeof(mask_table[0]);
      
     /* get lock masks that are defined by the display (not constant) */
@@ -137,10 +144,15 @@ 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()
+void event_shutdown(gboolean reconfig)
 {
+    if (reconfig) return;
+
+    client_remove_destructor(focus_delay_client_dest);
     XFreeModifiermap(modmap);
 }
 
@@ -429,8 +441,6 @@ static void event_process(const XEvent *ec, gpointer data)
     ee = *ec;
     e = ⅇ
 
-    g_message("Event %d", e->type);
-
     window = event_get_window(e);
     if ((obwin = g_hash_table_lookup(window_map, &window))) {
         switch (obwin->type) {
@@ -650,6 +660,13 @@ 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) {
+                focus_delay_client = NULL;
+                ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
+            }
         default:
             break;
         }
@@ -692,7 +709,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,
+                                                 NULL, NULL);
+                        focus_delay_client = client;
+                    } else
+                        client_focus(client);
                 }
             }
             break;
@@ -1159,3 +1183,18 @@ static void event_handle_menu(XEvent *ev)
         break;
     }
 }
+
+static gboolean focus_delay_func(gpointer data)
+{
+    client_focus(focus_delay_client);
+    return FALSE; /* no repeat */
+}
+
+static void focus_delay_client_dest(gpointer data)
+{
+    ObClient *c = data;
+    if (c == focus_delay_client) {
+        focus_delay_client = NULL;
+        ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
+    }
+}
This page took 0.022675 seconds and 4 git commands to generate.