]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
add a reconfigure action, also reconfigure on SIGUSR2.
[chaz/openbox] / openbox / event.c
index cf057fc88d0c49be1082c24ea2746e9b7e2ddd4e..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);
 }
 
@@ -319,8 +331,8 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
             gboolean fallback = TRUE;
 
             while (TRUE) {
-                if (!XCheckTypedWindowEvent(ob_display, FocusOut,
-                                            e->xfocus.window,&fe))
+                if (!XCheckTypedWindowEvent(ob_display, e->xfocus.window,
+                                            FocusOut, &fe))
                     if (!XCheckTypedEvent(ob_display, FocusIn, &fe))
                         break;
                 if (fe.type == FocusOut) {
@@ -648,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;
         }
@@ -690,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;
@@ -845,8 +871,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
        msgtype = e->xclient.message_type;
        if (msgtype == prop_atoms.wm_change_state) {
            /* compress changes into a single change */
-           while (XCheckTypedWindowEvent(ob_display, e->type,
-                                         client->window, &ce)) {
+           while (XCheckTypedWindowEvent(ob_display, client->window,
+                                         e->type, &ce)) {
                /* XXX: it would be nice to compress ALL messages of a
                   type, not just messages in a row without other
                   message types between. */
@@ -859,8 +885,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
            client_set_wm_state(client, e->xclient.data.l[0]);
        } else if (msgtype == prop_atoms.net_wm_desktop) {
            /* compress changes into a single change */
-           while (XCheckTypedWindowEvent(ob_display, e->type,
-                                         client->window, &ce)) {
+           while (XCheckTypedWindowEvent(ob_display, client->window,
+                                         e->type, &ce)) {
                /* XXX: it would be nice to compress ALL messages of a
                   type, not just messages in a row without other
                   message types between. */
@@ -974,14 +1000,38 @@ static void event_handle_client(ObClient *client, XEvent *e)
        if (!client_validate(client)) break;
   
        /* compress changes to a single property into a single change */
-       while (XCheckTypedWindowEvent(ob_display, e->type,
-                                     client->window, &ce)) {
-           /* XXX: it would be nice to compress ALL changes to a property,
+       while (XCheckTypedWindowEvent(ob_display, client->window,
+                                     e->type, &ce)) {
+            Atom a, b;
+
+            /* XXX: it would be nice to compress ALL changes to a property,
               not just changes in a row without other props between. */
-           if (ce.xproperty.atom != e->xproperty.atom) {
-               XPutBackEvent(ob_display, &ce);
-               break;
-           }
+
+            a = ce.xproperty.atom;
+            b = e->xproperty.atom;
+
+            if (a == b)
+                continue;
+            if ((a == prop_atoms.net_wm_name ||
+                 a == prop_atoms.wm_name ||
+                 a == prop_atoms.net_wm_icon_name ||
+                 a == prop_atoms.wm_icon_name)
+                &&
+                (b == prop_atoms.net_wm_name ||
+                 b == prop_atoms.wm_name ||
+                 b == prop_atoms.net_wm_icon_name ||
+                 b == prop_atoms.wm_icon_name)) {
+                continue;
+            }
+            if ((a == prop_atoms.net_wm_icon ||
+                 a == prop_atoms.kwm_win_icon)
+                &&
+                (b == prop_atoms.net_wm_icon ||
+                 b == prop_atoms.kwm_win_icon))
+                continue;
+
+            XPutBackEvent(ob_display, &ce);
+            break;
        }
 
        msgtype = e->xproperty.atom;
@@ -989,24 +1039,22 @@ static void event_handle_client(ObClient *client, XEvent *e)
            client_update_normal_hints(client);
            /* normal hints can make a window non-resizable */
            client_setup_decor_and_functions(client);
-       }
-       else if (msgtype == XA_WM_HINTS)
+       } else if (msgtype == XA_WM_HINTS) {
            client_update_wmhints(client);
-       else if (msgtype == XA_WM_TRANSIENT_FOR) {
+       else if (msgtype == XA_WM_TRANSIENT_FOR) {
            client_update_transient_for(client);
            client_get_type(client);
            /* type may have changed, so update the layer */
            client_calc_layer(client);
            client_setup_decor_and_functions(client);
-       }
-       else if (msgtype == prop_atoms.net_wm_name ||
-                msgtype == prop_atoms.wm_name ||
-                 msgtype == prop_atoms.net_wm_icon_name ||
-                msgtype == prop_atoms.wm_icon_name)
+       } else if (msgtype == prop_atoms.net_wm_name ||
+                   msgtype == prop_atoms.wm_name ||
+                   msgtype == prop_atoms.net_wm_icon_name ||
+                   msgtype == prop_atoms.wm_icon_name) {
            client_update_title(client);
-       else if (msgtype == prop_atoms.wm_class)
+       } else if (msgtype == prop_atoms.wm_class) {
            client_update_class(client);
-       else if (msgtype == prop_atoms.wm_protocols) {
+        } else if (msgtype == prop_atoms.wm_protocols) {
            client_update_protocols(client);
            client_setup_decor_and_functions(client);
        }
@@ -1014,8 +1062,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
            client_update_strut(client);
         }
        else if (msgtype == prop_atoms.net_wm_icon ||
-                 msgtype == prop_atoms.kwm_win_icon)
+                 msgtype == prop_atoms.kwm_win_icon) {
            client_update_icons(client);
+        }
     default:
         ;
 #ifdef SHAPE
@@ -1134,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.030764 seconds and 4 git commands to generate.