+/* Remove a deleted player window from the list of currently opened windows */
+static gboolean
+on_player_delete_event(GtkWidget *player, GdkEvent *event, ChimaraApp *self)
+{
+ CHIMARA_APP_USE_PRIVATE;
+ priv->window_list = g_slist_remove(priv->window_list, player);
+ return FALSE; /* don't block event */
+}
+
+ChimaraPlayer *
+chimara_app_open_game(ChimaraApp *self, const char *path)
+{
+ CHIMARA_APP_USE_PRIVATE;
+ GError *error = NULL;
+
+ /* Open a new player window */
+ ChimaraPlayer *player = CHIMARA_PLAYER(chimara_player_new());
+ gtk_widget_show_all(GTK_WIDGET(player));
+ gtk_window_present(GTK_WINDOW(player));
+
+ gchar *blorbfile = search_for_graphics_file(path);
+ if(blorbfile) {
+ g_object_set(player->glk, "graphics-file", blorbfile, NULL);
+ g_free(blorbfile);
+ }
+ if(!chimara_if_run_game(CHIMARA_IF(player->glk), path, &error)) {
+ error_dialog(GTK_WINDOW(player), error, _("Could not open game file '%s': "), path);
+ gtk_widget_destroy(GTK_WIDGET(player));
+ return NULL;
+ }
+
+ /* Add the opened game to the list of currently opened windows */
+ priv->window_list = g_slist_prepend(priv->window_list, player);
+ g_signal_connect_after(player, "delete-event", G_CALLBACK(on_player_delete_event), self);
+
+ return player;
+}
+
+void
+chimara_app_foreach_game_window(ChimaraApp *self, GFunc func, gpointer data)
+{
+ CHIMARA_APP_USE_PRIVATE;
+ g_slist_foreach(priv->window_list, func, data);
+}
+
+/* GLADE CALLBACKS */
+