X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/36f5776f6c810fab4175ffdbba9d5d6791616f47..HEAD:/disobedience/menu.c diff --git a/disobedience/menu.c b/disobedience/menu.c index f04f720..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 @@ -21,16 +21,23 @@ #include "disobedience.h" +static void toggled_minimode(GtkCheckMenuItem *item, gpointer userdata); + static GtkWidget *selectall_widget; static GtkWidget *selectnone_widget; static GtkWidget *properties_widget; 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; +/** @brief Set for full mode, clear for mini mode */ +int full_mode = 1; + static void about_popup_got_version(void *v, const char *err, const char *value); @@ -134,7 +141,7 @@ static void manual_popup(gpointer attribute((unused)) callback_data, GtkWidget attribute((unused)) *menu_item) { D(("manual_popup")); - popup_help(); + popup_help(NULL); } /** @brief Called when version arrives, displays about... popup */ @@ -148,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", @@ -176,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*/); @@ -209,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[] = { @@ -277,8 +303,8 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"A", /* accelerator */ menu_tab_action, /* callback */ offsetof(struct tabtype, selectall_activate), /* callback_action */ - 0, /* item_type */ - 0 /* extra_data */ + (char *)"", /* item_type */ + GTK_STOCK_SELECT_ALL, /* extra_data */ }, { (char *)"/Edit/Deselect all tracks", /* path */ @@ -293,8 +319,8 @@ GtkWidget *menubar(GtkWidget *w) { 0, /* accelerator */ menu_tab_action, /* callback */ offsetof(struct tabtype, properties_activate), /* callback_action */ - 0, /* item_type */ - 0 /* extra_data */ + (char *)"", /* item_type */ + GTK_STOCK_PROPERTIES, /* extra_data */ }, { (char *)"/Edit/Edit playlists", /* path */ @@ -319,8 +345,8 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"S", /* accelerator */ 0, /* callback */ 0, /* callback_action */ - 0, /* item_type */ - 0 /* extra_data */ + (char *)"", /* item_type */ + GTK_STOCK_STOP, /* extra_data */ }, { (char *)"/Control/Playing", /* path */ @@ -346,6 +372,22 @@ GtkWidget *menubar(GtkWidget *w) { (char *)"", /* item_type */ 0 /* extra_data */ }, + { + (char *)"/Control/Compact mode", /* path */ + (char *)"M", /* accelerator */ + 0, /* callback */ + 0, /* callback_action */ + (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 */ @@ -354,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 */ @@ -368,11 +418,11 @@ GtkWidget *menubar(GtkWidget *w) { 0, /* accelerator */ manual_popup, /* callback */ 0, /* callback_action */ - 0, /* item_type */ - 0 /* extra_data */ + (char *)"", /* item_type */ + GTK_STOCK_HELP, /* extra_data */ }, { - (char *)"/Help/About DisOrder", /* path */ + (char *)"/Help/About Disobedience", /* path */ 0, /* accelerator */ about_popup, /* callback */ 0, /* callback_action */ @@ -391,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, @@ -402,14 +452,19 @@ 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, + "/Control/Compact mode"); assert(selectall_widget != 0); assert(selectnone_widget != 0); assert(properties_widget != 0); 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"); @@ -420,9 +475,41 @@ GtkWidget *menubar(GtkWidget *w) { m = gtk_item_factory_get_widget(mainmenufactory, ""); set_tool_colors(m); + 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; } +static void toggled_minimode(GtkCheckMenuItem *item, + gpointer attribute((unused)) userdata) { + int new_full_mode = !gtk_check_menu_item_get_active(item); + if(full_mode != new_full_mode) { + full_mode = new_full_mode; + event_raise("mini-mode-changed", NULL); + } +} + /* Local Variables: c-basic-offset:2