]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
Changes to actions selection for switches and encoders
authorJohn Melton - G0ORX <john.d.melton@googlemail.com>
Tue, 13 Jul 2021 11:31:36 +0000 (12:31 +0100)
committerJohn Melton - G0ORX <john.d.melton@googlemail.com>
Tue, 13 Jul 2021 11:31:36 +0000 (12:31 +0100)
20 files changed:
Makefile
action_dialog.c [new file with mode: 0644]
action_dialog.h [new file with mode: 0644]
actions.c
css.c
css.h [new file with mode: 0644]
discovery.c
encoder_menu.c
gpio.c
main.c
midi2.c
midi3.c
midi_menu.c
new_menu.c
radio.c
switch_menu.c
toolbar_menu.c [new file with mode: 0644]
toolbar_menu.h [new file with mode: 0644]
vfo.c
vfo_menu.c

index 72661a7009cb926a2f6c3e42fadfa1fbb4f727bd..177adafda514d3627661677bb9f094529ee02e80 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ GPIO_INCLUDE=GPIO
 PURESIGNAL_INCLUDE=PURESIGNAL
 
 # uncomment the line below to include MIDI support
-MIDI_INCLUDE=MIDI
+#MIDI_INCLUDE=MIDI
 
 # uncomment the line below to include USB Ozy support
 # USBOZY_INCLUDE=USBOZY
@@ -29,7 +29,7 @@ MIDI_INCLUDE=MIDI
 #LOCALCW_INCLUDE=LOCALCW
 
 # uncomment the line below for SoapySDR
-SOAPYSDR_INCLUDE=SOAPYSDR
+#SOAPYSDR_INCLUDE=SOAPYSDR
 
 # uncomment the line to below include support for sx1509 i2c expander
 #SX1509_INCLUDE=sx1509
@@ -296,11 +296,13 @@ cwramp.c \
 protocols.c \
 css.c \
 actions.c \
+action_dialog.c \
 configure.c \
 i2c.c \
 gpio.c \
 encoder_menu.c \
-switch_menu.c
+switch_menu.c \
+toolbar_menu.c
 
 
 
@@ -372,11 +374,13 @@ error_handler.h \
 protocols.h \
 css.h \
 actions.h \
+action_dialog.h \
 configure.h \
 i2c.h \
 gpio.h \
 encoder_menu.h \
-switch_menu.h
+switch_menu.h \
+toolbar_menu.h
 
 
 
@@ -447,11 +451,13 @@ cwramp.o \
 protocols.o \
 css.o \
 actions.o \
+action_dialog.o \
 configure.o \
 i2c.o \
 gpio.o \
 encoder_menu.o \
-switch_menu.o
+switch_menu.o \
+toolbar_menu.o
 
 $(PROGRAM):  $(OBJS) $(AUDIO_OBJS) $(REMOTE_OBJS) $(USBOZY_OBJS) $(SOAPYSDR_OBJS) \
                $(LOCALCW_OBJS) $(PURESIGNAL_OBJS) \
diff --git a/action_dialog.c b/action_dialog.c
new file mode 100644 (file)
index 0000000..a60fd71
--- /dev/null
@@ -0,0 +1,73 @@
+#include <gtk/gtk.h>
+#include "actions.h"
+
+#define GRID_WIDTH 6
+
+typedef struct _choice {
+  int action;
+  GtkWidget *button;
+  gulong signal_id;
+} CHOICE;
+
+static GtkWidget *dialog;
+static GtkWidget *previous_button;
+static gulong previous_signal_id;
+static int action;
+
+static void action_select_cb(GtkWidget *widget,gpointer data) {
+  CHOICE *choice=(CHOICE *)data;
+  g_signal_handler_block(G_OBJECT(previous_button),previous_signal_id);
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(previous_button),FALSE);
+  g_signal_handler_unblock(G_OBJECT(previous_button),previous_signal_id);
+  previous_button=widget;
+  previous_signal_id=choice->signal_id;
+  action=choice->action;
+}
+
+int action_dialog(GtkWidget *parent,int filter,int currentAction) {
+  int i,j;
+
+  action=currentAction;
+  previous_button=NULL;
+  dialog=gtk_dialog_new_with_buttons("Action",GTK_WINDOW(parent),GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,("_OK"),GTK_RESPONSE_ACCEPT,("_Cancel"),GTK_RESPONSE_REJECT,NULL);
+  GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+  GtkWidget *scrolled_window=gtk_scrolled_window_new(NULL,NULL);
+  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);
+  gtk_widget_set_size_request(scrolled_window,790,380);
+
+  GtkWidget *grid=gtk_grid_new();
+  gtk_grid_set_column_spacing(GTK_GRID(grid),2);
+  gtk_grid_set_row_spacing(GTK_GRID(grid),2);
+  gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE);
+  gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE);
+  j=0;
+  for(i=0;i<ACTIONS;i++) {
+    if((ActionTable[i].type&filter) || (ActionTable[i].type==TYPE_NONE)) {
+      GtkWidget *button=gtk_toggle_button_new_with_label(ActionTable[i].str);
+      gtk_widget_set_name(button,"small_button");
+      gtk_grid_attach(GTK_GRID(grid),button,j%GRID_WIDTH,j/GRID_WIDTH,1,1);
+      if(ActionTable[i].action==currentAction) {
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),TRUE);
+      }
+      CHOICE *choice=g_new0(CHOICE,1);
+      choice->action=i;
+      choice->button=button;
+      choice->signal_id=g_signal_connect(button,"toggled",G_CALLBACK(action_select_cb),choice);
+      if(ActionTable[i].action==currentAction) {
+        previous_button=button;
+        previous_signal_id=choice->signal_id;
+      }
+      j++;
+    }
+  }
+  gtk_container_add(GTK_CONTAINER(scrolled_window),grid);
+  gtk_container_add(GTK_CONTAINER(content),scrolled_window);
+  gtk_widget_show_all(content);
+  int result = gtk_dialog_run (GTK_DIALOG (dialog));
+  gtk_widget_destroy(dialog);
+  if(result!=GTK_RESPONSE_ACCEPT) {
+    action=currentAction;
+  }
+  return action;
+}
+
diff --git a/action_dialog.h b/action_dialog.h
new file mode 100644 (file)
index 0000000..c134e2e
--- /dev/null
@@ -0,0 +1 @@
+int action_dialog(GtkWidget *parent,int filter,int current);
index 9d173989834485510e5ca055085615de69b93c38..b2a2e7e70cbf842c0ca1c8284badd76872dc71f6 100644 (file)
--- a/actions.c
+++ b/actions.c
@@ -42,35 +42,35 @@ ACTION_TABLE ActionTable[] = {
   {AF_GAIN_RX2,                "AF GAIN\nRX2",         NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {AGC,                        "AGC",                  "AGC",          MIDI_KEY | CONTROLLER_SWITCH},
   {AGC_GAIN,           "AGC GAIN",             NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {AGC_GAIN_RX1,       "AGC GAIN\nRX1",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {AGC_GAIN_RX2,       "AGC GAIN\nRX2",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {AGC_GAIN_RX1,       "AGC GAIN\nRX1",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {AGC_GAIN_RX2,       "AGC GAIN\nRX2",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {ANF,                        "ANF",                  "ANF",          MIDI_KEY | CONTROLLER_SWITCH},
   {ATTENUATION,                "ATTEN",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {B_TO_A,             "A<B",                  "A<B",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_10,            "BAND 10",              "10",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_12,            "BAND 12",              "12",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_1240,          "BAND 1240",            "1240",         MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_144,           "BAND 144",             "144",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_15,            "BAND 15",              "15",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_160,           "BAND 160",             "160",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_17,            "BAND 17",              "17",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_20,            "BAND 20",              "20",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_220,           "BAND 220",             "220",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_2300,          "BAND 2300",            "2300",         MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_30,            "BAND 30",              "30",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_3400,          "BAND 3400",            "3400",         MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_40,            "BAND 40",              "40",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_430,           "BAND 430",             "430",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_6,             "BAND 6",               "6",            MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_60,            "BAND 60",              "60",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_70,            "BAND 70",              "70",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_80,            "BAND 80",              "80",           MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_902,           "BAND 902",             "902",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_AIR,           "BAND AIR",             "AIR",          MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_GEN,           "BAND GEN",             "GEN",          MIDI_KEY | CONTROLLER_SWITCH},
+  {BAND_10,            "BAND 10",              "10",           MIDI_KEY},
+  {BAND_12,            "BAND 12",              "12",           MIDI_KEY},
+  {BAND_1240,          "BAND 1240",            "1240",         MIDI_KEY},
+  {BAND_144,           "BAND 144",             "144",          MIDI_KEY},
+  {BAND_15,            "BAND 15",              "15",           MIDI_KEY},
+  {BAND_160,           "BAND 160",             "160",          MIDI_KEY},
+  {BAND_17,            "BAND 17",              "17",           MIDI_KEY},
+  {BAND_20,            "BAND 20",              "20",           MIDI_KEY},
+  {BAND_220,           "BAND 220",             "220",          MIDI_KEY},
+  {BAND_2300,          "BAND 2300",            "2300",         MIDI_KEY},
+  {BAND_30,            "BAND 30",              "30",           MIDI_KEY},
+  {BAND_3400,          "BAND 3400",            "3400",         MIDI_KEY},
+  {BAND_40,            "BAND 40",              "40",           MIDI_KEY},
+  {BAND_430,           "BAND 430",             "430",          MIDI_KEY},
+  {BAND_6,             "BAND 6",               "6",            MIDI_KEY},
+  {BAND_60,            "BAND 60",              "60",           MIDI_KEY},
+  {BAND_70,            "BAND 70",              "70",           MIDI_KEY},
+  {BAND_80,            "BAND 80",              "80",           MIDI_KEY},
+  {BAND_902,           "BAND 902",             "902",          MIDI_KEY},
+  {BAND_AIR,           "BAND AIR",             "AIR",          MIDI_KEY},
+  {BAND_GEN,           "BAND GEN",             "GEN",          MIDI_KEY},
   {BAND_MINUS,         "BAND -",               "BND+",         MIDI_KEY | CONTROLLER_SWITCH},
   {BAND_PLUS,          "BAND +",               "BND-",         MIDI_KEY | CONTROLLER_SWITCH},
-  {BAND_WWV,           "BAND WWV",             "WWV",          MIDI_KEY | CONTROLLER_SWITCH},
+  {BAND_WWV,           "BAND WWV",             "WWV",          MIDI_KEY},
   {BANDSTACK_MINUS,    "BANDSTACK -",          "BSTK-",        MIDI_KEY | CONTROLLER_SWITCH},
   {BANDSTACK_PLUS,     "BANDSTACK +",          "BSTK+",        MIDI_KEY | CONTROLLER_SWITCH},
   {COMP_ENABLE,                "COMP ON/OFF",          "COMP",         MIDI_KEY | CONTROLLER_SWITCH},
@@ -91,44 +91,44 @@ ACTION_TABLE ActionTable[] = {
   {DUPLEX,             "DUPLEX",               "DUP",          MIDI_KEY | CONTROLLER_SWITCH},
   {FILTER_MINUS,       "FILTER +",             "FL+",          MIDI_KEY | CONTROLLER_SWITCH},
   {FILTER_PLUS,                "FILTER -",             "FL-",          MIDI_KEY | CONTROLLER_SWITCH},
-  {FUNCTION,           "FUNC",         "FUNC",         CONTROLLER_SWITCH},
+  {FUNCTION,           "FUNC",                 "FUNC",         CONTROLLER_SWITCH},
   {IF_SHIFT,           "IF SHIFT",             NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {IF_SHIFT_RX1,       "IF SHIFT\nRX1",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {IF_SHIFT_RX2,       "IF SHIFT\nRX2",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {IF_SHIFT_RX1,       "IF SHIFT\nRX1",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {IF_SHIFT_RX2,       "IF SHIFT\nRX2",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {IF_WIDTH,           "IF WIDTH",             NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {IF_WIDTH_RX1,       "IF WIDTH\nRX1",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {IF_WIDTH_RX2,       "IF WIDTH\nRX2",                NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {IF_WIDTH_RX1,       "IF WIDTH\nRX1",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {IF_WIDTH_RX2,       "IF WIDTH\nRX2",        NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {LINEIN_GAIN,                "LINEIN\nGAIN",         NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {LOCK,               "LOCK",                 "LOCK",         MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_AGC,           "AGC\nMENU",            "AGC",          MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_BAND,          "BAND\nMENU",           "BAND",         MIDI_KEY | CONTROLLER_SWITCH},
-  {MENU_BANDSTACK,     "BSTCK\nMENU",  "BSTK",         MIDI_KEY | CONTROLLER_SWITCH},
-  {MENU_DIVERSITY,     "DIV\nMENU",    "DIV",          MIDI_KEY | CONTROLLER_SWITCH},
+  {MENU_BANDSTACK,     "BSTK\nMENU",           "BSTK",         MIDI_KEY | CONTROLLER_SWITCH},
+  {MENU_DIVERSITY,     "DIV\nMENU",            "DIV",          MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_FILTER,                "FILT\nMENU",           "FILT",         MIDI_KEY | CONTROLLER_SWITCH},
-  {MENU_FREQUENCY,     "FREQ\nMENU",   "FREQ",         MIDI_KEY | CONTROLLER_SWITCH},
-  {MENU_MEMORY,                "MEMORY\nMENU",         "MEM",          MIDI_KEY | CONTROLLER_SWITCH},
+  {MENU_FREQUENCY,     "FREQ\nMENU",           "FREQ",         MIDI_KEY | CONTROLLER_SWITCH},
+  {MENU_MEMORY,                "MEM\nMENU",            "MEM",          MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_MODE,          "MODE\nMENU",           "MODE",         MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_NOISE,         "NOISE\nMENU",          "NOISE",        MIDI_KEY | CONTROLLER_SWITCH},
   {MENU_PS,            "PS MENU",              "PS",           MIDI_KEY | CONTROLLER_SWITCH},
   {MIC_GAIN,           "MIC GAIN",             NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {MODE_MINUS,         "MODE +",               "MOD+",         MIDI_KEY | CONTROLLER_SWITCH},
-  {MODE_PLUS,          "MODE -",               "MOD-",         MIDI_KEY | CONTROLLER_SWITCH},
+  {MODE_MINUS,         "MODE -",               "MD-",          MIDI_KEY | CONTROLLER_SWITCH},
+  {MODE_PLUS,          "MODE +",               "MD+",          MIDI_KEY | CONTROLLER_SWITCH},
   {MOX,                        "MOX",                  "MOX",          MIDI_KEY | CONTROLLER_SWITCH},
   {MUTE,               "MUTE",                 "MUTE",         MIDI_KEY | CONTROLLER_SWITCH},
   {NB,                 "NB",                   "NB",           MIDI_KEY | CONTROLLER_SWITCH},
   {NR,                 "NR",                   "NR",           MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_0,           "NUMPAD\n0",            "0",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_1,           "NUMPAD\n1",            "1",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_2,           "NUMPAD\n2",            "2",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_3,           "NUMPAD\n3",            "3",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_4,           "NUMPAD\n4",            "4",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_5,           "NUMPAD\n5",            "5",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_6,           "NUMPAD\n6",            "6",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_7,           "NUMPAD\n7",            "7",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_8,           "NUMPAD\n8",            "8",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_9,           "NUMPAD\n9",            "9",            MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_CL,          "NUMPAD\nCL",           "CL",           MIDI_KEY | CONTROLLER_SWITCH},
-  {NUMPAD_ENTER,       "NUMPAD\nENTER",                "EN",           MIDI_KEY | CONTROLLER_SWITCH},
+  {NUMPAD_0,           "NUMPAD 0",             "0",            MIDI_KEY},
+  {NUMPAD_1,           "NUMPAD 1",             "1",            MIDI_KEY},
+  {NUMPAD_2,           "NUMPAD 2",             "2",            MIDI_KEY},
+  {NUMPAD_3,           "NUMPAD 3",             "3",            MIDI_KEY},
+  {NUMPAD_4,           "NUMPAD 4",             "4",            MIDI_KEY},
+  {NUMPAD_5,           "NUMPAD 5",             "5",            MIDI_KEY},
+  {NUMPAD_6,           "NUMPAD 6",             "6",            MIDI_KEY},
+  {NUMPAD_7,           "NUMPAD 7",             "7",            MIDI_KEY},
+  {NUMPAD_8,           "NUMPAD 8",             "8",            MIDI_KEY},
+  {NUMPAD_9,           "NUMPAD 9",             "9",            MIDI_KEY},
+  {NUMPAD_CL,          "NUMPAD\nCL",           "CL",           MIDI_KEY},
+  {NUMPAD_ENTER,       "NUMPAD\nENTER",        "EN",           MIDI_KEY},
   {PAN,                        "PAN",                  NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {PAN_MINUS,          "PAN -",                "PAN-",         MIDI_KEY | CONTROLLER_SWITCH},
   {PAN_PLUS,           "PAN +",                "PAN+",         MIDI_KEY | CONTROLLER_SWITCH},
@@ -158,9 +158,9 @@ ACTION_TABLE ActionTable[] = {
   {SQUELCH_RX2,                "SQUELCH\nRX1",         NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
   {SWAP_RX,            "SWAP RX",              "SWAPRX",       MIDI_KEY | CONTROLLER_SWITCH},
   {TUNE,               "TUNE",                 "TUNE",         MIDI_KEY | CONTROLLER_SWITCH},
-  {TUNE_DRIVE,         "TUNE\nDRIVE",          NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
-  {TUNE_FULL,          "TUNE\nFULL",           "TUNF",         MIDI_KEY | CONTROLLER_SWITCH},
-  {TUNE_MEMORY,                "TUNE\nMEMORY",         "TUNM",         MIDI_KEY | CONTROLLER_SWITCH},
+  {TUNE_DRIVE,         "TUNE\nDRV",            NULL,           MIDI_KNOB | MIDI_WHEEL | CONTROLLER_ENCODER},
+  {TUNE_FULL,          "TUNE\nFUL",            "TUNF",         MIDI_KEY | CONTROLLER_SWITCH},
+  {TUNE_MEMORY,                "TUNE\nMEM",            "TUNM",         MIDI_KEY | CONTROLLER_SWITCH},
   {TWO_TONE,           "TWO TONE",             "2TONE",        MIDI_KEY | CONTROLLER_SWITCH},
   {VFO,                        "VFO",                  NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
   {VFO_STEP_MINUS,     "VFO STEP -",           "STEP-",        MIDI_KEY | CONTROLLER_SWITCH},
@@ -169,8 +169,8 @@ ACTION_TABLE ActionTable[] = {
   {VFOB,               "VFO B",                NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
   {VOX,                        "VOX\nON/OFF",          "VOX",          MIDI_KEY | CONTROLLER_SWITCH},
   {VOXLEVEL,           "VOX\nLEVEL",           NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
-  {WATERFALL_HIGH,     "WATERFALL\nHIGH",      NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
-  {WATERFALL_LOW,      "WATERFALL\nLOW",       NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
+  {WATERFALL_HIGH,     "WFALL\nHIGH",          NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
+  {WATERFALL_LOW,      "WFALL\nLOW",           NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
   {XIT ,               "XIT",                  NULL,           MIDI_WHEEL | CONTROLLER_ENCODER},
   {XIT_CLEAR,          "XIT\nCLEAR",           "XITCL",        MIDI_KEY | CONTROLLER_SWITCH},
   {XIT_ENABLE,         "XIT\nON/OFF",          "XIT",          MIDI_KEY | CONTROLLER_SWITCH},
@@ -194,7 +194,7 @@ int process_action(void *data) {
   int new_val;
   int i;
 
-  //g_print("%s: action=%d mode=%d value=%d\n",__FUNCTION__,a->action,a->mode,a->val);
+  g_print("%s: action=%d mode=%d value=%d\n",__FUNCTION__,a->action,a->mode,a->val);
   switch(a->action) {
 
     case A_SWAP_B:
diff --git a/css.c b/css.c
index c8b9ae3060d0bfcedf8113b6f274c290ce3fcf47..810492ca70e5d6ef9254584e0ed4093b627b60f5 100644 (file)
--- a/css.c
+++ b/css.c
@@ -1,10 +1,11 @@
 #include <gtk/gtk.h>
+#include "css.h"
 
 char *css=
-"  #small {\n"
+"  #small_button {\n"
 "    padding: 0;\n"
 "    font-family: Sans;\n"
-"    font-size: 12px;\n"
+"    font-size: 15px;\n"
 "    }\n"
 ;
 
diff --git a/css.h b/css.h
new file mode 100644 (file)
index 0000000..148a8aa
--- /dev/null
+++ b/css.h
@@ -0,0 +1,3 @@
+extern char *css;
+extern void load_css();
+
index c3a69bd43a2906a04f797674f89d7707de5b198e..7fdfaa1e9a867cbb99de2094be6bf4cffceb57a2 100644 (file)
@@ -465,7 +465,7 @@ fprintf(stderr,"%p Protocol=%d name=%s\n",d,d->protocol,d->name);
         gtk_widget_override_font(start_button, pango_font_description_from_string("Sans 16"));
         gtk_widget_show(start_button);
         gtk_grid_attach(GTK_GRID(grid),start_button,3,row,1,1);
-        g_signal_connect(start_button,"button_press_event",G_CALLBACK(start_cb),(gpointer)d);
+        g_signal_connect(start_button,"button-press-event",G_CALLBACK(start_cb),(gpointer)d);
 
         // if not available then cannot start it
         if(d->status!=STATE_AVAILABLE) {
index aa8aa599cd34f19f7bc1c59ef3b97aa23b2d8fa0..933be4b6bfb5a1271d914ab1ca4cd4aba20c9024 100644 (file)
 #include "vfo.h"
 #include "button_text.h"
 #include "actions.h"
+#include "action_dialog.h"
 #include "gpio.h"
 #include "i2c.h"
 
 typedef struct _choice {
   int id;
   int action;
+  GtkWidget *initial_button;
   GtkWidget *button;
+  gulong signal_id;
 } CHOICE;
 
 static GtkWidget *parent_window=NULL;
@@ -65,116 +68,54 @@ static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_d
   return FALSE;
 }
 
-static void encoder_bottom_select_cb(GtkWidget *widget,gpointer data) {
-  CHOICE *choice=(CHOICE *)data;
-  encoders[choice->id].bottom_encoder_function=choice->action;
-  gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str);
-}
-
-static void encoder_top_select_cb(GtkWidget *widget,gpointer data) {
-  CHOICE *choice=(CHOICE *)data;
-  encoders[choice->id].top_encoder_function=choice->action;
-  gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str);
-}
-
-static void encoder_switch_select_cb(GtkWidget *widget,gpointer data) {
-  CHOICE *choice=(CHOICE *)data;
-  encoders[choice->id].switch_function=choice->action;
-  gtk_button_set_label(GTK_BUTTON(choice->button),ActionTable[choice->action].button_str);
-}
-
 static gboolean encoder_bottom_cb(GtkWidget *widget, GdkEvent *event, gpointer data) {
-  int encoder=GPOINTER_TO_INT(data);
-  int i;
-
-  GtkWidget *menu=gtk_menu_new();
-  for(i=0;i<ACTIONS;i++) {
-    if(ActionTable[i].type|CONTROLLER_ENCODER) {
-      GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str);
-      CHOICE *choice=g_new0(CHOICE,1);
-      choice->id=encoder;
-      choice->action=i;
-      choice->button=widget;
-      g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_bottom_select_cb),choice);
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
-    }
-  }
-  gtk_widget_show_all(menu);
-#if GTK_CHECK_VERSION(3,22,0)
-  gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event);
-// the following line of code is to work around the problem of the popup menu not having scroll bars.
-  gtk_menu_reposition(GTK_MENU(menu));
-#else
-  gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
-#endif
+  int en=GPOINTER_TO_INT(data);
+  int action=action_dialog(top_window,CONTROLLER_ENCODER,encoders[en].bottom_encoder_function);
+  gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str);
+  encoders[en].bottom_encoder_function=action;
   return TRUE;
 }
 
 static gboolean encoder_top_cb(GtkWidget *widget, GdkEvent *event, gpointer data) {
-  int encoder=GPOINTER_TO_INT(data);
-  int i;
-
-  GtkWidget *menu=gtk_menu_new();
-  for(i=0;i<ACTIONS;i++) {
-    if(ActionTable[i].type|CONTROLLER_ENCODER) {
-      GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str);
-      CHOICE *choice=g_new0(CHOICE,1);
-      choice->id=encoder;
-      choice->action=i;
-      choice->button=widget;
-      g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_top_select_cb),choice);
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
-    }
-  }
-  gtk_widget_show_all(menu);
-#if GTK_CHECK_VERSION(3,22,0)
-  gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event);
-// the following line of code is to work around the problem of the popup menu not having scroll bars.
-  gtk_menu_reposition(GTK_MENU(menu));
-#else
-  gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
-#endif
+  int en=GPOINTER_TO_INT(data);
+  int action=action_dialog(dialog,CONTROLLER_ENCODER,encoders[en].top_encoder_function);
+  gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str);
+  encoders[en].top_encoder_function=action;
   return TRUE;
 }
 
 static gboolean encoder_switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) {
-  int encoder=GPOINTER_TO_INT(data);
-  int i;
-
-  GtkWidget *menu=gtk_menu_new();
-  for(i=0;i<ACTIONS;i++) {
-    if(ActionTable[i].type|CONTROLLER_SWITCH) {
-      GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str);
-      CHOICE *choice=g_new0(CHOICE,1);
-      choice->id=encoder;
-      choice->action=i;
-      choice->button=widget;
-      g_signal_connect(menu_item,"activate",G_CALLBACK(encoder_switch_select_cb),choice);
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
-    }
-  }
-  gtk_widget_show_all(menu);
-#if GTK_CHECK_VERSION(3,22,0)
-  gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event);
-// the following line of code is to work around the problem of the popup menu not having scroll bars.
-  gtk_menu_reposition(GTK_MENU(menu));
-#else
-  gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
-#endif
+  int en=GPOINTER_TO_INT(data);
+  int action=action_dialog(dialog,CONTROLLER_SWITCH,encoders[en].switch_function);
+  gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str);
+  encoders[en].switch_function=action;
   return TRUE;
 }
 
-
 void encoder_menu(GtkWidget *parent) {
   gint row=0;
   gint col=0;
   char label[32];
+  GtkWidget *widget;
 
   dialog=gtk_dialog_new();
   gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(parent));
   //gtk_window_set_decorated(GTK_WINDOW(dialog),FALSE);
   char title[32];
-  sprintf(title,"piHPSDR - Encoder Actions");
+  switch(controller) {
+    case NO_CONTROLLER:
+      sprintf(title,"piHPSDR - No Encoders");
+      break;
+    case CONTROLLER1:
+      sprintf(title,"piHPSDR - Controller 1 Encoder Actions");
+      break;
+    case CONTROLLER2_V1:
+      sprintf(title,"piHPSDR - Controller 2 V1 Encoder Actions");
+      break;
+    case CONTROLLER2_V2:
+      sprintf(title,"piHPSDR - Controller 2 V2 Encoder Actions");
+      break;
+  }
   gtk_window_set_title(GTK_WINDOW(dialog),title);
   g_signal_connect (dialog, "delete_event", G_CALLBACK (delete_event), NULL);
 
@@ -191,26 +132,238 @@ void encoder_menu(GtkWidget *parent) {
   row++;
   col=0;
 
-  gint max_encoders=MAX_ENCODERS;
   switch(controller) {
     case NO_CONTROLLER:
-      max_encoders=0;
+      // should never happen
       break;
     case CONTROLLER1:
-      max_encoders=4;
+      // 3 vertical single encoders with switches plus VFO
+      col=4;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        row++;
+        col=4;
+        
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        row++;
+        col=4;
+      }
+
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      g_sprintf(label,"<b>%s</b>",ActionTable[encoders[3].bottom_encoder_function].str);
+      gtk_label_set_markup (GTK_LABEL(widget), label);
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      row++;
+      col=0;
       break;
     case CONTROLLER2_V1:
-      max_encoders=5;
+      // 3 horizontal single encoders with switches
+      row=4;
+      col=0;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+      }
+      row++;
+      col=0;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+      }
+
+      // padding
+      row=1;
+      col=6;
+      widget=gtk_label_new("");
+      gtk_widget_set_name(widget,"small_button");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
+      // 1 vertical single encoder with switch plus VFO encoder
+      row=1;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[3].switch_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(3));
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      row++;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[3].bottom_encoder_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(3));
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
+      row=5;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[4].bottom_encoder_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
       break;
     case CONTROLLER2_V2:
-      max_encoders=5;
+      // 3 horizontal double encoders with switches
+      row=5;
+      col=0;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+      }
+      row++;
+      col=0;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget),"<b>Top</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].top_encoder_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+      }
+      row++;
+      col=0;
+      for(int i=0;i<3;i++) {
+        widget=gtk_label_new(NULL);
+        gtk_widget_set_name(widget,"small_button");
+        gtk_label_set_markup (GTK_LABEL(widget),"<b>Bottom</b>");
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+        widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str);
+        gtk_widget_set_name(widget,"small_button");
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i));
+        gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+        col++;
+      }
+
+      // padding
+      row=1;
+      col=6;
+      widget=gtk_label_new("");
+      gtk_widget_set_name(widget,"small_button");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
+      // 1 vertical single double with switch plus VFO encoder
+      row=1;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget), "<b>Switch</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[3].switch_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(3));
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      row++;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Top</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[3].top_encoder_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(3));
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      row++;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Bottom</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[3].bottom_encoder_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(3));
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
+      row=7;
+      col=7;
+      widget=gtk_label_new(NULL);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_label_set_markup (GTK_LABEL(widget),"<b>Encoder</b>");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+      col++;
+      widget=gtk_button_new_with_label(ActionTable[encoders[4].bottom_encoder_function].str);
+      gtk_widget_set_name(widget,"small_button");
+      gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+
       break;
   }
 
+/*
+  widget=gtk_label_new(NULL);
+  gtk_label_set_markup (GTK_LABEL(widget), controller==CONTROLLER2_V2?"<b>Bottom Encoder</b>":"<b>Encoder</b>");
+  gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+  col++;
+
   GtkWidget *widget=gtk_label_new("");
   gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
   col++;
 
+
   widget=gtk_label_new(NULL);
   gtk_label_set_markup (GTK_LABEL(widget), controller==CONTROLLER2_V2?"<b>Bottom Encoder</b>":"<b>Encoder</b>");
   gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
@@ -243,21 +396,21 @@ void encoder_menu(GtkWidget *parent) {
       gtk_label_set_markup (GTK_LABEL(widget), label);
     } else {
       widget=gtk_button_new_with_label(ActionTable[encoders[i].bottom_encoder_function].str);
-      g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i));
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_bottom_cb),GINT_TO_POINTER(i));
     }
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
 
     if(controller==CONTROLLER2_V2) {
       widget=gtk_button_new_with_label(ActionTable[encoders[i].top_encoder_function].str);
-      g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i));
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_top_cb),GINT_TO_POINTER(i));
       gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
       col++;
     }
 
     if(i!=(max_encoders-1)) {
       widget=gtk_button_new_with_label(ActionTable[encoders[i].switch_function].str);
-      g_signal_connect(widget,"button_press_event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i));
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(encoder_switch_cb),GINT_TO_POINTER(i));
       gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
       col++;
     }
@@ -265,7 +418,7 @@ void encoder_menu(GtkWidget *parent) {
     row++;
     col=0;
   }
-
+*/
   gtk_container_add(GTK_CONTAINER(content),grid);
 
   sub_menu=dialog;
diff --git a/gpio.c b/gpio.c
index 9eab905afd183b09958fc44066dea6502aa6e45d..5505c5bc79a58f8a05746d563be3c5e69cd54ccc 100644 (file)
--- a/gpio.c
+++ b/gpio.c
@@ -410,7 +410,7 @@ static unsigned long switch_debounce;
 
 static void process_encoder(int e,int l,int addr,int val) {
   guchar pinstate;
-  //g_print("%s: encoder=%d level=%d addr=0x%02X val=%d\n",__FUNCTION__,e,l,addr,val);
+  g_print("%s: encoder=%d level=%d addr=0x%02X val=%d\n",__FUNCTION__,e,l,addr,val);
   g_mutex_lock(&encoder_mutex);
   switch(l) {
     case BOTTOM_ENCODER:
@@ -419,7 +419,7 @@ static void process_encoder(int e,int l,int addr,int val) {
           encoders[e].bottom_encoder_a_value=val;
           pinstate=(encoders[e].bottom_encoder_b_value<<1) | encoders[e].bottom_encoder_a_value;
           encoders[e].bottom_encoder_state=encoder_state_table[encoders[e].bottom_encoder_state&0xf][pinstate];
-          //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state);
+          g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state);
           switch(encoders[e].bottom_encoder_state&0x30) {
             case DIR_NONE:
               break;
@@ -433,13 +433,13 @@ static void process_encoder(int e,int l,int addr,int val) {
               break;
           }
 
-          //g_print("%s: %s BOTTOM pos=%d\n",__FUNCTION__,encoder_string[encoders[e].bottom_encoder_function],encoders[e].bottom_encoder_pos);
+          g_print("%s: %d BOTTOM pos=%d\n",__FUNCTION__,e,encoders[e].bottom_encoder_pos);
           break;
         case B:
           encoders[e].bottom_encoder_b_value=val;
           pinstate=(encoders[e].bottom_encoder_b_value<<1) | encoders[e].bottom_encoder_a_value;
           encoders[e].bottom_encoder_state=encoder_state_table[encoders[e].bottom_encoder_state&0xf][pinstate];
-          //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state);
+          g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].bottom_encoder_state);
           switch(encoders[e].bottom_encoder_state&0x30) {
             case DIR_NONE:
               break;
@@ -453,7 +453,7 @@ static void process_encoder(int e,int l,int addr,int val) {
               break;
           }
 
-          //g_print("%s: %s BOTTOM pos=%d\n",__FUNCTION__,encoder_string[encoders[e].bottom_encoder_function],encoders[e].bottom_encoder_pos);
+          g_print("%s: %d BOTTOM pos=%d\n",__FUNCTION__,e,encoders[e].bottom_encoder_pos);
 
           break;
       }
@@ -464,7 +464,7 @@ static void process_encoder(int e,int l,int addr,int val) {
           encoders[e].top_encoder_a_value=val;
           pinstate=(encoders[e].top_encoder_b_value<<1) | encoders[e].top_encoder_a_value;
           encoders[e].top_encoder_state=encoder_state_table[encoders[e].top_encoder_state&0xf][pinstate];
-          //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state);
+          g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state);
           switch(encoders[e].top_encoder_state&0x30) {
             case DIR_NONE:
               break;
@@ -477,13 +477,13 @@ static void process_encoder(int e,int l,int addr,int val) {
             default:
               break;
           }
-          //g_print("%s: %s TOP pos=%d\n",__FUNCTION__,encoder_string[encoders[e].top_encoder_function],encoders[e].top_encoder_pos);
+          g_print("%s: %d TOP pos=%d\n",__FUNCTION__,e,encoders[e].top_encoder_pos);
           break;
         case B:
           encoders[e].top_encoder_b_value=val;
           pinstate=(encoders[e].top_encoder_b_value<<1) | encoders[e].top_encoder_a_value;
           encoders[e].top_encoder_state=encoder_state_table[encoders[e].top_encoder_state&0xf][pinstate];
-          //g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state);
+          g_print("%s: state=%02X\n",__FUNCTION__,encoders[e].top_encoder_state);
           switch(encoders[e].top_encoder_state&0x30) {
             case DIR_NONE:
               break;
@@ -496,7 +496,7 @@ static void process_encoder(int e,int l,int addr,int val) {
             default:
               break;
           }
-          //g_print("%s: %s TOP pos=%d\n",__FUNCTION__,encoder_string[encoders[e].top_encoder_function],encoders[e].top_encoder_pos);
+          g_print("%s: %d TOP pos=%d\n",__FUNCTION__,e,encoders[e].top_encoder_pos);
 
           break;
       }
@@ -528,22 +528,22 @@ static void process_edge(int offset,int value) {
   for(i=0;i<MAX_ENCODERS;i++) {
     if(encoders[i].bottom_encoder_enabled && encoders[i].bottom_encoder_address_a==offset) {
       //g_print("%s: found %d encoder %d bottom A\n",__FUNCTION__,offset,i);
-      process_encoder(i,BOTTOM_ENCODER,A,value);
+      process_encoder(i,BOTTOM_ENCODER,A,value==PRESSED?1:0);
       found=TRUE;
       break;
     } else if(encoders[i].bottom_encoder_enabled && encoders[i].bottom_encoder_address_b==offset) {
       //g_print("%s: found %d encoder %d bottom B\n",__FUNCTION__,offset,i);
-      process_encoder(i,BOTTOM_ENCODER,B,value);
+      process_encoder(i,BOTTOM_ENCODER,B,value==PRESSED?1:0);
       found=TRUE;
       break;
     } else if(encoders[i].top_encoder_enabled && encoders[i].top_encoder_address_a==offset) {
       //g_print("%s: found %d encoder %d top A\n",__FUNCTION__,offset,i);
-      process_encoder(i,TOP_ENCODER,A,value);
+      process_encoder(i,TOP_ENCODER,A,value==PRESSED?1:0);
       found=TRUE;
       break;
     } else if(encoders[i].top_encoder_enabled && encoders[i].top_encoder_address_b==offset) {
       //g_print("%s: found %d encoder %d top B\n",__FUNCTION__,offset,i);
-      process_encoder(i,TOP_ENCODER,B,value);
+      process_encoder(i,TOP_ENCODER,B,value==PRESSED?1:0);
       found=TRUE;
       break;
     } else if(encoders[i].switch_enabled && encoders[i].switch_address==offset) {
@@ -641,7 +641,6 @@ void gpio_restore_state() {
 
   loadProperties("gpio.props");
  
-  controller=NO_CONTROLLER;
   value=getProperty("controller");
   if(value) controller=atoi(value);
   gpio_set_defaults(controller);
@@ -711,7 +710,6 @@ void gpio_restore_state() {
       if(value) switches[i].switch_address=atoi(value);
     }
   }
-
 }
 
 void gpio_save_state() {
@@ -798,6 +796,13 @@ void gpio_save_state() {
 void gpio_restore_actions() {
   char name[80];
   char *value;
+  int previous_controller=NO_CONTROLLER;
+  
+  value=getProperty("controller");
+  if(value) previous_controller=atoi(value);
+  gpio_set_defaults(controller);
+
+  if(controller==previous_controller) {
   if(controller!=NO_CONTROLLER) {
     for(int i=0;i<MAX_ENCODERS;i++) {
       sprintf(name,"encoders[%d].bottom_encoder_function",i);
@@ -826,11 +831,16 @@ void gpio_restore_actions() {
       if(value) switches[i].switch_function=atoi(value);
     }
   }
+  }
 }
 
 void gpio_save_actions() {
   char value[80];
   char name[80];
+
+  sprintf(value,"%d",controller);
+  setProperty("controller",value);
+
   if(controller!=NO_CONTROLLER) {
     for(int i=0;i<MAX_ENCODERS;i++) {
       sprintf(name,"encoders[%d].bottom_encoder_function",i);
diff --git a/main.c b/main.c
index 07bc002ba74d91a6a03901d380f0f754f6d044a3..903f4501ffb56e710413a295f3958e4909c70d5e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -62,6 +62,7 @@
 #endif
 #include "ext.h"
 #include "vfo.h"
+#include "css.h"
 
 struct utsname unameData;
 
@@ -229,6 +230,8 @@ static void activate_pihpsdr(GtkApplication *app, gpointer data) {
   fprintf(stderr,"version: %s\n",unameData.version);
   fprintf(stderr,"machine: %s\n",unameData.machine);
 
+  load_css();
+
   GdkScreen *screen=gdk_screen_get_default();
   if(screen==NULL) {
     fprintf(stderr,"no default screen!\n");
diff --git a/midi2.c b/midi2.c
index 054c0f530efa0169930fcf5f3e8384720c458cf3..6b227909cb77a74cf4c7724cf1e6c61620946bfd 100644 (file)
--- a/midi2.c
+++ b/midi2.c
@@ -34,7 +34,7 @@ void NewMidiEvent(enum MIDIevent event, int channel, int note, int val) {
     static struct timespec tp, last_wheel_tp={0,0};
     long delta;
 
-//g_print("%s: EVENT=%d CHAN=%d NOTE=%d VAL=%d\n",__FUNCTION__,event,channel,note,val);
+g_print("%s: EVENT=%d CHAN=%d NOTE=%d VAL=%d\n",__FUNCTION__,event,channel,note,val);
     if (event == MIDI_PITCH) {
        desc=MidiCommandsTable.pitch;
     } else {
diff --git a/midi3.c b/midi3.c
index 2294a62fc987234125f3083c86c0a9a57fe8f379..f2f0e7b37ac4103055aa8f60473a25f65fad6378 100644 (file)
--- a/midi3.c
+++ b/midi3.c
@@ -39,6 +39,8 @@ void DoTheMidi(int action, enum ACTIONtype type, int val) {
     // Handle cases in alphabetical order of the key words in midi.props
     //
 
+    g_print("%s: action=%d type=%d val=%d\n",__FUNCTION__,action,type,val);
+
     switch(type) {
       case MIDI_KEY:
         a=g_new(PROCESS_ACTION,1);
index 4d69ec6350792059bd0f1509692dc33e05c99f69..20acaaf5304c6de02e65eea550b837dc7543e6ab 100644 (file)
@@ -24,6 +24,7 @@
 #include <unistd.h>
 #include <termios.h>
 
+#include "main.h"
 #include "discovered.h"
 #include "mode.h"
 #include "filter.h"
@@ -35,6 +36,7 @@
 #include "dac.h"
 #include "radio.h"
 #include "actions.h"
+#include "action_dialog.h"
 #include "midi.h"
 #include "alsa_midi.h"
 #include "new_menu.h"
@@ -97,6 +99,13 @@ enum {
   UPDATE_EXISTING
 };
 
+typedef struct _choice {
+  int action;
+  GtkWidget *initial_button;
+  GtkWidget *button;
+  gulong signal_id;
+} CHOICE;
+
 static int update(void *data);
 static void load_store();
 
@@ -159,47 +168,27 @@ static void type_changed_cb(GtkWidget *widget, gpointer data) {
 
   // update actions available for the type
   gchar *type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widget));
+  g_print("%s: %s\n",__FUNCTION__,type);
+  gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[thisAction].str); // NONE
+}
 
-  g_print("%s: type=%s action=%d\n",__FUNCTION__,type,thisAction);
-  gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(newAction));
-  gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[0].str);
+static gboolean action_cb(GtkWidget *widget,gpointer data) {
+  int selection=0;
+  gchar *type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType));
   if(type==NULL || strcmp(type,"NONE")==0) {
-    // leave empty
-    gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),0);
+    return TRUE;
   } else if(strcmp(type,"KEY")==0) {
-    // add all the Key actions
-    for(i=1;i<ACTIONS;i++) {
-      if(ActionTable[i].type&MIDI_KEY) {
-        gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str);
-       if(ActionTable[i].action==thisAction) {
-          gtk_combo_box_set_active(GTK_COMBO_BOX(newAction),j);
-       }
-       j++;
-      }
-    }
+    selection=MIDI_KEY;
   } else if(strcmp(type,"KNOB/SLIDER")==0) {
-    // add all the Knob actions
-    for(i=1;i<ACTIONS;i++) {
-      if(ActionTable[i].type&MIDI_KNOB) {
-        gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str);
-       if(ActionTable[i].action==thisAction) {
-          gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),j);
-       }
-       j++;
-      }
-    }
+    selection=MIDI_KNOB;
   } else if(strcmp(type,"WHEEL")==0) {
-    // add all the Wheel actions
-    for(i=1;i<ACTIONS;i++) {
-      if(ActionTable[i].type&MIDI_WHEEL || ActionTable[i].type&MIDI_KNOB) {
-        gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str);
-       if(ActionTable[i].action==thisAction) {
-          gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),j);
-       }
-       j++;
-      }
-    }
+    selection=MIDI_WHEEL | MIDI_KNOB;
   }
+g_print("%s: type=%s selection=%02X thisAction=%d\n",__FUNCTION__,type,selection,thisAction);
+  int action=action_dialog(top_window,selection,thisAction);
+  thisAction=action;
+  gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[action].str);
+  return TRUE;
 }
 
 static void row_inserted_cb(GtkTreeModel *tree_model,GtkTreePath *path, GtkTreeIter *iter,gpointer user_data) {
@@ -214,65 +203,58 @@ static void tree_selection_changed_cb (GtkTreeSelection *selection, gpointer dat
   char *str_note;
   char *str_type;
   char *str_action;
+  int i;
 
-  //g_print("%s\n",__FUNCTION__);
-  //if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(configure_b))) {
-    if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
-      gtk_tree_model_get(model, &iter, EVENT_COLUMN, &str_event, -1);
-      gtk_tree_model_get(model, &iter, CHANNEL_COLUMN, &str_channel, -1);
-      gtk_tree_model_get(model, &iter, NOTE_COLUMN, &str_note, -1);
-      gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1);
-      gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1);
-
-      g_print("%s: %s %s %s %s %s\n",__FUNCTION__,str_event,str_channel,str_note,str_type,str_action);
-
-      if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) {
+  if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+    gtk_tree_model_get(model, &iter, EVENT_COLUMN, &str_event, -1);
+    gtk_tree_model_get(model, &iter, CHANNEL_COLUMN, &str_channel, -1);
+    gtk_tree_model_get(model, &iter, NOTE_COLUMN, &str_note, -1);
+    gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1);
+    gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1);
+
+    if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) {
+
+      if(strcmp(str_event,"CTRL")==0) {
+        thisEvent=MIDI_CTRL;
+      } else if(strcmp(str_event,"PITCH")==0) {
+        thisEvent=MIDI_PITCH;
+      } else if(strcmp(str_event,"NOTE")==0) {
+        thisEvent=MIDI_NOTE;
+      } else {
+        thisEvent=EVENT_NONE;
+      }
+      thisChannel=atoi(str_channel);
+      thisNote=atoi(str_note);
+      thisVal=0;
+      thisMin=0;
+      thisMax=0;
+      if(strcmp(str_type,"KEY")==0) {
+        thisType=MIDI_KEY;
+      } else if(strcmp(str_type,"KNOB/SLIDER")==0) {
+        thisType=MIDI_KNOB;
+      } else if(strcmp(str_type,"WHEEL")==0) {
+        thisType=MIDI_WHEEL;
+      } else {
+        thisType=TYPE_NONE;
+      }
 
-        if(strcmp(str_event,"CTRL")==0) {
-          thisEvent=MIDI_CTRL;
-        } else if(strcmp(str_event,"PITCH")==0) {
-          thisEvent=MIDI_PITCH;
-        } else if(strcmp(str_event,"NOTE")==0) {
-          thisEvent=MIDI_NOTE;
-        } else {
-          thisEvent=EVENT_NONE;
-        }
-        thisChannel=atoi(str_channel);
-        thisNote=atoi(str_note);
-        thisVal=0;
-        thisMin=0;
-        thisMax=0;
-        if(strcmp(str_type,"KEY")==0) {
-          thisType=MIDI_KEY;
-        } else if(strcmp(str_type,"KNOB/SLIDER")==0) {
-          thisType=MIDI_KNOB;
-        } else if(strcmp(str_type,"WHEEL")==0) {
-          thisType=MIDI_WHEEL;
-        } else {
-          thisType=TYPE_NONE;
-        }
-        thisAction=NO_ACTION;
-        int i=1;
-        while(ActionTable[i].action!=NO_ACTION) {
-          if(strcmp(ActionTable[i].str,str_action)==0) {
-            thisAction=ActionTable[i].action;
-            break;
-          }
-          i++;
+      thisAction=NO_ACTION;
+      for(i=0;i<ACTIONS;i++) {
+        if(strcmp(ActionTable[i].str,str_action)==0) {
+          thisAction=ActionTable[i].action;
+          break;
         }
-        g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING));
       }
+      g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING));
     }
-  //}
+  }
 }
 
 static void find_current_cmd() {
   struct desc *cmd;
-  g_print("%s:\n",__FUNCTION__);
   cmd=MidiCommandsTable.desc[thisNote];
   while(cmd!=NULL) {
     if((cmd->channel==thisChannel || cmd->channel==-1) && cmd->type==thisType && cmd->action==thisAction) {
-      g_print("%s: found cmd %p\n",__FUNCTION__,cmd);
       break;
     }
     cmd=cmd->next;
@@ -476,7 +458,8 @@ static void load_store() {
 static void add_cb(GtkButton *widget,gpointer user_data) {
 
   gchar *str_type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType));
-  gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction));
+  //gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction));
+  const gchar *str_action=gtk_button_get_label(GTK_BUTTON(newAction));
 ;
 
   gint i;
@@ -498,13 +481,11 @@ static void add_cb(GtkButton *widget,gpointer user_data) {
   }
 
   action=NO_ACTION;
-  i=1;
-  while(ActionTable[i].action!=NO_ACTION) {
+  for(i=0;i<ACTIONS;i++) {
     if(strcmp(ActionTable[i].str,str_action)==0) {
       action=ActionTable[i].action;
       break;
     }
-    i++;
   }
 
   g_print("%s: type=%s (%d) action=%s (%d)\n",__FUNCTION__,str_type,type,str_action,action);
@@ -557,7 +538,8 @@ static void update_cb(GtkButton *widget,gpointer user_data) {
 
 
   gchar *str_type=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newType));
-  gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction));
+  //gchar *str_action=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(newAction));
+  const gchar *str_action=gtk_button_get_label(GTK_BUTTON(newAction));
 ;
   //g_print("%s: type=%s action=%s\n",__FUNCTION__,str_type,str_action);
 
@@ -572,13 +554,11 @@ static void update_cb(GtkButton *widget,gpointer user_data) {
   }
 
   thisAction=NO_ACTION;
-  i=1;
-  while(ActionTable[i].action!=NO_ACTION) {
+  for(i=0;i<ACTIONS;i++) {
     if(strcmp(ActionTable[i].str,str_action)==0) {
       thisAction=ActionTable[i].action;
       break;
     }
-    i++;
   }
 
   current_cmd->channel=thisChannel;
@@ -776,20 +756,20 @@ void midi_menu(GtkWidget *parent) {
   col++;
   g_signal_connect(newType,"changed",G_CALLBACK(type_changed_cb),NULL);
   newVal=gtk_label_new("");
-  col++;
   gtk_grid_attach(GTK_GRID(grid),newVal,col,row,1,1);
-  newMin=gtk_label_new("");
   col++;
+  newMin=gtk_label_new("");
   gtk_grid_attach(GTK_GRID(grid),newMin,col,row,1,1);
-  newMax=gtk_label_new("");
   col++;
+  newMax=gtk_label_new("");
   gtk_grid_attach(GTK_GRID(grid),newMax,col,row,1,1);
+  col++;
 
   row++;
   col=col-4;
 
-  newAction=gtk_combo_box_text_new();
-  gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(newAction),5);
+  newAction=gtk_button_new_with_label("    ");
+  g_signal_connect(newAction, "button-press-event", G_CALLBACK(action_cb),NULL);
   gtk_grid_attach(GTK_GRID(grid),newAction,col++,row,1,1);
 
   add_b=gtk_button_new_with_label("Add");
@@ -812,7 +792,7 @@ void midi_menu(GtkWidget *parent) {
 
   scrolled_window=gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);
-  gtk_widget_set_size_request(scrolled_window,400,300);
+  gtk_widget_set_size_request(scrolled_window,400,200);
 
   view=gtk_tree_view_new();
 
@@ -862,7 +842,6 @@ static int update(void *data) {
 
   switch(state) {
     case UPDATE_NEW:
-      g_print("%s: UPDATE_NEW\n",__FUNCTION__);
       switch(thisEvent) {
         case EVENT_NONE:
           gtk_label_set_text(GTK_LABEL(newEvent),"NONE");
@@ -898,24 +877,7 @@ static int update(void *data) {
           gtk_combo_box_set_active (GTK_COMBO_BOX(newType),0);
           break;
       }
-      gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(newAction));
-      gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,"NONE");
-      gtk_combo_box_set_active (GTK_COMBO_BOX(newAction),0);
-      if(thisEvent==MIDI_PITCH || thisEvent==MIDI_NOTE) {
-       i=1;
-       j=0;
-       while(ActionTable[i].action!=NO_ACTION) {
-          if(ActionTable[i].type&MIDI_KEY) {
-            gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(newAction),NULL,ActionTable[i].str);
-            if(ActionTable[i].action==thisAction) {
-              gtk_combo_box_set_active(GTK_COMBO_BOX(newAction),j);
-            }
-            j++;
-          }
-          i++;
-        }
-
-      }
+      gtk_button_set_label(GTK_BUTTON(newAction),ActionTable[0].str); // NONE
       sprintf(text,"%d",thisVal);
       gtk_label_set_text(GTK_LABEL(newVal),text);
       sprintf(text,"%d",thisMin);
@@ -929,7 +891,6 @@ static int update(void *data) {
       break;
 
     case UPDATE_CURRENT:
-      g_print("%s: UPDATE_CURRENT\n",__FUNCTION__);
       sprintf(text,"%d",thisVal);
       gtk_label_set_text(GTK_LABEL(newVal),text);
       sprintf(text,"%d",thisMin);
@@ -939,7 +900,6 @@ static int update(void *data) {
       break;
 
     case UPDATE_EXISTING:
-      g_print("%s: UPDATE_EXISTING\n",__FUNCTION__);
       switch(thisEvent) {
         case EVENT_NONE:
           gtk_label_set_text(GTK_LABEL(newEvent),"NONE");
@@ -1013,21 +973,18 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val)
   char *str_note;
   char *str_type;
   char *str_action;
+  int i;
 
   gint tree_event;
   gint tree_channel;
   gint tree_note;
 
-  //g_print("%s: event=%d channel=%d note=%d val=%d\n", __FUNCTION__,event,channel,note,val);
-
   if(event==thisEvent && channel==thisChannel && note==thisNote) {
-    //g_print("%s: current event\n",__FUNCTION__);
     thisVal=val;
     if(val<thisMin) thisMin=val;
     if(val>thisMax) thisMax=val;
     g_idle_add(update,GINT_TO_POINTER(UPDATE_CURRENT));
   } else {
-    //g_print("%s: new or existing event\n",__FUNCTION__);
     thisEvent=event;
     thisChannel=channel;
     thisNote=note;
@@ -1046,8 +1003,6 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val)
       gtk_tree_model_get(model, &iter, TYPE_COLUMN, &str_type, -1);
       gtk_tree_model_get(model, &iter, ACTION_COLUMN, &str_action, -1);
 
-      //g_print("%s: %s %s %s %s %s\n",__FUNCTION__,str_event,str_channel,str_note,str_type,str_action);
-
       if(str_event!=NULL && str_channel!=NULL && str_note!=NULL && str_type!=NULL && str_action!=NULL) {
         if(strcmp(str_event,"CTRL")==0) {
           tree_event=MIDI_CTRL;
@@ -1075,13 +1030,11 @@ void NewMidiConfigureEvent(enum MIDIevent event, int channel, int note, int val)
             thisType=TYPE_NONE;
           }
           thisAction=NO_ACTION;
-          int i=1;
-          while(ActionTable[i].action!=NO_ACTION) {
+          for(i=0;i<ACTIONS;i++) {
             if(strcmp(ActionTable[i].str,str_action)==0) {
               thisAction=ActionTable[i].action;
               break;
             }
-            i++;
           }
          gtk_tree_view_set_cursor(GTK_TREE_VIEW(view),gtk_tree_model_get_path(model,&iter),NULL,FALSE);
           g_idle_add(update,GINT_TO_POINTER(UPDATE_EXISTING));
@@ -1146,6 +1099,7 @@ void midi_restore_state() {
   gint onoff;
   gint type;
   gint action;
+  int i, j;
 
   struct desc *cmd;
 
@@ -1168,7 +1122,7 @@ void midi_restore_state() {
     }
   }
 
-  for(int i=0;i<128;i++) {
+  for(i=0;i<128;i++) {
     sprintf(name,"midi[%d].channels",i);
     value=getProperty(name);
     if(value) {
@@ -1196,7 +1150,7 @@ void midi_restore_state() {
           value=getProperty(name);
          type=TYPE_NONE;
           if(value) {
-            for(int j=0;j<5;j++) {
+            for(j=0;j<5;j++) {
               if(strcmp(value,midi_types[j])==0) {
                 type=j;
                 break;
@@ -1207,13 +1161,11 @@ void midi_restore_state() {
           value=getProperty(name);
          action=NO_ACTION;
           if(value) {
-           int j=1;
-           while(ActionTable[j].type!=NO_ACTION) {
+           for(j=0;j<ACTIONS;j++) {
               if(strcmp(value,ActionTable[j].str)==0) {
                 action=ActionTable[j].action;
                break;
               }
-             j++;
            }
          }
 
index 7c5c1b30733954b98de632dc51230b4c8d27f541..663a7ca72e49de575bb09e17f112bcf5cde7e156 100644 (file)
@@ -54,6 +54,7 @@
 #include "ps_menu.h"
 #include "encoder_menu.h"
 #include "switch_menu.h"
+#include "toolbar_menu.h"
 #include "vfo_menu.h"
 #include "fft_menu.h"
 #include "main.h"
@@ -194,13 +195,19 @@ static gboolean encoder_cb (GtkWidget *widget, GdkEventButton *event, gpointer d
   encoder_menu(top_window);
   return TRUE;
 }
-#endif
 
 static gboolean switch_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
   cleanup();
   switch_menu(top_window);
   return TRUE;
 }
+#endif
+
+static gboolean toolbar_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
+  cleanup();
+  toolbar_menu(top_window);
+  return TRUE;
+}
 
 static gboolean cw_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
   cleanup();
@@ -594,14 +601,28 @@ void new_menu()
 
     switch(controller) {
       case NO_CONTROLLER:
-       {
+        {
+        GtkWidget *toolbar_b=gtk_button_new_with_label("Toolbar");
+        g_signal_connect (toolbar_b, "button-press-event", G_CALLBACK(toolbar_cb), NULL);
+        gtk_grid_attach(GTK_GRID(grid),toolbar_b,(i%5),i/5,1,1);
+        i++;
+        }
+        break;
+      case CONTROLLER1:
+#ifdef GPIO
+        {
+        GtkWidget *encoders_b=gtk_button_new_with_label("Encoders");
+        g_signal_connect (encoders_b, "button-press-event", G_CALLBACK(encoder_cb), NULL);
+        gtk_grid_attach(GTK_GRID(grid),encoders_b,(i%5),i/5,1,1);
+        i++;
+
         GtkWidget *switches_b=gtk_button_new_with_label("Switches");
         g_signal_connect (switches_b, "button-press-event", G_CALLBACK(switch_cb), NULL);
         gtk_grid_attach(GTK_GRID(grid),switches_b,(i%5),i/5,1,1);
         i++;
         }
+#endif
         break;
-      case CONTROLLER1:
       case CONTROLLER2_V1:
       case CONTROLLER2_V2:
         {
@@ -610,11 +631,16 @@ void new_menu()
         g_signal_connect (encoders_b, "button-press-event", G_CALLBACK(encoder_cb), NULL);
         gtk_grid_attach(GTK_GRID(grid),encoders_b,(i%5),i/5,1,1);
         i++;
-#endif
+
         GtkWidget *switches_b=gtk_button_new_with_label("Switches");
         g_signal_connect (switches_b, "button-press-event", G_CALLBACK(switch_cb), NULL);
         gtk_grid_attach(GTK_GRID(grid),switches_b,(i%5),i/5,1,1);
         i++;
+#endif
+        GtkWidget *toolbar_b=gtk_button_new_with_label("Toolbar");
+        g_signal_connect (toolbar_b, "button-press-event", G_CALLBACK(toolbar_cb), NULL);
+        gtk_grid_attach(GTK_GRID(grid),toolbar_b,(i%5),i/5,1,1);
+        i++;
         }
         break;
     }
diff --git a/radio.c b/radio.c
index 2b9e1c4e2923a9279cd3e20b62b8ebe2b3e38e8c..d39d510e7fe74dc051bc705f9b5fdf36c5e3b338 100644 (file)
--- a/radio.c
+++ b/radio.c
@@ -2099,9 +2099,6 @@ g_print("radioRestoreState: %s\n",property_path);
     memRestoreState();
     vfo_restore_state();
     modesettings_restore_state();
-//#ifdef GPIO
-//    gpio_restore_actions();
-//#endif
     gpio_restore_actions();
     value=getProperty("rigctl_enable");
     if(value) rigctl_enable=atoi(value);
@@ -2236,11 +2233,6 @@ g_print("radioSaveState: %s\n",property_path);
   
   g_mutex_lock(&property_mutex);
   clearProperties();
-//#ifdef GPIO
-//  if(controller!=NO_CONTROLLER) {
-//    gpio_save_actions();
-//  }
-//#endif
   gpio_save_actions();
   sprintf(value,"%d",receivers);
   setProperty("receivers",value);
index 34fbf00fb3c469e2f1842701a2beb96fbcdbcca2..16d479e39808cc834e9465f61db7381d7e6fd6b1 100644 (file)
 #include "button_text.h"
 #include "toolbar.h"
 #include "actions.h"
+#include "action_dialog.h"
 #include "gpio.h"
 #include "i2c.h"
 
 typedef struct _choice {
   int sw;
   int action;
+  GtkWidget *initial_button;
   GtkWidget *button;
+  gulong signal_id;
 } CHOICE;
 
 static GtkWidget *parent_window=NULL;
@@ -73,40 +76,12 @@ void switch_page_cb(GtkNotebook *notebook,GtkWidget *page,guint page_num,gpointe
   temp_switches=switches_controller1[page_num];
 }
 
-static void switch_select_cb(GtkWidget *widget, gpointer data) {
-  char text[128];
-  CHOICE *choice=(CHOICE *)data;
-  temp_switches[choice->sw].switch_function=choice->action;
-  GtkWidget *label=gtk_bin_get_child(GTK_BIN(choice->button));
-  sprintf(text,"<span size=\"smaller\">%s</span>",ActionTable[choice->action].str);
-  gtk_label_set_markup (GTK_LABEL(label), text);
-  update_toolbar_labels();
-}
-
 static gboolean switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) {
   int sw=GPOINTER_TO_INT(data);
-  int i;
-
-  GtkWidget *menu=gtk_menu_new();
-  for(i=0;i<ACTIONS;i++) {
-    if(ActionTable[i].type | CONTROLLER_SWITCH) {
-      GtkWidget *menu_item=gtk_menu_item_new_with_label(ActionTable[i].str);
-      CHOICE *choice=g_new0(CHOICE,1);
-      choice->sw=sw;
-      choice->action=i;
-      choice->button=widget;
-      g_signal_connect(menu_item,"activate",G_CALLBACK(switch_select_cb),choice);
-      gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
-    }
-  }
-  gtk_widget_show_all(menu);
-#if GTK_CHECK_VERSION(3,22,0)
-  gtk_menu_popup_at_pointer(GTK_MENU(menu),(GdkEvent *)event);
-// the following line of code is to work around the problem of the popup menu not having scroll bars.
-  gtk_menu_reposition(GTK_MENU(menu));
-#else
-  gtk_menu_popup(GTK_MENU(menu),NULL,NULL,NULL,NULL,0,gtk_get_current_event_time());
-#endif
+  int action=action_dialog(top_window,CONTROLLER_SWITCH,temp_switches[sw].switch_function);
+  gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str);
+  temp_switches[sw].switch_function=action;
+  update_toolbar_labels();
   return TRUE;
 }
 
@@ -127,7 +102,7 @@ void switch_menu(GtkWidget *parent) {
   gint function=0;
 
 
-  dialog=gtk_dialog_new_with_buttons("piHPSDR - Switch Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,("OK"),GTK_RESPONSE_ACCEPT,NULL);
+  dialog=gtk_dialog_new_with_buttons("piHPSDR - Switch Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,"_OK",GTK_RESPONSE_ACCEPT,NULL);
   g_signal_connect (dialog, "response", G_CALLBACK (response_event), NULL);
 
   GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog));
@@ -142,9 +117,9 @@ next_function_set:
 
   grid=gtk_grid_new();
   gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE);
-  gtk_grid_set_row_homogeneous(GTK_GRID(grid),TRUE);
-  gtk_grid_set_column_spacing (GTK_GRID(grid),2);
-  gtk_grid_set_row_spacing (GTK_GRID(grid),2);
+  gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE);
+  gtk_grid_set_column_spacing (GTK_GRID(grid),0);
+  gtk_grid_set_row_spacing (GTK_GRID(grid),0);
 
 
   row=0;
@@ -177,74 +152,90 @@ next_function_set:
     row=row+5;
     col=0;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[0].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(0));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(0));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[1].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(1));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(1));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[2].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(2));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(2));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[3].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(3));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(3));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[4].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(4));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(4));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[5].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(5));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(5));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[6].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(6));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(6));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
 
     row=original_row;
     col=8;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[7].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(7));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(7));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     row++;
     col=7;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[8].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(8));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(8));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[9].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(9));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(9));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     row++;
     col=7;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[10].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(10));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(10));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[11].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(11));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(11));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     row++;
     col=7;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[12].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(12));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(12));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[13].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(13));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(13));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     row++;
     col=7;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[14].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(14));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(14));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
     col++;
     widget=gtk_button_new_with_label(ActionTable[temp_switches[15].switch_function].str);
-    g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(15));
+    gtk_widget_set_name(widget,"small_button");
+    g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(15));
     gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
 
     gtk_container_add(GTK_CONTAINER(content),grid);
@@ -253,12 +244,11 @@ next_function_set:
     for(int i=0;i<max_switches;i++) {
       if((controller==NO_CONTROLLER || controller==CONTROLLER1) && (temp_switches[i].switch_function==FUNCTION)) {
         widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str);
-        //widget=gtk_label_new(NULL);
-        //g_sprintf(label,"<b>%s</b>",ActionTable[temp_switches[i].switch_function].str);
-        //gtk_label_set_markup (GTK_LABEL(widget), label);
+        // no signal for Function button
       } else {
         widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str);
-        g_signal_connect(widget,"button_press_event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i));
+        g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i));
+g_print("%s: %d\n",__FUNCTION__,i);
       }
       gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
       col++;
diff --git a/toolbar_menu.c b/toolbar_menu.c
new file mode 100644 (file)
index 0000000..0297e36
--- /dev/null
@@ -0,0 +1,156 @@
+
+/* Copyright (C)
+* 2016 - John Melton, G0ORX/N6LYT
+*
+* 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 (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.
+*
+* 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.
+*
+*/
+
+#include <gtk/gtk.h>
+#include <glib/gprintf.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "main.h"
+#include "new_menu.h"
+#include "agc_menu.h"
+#include "agc.h"
+#include "band.h"
+#include "channel.h"
+#include "radio.h"
+#include "receiver.h"
+#include "vfo.h"
+#include "button_text.h"
+#include "toolbar.h"
+#include "actions.h"
+#include "action_dialog.h"
+#include "gpio.h"
+#include "i2c.h"
+
+typedef struct _choice {
+  int sw;
+  int action;
+  GtkWidget *initial_button;
+  GtkWidget *button;
+  gulong signal_id;
+} CHOICE;
+
+static GtkWidget *parent_window=NULL;
+
+static GtkWidget *dialog=NULL;
+
+static SWITCH *temp_switches;
+
+
+static void cleanup() {
+  if(dialog!=NULL) {
+    gtk_widget_destroy(dialog);
+    dialog=NULL;
+    active_menu=NO_MENU;
+    sub_menu=NULL;
+  }
+}
+
+static gboolean close_cb (GtkWidget *widget, GdkEventButton *event, gpointer data) {
+  cleanup();
+  return TRUE;
+}
+
+static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) {
+  cleanup();
+  return FALSE;
+}
+
+static void switch_page_cb(GtkNotebook *notebook,GtkWidget *page,guint page_num,gpointer user_data) {
+  temp_switches=switches_controller1[page_num];
+}
+
+static gboolean switch_cb(GtkWidget *widget, GdkEvent *event, gpointer data) {
+  int sw=GPOINTER_TO_INT(data);
+  int action=action_dialog(top_window,CONTROLLER_SWITCH,temp_switches[sw].switch_function);
+  gtk_button_set_label(GTK_BUTTON(widget),ActionTable[action].str);
+  temp_switches[sw].switch_function=action;
+  update_toolbar_labels();
+  return TRUE;
+}
+
+static void response_event(GtkWidget *dialog,gint id,gpointer user_data) {
+  gtk_widget_destroy(dialog);
+  dialog=NULL;
+  active_menu=NO_MENU;
+  sub_menu=NULL;
+}
+
+void toolbar_menu(GtkWidget *parent) {
+  gint row;
+  gint col;
+  gchar label[64];
+  GtkWidget *notebook;
+  GtkWidget *grid;
+  GtkWidget *widget;
+  gint function=0;
+
+
+  dialog=gtk_dialog_new_with_buttons("piHPSDR - Toolbar Actions",GTK_WINDOW(parent),GTK_DIALOG_DESTROY_WITH_PARENT,"_OK",GTK_RESPONSE_ACCEPT,NULL);
+  g_signal_connect (dialog, "response", G_CALLBACK (response_event), NULL);
+
+  GtkWidget *content=gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+
+  function=0;
+
+  notebook=gtk_notebook_new();
+next_function_set:
+
+  grid=gtk_grid_new();
+  gtk_grid_set_column_homogeneous(GTK_GRID(grid),TRUE);
+  gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE);
+  gtk_grid_set_column_spacing (GTK_GRID(grid),0);
+  gtk_grid_set_row_spacing (GTK_GRID(grid),0);
+
+
+  row=0;
+  col=0;
+
+  gint max_switches=MAX_SWITCHES;
+  max_switches=8;
+  temp_switches=switches_controller1[function];
+
+  for(int i=0;i<max_switches;i++) {
+    if(temp_switches[i].switch_function==FUNCTION) {
+      widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str);
+      // no signal for Function button
+    } else {
+      widget=gtk_button_new_with_label(ActionTable[temp_switches[i].switch_function].str);
+      g_signal_connect(widget,"button-press-event",G_CALLBACK(switch_cb),GINT_TO_POINTER(i));
+g_print("%s: %d\n",__FUNCTION__,i);
+    }
+    gtk_grid_attach(GTK_GRID(grid),widget,col,row,1,1);
+    col++;
+  }
+
+  g_sprintf(label,"Function %d",function);
+  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),grid,gtk_label_new(label));
+  function++;
+  if(function<MAX_FUNCTIONS) {
+    goto next_function_set;
+  }
+  gtk_container_add(GTK_CONTAINER(content),notebook);
+  g_signal_connect (notebook, "switch-page",G_CALLBACK(switch_page_cb),NULL);
+
+  sub_menu=dialog;
+
+  gtk_widget_show_all(dialog);
+}
diff --git a/toolbar_menu.h b/toolbar_menu.h
new file mode 100644 (file)
index 0000000..a1d52df
--- /dev/null
@@ -0,0 +1 @@
+void toolbar_menu(GtkWidget *parent);
diff --git a/vfo.c b/vfo.c
index 549e7f13177f41c3b0064c8bd87fb38cb68e8d19..5fe726c9dd78caa4a903a726204d47837ad29a8e 100644 (file)
--- a/vfo.c
+++ b/vfo.c
@@ -1115,16 +1115,16 @@ void vfo_update() {
         if(can_transmit) {
           cairo_move_to(cr, 330, 50);  
          if (transmitter->compressor) {
-             sprintf(temp_text,"CMPR %d dB",(int) transmitter->compressor_level);
-              cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
-              cairo_show_text(cr, temp_text);
+           sprintf(temp_text,"CMPR %ddB",(int) transmitter->compressor_level);
+            cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
+            cairo_show_text(cr, temp_text);
          } else {
-              cairo_set_source_rgb(cr, 0.7, 0.7, 0.7);
-              cairo_show_text(cr, "CMPR OFF");
+            cairo_set_source_rgb(cr, 0.7, 0.7, 0.7);
+            cairo_show_text(cr, "CMPR");
          }
         }
 
-        cairo_move_to(cr, 500, 50);  
+        cairo_move_to(cr, 505, 50);  
         if(diversity_enabled) {
           cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
         } else {
@@ -1143,7 +1143,7 @@ void vfo_update() {
         cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
         cairo_show_text(cr, temp_text);
 
-        cairo_move_to(cr, 430, 50);  
+        cairo_move_to(cr, 405, 50);  
         if(vfo[id].ctun) {
           cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
         } else {
@@ -1151,7 +1151,17 @@ void vfo_update() {
         }
         cairo_show_text(cr, "CTUN");
 
-        cairo_move_to(cr, 470, 50);  
+#ifdef MIDI
+        cairo_move_to(cr, 445, 50);  
+        if(midi_enabled) {
+          cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
+        } else {
+          cairo_set_source_rgb(cr, 0.7, 0.7, 0.7);
+        }
+        cairo_show_text(cr, "MIDI");
+#endif
+
+        cairo_move_to(cr, 475, 50);  
         if(cat_control>0) {
           cairo_set_source_rgb(cr, 1.0, 1.0, 0.0);
         } else {
@@ -1160,7 +1170,7 @@ void vfo_update() {
         cairo_show_text(cr, "CAT");
 
         if(can_transmit) {
-          cairo_move_to(cr, 500, 15);  
+          cairo_move_to(cr, 505, 15);  
           if(vox_enabled) {
             cairo_set_source_rgb(cr, 1.0, 0.0, 0.0);
           } else {
index b7eba43818f8affcea68913ea3199349616e9398..2b4da08f26541f4c7fe2db1206ea72c46edd9117 100644 (file)
@@ -291,13 +291,11 @@ void vfo_menu(GtkWidget *parent,int vfo) {
   gtk_grid_attach(GTK_GRID(grid),vfo_label,3,3,1,1);
 
   GtkWidget *vfo_b=gtk_combo_box_text_new();
-  i=0;
-  while(steps[i]!=0) {
+  for(i=0;i<15;i++) {
     gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(vfo_b),NULL,step_labels[i]);
     if(steps[i]==step) {
       gtk_combo_box_set_active (GTK_COMBO_BOX(vfo_b), i);
     }
-    i++;
   }
   g_signal_connect(vfo_b,"changed",G_CALLBACK(vfo_cb),NULL);
   gtk_grid_attach(GTK_GRID(grid),vfo_b,4,3,1,1);