[Xfce4-commits] [apps/xfdashboard] 14/19: Fix code path for use with GDK backend
noreply at xfce.org
noreply at xfce.org
Fri Jun 16 10:56:45 CEST 2017
This is an automated email from the git hooks/post-receive script.
n o m a d p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository apps/xfdashboard.
commit 3eaf5ecc5893f511e4f4ecd69aea96001edba0e7
Author: Stephan Haller <nomad at froevel.de>
Date: Wed Jun 14 09:49:15 2017 +0200
Fix code path for use with GDK backend
Fix for issue GH #129
---
libxfdashboard/gdk/window-tracker-backend-gdk.c | 59 +++++----
libxfdashboard/x11/window-content-x11.c | 140 +++++++++++++++++---
libxfdashboard/x11/window-tracker-x11.c | 169 +++++++++++++++++-------
3 files changed, 267 insertions(+), 101 deletions(-)
diff --git a/libxfdashboard/gdk/window-tracker-backend-gdk.c b/libxfdashboard/gdk/window-tracker-backend-gdk.c
index 0f73f8a..212e3fb 100644
--- a/libxfdashboard/gdk/window-tracker-backend-gdk.c
+++ b/libxfdashboard/gdk/window-tracker-backend-gdk.c
@@ -532,40 +532,42 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_show_
/* Connect signals if not already connected */
signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
handlerID=g_signal_handler_find(stageWnckWindow,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_state_changed),
- NULL);
+ stageWindow);
if(!handlerID)
{
- g_signal_connect(stageWnckWindow,
- "state-changed",
- G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_state_changed),
- stageWindow);
+ handlerID=g_signal_connect(stageWnckWindow,
+ "state-changed",
+ G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_state_changed),
+ stageWindow);
XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'state-changed' at window %p (wnck-window=%p)",
+ "Connecting signal handler %lu to 'state-changed' at window %p (wnck-window=%p)",
+ handlerID,
stageWindow,
stageWnckWindow);
}
signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_active_window_changed),
- NULL);
+ stageWindow);
if(!handlerID)
{
- g_signal_connect(screen,
- "active-window-changed",
- G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_active_window_changed),
- self);
+ handlerID=g_signal_connect(screen,
+ "active-window-changed",
+ G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_active_window_changed),
+ stageWindow);
XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
+ "Connecting signal handler %lu to 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
+ handlerID,
screen,
stageWindow,
stageWnckWindow);
@@ -573,20 +575,21 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_show_
signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
handlerID=g_signal_handler_find(priv->windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_screen_size_changed),
- NULL);
+ stageWindow);
if(!handlerID)
{
- g_signal_connect(priv->windowTracker,
- "screen-size-changed",
- G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_screen_size_changed),
- self);
+ handlerID=g_signal_connect(priv->windowTracker,
+ "screen-size-changed",
+ G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_screen_size_changed),
+ stageWindow);
XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'screen-size-changed' at window %p (wnck-window=%p)",
+ "Connecting signal handler %lu to 'screen-size-changed' at window %p (wnck-window=%p)",
+ handlerID,
stageWindow,
stageWnckWindow);
}
@@ -594,7 +597,7 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_show_
_xfdashboard_window_tracker_backend_gdk_on_stage_screen_size_changed(XFDASHBOARD_WINDOW_TRACKER(priv->windowTracker),
width,
height,
- self);
+ inStageWindow);
/* Now the window is set up and we can show it */
xfdashboard_window_tracker_window_show(inStageWindow);
@@ -638,12 +641,12 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_hide_
/* Disconnect signals */
signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
handlerID=g_signal_handler_find(stageWnckWindow,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_state_changed),
- NULL);
+ stageWindow);
if(handlerID)
{
g_signal_handler_disconnect(stageWnckWindow, handlerID);
@@ -656,12 +659,12 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_hide_
signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_active_window_changed),
- NULL);
+ stageWindow);
if(handlerID)
{
g_signal_handler_disconnect(screen, handlerID);
@@ -675,12 +678,12 @@ static void _xfdashboard_window_tracker_backend_gdk_window_tracker_backend_hide_
signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
handlerID=g_signal_handler_find(priv->windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
+ G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
signalID,
0,
NULL,
G_CALLBACK(_xfdashboard_window_tracker_backend_gdk_on_stage_screen_size_changed),
- NULL);
+ stageWindow);
if(handlerID)
{
g_signal_handler_disconnect(priv->windowTracker, handlerID);
diff --git a/libxfdashboard/x11/window-content-x11.c b/libxfdashboard/x11/window-content-x11.c
index 23c8315..90c5577 100644
--- a/libxfdashboard/x11/window-content-x11.c
+++ b/libxfdashboard/x11/window-content-x11.c
@@ -32,6 +32,9 @@
#include <glib/gi18n-lib.h>
#include <clutter/x11/clutter-x11.h>
+#ifdef CLUTTER_WINDOWING_GDK
+#include <clutter/gdk/clutter-gdk.h>
+#endif
#include <cogl/cogl-texture-pixmap-x11.h>
#ifdef HAVE_XCOMPOSITE
#include <X11/extensions/Xcomposite.h>
@@ -189,6 +192,35 @@ static void _xfdashboard_window_content_x11_suspend(XfdashboardWindowContentX11
static void _xfdashboard_window_content_x11_resume(XfdashboardWindowContentX11 *self);
static gboolean _xfdashboard_window_content_x11_resume_on_idle(gpointer inUserData);
+/* Get X server display */
+static Display* _xfdashboard_window_content_x11_get_display(void)
+{
+ Display *display;
+
+ display=None;
+
+#ifdef CLUTTER_WINDOWING_X11
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_X11))
+ {
+ display=clutter_x11_get_default_display();
+ }
+#endif
+
+#ifdef CLUTTER_WINDOWING_GDK
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_GDK))
+ {
+ display=gdk_x11_display_get_xdisplay(clutter_gdk_get_default_display());
+ }
+#endif
+
+ if(G_UNLIKELY(display==None))
+ {
+ g_critical(_("No default X11 display found in GDK to check X extensions"));
+ }
+
+ return(display);
+}
+
/* Remove all entries from resume queue and release all allocated resources */
static void _xfdashboard_window_content_x11_destroy_resume_queue(void)
{
@@ -629,16 +661,17 @@ static void _xfdashboard_window_content_x11_check_extension(void)
/* Check if we have already checked extensions */
if(_xfdashboard_window_content_x11_have_checked_extensions!=FALSE) return;
- /* Mark that we have check for extensions regardless of any error*/
+ /* Mark that we have check for extensions regardless of any error */
_xfdashboard_window_content_x11_have_checked_extensions=TRUE;
/* Get display */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Check for composite extenstion */
_xfdashboard_window_content_x11_have_composite_extension=FALSE;
#ifdef HAVE_XCOMPOSITE
- if(XCompositeQueryExtension(display, &compositeEventBase, &compositeError))
+ if(G_LIKELY(display!=None) &&
+ XCompositeQueryExtension(display, &compositeEventBase, &compositeError))
{
compositeMajor=compositeMinor=0;
if(XCompositeQueryVersion(display, &compositeMajor, &compositeMinor))
@@ -663,7 +696,8 @@ static void _xfdashboard_window_content_x11_check_extension(void)
_xfdashboard_window_content_x11_damage_event_base=0;
#ifdef HAVE_XDAMAGE
- if(XDamageQueryExtension(display, &_xfdashboard_window_content_x11_damage_event_base, &damageError))
+ if(G_LIKELY(display!=None) &&
+ XDamageQueryExtension(display, &_xfdashboard_window_content_x11_damage_event_base, &damageError))
{
_xfdashboard_window_content_x11_have_damage_extension=TRUE;
}
@@ -677,8 +711,8 @@ static void _xfdashboard_window_content_x11_check_extension(void)
/* Suspension state of application changed */
static void _xfdashboard_window_content_x11_on_application_suspended_changed(XfdashboardWindowContentX11 *self,
- GParamSpec *inSpec,
- gpointer inUserData)
+ GParamSpec *inSpec,
+ gpointer inUserData)
{
XfdashboardWindowContentX11Private *priv;
XfdashboardApplication *app;
@@ -705,14 +739,14 @@ static void _xfdashboard_window_content_x11_on_application_suspended_changed(Xfd
}
/* Filter X events for damages */
-static ClutterX11FilterReturn _xfdashboard_window_content_x11_on_x_event(XEvent *inXEvent, ClutterEvent *inEvent, gpointer inUserData)
+static void _xfdashboard_window_content_x11_handle_x_event(XfdashboardWindowContentX11 *self,
+ XEvent *inXEvent)
{
- XfdashboardWindowContentX11 *self;
XfdashboardWindowContentX11Private *priv;
- g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_CONTENT_X11(inUserData), CLUTTER_X11_FILTER_CONTINUE);
+ g_return_if_fail(XFDASHBOARD_IS_WINDOW_CONTENT_X11(self));
+ g_return_if_fail(inXEvent);
- self=XFDASHBOARD_WINDOW_CONTENT_X11(inUserData);
priv=self->priv;
/* Check for mapped, unmapped related X events as pixmap, damage, texture etc.
@@ -752,10 +786,44 @@ static ClutterX11FilterReturn _xfdashboard_window_content_x11_on_x_event(XEvent
clutter_content_invalidate(CLUTTER_CONTENT(self));
}
#endif
+}
+
+static ClutterX11FilterReturn _xfdashboard_window_content_x11_on_x_event(XEvent *inXEvent, ClutterEvent *inEvent, gpointer inUserData)
+{
+ XfdashboardWindowContentX11 *self;
+
+ g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_CONTENT_X11(inUserData), CLUTTER_X11_FILTER_CONTINUE);
+
+ self=XFDASHBOARD_WINDOW_CONTENT_X11(inUserData);
+ /* Call X event handler */
+ _xfdashboard_window_content_x11_handle_x_event(self, inXEvent);
+
+ /* Always return FILTER_CONTINUE value to let other components handle this
+ * event also.
+ */
return(CLUTTER_X11_FILTER_CONTINUE);
}
+#ifdef CLUTTER_WINDOWING_GDK
+static GdkFilterReturn _xfdashboard_window_content_x11_on_gdkx_event(GdkXEvent *inXEvent, GdkEvent *inEvent, gpointer inUserData)
+{
+ XfdashboardWindowContentX11 *self;
+
+ g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_CONTENT_X11(inUserData), GDK_FILTER_CONTINUE);
+
+ self=XFDASHBOARD_WINDOW_CONTENT_X11(inUserData);
+
+ /* Call X event handler */
+ _xfdashboard_window_content_x11_handle_x_event(self, inXEvent);
+
+ /* Always return FILTER_CONTINUE value to let other components handle this
+ * event also.
+ */
+ return(GDK_FILTER_CONTINUE);
+}
+#endif
+
/* Release all resources used by this instance */
static void _xfdashboard_window_content_x11_release_resources(XfdashboardWindowContentX11 *self)
{
@@ -771,13 +839,11 @@ static void _xfdashboard_window_content_x11_release_resources(XfdashboardWindowC
_xfdashboard_window_content_x11_resume_on_idle_remove(self);
/* Get display as it used more than once ;) */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Release resources. It might be important to release them
* in reverse order as they were created.
*/
- clutter_x11_remove_filter(_xfdashboard_window_content_x11_on_x_event, (gpointer)self);
-
clutter_x11_trap_x_errors();
{
if(priv->texture)
@@ -853,7 +919,7 @@ static void _xfdashboard_window_content_x11_suspend(XfdashboardWindowContentX11
_xfdashboard_window_content_x11_resume_on_idle_remove(self);
/* Get display as it used more than once ;) */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Release resources */
clutter_x11_trap_x_errors();
@@ -980,7 +1046,7 @@ static gboolean _xfdashboard_window_content_x11_resume_on_idle(gpointer inUserDa
}
/* Get display as it used more than once ;) */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Set up resources */
clutter_x11_trap_x_errors();
@@ -1143,7 +1209,7 @@ static void _xfdashboard_window_content_x11_resume(XfdashboardWindowContentX11 *
if(!_xfdashboard_window_content_x11_have_composite_extension) return;
/* Get display as it used more than once ;) */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Set up resources */
clutter_x11_trap_x_errors();
@@ -1284,21 +1350,25 @@ static Window _xfdashboard_window_content_x11_get_window_frame_xid(Display *inDi
/* Check if window is client side decorated and if it has no decorations
* so skip finding window frame and behave like we did not found it.
*/
- gdkDisplay=gdk_display_get_default();
+ XSync(inDisplay, False);
+
+ gdkDisplay=gdk_x11_lookup_xdisplay(inDisplay);
+ if(!gdkDisplay) gdkDisplay=gdk_display_get_default();
+
gdkWindow=gdk_x11_window_foreign_new_for_display(gdkDisplay, xWindowID);
if(gdkWindow)
{
- if(gdk_window_get_decorations(gdkWindow, &gdkWindowDecoration) &&
+ if(!gdk_window_get_decorations(gdkWindow, &gdkWindowDecoration) ||
gdkWindowDecoration==0)
{
XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "Window '%s' has CSD enabled and no decorations so skip finding window frame.",
+ "Window '%s' has either CSD not enabled or no decorations applied so skip finding window frame",
xfdashboard_window_tracker_window_get_name(XFDASHBOARD_WINDOW_TRACKER_WINDOW(inWindow)));
/* Release allocated resources */
g_object_unref(gdkWindow);
- /* Skip finding window frame but return "not-found" result */
+ /* Skip finding window frame and return "not-found" result */
return(0);
}
g_object_unref(gdkWindow);
@@ -1359,7 +1429,7 @@ static void _xfdashboard_window_content_x11_set_window(XfdashboardWindowContentX
g_object_freeze_notify(G_OBJECT(self));
/* Get display as it used more than once ;) */
- display=clutter_x11_get_default_display();
+ display=_xfdashboard_window_content_x11_get_display();
/* Set new value */
priv->window=inWindow;
@@ -1835,6 +1905,20 @@ static void _xfdashboard_window_content_x11_dispose(GObject *inObject)
XfdashboardWindowContentX11Private *priv=self->priv;
/* Dispose allocated resources */
+#ifdef CLUTTER_WINDOWING_X11
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_X11))
+ {
+ clutter_x11_remove_filter(_xfdashboard_window_content_x11_on_x_event, self);
+ }
+#endif
+
+#ifdef CLUTTER_WINDOWING_GDK
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_GDK))
+ {
+ gdk_window_remove_filter(NULL, _xfdashboard_window_content_x11_on_gdkx_event, self);
+ }
+#endif
+
_xfdashboard_window_content_x11_release_resources(self);
if(priv->workaroundStateSignalID)
@@ -2201,7 +2285,19 @@ void xfdashboard_window_content_x11_init(XfdashboardWindowContentX11 *self)
_xfdashboard_window_content_x11_check_extension();
/* Add event filter for this instance */
- clutter_x11_add_filter(_xfdashboard_window_content_x11_on_x_event, self);
+#ifdef CLUTTER_WINDOWING_X11
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_X11))
+ {
+ clutter_x11_add_filter(_xfdashboard_window_content_x11_on_x_event, self);
+ }
+#endif
+
+#ifdef CLUTTER_WINDOWING_GDK
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_GDK))
+ {
+ gdk_window_add_filter(NULL, _xfdashboard_window_content_x11_on_gdkx_event, self);
+ }
+#endif
/* Style content */
xfdashboard_stylable_invalidate(XFDASHBOARD_STYLABLE(self));
diff --git a/libxfdashboard/x11/window-tracker-x11.c b/libxfdashboard/x11/window-tracker-x11.c
index f387835..af788b8 100644
--- a/libxfdashboard/x11/window-tracker-x11.c
+++ b/libxfdashboard/x11/window-tracker-x11.c
@@ -39,6 +39,9 @@
#include <glib/gi18n-lib.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
+#ifdef CLUTTER_WINDOWING_GDK
+#include <clutter/gdk/clutter-gdk.h>
+#endif
#include <gdk/gdkx.h>
#ifdef HAVE_XINERAMA
#include <X11/extensions/Xinerama.h>
@@ -1954,10 +1957,6 @@ guint32 xfdashboard_window_tracker_x11_get_time(void)
const ClutterEvent *currentClutterEvent;
guint32 timestamp;
GdkDisplay *display;
- GdkWindow *window;
- GdkEventMask eventMask;
- GSList *stages, *entry;
- ClutterStage *stage;
/* We don't use clutter_get_current_event_time as it can return
* a too old timestamp if there is no current event.
@@ -1970,66 +1969,134 @@ guint32 xfdashboard_window_tracker_x11_get_time(void)
if(timestamp>0) return(timestamp);
/* Next we try to ask GDK for a timestamp */
- timestamp=gdk_x11_display_get_user_time(gdk_display_get_default());
- if(timestamp>0) return(timestamp);
-
- /* Next we try to retrieve timestamp of last X11 event in clutter */
- XFDASHBOARD_DEBUG(NULL, WINDOWS, "No timestamp for windows - trying timestamp of last X11 event in Clutter");
- timestamp=(guint32)clutter_x11_get_current_event_time();
- if(timestamp!=0)
- {
- XFDASHBOARD_DEBUG(NULL, WINDOWS,
- "Got timestamp %u of last X11 event in Clutter",
- timestamp);
- return(timestamp);
- }
-
- /* Last resort is to get X11 server time via stage windows */
- XFDASHBOARD_DEBUG(NULL, WINDOWS, "No timestamp for windows - trying last resort via stage windows");
-
display=gdk_display_get_default();
- if(!display)
+ if(display)
{
- XFDASHBOARD_DEBUG(NULL, WINDOWS, "No default display found in GDK to get timestamp for windows");
- return(0);
+ timestamp=gdk_x11_display_get_user_time(display);
+ if(timestamp>0) return(timestamp);
}
- /* Iterate through stages, get their GDK window and try to retrieve timestamp */
- timestamp=0;
- stages=clutter_stage_manager_list_stages(clutter_stage_manager_get_default());
- for(entry=stages; timestamp==0 && entry; entry=g_slist_next(entry))
+#ifdef CLUTTER_WINDOWING_X11
+ /* Next we try to get timestamp via Clutter X11 backend if available and used */
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_X11))
{
- /* Get stage */
- stage=CLUTTER_STAGE(entry->data);
- if(stage)
+ GdkWindow *window;
+ GdkEventMask eventMask;
+ GSList *stages;
+ GSList *iter;
+ ClutterStage *stage;
+
+ /* Next we try to retrieve timestamp of last X11 event in clutter */
+ XFDASHBOARD_DEBUG(NULL, WINDOWS, "No timestamp for windows - trying timestamp of last X11 event in Clutter");
+ timestamp=(guint32)clutter_x11_get_current_event_time();
+ if(timestamp!=0)
+ {
+ XFDASHBOARD_DEBUG(NULL, WINDOWS,
+ "Got timestamp %u of last X11 event in Clutter",
+ timestamp);
+ return(timestamp);
+ }
+
+ /* Last resort is to get X11 server time via stage windows, so iterate
+ * through stages, get their GDK-X11 window and try to retrieve timestamp.
+ */
+ XFDASHBOARD_DEBUG(NULL, WINDOWS, "No timestamp for windows - trying last resort via X11 stage windows");
+ if(!display)
{
- /* Get GDK window of stage */
- window=gdk_x11_window_lookup_for_display(display, clutter_x11_get_stage_window(stage));
- if(!window)
+ XFDASHBOARD_DEBUG(NULL, WINDOWS, "No default X11 display found in GDK to get timestamp for windows");
+ return(0);
+ }
+
+ timestamp=0;
+ stages=clutter_stage_manager_list_stages(clutter_stage_manager_get_default());
+ for(iter=stages; timestamp==0 && iter; iter=g_slist_next(iter))
+ {
+ /* Get stage */
+ stage=CLUTTER_STAGE(iter->data);
+ if(stage)
{
- XFDASHBOARD_DEBUG(NULL, WINDOWS,
- "No GDK window found for stage %p to get timestamp for windows",
- stage);
- continue;
+ /* Get GDK window of stage */
+ window=gdk_x11_window_lookup_for_display(display, clutter_x11_get_stage_window(stage));
+ if(!window)
+ {
+ XFDASHBOARD_DEBUG(NULL, WINDOWS,
+ "No GDK-X11 window found for stage %s@%p to get timestamp for windows",
+ G_OBJECT_TYPE_NAME(stage),
+ stage);
+ continue;
+ }
+
+ /* Check if GDK window supports GDK_PROPERTY_CHANGE_MASK event
+ * or application (or worst X server) will hang
+ */
+ eventMask=gdk_window_get_events(window);
+ if(!(eventMask & GDK_PROPERTY_CHANGE_MASK))
+ {
+ XFDASHBOARD_DEBUG(NULL, WINDOWS,
+ "GDK-X11 window %p for stage %s@%p does not support GDK_PROPERTY_CHANGE_MASK to get timestamp for windows",
+ window,
+ G_OBJECT_TYPE_NAME(stage),
+ stage);
+ continue;
+ }
+
+ timestamp=gdk_x11_get_server_time(window);
}
+ }
+ g_slist_free(stages);
+ }
+#endif
- /* Check if GDK window supports GDK_PROPERTY_CHANGE_MASK event
- * or application (or worst X server) will hang
- */
- eventMask=gdk_window_get_events(window);
- if(!(eventMask & GDK_PROPERTY_CHANGE_MASK))
+#ifdef CLUTTER_WINDOWING_GDK
+ /* Next we try to get timestamp via Clutter GDK backend if available and used */
+ if(clutter_check_windowing_backend(CLUTTER_WINDOWING_GDK))
+ {
+ GdkWindow *window;
+ GdkEventMask eventMask;
+ GSList *stages;
+ GSList *iter;
+ ClutterStage *stage;
+
+ /* Iterate through stages, get their GDK-X11 window and try to retrieve timestamp */
+ timestamp=0;
+ stages=clutter_stage_manager_list_stages(clutter_stage_manager_get_default());
+ for(iter=stages; timestamp==0 && iter; iter=g_slist_next(iter))
+ {
+ /* Get stage */
+ stage=CLUTTER_STAGE(iter->data);
+ if(stage)
{
- XFDASHBOARD_DEBUG(NULL, WINDOWS,
- "GDK window %p for stage %p does not support GDK_PROPERTY_CHANGE_MASK to get timestamp for windows",
- window,
- stage);
- continue;
+ /* Get GDK window of stage */
+ window=clutter_gdk_get_stage_window(stage);
+ if(!window)
+ {
+ XFDASHBOARD_DEBUG(NULL, WINDOWS,
+ "No GDK-X11 window found for stage %s@%p to get timestamp for windows",
+ G_OBJECT_TYPE_NAME(stage),
+ stage);
+ continue;
+ }
+
+ /* Check if GDK window supports GDK_PROPERTY_CHANGE_MASK event
+ * or application (or worst X server) will hang
+ */
+ eventMask=gdk_window_get_events(window);
+ if(!(eventMask & GDK_PROPERTY_CHANGE_MASK))
+ {
+ XFDASHBOARD_DEBUG(NULL, WINDOWS,
+ "GDK-X11 window %p for stage %s@%p does not support GDK_PROPERTY_CHANGE_MASK to get timestamp for windows",
+ window,
+ G_OBJECT_TYPE_NAME(stage),
+ stage);
+ continue;
+ }
+
+ timestamp=gdk_x11_get_server_time(window);
}
-
- timestamp=gdk_x11_get_server_time(window);
}
+ g_slist_free(stages);
}
- g_slist_free(stages);
+#endif
/* Return timestamp of last resort */
XFDASHBOARD_DEBUG(NULL, WINDOWS,
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list