[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