aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-03-18 23:41:38 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-03-22 17:34:26 +0800
commit3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2 (patch)
tree89b0ab01cb7ceb059b54c61535513cd3d79d1a2e
parente8e8bfcd27704588c20755eb5528c08571c87406 (diff)
downloadgsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar.gz
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar.bz2
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar.lz
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar.xz
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.tar.zst
gsoc2013-empathy-3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2.zip
empathy_window_present: use X server time if there is no event
-rw-r--r--libempathy-gtk/empathy-ui-utils.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 4503a39cc..ef7ff78b2 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1383,6 +1383,55 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon)
gtk_window_iconify (window);
}
+/* Code from Thomas Thurman
+ * http://people.collabora.co.uk/~tthurman/pingwindow.c.txt
+ */
+static guint32
+get_server_time (void)
+{
+ Display *display;
+ Window pingingWindow;
+ XEvent propertyEvent;
+ XSetWindowAttributes attrs;
+
+ display = XOpenDisplay (NULL);
+
+ attrs.override_redirect = True;
+ attrs.event_mask = PropertyChangeMask;
+
+ pingingWindow = XCreateWindow (display,
+ XRootWindow (display, 0), /* parent */
+ -100, -100, 1, 1, /* off-screen */
+ 0,
+ CopyFromParent,
+ CopyFromParent,
+ (Visual *)CopyFromParent,
+ CWOverrideRedirect | CWEventMask,
+ &attrs);
+
+ /* Change a property. XA_PRIMARY is never really
+ * used for properties, so it's safe.
+ */
+ XChangeProperty (display,
+ pingingWindow,
+ XA_PRIMARY, XA_STRING, 8,
+ PropModeAppend, NULL, 0);
+
+ /* Pick up the event. */
+ XWindowEvent (display,
+ pingingWindow,
+ PropertyChangeMask,
+ &propertyEvent);
+
+ /* If you want to do this often,
+ * just keep the window around and
+ * don't destroy it.
+ */
+ XDestroyWindow (display, pingingWindow);
+
+ return ((XPropertyEvent*)&propertyEvent)->time;
+}
+
/* Takes care of moving the window to the current workspace. */
void
empathy_window_present (GtkWindow *window)
@@ -1412,8 +1461,8 @@ empathy_window_present (GtkWindow *window)
timestamp = gtk_get_current_event_time ();
if (timestamp == 0)
- /* No event, fallback to _NET_WM_USER_TIME */
- timestamp = gdk_x11_display_get_user_time (gdk_display_get_default ());
+ /* No event, fallback to X server time */
+ timestamp = get_server_time ();
gtk_window_present_with_time (window, timestamp);
gtk_window_set_skip_taskbar_hint (window, FALSE);