From 186f896bbf82c676ceae952e4df0f5a1fb2819c7 Mon Sep 17 00:00:00 2001 Message-Id: <186f896bbf82c676ceae952e4df0f5a1fb2819c7.1715510044.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 30 Sep 2007 18:46:11 +0100 Subject: [PATCH] new state change notification logic Organization: Straylight/Edgeware From: Richard Kettlewell --- disobedience/disobedience.h | 7 +++++++ disobedience/log.c | 30 ++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/disobedience/disobedience.h b/disobedience/disobedience.h index 6a68b9a..7449e27 100644 --- a/disobedience/disobedience.h +++ b/disobedience/disobedience.h @@ -91,6 +91,8 @@ extern int choosealpha; /* break up choose by letter */ extern const disorder_eclient_log_callbacks log_callbacks; +typedef void monitor_callback(void *u, unsigned long newstate); + /* Functions --------------------------------------------------------------- */ disorder_eclient *gtkclient(void); @@ -113,6 +115,11 @@ GdkPixbuf *find_image(const char *name); void popup_error(const char *msg); /* Pop up an error message */ +void register_monitor(monitor_callback *callback, + void *u, + unsigned long mask); +/* Register a state monitor */ + void all_update(void); /* Update everything */ diff --git a/disobedience/log.c b/disobedience/log.c index b2e3e68..e170c2a 100644 --- a/disobedience/log.c +++ b/disobedience/log.c @@ -20,7 +20,7 @@ #include "disobedience.h" -/* Functions --------------------------------------------------------------- */ +/* State monitoring -------------------------------------------------------- */ static void log_connected(void *v); static void log_completed(void *v, const char *track); @@ -51,7 +51,14 @@ const disorder_eclient_log_callbacks log_callbacks = { log_volume }; -/* State monitoring -------------------------------------------------------- */ +struct monitor { + struct monitor *next; + unsigned long mask; + monitor_callback *callback; + void *u; +}; + +static struct monitor *monitors; void all_update(void) { playing_update(); @@ -134,6 +141,13 @@ static void log_scratched(void attribute((unused)) *v, static void log_state(void attribute((unused)) *v, unsigned long state) { + const struct monitor *m; + + /* Tell anything that cares about the state change */ + for(m = monitors; m; m = m->next) { + if((state ^ last_state) & m->mask) + m->callback(m->u, state); + } last_state = state; control_update(); /* If the track is paused or resume then the currently playing track is @@ -151,6 +165,18 @@ static void log_volume(void attribute((unused)) *v, } } +void register_monitor(monitor_callback *callback, + void *u, + unsigned long mask) { + struct monitor *m = xmalloc(sizeof *m); + + m->next = monitors; + m->mask = mask; + m->callback = callback; + m->u = u; + monitors = m; +} + /* Local Variables: c-basic-offset:2 -- [mdw]