[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