From ec7109f36e878732d30e592279c2b160b28e6955 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sun, 13 Jul 2008 14:33:02 +0100 Subject: [PATCH] Disobedience login window now has a 'remote' switch. When off it will attempt to connect to the local server. There is no way to choose the path to the server socket - it is assumed to have been compiled with the same locations as Disobedience (not unreasonably). Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/login.c | 93 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/disobedience/login.c b/disobedience/login.c index 73aaada..803dbf4 100644 --- a/disobedience/login.c +++ b/disobedience/login.c @@ -54,6 +54,7 @@ struct login_window_item { /** @brief Flags * * - @ref LWI_HIDDEN - this is a password + * - @ref LWI_REMOTE - this is for remote connections */ unsigned flags; @@ -62,6 +63,9 @@ struct login_window_item { /** @brief This is a password */ #define LWI_HIDDEN 0x0001 +/** @brief This is for remote connections */ +#define LWI_REMOTE 0x0002 + /** @brief Current login window */ GtkWidget *login_window; @@ -75,10 +79,21 @@ static void default_connect(void) { } } -static const char *get_hostname(void) { return config->connect.s[0]; } -static const char *get_service(void) { return config->connect.s[1]; } -static const char *get_username(void) { return config->username; } -static const char *get_password(void) { return config->password ? config->password : ""; } +static const char *get_hostname(void) { + return config->connect.n >= 2 ? config->connect.s[0] : ""; +} + +static const char *get_service(void) { + return config->connect.n >= 2 ? config->connect.s[1] : ""; +} + +static const char *get_username(void) { + return config->username; +} + +static const char *get_password(void) { + return config->password ? config->password : ""; +} static void set_hostname(struct config *c, const char *s) { c->connect.s[0] = (char *)s; @@ -98,24 +113,30 @@ static void set_password(struct config *c, const char *s) { /** @brief Table used to generate the form */ static const struct login_window_item lwis[] = { - { "Hostname", get_hostname, set_hostname, 0 }, - { "Service", get_service, set_service, 0 }, + { "Hostname", get_hostname, set_hostname, LWI_REMOTE }, + { "Service", get_service, set_service, LWI_REMOTE }, { "User name", get_username, set_username, 0 }, { "Password", get_password, set_password, LWI_HIDDEN }, }; #define NLWIS (sizeof lwis / sizeof *lwis) +static GtkWidget *lwi_remote; static GtkWidget *lwi_entry[NLWIS]; static void login_update_config(struct config *c) { size_t n; + const gboolean remote = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lwi_remote)); - if(c->connect.n < 2) { + if(remote) { c->connect.n = 2; c->connect.s = xcalloc(2, sizeof (char *)); + } else { + c->connect.n = 0; + c->connect.s = 0; } for(n = 0; n < NLWIS; ++n) - lwis[n].set(c, xstrdup(gtk_entry_get_text(GTK_ENTRY(lwi_entry[n])))); + if(remote || !(lwis[n].flags & LWI_REMOTE)) + lwis[n].set(c, xstrdup(gtk_entry_get_text(GTK_ENTRY(lwi_entry[n])))); } /** @brief Save current login details */ @@ -132,13 +153,15 @@ static void login_save_config(void) { tmp, strerror(errno)); goto done; } - if(fprintf(fp, "username %s\n" - "password %s\n" - "connect %s %s\n", - quoteutf8(config->username), - quoteutf8(config->password), - quoteutf8(config->connect.s[0]), - quoteutf8(config->connect.s[1])) < 0) { + int rc = fprintf(fp, "username %s\n" + "password %s\n", + quoteutf8(config->username), + quoteutf8(config->password)); + if(rc >= 0 && config->connect.n) + rc = fprintf(fp, "connect %s %s\n", + quoteutf8(config->connect.s[0]), + quoteutf8(config->connect.s[1])); + if(rc < 0) { fpopup_msg(GTK_MESSAGE_ERROR, "error writing to %s: %s", tmp, strerror(errno)); fclose(fp); @@ -165,6 +188,7 @@ static void login_ok(GtkButton attribute((unused)) *button, disorder_client *c; struct config *tmpconfig = xmalloc(sizeof *tmpconfig); + tmpconfig->home = xstrdup(pkgstatedir); /* Copy the new config into @ref config */ login_update_config(tmpconfig); /* Attempt a login with the new details */ @@ -227,6 +251,19 @@ static struct button buttons[] = { #define NBUTTONS (int)(sizeof buttons / sizeof *buttons) +/** @brief Called when the remote/local button is toggled (and initially) + * + * Sets the sensitivity of the host/port entries. + */ +static void lwi_remote_toggled(GtkToggleButton *togglebutton, + gpointer attribute((unused)) user_data) { + const gboolean remote = gtk_toggle_button_get_active(togglebutton); + + for(unsigned n = 0; n < NLWIS; ++n) + if(lwis[n].flags & LWI_REMOTE) + gtk_widget_set_sensitive(lwi_entry[n], remote); +} + /** @brief Pop up a login box */ void login_box(void) { GtkWidget *table, *label, *entry, *buttonbox, *vbox; @@ -245,15 +282,31 @@ void login_box(void) { G_CALLBACK(gtk_widget_destroyed), &login_window); gtk_window_set_title(GTK_WINDOW(login_window), "Login Details"); /* Construct the form */ - table = gtk_table_new(NLWIS/*rows*/, 2/*columns*/, FALSE/*homogenous*/); + table = gtk_table_new(1 + NLWIS/*rows*/, 2/*columns*/, FALSE/*homogenous*/); gtk_widget_set_style(table, tool_style); + label = gtk_label_new("Remote"); + gtk_widget_set_style(label, tool_style); + gtk_misc_set_alignment(GTK_MISC(label), 1/*right*/, 0/*bottom*/); + gtk_table_attach(GTK_TABLE(table), label, + 0, 1, /* left/right_attach */ + 0, 1, /* top/bottom_attach */ + GTK_FILL, 0, /* x/yoptions */ + 1, 1); /* x/ypadding */ + lwi_remote = gtk_check_button_new(); + gtk_widget_set_style(lwi_remote, tool_style); + gtk_table_attach(GTK_TABLE(table), lwi_remote, + 1, 2, /* left/right_attach */ + 0, 1, /* top/bottom_attach */ + GTK_EXPAND|GTK_FILL, 0, /* x/yoptions */ + 1, 1); /* x/ypadding */ + g_signal_connect(lwi_remote, "toggled", G_CALLBACK(lwi_remote_toggled), 0); for(n = 0; n < NLWIS; ++n) { label = gtk_label_new(lwis[n].description); gtk_widget_set_style(label, tool_style); gtk_misc_set_alignment(GTK_MISC(label), 1/*right*/, 0/*bottom*/); gtk_table_attach(GTK_TABLE(table), label, 0, 1, /* left/right_attach */ - n, n+1, /* top/bottom_attach */ + n+1, n+2, /* top/bottom_attach */ GTK_FILL, 0, /* x/yoptions */ 1, 1); /* x/ypadding */ entry = gtk_entry_new(); @@ -263,11 +316,15 @@ void login_box(void) { gtk_entry_set_text(GTK_ENTRY(entry), lwis[n].get()); gtk_table_attach(GTK_TABLE(table), entry, 1, 2, /* left/right_attach */ - n, n+1, /* top/bottom_attach */ + n+1, n+2, /* top/bottom_attach */ GTK_EXPAND|GTK_FILL, 0, /* x/yoptions */ 1, 1); /* x/ypadding */ lwi_entry[n] = entry; } + /* Initial settings */ + lwi_remote_toggled(GTK_TOGGLE_BUTTON(lwi_remote), 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lwi_remote), + config->connect.n >= 2); buttonbox = create_buttons(buttons, NBUTTONS); vbox = gtk_vbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), -- [mdw]