2 terminatorX - realtime audio scratching software
3 Copyright (C) 1999-2002 Alexander König
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 Description: This implements the gtk+ GUI for the virtual turntable
22 class implemented in tX_vtt.cc. This code is not in tX_vtt.cc
23 for mainly to keep the GUI code divided from the audio-rendering
24 code and as gtk+ callback to C++ method call wrapper.
28 before 11-26-2001: too many changes.
30 11-26-2001: applied Adrian's solo/mute patch - Alex
32 11-27-2001: modified solo/mute to use the set_mix_mute/solo function
33 of the vtts. The previous approach messed up the sequencer
34 and more. Removed some old unnecessary code, too.
39 #include "tX_vttgui.h"
41 #include "tX_widget.h"
42 #include "tX_mastergui.h"
43 #include "tX_loaddlg.h"
44 #include "tX_prelis.h"
45 #include "tX_pbutton.h"
46 #include "tX_global.h"
47 #include "tX_extdial.h"
49 #include "tX_ladspa.h"
60 #define WID_DYN TRUE, TRUE, 0
61 #define WID_FIX FALSE, FALSE, 0
63 #define FILENAME_BUTTON_MAX 20
65 void nicer_filename(char *dest, char *source)
71 fn=strrchr(source, '/');
77 fn=strrchr(temp, '.');
80 if (strlen(temp) > FILENAME_BUTTON_MAX)
82 temp[FILENAME_BUTTON_MAX-3]='.';
83 temp[FILENAME_BUTTON_MAX-2]='.';
84 temp[FILENAME_BUTTON_MAX-1]='.';
85 temp[FILENAME_BUTTON_MAX]=0;
90 void name_changed(GtkWidget *wid, vtt_class *vtt)
92 vtt->set_name((char *) gtk_entry_get_text(GTK_ENTRY(wid)));
95 void volume_changed(GtkWidget *wid, vtt_class *vtt)
97 vtt->sp_volume.receive_gui_value(2.0-GTK_ADJUSTMENT(wid)->value);
100 void pan_changed(GtkWidget *wid, vtt_class *vtt)
102 vtt->sp_pan.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
105 void pitch_changed(GtkWidget *wid, vtt_class *vtt)
107 vtt->sp_pitch.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
110 GtkSignalFunc trigger_prelis(GtkWidget *w)
112 GtkFileSelection *fs;
114 fs=GTK_FILE_SELECTION(gtk_widget_get_toplevel(w));
116 prelis_start((char *) gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
120 void cancel_load_file(GtkWidget *wid, vtt_class *vtt)
124 vtt->gui.file_dialog=NULL;
125 if (vtt->gui.fs) gtk_widget_destroy(GTK_WIDGET(vtt->gui.fs));
128 int quit_load_file(GtkWidget *wid, vtt_class *vtt)
130 //vtt->gui.file_dialog=NULL;
135 char global_filename_buffer[PATH_MAX];
137 void load_part(char *newfile, vtt_class *vtt)
142 ld_create_loaddlg(TX_LOADDLG_MODE_SINGLE, 1);
143 ld_set_filename(newfile);
145 ret = vtt->load_file(newfile);
152 case TX_AUDIO_ERR_ALLOC:
153 tx_note("Error loading file: failed to allocate memory");
155 case TX_AUDIO_ERR_PIPE_READ:
156 tx_note("Error loading file: broken pipe (File not supported/corrupt?)");
158 case TX_AUDIO_ERR_SOX:
159 tx_note("Error loading file: couldn't execute sox");
161 case TX_AUDIO_ERR_MPG123:
162 tx_note("Error loading file: couldn't execute mpg123");
164 case TX_AUDIO_ERR_WAV_NOTFOUND:
165 tx_note("Error loading file: file not found");
167 case TX_AUDIO_ERR_NOT_16BIT:
168 tx_note("Error loading file: RIFF/WAV is not 16 Bit.");
170 case TX_AUDIO_ERR_NOT_MONO:
171 tx_note("Error loading file: RIFF/WAV is not mono");
173 case TX_AUDIO_ERR_WAV_READ:
174 tx_note("Error loading file: RIFF/WAV corrupt?");
176 case TX_AUDIO_ERR_NOT_SUPPORTED:
177 tx_note("Error loading file: filetype not supported.");
180 tx_note("OOPS: An unknown error occured - This shouldn't happen :(");
185 nicer_filename(global_filename_buffer, newfile);
187 gtk_button_set_label(GTK_BUTTON(vtt->gui.file), global_filename_buffer);
189 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), global_filename_buffer);
194 void do_load_file(GtkWidget *wid, vtt_class *vtt)
197 char newfile[PATH_MAX];
198 char buffer[1024]="Couldn't open loop file: ";
199 char fn[FILENAME_BUTTON_MAX];
202 unsigned int newsize;
206 strcpy(newfile, gtk_file_selection_get_filename(GTK_FILE_SELECTION(vtt->gui.fs)));
207 gtk_widget_destroy(GTK_WIDGET(vtt->gui.fs));
209 load_part(newfile, vtt);
211 if (!globals.current_path)
213 free(globals.current_path);
214 globals.current_path = NULL;
217 globals.current_path = strdup(newfile);
219 vtt->gui.file_dialog=NULL;
222 void drop_file(GtkWidget *widget, GdkDragContext *context,
223 gint x, gint y, GtkSelectionData *selection_data,
224 guint info, guint time, vtt_class *vtt)
226 char filename[PATH_MAX];
231 strncpy(filename, (char *) selection_data->data, (size_t) selection_data->length);
232 filename[selection_data->length]=0;
234 fn = strchr (filename, '\r');
237 fn = strchr (filename, ':');
238 if (fn) fn++; else fn=(char *) selection_data->data;
244 GtkSignalFunc load_file(GtkWidget *wid, vtt_class *vtt)
248 if (vtt->gui.file_dialog)
250 gdk_window_raise(vtt->gui.file_dialog);
254 sprintf(buffer, "Select Audio File for %s", vtt->name);
255 vtt->gui.fs=gtk_file_selection_new(buffer);
257 if (strlen(vtt->filename) > 0)
259 gtk_file_selection_set_filename(GTK_FILE_SELECTION(vtt->gui.fs), vtt->filename);
262 gtk_widget_show(GTK_WIDGET(vtt->gui.fs));
264 vtt->gui.file_dialog=vtt->gui.fs->window;
266 if (globals.current_path)
268 gtk_file_selection_set_filename(GTK_FILE_SELECTION(vtt->gui.fs),globals.current_path);
270 gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->ok_button), "clicked", GTK_SIGNAL_FUNC(do_load_file), vtt);
271 gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->cancel_button), "clicked", GTK_SIGNAL_FUNC (cancel_load_file), vtt);
272 gtk_signal_connect (GTK_OBJECT(vtt->gui.fs), "delete-event", GTK_SIGNAL_FUNC(quit_load_file), vtt);
274 gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->file_list), "cursor_changed", GTK_SIGNAL_FUNC(trigger_prelis), vtt->gui.fs);
276 gtk_signal_connect (GTK_OBJECT(GTK_FILE_SELECTION(vtt->gui.fs)->file_list), "select_row", GTK_SIGNAL_FUNC(trigger_prelis), vtt->gui.fs);
280 void delete_vtt(GtkWidget *wid, vtt_class *vtt)
282 if (audioon) tx_note("Sorry, you'll have to stop playback first.");
287 void edit_vtt_buffer(GtkWidget *wid, vtt_class *vtt)
289 char command[2*PATH_MAX];
291 if (vtt->samples_in_buffer == 0)
293 tx_note("Nothing to edit.");
296 if (strlen(globals.file_editor)>0)
298 sprintf(command, "%s \"%s\" &", globals.file_editor, vtt->filename);
299 system(command); /*) tx_note("Failed to run the soundfile editor."); */
303 tx_note("No soundfile editor configured.");
307 void reload_vtt_buffer(GtkWidget *wid, vtt_class *vtt)
309 char reload_buffer[PATH_MAX];
311 while (gtk_events_pending()) gtk_main_iteration();
313 if (vtt->samples_in_buffer > 0)
315 strcpy(reload_buffer, vtt->filename);
316 load_part(reload_buffer, vtt);
318 else tx_note("Nothing to reload.");
321 void clone_vtt(GtkWidget *wid, vtt_class *vtt)
326 void trigger_vtt(GtkWidget *wid, vtt_class *vtt)
328 vtt->sp_trigger.receive_gui_value((float) 1.0);
331 void stop_vtt(GtkWidget *wid, vtt_class *vtt)
333 vtt->sp_trigger.receive_gui_value((float) 0.0);
336 void autotrigger_toggled(GtkWidget *wid, vtt_class *vtt)
338 vtt->set_autotrigger(GTK_TOGGLE_BUTTON(wid)->active);
341 void loop_toggled(GtkWidget *wid, vtt_class *vtt)
343 vtt->sp_loop.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
346 void lp_enabled(GtkWidget *wid, vtt_class *vtt)
348 vtt->sp_lp_enable.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
351 void lp_gain_changed(GtkWidget *wid, vtt_class *vtt)
353 vtt->sp_lp_gain.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
356 void lp_reso_changed(GtkWidget *wid, vtt_class *vtt)
358 vtt->sp_lp_reso.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
361 void lp_freq_changed(GtkWidget *wid, vtt_class *vtt)
363 vtt->sp_lp_freq.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
366 void ec_enabled(GtkWidget *wid, vtt_class *vtt)
368 vtt->sp_ec_enable.receive_gui_value(GTK_TOGGLE_BUTTON(wid)->active);
371 void ec_length_changed(GtkWidget *wid, vtt_class *vtt)
373 vtt->sp_ec_length.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
376 void ec_feedback_changed(GtkWidget *wid, vtt_class *vtt)
378 vtt->sp_ec_feedback.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
381 void ec_pan_changed(GtkWidget *wid, vtt_class *vtt)
383 vtt->sp_ec_pan.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
386 void ec_volume_changed(GtkWidget *wid, vtt_class *vtt)
388 vtt->sp_ec_volume.receive_gui_value(GTK_ADJUSTMENT(wid)->value);
391 void master_setup(GtkWidget *wid, vtt_class *vtt)
393 vtt->set_sync_master(GTK_TOGGLE_BUTTON(wid)->active);
396 void client_setup(GtkWidget *wid, vtt_class *vtt)
400 client=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(vtt->gui.sync_client));
401 vtt->sp_sync_client.receive_gui_value(client);
404 void client_setup_number(GtkWidget *wid, vtt_class *vtt)
408 cycles=(int) GTK_ADJUSTMENT(vtt->gui.cycles)->value;
410 vtt->sp_sync_cycles.receive_gui_value(cycles);
413 void mute_volume(GtkWidget *widget, vtt_class *vtt)
415 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
417 vtt->set_mix_mute(1);
421 vtt->set_mix_mute(0);
425 void solo_vtt(GtkWidget *widget, vtt_class *vtt)
427 list <vtt_class *> :: iterator it_vtt;
429 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
431 vtt->set_mix_solo(1);
435 vtt->set_mix_solo(0);
439 void minimize_control_panel(GtkWidget *wid, vtt_class *vtt)
441 vtt->hide_control(true);
444 void unminimize_control_panel(GtkWidget *wid, vtt_class *vtt)
446 vtt->hide_control(false);
449 void minimize_audio_panel(GtkWidget *wid, vtt_class *vtt)
451 vtt->hide_audio(true);
454 void unminimize_audio_panel(GtkWidget *wid, vtt_class *vtt)
456 vtt->hide_audio(false);
459 void vg_display_xcontrol(vtt_class *vtt)
465 strcpy(buffer, vtt->x_par->get_name());
466 if (strlen(buffer)>35)
474 gtk_button_set_label(GTK_BUTTON(vtt->gui.x_control), buffer);
476 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.x_control)->child), buffer);
482 gtk_button_set_label(GTK_BUTTON(vtt->gui.x_control), "Nothing");
484 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.x_control)->child), "Nothing");
489 void vg_display_ycontrol(vtt_class *vtt)
495 strcpy(buffer, vtt->y_par->get_name());
496 if (strlen(buffer)>26)
504 gtk_button_set_label(GTK_BUTTON(vtt->gui.y_control), buffer);
506 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.y_control)->child), buffer);
512 gtk_button_set_label(GTK_BUTTON(vtt->gui.y_control), "Nothing");
514 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.y_control)->child), "Nothing");
519 void vg_xcontrol_dis(GtkWidget *wid, vtt_class *vtt)
521 vtt->set_x_input_parameter(NULL);
524 void vg_ycontrol_dis(GtkWidget *wid, vtt_class *vtt)
526 vtt->set_y_input_parameter(NULL);
529 void vg_xcontrol_set(GtkWidget *wid, tX_seqpar *sp)
531 vtt_class *vtt=(vtt_class *) sp->vtt;
532 vtt->set_x_input_parameter(sp);
535 void vg_ycontrol_set(GtkWidget *wid, tX_seqpar *sp)
537 vtt_class *vtt=(vtt_class *) sp->vtt;
538 vtt->set_y_input_parameter(sp);
541 void vg_control_menu_popup(vtt_class *vtt, int axis)
543 list <tX_seqpar *> :: iterator sp;
544 vtt_gui *g=&vtt->gui;
547 if (g->par_menu) gtk_object_destroy(GTK_OBJECT(g->par_menu));
548 g->par_menu=gtk_menu_new();
550 item = gtk_menu_item_new_with_label("Nothing");
551 gtk_menu_append(GTK_MENU(g->par_menu), item);
552 gtk_widget_show(item);
553 if (axis) gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_xcontrol_dis), vtt);
554 else gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_ycontrol_dis), vtt);
557 for (sp=tX_seqpar::all.begin(); sp!=tX_seqpar::all.end(); sp++)
559 if (((*sp)->is_mappable) && ((*sp)->vtt) == (void*) vtt)
561 item = gtk_menu_item_new_with_label((*sp)->get_name());
562 gtk_menu_append(GTK_MENU(g->par_menu), item);
563 gtk_widget_show(item);
564 if (axis) gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_xcontrol_set), (void*) (*sp));
565 else gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(vg_ycontrol_set), (void*) (*sp));
568 gtk_menu_popup (GTK_MENU(g->par_menu), NULL, NULL, NULL, NULL, 0, 0);
571 void vg_xcontrol_popup(GtkWidget *wid, vtt_class *vtt)
573 vg_control_menu_popup(vtt, 1);
576 void vg_ycontrol_popup(GtkWidget *wid, vtt_class *vtt)
578 vg_control_menu_popup(vtt, 0);
581 static vtt_class * fx_vtt;
583 void new_effect(GtkWidget *wid, LADSPA_Plugin *plugin)
585 fx_vtt->add_effect(plugin);
588 void fx_button_pressed(GtkWidget *wid, vtt_class *vtt)
590 vtt_gui *g=&vtt->gui;
593 LADSPA_Plugin *plugin;
595 char oldfile[1024]="";
598 fx_vtt=vtt; /* AAAAARGH - Long live ugly code */
600 if (g->ladspa_menu) gtk_object_destroy(GTK_OBJECT(g->ladspa_menu));
601 g->ladspa_menu=gtk_menu_new();
603 for (i=0; i<LADSPA_Plugin::getPluginCount(); i++)
605 plugin=LADSPA_Plugin::getPluginByIndex(i);
606 if (strcmp(plugin->get_file_name(), oldfile))
608 strcpy(oldfile, plugin->get_file_name());
609 item = gtk_menu_item_new_with_label(oldfile);
610 submenu=gtk_menu_new();
611 gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), submenu);
612 gtk_menu_append(GTK_MENU(g->ladspa_menu), item);
613 gtk_widget_show(item);
615 sprintf(buffer, "%s - [%i, %s]", plugin->getName(), plugin->getUniqueID(), plugin->getLabel());
616 item=gtk_menu_item_new_with_label(buffer);
617 gtk_menu_append(GTK_MENU(submenu), item);
618 gtk_widget_show(item);
619 gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(new_effect), plugin);
622 gtk_menu_popup (GTK_MENU(g->ladspa_menu), NULL, NULL, NULL, NULL, 0, 0);
625 #define connect_entry(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "activate", (GtkSignalFunc) func, (void *) vtt);
626 #define connect_adj(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "value_changed", (GtkSignalFunc) func, (void *) vtt);
627 #define connect_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "clicked", (GtkSignalFunc) func, (void *) vtt);
628 #define connect_press_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "pressed", (GtkSignalFunc) func, (void *) vtt);
629 #define connect_rel_button(wid, func); gtk_signal_connect(GTK_OBJECT(g->wid), "released", (GtkSignalFunc) func, (void *) vtt);
631 GtkWidget *vg_create_fx_bar(vtt_class *vtt, vtt_fx *effect, int showdel);
633 void gui_connect_signals(vtt_class *vtt)
635 vtt_gui *g=&vtt->gui;
637 connect_entry(name, name_changed);
638 connect_adj(volume, volume_changed);
639 /* connect_button(edit, edit_vtt_buffer);
640 connect_button(reload, reload_vtt_buffer);*/
641 connect_adj(pitch, pitch_changed);
642 connect_adj(pan, pan_changed);
643 connect_button(file, load_file);
645 connect_button(del, delete_vtt);
646 connect_button(trigger, trigger_vtt);
647 connect_button(stop, stop_vtt);
648 connect_button(autotrigger, autotrigger_toggled);
649 connect_button(loop, loop_toggled);
650 connect_button(sync_master, master_setup);
651 connect_button(sync_client, client_setup);
652 connect_adj(cycles, client_setup_number);
653 connect_button(fx_button, fx_button_pressed);
655 connect_button(lp_enable, lp_enabled);
656 connect_adj(lp_gain, lp_gain_changed);
657 connect_adj(lp_reso, lp_reso_changed);
658 connect_adj(lp_freq, lp_freq_changed);
660 connect_button(ec_enable, ec_enabled);
661 connect_adj(ec_length, ec_length_changed);
662 connect_adj(ec_feedback, ec_feedback_changed);
663 connect_adj(ec_pan, ec_pan_changed);
664 connect_adj(ec_volume, ec_volume_changed);
665 connect_button(x_control, vg_xcontrol_popup);
666 connect_button(y_control, vg_ycontrol_popup);
668 connect_button(control_minimize, minimize_control_panel);
669 connect_button(audio_minimize, minimize_audio_panel);
671 static GtkTargetEntry drop_types [] = {
672 { "text/uri-list", 0, 0}
674 static gint n_drop_types = sizeof (drop_types) / sizeof(drop_types[0]);
676 gtk_drag_dest_set (GTK_WIDGET (g->file), (GtkDestDefaults) (GTK_DEST_DEFAULT_MOTION |GTK_DEST_DEFAULT_HIGHLIGHT |GTK_DEST_DEFAULT_DROP),
677 drop_types, n_drop_types,
680 gtk_signal_connect (GTK_OBJECT (g->file), "drag_data_received",
681 GTK_SIGNAL_FUNC(drop_file), (void *) vtt);
683 gtk_drag_dest_set (GTK_WIDGET (g->display), (GtkDestDefaults) (GTK_DEST_DEFAULT_MOTION |GTK_DEST_DEFAULT_HIGHLIGHT |GTK_DEST_DEFAULT_DROP),
684 drop_types, n_drop_types,
687 gtk_signal_connect (GTK_OBJECT (g->display), "drag_data_received",
688 GTK_SIGNAL_FUNC(drop_file), (void *) vtt);
692 void build_vtt_gui(vtt_class *vtt)
698 char nice_name[FILENAME_BUTTON_MAX];
707 /* Building Audio Box */
708 g->audio_box=gtk_vbox_new(FALSE,2);
709 gtk_widget_show(g->audio_box);
711 tempbox2=gtk_hbox_new(FALSE,2);
712 gtk_widget_show(tempbox2);
713 gtk_box_pack_start(GTK_BOX(g->audio_box), tempbox2, WID_FIX);
715 tempbox=gtk_hbox_new(TRUE,2);
716 gtk_widget_show(tempbox);
717 gtk_box_pack_start(GTK_BOX(tempbox2), tempbox, WID_DYN);
720 g->audio_minimize=gtk_button_new();
721 pixmap=tx_pixmap_widget(TX_ICON_MINIMIZE_PANEL);
722 gtk_container_add (GTK_CONTAINER (g->audio_minimize), pixmap);
723 gtk_box_pack_end(GTK_BOX(tempbox2), g->audio_minimize, WID_FIX);
724 gtk_widget_show(pixmap);
725 gtk_widget_show(g->audio_minimize);
728 g->audio_label=gtk_label_new(vtt->name);
729 gtk_misc_set_alignment(GTK_MISC(g->audio_label), 0.1, 0.5);
730 gtk_widget_show(g->audio_label);
731 gtk_box_pack_start(GTK_BOX(tempbox), g->audio_label, WID_DYN);
733 /*dummy=gtk_vseparator_new();
734 gtk_widget_show(dummy);
735 gtk_box_pack_start(GTK_BOX(tempbox), dummy, WID_FIX);*/
737 nicer_filename(nice_name, vtt->filename);
738 g->file = gtk_button_new_with_label(nice_name);
739 gtk_widget_show(g->file);
740 gui_set_tooltip(g->file, "Click here to load an audiofile into this turntable. As an alternative you may drop an audiofile over this button or the audio-data display.");
741 gtk_box_pack_start(GTK_BOX(tempbox), g->file, WID_DYN);
743 /*g->edit=tx_xpm_button_new(TX_ICON_EDIT, "Edit", 0);
744 gtk_widget_show(g->edit);
745 gui_set_tooltip(g->edit, "Click this button to run the soundfile editor for the audiofile loaded into this turntable. You can configure which soundfile editor to use in the Options dialog.");
746 gtk_box_pack_start(GTK_BOX(tempbox), g->edit, WID_FIX);
748 g->reload=tx_xpm_button_new(TX_ICON_RELOAD, "Reload", 0);
749 gtk_widget_show(g->reload);
750 gui_set_tooltip(g->reload, "Click here to reload the audiofile loaded into this turntable.");
751 gtk_box_pack_start(GTK_BOX(tempbox), g->reload, WID_FIX);*/
753 /*dummy=gtk_vseparator_new();
754 gtk_widget_show(dummy);
755 gtk_box_pack_start(GTK_BOX(tempbox), dummy, WID_FIX);
757 dummy=gtk_label_new("X:");
758 gtk_widget_show(dummy);
759 gtk_box_pack_start(GTK_BOX(tempbox), dummy, WID_FIX);
761 g->x_control=gtk_button_new_with_label(vtt->x_par->get_name());
762 gtk_widget_show(g->x_control);
763 gui_set_tooltip(g->x_control, "Select which parameter should be controlled for this turntable (in grab mode) by mouse motion (x-axis: left <-> right).");
764 gtk_box_pack_start(GTK_BOX(tempbox), g->x_control, WID_DYN);
766 dummy=gtk_label_new("Y:");
767 gtk_widget_show(dummy);
768 gtk_box_pack_start(GTK_BOX(tempbox), dummy, WID_FIX);*/
770 g->y_control=gtk_button_new_with_label(vtt->y_par->get_name());
771 gtk_widget_show(g->y_control);
772 gui_set_tooltip(g->y_control, "Select which parameter should be controlled for this turntable (in grab mode) by mouse motion (x-axis: up <-> down).");
774 gtk_box_pack_start(GTK_BOX(tempbox), g->y_control, WID_DYN);
776 g->display=gtk_tx_new(vtt->buffer, vtt->samples_in_buffer);
777 gtk_box_pack_start(GTK_BOX(g->audio_box), g->display, WID_DYN);
778 gtk_widget_show(g->display);
780 /* Building Control Box */
782 g->control_box=gtk_vbox_new(FALSE,2);
783 gtk_widget_show(g->control_box);
785 tempbox2=gtk_hbox_new(FALSE, 2);
786 gtk_widget_show(tempbox2);
787 gtk_box_pack_start(GTK_BOX(g->control_box), tempbox2, WID_FIX);
789 g->control_label=gtk_label_new(vtt->name);
790 gtk_widget_show(g->control_label);
791 gtk_box_pack_start(GTK_BOX(tempbox2), g->control_label, WID_DYN);
793 g->control_minimize=gtk_button_new();
794 pixmap=tx_pixmap_widget(TX_ICON_MINIMIZE_PANEL);
795 gtk_container_add (GTK_CONTAINER (g->control_minimize), pixmap);
796 gtk_box_pack_end(GTK_BOX(tempbox2), g->control_minimize, WID_FIX);
797 gtk_widget_show(pixmap);
798 gtk_widget_show(g->control_minimize);
800 g->scrolled_win=gtk_scrolled_window_new (NULL, NULL);
801 gtk_container_set_border_width (GTK_CONTAINER (g->scrolled_win), 0);
802 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (g->scrolled_win),
803 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
804 gtk_widget_show(g->scrolled_win);
805 gtk_box_pack_start(GTK_BOX(g->control_box), g->scrolled_win, WID_DYN);
807 g->control_subbox=gtk_vbox_new(FALSE,0);
808 gtk_scrolled_window_add_with_viewport (
809 GTK_SCROLLED_WINDOW (g->scrolled_win), g->control_subbox);
810 gtk_widget_show(g->control_subbox);
815 tX_panel *p=new tX_panel("Main", g->control_subbox);
818 g->name = gtk_entry_new_with_max_length(256);
819 gtk_entry_set_text(GTK_ENTRY(g->name), vtt->name);
820 p->add_client_widget(g->name);
821 gui_set_tooltip(g->name, "Enter the turntable's name here.");
822 gtk_widget_set_usize(g->name, 40, g->name->requisition.height);
824 g->del=gtk_button_new_with_label("Delete");
825 gui_set_tooltip(g->del, "Click here to annihilate this turntable. All events recorded for this turntable will be erased, too.");
826 p->add_client_widget(g->del);
828 // g->show_audio=gtk_toggle_button_new_with_label("Show Audio");
829 // p->add_client_widget(g->show_audio);
831 gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
833 p=new tX_panel("Trigger", g->control_subbox);
836 g->trigger=gtk_button_new_with_label("Trigger!");
837 gui_set_tooltip(g->trigger, "Click here to trigger this turntable right now. If the audio engine is disabled this turntable will be triggerd as soon as the engine is turned on.");
838 p->add_client_widget(g->trigger);
840 g->stop=gtk_button_new_with_label("Stop.");
841 gui_set_tooltip(g->stop, "Stop this turntable's playback.");
842 p->add_client_widget(g->stop);
844 g->autotrigger=gtk_check_button_new_with_label("Auto");
845 p->add_client_widget(g->autotrigger);
846 gui_set_tooltip(g->autotrigger, "If turned on, this turntable will be automagically triggered whenever the audio engine is turned on.");
847 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->autotrigger), vtt->autotrigger);
849 g->loop=gtk_check_button_new_with_label("Loop");
850 p->add_client_widget(g->loop);
851 gui_set_tooltip(g->loop, "Enable this option to make the turntable loop the audio data.");
852 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->loop), vtt->loop);
854 g->sync_master=gtk_check_button_new_with_label("Master");
855 p->add_client_widget(g->sync_master);
856 gui_set_tooltip(g->sync_master, "Click here to make this turntable the sync-master. All turntables marked as sync-clients will be (re-)triggered in relation to the sync-master. Note that only *one* turntable can be the sync-master.");
857 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->sync_master), vtt->is_sync_master);
859 g->sync_client=gtk_check_button_new_with_label("Client");
860 p->add_client_widget(g->sync_client);
861 gui_set_tooltip(g->sync_client, "If enabled this turntable will be (re-)triggerd in relation to the sync-master turntable.");
862 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->sync_client), vtt->is_sync_client);
864 g->cycles=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->sync_cycles, 0, 10.0, 1,1,1));
865 dummy=gtk_spin_button_new(g->cycles, 1.0, 0);
866 p->add_client_widget(dummy);
867 gui_set_tooltip(dummy, "Determines how often a sync-client turntable gets triggered. 0 -> this turntable will be triggered with every trigger of the sync-master table, 1 -> the table will be triggered every 2nd master trigger and so on.");
869 gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
871 dummy=gtk_button_new_with_label("FX");
872 gtk_widget_show(dummy);
874 gui_set_tooltip(g->fx_button, "Click here to load a LADSPA plugin. You will get a menu from which you can choose which plugin to load.");
875 gtk_box_pack_start(GTK_BOX(g->control_subbox), dummy, WID_FIX);
879 p=new tX_panel("Lowpass", g->control_subbox);
882 g->lp_enable=gtk_check_button_new_with_label("Enable");
883 gui_set_tooltip(g->lp_enable, "Click here to enable the built-in lowpass effect.");
884 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->lp_enable), vtt->lp_enable);
885 p->add_client_widget(vg_create_fx_bar(vtt, vtt->lp_fx, 0));
887 p->add_client_widget(g->lp_enable);
889 g->lp_gain=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_gain, 0, 2, 0.1, 0.01, 0.01));
890 g->lp_reso=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_reso, 0, 0.99, 0.1, 0.01, 0.01));
891 g->lp_freq=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->lp_freq, 0, 1, 0.1, 0.01, 0.01));
893 g->lp_gaind=new tX_extdial("Input Gain", g->lp_gain);
894 p->add_client_widget(g->lp_gaind->get_widget());
895 gui_set_tooltip(g->lp_gaind->get_entry(), "Adjust the input gain. with this parameter you can either amplify or damp the input-signal for the lowpass effect.");
897 g->lp_freqd=new tX_extdial("Frequency", g->lp_freq);
898 p->add_client_widget(g->lp_freqd->get_widget());
899 gui_set_tooltip(g->lp_freqd->get_entry(), "Adjust the cutoff frequency of the lowpass filter. 0 is 0 Hz, 1 is 22.1 kHz.");
901 g->lp_resod=new tX_extdial("Resonance", g->lp_reso);
902 p->add_client_widget(g->lp_resod->get_widget());
903 gui_set_tooltip(g->lp_resod->get_entry(), "Adjust the resonance of the lowpass filter. This value determines how much the signal at the cutoff frequency will be amplified.");
905 gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
909 p=new tX_panel("Echo", g->control_subbox);
912 p->add_client_widget(vg_create_fx_bar(vtt, vtt->ec_fx, 0));
914 g->ec_enable=gtk_check_button_new_with_label("Enable");
915 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g->ec_enable), vtt->ec_enable);
916 p->add_client_widget(g->ec_enable);
917 gui_set_tooltip(g->ec_enable, "Enable the built-in echo effect.");
919 g->ec_length=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_length, 0, 1, 0.1, 0.01, 0.001));
920 g->ec_feedback=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_feedback, 0, 1, 0.1, 0.01, 0.001));
921 g->ec_pan=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_pan, -1.0, 1, 0.1, 0.01, 0.001));
922 g->ec_volume=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->ec_volume, 0.0, 3.0, 0.1, 0.01, 0.001));
924 g->ec_lengthd=new tX_extdial("Duration", g->ec_length);
925 p->add_client_widget(g->ec_lengthd->get_widget());
926 gui_set_tooltip(g->ec_lengthd->get_entry(), "Adjust the length of the echo buffer.");
928 g->ec_feedbackd=new tX_extdial("Feedback", g->ec_feedback);
929 p->add_client_widget(g->ec_feedbackd->get_widget());
930 gui_set_tooltip(g->ec_feedbackd->get_entry(), "Adjust the feedback of the echo effect. Note that a value of 1 will result in a constant signal.");
932 g->ec_volumed=new tX_extdial("Volume", g->ec_volume);
933 p->add_client_widget(g->ec_volumed->get_widget());
934 gui_set_tooltip(g->ec_volumed->get_entry(), "Adjust the volume of the echo effect.");
936 g->ec_pand=new tX_extdial("Pan", g->ec_pan);
937 p->add_client_widget(g->ec_pand->get_widget());
938 gui_set_tooltip(g->ec_pand->get_entry(), "Adjust the panning of the echo effect.");
940 gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
944 tempbox=gtk_hbox_new(FALSE,2);
945 gtk_widget_show(tempbox);
946 gtk_box_pack_end(GTK_BOX(g->control_box), tempbox, WID_FIX);
948 tempbox2=gtk_vbox_new(FALSE,0);
949 gtk_widget_show(tempbox2);
950 gtk_box_pack_start(GTK_BOX(tempbox), tempbox2, WID_FIX);
952 g->pitch=GTK_ADJUSTMENT(gtk_adjustment_new(vtt->rel_pitch, -3, +3, 0.1, 0.01, 0.001));
953 g->pan=GTK_ADJUSTMENT(gtk_adjustment_new(0, -1, 1, 0.1, 0.01, 0.001));
955 g->pitchd=new tX_extdial("Pitch", g->pitch);
956 gui_set_tooltip(g->pitchd->get_entry(), "Adjust this turntable's pitch.");
958 gtk_box_pack_start(GTK_BOX(tempbox2), g->pitchd->get_widget(), WID_FIX);
960 g->pand=new tX_extdial("Pan", g->pan);
961 gtk_box_pack_start(GTK_BOX(tempbox2), g->pand->get_widget(), WID_FIX);
962 gui_set_tooltip(g->pand->get_entry(), "Specifies the position of this turntable within the stereo spectrum: -1 -> left, 0-> center, 1->right.");
964 tempbox3=gtk_hbox_new(FALSE,2);
965 gtk_widget_show(tempbox3);
967 g->mute=gtk_check_button_new_with_label("M");
968 gtk_box_pack_start(GTK_BOX(tempbox3), g->mute, WID_FIX);
969 gtk_signal_connect(GTK_OBJECT(g->mute),"clicked", (GtkSignalFunc) mute_volume, vtt);
970 gtk_widget_show(g->mute);
971 gui_set_tooltip(g->mute, "Mute this turntable's mixer output.");
973 g->solo=gtk_check_button_new_with_label("S");
974 gtk_box_pack_start(GTK_BOX(tempbox3), g->solo, WID_FIX);
975 gtk_signal_connect(GTK_OBJECT(g->solo),"clicked", (GtkSignalFunc) solo_vtt, vtt);
976 gtk_widget_show(g->solo);
977 gui_set_tooltip(g->mute, "Allow only this and other solo-switched turntabels' signal to be routed to the mixer.");
979 gtk_box_pack_start(GTK_BOX(tempbox2), tempbox3, WID_FIX);
981 tempbox2=gtk_hbox_new(FALSE,0);
982 gtk_widget_show(tempbox2);
983 gtk_box_pack_start(GTK_BOX(tempbox), tempbox2, WID_FIX);
985 g->volume=GTK_ADJUSTMENT(gtk_adjustment_new(2.0-vtt->rel_volume, 0, 2, 0.01, 0.01, 0.01));
986 dummy=gtk_vscale_new(GTK_ADJUSTMENT(g->volume));
987 gtk_scale_set_draw_value(GTK_SCALE(dummy), False);
988 gui_set_tooltip(dummy, "Adjust this turntable's volume.");
990 gtk_box_pack_start(GTK_BOX(tempbox2), dummy, WID_FIX);
991 gtk_widget_show(dummy);
993 g->flash=gtk_tx_flash_new();
994 gtk_box_pack_start(GTK_BOX(tempbox2), g->flash, WID_FIX);
995 gtk_widget_show(g->flash);
999 gui_connect_signals(vtt);
1001 g->audio_minimized_panel_bar_button=NULL;
1002 g->control_minimized_panel_bar_button=NULL;
1005 void fx_up(GtkWidget *wid, vtt_fx *effect)
1009 vtt=(vtt_class*)effect->get_vtt();
1010 vtt->effect_up(effect);
1013 void fx_down(GtkWidget *wid, vtt_fx *effect)
1017 vtt=(vtt_class*)effect->get_vtt();
1018 vtt->effect_down(effect);
1021 void fx_kill(GtkWidget *wid, vtt_fx_ladspa *effect)
1025 vtt=(vtt_class*)effect->get_vtt();
1026 vtt->effect_remove(effect);
1029 GtkWidget *vg_create_fx_bar(vtt_class *vtt, vtt_fx *effect, int showdel)
1035 box=gtk_hbox_new(FALSE,0);
1039 button=gtk_button_new();
1040 pixmap=tx_pixmap_widget(TX_ICON_FX_CLOSE);
1041 gtk_container_add (GTK_CONTAINER (button), pixmap);
1042 gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1043 gtk_widget_show(pixmap);
1044 gtk_widget_show(button);
1045 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_kill, (void *) effect);
1048 button=gtk_button_new();
1049 pixmap=tx_pixmap_widget(TX_ICON_FX_DOWN);
1050 gtk_container_add (GTK_CONTAINER (button), pixmap);
1051 gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1052 gtk_widget_show(pixmap);
1053 gtk_widget_show(button);
1054 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_down, (void *) effect);
1056 button=gtk_button_new();
1057 pixmap=tx_pixmap_widget(TX_ICON_FX_UP);
1058 gtk_container_add (GTK_CONTAINER (button), pixmap);
1059 gtk_box_pack_end(GTK_BOX(box), button, WID_FIX);
1060 gtk_widget_show(pixmap);
1061 gtk_widget_show(button);
1062 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) fx_up, (void *) effect);
1064 gtk_widget_show(box);
1070 int gtk_box_get_widget_pos(GtkBox *box, GtkWidget *child)
1075 list = box->children;
1078 GtkBoxChild *child_info;
1079 child_info = (GtkBoxChild *) list->data;
1080 if (child_info->widget == child)
1082 list = list->next; i++;
1087 void vg_move_fx_panel_up(GtkWidget *wid, vtt_class *vtt)
1089 int pos=gtk_box_get_widget_pos(GTK_BOX(vtt->gui.control_subbox), wid);
1090 gtk_box_reorder_child(GTK_BOX(vtt->gui.control_subbox), wid, pos-1);
1093 void vg_move_fx_panel_down(GtkWidget *wid, vtt_class *vtt)
1095 int pos=gtk_box_get_widget_pos(GTK_BOX(vtt->gui.control_subbox), wid);
1096 gtk_box_reorder_child(GTK_BOX(vtt->gui.control_subbox), wid, pos+1);
1099 void vg_show_fx_info(GtkWidget *wid, vtt_fx *effect)
1101 tx_l_note(effect->get_info_string());
1104 void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin)
1111 list <tX_seqpar_vttfx *> :: iterator sp;
1113 strcpy(buffer, plugin->getLabel());
1114 if (strlen(buffer) > 6)
1122 p=new tX_panel(buffer, g->control_subbox);
1124 p->add_client_widget(vg_create_fx_bar(vtt, effect, 1));
1126 for (sp = effect->controls.begin(); sp != effect->controls.end(); sp++)
1128 p->add_client_widget((*sp)->get_widget());
1131 gtk_signal_connect(GTK_OBJECT(p->get_labelbutton()), "clicked", (GtkSignalFunc) vg_show_fx_info, (void *) effect);
1132 gui_set_tooltip(p->get_labelbutton(), "Click here to learn more about this plugin.");
1133 effect->set_panel_widget(p->get_widget());
1134 effect->set_panel(p);
1136 gtk_box_pack_start(GTK_BOX(g->control_subbox), p->get_widget(), WID_FIX);
1139 void gui_set_name(vtt_class *vtt, char *newname)
1141 gtk_label_set_text(GTK_LABEL(vtt->gui.audio_label), newname);
1142 gtk_label_set_text(GTK_LABEL(vtt->gui.control_label), newname);
1143 gtk_entry_set_text(GTK_ENTRY(vtt->gui.name), newname);
1145 if (vtt->gui.audio_minimized_panel_bar_button!=NULL) {
1146 gtk_label_set_text(GTK_LABEL(vtt->gui.audio_minimized_panel_bar_label), newname);
1149 if (vtt->gui.control_minimized_panel_bar_button!=NULL) {
1150 gtk_label_set_text(GTK_LABEL(vtt->gui.control_minimized_panel_bar_label), newname);
1154 void gui_set_filename (vtt_class *vtt, char *newname)
1157 gtk_button_set_label(GTK_BUTTON(vtt->gui.file), newname);
1159 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), newname);
1163 void gui_update_display(vtt_class *vtt)
1165 nicer_filename(global_filename_buffer, vtt->filename);
1167 gtk_button_set_label(GTK_BUTTON(vtt->gui.file), global_filename_buffer);
1169 gtk_label_set(GTK_LABEL(GTK_BUTTON(vtt->gui.file)->child), global_filename_buffer);
1171 gtk_tx_set_data(GTK_TX(vtt->gui.display), vtt->buffer, vtt->samples_in_buffer);
1174 void gui_hide_control_panel(vtt_class *vtt, bool hide) {
1176 gtk_widget_hide(vtt->gui.control_box);
1177 vtt->gui.control_minimized_panel_bar_button=tx_xpm_button_new(TX_ICON_MIN_CONTROL, vtt->name, 0, &vtt->gui.control_minimized_panel_bar_label);
1178 gtk_signal_connect(GTK_OBJECT(vtt->gui.control_minimized_panel_bar_button), "clicked", (GtkSignalFunc) unminimize_control_panel, vtt);
1179 gtk_widget_show(vtt->gui.control_minimized_panel_bar_button);
1180 add_to_panel_bar(vtt->gui.control_minimized_panel_bar_button);
1182 gtk_widget_show(vtt->gui.control_box);
1183 remove_from_panel_bar(vtt->gui.control_minimized_panel_bar_button);
1184 gtk_widget_destroy(vtt->gui.control_minimized_panel_bar_button);
1185 vtt->gui.control_minimized_panel_bar_button=NULL;
1189 void gui_hide_audio_panel(vtt_class *vtt, bool hide) {
1191 gtk_widget_hide(vtt->gui.audio_box);
1192 vtt->gui.audio_minimized_panel_bar_button=tx_xpm_button_new(TX_ICON_MIN_AUDIO, vtt->name, 0, &vtt->gui.audio_minimized_panel_bar_label);
1193 gtk_signal_connect(GTK_OBJECT(vtt->gui.audio_minimized_panel_bar_button), "clicked", (GtkSignalFunc) unminimize_audio_panel, vtt);
1194 gtk_widget_show(vtt->gui.audio_minimized_panel_bar_button);
1195 add_to_panel_bar(vtt->gui.audio_minimized_panel_bar_button);
1197 gtk_widget_show(vtt->gui.audio_box);
1198 remove_from_panel_bar(vtt->gui.audio_minimized_panel_bar_button);
1199 gtk_widget_destroy(vtt->gui.audio_minimized_panel_bar_button);
1200 vtt->gui.audio_minimized_panel_bar_button=NULL;
1204 void delete_gui(vtt_class *vtt)
1206 if (vtt->gui.control_minimized_panel_bar_button!=NULL) gui_hide_control_panel(vtt, false);
1207 if (vtt->gui.audio_minimized_panel_bar_button!=NULL) gui_hide_audio_panel(vtt, false);
1209 delete vtt->gui.main_panel;
1210 delete vtt->gui.trigger_panel;
1212 delete vtt->gui.pitchd;
1213 delete vtt->gui.pand;
1215 delete vtt->gui.lp_gaind;
1216 delete vtt->gui.lp_resod;
1217 delete vtt->gui.lp_freqd;
1218 delete vtt->gui.lp_panel;
1220 delete vtt->gui.ec_lengthd;
1221 delete vtt->gui.ec_feedbackd;
1222 delete vtt->gui.ec_volumed;
1223 delete vtt->gui.ec_pand;
1224 delete vtt->gui.ec_panel;
1226 gtk_widget_destroy(vtt->gui.control_box);
1227 gtk_widget_destroy(vtt->gui.audio_box);
1230 void update_all_vtts()
1232 list <vtt_class *> :: iterator vtt;
1235 for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1237 if ((*vtt)->is_playing)
1239 gtk_tx_update_pos_display(GTK_TX((*vtt)->gui.display), (*vtt)->pos_i, (*vtt)->mute);
1241 temp=(*vtt)->max_value*(*vtt)->res_volume*vtt_class::vol_channel_adjust;
1242 (*vtt)->max_value=0;
1243 gtk_tx_flash_set_level((*vtt)->gui.flash, temp);
1249 void cleanup_vtt(vtt_class *vtt)
1251 gtk_tx_cleanup_pos_display(GTK_TX(vtt->gui.display));
1253 gtk_tx_flash_set_level(vtt->gui.flash, 0.0);
1254 gtk_tx_flash_clear(vtt->gui.flash);
1258 void cleanup_all_vtts()
1260 list <vtt_class *> :: iterator vtt;
1262 for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1264 if ((*vtt)->buffer) gtk_tx_cleanup_pos_display(GTK_TX((*vtt)->gui.display));
1266 gtk_tx_flash_set_level((*vtt)->gui.flash, 0.0);
1267 gtk_tx_flash_clear((*vtt)->gui.flash);
1272 void gui_clear_master_button(vtt_class *vtt)
1274 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(vtt->gui.sync_master), 0);
1277 void gui_show_frame(vtt_class *vtt, int show)
1279 gtk_tx_show_frame(GTK_TX(vtt->gui.display), show);
1282 #define vgui (*vtt)->gui
1285 void vg_enable_critical_buttons(int enable)
1287 list <vtt_class *> :: iterator vtt;
1288 for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1290 gtk_widget_set_sensitive(vgui.del, enable);
1291 gtk_widget_set_sensitive(vgui.sync_master, enable);
1296 void vg_init_all_non_seqpars()
1298 list <vtt_class *> :: iterator vtt;
1300 for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
1302 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((*vtt)->gui.autotrigger), (*vtt)->autotrigger);
1303 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((*vtt)->gui.sync_master), (*vtt)->is_sync_master);