]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
scary commit..but here goes.
[chaz/openbox] / openbox / event.c
index c997ca59c2d43330539032aeaf1717dc0bb1879b..6314c9f79640029f614f4f8c2e0991550e7c1ec7 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    event.c for the Openbox window manager
-   Copyright (c) 2004        Mikael Magnusson
+   Copyright (c) 2006        Mikael Magnusson
    Copyright (c) 2003        Ben Jansens
 
    This program is free software; you can redistribute it and/or modify
@@ -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;
@@ -175,6 +180,7 @@ void event_shutdown(gboolean reconfig)
 #endif
 
     client_remove_destructor(focus_delay_client_dest);
+    client_remove_destructor(event_client_dest);
     XFreeModifiermap(modmap);
 }
 
@@ -250,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) \
@@ -567,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:
@@ -584,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:
@@ -600,11 +617,6 @@ static void event_handle_root(XEvent *e)
         break;
     default:
         ;
-#ifdef VIDMODE
-        if (extensions_vidmode && e->type == extensions_vidmode_event_basep) {
-            ob_debug("VIDMODE EVENT\n");
-        }
-#endif
     }
 }
 
@@ -728,7 +740,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
             if (config_focus_follow && config_focus_delay)
                 ob_main_loop_timeout_remove_data(ob_main_loop,
                                                  focus_delay_func,
-                                                 client);
+                                                 client, TRUE);
             break;
         default:
             break;
@@ -847,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)
@@ -923,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 */
@@ -977,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] ==
@@ -1147,9 +1166,9 @@ static void event_handle_dock(ObDock *s, XEvent *e)
     switch (e->type) {
     case ButtonPress:
         if (e->xbutton.button == 1)
-            stacking_raise(DOCK_AS_WINDOW(s));
+            stacking_raise(DOCK_AS_WINDOW(s), FALSE);
         else if (e->xbutton.button == 2)
-            stacking_lower(DOCK_AS_WINDOW(s));
+            stacking_lower(DOCK_AS_WINDOW(s), FALSE);
         break;
     case EnterNotify:
         dock_hide(FALSE);
@@ -1291,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);
+    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.024475 seconds and 4 git commands to generate.