+static void
+psppire_window_update_list_name (PsppireWindow *window)
+{
+ PsppireWindowRegister *reg = psppire_window_register_new ();
+ GString *candidate = g_string_sized_new (80);
+ int n;
+
+ n = 1;
+ do
+ {
+ /* Compose a name. */
+ g_string_truncate (candidate, 0);
+ if (window->filename)
+ {
+ gchar *display_filename = g_filename_display_name (window->filename);
+ g_string_append (candidate, display_filename);
+ g_free (display_filename);
+
+ if (window->id)
+ g_string_append_printf (candidate, " [%s]", window->id);
+ }
+ else if (window->id)
+ g_string_append_printf (candidate, "[%s]", window->id);
+ else
+ g_string_append (candidate, window->description);
+
+ if (n++ > 1)
+ g_string_append_printf (candidate, " #%d", n);
+
+ if (window->list_name && !strcmp (candidate->str, window->list_name))
+ {
+ /* Keep the existing name. */
+ g_string_free (candidate, TRUE);
+ return;
+ }
+ }
+ while (psppire_window_register_lookup (reg, candidate->str));
+
+ if (window->list_name)
+ psppire_window_register_remove (reg, window->list_name);
+
+ g_free (window->list_name);
+ window->list_name = g_string_free (candidate, FALSE);
+
+ psppire_window_register_insert (reg, window, window->list_name);
+}
+
+static void
+psppire_window_name_changed (PsppireWindow *window)
+{
+ psppire_window_set_title (window);
+ psppire_window_update_list_name (window);
+}
+