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

Re: [virt-tools-list] [PATCH virt-viewer] Add a "Do not ask me again" checkbox when closing app



Hi,

Looks good, ack.

Regards,

Hans


On 01/29/2013 05:47 PM, Marc-André Lureau wrote:
---
  src/virt-viewer-app.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++--
  1 file changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index eea77e0..a082400 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -140,6 +140,8 @@ struct _VirtViewerAppPrivate {
      char *title;

      gint focused;
+    GKeyFile *config;
+    gchar *config_file;
  };


@@ -221,6 +223,9 @@ virt_viewer_app_simple_message_dialog(VirtViewerApp *self,
  void
  virt_viewer_app_quit(VirtViewerApp *self)
  {
+    GError *error = NULL;
+    gchar *data;
+
      g_return_if_fail(VIRT_VIEWER_IS_APP(self));
      VirtViewerAppPrivate *priv = self->priv;

@@ -232,6 +237,20 @@ virt_viewer_app_quit(VirtViewerApp *self)
          }
      }

+    {
+        gchar *dir = g_path_get_dirname(priv->config_file);
+        if (g_mkdir_with_parents(dir, S_IRWXU) == -1)
+            g_warning("failed to create config directory");
+        g_free(dir);
+    }
+
+    if ((data = g_key_file_to_data(priv->config, NULL, &error)) == NULL ||
+        !g_file_set_contents(priv->config_file, data, -1, &error)) {
+        g_warning("Couldn't save configuration: %s", error->message);
+        g_clear_error(&error);
+    }
+    g_free(data);
+
      gtk_main_quit();
  }

@@ -259,6 +278,8 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
                                     VirtViewerWindow *window,
                                     gboolean visible)
  {
+    GError *error = NULL;
+
      g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
      g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(window), FALSE);

@@ -269,14 +290,35 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
          if (virt_viewer_app_get_n_windows_visible(self) > 1) {
              virt_viewer_window_hide(window);
              return FALSE;
-        } else {
+        }
+
+        gboolean ask = g_key_file_get_boolean(self->priv->config,
+                                              "virt-viewer", "ask-quit", &error);
+        if (error) {
+            ask = TRUE;
+            g_clear_error(&error);
+        }
+
+        if (ask) {
              GtkWidget *dialog =
                  gtk_message_dialog_new (virt_viewer_window_get_window(window),
                                          GTK_DIALOG_DESTROY_WITH_PARENT,
                                          GTK_MESSAGE_QUESTION,
                                          GTK_BUTTONS_OK_CANCEL,
                                          _("Do you want to close the session?"));
-            gint result = gtk_dialog_run (GTK_DIALOG (dialog));
+
+            GtkWidget *check = gtk_check_button_new_with_label(_("Do not ask me again"));
+            gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), check);
+            gtk_widget_show(check);
+
+            gint result = gtk_dialog_run(GTK_DIALOG(dialog));
+
+            gboolean dont_ask = FALSE;
+            g_object_get(check, "active", &dont_ask, NULL);
+            if (dont_ask)
+                g_key_file_set_boolean(self->priv->config,
+                                       "virt-viewer", "ask-quit", FALSE);
+
              gtk_widget_destroy(dialog);
              switch (result) {
              case GTK_RESPONSE_OK:
@@ -286,6 +328,9 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
                  break;
              }
              return FALSE;
+        } else {
+            virt_viewer_app_quit(self);
+            return FALSE;
          }
      }

@@ -1291,6 +1336,9 @@ virt_viewer_app_dispose (GObject *object)
      priv->guri = NULL;
      g_free(priv->title);
      priv->title = NULL;
+    g_free(priv->config_file);
+    priv->config_file = NULL;
+    g_clear_pointer(&priv->config, g_key_file_free);

      virt_viewer_app_free_connect_info(self);

@@ -1320,8 +1368,20 @@ gboolean virt_viewer_app_start(VirtViewerApp *self)
  static void
  virt_viewer_app_init (VirtViewerApp *self)
  {
+    GError *error = NULL;
+
      self->priv = GET_PRIVATE(self);
      self->priv->windows = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_object_unref);
+    self->priv->config = g_key_file_new();
+    self->priv->config_file = g_build_filename(g_get_user_config_dir(),
+                                               "virt-viewer", "settings", NULL);
+
+    g_key_file_load_from_file(self->priv->config, self->priv->config_file,
+                    G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error);
+    if (error)
+        g_debug("Couldn't load configuration: %s", error->message);
+
+    g_clear_error(&error);
  }

  static GObject *



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