From 043d60b14ea6b3a5aa20b541e0db31433564e662 Mon Sep 17 00:00:00 2001 Message-Id: <043d60b14ea6b3a5aa20b541e0db31433564e662.1714969344.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 19 Oct 2007 20:58:38 +0100 Subject: [PATCH] friendlier login details saving Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/client.c | 2 +- disobedience/disobedience.h | 6 ++-- disobedience/login.c | 65 +++++++++++++++++++++++++++++++------ disobedience/misc.c | 10 +++--- disobedience/properties.c | 2 +- 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/disobedience/client.c b/disobedience/client.c index 8539221..12dfcb2 100644 --- a/disobedience/client.c +++ b/disobedience/client.c @@ -154,7 +154,7 @@ static void gtkclient_report(void attribute((unused)) *u, void popup_protocol_error(int attribute((unused)) code, const char *msg) { gtk_label_set_text(GTK_LABEL(report_label), msg); - popup_error(msg); + popup_msg(GTK_MESSAGE_ERROR, msg); } /** @brief Table of eclient callbacks */ diff --git a/disobedience/disobedience.h b/disobedience/disobedience.h index 37bdda4..70eee10 100644 --- a/disobedience/disobedience.h +++ b/disobedience/disobedience.h @@ -137,10 +137,10 @@ GdkPixbuf *find_image(const char *name); /* Get the pixbuf for an image. Returns a null pointer if it cannot be * found. */ -void popup_error(const char *msg); -/* Pop up an error message */ +void popup_msg(GtkMessageType mt, const char *msg); +/* Pop up a message */ -void fpopup_error(const char *fmt, ...); +void fpopup_msg(GtkMessageType mt, const char *fmt, ...); struct progress_window *progress_window_new(const char *title); /* Pop up a progress window */ diff --git a/disobedience/login.c b/disobedience/login.c index 729597b..8a00a59 100644 --- a/disobedience/login.c +++ b/disobedience/login.c @@ -26,6 +26,7 @@ #include "filepart.h" #include #include +#include /** @brief One field in the login window */ struct login_window_item { @@ -87,9 +88,23 @@ static void update_config(void) { size_t n; for(n = 0; n < NLWIS; ++n) - lwis[n].set(gtk_entry_get_text(GTK_ENTRY(lwi_entry[n]))); + lwis[n].set(xstrdup(gtk_entry_get_text(GTK_ENTRY(lwi_entry[n])))); } +#if 0 +static int modified_config(void) { + size_t n; + + for(n = 0; n < NLWIS; ++n) { + const char *entered = gtk_entry_get_text(GTK_ENTRY(lwi_entry[n])); + const char *current = lwis[n].get(); + if(strcmp(entered, current)) + return 1; + } + return 0; +} +#endif + static void login_ok(GtkButton attribute((unused)) *button, gpointer attribute((unused)) userdata) { update_config(); @@ -100,15 +115,34 @@ static void login_save(GtkButton attribute((unused)) *button, gpointer attribute((unused)) userdata) { char *path = config_userconf(0, 0), *tmp; FILE *fp; + GtkWidget *yorn = 0; update_config(); + /* See if the file already exists */ + if(access(path, F_OK) == 0) { + yorn = gtk_message_dialog_new + (GTK_WINDOW(login_window), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + "File %s already exists", path); + gtk_dialog_add_buttons(GTK_DIALOG(yorn), + "Overwrite", GTK_RESPONSE_ACCEPT, + "Cancel", GTK_RESPONSE_REJECT, + (char *)0); + if(gtk_dialog_run(GTK_DIALOG(yorn)) != GTK_RESPONSE_ACCEPT) + goto done; + gtk_widget_destroy(yorn); + yorn = 0; + } byte_xasprintf(&tmp, "%s.tmp", path); /* Make sure the directory exists; don't care if it already exists. */ mkdir(d_dirname(tmp), 02700); /* Write out the file */ if(!(fp = fopen(tmp, "w"))) { - fpopup_error("error opening %s: %s", tmp, strerror(errno)); - return; + fpopup_msg(GTK_MESSAGE_ERROR, "error opening %s: %s", + tmp, strerror(errno)); + goto done; } if(fprintf(fp, "username %s\n" "password %s\n" @@ -117,19 +151,30 @@ static void login_save(GtkButton attribute((unused)) *button, quoteutf8(config->password), quoteutf8(config->connect.s[0]), quoteutf8(config->connect.s[1])) < 0) { - fpopup_error("error writing to %s: %s", tmp, strerror(errno)); + fpopup_msg(GTK_MESSAGE_ERROR, "error writing to %s: %s", + tmp, strerror(errno)); fclose(fp); - return; + goto done; } if(fclose(fp) < 0) { - fpopup_error("error closing %s: %s", tmp, strerror(errno)); - return; + fpopup_msg(GTK_MESSAGE_ERROR, "error closing %s: %s", + tmp, strerror(errno)); + goto done; } /* Rename into place */ if(rename(tmp, path) < 0) { - fpopup_error("error renaming %s: %s", tmp, strerror(errno)); - return; + fpopup_msg(GTK_MESSAGE_ERROR, "error renaming %s: %s", + tmp, strerror(errno)); + goto done; } + fpopup_msg(GTK_MESSAGE_INFO, "Saved login configuration to %s", path); + gtk_widget_destroy(login_window); +done: + if(yorn) + gtk_widget_destroy(yorn); + /* OS X WM likes to hide it */ + if(login_window) + gtk_window_present(GTK_WINDOW(login_window)); } static void login_cancel(GtkButton attribute((unused)) *button, @@ -140,7 +185,7 @@ static void login_cancel(GtkButton attribute((unused)) *button, /* Buttons that appear at the bottom of the window */ static const struct button buttons[] = { { - GTK_STOCK_OK, + "Login", login_ok, "Login with these settings", }, diff --git a/disobedience/misc.c b/disobedience/misc.c index 1cb6d5a..c268654 100644 --- a/disobedience/misc.c +++ b/disobedience/misc.c @@ -93,13 +93,13 @@ GdkPixbuf *find_image(const char *name) { return pb; } -/** @brief Pop up an error message */ -void popup_error(const char *msg) { +/** @brief Pop up a message */ +void popup_msg(GtkMessageType mt, const char *msg) { GtkWidget *w; w = gtk_message_dialog_new(GTK_WINDOW(toplevel), GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, + mt, GTK_BUTTONS_CLOSE, "%s", msg); gtk_dialog_run(GTK_DIALOG(w)); @@ -107,14 +107,14 @@ void popup_error(const char *msg) { } /** @brief Pop up an error message */ -void fpopup_error(const char *fmt, ...) { +void fpopup_msg(GtkMessageType mt, const char *fmt, ...) { va_list ap; char *msg; va_start(ap, fmt); byte_xvasprintf(&msg, fmt, ap); va_end(ap); - popup_error(msg); + popup_msg(mt, msg); } /** @brief Create a button with an icon in it diff --git a/disobedience/properties.c b/disobedience/properties.c index aff768e..d306b56 100644 --- a/disobedience/properties.c +++ b/disobedience/properties.c @@ -185,7 +185,7 @@ void properties(int ntracks, const char **tracks) { } assert(properties_table == 0); if(ntracks > INT_MAX / NPREFS) { - popup_error("Too many tracks selected"); + popup_msg(GTK_MESSAGE_ERROR, "Too many tracks selected"); return; } /* Create a new properties window */ -- [mdw]