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)
disobedience/client.c
disobedience/disobedience.h
disobedience/login.c
disobedience/properties.c
disobedience/users.c
images/Makefile.am
images/logo256.png [new file with mode: 0644]

index 5c82953d479ab947586f160ef5664014fddc7fb7..24069034a548f4a98622ad9571137231e7b38990 100644 (file)
@@ -129,16 +129,11 @@ static void gtkclient_comms_error(void attribute((unused)) *u,
  * status bar.
  */
 static void gtkclient_protocol_error(void attribute((unused)) *u,
-                                    void *v,
+                                    void attribute((unused)) *v,
                                      int code,
                                     const char *msg) {
-  struct callbackdata *cbd = v;
-
   D(("gtkclient_protocol_error %s", msg));
-  if(cbd && cbd->onerror)
-    cbd->onerror(cbd, code, msg);
-  else
-    gtk_label_set_text(GTK_LABEL(report_label), msg);
+  gtk_label_set_text(GTK_LABEL(report_label), msg);
 }
 
 /** @brief Report callback from eclient */
index 1f631088e4503a8969bf90c8ccb659255b62adf5..91d07de7fa671fd4f0e695bc11da2cb7954a6e9f 100644 (file)
@@ -53,6 +53,7 @@
 #include <glib.h>
 #include <gtk/gtk.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk/gdkkeysyms.h>
 
 /* Types ------------------------------------------------------------------- */
 
@@ -60,28 +61,6 @@ struct queuelike;
 struct choosenode;
 struct progress_window;
 
-/** @brief Callback data structure
- *
- * This program is extremely heavily callback-driven.  Rather than have
- * numerous different callback structures we have a single one which can be
- * interpreted adequately both by success and error handlers.
- */
-struct callbackdata {
-  void (*onerror)(struct callbackdata *cbd,
-                  int code,
-                 const char *msg);     /* called on error */
-  union {
-    const char *key;                    /* gtkqueue.c op_part_lookup */
-    struct choosenode *choosenode;      /* gtkchoose.c got_files/got_dirs */
-    struct queuelike *ql;               /* gtkqueue.c queuelike_completed */
-    struct prefdata *f;                 /* properties.c */
-    const char *user;                   /* users.c */
-    struct {
-      const char *user, *email;         /* users.c */
-    } edituser;
-  } u;
-};
-
 /** @brief Per-tab callbacks
  *
  * Some of the options in the main menu depend on which tab is displayed, so we
index c9bf82659938a64dc5ecced0324bbda9ef8ce206..7cb64c9d38cc9efce7260356a9ac9f82476a8467 100644 (file)
@@ -29,7 +29,6 @@
  * It you hit Cancel then the window disappears without saving anything.
  *
  * TODO
- * - escape and return should work
  * - cancel/close should be consistent with properties
  */
 
@@ -175,6 +174,24 @@ static void login_cancel(GtkButton attribute((unused)) *button,
   gtk_widget_destroy(login_window);
 }
 
+/** @brief Keypress handler */
+static gboolean login_keypress(GtkWidget attribute((unused)) *widget,
+                               GdkEventKey *event,
+                               gpointer attribute((unused)) user_data) {
+  if(event->state)
+    return FALSE;
+  switch(event->keyval) {
+  case GDK_Return:
+    login_ok(0, 0);
+    return TRUE;
+  case GDK_Escape:
+    login_cancel(0, 0);
+    return TRUE;
+  default:
+    return FALSE;
+  }
+}
+
 /* Buttons that appear at the bottom of the window */
 static struct button buttons[] = {
   {
@@ -211,7 +228,7 @@ 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 + 1/*rows*/, 2/*columns*/, FALSE/*homogenous*/);
+  table = gtk_table_new(NLWIS/*rows*/, 2/*columns*/, FALSE/*homogenous*/);
   gtk_widget_set_style(table, tool_style);
   for(n = 0; n < NLWIS; ++n) {
     label = gtk_label_new(lwis[n].description);
@@ -236,6 +253,11 @@ void login_box(void) {
   }
   buttonbox = create_buttons(buttons, NBUTTONS);
   vbox = gtk_vbox_new(FALSE, 1);
+  gtk_box_pack_start(GTK_BOX(vbox),
+                     gtk_image_new_from_pixbuf(find_image("logo256.png")),
+                     TRUE/*expand*/,
+                     TRUE/*fill*/,
+                     4/*padding*/);
   gtk_box_pack_start(GTK_BOX(vbox), table, 
                      TRUE/*expand*/, TRUE/*fill*/, 1/*padding*/);
   gtk_box_pack_start(GTK_BOX(vbox), buttonbox,
@@ -243,6 +265,9 @@ void login_box(void) {
   gtk_container_add(GTK_CONTAINER(login_window), frame_widget(vbox, NULL));
   gtk_window_set_transient_for(GTK_WINDOW(login_window),
                                GTK_WINDOW(toplevel));
+  /* Keyboard shortcuts */
+  g_signal_connect(login_window, "key-press-event",
+                   G_CALLBACK(login_keypress), 0);
   gtk_widget_show_all(login_window);
 }
 
index 16ee97cbaaf59d352ac599757666f273bbc50dcd..7c1c816aaaa70580950995cade0f8f976d98f4d4 100644 (file)
@@ -19,9 +19,6 @@
  */
 /** @file disobedience/properties.c
  * @brief Track properties editor
- *
- * TODO:
- * - return and escape keys should work 
  */
 #include "disobedience.h"
 
@@ -47,12 +44,6 @@ static void set_edited_boolean(struct prefdata *f, const char *value);
 static void set_boolean(struct prefdata *f, const char *value);
 
 static void prefdata_completed(void *v, const char *err, const char *value);
-static void prefdata_onerror(struct callbackdata *cbd,
-                             int code,
-                             const char *msg);
-static struct callbackdata *make_callbackdata(struct prefdata *f);
-static void prefdata_completed_common(struct prefdata *f,
-                                      const char *value);
 
 static void properties_ok(GtkButton *button, gpointer userdata);
 static void properties_apply(GtkButton *button, gpointer userdata);
@@ -179,6 +170,24 @@ static void propagate_clicked(GtkButton attribute((unused)) *button,
   }
 }
 
+/** @brief Keypress handler */
+static gboolean properties_keypress(GtkWidget attribute((unused)) *widget,
+                                    GdkEventKey *event,
+                                    gpointer attribute((unused)) user_data) {
+  if(event->state)
+    return FALSE;
+  switch(event->keyval) {
+  case GDK_Return:
+    properties_ok(0, 0);
+    return TRUE;
+  case GDK_Escape:
+    properties_cancel(0, 0);
+    return TRUE;
+  default:
+    return FALSE;
+  }
+}
+
 void properties(int ntracks, const char **tracks) {
   int n, m;
   struct prefdata *f;
@@ -205,6 +214,9 @@ void properties(int ntracks, const char **tracks) {
   gtk_widget_set_style(properties_window, tool_style);
   g_signal_connect(properties_window, "destroy",
                   G_CALLBACK(gtk_widget_destroyed), &properties_window);
+  /* Keyboard shortcuts */
+  g_signal_connect(properties_window, "key-press-event",
+                   G_CALLBACK(properties_keypress), 0);
   /* Most of the action is the table of preferences */
   properties_table = gtk_table_new((NPREFS + 1) * ntracks, 2 + ntracks > 1,
                                    FALSE);
@@ -311,8 +323,8 @@ static void kickoff_namepart(struct prefdata *f) {
    * wanted was the underlying preference, but in fact it should always match
    * and will supply a sane default without having to know how to parse tracks
    * names (which implies knowing collection roots). */
-  disorder_eclient_namepart(client, prefdata_completed, f->track, "display", f->p->part,
-                            make_callbackdata(f));
+  disorder_eclient_namepart(client, prefdata_completed,
+                            f->track, "display", f->p->part, f);
 }
 
 static void completed_namepart(struct prefdata *f) {
@@ -357,8 +369,7 @@ static void set_namepart_completed(void *v, const char *err) {
 /* String preferences ------------------------------------------------------ */
 
 static void kickoff_string(struct prefdata *f) {
-  disorder_eclient_get(client, prefdata_completed, f->track, f->p->part, 
-                      make_callbackdata(f));
+  disorder_eclient_get(client, prefdata_completed, f->track, f->p->part, f);
 }
 
 static void completed_string(struct prefdata *f) {
@@ -390,8 +401,7 @@ static void set_string(struct prefdata *f, const char *value) {
 /* Boolean preferences ----------------------------------------------------- */
 
 static void kickoff_boolean(struct prefdata *f) {
-  disorder_eclient_get(client, prefdata_completed, f->track, f->p->part, 
-                      make_callbackdata(f));
+  disorder_eclient_get(client, prefdata_completed, f->track, f->p->part, f);
 }
 
 static void completed_boolean(struct prefdata *f) {
@@ -424,34 +434,11 @@ static void set_boolean(struct prefdata *f, const char *value) {
 
 /* Querying preferences ---------------------------------------------------- */
 
-/* Make a suitable callbackdata */
-static struct callbackdata *make_callbackdata(struct prefdata *f) {
-  struct callbackdata *cbd = xmalloc(sizeof *cbd);
-
-  cbd->onerror = prefdata_onerror;
-  cbd->u.f = f;
-  return cbd;
-}
-
-/* No pref was set */
-static void prefdata_onerror(struct callbackdata *cbd,
-                             int attribute((unused)) code,
-                             const char attribute((unused)) *msg) {
-  prefdata_completed_common(cbd->u.f, 0);
-}
-
-/* Got the value of a pref */
 static void prefdata_completed(void *v, const char *err, const char *value) {
-  if(err) {
-  } else {
-    struct callbackdata *cbd = v;
-    
-    prefdata_completed_common(cbd->u.f, value);
-  }
-}
+  struct prefdata *const f = v;
 
-static void prefdata_completed_common(struct prefdata *f,
-                                      const char *value) {
+  if(err)
+    popup_protocol_error(0, err);
   f->value = value;
   f->p->type->completed(f);
   f->p->type->set_edited(f, f->value);
index a835ced63f0d26115f958685796dbcc8b0cadb6a..363684f14163f7b2418e42cd68aa4303ae721b35 100644 (file)
@@ -35,7 +35,6 @@
  *
  * TODO:
  * - enter new username in the GtkTreeView
- * - escape and enter keys should work
  * - should have a cancel or close button, consistent with properties and login
  */
 
@@ -672,6 +671,21 @@ static struct button users_buttons[] = {
 };
 #define NUSERS_BUTTONS (sizeof users_buttons / sizeof *users_buttons)
 
+/** @brief Keypress handler */
+static gboolean users_keypress(GtkWidget attribute((unused)) *widget,
+                               GdkEventKey *event,
+                               gpointer attribute((unused)) user_data) {
+  if(event->state)
+    return FALSE;
+  switch(event->keyval) {
+  case GDK_Escape:
+    gtk_widget_destroy(users_window);
+    return TRUE;
+  default:
+    return FALSE;
+  }
+}
+
 /** @brief Pop up the user management window */
 void manage_users(void) {
   GtkWidget *tree, *buttons, *hbox, *hbox2, *vbox, *vbox2;
@@ -692,6 +706,9 @@ void manage_users(void) {
   g_signal_connect(users_window, "destroy",
                   G_CALLBACK(gtk_widget_destroyed), &users_window);
   gtk_window_set_title(GTK_WINDOW(users_window), "User Management");
+  /* Keyboard shortcuts */
+  g_signal_connect(users_window, "key-press-event",
+                   G_CALLBACK(users_keypress), 0);
   /* default size is too small */
   gtk_window_set_default_size(GTK_WINDOW(users_window), 240, 240);
 
index 88145b1a083a5a020b8bb055bc7f62aa62ae5654..607d0254a465b1e17726c269db2394e6f6de58fd 100644 (file)
@@ -22,7 +22,7 @@ pkghttp_DATA=cross.png down.png downdown.png edit.png nocross.png     \
 nodown.png nodowndown.png noup.png noupup.png tick.png up.png upup.png \
 notes.png play.png pause.png random.png randomcross.png notescross.png \
 propagate.png speaker.png speakercross.png directory.png logo.png      \
-logosmall.png
+logosmall.png logo256.png
 
 EXTRA_DIST=$(pkghttp_DATA) duck.png disobedience16x16.xpm disobedience32x32.xpm
 
diff --git a/images/logo256.png b/images/logo256.png
new file mode 100644 (file)
index 0000000..e4e8006
Binary files /dev/null and b/images/logo256.png differ