chiark / gitweb /
login details box for disobedience. a bit unfriendly but does work.
[disorder] / disobedience / disobedience.c
index 2a39a150aadb264ba32adc229964303a603af3ea..6271560a796887fec6cdac7e9622d65b7bfe1166 100644 (file)
@@ -49,6 +49,9 @@ GtkWidget *tabs;
 /** @brief Main client */
 disorder_eclient *client;
 
+/** @brief Log client */
+disorder_eclient *logclient;
+
 /** @brief Last reported state
  *
  * This is updated by log_state().
@@ -75,6 +78,12 @@ static int nop_in_flight;
 /** @brief Global tooltip group */
 GtkTooltips *tips;
 
+/** @brief Linked list of functions to call when we reset login parameters */
+static struct reset_callback_node {
+  struct reset_callback_node *next;
+  reset_callback *callback;
+} *resets;
+
 /* Window creation --------------------------------------------------------- */
 
 /* Note that all the client operations kicked off from here will only complete
@@ -345,9 +354,28 @@ static void version(void) {
   exit(0);
 }
 
+/* reset state */
+void reset(void) {
+  struct reset_callback_node *r;
+
+  /* reset the clients */
+  disorder_eclient_close(client);
+  disorder_eclient_close(logclient);
+  for(r = resets; r; r = r->next)
+    r->callback();
+}
+
+/** @brief Register a reset callback */
+void register_reset(reset_callback *callback) {
+  struct reset_callback_node *const r = xmalloc(sizeof *r);
+
+  r->next = resets;
+  r->callback = callback;
+  resets = r;
+}
+
 int main(int argc, char **argv) {
   int n;
-  disorder_eclient *logclient;
 
   mem_init();
   /* garbage-collect PCRE's memory */
@@ -401,6 +429,7 @@ int main(int argc, char **argv) {
                      maybe_send_nop,
                      0/*data*/,
                      0/*notify*/);
+  register_reset(properties_reset);
   /* Start monitoring the log */
   disorder_eclient_log(logclient, &log_callbacks, 0);
   D(("enter main loop"));