From 9a23ef6c2da48cd7f5c513f24ff478d6c5fab4d6 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Wed, 29 Jun 2011 14:35:12 +0100 Subject: [PATCH] Add 'change-state' signal to GSimpleAction If connected, allows the user to control the result of g_action_change_state(). --- gio/gsimpleaction.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/gio/gsimpleaction.c b/gio/gsimpleaction.c index 915a2e6eb..0f26c0f74 100644 --- a/gio/gsimpleaction.c +++ b/gio/gsimpleaction.c @@ -65,6 +65,7 @@ enum enum { + SIGNAL_CHANGE_STATE, SIGNAL_ACTIVATE, NR_SIGNALS }; @@ -118,7 +119,15 @@ g_simple_action_change_state (GAction *action, { GSimpleAction *simple = G_SIMPLE_ACTION (action); - g_simple_action_set_state (simple, value); + /* If the user connected a signal handler then they are responsible + * for handling state changes. + */ + if (g_signal_has_handler_pending (action, g_simple_action_signals[SIGNAL_CHANGE_STATE], 0, TRUE)) + g_signal_emit (action, g_simple_action_signals[SIGNAL_CHANGE_STATE], 0, value); + + /* If not, then the default behaviour is to just set the state. */ + else + g_simple_action_set_state (simple, value); } /** @@ -325,6 +334,34 @@ g_simple_action_class_init (GSimpleActionClass *class) G_TYPE_NONE, 1, G_TYPE_VARIANT); + /** + * GSimpleAction::change-state: + * @simple: the #GSimpleAction + * @value: (allow-none): the requested value for the state + * + * Indicates that the action just received a request to change its + * state. + * + * @value will always be of the correct state type. In the event that + * an incorrect type was given, no signal will be emitted. + * + * If no handler is connected to this signal then the default + * behaviour is to call g_simple_action_set_state() to set the state + * to the requested value. If you connect a signal handler then no + * default action is taken. If the state should change then you must + * call g_simple_action_set_state() from the handler. + * + * Since: 2.30 + */ + g_simple_action_signals[SIGNAL_CHANGE_STATE] = + g_signal_new (I_("change-state"), + G_TYPE_SIMPLE_ACTION, + G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VARIANT, + G_TYPE_NONE, 1, + G_TYPE_VARIANT); + /** * GSimpleAction:name: *