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

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

commit 4c3f8bcac4d6006fb6b5793504ec9fa7ab99960d
Author: Stephan Haller <[email protected]>
Date:   Mon Dec 14 14:03:06 2015 +0100

    Added missed modifications to focus manager needed for implementation of 
XfdashboardActionButton at commit d41a71837e20dbd6ea70214bc94a3152fc456370 for 
issue GH #102
---
 xfdashboard/focus-manager.c |  162 ++++++++++++++++++++++++++++---------------
 xfdashboard/focus-manager.h |    2 +
 2 files changed, 107 insertions(+), 57 deletions(-)

diff --git a/xfdashboard/focus-manager.c b/xfdashboard/focus-manager.c
index 20871fb..a250813 100644
--- a/xfdashboard/focus-manager.c
+++ b/xfdashboard/focus-manager.c
@@ -33,6 +33,7 @@
 #include "marshal.h"
 #include "stylable.h"
 #include "bindings-pool.h"
+#include "application.h"
 
 /* Define this class in GObject system */
 G_DEFINE_TYPE(XfdashboardFocusManager,
@@ -131,29 +132,19 @@ static void 
_xfdashboard_focus_manager_on_focusable_hide(XfdashboardFocusManager
 static GSList* 
_xfdashboard_focus_manager_get_targets_for_binding(XfdashboardFocusManager 
*self,
                                                                                
                                                        const 
XfdashboardBinding *inBinding)
 {
-       XfdashboardFocusManagerPrivate  *priv;
-       GList                                                   *focusablesIter;
-       GList                                                   
*focusablesStartPoint;
-       XfdashboardFocusable                    *focusable;
-       GType                                                   targetType;
        GSList                                                  *targets;
        gboolean                                                mustBeFocusable;
+       GSList                                                  *iter;
+       XfdashboardFocusable                    *focusable;
 
        g_return_val_if_fail(XFDASHBOARD_IS_FOCUS_MANAGER(self), NULL);
        g_return_val_if_fail(XFDASHBOARD_IS_BINDING(inBinding), NULL);
 
-       priv=self->priv;
        targets=NULL;
        mustBeFocusable=TRUE;
 
-       /* Get type of target */
-       targetType=g_type_from_name(xfdashboard_binding_get_target(inBinding));
-       if(!targetType)
-       {
-               g_warning(_("Cannot build target list for unknown type %s"),
-                                       
xfdashboard_binding_get_target(inBinding));
-               return(NULL);
-       }
+       /* Get list of possible targets */
+       targets=xfdashboard_focus_manager_get_targets(self, 
xfdashboard_binding_get_target(inBinding));
 
        /* Determine if unfocusable targets should be included */
        if(xfdashboard_binding_get_flags(inBinding) & 
XFDASHBOARD_BINDING_FLAGS_ALLOW_UNFOCUSABLE_TARGET)
@@ -161,52 +152,22 @@ static GSList* 
_xfdashboard_focus_manager_get_targets_for_binding(XfdashboardFoc
                mustBeFocusable=FALSE;
        }
 
-       /* Check if class name of target at binding points to ourselve */
-       if(g_type_is_a(G_OBJECT_TYPE(self), targetType))
+       /* Remove unfocusable targets from list if they should not be included 
*/
+       if(mustBeFocusable)
        {
-               targets=g_slist_append(targets, g_object_ref(self));
-       }
-
-       /* Iterate through list of focusable actors to add each one
-        * matching the target class name to the list of targets.
-        * Begin with finding starting point of iteration.
-        */
-       focusablesStartPoint=g_list_find(priv->registeredFocusables, 
priv->currentFocus);
-       if(!focusablesStartPoint) 
focusablesStartPoint=priv->registeredFocusables;
-
-       /* Iterate through list of registered focusable actors beginning at
-        * found starting point of iteration (might be begin of list of 
registered actors)
-        * and add each focusable actor matching target class name to target 
list.
-        */
-       for(focusablesIter=focusablesStartPoint; focusablesIter; 
focusablesIter=g_list_next(focusablesIter))
-       {
-               focusable=(XfdashboardFocusable*)focusablesIter->data;
-
-               /* If focusable can be focused and matches target class name
-                * then add it to target list.
-                */
-               if((!mustBeFocusable || 
xfdashboard_focusable_can_focus(focusable)) &&
-                       g_type_is_a(G_OBJECT_TYPE(focusable), targetType))
+               for(iter=targets; iter; iter=g_slist_next(iter))
                {
-                       targets=g_slist_append(targets, 
g_object_ref(focusable));
-               }
-       }
+                       /* Get focusable actor */
+                       if(!XFDASHBOARD_IS_FOCUSABLE(iter->data)) continue;
+                       focusable=XFDASHBOARD_FOCUSABLE(iter->data);
 
-       /* We have to continue search at the beginning of list of registered 
actors
-        * up to the found starting point of iteration. Add each focusable 
actor matching
-        * target class name to target list.
-        */
-       for(focusablesIter=priv->registeredFocusables; 
focusablesIter!=focusablesStartPoint; 
focusablesIter=g_list_next(focusablesIter))
-       {
-               focusable=(XfdashboardFocusable*)focusablesIter->data;
-
-               /* If focusable can be focused and matches target class name
-                * then add it to target list.
-                */
-               if((!mustBeFocusable || 
xfdashboard_focusable_can_focus(focusable)) &&
-                       g_type_is_a(G_OBJECT_TYPE(focusable), targetType))
-               {
-                       targets=g_slist_append(targets, 
g_object_ref(focusable));
+                       /* Check if focusable actor can be focused as it may be 
disabled */
+                       if(!xfdashboard_focusable_can_focus(focusable))
+                       {
+                               /* Remove target from list as it cannot be 
focused */
+                               g_object_unref(focusable);
+                               targets=g_slist_delete_link(targets, iter);
+                       }
                }
        }
 
@@ -592,6 +553,93 @@ gboolean 
xfdashboard_focus_manager_is_registered(XfdashboardFocusManager *self,
        return(FALSE);
 }
 
+/* Build target list of registered focusable actors for requested target class
+ * but also check if this focus manager is a target.
+ */
+GSList* xfdashboard_focus_manager_get_targets(XfdashboardFocusManager *self, 
const gchar *inTarget)
+{
+       XfdashboardFocusManagerPrivate  *priv;
+       GList                                                   *focusablesIter;
+       GList                                                   
*focusablesStartPoint;
+       XfdashboardFocusable                    *focusable;
+       GType                                                   targetType;
+       GSList                                                  *targets;
+
+       g_return_val_if_fail(XFDASHBOARD_IS_FOCUS_MANAGER(self), NULL);
+       g_return_val_if_fail(inTarget && *inTarget, NULL);
+
+       priv=self->priv;
+       targets=NULL;
+
+       /* Get type of target */
+       targetType=g_type_from_name(inTarget);
+       if(!targetType)
+       {
+               g_warning(_("Cannot build target list for unknown type %s"), 
inTarget);
+               return(NULL);
+       }
+
+       /* Check if class name of requested target points to ourselve */
+       if(g_type_is_a(G_OBJECT_TYPE(self), targetType))
+       {
+               targets=g_slist_append(targets, g_object_ref(self));
+       }
+
+       /* Check if class name of requested target points to application */
+       if(g_type_is_a(XFDASHBOARD_TYPE_APPLICATION, targetType))
+       {
+               targets=g_slist_append(targets, 
g_object_ref(xfdashboard_application_get_default()));
+       }
+
+       /* Iterate through list of registered actors and add each one
+        * matching the target class name to the list of targets.
+        * Begin with finding starting point of iteration.
+        */
+       focusablesStartPoint=g_list_find(priv->registeredFocusables, 
priv->currentFocus);
+       if(!focusablesStartPoint) 
focusablesStartPoint=priv->registeredFocusables;
+
+       /* Iterate through list of registered actors beginning at found starting
+        * point of iteration (might be begin of list of registered actors)
+        * and add each actor matching target class name to target list.
+        */
+       for(focusablesIter=focusablesStartPoint; focusablesIter; 
focusablesIter=g_list_next(focusablesIter))
+       {
+               focusable=(XfdashboardFocusable*)focusablesIter->data;
+
+               /* If focusable can be focused and matches target class name
+                * then add it to target list.
+                */
+               if(g_type_is_a(G_OBJECT_TYPE(focusable), targetType))
+               {
+                       targets=g_slist_append(targets, 
g_object_ref(focusable));
+               }
+       }
+
+       /* We have to continue search at the beginning of list of registered 
actors
+        * up to the found starting point of iteration. Add each actor matching
+        * target class name to target list.
+        */
+       for(focusablesIter=priv->registeredFocusables; 
focusablesIter!=focusablesStartPoint; 
focusablesIter=g_list_next(focusablesIter))
+       {
+               focusable=(XfdashboardFocusable*)focusablesIter->data;
+
+               /* If focusable can be focused and matches target class name
+                * then add it to target list.
+                */
+               if(g_type_is_a(G_OBJECT_TYPE(focusable), targetType))
+               {
+                       targets=g_slist_append(targets, 
g_object_ref(focusable));
+               }
+       }
+
+       /* Return list of targets found */
+       g_debug("Target list for target class '%s' has %d entries",
+                               inTarget,
+                               g_slist_length(targets));
+
+       return(targets);
+}
+
 /* Determine if a specific actor has the focus */
 gboolean xfdashboard_focus_manager_has_focus(XfdashboardFocusManager *self, 
XfdashboardFocusable *inFocusable)
 {
diff --git a/xfdashboard/focus-manager.h b/xfdashboard/focus-manager.h
index 9362704..db48eaf 100644
--- a/xfdashboard/focus-manager.h
+++ b/xfdashboard/focus-manager.h
@@ -88,6 +88,8 @@ void 
xfdashboard_focus_manager_unregister(XfdashboardFocusManager *self, Xfdashb
 GList* xfdashboard_focus_manager_get_registered(XfdashboardFocusManager *self);
 gboolean xfdashboard_focus_manager_is_registered(XfdashboardFocusManager 
*self, XfdashboardFocusable *inFocusable);
 
+GSList* xfdashboard_focus_manager_get_targets(XfdashboardFocusManager *self, 
const gchar *inTarget);
+
 gboolean xfdashboard_focus_manager_has_focus(XfdashboardFocusManager *self, 
XfdashboardFocusable *inFocusable);
 XfdashboardFocusable* 
xfdashboard_focus_manager_get_focus(XfdashboardFocusManager *self);
 void xfdashboard_focus_manager_set_focus(XfdashboardFocusManager *self, 
XfdashboardFocusable *inFocusable);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
Xfce4-commits mailing list
[email protected]
https://mail.xfce.org/mailman/listinfo/xfce4-commits

Reply via email to