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
#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
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
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
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) \
--- /dev/null
+#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;
+}
+
--- /dev/null
+int action_dialog(GtkWidget *parent,int filter,int current);
{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},
{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},
{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},
{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},
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:
#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"
;
--- /dev/null
+extern char *css;
+extern void load_css();
+
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) {
#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;
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);
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);
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++;
}
row++;
col=0;
}
-
+*/
gtk_container_add(GTK_CONTAINER(content),grid);
sub_menu=dialog;
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:
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;
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;
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;
}
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;
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;
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;
}
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) {
loadProperties("gpio.props");
- controller=NO_CONTROLLER;
value=getProperty("controller");
if(value) controller=atoi(value);
gpio_set_defaults(controller);
if(value) switches[i].switch_address=atoi(value);
}
}
-
}
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);
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);
#endif
#include "ext.h"
#include "vfo.h"
+#include "css.h"
struct utsname unameData;
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");
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 {
// 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);
#include <unistd.h>
#include <termios.h>
+#include "main.h"
#include "discovered.h"
#include "mode.h"
#include "filter.h"
#include "dac.h"
#include "radio.h"
#include "actions.h"
+#include "action_dialog.h"
#include "midi.h"
#include "alsa_midi.h"
#include "new_menu.h"
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();
// 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) {
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;
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;
}
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);
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);
}
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;
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");
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();
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");
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);
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);
break;
case UPDATE_EXISTING:
- g_print("%s: UPDATE_EXISTING\n",__FUNCTION__);
switch(thisEvent) {
case EVENT_NONE:
gtk_label_set_text(GTK_LABEL(newEvent),"NONE");
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;
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;
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));
gint onoff;
gint type;
gint action;
+ int i, j;
struct desc *cmd;
}
}
- for(int i=0;i<128;i++) {
+ for(i=0;i<128;i++) {
sprintf(name,"midi[%d].channels",i);
value=getProperty(name);
if(value) {
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;
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++;
}
}
#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"
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();
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:
{
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;
}
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);
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);
#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;
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;
}
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));
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;
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);
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++;
--- /dev/null
+
+/* 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);
+}
--- /dev/null
+void toolbar_menu(GtkWidget *parent);
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 {
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 {
}
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 {
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 {
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);