/* Scroll event happened at this actor because it was not handled * with any child actor */ static gboolean _xfdashboard_viewpad_on_scroll_event(ClutterActor *inActor, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardViewpad *self; XfdashboardViewpadPrivate *priv; gboolean result; g_return_val_if_fail(XFDASHBOARD_IS_VIEWPAD(inActor), FALSE); g_return_val_if_fail(inEvent, FALSE); self=XFDASHBOARD_VIEWPAD(inActor); priv=self->priv; result=CLUTTER_EVENT_PROPAGATE; /* If vertical scroll bar is visible emit scroll event there */ if(priv->vScrollbarVisible) { result=clutter_actor_event(priv->vScrollbar, inEvent, FALSE); } /* Otherwise try horizontal scroll bar if visible */ else if(priv->hScrollbarVisible) { result=clutter_actor_event(priv->hScrollbar, inEvent, FALSE); } return(result); }
//doc ClutterActor event(clutterEvent, capture) IO_METHOD(IoClutterActor, event) { int success = clutter_actor_event( IOCACTOR(self), IOCEVENT(IoMessage_locals_clutterEventArgAt_(m, locals, 0)), IoMessage_locals_boolArgAt_(m, locals, 1)); return IOBOOL(self, success); }
static gboolean scroll_frame_button_release_event (ClutterActor *actor, ClutterButtonEvent *event) { ClutterActor *child = tidy_frame_get_child (TIDY_FRAME (actor)); if (child) { return clutter_actor_event (child, (ClutterEvent *) event, FALSE); } return FALSE; }
/* Virtual function "handle_key_event" was called */ static gboolean _xfdashboard_text_box_focusable_handle_key_event(XfdashboardFocusable *inFocusable, const ClutterEvent *inEvent) { XfdashboardTextBox *self; XfdashboardTextBoxPrivate *priv; gboolean result; g_return_val_if_fail(XFDASHBOARD_IS_TEXT_BOX(inFocusable), CLUTTER_EVENT_PROPAGATE); self=XFDASHBOARD_TEXT_BOX(inFocusable); priv=self->priv; result=CLUTTER_EVENT_PROPAGATE; /* Push event to real text box if available */ if(priv->actorTextBox) { result=clutter_actor_event(priv->actorTextBox, inEvent, FALSE); } /* Return event handling result */ return(result); }
/* A key was released */ static gboolean _xfdashboard_text_box_on_key_release_event(ClutterActor *inActor, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardTextBox *self; XfdashboardTextBoxPrivate *priv; gboolean result; g_return_val_if_fail(XFDASHBOARD_IS_TEXT_BOX(inActor), CLUTTER_EVENT_PROPAGATE); self=XFDASHBOARD_TEXT_BOX(inActor); priv=self->priv; result=CLUTTER_EVENT_PROPAGATE; /* Push event to real text box if available */ if(priv->actorTextBox) { result=clutter_actor_event(priv->actorTextBox, inEvent, FALSE); } /* Return event handling result */ return(result); }
/* Handle key event (it is either key-press or key-release) by focusable actor * which has the focus or by specified actor. */ gboolean xfdashboard_focus_manager_handle_key_event(XfdashboardFocusManager *self, const ClutterEvent *inEvent, XfdashboardFocusable *inFocusable) { XfdashboardFocusManagerPrivate *priv; g_return_val_if_fail(XFDASHBOARD_IS_FOCUS_MANAGER(self), CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(inEvent, CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(clutter_event_type(inEvent)==CLUTTER_KEY_PRESS || clutter_event_type(inEvent)==CLUTTER_KEY_RELEASE, CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(!inFocusable || XFDASHBOARD_IS_FOCUSABLE(inFocusable), CLUTTER_EVENT_PROPAGATE); priv=self->priv; /* If no focusable actor was specified then use current focused actor */ if(!inFocusable) { inFocusable=priv->currentFocus; /* If still no focusable actor is available we cannot handle event * so let the others try it by propagating event. */ if(!inFocusable) return(CLUTTER_EVENT_PROPAGATE); } /* Synthesize event for specified focusable actor */ if(inFocusable) { XfdashboardBindingsPool *bindings; const XfdashboardBinding *binding; gboolean eventStatus; /* Take reference on ourselve and the focusable actor to keep them alive when handling event */ g_object_ref(self); g_object_ref(inFocusable); /* Lookup action for event and emit action if a binding was found * for this event. */ eventStatus=CLUTTER_EVENT_PROPAGATE; bindings=xfdashboard_bindings_pool_get_default(); binding=xfdashboard_bindings_pool_find_for_event(bindings, CLUTTER_ACTOR(inFocusable), inEvent); if(binding) { const gchar *target; const gchar *action; GSList *targetFocusables; GSList *iter; GSignalQuery signalData={ 0, }; /* Get action of binding */ action=xfdashboard_binding_get_action(binding); /* Build up list of targets which is either the requested focusable actor, * the current focused actor or focusable actors of a specific type */ targetFocusables=NULL; target=xfdashboard_binding_get_target(binding); if(target) { /* Target class name is specified so build up a list of targets */ targetFocusables=_xfdashboard_focus_manager_get_targets_for_binding(self, binding); } else { /* No target class name was specified so add requested focusable * actor to list of target. */ targetFocusables=g_slist_append(targetFocusables, g_object_ref(inFocusable)); } g_debug("Target list for action '%s' has %d actors", action, g_slist_length(targetFocusables)); /* Emit action of binding to each actor in target list just build up */ for(iter=targetFocusables; iter; iter=g_slist_next(iter)) { GObject *targetObject; guint signalID; /* Get target to emit action signal at */ targetObject=G_OBJECT(iter->data); /* Check if target provides action requested as signal */ signalID=g_signal_lookup(action, G_OBJECT_TYPE(targetObject)); if(!signalID) { g_warning(_("Object type %s does not provide action '%s'"), G_OBJECT_TYPE_NAME(targetObject), action); continue; } /* Query signal for detailed data */ g_signal_query(signalID, &signalData); /* Check if signal is an action signal */ if(!(signalData.signal_flags & G_SIGNAL_ACTION)) { g_warning(_("Action '%s' at object type %s is not an action signal."), action, G_OBJECT_TYPE_NAME(targetObject)); continue; } #if DEBUG /* In debug mode also check if signal has right signature * to be able to handle this action properly. */ if(signalID) { GType returnValueType=G_TYPE_BOOLEAN; GType parameterTypes[]={ XFDASHBOARD_TYPE_FOCUSABLE, G_TYPE_STRING, CLUTTER_TYPE_EVENT }; guint parameterCount; guint i; /* Check if signal wants the right type of return value */ if(signalData.return_type!=returnValueType) { g_critical(_("Action '%s' at object type %s wants return value of type %s but expected is %s."), action, G_OBJECT_TYPE_NAME(targetObject), g_type_name(signalData.return_type), g_type_name(returnValueType)); } /* Check if signals wants the right number and types of parameters */ parameterCount=sizeof(parameterTypes)/sizeof(GType); if(signalData.n_params!=parameterCount) { g_critical(_("Action '%s' at object type %s wants %u parameters but expected are %u."), action, G_OBJECT_TYPE_NAME(targetObject), signalData.n_params, parameterCount); } for(i=0; i<(parameterCount<signalData.n_params ? parameterCount : signalData.n_params); i++) { if(signalData.param_types[i]!=parameterTypes[i]) { g_critical(_("Action '%s' at object type %s wants type %s at parameter %u but type %s is expected."), action, G_OBJECT_TYPE_NAME(targetObject), g_type_name(signalData.param_types[i]), i+1, g_type_name(parameterTypes[i])); } } } #endif /* Emit action signal at target */ g_debug("Emitting action signal '%s' at focusable actor %s", action, G_OBJECT_TYPE_NAME(targetObject)); g_signal_emit_by_name(targetObject, action, inFocusable, action, inEvent, &eventStatus); g_debug("Action signal '%s' was %s by focusable actor %s", action, eventStatus==CLUTTER_EVENT_STOP ? "handled" : "not handled", G_OBJECT_TYPE_NAME(targetObject)); } /* Release allocated resources */ g_slist_free_full(targetFocusables, g_object_unref); } g_object_unref(bindings); /* Release reference on ourselve and the focusable actor to took to keep them alive */ g_object_unref(inFocusable); g_object_unref(self); if(eventStatus==CLUTTER_EVENT_STOP) return(CLUTTER_EVENT_STOP); } /* Event was not handled so synthesize event to specified focusable actor */ return(clutter_actor_event(CLUTTER_ACTOR(inFocusable), inEvent, FALSE)); }