mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 15:06:14 +01:00
GActionGroupExporter: flush queue on requests
In order to maintain a logical stream of events, we need to make sure we flush and queued change notifications before responding to any requests for information from clients. If we don't do this, it's possible that we emit an 'add' event that was queued at the time of a 'DescribeAll' call _after_ the reply to that call (which already contained the description of the new action). In practice, this is not only logically incorrect, but it can also cause problems. If a change to action 'state' or 'enabled' occurs after the DescribeAll but before the signal has been dispatched, it will be ignored because an 'add' signal is already pending. When that add signal is sent, it will contain the correct data, but the receiver will ignore it because it already saw the action in the DescribeAll reply. https://bugzilla.gnome.org/show_bug.cgi?id=749693
This commit is contained in:
parent
eeae7950fc
commit
865ce79ce0
@ -208,6 +208,17 @@ g_action_group_exporter_dispatch_events (gpointer user_data)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
g_action_group_exporter_flush_queue (GActionGroupExporter *exporter)
|
||||
{
|
||||
if (exporter->pending_source)
|
||||
{
|
||||
g_source_destroy (exporter->pending_source);
|
||||
g_action_group_exporter_dispatch_events (exporter);
|
||||
g_assert (exporter->pending_source == NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static guint
|
||||
g_action_group_exporter_get_events (GActionGroupExporter *exporter,
|
||||
const gchar *name)
|
||||
@ -365,6 +376,8 @@ org_gtk_Actions_method_call (GDBusConnection *connection,
|
||||
GActionGroupExporter *exporter = user_data;
|
||||
GVariant *result = NULL;
|
||||
|
||||
g_action_group_exporter_flush_queue (exporter);
|
||||
|
||||
if (g_str_equal (method_name, "List"))
|
||||
{
|
||||
gchar **list;
|
||||
|
Loading…
Reference in New Issue
Block a user