X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/53fa91bb028fc115847700f9f3640f1b107c4592..b0b15b7ced28b3c6ddfcd4b0a7e46ee6432a243c:/disobedience/disobedience.c diff --git a/disobedience/disobedience.c b/disobedience/disobedience.c index a3b09af..b9866f7 100644 --- a/disobedience/disobedience.c +++ b/disobedience/disobedience.c @@ -78,6 +78,12 @@ static int nop_in_flight; /** @brief True if an rtp-address command is in flight */ static int rtp_address_in_flight; +/** @brief True if a rights lookup is in flight */ +static int rights_lookup_in_flight; + +/** @brief Current rights bitmap */ +rights_type last_rights; + /** @brief Global tooltip group */ GtkTooltips *tips; @@ -90,11 +96,7 @@ int rtp_supported; /** @brief True if RTP play is enabled */ int rtp_is_running; -/** @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; +static void check_rtp_address(void); /* Window creation --------------------------------------------------------- */ @@ -116,11 +118,16 @@ static gboolean delete_event(GtkWidget attribute((unused)) *widget, * * Updates the menu settings to correspond to the new page. */ -static void tab_switched(GtkNotebook attribute((unused)) *notebook, +static void tab_switched(GtkNotebook *notebook, GtkNotebookPage attribute((unused)) *page, guint page_num, gpointer attribute((unused)) user_data) { menu_update(page_num); + GtkWidget *const tab = gtk_notebook_get_nth_page(notebook, page_num); + const struct tabtype *const t = g_object_get_data(G_OBJECT(tab), "type"); + if(!t) return; /* TODO */ + if(t->selected) + t->selected(); } /** @brief Create the report box */ @@ -276,9 +283,31 @@ static const GMemVTable glib_memvtable = { }; #endif +static void userinfo_rights_completed(void attribute((unused)) *v, + const char *error, + const char *value) { + rights_type r; + + if(error) { + popup_protocol_error(0, error); + r = 0; + } else { + if(parse_rights(value, &r, 0)) + r = 0; + } + /* If rights have changed, signal everything that cares */ + if(r != last_rights) { + last_rights = r; + ++suppress_actions; + event_raise("rights-changed", 0); + --suppress_actions; + } + rights_lookup_in_flight = 0; +} + /** @brief Called occasionally */ static gboolean periodic_slow(gpointer attribute((unused)) data) { - D(("periodic")); + D(("periodic_slow")); /* Expire cached data */ cache_expire(); /* Update everything to be sure that the connection to the server hasn't @@ -291,6 +320,16 @@ static gboolean periodic_slow(gpointer attribute((unused)) data) { #if MTRACK report_tags(); #endif + /* Periodically check what our rights are */ + if(!rights_lookup_in_flight) { + rights_lookup_in_flight = 1; + disorder_eclient_userinfo(client, + userinfo_rights_completed, + config->username, "rights", + 0); + } + /* Recheck RTP status too */ + check_rtp_address(); return TRUE; /* don't remove me */ } @@ -318,7 +357,7 @@ static gboolean periodic_fast(gpointer attribute((unused)) data) { && (nl != volume_l || nr != volume_r)) { volume_l = nl; volume_r = nr; - volume_update(); + event_raise("volume-changed", 0); } } return TRUE; @@ -342,45 +381,42 @@ static gboolean maybe_send_nop(gpointer attribute((unused)) data) { disorder_eclient_nop(client, nop_completed, 0); } if(rtp_supported) { - const int old_state = rtp_is_running; + const int rtp_was_running = rtp_is_running; rtp_is_running = rtp_running(); - if(old_state != rtp_is_running) - control_monitor(0); + if(rtp_was_running != rtp_is_running) + event_raise("rtp-changed", 0); } return TRUE; /* keep call me please */ } /** @brief Called when a rtp-address command succeeds */ static void got_rtp_address(void attribute((unused)) *v, + const char *error, int attribute((unused)) nvec, char attribute((unused)) **vec) { - ++suppress_actions; - rtp_address_in_flight = 0; - rtp_supported = 1; - rtp_is_running = rtp_running(); - control_monitor(0); - --suppress_actions; -} + const int rtp_was_supported = rtp_supported; + const int rtp_was_running = rtp_is_running; -/** @brief Called when a rtp-address command fails */ -static void no_rtp_address(struct callbackdata attribute((unused)) *cbd, - int attribute((unused)) code, - const char attribute((unused)) *msg) { ++suppress_actions; rtp_address_in_flight = 0; - rtp_supported = 0; - rtp_is_running = 0; - control_monitor(0); + if(error) { + /* An error just means that we're not using network play */ + rtp_supported = 0; + rtp_is_running = 0; + } else { + rtp_supported = 1; + rtp_is_running = rtp_running(); + } + if(rtp_supported != rtp_was_supported + || rtp_is_running != rtp_was_running) + event_raise("rtp-changed", 0); --suppress_actions; } /** @brief Called to check whether RTP play is available */ static void check_rtp_address(void) { - if(!rtp_address_in_flight) { - struct callbackdata *const cbd = xmalloc(sizeof *cbd); - cbd->onerror = no_rtp_address; - disorder_eclient_rtp_address(client, got_rtp_address, cbd); - } + if(!rtp_address_in_flight) + disorder_eclient_rtp_address(client, got_rtp_address, NULL); } /* main -------------------------------------------------------------------- */ @@ -411,27 +447,15 @@ static void help(void) { exit(0); } -/* reset state */ -void reset(void) { - struct reset_callback_node *r; - +void logged_in(void) { /* reset the clients */ disorder_eclient_close(client); disorder_eclient_close(logclient); rtp_supported = 0; - for(r = resets; r; r = r->next) - r->callback(); - /* Might be a new server so re-check */ - check_rtp_address(); -} - -/** @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; + event_raise("logged-in", 0); + /* Force the periodic checks */ + periodic_slow(0); + periodic_fast(0); } int main(int argc, char **argv) { @@ -472,7 +496,7 @@ int main(int argc, char **argv) { || !(logclient = gtkclient())) return 1; /* already reported an error */ /* periodic operations (e.g. expiring the cache, checking local volume) */ - g_timeout_add(600000/*milliseconds*/, periodic_slow, 0); + g_timeout_add(10000/*milliseconds*/, periodic_slow, 0); g_timeout_add(1000/*milliseconds*/, periodic_fast, 0); /* global tooltips */ tips = gtk_tooltips_new(); @@ -486,11 +510,11 @@ 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); - /* See if RTP play supported */ - check_rtp_address(); + /* Initiate all the checks */ + periodic_slow(0); + periodic_fast(0); suppress_actions = 0; /* If no password is set yet pop up a login box */ if(!config->password)