*/
/** @file disobedience/properties.c
* @brief Track properties editor
- *
- * TODO:
- * - return and escape keys should work
*/
#include "disobedience.h"
static const char *get_edited_namepart(struct prefdata *f);
static void set_edited_namepart(struct prefdata *f, const char *value);
static void set_namepart(struct prefdata *f, const char *value);
-static void set_namepart_completed(void *v, const char *error);
+static void set_namepart_completed(void *v, const char *err);
static void kickoff_string(struct prefdata *f);
static void completed_string(struct prefdata *f);
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 *error, 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 prefdata_completed(void *v, const char *err, const char *value);
static void properties_ok(GtkButton *button, gpointer userdata);
static void properties_apply(GtkButton *button, gpointer userdata);
}
}
+/** @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;
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);
* 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) {
}
/* Called when we've set a namepart */
-static void set_namepart_completed(void *v, const char *error) {
- if(error)
- popup_protocol_error(0, error);
+static void set_namepart_completed(void *v, const char *err) {
+ if(err)
+ popup_protocol_error(0, err);
else {
struct prefdata *f = v;
/* 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) {
}
static void set_string_completed(void attribute((unused)) *v,
- const char *error) {
- if(error)
- popup_protocol_error(0, error);
+ const char *err) {
+ if(err)
+ popup_protocol_error(0, err);
}
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) {
/* 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 *error, const char *value) {
- if(error) {
- } else {
- struct callbackdata *cbd = v;
-
- prefdata_completed_common(cbd->u.f, value);
- }
-}
+static void prefdata_completed(void *v, const char *err, const char *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);