chiark / gitweb /
Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/disorder
[disorder] / disobedience / menu.c
index f04f7203d89ed4cbbb51d3b13d669f153991953c..50611e6bc70522081a89c558125e23fe3efc6424 100644 (file)
@@ -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
 
 #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 *)"<CTRL>A",                /* accelerator */
       menu_tab_action,                  /* callback */
       offsetof(struct tabtype, selectall_activate), /* callback_action */
-      0,                                /* item_type */
-      0                                 /* extra_data */
+      (char *)"<StockItem>",           /* 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 *)"<StockItem>",            /* item_type */
+      GTK_STOCK_PROPERTIES,             /* extra_data */
     },
     {
       (char *)"/Edit/Edit playlists",   /* path */
@@ -319,8 +345,8 @@ GtkWidget *menubar(GtkWidget *w) {
       (char *)"<CTRL>S",                /* accelerator */
       0,                                /* callback */
       0,                                /* callback_action */
-      0,                                /* item_type */
-      0                                 /* extra_data */
+      (char *)"<StockItem>",            /* item_type */
+      GTK_STOCK_STOP,                   /* extra_data */
     },
     {
       (char *)"/Control/Playing",       /* path */
@@ -346,6 +372,22 @@ GtkWidget *menubar(GtkWidget *w) {
       (char *)"<CheckItem>",            /* item_type */
       0                                 /* extra_data */
     },
+    {
+      (char *)"/Control/Compact mode",  /* path */
+      (char *)"<CTRL>M",                /* accelerator */
+      0,                                /* callback */
+      0,                                /* callback_action */
+      (char *)"<CheckItem>",            /* item_type */
+      0                                 /* extra_data */
+    },
+    {
+      (char *)"/Control/Global Preferences", /* path */
+      (char *)"<CTRL>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 *)"<Branch>",               /* item_type */
       0                                 /* extra_data */
     },
+    {
+      (char *)"/Control/Network Playback API", /* path */
+      0,                                /* accelerator */
+      0,                                /* callback */
+      0,                                /* callback_action */
+      (char *)"<Branch>",               /* 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 *)"<StockItem>",            /* 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,
                                                 "<GdisorderMain>/Edit/Select all tracks");
   selectnone_widget = gtk_item_factory_get_widget(mainmenufactory,
@@ -402,14 +452,19 @@ GtkWidget *menubar(GtkWidget *w) {
                                                "<GdisorderMain>/Control/Activate playlist");
   playlists_menu = gtk_item_factory_get_widget(mainmenufactory,
                                                "<GdisorderMain>/Control/Activate playlist");
+  apis_menu = gtk_item_factory_get_widget(mainmenufactory,
+                                               "<GdisorderMain>/Control/Network Playback API");
   menu_editplaylists_widget = gtk_item_factory_get_widget(mainmenufactory,
                                                      "<GdisorderMain>/Edit/Edit playlists");
+  menu_minimode_widget = gtk_item_factory_get_widget(mainmenufactory,
+                                                     "<GdisorderMain>/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,
                                                        "<GdisorderMain>/Edit");
@@ -420,9 +475,41 @@ GtkWidget *menubar(GtkWidget *w) {
   m = gtk_item_factory_get_widget(mainmenufactory,
                                   "<GdisorderMain>");
   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