]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
wow... this is a big commit...
[chaz/openbox] / openbox / event.c
index 1efccdbed85bcdeb2ecef6c81a52197d0be57b94..1988f108ab45f108eed34c3d269cd3df7556cf23 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;
@@ -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:
@@ -842,8 +858,13 @@ static void event_handle_client(ObClient *client, XEvent *e)
                      client->frame->size.left + client->frame->size.right;
                 gint fh = h +
                      client->frame->size.top + client->frame->size.bottom;
+                /* make this rude for size-only changes but not for position
+                   changes.. */
+                gboolean moving = ((e->xconfigurerequest.value_mask & CWX) ||
+                                   (e->xconfigurerequest.value_mask & CWY));
+
                 client_find_onscreen(client, &newx, &newy, fw, fh,
-                                     client_normal(client));
+                                     !moving);
                 if (e->xconfigurerequest.value_mask & CWX)
                     x = newx;
                 if (e->xconfigurerequest.value_mask & CWY)
@@ -874,13 +895,17 @@ static void event_handle_client(ObClient *client, XEvent *e)
             switch (e->xconfigurerequest.detail) {
             case Below:
             case BottomIf:
-                client_lower(client);
+                /* Apps are so rude. And this is totally disconnected from
+                   activation/focus. Bleh. */
+                /*client_lower(client);*/
                 break;
 
             case Above:
             case TopIf:
             default:
-                client_raise(client);
+                /* Apps are so rude. And this is totally disconnected from
+                   activation/focus. Bleh. */
+                /*client_raise(client);*/
                 break;
             }
         }
@@ -919,7 +944,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, CurrentTime);
         break;
     case ClientMessage:
         /* validate cuz we query stuff off the client here */
@@ -973,8 +998,16 @@ 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),
+                            e->xclient.data.l[1]);
         } 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] ==
@@ -1082,11 +1115,8 @@ static void event_handle_client(ObClient *client, XEvent *e)
                  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))
+            if (a == prop_atoms.net_wm_icon &&
+                b == prop_atoms.net_wm_icon)
                 continue;
 
             XPutBackEvent(ob_display, &ce);
@@ -1120,10 +1150,12 @@ static void event_handle_client(ObClient *client, XEvent *e)
         else if (msgtype == prop_atoms.net_wm_strut) {
             client_update_strut(client);
         }
-        else if (msgtype == prop_atoms.net_wm_icon ||
-                 msgtype == prop_atoms.kwm_win_icon) {
+        else if (msgtype == prop_atoms.net_wm_icon) {
             client_update_icons(client);
         }
+        else if (msgtype == prop_atoms.net_wm_user_time) {
+            client_update_user_time(client, TRUE);
+        }
         else if (msgtype == prop_atoms.sm_client_id) {
             client_update_sm_client_id(client);
         }
@@ -1215,7 +1247,8 @@ static void event_handle_menu(XEvent *ev)
         if (menu_can_hide) {
             if ((e = menu_entry_frame_under(ev->xbutton.x_root,
                                             ev->xbutton.y_root)))
-                menu_entry_frame_execute(e, ev->xbutton.state);
+                menu_entry_frame_execute(e, ev->xbutton.state,
+                                         ev->xbutton.time);
             else
                 menu_frame_hide_all();
         }
@@ -1245,7 +1278,8 @@ static void event_handle_menu(XEvent *ev)
         else if (ev->xkey.keycode == ob_keycode(OB_KEY_RETURN)) {
             ObMenuFrame *f;
             if ((f = find_active_menu()))
-                menu_entry_frame_execute(f->selected, ev->xkey.state);
+                menu_entry_frame_execute(f->selected, ev->xkey.state,
+                                         ev->xkey.time);
         } else if (ev->xkey.keycode == ob_keycode(OB_KEY_LEFT)) {
             ObMenuFrame *f;
             if ((f = find_active_or_last_menu()) && f->parent)
@@ -1287,7 +1321,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.026492 seconds and 4 git commands to generate.