chiark / gitweb /
Merge login window fix from 4.1 branch
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 29 Jun 2008 11:49:00 +0000 (12:49 +0100)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sun, 29 Jun 2008 11:49:00 +0000 (12:49 +0100)
CHANGES.html
disobedience/client.c
disobedience/disobedience.c
disobedience/login.c
lib/eclient.c
lib/eclient.h

index 2a3c89421eed3974c11327b5b441ce4bec509181..31f55ad1a97b22c0870cf2a76a6f3cc6e67b977c 100644 (file)
@@ -57,6 +57,15 @@ span.command {
 
 <p>This file documents recent user-visible changes to DisOrder.</p>
 
+<h2>Changes up to version 4.1.1</h2>
+
+<div class=section>
+
+  <p>Disobedience's &ldquo;Login&rdquo; window now works when you are logged
+  in.</p>
+  
+</div>
+
 <h2>Changes up to version 4.1</h2>
 
 <div class=section>
index a8d33a92d666e4343a06715f9d9dfdebea8c5de9..24069034a548f4a98622ad9571137231e7b38990 100644 (file)
@@ -68,8 +68,7 @@ static gboolean gtkclient_dispatch(GSource *source,
   if(revents & (G_IO_OUT|G_IO_HUP|G_IO_ERR))
     mode |= DISORDER_POLL_WRITE;
   time(&esource->last_poll);
-  if(!login_window)
-    disorder_eclient_polled(esource->client, mode);
+  disorder_eclient_polled(esource->client, mode);
   return TRUE;                          /* ??? not documented */
 }
 
@@ -126,14 +125,15 @@ static void gtkclient_comms_error(void attribute((unused)) *u,
 /** @brief Report a protocol-level error
  *
  * The error will not be retried.  We offer a callback to the submitter of the
- * original command and if none is supplied we pop up an error box.
+ * original command and if none is supplied we drop the error message in the
+ * status bar.
  */
 static void gtkclient_protocol_error(void attribute((unused)) *u,
                                     void attribute((unused)) *v,
                                      int code,
                                     const char *msg) {
   D(("gtkclient_protocol_error %s", msg));
-  popup_protocol_error(code, msg);
+  gtk_label_set_text(GTK_LABEL(report_label), msg);
 }
 
 /** @brief Report callback from eclient */
index ce6eb0354ce36cb311538a62dc59de35ce5a1b15..ce94e960256258e6537f9185baa703777e30be8d 100644 (file)
@@ -422,6 +422,8 @@ void logged_in(void) {
   periodic_fast(0);
   /* Recheck server version */
   disorder_eclient_version(client, version_completed, 0);
+  disorder_eclient_enable_connect(client);
+  disorder_eclient_enable_connect(logclient);
 }
 
 int main(int argc, char **argv) {
index df826724b0996022d4413012798204b309b57462..7cb64c9d38cc9efce7260356a9ac9f82476a8467 100644 (file)
@@ -162,6 +162,8 @@ static void login_ok(GtkButton attribute((unused)) *button,
   } else {
     /* Failed to connect - report the error */
     popup_msg(GTK_MESSAGE_ERROR, disorder_last(c));
+    /* TODO it would be nice to restore the config (not the entry contents!) to
+     * the last known good one if we were already connected to something. */
   }
   disorder_close(c);                    /* no use for this any more */
 }
index 48ae7e270d31c608922ac3e16a6a22672661a8d6..e7353df436e89540f113ff763da0ce4b93adf144 100644 (file)
@@ -144,6 +144,9 @@ struct disorder_eclient {
 
   /** @brief Protocol version */
   int protocol;
+
+  /** @brief True if enabled */
+  int enabled;
 };
 
 /* Forward declarations ******************************************************/
@@ -234,6 +237,7 @@ disorder_eclient *disorder_eclient_new(const disorder_eclient_callbacks *cb,
   c->callbacks = cb;
   c->u = u;
   c->opstail = &c->ops;
+  c->enabled = 1;
   vector_init(&c->vec);
   dynstr_init(&c->input);
   dynstr_init(&c->output);
@@ -271,6 +275,16 @@ void disorder_eclient_close(disorder_eclient *c) {
     c->log_callbacks->state(c->log_v, c->statebits);
 }
 
+/** @brief Permit new connection activity */
+void disorder_eclient_enable_connect(disorder_eclient *c) {
+  c->enabled = 1;
+}
+
+/** @brief Suppress new connection activity */
+void disorder_eclient_disable_connect(disorder_eclient *c) {
+  c->enabled = 0;
+}
+
 /** @brief Return current state */
 unsigned long disorder_eclient_state(const disorder_eclient *c) {
   return c->statebits | (c->state > state_connected ? DISORDER_CONNECTED : 0);
@@ -340,9 +354,12 @@ void disorder_eclient_polled(disorder_eclient *c, unsigned mode) {
     /* If there is no password yet then we cannot connect */
     if(!config->password) {
       comms_error(c, "no password is configured");
+      c->enabled = 0;
       return;
     }
-    start_connect(c);
+    /* Only try to connect if enabled */
+    if(c->enabled)
+      start_connect(c);
     /* might now be state_disconnected (on error), state_connecting (slow
      * connect) or state_connected (fast connect).  If state_disconnected then
      * we just rely on a periodic callback from the event loop sometime. */
@@ -597,6 +614,7 @@ static void authuser_opcallback(disorder_eclient *c,
   if(c->rc / 100 != 2) {
     /* Wrong password or something.  We cannot proceed. */
     protocol_error(c, op, c->rc, "%s: %s", c->ident, c->line);
+    c->enabled = 0;
     disorder_eclient_close(c);
     return;
   }
index efb6b2d87936d89303557dcc7232bcc89cf29878..6901961872bd848bcfd32ab94211c1133d048fe0 100644 (file)
@@ -483,7 +483,9 @@ int disorder_eclient_adduser(disorder_eclient *c,
                              const char *password,
                              const char *rights,
                              void *v);
-
+void disorder_eclient_enable_connect(disorder_eclient *c);
+void disorder_eclient_disable_connect(disorder_eclient *c);
+  
 #endif
 
 /*