diff --git a/src/gui-pass-dialog.c b/src/gui-pass-dialog.c index eb58a452b44389e1160635fcdbe4c7e2f0d346b3..e542bddd2af78ad617a16db944368f7a0fca69a1 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 1e1f672d08d16e9e9cbc0c6fb4f277b0055a86ac..835bbb9e589a302ed30c67ab4bb4dbbd4bb0160e 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 6b31697263b9f49616fc2b940f4d841dc76083e2..8a0d2e2abbe95a4d5c5b81e1bf65905b6a9dac4e 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 1977ca4f20c22b627dfb66b1419657187eae9bb3..04929047514aa4577e371317202a1cffc0203f2e 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: