[Xfce4-commits] [apps/xfdashboard] 01/01: Implement missing function to retrieve windows in stacked order at new window tracker for X11 (XfdashboardWindowTrackerX11)

noreply at xfce.org noreply at xfce.org
Thu Apr 13 15:18:15 CEST 2017


This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit 4a5361d46f6dcf7d0563637d363ebf045a1439e9
Author: Stephan Haller <nomad at froevel.de>
Date:   Thu Apr 13 15:16:34 2017 +0200

    Implement missing function to retrieve windows in stacked order at new window tracker for X11 (XfdashboardWindowTrackerX11)
    
    This fixes a visual error at live workspace in the workspace selector because the windows were shown in wrong order (and maybe the desktop window always on top) without a sorted list of windows in stacked order.
---
 libxfdashboard/x11/window-tracker-x11.c | 83 +++++++++++++++++++++++++++++----
 1 file changed, 75 insertions(+), 8 deletions(-)

diff --git a/libxfdashboard/x11/window-tracker-x11.c b/libxfdashboard/x11/window-tracker-x11.c
index f254649..99ea7c8 100644
--- a/libxfdashboard/x11/window-tracker-x11.c
+++ b/libxfdashboard/x11/window-tracker-x11.c
@@ -75,6 +75,7 @@ struct _XfdashboardWindowTrackerX11Private
 
 	/* Instance related */
 	GList									*windows;
+	GList									*windowsStacked;
 	GList									*workspaces;
 	GList									*monitors;
 
@@ -248,13 +249,19 @@ static void _xfdashboard_window_tracker_x11_free_window(XfdashboardWindowTracker
 	g_assert(G_OBJECT(inWindow)->ref_count==1);
 #endif
 
-	/* Find entry in window list and remove it if found */
+	/* Find entry in window lists and remove it if found */
 	iter=g_list_find(priv->windows, inWindow);
 	if(iter)
 	{
 		priv->windows=g_list_delete_link(priv->windows, iter);
 	}
 
+	iter=g_list_find(priv->windowsStacked, inWindow);
+	if(iter)
+	{
+		priv->windowsStacked=g_list_delete_link(priv->windowsStacked, iter);
+	}
+
 	/* Free window object */
 	g_object_unref(inWindow);
 }
@@ -279,6 +286,8 @@ static XfdashboardWindowTrackerWindowX11* _xfdashboard_window_tracker_x11_get_wi
 	for(iter=priv->windows; iter; iter=g_list_next(iter))
 	{
 		/* Get currently iterated window object */
+		if(!XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(iter->data)) continue;
+
 		window=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(iter->data);
 		if(!window) continue;
 
@@ -296,6 +305,48 @@ static XfdashboardWindowTrackerWindowX11* _xfdashboard_window_tracker_x11_get_wi
 	return(NULL);
 }
 
+/* Build correctly ordered list of windows in stacked order. The list will not
+ * take a reference at the window object and must not be unreffed if list is
+ * freed.
+ */
+static void _xfdashboard_window_tracker_x11_build_stacked_windows_list(XfdashboardWindowTrackerX11 *self)
+{
+	XfdashboardWindowTrackerX11Private		*priv;
+	GList									*wnckWindowsStacked;
+	GList									*newWindowsStacked;
+	GList									*iter;
+	WnckWindow								*wnckWindow;
+	XfdashboardWindowTrackerWindowX11		*window;
+
+	g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(self));
+
+	priv=self->priv;
+
+	/* Get list of stacked windows from wnck */
+	wnckWindowsStacked=wnck_screen_get_windows_stacked(priv->screen);
+
+	/* Build new list of stacked windows containing window objects */
+	newWindowsStacked=NULL;
+	for(iter=wnckWindowsStacked; iter; iter=g_list_next(iter))
+	{
+		/* Get wnck window iterated */
+		wnckWindow=WNCK_WINDOW(iter->data);
+		if(!wnckWindow) continue;
+
+		/* Lookup window object from wnck window iterated */
+		window=_xfdashboard_window_tracker_x11_get_window_for_wnck(self, wnckWindow);
+		if(window)
+		{
+			newWindowsStacked=g_list_prepend(newWindowsStacked, window);
+		}
+	}
+	newWindowsStacked=g_list_reverse(newWindowsStacked);
+
+	/* Release old stacked windows list */
+	g_list_free(priv->windowsStacked);
+	priv->windowsStacked=newWindowsStacked;
+}
+
 /* Create window object which must not exist yet */
 static XfdashboardWindowTrackerWindowX11* _xfdashboard_window_tracker_x11_create_window_for_wnck(XfdashboardWindowTrackerX11 *self,
 																									WnckWindow *inWindow)
@@ -338,6 +389,9 @@ static XfdashboardWindowTrackerWindowX11* _xfdashboard_window_tracker_x11_create
 	/* Add new window object to list of window objects */
 	priv->windows=g_list_prepend(priv->windows, window);
 
+	/* Assume window stacking changed to get correctly ordered list of windows */
+	_xfdashboard_window_tracker_x11_build_stacked_windows_list(self);
+
 	/* Return new window object */
 	XFDASHBOARD_DEBUG(self, WINDOWS,
 				"Created window object %s@%p for wnck window %s@%p named '%s'",
@@ -636,6 +690,9 @@ static void _xfdashboard_window_tracker_x11_on_window_stacking_changed(Xfdashboa
 {
 	g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(self));
 
+	/* Before emitting the signal, build a correctly ordered list of windows */
+	_xfdashboard_window_tracker_x11_build_stacked_windows_list(self);
+
 	/* Emit signal */
 	XFDASHBOARD_DEBUG(self, WINDOWS, "Window stacking has changed");
 	g_signal_emit_by_name(self, "window-stacking-changed");
@@ -1096,8 +1153,7 @@ static GList* _xfdashboard_window_tracker_x11_window_tracker_get_windows_stacked
 	priv=self->priv;
 
 	/* Return list of window in stack order */
-	// TODO: return(wnck_screen_get_windows_stacked(priv->screen));
-	return(priv->windows);
+	return(priv->windowsStacked);
 }
 
 /* Get active window */
@@ -1521,7 +1577,12 @@ static void _xfdashboard_window_tracker_x11_dispose(GObject *inObject)
 	/* Dispose allocated resources */
 	if(priv->suspendSignalID)
 	{
-		g_signal_handler_disconnect(xfdashboard_application_get_default(), priv->suspendSignalID);
+		if(priv->application)
+		{
+			g_signal_handler_disconnect(priv->application, priv->suspendSignalID);
+			priv->application=NULL;
+		}
+
 		priv->suspendSignalID=0;
 	}
 
@@ -1537,6 +1598,12 @@ static void _xfdashboard_window_tracker_x11_dispose(GObject *inObject)
 		priv->windows=NULL;
 	}
 
+	if(priv->windowsStacked)
+	{
+		g_list_free(priv->windowsStacked);
+		priv->windowsStacked=NULL;
+	}
+
 	if(priv->activeWorkspace)
 	{
 		priv->activeWorkspace=NULL;
@@ -1664,7 +1731,6 @@ void xfdashboard_window_tracker_x11_class_init(XfdashboardWindowTrackerX11Class
 void xfdashboard_window_tracker_x11_init(XfdashboardWindowTrackerX11 *self)
 {
 	XfdashboardWindowTrackerX11Private		*priv;
-	XfdashboardApplication					*app;
 
 	priv=self->priv=XFDASHBOARD_WINDOW_TRACKER_X11_GET_PRIVATE(self);
 
@@ -1672,6 +1738,7 @@ void xfdashboard_window_tracker_x11_init(XfdashboardWindowTrackerX11 *self)
 
 	/* Set default values */
 	priv->windows=NULL;
+	priv->windowsStacked=NULL;
 	priv->workspaces=NULL;
 	priv->monitors=NULL;
 	priv->screen=wnck_screen_get_default();
@@ -1759,12 +1826,12 @@ void xfdashboard_window_tracker_x11_init(XfdashboardWindowTrackerX11 *self)
 #endif
 
 	/* Handle suspension signals from application */
-	app=xfdashboard_application_get_default();
-	priv->suspendSignalID=g_signal_connect_swapped(app,
+	priv->application=xfdashboard_application_get_default();
+	priv->suspendSignalID=g_signal_connect_swapped(priv->application,
 													"notify::is-suspended",
 													G_CALLBACK(_xfdashboard_window_tracker_x11_on_application_suspended_changed),
 													self);
-	priv->isAppSuspended=xfdashboard_application_is_suspended(app);
+	priv->isAppSuspended=xfdashboard_application_is_suspended(priv->application);
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list