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 <no...@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.
_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to