]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
scary commit..but here goes.
[chaz/openbox] / openbox / event.c
index 2c13ceda2617088903d5829987d0f4355e90f299..6314c9f79640029f614f4f8c2e0991550e7c1ec7 100644 (file)
@@ -86,7 +86,12 @@ static gboolean menu_hide_delay_func(gpointer data);
                              (e)->xfocus.detail == NotifyAncestor || \
                              (e)->xfocus.detail > NotifyNonlinearVirtual)
 
-Time event_lasttime = 0;
+/* The most recent time at which an event with a timestamp occured. */
+static Time event_lasttime = 0;
+/* The time for the current event being processed
+   (it's the event_lasttime for events without times, if this is a bug then
+   use CurrentTime instead, but it seems ok) */
+Time event_curtime = CurrentTime;
 
 /*! The value of the mask for the NumLock modifier */
 guint NumLockMask;
@@ -251,8 +256,14 @@ static void event_set_lasttime(XEvent *e)
         break;
     }
 
-    if (t > event_lasttime)
+    if (t > event_lasttime) {
         event_lasttime = t;
+        event_curtime = event_lasttime;
+    } else if (t == 0) {
+        event_curtime = event_lasttime;
+    } else {
+        event_curtime = t;
+    }
 }
 
 #define STRIP_MODS(s) \
@@ -568,7 +579,7 @@ static void event_handle_root(XEvent *e)
     switch(e->type) {
     case SelectionClear:
         ob_debug("Another WM has requested to replace us. Exiting.\n");
-        ob_exit(0);
+        ob_exit_replace();
         break;
 
     case ClientMessage:
@@ -585,6 +596,11 @@ static void event_handle_root(XEvent *e)
                 screen_set_num_desktops(d);
         } else if (msgtype == prop_atoms.net_showing_desktop) {
             screen_show_desktop(e->xclient.data.l[0] != 0);
+        } else if (msgtype == prop_atoms.ob_control) {
+            if (e->xclient.data.l[0] == 1)
+                ob_reconfigure();
+            else if (e->xclient.data.l[0] == 2)
+                ob_restart();
         }
         break;
     case PropertyNotify:
@@ -843,7 +859,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                 gint fh = h +
                      client->frame->size.top + client->frame->size.bottom;
                 client_find_onscreen(client, &newx, &newy, fw, fh,
-                                     client_normal(client));
+                                     FALSE);
                 if (e->xconfigurerequest.value_mask & CWX)
                     x = newx;
                 if (e->xconfigurerequest.value_mask & CWY)
@@ -919,7 +935,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
                                        it can happen now when the window is on
                                        another desktop, but we still don't
                                        want it! */
-        client_activate(client, FALSE);
+        client_activate(client, FALSE, TRUE);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -973,8 +989,15 @@ static void event_handle_client(ObClient *client, XEvent *e)
             ob_debug("net_close_window for 0x%lx\n", client->window);
             client_close(client);
         } else if (msgtype == prop_atoms.net_active_window) {
-            ob_debug("net_active_window for 0x%lx\n", client->window);
-            client_activate(client, FALSE);
+            ob_debug("net_active_window for 0x%lx source=%s\n",
+                     client->window,
+                     (e->xclient.data.l[0] == 0 ? "unknown" :
+                      (e->xclient.data.l[0] == 1 ? "application" :
+                       (e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
+            /* XXX make use of data.l[1] and [2] ! */
+            client_activate(client, FALSE,
+                            (e->xclient.data.l[0] == 0 ||
+                             e->xclient.data.l[0] == 2));
         } else if (msgtype == prop_atoms.net_wm_moveresize) {
             ob_debug("net_wm_moveresize for 0x%lx\n", client->window);
             if ((Atom)e->xclient.data.l[2] ==
@@ -1287,7 +1310,8 @@ static gboolean focus_delay_func(gpointer data)
 
 static void focus_delay_client_dest(ObClient *client, gpointer data)
 {
-    ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, client, TRUE);
+    ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func,
+                                     client, TRUE);
 }
 
 static void event_client_dest(ObClient *client, gpointer data)
This page took 0.026424 seconds and 4 git commands to generate.