[Xfce4-commits] [apps/xfdashboard] 01/01: Allow mouse wheel to change workspace in windows view at any pointer position

noreply at xfce.org noreply at xfce.org
Wed Dec 9 14:04:41 CET 2015


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

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

commit 9a6db0999754e1c2ab872874ba0c41a74ddf0f05
Author: Stephan Haller <nomad at froevel.de>
Date:   Wed Dec 9 13:58:36 2015 +0100

    Allow mouse wheel to change workspace in windows view at any pointer position
    
    The current behaviour of the setting "/components/windows-view/scroll-event-changes-workspace" is to change workspace if pointer is over the windows view (and only there) when the mouse wheel is used.
    
    This behaviour was changed to allow the pointer to be anywhere on a monitor with an active windows view when the mouse wheel is used. Using the default theme that means that in a single monitor setup the windows view must be active to change workspace with mouse wheel (and enabled setting "/components/windows-view/scroll-event-changes-workspace" of course). The pointer can be anywhere: quicklaunch, search text box etc. In a multi-monitor setup the requirements of a single-monitor also [...]
    
    This commit fixes GH #103 (and also some typos)
---
 xfdashboard/stage-interface.c |    3 ++
 xfdashboard/view.c            |    2 +-
 xfdashboard/windows-view.c    |  114 +++++++++++++++++++++++++++++++++++------
 3 files changed, 101 insertions(+), 18 deletions(-)

diff --git a/xfdashboard/stage-interface.c b/xfdashboard/stage-interface.c
index 0363ed1..623164a 100644
--- a/xfdashboard/stage-interface.c
+++ b/xfdashboard/stage-interface.c
@@ -367,6 +367,9 @@ static void xfdashboard_stage_interface_init(XfdashboardStageInterface *self)
 	priv->backgroundColor=NULL;
 	priv->bindingBackgroundImageType=NULL;
 	priv->bindingBackgroundColor=NULL;
+
+	/* Let this actor receive events */
+	clutter_actor_set_reactive(CLUTTER_ACTOR(self), TRUE);
 }
 
 /* IMPLEMENTATION: Public API */
diff --git a/xfdashboard/view.c b/xfdashboard/view.c
index 1e7d07c..487645d 100644
--- a/xfdashboard/view.c
+++ b/xfdashboard/view.c
@@ -442,7 +442,7 @@ static void xfdashboard_view_class_init(XfdashboardViewClass *klass)
 		g_signal_new("deactivated",
 						G_TYPE_FROM_CLASS(klass),
 						G_SIGNAL_RUN_LAST,
-						G_STRUCT_OFFSET(XfdashboardViewClass, activated),
+						G_STRUCT_OFFSET(XfdashboardViewClass, deactivated),
 						NULL,
 						NULL,
 						g_cclosure_marshal_VOID__VOID,
diff --git a/xfdashboard/windows-view.c b/xfdashboard/windows-view.c
index 99e9faf..e480dc5 100644
--- a/xfdashboard/windows-view.c
+++ b/xfdashboard/windows-view.c
@@ -73,6 +73,8 @@ struct _XfdashboardWindowsViewPrivate
 
 	XfconfChannel						*xfconfChannel;
 	guint								xfconfScrollEventChangingWorkspaceBindingID;
+	XfdashboardStageInterface			*scrollEventChangingWorkspaceStage;
+	guint								scrollEventChangingWorkspaceStageSignalID;
 
 	gboolean							isWindowsNumberShown;
 
@@ -854,6 +856,12 @@ static gboolean _xfdashboard_windows_view_on_scroll_event(ClutterActor *inActor,
 	self=XFDASHBOARD_WINDOWS_VIEW(inActor);
 	priv=self->priv;
 
+	/* Do not handle event if scroll event of mouse-wheel should not
+	 * change workspace. In this case propagate event to get it handled
+	 * by next actor in chain.
+	 */
+	if(!priv->isScrollEventChangingWorkspace) return(CLUTTER_EVENT_PROPAGATE);
+
 	/* Get direction of scroll event */
 	switch(clutter_event_get_scroll_direction(inEvent))
 	{
@@ -903,26 +911,11 @@ static void _xfdashboard_windows_view_set_scroll_event_changes_workspace(Xfdashb
 	/* Set value if changed */
 	if(priv->isScrollEventChangingWorkspace!=inMouseWheelChangingWorkspace)
 	{
-		/* Remove scroll event listener if current value is TRUE
-		 * because it will be set to FALSE soon to indicate that
-		 * we should not listening to scroll events anymore
-		 */
-		if(priv->isScrollEventChangingWorkspace)
-		{
-			g_signal_handlers_disconnect_by_func(self, G_CALLBACK(_xfdashboard_windows_view_on_scroll_event), self);
-		}
-
 		/* Set value */
 		priv->isScrollEventChangingWorkspace=inMouseWheelChangingWorkspace;
 
-		/* Add scroll event listener if value was set to TRUE */
-		if(priv->isScrollEventChangingWorkspace)
-		{
-			g_signal_connect(self, "scroll-event", G_CALLBACK(_xfdashboard_windows_view_on_scroll_event), NULL);
-		}
-
 		/* Notify about property change */
-		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardWindowsViewProperties[PROP_PREVENT_UPSCALING]);
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardWindowsViewProperties[PROP_SCROLL_EVENT_CHANGES_WORKSPACE]);
 	}
 }
 
@@ -1514,6 +1507,78 @@ void _xfdashboard_windows_view_focusable_iface_init(XfdashboardFocusableInterfac
 	iface->activate_selection=_xfdashboard_windows_view_focusable_activate_selection;
 }
 
+/* IMPLEMENTATION: ClutterActor */
+
+/* Actor will be mapped */
+static void _xfdashboard_windows_view_map(ClutterActor *inActor)
+{
+	XfdashboardWindowsView			*self;
+	XfdashboardWindowsViewPrivate	*priv;
+	ClutterActorClass				*clutterActorClass;
+
+	g_return_if_fail(XFDASHBOARD_IS_WINDOWS_VIEW(inActor));
+
+	self=XFDASHBOARD_WINDOWS_VIEW(inActor);
+	priv=self->priv;
+
+	/* Call parent's virtual function */
+	clutterActorClass=CLUTTER_ACTOR_CLASS(xfdashboard_windows_view_parent_class);
+	if(clutterActorClass->map) clutterActorClass->map(inActor);
+
+	/* Disconnect signal handler if available */
+	if(priv->scrollEventChangingWorkspaceStage)
+	{
+		if(priv->scrollEventChangingWorkspaceStageSignalID)
+		{
+			g_signal_handler_disconnect(priv->scrollEventChangingWorkspaceStage, priv->scrollEventChangingWorkspaceStageSignalID);
+			priv->scrollEventChangingWorkspaceStageSignalID=0;
+		}
+
+		priv->scrollEventChangingWorkspaceStage=NULL;
+	}
+
+	/* Get stage interface where this actor belongs to and connect
+	 * signal handler if found.
+	 */
+	priv->scrollEventChangingWorkspaceStage=xfdashboard_get_stage_of_actor(CLUTTER_ACTOR(self));
+	if(priv->scrollEventChangingWorkspaceStage)
+	{
+		priv->scrollEventChangingWorkspaceStageSignalID=g_signal_connect_swapped(priv->scrollEventChangingWorkspaceStage,
+																					"scroll-event",
+																					G_CALLBACK(_xfdashboard_windows_view_on_scroll_event),
+																					self);
+	}
+}
+
+/* Actor will be unmapped */
+static void _xfdashboard_windows_view_unmap(ClutterActor *inActor)
+{
+	XfdashboardWindowsView			*self;
+	XfdashboardWindowsViewPrivate	*priv;
+	ClutterActorClass				*clutterActorClass;
+
+	g_return_if_fail(XFDASHBOARD_IS_WINDOWS_VIEW(inActor));
+
+	self=XFDASHBOARD_WINDOWS_VIEW(inActor);
+	priv=self->priv;
+
+	/* Call parent's virtual function */
+	clutterActorClass=CLUTTER_ACTOR_CLASS(xfdashboard_windows_view_parent_class);
+	if(clutterActorClass->unmap) clutterActorClass->unmap(inActor);
+
+	/* Disconnect signal handler if available */
+	if(priv->scrollEventChangingWorkspaceStage)
+	{
+		if(priv->scrollEventChangingWorkspaceStageSignalID)
+		{
+			g_signal_handler_disconnect(priv->scrollEventChangingWorkspaceStage, priv->scrollEventChangingWorkspaceStageSignalID);
+			priv->scrollEventChangingWorkspaceStageSignalID=0;
+		}
+
+		priv->scrollEventChangingWorkspaceStage=NULL;
+	}
+}
+
 /* IMPLEMENTATION: GObject */
 
 /* Dispose this object */
@@ -1523,7 +1588,16 @@ static void _xfdashboard_windows_view_dispose(GObject *inObject)
 	XfdashboardWindowsViewPrivate	*priv=XFDASHBOARD_WINDOWS_VIEW(self)->priv;
 
 	/* Release allocated resources */
-	g_signal_handlers_disconnect_by_func(self, G_CALLBACK(_xfdashboard_windows_view_on_scroll_event), self);
+	if(priv->scrollEventChangingWorkspaceStage)
+	{
+		if(priv->scrollEventChangingWorkspaceStageSignalID)
+		{
+			g_signal_handler_disconnect(priv->scrollEventChangingWorkspaceStage, priv->scrollEventChangingWorkspaceStageSignalID);
+			priv->scrollEventChangingWorkspaceStageSignalID=0;
+		}
+
+		priv->scrollEventChangingWorkspaceStage=NULL;
+	}
 
 	if(priv->xfconfChannel)
 	{
@@ -1652,6 +1726,7 @@ static void _xfdashboard_windows_view_get_property(GObject *inObject,
 static void xfdashboard_windows_view_class_init(XfdashboardWindowsViewClass *klass)
 {
 	XfdashboardActorClass	*actorClass=XFDASHBOARD_ACTOR_CLASS(klass);
+	ClutterActorClass		*clutterActorClass=CLUTTER_ACTOR_CLASS(klass);
 	GObjectClass			*gobjectClass=G_OBJECT_CLASS(klass);
 
 	/* Override functions */
@@ -1659,6 +1734,9 @@ static void xfdashboard_windows_view_class_init(XfdashboardWindowsViewClass *kla
 	gobjectClass->set_property=_xfdashboard_windows_view_set_property;
 	gobjectClass->get_property=_xfdashboard_windows_view_get_property;
 
+	clutterActorClass->map=_xfdashboard_windows_view_map;
+	clutterActorClass->unmap=_xfdashboard_windows_view_unmap;
+
 	klass->window_close=_xfdashboard_windows_view_window_close;
 	klass->windows_show_numbers=_xfdashboard_windows_view_windows_show_numbers;
 	klass->windows_hide_numbers=_xfdashboard_windows_view_windows_hide_numbers;
@@ -1924,6 +2002,8 @@ static void xfdashboard_windows_view_init(XfdashboardWindowsView *self)
 	priv->isWindowsNumberShown=FALSE;
 	priv->xfconfChannel=xfdashboard_application_get_xfconf_channel();
 	priv->isScrollEventChangingWorkspace=FALSE;
+	priv->scrollEventChangingWorkspaceStage=NULL;
+	priv->scrollEventChangingWorkspaceStageSignalID=0;
 	priv->filterMonitorWindows=FALSE;
 	priv->currentStage=NULL;
 	priv->currentMonitor=NULL;

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


More information about the Xfce4-commits mailing list