X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/cdabf44d4bf72678b402c0fd7dac394eb36513da..HEAD:/disobedience/menu.c diff --git a/disobedience/menu.c b/disobedience/menu.c index bae0f00..50611e6 100644 --- a/disobedience/menu.c +++ b/disobedience/menu.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2006-2009 Richard Kettlewell + * Copyright (C) 2006-2009, 2011, 2013 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ GtkWidget *menu_playlists_widget; GtkWidget *playlists_menu; GtkWidget *menu_editplaylists_widget; static GtkWidget *menu_minimode_widget; +static GtkWidget *apis_menu; /** @brief Main menu widgets */ GtkItemFactory *mainmenufactory; @@ -154,7 +155,7 @@ static void about_popup_got_version(void attribute((unused)) *v, if(!value) value = "[error]"; - byte_xasprintf(&server_version_string, "Server version %s", value); + byte_xasprintf(&server_version_string, "DisOrder server version %s", value); byte_xasprintf(&short_version_string, "Disobedience %s", disorder_short_version_string); w = gtk_dialog_new_with_buttons("About Disobedience", @@ -182,7 +183,7 @@ static void about_popup_got_version(void attribute((unused)) *v, FALSE/*fill*/, 1/*padding*/); gtk_box_pack_start(GTK_BOX(vbox), - gtk_label_new("\xC2\xA9 2004-2009 Richard Kettlewell"), + gtk_label_new("\xC2\xA9 2003-2013 Richard Kettlewell et al"), FALSE/*expand*/, FALSE/*fill*/, 1/*padding*/); @@ -215,15 +216,34 @@ void users_set_sensitive(int sensitive) { gtk_widget_set_sensitive(w, sensitive); } +static void menu_check_userman(void attribute((unused)) *v, + const char *err, + const char attribute((unused)) *value) { + if(err && !strncmp(err, "510", 3)) + users_set_sensitive(FALSE); + else + users_set_sensitive(TRUE); +} + /** @brief Called when our rights change */ static void menu_rights_changed(const char attribute((unused)) *event, void attribute((unused)) *eventdata, void attribute((unused)) *callbackdata) { - users_set_sensitive(!!(last_rights & RIGHT_ADMIN)); + if(last_rights & RIGHT_ADMIN) + disorder_eclient_userinfo(client, menu_check_userman, "", "email", 0); + else + users_set_sensitive(FALSE); +} + +/** @brief Called to select the network playback API */ +static void rtp_menu_activate(GtkMenuItem *menuitem, + gpointer user_data) { + if(GTK_CHECK_MENU_ITEM(menuitem)->active) + change_rtp_api(user_data); } /** @brief Create the menu bar widget */ -GtkWidget *menubar(GtkWidget *w) { +GtkWidget *menubar(GtkWidget *window) { GtkWidget *m; static const GtkItemFactoryEntry entries[] = { @@ -360,6 +380,14 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"", /* item_type */ 0 /* extra_data */ }, + { + (char *)"/Control/Global Preferences", /* path */ + (char *)"G", /* accelerator */ + popup_globals, /* callback */ + 0, /* callback_action */ + 0, /* item_type */ + 0 /* extra_data */ + }, { (char *)"/Control/Activate playlist", /* path */ 0, /* accelerator */ @@ -368,6 +396,14 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"", /* item_type */ 0 /* extra_data */ }, + { + (char *)"/Control/Network Playback API", /* path */ + 0, /* accelerator */ + 0, /* callback */ + 0, /* callback_action */ + (char *)"", /* item_type */ + 0 /* extra_data */ + }, { (char *)"/Help", /* path */ @@ -386,7 +422,7 @@ GtkWidget *menubar(GtkWidget *w) { GTK_STOCK_HELP, /* extra_data */ }, { - (char *)"/Help/About DisOrder", /* path */ + (char *)"/Help/About Disobedience", /* path */ 0, /* accelerator */ about_popup, /* callback */ 0, /* callback_action */ @@ -405,7 +441,7 @@ GtkWidget *menubar(GtkWidget *w) { sizeof entries / sizeof *entries, (GtkItemFactoryEntry *)entries, 0); - gtk_window_add_accel_group(GTK_WINDOW(w), accel); + gtk_window_add_accel_group(GTK_WINDOW(window), accel); selectall_widget = gtk_item_factory_get_widget(mainmenufactory, "/Edit/Select all tracks"); selectnone_widget = gtk_item_factory_get_widget(mainmenufactory, @@ -416,6 +452,8 @@ GtkWidget *menubar(GtkWidget *w) { "/Control/Activate playlist"); playlists_menu = gtk_item_factory_get_widget(mainmenufactory, "/Control/Activate playlist"); + apis_menu = gtk_item_factory_get_widget(mainmenufactory, + "/Control/Network Playback API"); menu_editplaylists_widget = gtk_item_factory_get_widget(mainmenufactory, "/Edit/Edit playlists"); menu_minimode_widget = gtk_item_factory_get_widget(mainmenufactory, @@ -426,6 +464,7 @@ GtkWidget *menubar(GtkWidget *w) { assert(menu_playlists_widget != 0); assert(playlists_menu != 0); assert(menu_editplaylists_widget != 0); + assert(apis_menu != 0); GtkWidget *edit_widget = gtk_item_factory_get_widget(mainmenufactory, "/Edit"); @@ -439,6 +478,26 @@ GtkWidget *menubar(GtkWidget *w) { if(menu_minimode_widget) g_signal_connect(G_OBJECT(menu_minimode_widget), "toggled", G_CALLBACK(toggled_minimode), NULL); + + /* Populate the APIs menu */ + GSList *playback_menu_group = NULL; + load_rtp_config(); + assert(rtp_api != NULL); + for(int n = 0; uaudio_apis[n]; ++n) { + if(uaudio_apis[n]->flags & UAUDIO_API_CLIENT) { + GtkWidget *mw = gtk_radio_menu_item_new_with_label(playback_menu_group, + uaudio_apis[n]->name); + playback_menu_group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(mw)); + gtk_menu_shell_append(GTK_MENU_SHELL(apis_menu), mw); + /* Tick the currently selected API... */ + if(!strcmp(uaudio_apis[n]->name, rtp_api)) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mw), TRUE); + /* ...and only then connect the signal */ + g_signal_connect(mw, "toggled", G_CALLBACK(rtp_menu_activate), + (char *)uaudio_apis[n]->name); + } + } + return m; }