From 0129d7701332f547f3f0de25280bae89f5683435 Mon Sep 17 00:00:00 2001
From: Antoine Fontaine <antoine.fontaine@epfl.ch>
Date: Mon, 12 Aug 2019 00:51:17 +0200
Subject: [PATCH] Adapt GuiPassDialog to edit settings directly

---
 src/gui-pass-dialog.c | 31 ++++++++++++-------------------
 src/gui-pass-dialog.h |  6 +++---
 src/gui-window.c      | 22 ++++++++++------------
 src/settings.c        |  1 -
 4 files changed, 25 insertions(+), 35 deletions(-)

diff --git a/src/gui-pass-dialog.c b/src/gui-pass-dialog.c
index eb58a45..e542bdd 100644
--- a/src/gui-pass-dialog.c
+++ b/src/gui-pass-dialog.c
@@ -21,6 +21,9 @@
 struct _GuiPassDialog
 {
   HdyDialog parent_instance;
+
+  MoodSettings *settings;
+
   GtkButton *accept;
   GtkButton *cancel;
   GtkEntry *user_entry;
@@ -31,23 +34,18 @@ struct _GuiPassDialog
 
 G_DEFINE_TYPE (GuiPassDialog, gui_pass_dialog, HDY_TYPE_DIALOG)
 
-// not perfect, but I don't want to start creating properties
-// and getters and setters for something that works equally well
-static pass_cb pass_changed_cb = NULL;
-static gpointer pass_changed_cb_data;
-
 GuiPassDialog *
-gui_pass_dialog_new (GtkWindow   *window,
-                     const gchar *current_username,
-                     pass_cb      cb,
-                     gpointer     user_data)
+gui_pass_dialog_new (GtkWindow    *window,
+                     MoodSettings *settings)
 {
-  pass_changed_cb = cb;
-  pass_changed_cb_data = user_data;
   GuiPassDialog *self = g_object_new (HDY_TYPE_GUI_PASS_DIALOG,
                                       "use-header-bar", 1,
                                       NULL);
 
+  self->settings = settings;
+
+  g_autofree const gchar *current_username;
+  g_object_get (self->settings, "username", &current_username, NULL);
   // prefill the username
   gtk_entry_set_text (self->user_entry, current_username);
 
@@ -74,14 +72,9 @@ dialog_close_cb (GuiPassDialog *self, gint response)
   case GTK_RESPONSE_CANCEL:
     break;
   case GTK_RESPONSE_ACCEPT:
-    {
-    const gchar *username = gtk_entry_get_text (self->user_entry);
-    const gchar *password = gtk_entry_get_text (self->pass_entry);
-    if (pass_changed_cb)
-      pass_changed_cb (pass_changed_cb_data, username, password);
-    else
-      g_warn_if_reached ();
-    }
+    g_object_set (self->settings,
+                  "username", gtk_entry_get_text (self->user_entry),
+                  "password", gtk_entry_get_text (self->pass_entry), NULL);
     break;
   default:
     g_assert (0);
diff --git a/src/gui-pass-dialog.h b/src/gui-pass-dialog.h
index 1e1f672..835bbb9 100644
--- a/src/gui-pass-dialog.h
+++ b/src/gui-pass-dialog.h
@@ -18,14 +18,14 @@
 
 #pragma once
 
+#include "settings.h"
+
 #include <gtk/gtk.h>
 #define HANDY_USE_UNSTABLE_API
 #include <handy.h>
 
-typedef void (*pass_cb) (gpointer user_data, const gchar *username, const gchar *password);
-
 #define HDY_TYPE_GUI_PASS_DIALOG (gui_pass_dialog_get_type())
 
 G_DECLARE_FINAL_TYPE (GuiPassDialog, gui_pass_dialog, HDY, GUI_PASS_DIALOG, HdyDialog)
 
-GuiPassDialog *gui_pass_dialog_new (GtkWindow *win, const gchar *current_username, pass_cb cb, gpointer user_data);
+GuiPassDialog *gui_pass_dialog_new (GtkWindow *win, MoodSettings *settings);
diff --git a/src/gui-window.c b/src/gui-window.c
index 6b31697..8a0d2e2 100644
--- a/src/gui-window.c
+++ b/src/gui-window.c
@@ -57,20 +57,17 @@ static void update_moodle_index (GuiWindow *self);
 static void
 initialize_moodle_provider (MoodSettings *settings)
 {
-  const gchar *username, *password;
+  g_autofree const gchar *username, *password;
   g_object_get (settings, "username", &username,
                           "password", &password, NULL);
   moodle_provider_init (MOODLE_MODE_ONLINE, username, password);
 }
 
 static void
-pass_changed_cb (gpointer ptr, const gchar *username, const gchar *password)
+pass_changed_cb (gpointer ptr)
 {
   GuiWindow *self = ptr;
 
-  g_object_set (self->settings, "username", username,
-                                "password", password, NULL);
-
   moodle_provider_disconnect ();
   initialize_moodle_provider (self->settings);
   update_moodle_index (self);
@@ -79,12 +76,10 @@ pass_changed_cb (gpointer ptr, const gchar *username, const gchar *password)
 static void
 activate_ask_pass (GSimpleAction *simple,
                    GVariant      *parameter,
-                   gpointer       ptr)
+                   gpointer       self_ptr)
 {
-  GuiWindow *self = ptr;
-  const gchar *username;
-  g_object_get (self->settings, "username", &username, NULL);
-  self->dialog = gui_pass_dialog_new (GTK_WINDOW (self), username, pass_changed_cb, ptr);
+  GuiWindow *self = self_ptr;
+  self->dialog = gui_pass_dialog_new (GTK_WINDOW (self), self->settings);
   gtk_widget_show (GTK_WIDGET (self->dialog));
 }
 
@@ -348,6 +343,11 @@ gui_window_init (GuiWindow *self)
   self->dialog = NULL;
   gtk_widget_init_template (GTK_WIDGET (self));
 
+  self->settings = mood_settings_new ();
+
+  g_signal_connect_swapped (self->settings, "notify::password",
+                            G_CALLBACK (pass_changed_cb), self);
+
   const GActionEntry entries[] = {
     { "ask-pass",     activate_ask_pass          },
     //{ "print-string", activate_print_string, "s" }
@@ -356,8 +356,6 @@ gui_window_init (GuiWindow *self)
                                    entries, G_N_ELEMENTS (entries),
                                    self);
 
-  self->settings = mood_settings_new ();
-
   initialize_moodle_provider (self->settings);
 
   hdy_leaflet_set_visible_child_name (self->content_box, "content");
diff --git a/src/settings.c b/src/settings.c
index 1977ca4..0492904 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -90,7 +90,6 @@ mood_settings_get_property (GObject    *object,
     if (!moodle_password_get (self->username, &password))
       g_error ("impossible to get saved password\n");
     g_value_set_string (value, password);
-    // TODO: ensure password is freed out of memory
     break;
   }
   case PROP_SETTING_USE_CACHE:
-- 
GitLab