This is an automated email from the git hooks/post-receive script. nomad pushed a commit to branch master in repository apps/xfdashboard.
commit 7599cf786ff8b5a0f4cdf1b21a01404c02cb5d20 Author: Stephan Haller <[email protected]> Date: Wed Dec 16 09:48:54 2015 +0100 Let new actor XfdashboardActionButton implement interface XfdashboardFocusable so it can act as source for actions in function _xfdashboard_action_button_clicked() --- xfdashboard/action-button.c | 140 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 134 insertions(+), 6 deletions(-) diff --git a/xfdashboard/action-button.c b/xfdashboard/action-button.c index f8ac0db..693505f 100644 --- a/xfdashboard/action-button.c +++ b/xfdashboard/action-button.c @@ -29,12 +29,16 @@ #include <glib/gi18n-lib.h> +#include "focusable.h" #include "focus-manager.h" /* Define this class in GObject system */ -G_DEFINE_TYPE(XfdashboardActionButton, - xfdashboard_action_button, - XFDASHBOARD_TYPE_BUTTON) +static void _xfdashboard_action_button_focusable_iface_init(XfdashboardFocusableInterface *iface); + +G_DEFINE_TYPE_WITH_CODE(XfdashboardActionButton, + xfdashboard_action_button, + XFDASHBOARD_TYPE_BUTTON, + G_IMPLEMENT_INTERFACE(XFDASHBOARD_TYPE_FOCUSABLE, _xfdashboard_action_button_focusable_iface_init)) /* Private structure - access only by public API if needed */ #define XFDASHBOARD_ACTION_BUTTON_GET_PRIVATE(obj) \ @@ -92,7 +96,6 @@ static void _xfdashboard_action_button_clicked(XfdashboardButton *inButton) GObject *targetObject; guint signalID; GSignalQuery signalData={ 0, }; - XfdashboardFocusable *currentFocus; const ClutterEvent *event; gboolean eventStatus; @@ -171,10 +174,14 @@ static void _xfdashboard_action_button_clicked(XfdashboardButton *inButton) priv->action, G_OBJECT_TYPE_NAME(targetObject)); - currentFocus=xfdashboard_focus_manager_get_focus(priv->focusManager); event=clutter_get_current_event(); eventStatus=CLUTTER_EVENT_PROPAGATE; - g_signal_emit_by_name(targetObject, priv->action, currentFocus, priv->action, event, &eventStatus); + g_signal_emit_by_name(targetObject, + priv->action, + XFDASHBOARD_FOCUSABLE(self), + priv->action, + event, + &eventStatus); g_debug("Action signal '%s' was %s by actor %s", priv->action, @@ -186,6 +193,127 @@ static void _xfdashboard_action_button_clicked(XfdashboardButton *inButton) if(targets) g_slist_free_full(targets, g_object_unref); } +/* IMPLEMENTATION: Interface XfdashboardFocusable */ + +/* Determine if actor can get the focus */ +static gboolean _xfdashboard_action_button_focusable_can_focus(XfdashboardFocusable *inFocusable) +{ + XfdashboardFocusableInterface *selfIface; + XfdashboardFocusableInterface *parentIface; + + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), FALSE); + + /* Call parent class interface function */ + selfIface=XFDASHBOARD_FOCUSABLE_GET_IFACE(inFocusable); + parentIface=g_type_interface_peek_parent(selfIface); + + if(parentIface && parentIface->can_focus) + { + if(!parentIface->can_focus(inFocusable)) return(FALSE); + } + + /* If we get here this actor can be focused */ + return(TRUE); +} + +/* Determine if this actor supports selection */ +static gboolean _xfdashboard_action_button_focusable_supports_selection(XfdashboardFocusable *inFocusable) +{ + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), FALSE); + + /* This actor supports selection */ + return(TRUE); +} + +/* Get current selection */ +static ClutterActor* _xfdashboard_action_button_focusable_get_selection(XfdashboardFocusable *inFocusable) +{ + XfdashboardActionButton *self; + + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), NULL); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), NULL); + + self=XFDASHBOARD_ACTION_BUTTON(inFocusable); + + /* Return the actor itself as current selection */ + return(CLUTTER_ACTOR(self)); +} + +/* Set new selection */ +static gboolean _xfdashboard_action_button_focusable_set_selection(XfdashboardFocusable *inFocusable, + ClutterActor *inSelection) +{ + XfdashboardActionButton *self; + + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), FALSE); + g_return_val_if_fail(!inSelection || CLUTTER_IS_ACTOR(inSelection), FALSE); + + self=XFDASHBOARD_ACTION_BUTTON(inFocusable); + + /* Setting new selection always fails if it is not this actor itself */ + if(inSelection!=CLUTTER_ACTOR(self)) return(FALSE); + + /* Otherwise setting selection was successful because nothing has changed */ + return(TRUE); +} + +/* Find requested selection target depending of current selection */ +static ClutterActor* _xfdashboard_action_button_focusable_find_selection(XfdashboardFocusable *inFocusable, + ClutterActor *inSelection, + XfdashboardSelectionTarget inDirection) +{ + XfdashboardActionButton *self; + + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), NULL); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), NULL); + g_return_val_if_fail(!inSelection || CLUTTER_IS_ACTOR(inSelection), NULL); + g_return_val_if_fail(inDirection>XFDASHBOARD_SELECTION_TARGET_NONE, NULL); + g_return_val_if_fail(inDirection<=XFDASHBOARD_SELECTION_TARGET_NEXT, NULL); + + self=XFDASHBOARD_ACTION_BUTTON(inFocusable); + + /* Regardless of "current" selection and direction requested for new selection + * we return this actor as new current selection resulting in no change of + * selection. It is and will be the actor itself. + */ + return(CLUTTER_ACTOR(self)); +} + +/* Activate selection */ +static gboolean _xfdashboard_action_button_focusable_activate_selection(XfdashboardFocusable *inFocusable, + ClutterActor *inSelection) +{ + XfdashboardActionButton *self; + + g_return_val_if_fail(XFDASHBOARD_IS_FOCUSABLE(inFocusable), FALSE); + g_return_val_if_fail(XFDASHBOARD_IS_ACTION_BUTTON(inFocusable), FALSE); + g_return_val_if_fail(CLUTTER_IS_ACTOR(inSelection), FALSE); + + self=XFDASHBOARD_ACTION_BUTTON(inFocusable); + + /* Activate selection */ + _xfdashboard_action_button_clicked(XFDASHBOARD_BUTTON(self)); + + return(TRUE); +} + +/* Interface initialization + * Set up default functions + */ +void _xfdashboard_action_button_focusable_iface_init(XfdashboardFocusableInterface *iface) +{ + iface->can_focus=_xfdashboard_action_button_focusable_can_focus; + + iface->supports_selection=_xfdashboard_action_button_focusable_supports_selection; + iface->get_selection=_xfdashboard_action_button_focusable_get_selection; + iface->set_selection=_xfdashboard_action_button_focusable_set_selection; + iface->find_selection=_xfdashboard_action_button_focusable_find_selection; + iface->activate_selection=_xfdashboard_action_button_focusable_activate_selection; +} + /* IMPLEMENTATION: GObject */ /* Dispose this object */ -- 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
