chiark / gitweb /
Update copyright dates
[disorder] / disobedience / menu.c
index 73f09091fe4b3f1d231b24c022ae0e4f58590672..15fb4fb9a4dc5ebf61c34cd3f487f8c0134eef35 100644 (file)
@@ -2,20 +2,18 @@
  * This file is part of DisOrder.
  * Copyright (C) 2006-2008 Richard Kettlewell
  *
- * This program is free software; you can redistribute it and/or modify
+ * 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
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 /** @file disobedience/menu.c
  * @brief Main menu
@@ -31,7 +29,7 @@ static GtkWidget *properties_widget;
 GtkItemFactory *mainmenufactory;
 
 static void about_popup_got_version(void *v,
-                                    const char *error,
+                                    const char *err,
                                     const char *value);
 
 /** @brief Called when the quit option is activated
@@ -45,51 +43,24 @@ static void quit_program(gpointer attribute((unused)) callback_data,
   exit(0);
 }
 
-/* TODO can we have a single parameterized callback for all these */
-
-/** @brief Called when the select all option is activated
- *
- * Calls the per-tab select all function.
- */
-static void select_all(gpointer attribute((unused)) callback_data,
-                       guint attribute((unused)) callback_action,
-                       GtkWidget attribute((unused)) *menu_item) {
-  GtkWidget *tab = gtk_notebook_get_nth_page
-    (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs)));
-  const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type");
-
-  if(t->selectall_activate)
-    t->selectall_activate(NULL, t->extra);
-}
-
-/** @brief Called when the select none option is activated
- *
- * Calls the per-tab select none function.
- */
-static void select_none(gpointer attribute((unused)) callback_data,
-                        guint attribute((unused)) callback_action,
-                        GtkWidget attribute((unused)) *menu_item) {
-  GtkWidget *tab = gtk_notebook_get_nth_page
-    (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs)));
-  const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type");
-
-  if(t->selectnone_activate)
-    t->selectnone_activate(NULL, t->extra);
-}
-
-/** @brief Called when the track properties option is activated
+/** @brief Called when an edit menu item is selected
  *
- * Calls the per-tab properties function.
+ * Shared by several menu items; callback_action is expected to be the offset
+ * of the activate member of struct tabtype.
  */
-static void properties_item(gpointer attribute((unused)) callback_data,
-                            guint attribute((unused)) callback_action,
+static void menu_tab_action(gpointer attribute((unused)) callback_data,
+                            guint callback_action,
                             GtkWidget attribute((unused)) *menu_item) {
   GtkWidget *tab = gtk_notebook_get_nth_page
     (GTK_NOTEBOOK(tabs), gtk_notebook_current_page(GTK_NOTEBOOK(tabs)));
   const struct tabtype *t = g_object_get_data(G_OBJECT(tab), "type");
 
-  if(t->properties_activate)
-    t->properties_activate(NULL, t->extra);
+  void (**activatep)(GtkMenuItem *, gpointer)
+    = (void *)((const char *)t + callback_action);
+  void (*activate)(GtkMenuItem *, gpointer) = *activatep;
+  
+  if(activate)
+    activate(NULL, t->extra);
 }
 
 /** @brief Called when the login option is activated */
@@ -165,7 +136,7 @@ static void manual_popup(gpointer attribute((unused)) callback_data,
 
 /** @brief Called when version arrives, displays about... popup */
 static void about_popup_got_version(void attribute((unused)) *v,
-                                    const char attribute((unused)) *error,
+                                    const char attribute((unused)) *err,
                                     const char *value) {
   GtkWidget *w;
   char *server_version_string;
@@ -202,7 +173,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-2008 Richard Kettlewell"),
+                     gtk_label_new("\xC2\xA9 2004-2009 Richard Kettlewell"),
                      FALSE/*expand*/,
                      FALSE/*fill*/,
                      1/*padding*/);
@@ -300,25 +271,25 @@ GtkWidget *menubar(GtkWidget *w) {
     },
     {
       (char *)"/Edit/Select all tracks", /* path */
-      (char *)"<CTRL>A",                /* accelerator */
-      select_all,                       /* callback */
-      0,                                /* callback_action */
+      0,                                /* accelerator */
+      menu_tab_action,                  /* callback */
+      offsetof(struct tabtype, selectall_activate), /* callback_action */
       0,                                /* item_type */
       0                                 /* extra_data */
     },
     {
       (char *)"/Edit/Deselect all tracks", /* path */
-      (char *)"<CTRL><SHIFT>A",         /* accelerator */
-      select_none,                      /* callback */
-      0,                                /* callback_action */
+      0,                                /* accelerator */
+      menu_tab_action,                  /* callback */
+      offsetof(struct tabtype, selectnone_activate), /* callback_action */
       0,                                /* item_type */
       0                                 /* extra_data */
     },
     {
       (char *)"/Edit/Track properties", /* path */
       0,                                /* accelerator */
-      properties_item,                  /* callback */
-      0,                                /* callback_action */
+      menu_tab_action,                  /* callback */
+      offsetof(struct tabtype, properties_activate), /* callback_action */
       0,                                /* item_type */
       0                                 /* extra_data */
     },