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", ¤t_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