+static void
+set_toplevel (PsppireDialogAction *act)
+{
+ if (act->toplevel)
+ return;
+
+ GSList *sl = gtk_ui_manager_get_toplevels (act->uim, GTK_UI_MANAGER_MENUBAR | GTK_UI_MANAGER_TOOLBAR);
+ g_return_if_fail (sl);
+
+ act->toplevel = gtk_widget_get_toplevel (GTK_WIDGET (sl->data));
+ g_slist_free (sl);
+}
+
+static void
+on_destroy_dataset (GObject *w)
+{
+ GHashTable *t = g_object_get_data (w, "thing-table");
+ GSList *dl = g_object_get_data (w, "widget-list");
+
+ g_slist_free_full (dl, (GDestroyNotify) gtk_widget_destroy);
+ g_hash_table_unref (t);
+}
+
+GHashTable *
+psppire_dialog_action_get_pointer (PsppireDialogAction *act)
+{
+ set_toplevel (act);
+
+ GHashTable *thing = g_object_get_data (G_OBJECT (act->toplevel), "thing-table");
+ if (thing == NULL)
+ {
+ thing = g_hash_table_new_full (g_direct_hash, g_direct_equal, 0, g_object_unref);
+ g_object_set_data (G_OBJECT (act->toplevel), "thing-table", thing);
+ g_object_set_data (G_OBJECT (act->toplevel), "widget-list", NULL);
+ g_signal_connect (act->toplevel, "destroy", G_CALLBACK (on_destroy_dataset), NULL);
+ }
+
+ return thing;
+}
+