diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-03-18 23:41:38 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-03-22 17:34:26 +0800 |
commit | 3011ba3c2dd559c63c1ec659ccf494d7e85fe8f2 (patch) | |
tree | 89b0ab01cb7ceb059b54c61535513cd3d79d1a2e | |
parent | e8e8bfcd27704588c20755eb5528c08571c87406 (diff) | |
download | gsoc2013-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.c | 53 |
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); |