[Xfce4-commits] [apps/xfdashboard] 07/19: Redirect interface functions show_stage() and hide_stage() of XfdashboardWindowTrackerWindow to virtual functions of new window tracker backend interface.
noreply at xfce.org
noreply at xfce.org
Fri Jun 16 10:56:38 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 71a592cec469b42a6d0e2672d87cce0f25346ec4
Author: Stephan Haller <nomad at froevel.de>
Date: Tue Jun 13 09:36:00 2017 +0200
Redirect interface functions show_stage() and hide_stage() of XfdashboardWindowTrackerWindow to virtual functions of new window tracker backend interface.
Enhancement for issue GH #129
---
libxfdashboard/gdk/window-tracker-window-gdk.c | 480 -------------------------
libxfdashboard/window-tracker-window.c | 72 ++--
libxfdashboard/window-tracker-window.h | 2 -
libxfdashboard/x11/window-tracker-window-x11.c | 468 ------------------------
4 files changed, 52 insertions(+), 970 deletions(-)
diff --git a/libxfdashboard/gdk/window-tracker-window-gdk.c b/libxfdashboard/gdk/window-tracker-window-gdk.c
index 62cd670..ccfff9b 100644
--- a/libxfdashboard/gdk/window-tracker-window-gdk.c
+++ b/libxfdashboard/gdk/window-tracker-window-gdk.c
@@ -219,278 +219,6 @@ static void _xfdashboard_window_tracker_window_gdk_update_actions(XfdashboardWin
}
}
-/* Size of screen has changed so resize stage window */
-static void _xfdashboard_window_tracker_window_gdk_on_stage_screen_size_changed(XfdashboardWindowTracker *inWindowTracker,
- gint inWidth,
- gint inHeight,
- gpointer inUserData)
-{
-#ifdef HAVE_XINERAMA
- XfdashboardWindowTrackerWindowGDK *realStageWindow;
- WnckWindow *stageWindow;
- GdkDisplay *display;
- GdkScreen *screen;
- XineramaScreenInfo *monitors;
- int monitorsCount;
- gint top, bottom, left, right;
- gint topIndex, bottomIndex, leftIndex, rightIndex;
- gint i;
- Atom atomFullscreenMonitors;
- XEvent xEvent;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(inWindowTracker));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_GDK(inUserData));
-
- realStageWindow=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK(inUserData);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS, "Set fullscreen across all monitors using Xinerama");
-
- /* Get wnck window for stage window object as it is needed a lot from this
- * point on.
- */
- stageWindow=xfdashboard_window_tracker_window_gdk_get_window(realStageWindow);
-
- /* If window manager does not support fullscreen across all monitors
- * return here.
- */
- if(!wnck_screen_net_wm_supports(wnck_window_get_screen(stageWindow), "_NET_WM_FULLSCREEN_MONITORS"))
- {
- g_warning(_("Keep window fullscreen on primary monitor because window manager does not support _NET_WM_FULLSCREEN_MONITORS."));
- return;
- }
-
- /* Get display */
- display=gdk_display_get_default();
-
- /* Get screen */
- screen=gdk_screen_get_default();
-
- /* Check if Xinerama is active on display. If not try to move and resize
- * stage window to primary monitor.
- */
- if(!XineramaIsActive(GDK_DISPLAY_XDISPLAY(display)))
- {
-#if GTK_CHECK_VERSION(3, 22, 0)
- GdkMonitor *primaryMonitor;
-#else
- gint primaryMonitor;
-#endif
- GdkRectangle geometry;
-
- /* Get position and size of primary monitor and try to move and resize
- * stage window to its position and size. Even if it fails it should
- * resize the stage to the size of current monitor this window is
- * fullscreened to. Tested with xfwm4.
- */
-#if GTK_CHECK_VERSION(3, 22, 0)
- primaryMonitor=gdk_display_get_primary_monitor(gdk_screen_get_display(screen));
- gdk_monitor_get_geometry(primaryMonitor, &geometry);
-#else
- primaryMonitor=gdk_screen_get_primary_monitor(screen);
- gdk_screen_get_monitor_geometry(screen, primaryMonitor, &geometry);
-#endif
- wnck_window_set_geometry(stageWindow,
- WNCK_WINDOW_GRAVITY_STATIC,
- WNCK_WINDOW_CHANGE_X | WNCK_WINDOW_CHANGE_Y | WNCK_WINDOW_CHANGE_WIDTH | WNCK_WINDOW_CHANGE_HEIGHT,
- geometry.x, geometry.y, geometry.width, geometry.height);
- return;
- }
-
- /* Get monitors from Xinerama */
- monitors=XineramaQueryScreens(GDK_DISPLAY_XDISPLAY(display), &monitorsCount);
- if(monitorsCount<=0 || !monitors)
- {
- if(monitors) XFree(monitors);
- return;
- }
-
- /* Get monitor indices for each corner of screen */
- xfdashboard_window_tracker_get_screen_size(inWindowTracker, &left, &top);
- bottom=0;
- right=0;
- topIndex=bottomIndex=leftIndex=rightIndex=0;
- for(i=0; i<monitorsCount; i++)
- {
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Checking edges at monitor %d with upper-left at %d,%d and lower-right at %d,%d [size: %dx%d]",
- i,
- monitors[i].x_org,
- monitors[i].y_org,
- monitors[i].x_org+monitors[i].width, monitors[i].y_org+monitors[i].height,
- monitors[i].width, monitors[i].height);
-
- if(left>monitors[i].x_org)
- {
- left=monitors[i].x_org;
- leftIndex=i;
- }
-
- if(right<(monitors[i].x_org+monitors[i].width))
- {
- right=(monitors[i].x_org+monitors[i].width);
- rightIndex=i;
- }
-
- if(top>monitors[i].y_org)
- {
- top=monitors[i].y_org;
- topIndex=i;
- }
-
- if(bottom<(monitors[i].y_org+monitors[i].height))
- {
- bottom=(monitors[i].y_org+monitors[i].height);
- bottomIndex=i;
- }
- }
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Found edge monitors: left=%d (monitor %d), right=%d (monitor %d), top=%d (monitor %d), bottom=%d (monitor %d)",
- left, leftIndex,
- right, rightIndex,
- top, topIndex,
- bottom, bottomIndex);
-
- /* Get X atom for fullscreen-across-all-monitors */
- atomFullscreenMonitors=XInternAtom(GDK_DISPLAY_XDISPLAY(display),
- "_NET_WM_FULLSCREEN_MONITORS",
- False);
-
- /* Send event to X to set window to fullscreen over all monitors */
- memset(&xEvent, 0, sizeof(xEvent));
- xEvent.type=ClientMessage;
- xEvent.xclient.window=wnck_window_get_xid(stageWindow);
- xEvent.xclient.display=GDK_DISPLAY_XDISPLAY(display);
- xEvent.xclient.message_type=atomFullscreenMonitors;
- xEvent.xclient.format=32;
- xEvent.xclient.data.l[0]=topIndex;
- xEvent.xclient.data.l[1]=bottomIndex;
- xEvent.xclient.data.l[2]=leftIndex;
- xEvent.xclient.data.l[3]=rightIndex;
- xEvent.xclient.data.l[4]=0;
- XSendEvent(GDK_DISPLAY_XDISPLAY(display),
- DefaultRootWindow(GDK_DISPLAY_XDISPLAY(display)),
- False,
- SubstructureRedirectMask | SubstructureNotifyMask,
- &xEvent);
-
- /* Release allocated resources */
- if(monitors) XFree(monitors);
-#else
- XfdashboardWindowTrackerWindowGDK *realStageWindow;
- WnckWindow *stageWindow;
- GdkScreen *screen;
- gint primaryMonitor;
- GdkRectangle geometry;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(inWindowTracker));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_GDK(inUserData));
-
- realStageWindow=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK(inUserData);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS, "No support for multiple monitor: Setting fullscreen on primary monitor");
-
- /* Get wnck window for stage window object as it is needed a lot from this
- * point on.
- */
- stageWindow=xfdashboard_window_tracker_window_gdk_get_window(realStageWindow);
-
- /* Get screen */
- screen=gdk_screen_get_default();
-
- /* Get position and size of primary monitor and try to move and resize
- * stage window to its position and size. Even if it fails it should
- * resize the stage to the size of current monitor this window is
- * fullscreened to. Tested with xfwm4.
- */
- primaryMonitor=gdk_screen_get_primary_monitor(screen);
- gdk_screen_get_monitor_geometry(screen, primaryMonitor, &geometry);
- wnck_window_set_geometry(stageWindow,
- WNCK_WINDOW_GRAVITY_STATIC,
- WNCK_WINDOW_CHANGE_X | WNCK_WINDOW_CHANGE_Y | WNCK_WINDOW_CHANGE_WIDTH | WNCK_WINDOW_CHANGE_HEIGHT,
- geometry.x, geometry.y, geometry.width, geometry.height);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Moving stage window to %d,%d and resize to %dx%d",
- geometry.x, geometry.y,
- geometry.width, geometry.height);
-#endif
-}
-
-/* State of stage window changed */
-static void _xfdashboard_window_tracker_window_gdk_on_stage_state_changed(WnckWindow *inWindow,
- WnckWindowState inChangedMask,
- WnckWindowState inNewValue,
- gpointer inUserData)
-{
- g_return_if_fail(WNCK_IS_WINDOW(inWindow));
-
- /* Set 'skip-tasklist' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_SKIP_TASKLIST) &&
- !(inNewValue & WNCK_WINDOW_STATE_SKIP_TASKLIST))
- {
- wnck_window_set_skip_tasklist(WNCK_WINDOW(inWindow), TRUE);
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'skip-tasklist' for stage window %p needs reset",
- inWindow);
- }
-
- /* Set 'skip-pager' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_SKIP_PAGER) &&
- !(inNewValue & WNCK_WINDOW_STATE_SKIP_PAGER))
- {
- wnck_window_set_skip_pager(WNCK_WINDOW(inWindow), TRUE);
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'skip-pager' for stage window %p needs reset",
- inWindow);
- }
-
- /* Set 'make-above' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_ABOVE) &&
- !(inNewValue & WNCK_WINDOW_STATE_ABOVE))
- {
- wnck_window_make_above(WNCK_WINDOW(inWindow));
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'make-above' for stage window %p needs reset",
- inWindow);
- }
-}
-
-/* The active window changed. Reselect stage window as active one if it is visible */
-static void _xfdashboard_window_tracker_window_gdk_on_stage_active_window_changed(WnckScreen *inScreen,
- WnckWindow *inPreviousWindow,
- gpointer inUserData)
-{
- XfdashboardWindowTrackerWindowGDK *self;
- XfdashboardWindowTrackerWindowGDKPrivate *priv;
- WnckWindow *activeWindow;
- gboolean reselect;
-
- g_return_if_fail(WNCK_IS_SCREEN(inScreen));
- g_return_if_fail(inPreviousWindow==NULL || WNCK_IS_WINDOW(inPreviousWindow));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_GDK(inUserData));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK(inUserData);
- priv=self->priv;
- reselect=FALSE;
-
- /* Reactive stage window if not hidden */
- activeWindow=wnck_screen_get_active_window(inScreen);
-
- if(inPreviousWindow && inPreviousWindow==priv->window) reselect=TRUE;
- if(!activeWindow || activeWindow!=priv->window) reselect=TRUE;
- if(!(priv->state & (XFDASHBOARD_WINDOW_TRACKER_WINDOW_STATE_MINIMIZED | XFDASHBOARD_WINDOW_TRACKER_WINDOW_STATE_HIDDEN))) reselect=TRUE;
-
- if(reselect)
- {
- wnck_window_activate_transient(priv->window, xfdashboard_window_tracker_gdk_get_time());
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Active window changed from %p (%s) to %p (%s) but stage window %p is visible and should be active one",
- inPreviousWindow, inPreviousWindow ? wnck_window_get_name(inPreviousWindow) : "<nil>",
- activeWindow, activeWindow ? wnck_window_get_name(activeWindow) : "<nil>",
- priv->window);
- }
-}
-
/* Proxy signal for mapped wnck window which changed name */
static void _xfdashboard_window_tracker_window_gdk_on_wnck_name_changed(XfdashboardWindowTrackerWindowGDK *self,
gpointer inUserData)
@@ -1454,212 +1182,6 @@ static ClutterStage* _xfdashboard_window_tracker_window_gdk_window_tracker_windo
return(foundStage);
}
-/* Set up and show window for use as stage */
-static void _xfdashboard_window_tracker_window_gdk_window_tracker_window_show_stage(XfdashboardWindowTrackerWindow *inWindow)
-{
- XfdashboardWindowTrackerWindowGDK *self;
- XfdashboardWindowTrackerWindowGDKPrivate *priv;
- XfdashboardWindowTracker *windowTracker;
- GdkWindow *stageWindow;
- WnckScreen *screen;
- guint signalID;
- gulong handlerID;
- gint width, height;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_GDK(inWindow));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK(inWindow);
- priv=self->priv;
-
- /* A wnck window must be wrapped by this object */
- if(!priv->window)
- {
- XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK_WARN_NO_WINDOW(self);
- return;
- }
-
- /* Get stage window */
- stageWindow=clutter_gdk_get_stage_window(_xfdashboard_window_tracker_window_gdk_window_tracker_window_get_stage(inWindow));
-
- /* Get screen of window */
- screen=wnck_window_get_screen(priv->window);
-
- /* Window of stage should always be above all other windows, pinned to all
- * workspaces, not be listed in window pager and set to fullscreen
- */
- gdk_window_set_skip_taskbar_hint(stageWindow, TRUE);
- gdk_window_set_skip_pager_hint(stageWindow, TRUE);
- gdk_window_set_keep_above(stageWindow, TRUE);
- gdk_window_stick(stageWindow);
-#if GTK_CHECK_VERSION(3, 8, 0)
- gdk_window_set_fullscreen_mode(stageWindow, GDK_FULLSCREEN_ON_ALL_MONITORS);
-#endif
- gdk_window_fullscreen(stageWindow);
-
- /* Connect signals if not already connected */
- signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
- handlerID=g_signal_handler_find(priv->window,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_state_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(priv->window,
- "state-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_state_changed),
- NULL);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'state-changed' at window %p (wnck-window=%p)",
- self,
- priv->window);
- }
-
- signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
- handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_active_window_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(screen,
- "active-window-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_active_window_changed),
- self);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
- screen,
- self,
- priv->window);
- }
-
- windowTracker=xfdashboard_window_tracker_get_default();
- signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
- handlerID=g_signal_handler_find(windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_screen_size_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(windowTracker,
- "screen-size-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_screen_size_changed),
- self);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'screen-size-changed' at window %p (wnck-window=%p)",
- self,
- priv->window);
- }
- xfdashboard_window_tracker_get_screen_size(windowTracker, &width, &height);
- _xfdashboard_window_tracker_window_gdk_on_stage_screen_size_changed(windowTracker,
- width,
- height,
- self);
- g_object_unref(windowTracker);
-
- /* Now the window is set up and we can show it */
- gdk_window_show(stageWindow);
-}
-
-/* Unset up and hide stage window */
-static void _xfdashboard_window_tracker_window_gdk_window_tracker_window_hide_stage(XfdashboardWindowTrackerWindow *inWindow)
-{
- XfdashboardWindowTrackerWindowGDK *self;
- XfdashboardWindowTrackerWindowGDKPrivate *priv;
- XfdashboardWindowTracker *windowTracker;
- GdkWindow *stageWindow;
- WnckScreen *screen;
- guint signalID;
- gulong handlerID;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_GDK(inWindow));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK(inWindow);
- priv=self->priv;
-
- /* A wnck window must be wrapped by this object */
- if(!priv->window)
- {
- XFDASHBOARD_WINDOW_TRACKER_WINDOW_GDK_WARN_NO_WINDOW(self);
- return;
- }
-
- /* Get stage window */
- stageWindow=clutter_gdk_get_stage_window(_xfdashboard_window_tracker_window_gdk_window_tracker_window_get_stage(inWindow));
-
- /* First hide window before removing signals etc. */
- gdk_window_hide(stageWindow);
-
- /* Get screen of window */
- screen=wnck_window_get_screen(WNCK_WINDOW(priv->window));
-
- /* Disconnect signals */
- signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
- handlerID=g_signal_handler_find(priv->window,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_state_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(priv->window, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'state-changed' at window %p (wnck-window=%p)",
- handlerID,
- self,
- priv->window);
- }
-
- signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
- handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_active_window_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(screen, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
- handlerID,
- screen,
- self,
- priv->window);
- }
-
- windowTracker=xfdashboard_window_tracker_get_default();
- signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
- handlerID=g_signal_handler_find(windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_gdk_on_stage_screen_size_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(windowTracker, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'screen-size-changed' at window %p (wnck-window=%p)",
- handlerID,
- self,
- priv->window);
- }
- g_object_unref(windowTracker);
-}
-
/* Interface initialization
* Set up default functions
*/
@@ -1696,8 +1218,6 @@ static void _xfdashboard_window_tracker_window_gdk_window_tracker_window_iface_i
iface->get_content=_xfdashboard_window_tracker_window_gdk_window_tracker_window_get_content;
iface->get_stage=_xfdashboard_window_tracker_window_gdk_window_tracker_window_get_stage;
- iface->show_stage=_xfdashboard_window_tracker_window_gdk_window_tracker_window_show_stage;
- iface->hide_stage=_xfdashboard_window_tracker_window_gdk_window_tracker_window_hide_stage;
}
diff --git a/libxfdashboard/window-tracker-window.c b/libxfdashboard/window-tracker-window.c
index 80c1ed6..67eed15 100644
--- a/libxfdashboard/window-tracker-window.c
+++ b/libxfdashboard/window-tracker-window.c
@@ -29,7 +29,7 @@
#include <glib/gi18n-lib.h>
-#include <libxfdashboard/window-tracker.h>
+#include <libxfdashboard/window-tracker-backend.h>
#include <libxfdashboard/enums.h>
#include <libxfdashboard/marshal.h>
#include <libxfdashboard/compat.h>
@@ -762,44 +762,76 @@ ClutterStage* xfdashboard_window_tracker_window_get_stage(XfdashboardWindowTrack
return(NULL);
}
-/* Set up and show window for use as stage window */
+/**
+ * xfdashboard_window_tracker_window_show_stage:
+ * @self: A #XfdashboardWindowTrackerWindow
+ *
+ * Asks the default window tracker backend to set up and show the window @self
+ * for use as stage window.
+ *
+ * This function is the logical equivalent of:
+ *
+ * |[<!-- language="C" -->
+ * XfdashboardWindowTrackerBackend *backend;
+ *
+ * backend=xfdashboard_window_tracker_backend_get_default();
+ * xfdashboard_window_tracker_backend_show_stage_window(backend, self);
+ * ]|
+ */
void xfdashboard_window_tracker_window_show_stage(XfdashboardWindowTrackerWindow *self)
{
- XfdashboardWindowTrackerWindowInterface *iface;
+ XfdashboardWindowTrackerBackend *backend;
g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
- iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
-
- /* Call virtual function */
- if(iface->show_stage)
+ /* Get default window tracker backend */
+ backend=xfdashboard_window_tracker_backend_get_default();
+ if(!backend)
{
- iface->show_stage(self);
+ g_critical(_("Could not get default window tracker backend"));
return;
}
- /* If we get here the virtual function was not overridden */
- XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "show_stage");
-}
+ /* Redirect function to window tracker backend */
+ xfdashboard_window_tracker_backend_show_stage_window(backend, self);
-/* Unset up and hide stage window */
+ /* Release allocated resources */
+ if(backend) g_object_unref(backend);
+}
+
+/**
+ * xfdashboard_window_tracker_window_hide_stage:
+ * @self: A #XfdashboardWindowTrackerWindow
+ *
+ * Asks the default window tracker backend to hide the stage window @self.
+ * This function is the logical equivalent of:
+ *
+ * |[<!-- language="C" -->
+ * XfdashboardWindowTrackerBackend *backend;
+ *
+ * backend=xfdashboard_window_tracker_backend_get_default();
+ * xfdashboard_window_tracker_backend_hide_stage_window(backend, self);
+ * ]|
+ */
void xfdashboard_window_tracker_window_hide_stage(XfdashboardWindowTrackerWindow *self)
{
- XfdashboardWindowTrackerWindowInterface *iface;
+ XfdashboardWindowTrackerBackend *backend;
g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
- iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
-
- /* Call virtual function */
- if(iface->hide_stage)
+ /* Get default window tracker backend */
+ backend=xfdashboard_window_tracker_backend_get_default();
+ if(!backend)
{
- iface->hide_stage(self);
+ g_critical(_("Could not get default window tracker backend"));
return;
}
- /* If we get here the virtual function was not overridden */
- XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "hide_stage");
+ /* Redirect function to window tracker backend */
+ xfdashboard_window_tracker_backend_hide_stage_window(backend, self);
+
+ /* Release allocated resources */
+ if(backend) g_object_unref(backend);
}
/* Get process ID owning the requested window */
diff --git a/libxfdashboard/window-tracker-window.h b/libxfdashboard/window-tracker-window.h
index f57f956..6aea5b0 100644
--- a/libxfdashboard/window-tracker-window.h
+++ b/libxfdashboard/window-tracker-window.h
@@ -130,8 +130,6 @@ struct _XfdashboardWindowTrackerWindowInterface
ClutterContent* (*get_content)(XfdashboardWindowTrackerWindow *self);
ClutterStage* (*get_stage)(XfdashboardWindowTrackerWindow *self);
- void (*show_stage)(XfdashboardWindowTrackerWindow *self);
- void (*hide_stage)(XfdashboardWindowTrackerWindow *self);
/* Signals */
void (*name_changed)(XfdashboardWindowTrackerWindow *self);
diff --git a/libxfdashboard/x11/window-tracker-window-x11.c b/libxfdashboard/x11/window-tracker-window-x11.c
index 9462635..54ed8a0 100644
--- a/libxfdashboard/x11/window-tracker-window-x11.c
+++ b/libxfdashboard/x11/window-tracker-window-x11.c
@@ -218,278 +218,6 @@ static void _xfdashboard_window_tracker_window_x11_update_actions(XfdashboardWin
}
}
-/* Size of screen has changed so resize stage window */
-static void _xfdashboard_window_tracker_window_x11_on_stage_screen_size_changed(XfdashboardWindowTracker *inWindowTracker,
- gint inWidth,
- gint inHeight,
- gpointer inUserData)
-{
-#ifdef HAVE_XINERAMA
- XfdashboardWindowTrackerWindowX11 *realStageWindow;
- WnckWindow *stageWindow;
- GdkDisplay *display;
- GdkScreen *screen;
- XineramaScreenInfo *monitors;
- int monitorsCount;
- gint top, bottom, left, right;
- gint topIndex, bottomIndex, leftIndex, rightIndex;
- gint i;
- Atom atomFullscreenMonitors;
- XEvent xEvent;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(inWindowTracker));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(inUserData));
-
- realStageWindow=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(inUserData);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS, "Set fullscreen across all monitors using Xinerama");
-
- /* Get wnck window for stage window object as it is needed a lot from this
- * point on.
- */
- stageWindow=xfdashboard_window_tracker_window_x11_get_window(realStageWindow);
-
- /* If window manager does not support fullscreen across all monitors
- * return here.
- */
- if(!wnck_screen_net_wm_supports(wnck_window_get_screen(stageWindow), "_NET_WM_FULLSCREEN_MONITORS"))
- {
- g_warning(_("Keep window fullscreen on primary monitor because window manager does not support _NET_WM_FULLSCREEN_MONITORS."));
- return;
- }
-
- /* Get display */
- display=gdk_display_get_default();
-
- /* Get screen */
- screen=gdk_screen_get_default();
-
- /* Check if Xinerama is active on display. If not try to move and resize
- * stage window to primary monitor.
- */
- if(!XineramaIsActive(GDK_DISPLAY_XDISPLAY(display)))
- {
-#if GTK_CHECK_VERSION(3, 22, 0)
- GdkMonitor *primaryMonitor;
-#else
- gint primaryMonitor;
-#endif
- GdkRectangle geometry;
-
- /* Get position and size of primary monitor and try to move and resize
- * stage window to its position and size. Even if it fails it should
- * resize the stage to the size of current monitor this window is
- * fullscreened to. Tested with xfwm4.
- */
-#if GTK_CHECK_VERSION(3, 22, 0)
- primaryMonitor=gdk_display_get_primary_monitor(gdk_screen_get_display(screen));
- gdk_monitor_get_geometry(primaryMonitor, &geometry);
-#else
- primaryMonitor=gdk_screen_get_primary_monitor(screen);
- gdk_screen_get_monitor_geometry(screen, primaryMonitor, &geometry);
-#endif
- wnck_window_set_geometry(stageWindow,
- WNCK_WINDOW_GRAVITY_STATIC,
- WNCK_WINDOW_CHANGE_X | WNCK_WINDOW_CHANGE_Y | WNCK_WINDOW_CHANGE_WIDTH | WNCK_WINDOW_CHANGE_HEIGHT,
- geometry.x, geometry.y, geometry.width, geometry.height);
- return;
- }
-
- /* Get monitors from Xinerama */
- monitors=XineramaQueryScreens(GDK_DISPLAY_XDISPLAY(display), &monitorsCount);
- if(monitorsCount<=0 || !monitors)
- {
- if(monitors) XFree(monitors);
- return;
- }
-
- /* Get monitor indices for each corner of screen */
- xfdashboard_window_tracker_get_screen_size(inWindowTracker, &left, &top);
- bottom=0;
- right=0;
- topIndex=bottomIndex=leftIndex=rightIndex=0;
- for(i=0; i<monitorsCount; i++)
- {
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Checking edges at monitor %d with upper-left at %d,%d and lower-right at %d,%d [size: %dx%d]",
- i,
- monitors[i].x_org,
- monitors[i].y_org,
- monitors[i].x_org+monitors[i].width, monitors[i].y_org+monitors[i].height,
- monitors[i].width, monitors[i].height);
-
- if(left>monitors[i].x_org)
- {
- left=monitors[i].x_org;
- leftIndex=i;
- }
-
- if(right<(monitors[i].x_org+monitors[i].width))
- {
- right=(monitors[i].x_org+monitors[i].width);
- rightIndex=i;
- }
-
- if(top>monitors[i].y_org)
- {
- top=monitors[i].y_org;
- topIndex=i;
- }
-
- if(bottom<(monitors[i].y_org+monitors[i].height))
- {
- bottom=(monitors[i].y_org+monitors[i].height);
- bottomIndex=i;
- }
- }
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Found edge monitors: left=%d (monitor %d), right=%d (monitor %d), top=%d (monitor %d), bottom=%d (monitor %d)",
- left, leftIndex,
- right, rightIndex,
- top, topIndex,
- bottom, bottomIndex);
-
- /* Get X atom for fullscreen-across-all-monitors */
- atomFullscreenMonitors=XInternAtom(GDK_DISPLAY_XDISPLAY(display),
- "_NET_WM_FULLSCREEN_MONITORS",
- False);
-
- /* Send event to X to set window to fullscreen over all monitors */
- memset(&xEvent, 0, sizeof(xEvent));
- xEvent.type=ClientMessage;
- xEvent.xclient.window=wnck_window_get_xid(stageWindow);
- xEvent.xclient.display=GDK_DISPLAY_XDISPLAY(display);
- xEvent.xclient.message_type=atomFullscreenMonitors;
- xEvent.xclient.format=32;
- xEvent.xclient.data.l[0]=topIndex;
- xEvent.xclient.data.l[1]=bottomIndex;
- xEvent.xclient.data.l[2]=leftIndex;
- xEvent.xclient.data.l[3]=rightIndex;
- xEvent.xclient.data.l[4]=0;
- XSendEvent(GDK_DISPLAY_XDISPLAY(display),
- DefaultRootWindow(GDK_DISPLAY_XDISPLAY(display)),
- False,
- SubstructureRedirectMask | SubstructureNotifyMask,
- &xEvent);
-
- /* Release allocated resources */
- if(monitors) XFree(monitors);
-#else
- XfdashboardWindowTrackerWindowX11 *realStageWindow;
- WnckWindow *stageWindow;
- GdkScreen *screen;
- gint primaryMonitor;
- GdkRectangle geometry;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER(inWindowTracker));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(inUserData));
-
- realStageWindow=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(inUserData);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS, "No support for multiple monitor: Setting fullscreen on primary monitor");
-
- /* Get wnck window for stage window object as it is needed a lot from this
- * point on.
- */
- stageWindow=xfdashboard_window_tracker_window_x11_get_window(realStageWindow);
-
- /* Get screen */
- screen=gdk_screen_get_default();
-
- /* Get position and size of primary monitor and try to move and resize
- * stage window to its position and size. Even if it fails it should
- * resize the stage to the size of current monitor this window is
- * fullscreened to. Tested with xfwm4.
- */
- primaryMonitor=gdk_screen_get_primary_monitor(screen);
- gdk_screen_get_monitor_geometry(screen, primaryMonitor, &geometry);
- wnck_window_set_geometry(stageWindow,
- WNCK_WINDOW_GRAVITY_STATIC,
- WNCK_WINDOW_CHANGE_X | WNCK_WINDOW_CHANGE_Y | WNCK_WINDOW_CHANGE_WIDTH | WNCK_WINDOW_CHANGE_HEIGHT,
- geometry.x, geometry.y, geometry.width, geometry.height);
-
- XFDASHBOARD_DEBUG(inWindowTracker, WINDOWS,
- "Moving stage window to %d,%d and resize to %dx%d",
- geometry.x, geometry.y,
- geometry.width, geometry.height);
-#endif
-}
-
-/* State of stage window changed */
-static void _xfdashboard_window_tracker_window_x11_on_stage_state_changed(WnckWindow *inWindow,
- WnckWindowState inChangedMask,
- WnckWindowState inNewValue,
- gpointer inUserData)
-{
- g_return_if_fail(WNCK_IS_WINDOW(inWindow));
-
- /* Set 'skip-tasklist' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_SKIP_TASKLIST) &&
- !(inNewValue & WNCK_WINDOW_STATE_SKIP_TASKLIST))
- {
- wnck_window_set_skip_tasklist(WNCK_WINDOW(inWindow), TRUE);
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'skip-tasklist' for stage window %p needs reset",
- inWindow);
- }
-
- /* Set 'skip-pager' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_SKIP_PAGER) &&
- !(inNewValue & WNCK_WINDOW_STATE_SKIP_PAGER))
- {
- wnck_window_set_skip_pager(WNCK_WINDOW(inWindow), TRUE);
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'skip-pager' for stage window %p needs reset",
- inWindow);
- }
-
- /* Set 'make-above' if changed */
- if((inChangedMask & WNCK_WINDOW_STATE_ABOVE) &&
- !(inNewValue & WNCK_WINDOW_STATE_ABOVE))
- {
- wnck_window_make_above(WNCK_WINDOW(inWindow));
- XFDASHBOARD_DEBUG(inWindow, WINDOWS,
- "State 'make-above' for stage window %p needs reset",
- inWindow);
- }
-}
-
-/* The active window changed. Reselect stage window as active one if it is visible */
-static void _xfdashboard_window_tracker_window_x11_on_stage_active_window_changed(WnckScreen *inScreen,
- WnckWindow *inPreviousWindow,
- gpointer inUserData)
-{
- XfdashboardWindowTrackerWindowX11 *self;
- XfdashboardWindowTrackerWindowX11Private *priv;
- WnckWindow *activeWindow;
- gboolean reselect;
-
- g_return_if_fail(WNCK_IS_SCREEN(inScreen));
- g_return_if_fail(inPreviousWindow==NULL || WNCK_IS_WINDOW(inPreviousWindow));
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(inUserData));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(inUserData);
- priv=self->priv;
- reselect=FALSE;
-
- /* Reactive stage window if not hidden */
- activeWindow=wnck_screen_get_active_window(inScreen);
-
- if(inPreviousWindow && inPreviousWindow==priv->window) reselect=TRUE;
- if(!activeWindow || activeWindow!=priv->window) reselect=TRUE;
- if(!(priv->state & (XFDASHBOARD_WINDOW_TRACKER_WINDOW_STATE_MINIMIZED | XFDASHBOARD_WINDOW_TRACKER_WINDOW_STATE_HIDDEN))) reselect=TRUE;
-
- if(reselect)
- {
- wnck_window_activate_transient(priv->window, xfdashboard_window_tracker_x11_get_time());
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Active window changed from %p (%s) to %p (%s) but stage window %p is visible and should be active one",
- inPreviousWindow, inPreviousWindow ? wnck_window_get_name(inPreviousWindow) : "<nil>",
- activeWindow, activeWindow ? wnck_window_get_name(activeWindow) : "<nil>",
- priv->window);
- }
-}
-
/* Proxy signal for mapped wnck window which changed name */
static void _xfdashboard_window_tracker_window_x11_on_wnck_name_changed(XfdashboardWindowTrackerWindowX11 *self,
gpointer inUserData)
@@ -1451,200 +1179,6 @@ static ClutterStage* _xfdashboard_window_tracker_window_x11_window_tracker_windo
return(foundStage);
}
-/* Set up and show window for use as stage */
-static void _xfdashboard_window_tracker_window_x11_window_tracker_window_show_stage(XfdashboardWindowTrackerWindow *inWindow)
-{
- XfdashboardWindowTrackerWindowX11 *self;
- XfdashboardWindowTrackerWindowX11Private *priv;
- XfdashboardWindowTracker *windowTracker;
- WnckScreen *screen;
- guint signalID;
- gulong handlerID;
- gint width, height;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(inWindow));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(inWindow);
- priv=self->priv;
-
- /* A wnck window must be wrapped by this object */
- if(!priv->window)
- {
- XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11_WARN_NO_WINDOW(self);
- return;
- }
-
- /* Window of stage should always be above all other windows, pinned to all
- * workspaces, not be listed in window pager and set to fullscreen
- */
- if(!wnck_window_is_skip_tasklist(priv->window)) wnck_window_set_skip_tasklist(priv->window, TRUE);
- if(!wnck_window_is_skip_pager(priv->window)) wnck_window_set_skip_pager(priv->window, TRUE);
- if(!wnck_window_is_above(priv->window)) wnck_window_make_above(priv->window);
- if(!wnck_window_is_pinned(priv->window)) wnck_window_pin(priv->window);
-
- /* Get screen of window */
- screen=wnck_window_get_screen(priv->window);
-
- /* Connect signals if not already connected */
- signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
- handlerID=g_signal_handler_find(priv->window,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_state_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(priv->window,
- "state-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_state_changed),
- NULL);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'state-changed' at window %p (wnck-window=%p)",
- self,
- priv->window);
- }
-
- signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
- handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_active_window_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(screen,
- "active-window-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_active_window_changed),
- self);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
- screen,
- self,
- priv->window);
- }
-
- windowTracker=xfdashboard_window_tracker_get_default();
- signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
- handlerID=g_signal_handler_find(windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_screen_size_changed),
- NULL);
- if(!handlerID)
- {
- g_signal_connect(windowTracker,
- "screen-size-changed",
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_screen_size_changed),
- self);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Connecting signal to 'screen-size-changed' at window %p (wnck-window=%p)",
- self,
- priv->window);
- }
- xfdashboard_window_tracker_get_screen_size(windowTracker, &width, &height);
- _xfdashboard_window_tracker_window_x11_on_stage_screen_size_changed(windowTracker,
- width,
- height,
- self);
- g_object_unref(windowTracker);
-
- /* Now the window is set up and we can show it */
- xfdashboard_window_tracker_window_show(XFDASHBOARD_WINDOW_TRACKER_WINDOW(self));
-}
-
-/* Unset up and hide stage window */
-static void _xfdashboard_window_tracker_window_x11_window_tracker_window_hide_stage(XfdashboardWindowTrackerWindow *inWindow)
-{
- XfdashboardWindowTrackerWindowX11 *self;
- XfdashboardWindowTrackerWindowX11Private *priv;
- XfdashboardWindowTracker *windowTracker;
- WnckScreen *screen;
- guint signalID;
- gulong handlerID;
-
- g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW_X11(inWindow));
-
- self=XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11(inWindow);
- priv=self->priv;
-
- /* A wnck window must be wrapped by this object */
- if(!priv->window)
- {
- XFDASHBOARD_WINDOW_TRACKER_WINDOW_X11_WARN_NO_WINDOW(self);
- return;
- }
-
- /* First hide window before removing signals etc. */
- xfdashboard_window_tracker_window_hide(XFDASHBOARD_WINDOW_TRACKER_WINDOW(self));
-
- /* Get screen of window */
- screen=wnck_window_get_screen(WNCK_WINDOW(priv->window));
-
- /* Disconnect signals */
- signalID=g_signal_lookup("state-changed", WNCK_TYPE_WINDOW);
- handlerID=g_signal_handler_find(priv->window,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_state_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(priv->window, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'state-changed' at window %p (wnck-window=%p)",
- handlerID,
- self,
- priv->window);
- }
-
- signalID=g_signal_lookup("active-window-changed", WNCK_TYPE_SCREEN);
- handlerID=g_signal_handler_find(screen,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_active_window_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(screen, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'active-window-changed' at screen %p of window %p (wnck-window=%p)",
- handlerID,
- screen,
- self,
- priv->window);
- }
-
- windowTracker=xfdashboard_window_tracker_get_default();
- signalID=g_signal_lookup("screen-size-changed", XFDASHBOARD_TYPE_WINDOW_TRACKER);
- handlerID=g_signal_handler_find(windowTracker,
- G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC,
- signalID,
- 0,
- NULL,
- G_CALLBACK(_xfdashboard_window_tracker_window_x11_on_stage_screen_size_changed),
- NULL);
- if(handlerID)
- {
- g_signal_handler_disconnect(windowTracker, handlerID);
- XFDASHBOARD_DEBUG(self, WINDOWS,
- "Disconnecting handler %lu for signal 'screen-size-changed' at window %p (wnck-window=%p)",
- handlerID,
- self,
- priv->window);
- }
- g_object_unref(windowTracker);
-}
-
/* Interface initialization
* Set up default functions
*/
@@ -1681,8 +1215,6 @@ static void _xfdashboard_window_tracker_window_x11_window_tracker_window_iface_i
iface->get_content=_xfdashboard_window_tracker_window_x11_window_tracker_window_get_content;
iface->get_stage=_xfdashboard_window_tracker_window_x11_window_tracker_window_get_stage;
- iface->show_stage=_xfdashboard_window_tracker_window_x11_window_tracker_window_show_stage;
- iface->hide_stage=_xfdashboard_window_tracker_window_x11_window_tracker_window_hide_stage;
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list