]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
When determining the current timestamp, try get something a lil more accurate
[chaz/openbox] / openbox / event.c
index c4af7b232753df61f332c3b09772af24454aafcd..bcf887f6ffbaf9d61b11f7bbeef2df705ae021a5 100644 (file)
@@ -139,6 +139,10 @@ void event_startup(gboolean reconfig)
 #endif
 
     client_add_destroy_notify(focus_delay_client_dest, NULL);
+
+    /* get an initial time for event_curtime (mapping the initial windows needs
+       a timestamp) */
+    event_curtime = event_get_server_time();
 }
 
 void event_shutdown(gboolean reconfig)
@@ -207,7 +211,7 @@ static Window event_get_window(XEvent *e)
     return window;
 }
 
-static void event_set_curtime(XEvent *e)
+static inline Time event_time(const XEvent *e)
 {
     Time t = CurrentTime;
 
@@ -238,7 +242,7 @@ static void event_set_curtime(XEvent *e)
         if (obt_display_extension_sync &&
             e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
         {
-            t = ((XSyncAlarmNotifyEvent*)e)->time;
+            t = ((const XSyncAlarmNotifyEvent*)e)->time;
         }
 #endif
         /* if more event types are anticipated, get their timestamp
@@ -246,6 +250,20 @@ static void event_set_curtime(XEvent *e)
         break;
     }
 
+    return t;
+}
+
+static void event_set_curtime(XEvent *e)
+{
+    Time t = event_time(e);
+
+    if (t == CurrentTime) {
+        /* Some events don't come with timestamps :(
+           ...but we want the time anyways. */
+        if (e->type == MapRequest)
+            t = event_get_server_time();
+    }
+
     /* watch that if we get an event earlier than the last specified user_time,
        which can happen if the clock goes backwards, we erase the last
        specified user_time */
@@ -1253,8 +1271,9 @@ static void event_handle_client(ObClient *client, XEvent *e)
            XXX remove this some day...that would be nice. but really unexpected
            from Sun Microsystems.
         */
-        g_print("x %d y %d grav %d %d\n", x, y, client->gravity, NorthWestGravity);
-        if (x == 0 && y == 0 && client->gravity == NorthWestGravity) {
+        if (x == 0 && y == 0 && client->gravity == NorthWestGravity &&
+            client_normal(client))
+        {
             const Rect to = { x, y, w, h };
 
             /* oldschool fullscreen windows are allowed */
@@ -1621,8 +1640,11 @@ static void event_handle_client(ObClient *client, XEvent *e)
         } else if (msgtype == XA_WM_HINTS) {
             client_update_wmhints(client);
         } else if (msgtype == XA_WM_TRANSIENT_FOR) {
-            client_update_transient_for(client);
+            /* get the transient-ness first, as this affects if the client
+               decides to be transient for the group or not in
+               client_update_transient_for() */
             client_get_type_and_transientness(client);
+            client_update_transient_for(client);
             /* type may have changed, so update the layer */
             client_calc_layer(client);
             client_setup_decor_and_functions(client, TRUE);
@@ -1881,7 +1903,7 @@ static gboolean event_handle_menu_input(XEvent *ev)
                 ret = TRUE;
             }
 
-            else if (sym == XK_Return) {
+            else if (sym == XK_Return || sym == XK_KP_Enter) {
                 frame->press_doexec = TRUE;
                 ret = TRUE;
             }
@@ -2202,14 +2224,24 @@ gboolean event_time_after(guint32 t1, guint32 t2)
         return t1 >= t2 && t1 < (t2 + TIME_HALF);
 }
 
+Bool find_timestamp(Display *d, XEvent *e, XPointer a)
+{
+    const Time t = event_time(e);
+    return t != CurrentTime;
+}
+
 Time event_get_server_time(void)
 {
-    /* Generate a timestamp */
     XEvent event;
 
+    /* Generate a timestamp so there is guaranteed at least one in the queue
+       eventually */
     XChangeProperty(obt_display, screen_support_win,
                     OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING),
                     8, PropModeAppend, NULL, 0);
-    XWindowEvent(obt_display, screen_support_win, PropertyChangeMask, &event);
+
+    /* Grab the first timestamp available */
+    XPeekIfEvent(obt_display, &event, find_timestamp, NULL);
+
     return event.xproperty.time;
 }
This page took 0.022533 seconds and 4 git commands to generate.