notification: Move action activation and closing in separate functions

Move handling of such events in different functions so that can be
re-used
This commit is contained in:
Marco Trevisan (Treviño) 2022-05-16 12:07:11 +02:00
parent 9e9cb423b9
commit 543d636153
1 changed files with 51 additions and 27 deletions

View File

@ -592,6 +592,53 @@ notify_notification_update (NotifyNotification *notification,
return TRUE;
}
static gboolean
activate_action (NotifyNotification *notification,
const gchar *action)
{
CallbackPair *pair;
pair = g_hash_table_lookup (notification->priv->action_map, action);
if (!pair) {
return FALSE;
}
/* Some clients have assumed it is safe to unref the
* Notification at the end of their NotifyActionCallback
* so we add a temporary ref until we're done with it.
*/
g_object_ref (notification);
notification->priv->activating = TRUE;
pair->cb (notification, (char *) action, pair->user_data);
notification->priv->activating = FALSE;
g_free (notification->priv->activation_token);
notification->priv->activation_token = NULL;
g_object_unref (notification);
return TRUE;
}
static gboolean
close_notification (NotifyNotification *notification,
NotifyClosedReason reason)
{
if (notification->priv->closed_reason != NOTIFY_CLOSED_REASON_UNSET ||
reason == NOTIFY_CLOSED_REASON_UNSET) {
return FALSE;
}
g_object_ref (G_OBJECT (notification));
notification->priv->closed_reason = reason;
g_signal_emit (notification, signals[SIGNAL_CLOSED], 0);
notification->priv->id = 0;
g_object_unref (G_OBJECT (notification));
return TRUE;
}
static void
proxy_g_signal_cb (GDBusProxy *proxy,
const char *sender_name,
@ -609,44 +656,21 @@ proxy_g_signal_cb (GDBusProxy *proxy,
if (id != notification->priv->id)
return;
g_object_ref (G_OBJECT (notification));
notification->priv->closed_reason = reason;
g_signal_emit (notification, signals[SIGNAL_CLOSED], 0);
notification->priv->id = 0;
g_object_unref (G_OBJECT (notification));
close_notification (notification, reason);
} else if (g_strcmp0 (signal_name, "ActionInvoked") == 0 &&
g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(us)"))) {
guint32 id;
const char *action;
CallbackPair *pair;
g_variant_get (parameters, "(u&s)", &id, &action);
if (id != notification->priv->id)
return;
pair = (CallbackPair *) g_hash_table_lookup (notification->priv->action_map,
action);
if (pair == NULL) {
if (g_ascii_strcasecmp (action, "default")) {
if (!activate_action (notification, action) &&
g_ascii_strcasecmp (action, "default")) {
g_warning ("Received unknown action %s", action);
}
} else {
/* Some clients have assumed it is safe to unref the
* Notification at the end of their NotifyActionCallback
* so we add a temporary ref until we're done with it.
*/
g_object_ref (notification);
notification->priv->activating = TRUE;
pair->cb (notification, (char *) action, pair->user_data);
notification->priv->activating = FALSE;
g_free (notification->priv->activation_token);
notification->priv->activation_token = NULL;
g_object_unref (notification);
}
} else if (g_strcmp0 (signal_name, "ActivationToken") == 0 &&
g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(us)"))) {
guint32 id;