예제 #1
0
/* 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);
}
예제 #2
0
파일: IoClutterActor.c 프로젝트: Akiyah/io
//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);
}
예제 #3
0
파일: scroll-frame.c 프로젝트: UIKit0/toys
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;
}
예제 #4
0
/* 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);
}
예제 #5
0
/* 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);
}
예제 #6
0
/* 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));
}