add knobs

This commit is contained in:
Tomasz Moń
2009-03-09 18:22:20 +01:00
parent 322c59032e
commit 90df427200
9 changed files with 175 additions and 58 deletions

View File

@@ -9,7 +9,7 @@ LIBS = `pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 alsa` -lexpat
all: gdigi all: gdigi
gdigi: gdigi.o tests.o gui.o effects.o preset.o gtkknob.o gdigi: knob.h gdigi.o tests.o gui.o effects.o preset.o gtkknob.o
$(CC) $(LIBS) $(OFLAG) gdigi gdigi.o tests.o gui.o effects.o preset.o gtkknob.o $(CC) $(LIBS) $(OFLAG) gdigi gdigi.o tests.o gui.o effects.o preset.o gtkknob.o
gdigi.o: gdigi.c gdigi.o: gdigi.c
@@ -24,6 +24,11 @@ preset.o: preset.c
gtkknob.o: gtkknob.c gtkknob.o: gtkknob.c
gtkknob.o: gtkknob.c
knob.h:
gdk-pixbuf-csource --name=knob_pixbuf knob.png > $@
clean: clean:
rm *.o rm *.o

3
TODO
View File

@@ -4,9 +4,8 @@
-effects library -effects library
-effects level -effects level
-handling presets (saving, exporting to xml patches) -handling presets (saving, exporting to xml patches)
-buildsystem -buildsystem (install knob.png to share dir, don't use inline knob pixbuf)
-expression pedal settings -expression pedal settings
-finish modifier_linkable_list() (gdigi.c) -finish modifier_linkable_list() (gdigi.c)
-make modifiers[] complete (gdigi.c) -make modifiers[] complete (gdigi.c)
-add it to gui -add it to gui

110
effects.c
View File

@@ -17,6 +17,77 @@
#include "gdigi.h" #include "gdigi.h"
#include "effects.h" #include "effects.h"
static gchar *wave_labels[] = {
"Tri",
"Sine",
"Square",
NULL,
};
static gchar *whammy_labels[] = {
"OctUp",
"2OctUp",
"2ndDn",
"Rv2nd",
"4thDn",
"OctDn",
"2OctDn",
"DivBmb",
"M3>Ma3",
"2ndMa3",
"3rd4th",
"4th5th",
"5thOct",
"HOctUp",
"HOctDn",
"OctU>D",
NULL,
};
static gchar *ips_shift_labels[] = {
"Oct Dn",
"7th Dn",
"6th Dn",
"5th Dn",
"4th Dn",
"3rd Dn",
"2nd Dn",
"2nd Up",
"3rd Up",
"4th Up",
"5th Up",
"6th Up",
"7th Up",
"Oct Up",
NULL,
};
static gchar *ips_key_labels[] = {
"E",
"F",
"Gb",
"G",
"Ab",
"A",
"Bb",
"B",
"C",
"Db",
"D",
"Eb",
NULL,
};
static gchar *ips_scale_labels[] = {
"Major",
"Minor",
"Dorian",
"Mixolydian",
"Lydian",
"HMinor",
NULL,
};
static EffectSettings wah_settings[] = { static EffectSettings wah_settings[] = {
{"Wah min", 0.0, 99.0, WAH_MIN, WAH_POSITION_MIN_MAX}, {"Wah min", 0.0, 99.0, WAH_MIN, WAH_POSITION_MIN_MAX},
{"Wah max", 0.0, 99.0, WAH_MAX, WAH_POSITION_MIN_MAX}, {"Wah max", 0.0, 99.0, WAH_MAX, WAH_POSITION_MIN_MAX},
@@ -159,14 +230,14 @@ static EffectSettings chorusfx_dual_settings[] = {
{"Dual chorus speed", 0.0, 99.0, DUAL_CHORUS_SPEED, CHORUSFX_POSITION}, {"Dual chorus speed", 0.0, 99.0, DUAL_CHORUS_SPEED, CHORUSFX_POSITION},
{"Dual chorus depth", 0.0, 99.0, DUAL_CHORUS_DEPTH, CHORUSFX_POSITION}, {"Dual chorus depth", 0.0, 99.0, DUAL_CHORUS_DEPTH, CHORUSFX_POSITION},
{"Dual chorus level", 0.0, 99.0, DUAL_CHORUS_LEVEL, CHORUSFX_POSITION}, {"Dual chorus level", 0.0, 99.0, DUAL_CHORUS_LEVEL, CHORUSFX_POSITION},
/* TODO: DUAL_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Dual chorus wave", 0.0, 2.0, DUAL_CHORUS_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_multi_settings[] = { static EffectSettings chorusfx_multi_settings[] = {
{"Multi chorus speed", 0.0, 99.0, MULTI_CHORUS_SPEED, CHORUSFX_POSITION}, {"Multi chorus speed", 0.0, 99.0, MULTI_CHORUS_SPEED, CHORUSFX_POSITION},
{"Multi chorus depth", 0.0, 99.0, MULTI_CHORUS_DEPTH, CHORUSFX_POSITION}, {"Multi chorus depth", 0.0, 99.0, MULTI_CHORUS_DEPTH, CHORUSFX_POSITION},
{"Multi chorus level", 0.0, 99.0, MULTI_CHORUS_LEVEL, CHORUSFX_POSITION}, {"Multi chorus level", 0.0, 99.0, MULTI_CHORUS_LEVEL, CHORUSFX_POSITION},
/* TODO: MULTI_CHORUS_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Multi chorus wave", 0.0, 2.0, MULTI_CHORUS_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_flanger_settings[] = { static EffectSettings chorusfx_flanger_settings[] = {
@@ -174,7 +245,7 @@ static EffectSettings chorusfx_flanger_settings[] = {
{"Flanger depth", 0.0, 99.0, FLANGER_DEPTH, CHORUSFX_POSITION}, {"Flanger depth", 0.0, 99.0, FLANGER_DEPTH, CHORUSFX_POSITION},
{"Flanger regen", 0.0, 99.0, FLANGER_REGEN, CHORUSFX_POSITION}, {"Flanger regen", 0.0, 99.0, FLANGER_REGEN, CHORUSFX_POSITION},
{"Flanger level", 0.0, 99.0, FLANGER_LEVEL, CHORUSFX_POSITION}, {"Flanger level", 0.0, 99.0, FLANGER_LEVEL, CHORUSFX_POSITION},
/* TODO: FLANGER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Flanger wave", 0.0, 2.0, FLANGER_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_mxr_flanger_settings[] = { static EffectSettings chorusfx_mxr_flanger_settings[] = {
@@ -189,7 +260,7 @@ static EffectSettings chorusfx_phaser_settings[] = {
{"Phaser depth", 0.0, 99.0, PHASER_DEPTH, CHORUSFX_POSITION}, {"Phaser depth", 0.0, 99.0, PHASER_DEPTH, CHORUSFX_POSITION},
{"Phaser regen", 0.0, 99.0, PHASER_REGEN, CHORUSFX_POSITION}, {"Phaser regen", 0.0, 99.0, PHASER_REGEN, CHORUSFX_POSITION},
{"Phaser level", 0.0, 99.0, PHASER_LEVEL, CHORUSFX_POSITION}, {"Phaser level", 0.0, 99.0, PHASER_LEVEL, CHORUSFX_POSITION},
/* TODO: PHASER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Phaser wave", 0.0, 2.0, PHASER_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_vibrato_settings[] = { static EffectSettings chorusfx_vibrato_settings[] = {
@@ -208,19 +279,19 @@ static EffectSettings chorusfx_vibropan_settings[] = {
{"Vibropan speed", 0.0, 99.0, VIBROPAN_SPEED, CHORUSFX_POSITION}, {"Vibropan speed", 0.0, 99.0, VIBROPAN_SPEED, CHORUSFX_POSITION},
{"Vibropan depth", 0.0, 99.0, VIBROPAN_DEPTH, CHORUSFX_POSITION}, {"Vibropan depth", 0.0, 99.0, VIBROPAN_DEPTH, CHORUSFX_POSITION},
{"Vibropan vibra", 0.0, 99.0, VIBROPAN_VIBRA, CHORUSFX_POSITION}, {"Vibropan vibra", 0.0, 99.0, VIBROPAN_VIBRA, CHORUSFX_POSITION},
/* TODO: VIBROPAN_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Vibropan wave", 0.0, 2.0, VIBROPAN_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_tremolo_settings[] = { static EffectSettings chorusfx_tremolo_settings[] = {
{"Tremolo speed", 0.0, 99.0, TREMOLO_SPEED, CHORUSFX_POSITION}, {"Tremolo speed", 0.0, 99.0, TREMOLO_SPEED, CHORUSFX_POSITION},
{"Tremolo depth", 0.0, 99.0, TREMOLO_DEPTH, CHORUSFX_POSITION}, {"Tremolo depth", 0.0, 99.0, TREMOLO_DEPTH, CHORUSFX_POSITION},
/* TODO: TREMOLO_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Tremolo wave", 0.0, 2.0, TREMOLO_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_panner_settings[] = { static EffectSettings chorusfx_panner_settings[] = {
{"Panner speed", 0.0, 99.0, PANNER_SPEED, CHORUSFX_POSITION}, {"Panner speed", 0.0, 99.0, PANNER_SPEED, CHORUSFX_POSITION},
{"Panner depth", 0.0, 99.0, PANNER_DEPTH, CHORUSFX_POSITION}, {"Panner depth", 0.0, 99.0, PANNER_DEPTH, CHORUSFX_POSITION},
/* TODO: PANNER_WAVE with valid options WAVE_TRI, WAVE_SINE, WAVE_SQUARE */ {"Panner wave", 0.0, 2.0, PANNER_WAVE, CHORUSFX_POSITION, wave_labels},
}; };
static EffectSettings chorusfx_envelope_settings[] = { static EffectSettings chorusfx_envelope_settings[] = {
@@ -248,13 +319,7 @@ static EffectSettings chorusfx_step_filter_settings[] = {
static EffectSettings chorusfx_whammy_settings[] = { static EffectSettings chorusfx_whammy_settings[] = {
{"Whammy pedal", 0.0, 99.0, WHAMMY_PEDAL, CHORUSFX_POSITION}, {"Whammy pedal", 0.0, 99.0, WHAMMY_PEDAL, CHORUSFX_POSITION},
{"Whammy mix", 0.0, 99.0, WHAMMY_MIX, CHORUSFX_POSITION}, {"Whammy mix", 0.0, 99.0, WHAMMY_MIX, CHORUSFX_POSITION},
/* {"Whammy amount", 0.0, 15.0, WHAMMY_AMOUNT, CHORUSFX_POSITION, whammy_labels},
TODO: WHAMMY_AMOUNT with valid options:
WHAMMY_OCT_UP, WHAMMY_2OCT_UP, WHAMMY_2ND_DN, WHAMMY_RV_2ND,
WHAMMY_4TH_DN, WHAMMY_OCT_DN, WHAMMY_2OCT_DN, WHAMMY_DIV_BMB,
WHAMMY_M3_MA, WHAMMY_2ND_MA3, WHAMMY_3RD_4TH, WHAMMY_4TH_5TH,
WHAMMY_5TH_OCT, WHAMMY_HOCT_UP, WHAMMY_HOCT_DN, WHAMMY_OCT_UD
*/
}; };
static EffectSettings chorusfx_pitch_shift_settings[] = { static EffectSettings chorusfx_pitch_shift_settings[] = {
@@ -269,20 +334,9 @@ static EffectSettings chorusfx_detune_settings[] = {
}; };
static EffectSettings chorusfx_ips_settings[] = { static EffectSettings chorusfx_ips_settings[] = {
/* {"IPS shift", 0.0, 13.0, IPS_SHIFT_AMOUNT, CHORUSFX_POSITION, ips_shift_labels},
TODO: IPS_SHIFT_AMOUNT with valid options: {"IPS key", 0.0, 11.0, IPS_KEY, CHORUSFX_POSITION, ips_key_labels},
IPS_7TH_DN, IPS_6TH_DN, IPS_5TH_DN, IPS_4TH_DN, IPS_3RD_DN, {"IPS scale", 0.0, 5.0, IPS_SCALE, CHORUSFX_POSITION, ips_scale_labels},
IPS_2ND_DN, IPS_2ND_UP, IPS_3RD_UP, IPS_4TH_UP, IPS_5TH_UP,
IPS_6TH_UP, IPS_7TH_UP, IPS_OCT_U
TODO: IPS_KEY with valid options:
IPS_E, IPS_F, IPS_GB, IPS_G, IPS_AB, IPS_A, IPS_BB, IPS_B,
IPS_C, IPS_DD, IPS_D, IPS_EB
TODO: IPS_SCALE with valid options:
IPS_MAJOR, IPS_MINOR, IPS_DORIA, IPS_MIXLYD, IPS_LYDIAN, IPS_HMINO
*/
{"IPS level", 0.0, 99.0, IPS_LEVEL, CHORUSFX_POSITION}, {"IPS level", 0.0, 99.0, IPS_LEVEL, CHORUSFX_POSITION},
}; };

View File

@@ -25,6 +25,8 @@ typedef struct {
gdouble max; /* Parameter maximum value */ gdouble max; /* Parameter maximum value */
guint option; /* ID (to set parameter) */ guint option; /* ID (to set parameter) */
guint position; /* position */ guint position; /* position */
GStrv labels; /* value labels */
} EffectSettings; } EffectSettings;
typedef struct { typedef struct {

10
gdigi.c
View File

@@ -132,6 +132,7 @@ static void unpack_message(GString *msg)
int x; int x;
int i; int i;
unsigned char status; unsigned char status;
unsigned char *str;
gboolean stop = FALSE; gboolean stop = FALSE;
g_return_if_fail(msg != NULL); g_return_if_fail(msg != NULL);
@@ -141,20 +142,21 @@ static void unpack_message(GString *msg)
x = 0; x = 0;
i = 8; i = 8;
str = (unsigned char*)msg->str;
do { do {
offset += 8; offset += 8;
status = (unsigned char)msg->str[offset-1]; status = str[offset-1];
for (x=0; x<7; x++) { for (x=0; x<7; x++) {
if (offset+x >= msg->len) { if (offset+x >= msg->len) {
stop = TRUE; stop = TRUE;
break; break;
} }
if ((unsigned char)msg->str[offset+x] == 0xF7) { if (str[offset+x] == 0xF7) {
msg->str[i] = 0xF7; str[i] = 0xF7;
stop = TRUE; stop = TRUE;
} }
msg->str[i] = (((status << (x+1)) & 0x80) | (unsigned char)msg->str[x+offset]); str[i] = (((status << (x+1)) & 0x80) | str[x+offset]);
i++; i++;
} }
} while (!stop && (offset+x < msg->len)); } while (!stop && (offset+x < msg->len));

View File

@@ -62,8 +62,6 @@ static void gtk_knob_update(GtkKnob *knob);
static void gtk_knob_adjustment_changed(GtkAdjustment *adjustment, gpointer data); static void gtk_knob_adjustment_changed(GtkAdjustment *adjustment, gpointer data);
static void gtk_knob_adjustment_value_changed(GtkAdjustment *adjustment, gpointer data); static void gtk_knob_adjustment_value_changed(GtkAdjustment *adjustment, gpointer data);
GError *gerror;
/* Local data */ /* Local data */
static GtkWidgetClass *parent_class = NULL; static GtkWidgetClass *parent_class = NULL;
@@ -792,6 +790,29 @@ gtk_knob_animation_new_from_file(gchar *filename) {
return anim; return anim;
} }
/*****************************************************************************
*
* gtk_knob_animation_new_from_inline()
*
*****************************************************************************/
GtkKnobAnim *
gtk_knob_animation_new_from_inline(const guint8 *pixbuf) {
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
g_return_val_if_fail((pixbuf != NULL), NULL);
anim->pixbuf = gdk_pixbuf_new_from_inline(-1, pixbuf, FALSE, NULL);
if (anim->pixbuf == NULL) {
g_free(anim);
return NULL;
}
anim->height = gdk_pixbuf_get_height (anim->pixbuf);
anim->width = gdk_pixbuf_get_width (anim->pixbuf);
anim->frame_width = anim->height;
return anim;
}
/***************************************************************************** /*****************************************************************************
* *
@@ -812,6 +833,8 @@ gtk_knob_animation_new_from_file_full(gchar *filename, gint frame_width,
g_return_val_if_fail ((filename != NULL), NULL); g_return_val_if_fail ((filename != NULL), NULL);
GError *gerror = NULL;
#if GTK_MINOR_VERSION < 10 #if GTK_MINOR_VERSION < 10
if (!(anim->pixbuf = gdk_pixbuf_new_from_file (filename, &gerror))) { if (!(anim->pixbuf = gdk_pixbuf_new_from_file (filename, &gerror))) {
return NULL; return NULL;

View File

@@ -1,8 +1,4 @@
/***************************************************************************** /*****************************************************************************
*
* gtkknob.h
*
* PHASEX: [P]hase [H]armonic [A]dvanced [S]ynthesis [EX]periment
* *
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999 * Most of this code comes from gAlan 0.2.0, copyright (C) 1999
* Tony Garnock-Jones, with modifications by Sean Bolton, * Tony Garnock-Jones, with modifications by Sean Bolton,
@@ -90,7 +86,8 @@ typedef struct _GtkKnobAnim GtkKnobAnim;
extern GtkAdjustment *gtk_knob_get_adjustment(GtkKnob *knob); extern GtkAdjustment *gtk_knob_get_adjustment(GtkKnob *knob);
extern void gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy); extern void gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy);
extern void gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment); extern void gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment);
GtkKnobAnim *gtk_knob_animation_new_from_inline(const guint8 *pixbuf);
GtkKnobAnim *gtk_knob_animation_new_from_file_full(gchar *filename, GtkKnobAnim *gtk_knob_animation_new_from_file_full(gchar *filename,
gint frame_width, gint frame_width,
gint width, gint width,

67
gui.c
View File

@@ -19,10 +19,13 @@
#include "gui.h" #include "gui.h"
#include "effects.h" #include "effects.h"
#include "preset.h" #include "preset.h"
#include "gtkknob.h"
#include "knob.h"
extern EffectList effects[]; extern EffectList effects[];
extern int n_effects; extern int n_effects;
static GtkKnobAnim *knob_anim = NULL;
static gboolean allow_send = FALSE; static gboolean allow_send = FALSE;
void show_error_message(GtkWidget *parent, gchar *message) void show_error_message(GtkWidget *parent, gchar *message)
@@ -39,7 +42,7 @@ void show_error_message(GtkWidget *parent, gchar *message)
} }
typedef struct { typedef struct {
GtkWidget *widget; GtkObject *widget;
gint id; gint id;
gint position; gint position;
@@ -48,13 +51,28 @@ typedef struct {
gint x; /* combo box item number */ gint x; /* combo box item number */
} WidgetListElem; } WidgetListElem;
void value_changed_option_cb(GtkSpinButton *spinbutton, EffectSettings *setting) void value_changed_option_cb(GtkAdjustment *adj, EffectSettings *setting)
{ {
g_return_if_fail(setting != NULL); g_return_if_fail(setting != NULL);
if (allow_send) { if (allow_send) {
gint val = gtk_spin_button_get_value_as_int(spinbutton); gdouble val;
set_option(setting->option, setting->position, val); g_object_get(G_OBJECT(adj), "value", &val, NULL);
set_option(setting->option, setting->position, (gint)val);
}
if (setting->labels != NULL) {
GtkWidget *label;
gint x;
gdouble val = -1.0;
g_object_get(G_OBJECT(adj), "value", &val, NULL);
x = (gint)val;
if ((x >= setting->min) && (x <= setting->max)) {
label = g_object_get_data(G_OBJECT(adj), "label");
gtk_label_set_text(GTK_LABEL(label), setting->labels[x]);
}
} }
} }
@@ -68,7 +86,7 @@ void toggled_cb(GtkToggleButton *button, Effect *effect)
} }
} }
static void widget_list_add(GList **list, GtkWidget *widget, gint id, gint position, gint value, gint x) static void widget_list_add(GList **list, GtkObject *widget, gint id, gint position, gint value, gint x)
{ {
WidgetListElem *el; WidgetListElem *el;
@@ -88,8 +106,8 @@ static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
if (el->value == -1) { if (el->value == -1) {
if (GTK_IS_TOGGLE_BUTTON(el->widget)) if (GTK_IS_TOGGLE_BUTTON(el->widget))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(el->widget), (param->value == 0) ? FALSE : TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(el->widget), (param->value == 0) ? FALSE : TRUE);
else if (GTK_IS_SPIN_BUTTON(el->widget)) else if (GTK_IS_ADJUSTMENT(el->widget))
gtk_spin_button_set_value(GTK_SPIN_BUTTON(el->widget), param->value); gtk_adjustment_set_value(GTK_ADJUSTMENT(el->widget), (gdouble)param->value);
} else { /* combo box */ } else { /* combo box */
if (el->value == param->value) if (el->value == param->value)
gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x); gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x);
@@ -124,20 +142,35 @@ static void apply_current_preset(GList *list)
GtkWidget *create_table(GList **list, EffectSettings *settings, gint amt) GtkWidget *create_table(GList **list, EffectSettings *settings, gint amt)
{ {
GtkWidget *table, *label, *widget; GtkWidget *table, *label, *widget, *knob;
GtkObject *adj; GtkObject *adj;
int x; int x;
table = gtk_table_new(2, amt, FALSE); table = gtk_table_new(3, amt, FALSE);
for (x = 0; x<amt; x++) { for (x = 0; x<amt; x++) {
label = gtk_label_new(settings[x].label); label = gtk_label_new(settings[x].label);
adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max, 1.0, 1.0, 0.0); adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max,
widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0); 1.0, /* step increment */
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]); MAX((settings[x].max / 100), 5.0), /* page increment */
widget_list_add(list, widget, settings[x].option, settings[x].position, -1, -1); 0.0);
knob = gtk_knob_new(GTK_ADJUSTMENT(adj), knob_anim);
if (settings[x].labels == NULL) {
widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(widget), TRUE);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(widget), GTK_UPDATE_IF_VALID);
} else {
widget = gtk_label_new(settings[x].labels[0]);
g_object_set_data(G_OBJECT(adj), "label", widget);
}
widget_list_add(list, adj, settings[x].option, settings[x].position, -1, -1);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2); gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), widget, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2); gtk_table_attach(GTK_TABLE(table), knob, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]);
} }
return table; return table;
@@ -148,7 +181,7 @@ GtkWidget *create_on_off_button(GList **list, Effect *effect)
GtkWidget *button = gtk_toggle_button_new_with_label(effect->label); GtkWidget *button = gtk_toggle_button_new_with_label(effect->label);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
widget_list_add(list, button, effect->option, effect->position, -1, -1); widget_list_add(list, GTK_OBJECT(button), effect->option, effect->position, -1, -1);
return button; return button;
} }
@@ -229,7 +262,7 @@ GtkWidget *create_widget_container(GList **list, EffectGroup *group, gint amt)
settings->option = group[x].option; settings->option = group[x].option;
settings->position = group[x].position; settings->position = group[x].position;
settings->child = widget; settings->child = widget;
widget_list_add(list, combo_box, group[x].option, group[x].position, group[x].id, x); widget_list_add(list, GTK_OBJECT(combo_box), group[x].option, group[x].position, group[x].id, x);
name = g_strdup_printf("SettingsGroup%d", cmbox_no); name = g_strdup_printf("SettingsGroup%d", cmbox_no);
g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free)); g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free));
@@ -640,6 +673,8 @@ void create_window()
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2);
knob_anim = gtk_knob_animation_new_from_inline(knob_pixbuf);
for (x = 0; x<n_effects; x++) { for (x = 0; x<n_effects; x++) {
if ((x % 3) == 0) { if ((x % 3) == 0) {
hbox = gtk_hbox_new(TRUE, 0); hbox = gtk_hbox_new(TRUE, 0);

BIN
knob.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB