* original command and if none is supplied we pop up an error box.
*/
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
- popup_protocol_error(code, msg);
+ popup_protocol_error(code, msg);
}
/** @brief Report callback from eclient */
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
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);
* 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) {
/* 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) {
/* 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 *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);