diff --git a/drmr_ui.c b/drmr_ui.c index b12ab67..faf2046 100644 --- a/drmr_ui.c +++ b/drmr_ui.c @@ -125,14 +125,6 @@ static void fill_sample_table(DrMrUi* ui, int samples, GtkWidget** gain_sliders, } } -static void kit_combobox_changed(GtkComboBox* box, gpointer data) { - DrMrUi* ui = (DrMrUi*)data; - gint new_kit = gtk_combo_box_get_active (GTK_COMBO_BOX(box)); - float fkit = (float)new_kit; - if (ui->curKit != new_kit) - ui->write(ui->controller,DRMR_KITNUM,4,0,&fkit); -} - static const char* nstrs = "C C#D D#E F F#G G#A A#B "; static char baseLabelBuf[32]; static void setBaseLabel(int noteIdx) { @@ -165,6 +157,66 @@ static void fill_kit_combo(GtkComboBox* combo, kits* kits) { } } +static gboolean idle = FALSE; +static gboolean kit_callback(gpointer data) { + DrMrUi* ui = (DrMrUi*)data; + if (ui->kitReq != ui->curKit) { + int samples = (ui->kitReqkits->num_kits && ui->kitReq >= 0)? + ui->kits->kits[ui->kitReq].samples: + 0; + GtkWidget** gain_sliders; + GtkWidget** pan_sliders; + if (ui->sample_table) { + gain_sliders = ui->gain_sliders; + pan_sliders = ui->pan_sliders; + ui->gain_sliders = NULL; + ui->pan_sliders = NULL; + if (gain_sliders) free(gain_sliders); + if (pan_sliders) free(pan_sliders); + gtk_widget_destroy(GTK_WIDGET(ui->sample_table)); + ui->sample_table = NULL; + } + if (samples > 0) { + ui->sample_table = GTK_TABLE(gtk_table_new(1,1,true)); + gtk_table_set_col_spacings(ui->sample_table,5); + gtk_table_set_row_spacings(ui->sample_table,5); + + gain_sliders = malloc(samples*sizeof(GtkWidget*)); + pan_sliders = malloc(samples*sizeof(GtkWidget*)); + fill_sample_table(ui,samples,gain_sliders,pan_sliders); + gtk_box_pack_start(GTK_BOX(ui->drmr_widget),GTK_WIDGET(ui->sample_table), + true,true,5); + gtk_box_reorder_child(GTK_BOX(ui->drmr_widget),GTK_WIDGET(ui->sample_table),0); + gtk_widget_show_all(GTK_WIDGET(ui->sample_table)); + ui->samples = samples; + ui->gain_sliders = gain_sliders; + ui->pan_sliders = pan_sliders; + + ui->curKit = ui->kitReq; + gtk_combo_box_set_active(ui->kit_combo,ui->curKit); + } + } + idle = FALSE; + return FALSE; // don't keep calling +} + +static void kit_combobox_changed(GtkComboBox* box, gpointer data) { + DrMrUi* ui = (DrMrUi*)data; + gint new_kit = gtk_combo_box_get_active (GTK_COMBO_BOX(box)); + float fkit = (float)new_kit; + if (ui->curKit != new_kit) + ui->write(ui->controller,DRMR_KITNUM,4,0,&fkit); + + /* Call our update func after 100 milliseconds. + * + * This is a hack to deal with hosts that don't send + * back port_events properly after the write function. + * In particular, qtractor doesn't, at the moment. + */ + ui->kitReq = new_kit; + g_timeout_add(100,kit_callback,ui); +} + static void build_drmr_ui(DrMrUi* ui) { GtkWidget *drmr_ui_widget; GtkWidget *opts_hbox, *kit_combo_box, *kit_label, *base_label, *base_spin; @@ -271,49 +323,6 @@ static gboolean slider_callback(gpointer data) { return FALSE; // don't keep calling } -static gboolean idle = FALSE; -static gboolean kit_callback(gpointer data) { - DrMrUi* ui = (DrMrUi*)data; - if (ui->kitReq != ui->curKit) { - int samples = (ui->kitReqkits->num_kits && ui->kitReq >= 0)? - ui->kits->kits[ui->kitReq].samples: - 0; - GtkWidget** gain_sliders; - GtkWidget** pan_sliders; - if (ui->sample_table) { - gain_sliders = ui->gain_sliders; - pan_sliders = ui->pan_sliders; - ui->gain_sliders = NULL; - ui->pan_sliders = NULL; - if (gain_sliders) free(gain_sliders); - if (pan_sliders) free(pan_sliders); - gtk_widget_destroy(GTK_WIDGET(ui->sample_table)); - ui->sample_table = NULL; - } - if (samples > 0) { - ui->sample_table = GTK_TABLE(gtk_table_new(1,1,true)); - gtk_table_set_col_spacings(ui->sample_table,5); - gtk_table_set_row_spacings(ui->sample_table,5); - - gain_sliders = malloc(samples*sizeof(GtkWidget*)); - pan_sliders = malloc(samples*sizeof(GtkWidget*)); - fill_sample_table(ui,samples,gain_sliders,pan_sliders); - gtk_box_pack_start(GTK_BOX(ui->drmr_widget),GTK_WIDGET(ui->sample_table), - true,true,5); - gtk_box_reorder_child(GTK_BOX(ui->drmr_widget),GTK_WIDGET(ui->sample_table),0); - gtk_widget_show_all(GTK_WIDGET(ui->sample_table)); - ui->samples = samples; - ui->gain_sliders = gain_sliders; - ui->pan_sliders = pan_sliders; - - ui->curKit = ui->kitReq; - gtk_combo_box_set_active(ui->kit_combo,ui->curKit); - } - } - idle = FALSE; - return FALSE; // don't keep calling -} - static void port_event(LV2UI_Handle handle, uint32_t port_index,