[Xfce4-commits] [apps/xfdashboard] 12/13: Move focus if current focussed actor is going to be hidden
noreply at xfce.org
noreply at xfce.org
Tue Mar 24 10:25:10 CET 2015
This is an automated email from the git hooks/post-receive script.
nomad pushed a commit to annotated tag 0.2.1
in repository apps/xfdashboard.
commit 6b15d55916012a83b4ecc0055eea5744e60a4e91
Author: Stephan Haller <nomad at froevel.de>
Date: Wed Jul 16 21:08:32 2014 +0200
Move focus if current focussed actor is going to be hidden
If a registered focusable actor is going to be hidden or unrealized move focus to next focusable actor.
---
src/focus-manager.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 5 deletions(-)
diff --git a/src/focus-manager.c b/src/focus-manager.c
index 2c372a5..27ee3b7 100644
--- a/src/focus-manager.c
+++ b/src/focus-manager.c
@@ -86,6 +86,44 @@ static void _xfdashboard_focus_manager_on_focusable_destroy(XfdashboardFocusMana
xfdashboard_focus_manager_unregister(self, focusable);
}
+/* A registered focusable actor is going to be hidden or unrealized */
+static void _xfdashboard_focus_manager_on_focusable_hide(XfdashboardFocusManager *self,
+ gpointer inUserData)
+{
+ XfdashboardFocusManagerPrivate *priv;
+ XfdashboardFocusable *focusable;
+ XfdashboardFocusable *nextFocusable;
+
+ g_return_if_fail(XFDASHBOARD_IS_FOCUS_MANAGER(self));
+ g_return_if_fail(XFDASHBOARD_IS_FOCUSABLE(inUserData));
+
+ priv=self->priv;
+ focusable=XFDASHBOARD_FOCUSABLE(inUserData);
+
+ /* Only move focus if hidden or unrealized focusable actor is the one
+ * which has the focus currently.
+ */
+ if(priv->currentFocus!=focusable) return;
+
+ if(CLUTTER_ACTOR_IS_MAPPED(CLUTTER_ACTOR(focusable)) &&
+ CLUTTER_ACTOR_IS_REALIZED(CLUTTER_ACTOR(focusable)) &&
+ CLUTTER_ACTOR_IS_VISIBLE(CLUTTER_ACTOR(focusable)))
+ {
+ return;
+ }
+
+ /* Move focus to next focusable actor if this actor which has the current focus
+ * is going to be unrealized or hidden.
+ */
+ nextFocusable=xfdashboard_focus_manager_get_next_focusable(self, priv->currentFocus);
+ if(nextFocusable && nextFocusable!=priv->currentFocus) xfdashboard_focus_manager_set_focus(self, nextFocusable);
+ else
+ {
+ xfdashboard_focusable_unset_focus(priv->currentFocus);
+ priv->currentFocus=NULL;
+ }
+}
+
/* IMPLEMENTATION: GObject */
/* Dispose this object */
@@ -107,6 +145,9 @@ static void _xfdashboard_focus_manager_dispose_unregister_focusable(gpointer inD
g_signal_handlers_disconnect_by_func(focusable,
G_CALLBACK(_xfdashboard_focus_manager_on_focusable_destroy),
self);
+ g_signal_handlers_disconnect_by_func(focusable,
+ G_CALLBACK(_xfdashboard_focus_manager_on_focusable_hide),
+ self);
g_signal_emit(self, XfdashboardFocusManagerSignals[SIGNAL_UNREGISTERED], 0, focusable);
}
@@ -247,13 +288,21 @@ void xfdashboard_focus_manager_register(XfdashboardFocusManager *self, Xfdashboa
/* Add focusable actor to list of registered focusable actors */
priv->registeredFocusables=g_list_append(priv->registeredFocusables, inFocusable);
- /* Connect to "destroy" signal to get notified if actor is
- * going to be destroy to remove it from list of focusable actors.
+ /* Connect to signals to get notified if actor is going to be destroy,
+ * unrealized or hidden to remove it from list of focusable actors.
*/
g_signal_connect_swapped(inFocusable,
"destroy",
G_CALLBACK(_xfdashboard_focus_manager_on_focusable_destroy),
self);
+ g_signal_connect_swapped(inFocusable,
+ "realize",
+ G_CALLBACK(_xfdashboard_focus_manager_on_focusable_hide),
+ self);
+ g_signal_connect_swapped(inFocusable,
+ "hide",
+ G_CALLBACK(_xfdashboard_focus_manager_on_focusable_hide),
+ self);
/* Emit signal */
g_signal_emit(self, XfdashboardFocusManagerSignals[SIGNAL_REGISTERED], 0, inFocusable);
@@ -302,12 +351,13 @@ void xfdashboard_focus_manager_unregister(XfdashboardFocusManager *self, Xfdashb
/* Remove focusable actor from list of registered focusable actors */
priv->registeredFocusables=g_list_remove(priv->registeredFocusables, inFocusable);
- /* Disconnect from signal "destroy" as we are not interested in this
- * actor anymore.
- */
+ /* Disconnect from signals because we are not interested in this actor anymore */
g_signal_handlers_disconnect_by_func(inFocusable,
G_CALLBACK(_xfdashboard_focus_manager_on_focusable_destroy),
self);
+ g_signal_handlers_disconnect_by_func(inFocusable,
+ G_CALLBACK(_xfdashboard_focus_manager_on_focusable_hide),
+ self);
/* Emit signal */
g_signal_emit(self, XfdashboardFocusManagerSignals[SIGNAL_UNREGISTERED], 0, inFocusable);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list