Merge branch 'wip/chergert/gtk4-gtk-main-sync' into 'master'

Rubustness fixes for gtk_main_sync()

See merge request GNOME/gtk!1299
This commit is contained in:
Matthias Clasen
2020-01-11 04:41:46 +00:00

View File

@@ -1044,6 +1044,7 @@ gtk_main (void)
typedef struct {
GMainLoop *store_loop;
guint n_clipboards;
guint timeout_id;
} ClipboardStore;
static void
@@ -1071,16 +1072,26 @@ clipboard_store_finished (GObject *source,
g_main_loop_quit (store->store_loop);
}
static gboolean
sync_timed_out_cb (ClipboardStore *store)
{
store->timeout_id = 0;
g_main_loop_quit (store->store_loop);
return G_SOURCE_REMOVE;
}
void
gtk_main_sync (void)
{
ClipboardStore store = { NULL, };
GSList *displays, *l;
GCancellable *cancel;
guint store_timeout;
/* Try storing all clipboard data we have */
displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
if (displays == NULL)
return;
cancel = g_cancellable_new ();
for (l = displays; l; l = l->next)
@@ -1098,17 +1109,16 @@ gtk_main_sync (void)
g_slist_free (displays);
store.store_loop = g_main_loop_new (NULL, TRUE);
store_timeout = g_timeout_add_seconds (10, (GSourceFunc) g_main_loop_quit, store.store_loop);
g_source_set_name_by_id (store_timeout, "[gtk] gtk_main_sync clipboard store timeout");
store.timeout_id = g_timeout_add_seconds (10, (GSourceFunc) sync_timed_out_cb, &store);
g_source_set_name_by_id (store.timeout_id, "[gtk] gtk_main_sync clipboard store timeout");
if (g_main_loop_is_running (store.store_loop))
g_main_loop_run (store.store_loop);
g_cancellable_cancel (cancel);
g_object_unref (cancel);
g_source_remove (store_timeout);
g_main_loop_unref (store.store_loop);
store.store_loop = NULL;
g_clear_handle_id (&store.timeout_id, g_source_remove);
g_clear_pointer (&store.store_loop, g_main_loop_unref);
/* Synchronize the recent manager singleton */
_gtk_recent_manager_sync ();