[aisleriot/wip/redesign: 6/17] all: Add prefs dialogue



commit 77fa146f672653ebde14f29d23dde32074d91ec1
Author: Christian Persch <chpe gnome org>
Date:   Tue Jul 2 20:34:06 2013 +0200

    all: Add prefs dialogue

 src/Makefile.am                |    4 +
 src/aisleriot.gresource.xml.in |    1 +
 src/ar-prefs.c                 |  183 +++++++++++++++++++++++++++++++++++++++
 src/ar-prefs.h                 |   43 +++++++++
 src/menus.ui                   |    8 --
 src/window.c                   |  185 +++++++++++-----------------------------
 6 files changed, 282 insertions(+), 142 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index d79a327..c4475bc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,6 +17,8 @@ sol_SOURCES = \
        ar-defines.h \
        ar-game-chooser.c \
        ar-game-chooser.h \
+       ar-prefs.c \
+       ar-prefs.h \
        ar-resources.c  \
        ar-resources.h  \
        ar-stock.c      \
@@ -85,6 +87,8 @@ sol_clutter_SOURCES = \
        ar-defines.h \
        ar-game-chooser.c \
        ar-game-chooser.h \
+       ar-prefs.c \
+       ar-prefs.h \
        ar-resources.c  \
        ar-resources.h  \
        ar-stock.c      \
diff --git a/src/aisleriot.gresource.xml.in b/src/aisleriot.gresource.xml.in
index 34ed2a3..2186118 100644
--- a/src/aisleriot.gresource.xml.in
+++ b/src/aisleriot.gresource.xml.in
@@ -18,6 +18,7 @@
 <gresources>
   <gresource prefix="/org/gnome/aisleriot">
     <file alias="ui/menus.ui" compressed="true" preprocess="xml-stripblanks">@top_srcdir@/src/menus.ui</file>
+    <file alias="ui/prefs.ui" compressed="true" preprocess="xml-stripblanks">@top_srcdir@/src/prefs.ui</file>
     <file alias="art/slot.svg" compressed="true" 
preprocess="xml-stripblanks">@top_srcdir@/data/slot.svg</file>
     <file alias="art/baize.png">@top_srcdir@/data/baize.png</file>
   </gresource>
diff --git a/src/ar-prefs.c b/src/ar-prefs.c
new file mode 100644
index 0000000..f2fdf5a
--- /dev/null
+++ b/src/ar-prefs.c
@@ -0,0 +1,183 @@
+/*  
+ * Copyright © 2009, 2013 Christian Persch <chpe gnome org>
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "ar-prefs.h"
+
+#include <gio/gio.h>
+#include <glib/gi18n.h>
+
+#include "ar-application.h"
+#include "ar-debug.h"
+#include "ar-defines.h"
+#include "util.h"
+
+typedef struct {
+  AisleriotWindow *window;
+  GSettings *settings;
+  GtkWidget *click_checkbutton;
+  GtkWidget *sound_checkbutton;
+  GtkWidget *animations_checkbutton;
+} ArPrefsPrivate;
+
+struct _ArPrefs
+{
+  GtkDialog parent;
+
+  /*< private >*/
+  ArPrefsPrivate *priv;
+};
+
+struct _ArPrefsClass
+{
+  GtkDialogClass parent_class;
+};
+
+enum {
+  PROP_0,
+  PROP_WINDOW
+};
+
+/* private functions */
+
+static void
+response_cb (GtkWidget *dialog,
+             int response,
+             gpointer user_data)
+{
+  if (response == GTK_RESPONSE_HELP) {
+    aisleriot_show_help (dialog, NULL);
+    return;
+  }
+
+  gtk_widget_destroy (dialog);
+}
+
+/* GType impl */
+
+G_DEFINE_TYPE (ArPrefs, ar_prefs, GTK_TYPE_DIALOG)
+
+/* GObjectClass impl */
+
+static void
+ar_prefs_init (ArPrefs *prefs)
+{
+  ArPrefsPrivate *priv;
+
+  priv = prefs->priv = G_TYPE_INSTANCE_GET_PRIVATE (prefs, AR_TYPE_PREFS, ArPrefsPrivate);
+
+  priv->settings = g_settings_new (AR_SETTINGS_SCHEMA);
+
+  gtk_widget_init_template (GTK_WIDGET (prefs));
+
+  g_settings_bind (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY,
+                   priv->click_checkbutton, "active",
+                   G_SETTINGS_BIND_DEFAULT);
+  g_settings_bind (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY,
+                   priv->sound_checkbutton, "active",
+                   G_SETTINGS_BIND_DEFAULT);
+#ifdef HAVE_CLUTTER
+  g_settings_bind (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONS_KEY,
+                   priv->animations_checkbutton, "active",
+                   G_SETTINGS_BIND_DEFAULT);
+#else
+  gtk_widget_hide (priv->animations_checkbutton);
+#endif
+
+  g_signal_connect (prefs, "response", G_CALLBACK (response_cb), NULL);
+}
+
+static void
+ar_prefs_finalize (GObject *object)
+{
+  ArPrefs *prefs = AR_PREFS (object);
+  ArPrefsPrivate *priv = prefs->priv;
+
+  g_clear_object (&priv->settings);
+
+  G_OBJECT_CLASS (ar_prefs_parent_class)->finalize (object);
+}
+
+static void
+ar_prefs_set_property (GObject      *object,
+                       guint         property_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
+{
+  ArPrefs *prefs = AR_PREFS (object);
+  ArPrefsPrivate *priv = prefs->priv;
+  
+  switch (property_id) {
+  case PROP_WINDOW:
+    priv->window = g_value_get_object (value);
+    break;
+    
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+  }
+}
+
+static void
+ar_prefs_class_init (ArPrefsClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (ArPrefsPrivate));
+
+  object_class->finalize = ar_prefs_finalize;
+  object_class->set_property = ar_prefs_set_property;
+
+  /**
+   * ArPrefs:window:
+   *
+   * The parent #AisleriotWindow
+   */
+  g_object_class_install_property
+    (object_class,
+     PROP_WINDOW,
+     g_param_spec_object ("window", NULL, NULL,
+                          AISLERIOT_TYPE_WINDOW,
+                          G_PARAM_WRITABLE |
+                          G_PARAM_CONSTRUCT_ONLY |
+                          G_PARAM_STATIC_STRINGS));
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/aisleriot/ui/prefs.ui");
+  gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, click_checkbutton);
+  gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, sound_checkbutton);
+  gtk_widget_class_bind_child (widget_class, ArPrefsPrivate, animations_checkbutton);
+}
+
+/* public API */
+
+/**
+ * ar_prefs_new:
+ * @window: the parent #AisleriotWindow
+ *
+ * Return value: a new #ArPrefs
+ */
+GtkWidget *
+ar_prefs_new (AisleriotWindow *window)
+{
+  return g_object_new (AR_TYPE_PREFS,
+                       "type", GTK_WINDOW_TOPLEVEL,
+                       "transient-for", window,
+                       "destroy-with-parent", TRUE,
+                       "window", window,
+                       NULL);
+}
diff --git a/src/ar-prefs.h b/src/ar-prefs.h
new file mode 100644
index 0000000..1a7665d
--- /dev/null
+++ b/src/ar-prefs.h
@@ -0,0 +1,43 @@
+/*  
+ * Copyright © 2009, 2013 Christian Persch <chpe gnome org>
+ * 
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __AR_PREFS_H__
+#define __AR_PREFS_H__
+
+#include <gtk/gtk.h>
+
+#include "window.h"
+
+G_BEGIN_DECLS
+
+#define AR_TYPE_PREFS            (ar_prefs_get_type())     
+#define AR_PREFS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), AR_TYPE_PREFS, ArPrefs))     
+#define AR_PREFS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  AR_TYPE_PREFS, ArPrefsClass))
+#define AR_IS_PREFS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AR_TYPE_PREFS))                      
+#define AR_IS_PREFS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  AR_TYPE_PREFS))                      
+#define AR_PREFS_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  AR_TYPE_PREFS, ArPrefsClass))
+
+typedef struct _ArPrefs        ArPrefs;
+typedef struct _ArPrefsClass   ArPrefsClass;
+
+GType ar_prefs_get_type (void);
+
+GtkWidget *ar_prefs_new (AisleriotWindow *window);
+
+G_END_DECLS
+
+#endif /* __AR_PREFS_H__ */
diff --git a/src/menus.ui b/src/menus.ui
index eeeb12f..71dda79 100644
--- a/src/menus.ui
+++ b/src/menus.ui
@@ -67,14 +67,6 @@
         <attribute name="action">win.show-statusbar</attribute>
       </item>
       <item>
-        <attribute name="label" translatable="yes">_Enable Sound</attribute>
-        <attribute name="action">win.enable-sound</attribute>
-      </item>
-      <item>
-        <attribute name="label" translatable="yes">_Enable Animations</attribute>
-        <attribute name="action">win.enable-animations</attribute>
-      </item>
-      <item>
         <attribute name="label" translatable="yes">_Preferences</attribute>
         <attribute name="action">win.preferences</attribute>
       </item>
diff --git a/src/window.c b/src/window.c
index 117e158..fdbdb3d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -39,6 +39,7 @@
 #include "ar-sound.h"
 #include "ar-string-utils.h"
 #include "ar-gsettings.h"
+#include "ar-prefs.h"
 
 #ifdef HAVE_CLUTTER
 #include "ar-clutter-embed.h"
@@ -104,6 +105,7 @@ struct _AisleriotWindowPrivate
 
   GtkWidget *game_over_dialog;
   GtkWidget *game_choice_dialog;
+  GtkWidget *prefs_dialog;
   AisleriotStatsDialog *stats_dialog;
 
   GtkWidget *hint_dialog;
@@ -483,8 +485,19 @@ action_preferences_cb (GSimpleAction *action,
                        GVariant *parameter,
                        gpointer user_data)
 {
-  //  AisleriotWindow *window = user_data;
-  //fixme
+  AisleriotWindow *window = user_data;
+  AisleriotWindowPrivate *priv = window->priv;
+
+  if (priv->prefs_dialog) {
+    gtk_window_present (GTK_WINDOW (priv->prefs_dialog));
+    return;
+  }
+
+  priv->prefs_dialog = ar_prefs_new (window);
+  g_signal_connect (priv->prefs_dialog, "destroy",
+                    G_CALLBACK (gtk_widget_destroyed), &priv->prefs_dialog);
+
+  gtk_window_present (GTK_WINDOW (priv->prefs_dialog));
 }
 
 static void
@@ -946,63 +959,49 @@ leave_fullscreen_cb (GtkAction *action,
 #endif
 
 static void
-action_click_to_move_state_cb (GSimpleAction *action,
-                               GVariant *state,
-                               gpointer user_data)
+click_to_move_changed_cb (GSettings *settings,
+                         const char *key,
+                         gpointer user_data)
 {
   AisleriotWindow *window = user_data;
   AisleriotWindowPrivate *priv = window->priv;
   gboolean click_to_move;
 
-  g_simple_action_set_state (action, state);
-
-  click_to_move = g_variant_get_boolean (state);
+  click_to_move = g_settings_get_boolean (settings, key);
 
   aisleriot_game_set_click_to_move (priv->game, click_to_move);
   ar_style_set_click_to_move (priv->board_style, click_to_move);
-
-  g_settings_set_boolean (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY, click_to_move);
 }
 
 static void
-action_enable_sound_state_cb (GSimpleAction *action,
-                              GVariant *state,
-                              gpointer user_data)
+enable_sound_changed_cb (GSettings *settings,
+                         const char *key,
+                         gpointer user_data)
 {
 #ifdef ENABLE_SOUND
-  AisleriotWindow *window = user_data;
-  AisleriotWindowPrivate *priv = window->priv;
-  gboolean sound_enabled;
-
-  g_simple_action_set_state (action, state);
-
-  sound_enabled = g_variant_get_boolean (state);
+  gboolean enabled;
 
-  ar_sound_enable (sound_enabled);
+  enabled = g_settings_get_boolean (settings, key);
 
-  g_settings_set_boolean (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY, sound_enabled);
+  ar_sound_enable (enabled);
 #endif /* ENABLE_SOUND */
 }
 
+#ifdef HAVE_CLUTTER
 static void
-action_enable_animations_state_cb (GSimpleAction *action,
-                                   GVariant *state,
-                                   gpointer user_data)
+enable_animations_changed_cb (GSettings *settings,
+                              const char *key,
+                              gpointer user_data)
 {
-#ifdef HAVE_CLUTTER
   AisleriotWindow *window = user_data;
   AisleriotWindowPrivate *priv = window->priv;
   gboolean enabled;
 
-  g_simple_action_set_state (action, state);
-
-  enabled = g_variant_get_boolean (state);
+  enabled = g_settings_get_boolean (settings, key);
 
   ar_style_set_enable_animations (priv->board_style, enabled);
-  
-  g_settings_set (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONS_KEY, sound_enabled);
-#endif /* HAVE_CLUTTER */
 }
+#endif /* HAVE_CLUTTER */
 
 static void
 action_hint_cb (GSimpleAction *action,
@@ -1836,82 +1835,6 @@ game_exception_cb (AisleriotGame *game,
 }
 
 static void
-settings_changed_cb (GtkSettings *settings,
-                     GParamSpec *pspec,
-                     AisleriotWindow *window)
-{
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
-  GAction *action;
-  gboolean enabled;
-  const char *name;
-
-  if (pspec)
-    name = pspec->name;
-  else
-    name = NULL;
-
-#ifdef HAVE_CLUTTER
-  if (name == NULL || strcmp (name, "gtk-enable-animations") == 0)
-    g_object_get (settings, "gtk-enable-animations", &enabled, NULL);
-  else
-#endif /* HAVE_CLUTTER */
-    enabled = FALSE;
-
-  action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-animations");
-  // fixme  set visible: g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
-
-#ifdef ENABLE_SOUND
-  if (name == NULL || strcmp (name, "gtk-enable-event-sounds") == 0)
-    g_object_get (settings, "gtk-enable-event-sounds", &enabled, NULL);
-  else
-#endif /* ENABLE_SOUND */
-    enabled = FALSE;
-
-  action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-sound");
-  // fixme  set visible: g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled);
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-}
-
-static void
-screen_changed_cb (GtkWidget *widget,
-                   GdkScreen *previous_screen,
-                   AisleriotWindow *window)
-{
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
-  GdkScreen *screen;
-  GtkSettings *settings;
-
-  screen = gtk_widget_get_screen (widget);
-  if (screen == previous_screen)
-    return;
-
-  if (previous_screen) {
-    g_signal_handlers_disconnect_by_func (gtk_settings_get_for_screen (previous_screen),
-                                          G_CALLBACK (settings_changed_cb),
-                                          window);
-  }
-  
-  if (screen == NULL)
-    return;
-
-#ifdef ENABLE_SOUND
-  ar_sound_init (screen);
-#endif
-
-  settings = gtk_widget_get_settings (widget);
-  settings_changed_cb (settings, NULL, window);
-#ifdef HAVE_CLUTTER
-  g_signal_connect (settings, "notify::gtk-enable-animations",
-                    G_CALLBACK (settings_changed_cb), window);
-#endif
-#ifdef ENABLE_SOUND
-  g_signal_connect (settings, "notify::gtk-enable-event-sounds",
-                    G_CALLBACK (settings_changed_cb), window);
-#endif
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-}
-
-static void
 board_status_message_cb (AisleriotBoard *board,
                          const char *status_message,
                          AisleriotWindow *window)
@@ -2039,9 +1962,6 @@ aisleriot_window_init (AisleriotWindow *window)
 
     { "show-toolbar",        action_toggle_state_cb,   NULL, "true",  action_show_toolbar_state_cb      },
     { "show-statusbar",      action_toggle_state_cb,   NULL, "true",  action_show_statusbar_state_cb    },
-    { "enable-sound",        action_toggle_state_cb,   NULL, "true",  action_enable_sound_state_cb      },
-    { "enable-animations",   action_toggle_state_cb,   NULL, "true",  action_enable_animations_state_cb },
-    { "click-to-move",       action_toggle_state_cb,   NULL, "true",  action_click_to_move_state_cb     },
     { "fullscreen",          action_toggle_state_cb,   NULL, "false", action_fullscreen_state_cb        },
   };
   AisleriotWindowPrivate *priv;
@@ -2049,7 +1969,6 @@ aisleriot_window_init (AisleriotWindow *window)
   GAction *action;
   const char *theme_name;
   ArCardTheme *theme;
-  guint i;
   GtkStatusbar *statusbar;
   GtkWidget *statusbar_hbox, *label, *time_box;
 #ifdef HAVE_CLUTTER
@@ -2059,6 +1978,7 @@ aisleriot_window_init (AisleriotWindow *window)
   priv = window->priv = AISLERIOT_WINDOW_GET_PRIVATE (window);
 
   priv->settings = g_settings_new (AR_SETTINGS_SCHEMA);
+
   priv->state_settings = ar_application_state_settings_new (AR_APPLICATION (g_application_get_default ()),
                                                             AR_STATE_SCHEMA);
 
@@ -2208,39 +2128,17 @@ aisleriot_window_init (AisleriotWindow *window)
   priv->toolbar_visible = g_settings_get_boolean (priv->settings, AR_SETTINGS_SHOW_TOOLBAR_KEY);
   g_action_change_state (action, g_variant_new_boolean (priv->toolbar_visible));
 
-  action = g_action_map_lookup_action (G_ACTION_MAP (window), "click-to-move");
-  g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings, 
AR_SETTINGS_CLICK_TO_MOVE_KEY)));
-
 #if 0 // fixme
   action = gtk_action_group_get_action (priv->action_group, "RecentMenu");
   g_object_set (action, "hide-if-empty", FALSE, NULL);
 #endif
 
-#ifdef ENABLE_SOUND
-  action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-sound");
-  g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings, 
AR_SETTINGS_ENABLE_SOUND_KEY)));
-   // fixme  gtk_action_set_visible (action, ar_sound_is_available ());
-#endif /* ENABLE_SOUND */
-
   action = g_action_map_lookup_action (G_ACTION_MAP (window), "show-statusbar");
   priv->statusbar_visible = g_settings_get_boolean (priv->settings, AR_SETTINGS_SHOW_STATUSBAR_KEY);
   g_action_change_state (action, g_variant_new_boolean (priv->statusbar_visible));
 
   set_fullscreen_actions (window, FALSE);
 
-#ifdef HAVE_CLUTTER
-  action = g_action_map_lookup_action (G_ACTION_MAP (window), "enable-animations");
-  g_action_change_state (action, g_variant_new_boolean (g_settings_get_boolean (priv->settings, 
AR_SETTINGS_ENABLE_ANIMATIONS_KEY));
-
-#endif /* HAVE_CLUTTER */
-
-#if defined(HAVE_CLUTTER) || defined(ENABLE_SOUND)
-  /* Set the action visibility and listen for animation and sound mode changes */
-  screen_changed_cb (GTK_WIDGET (window), NULL, window);
-  g_signal_connect (window, "screen-changed",
-                    G_CALLBACK (screen_changed_cb), window);
-#endif /* HAVE_CLUTTER || ENABLE_SOUND */
-
   /* Now set up the widgets */
   main_vbox = gtk_vbox_new (FALSE, 0);
   gtk_container_add (GTK_CONTAINER (window), main_vbox);
@@ -2282,6 +2180,21 @@ aisleriot_window_init (AisleriotWindow *window)
   /* Fallback, if there is no saved size */
   gtk_window_set_default_size (GTK_WINDOW (window), MIN_WIDTH, MIN_HEIGHT);
 
+  /* Prefs */
+  click_to_move_changed_cb (priv->settings, AR_SETTINGS_CLICK_TO_MOVE_KEY, window);
+  g_signal_connect (priv->settings, "changed::" AR_SETTINGS_CLICK_TO_MOVE_KEY,
+                    G_CALLBACK (click_to_move_changed_cb), window);
+
+  enable_sound_changed_cb (priv->settings, AR_SETTINGS_ENABLE_SOUND_KEY, window);
+  g_signal_connect (priv->settings, "changed::" AR_SETTINGS_ENABLE_SOUND_KEY,
+                    G_CALLBACK (enable_sound_changed_cb), window);
+
+#ifdef HAVE_CLUTTER
+  enable_animations_changed_cb (priv->settings, AR_SETTINGS_ENABLE_ANIMATIONSKEY, window);
+  g_signal_connect (priv->settings, "changed::" AR_SETTINGS_ENABLE_ANIMATIONS_KEY,
+                    G_CALLBACK (enable_animations_changed_cb), window);
+#endif
+
   /* Restore window state */
   ar_gsettings_bind_window_state (AR_SETTINGS_WINDOW_STATE_PATH, GTK_WINDOW (window));
 
@@ -2309,6 +2222,10 @@ aisleriot_window_dispose (GObject *object)
     gtk_widget_destroy (priv->game_over_dialog);
     g_assert (priv->game_over_dialog == NULL);
   }
+  if (priv->prefs_dialog) {
+    gtk_widget_destroy (priv->prefs_dialog);
+    g_assert (priv->prefs_dialog == NULL);
+  }
   if (priv->game_choice_dialog) {
     gtk_widget_destroy (priv->game_choice_dialog);
     g_assert (priv->game_choice_dialog == NULL);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]