1 /* hexter DSSI software synthesizer GUI
2  *
3  * Copyright (C) 2004, 2009, 2012 Sean Bolton and others.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be
11  * useful, but WITHOUT ANY WARRANTY; without even the implied
12  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13  * PURPOSE.  See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public
16  * License along with this program; if not, write to the Free
17  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301 USA.
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #  include <config.h>
23 #endif
24 
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtk.h>
30 
31 #include "hexter.h"
32 #include "gui_callbacks.h"
33 #include "gui_interface.h"
34 #include "gui_images.h"
35 #include "gui_patch_edit.h"
36 
37 GtkWidget *main_window;
38 GtkObject *test_note_key_adj;
39 GtkObject *test_note_velocity_adj;
40 GtkObject *tuning_adj;
41 GtkObject *volume_adj;
42 GtkObject *polyphony_instance_adj;
43 GtkObject *polyphony_global_adj;
44 GtkWidget *monophonic_option_menu;
45 GtkWidget *compat059_button;
46 #ifdef HEXTER_DEBUG_CONTROL
47 GtkObject *test_adj;
48 #endif
49 GtkWidget *sysex_channel_label;
50 GtkWidget *sysex_channel_spin;
51 GtkWidget *sysex_status_label;
52 GtkWidget *performance_frame;
53 GtkObject *performance_spin_adjustments[6];
54 GtkWidget *performance_assign_widgets[4][3];
55 
56 GtkWidget *about_window;
57 GtkWidget *about_label;
58 
59 GtkWidget *import_file_selection;
60 GtkWidget *import_file_position_window;
61 GtkObject *import_file_position_spin_adj;
62 GtkWidget *import_file_position_name_label;
63 
64 GtkWidget *notice_window;
65 GtkWidget *notice_label_1;
66 GtkWidget *notice_label_2;
67 
68 GtkWidget *export_file_type_window;
69 GtkWidget *export_file_type_sysex;
70 GtkObject *export_file_start_spin_adj;
71 GtkWidget *export_file_start_name;
72 GtkWidget *export_file_end_label;
73 GtkWidget *export_file_end_spin;
74 GtkObject *export_file_end_spin_adj;
75 GtkWidget *export_file_end_name;
76 GtkWidget *export_file_selection;
77 
78 GtkWidget *edit_save_position_window;
79 GtkObject *edit_save_position_spin_adj;
80 GtkWidget *edit_save_position_name_label;
81 
82 GtkWidget *patches_clist;
83 
84 const char *performance_spin_names[6] = {
85     "pitch_bend_range",
86     "portamento_time",
87     "mod_wheel_sensitivity",
88     "foot_sensitivity",
89     "pressure_sensitivity",
90     "breath_sensitivity",
91 };
92 
93 const char *performance_assign_names[4] = {
94     "mod_wheel_assign",
95     "foot_assign",
96     "pressure_assign",
97     "breath_assign"
98 };
99 
100 void
set_window_title(GtkWidget * window,const char * tag,const char * text)101 set_window_title(GtkWidget *window, const char *tag, const char *text)
102 {
103     char *title = (char *)malloc(strlen(tag) + strlen(text) + 2);
104     sprintf(title, "%s %s", tag, text);
105     gtk_window_set_title (GTK_WINDOW (window), title);
106     free(title);
107 }
108 
109 void
create_performance_spin(GtkWidget * window,const char * text,GtkWidget * table,int row,int parameter,int max,int init)110 create_performance_spin(GtkWidget *window, const char *text, GtkWidget *table,
111                         int row, int parameter, int max, int init)
112 {
113     GtkWidget *label;
114     GtkObject *spin_button_adj;
115     GtkWidget *spin_button;
116 
117     label = gtk_label_new (text);
118     gtk_widget_ref (label);
119     gtk_object_set_data_full (GTK_OBJECT (window), "performance label", label,
120                               (GtkDestroyNotify) gtk_widget_unref);
121     gtk_widget_show (label);
122     gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1,
123                       (GtkAttachOptions) (GTK_FILL),
124                       (GtkAttachOptions) (0), 0, 0);
125     gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
126     gtk_misc_set_padding (GTK_MISC (label), 2, 0);
127 
128     spin_button_adj = gtk_adjustment_new (init, 0, max, 1, 10, 0);
129     performance_spin_adjustments[parameter] = spin_button_adj;
130     spin_button = gtk_spin_button_new (GTK_ADJUSTMENT (spin_button_adj), 1, 0);
131     gtk_widget_ref (spin_button);
132     gtk_object_set_data_full (GTK_OBJECT (main_window), "performance spin", spin_button,
133                               (GtkDestroyNotify) gtk_widget_unref);
134     gtk_widget_show (spin_button);
135     gtk_table_attach (GTK_TABLE (table), spin_button, 1, 2, row, row + 1,
136                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
137                       (GtkAttachOptions) (GTK_FILL), 0, 0);
138     gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (spin_button), GTK_UPDATE_IF_VALID);
139     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_button), TRUE);
140 
141     gtk_signal_connect (GTK_OBJECT (spin_button_adj), "value_changed",
142                         GTK_SIGNAL_FUNC(on_performance_spin_change),
143                         (gpointer)parameter);
144 }
145 
146 void
create_performance_assign(GtkWidget * window,const char * text,GtkWidget * table,int row,int parameter,int initbits)147 create_performance_assign(GtkWidget *window, const char *text,
148                           GtkWidget *table, int row, int parameter, int initbits)
149 {
150     GtkWidget *label;
151     GtkWidget *hbox;
152     GtkWidget *button;
153 
154     label = gtk_label_new (text);
155     gtk_widget_ref (label);
156     gtk_object_set_data_full (GTK_OBJECT (window), "performance label", label,
157                               (GtkDestroyNotify) gtk_widget_unref);
158     gtk_widget_show (label);
159     gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1,
160                       (GtkAttachOptions) (GTK_FILL),
161                       (GtkAttachOptions) (0), 0, 0);
162     gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
163     gtk_misc_set_padding (GTK_MISC (label), 2, 0);
164 
165     hbox = gtk_hbox_new (FALSE, 0);
166     gtk_widget_ref (hbox);
167     gtk_object_set_data_full (GTK_OBJECT (window), "assign hbox",
168                               hbox, (GtkDestroyNotify) gtk_widget_unref);
169     gtk_widget_show (hbox);
170     gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, row, row + 1,
171                       (GtkAttachOptions) (GTK_FILL),
172                       (GtkAttachOptions) (0), 0, 0);
173     gtk_container_set_border_width (GTK_CONTAINER (hbox), 2);
174 
175     label = gtk_label_new ("P");
176     gtk_widget_ref (label);
177     gtk_object_set_data_full (GTK_OBJECT (window), "assign P label", label,
178                               (GtkDestroyNotify) gtk_widget_unref);
179     gtk_widget_show (label);
180     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
181 
182     button = gtk_check_button_new();
183     performance_assign_widgets[parameter][0] = button;
184     gtk_widget_ref (button);
185     gtk_object_set_data_full (GTK_OBJECT (window), "assign P button", button,
186                               (GtkDestroyNotify) gtk_widget_unref);
187     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 1 ? 1 : 0);
188     gtk_widget_show (button);
189     gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
190     gtk_signal_connect (GTK_OBJECT (button), "toggled",
191                         GTK_SIGNAL_FUNC (on_performance_assign_toggled),
192                         (gpointer)parameter);
193 
194     label = gtk_label_new ("A");
195     gtk_widget_ref (label);
196     gtk_object_set_data_full (GTK_OBJECT (window), "assign A label", label,
197                               (GtkDestroyNotify) gtk_widget_unref);
198     gtk_widget_show (label);
199     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
200 
201     button = gtk_check_button_new();
202     performance_assign_widgets[parameter][1] = button;
203     gtk_widget_ref (button);
204     gtk_object_set_data_full (GTK_OBJECT (window), "assign A button", button,
205                               (GtkDestroyNotify) gtk_widget_unref);
206     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 2 ? 1 : 0);
207     gtk_widget_show (button);
208     gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
209     gtk_signal_connect (GTK_OBJECT (button), "toggled",
210                         GTK_SIGNAL_FUNC (on_performance_assign_toggled),
211                         (gpointer)parameter);
212 
213     label = gtk_label_new ("E");
214     gtk_widget_ref (label);
215     gtk_object_set_data_full (GTK_OBJECT (window), "assign E label", label,
216                               (GtkDestroyNotify) gtk_widget_unref);
217     gtk_widget_show (label);
218     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 1);
219 
220     button = gtk_check_button_new();
221     performance_assign_widgets[parameter][2] = button;
222     gtk_widget_ref (button);
223     gtk_object_set_data_full (GTK_OBJECT (window), "assign E button", button,
224                               (GtkDestroyNotify) gtk_widget_unref);
225     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), initbits & 4 ? 1 : 0);
226     gtk_widget_show (button);
227     gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 1);
228     gtk_signal_connect (GTK_OBJECT (button), "toggled",
229                         GTK_SIGNAL_FUNC (on_performance_assign_toggled),
230                         (gpointer)parameter);
231 }
232 
233 void
create_main_window(const char * tag)234 create_main_window (const char *tag)
235 {
236     GtkWidget *vbox1;
237     GtkWidget *menubar1;
238     GtkWidget *file1;
239     GtkWidget *file1_menu;
240     GtkWidget *menu_import;
241     GtkWidget *menu_export;
242     GtkWidget *separator1;
243     GtkWidget *menu_quit;
244     GtkWidget *edit1;
245     GtkWidget *edit1_menu;
246     GtkWidget *menu_edit;
247     GtkWidget *help1;
248     GtkWidget *help1_menu;
249     GtkWidget *menu_about;
250     GtkWidget *notebook1;
251     GtkWidget *scrolledwindow1;
252     GtkWidget *label45;
253     GtkWidget *label46;
254     GtkWidget *patches_tab_label;
255     GtkWidget *vbox2;
256     GtkWidget *frame12;
257     GtkWidget *table15;
258     GtkWidget *label10;
259     GtkWidget *label10a;
260     GtkWidget *test_note_button;
261     GtkWidget *test_note_key;
262     GtkWidget *test_note_velocity;
263     GtkWidget *frame14;
264     GtkWidget *table16;
265     GtkWidget *tuning;
266     GtkWidget *volume;
267     GtkWidget *mono_mode_off;
268     GtkWidget *mono_mode_on;
269     GtkWidget *mono_mode_once;
270     GtkWidget *mono_mode_both;
271     GtkWidget *optionmenu5_menu;
272     GtkWidget *polyphony_instance;
273     GtkWidget *polyphony_global;
274     GtkWidget *label42;
275     GtkWidget *label43;
276     GtkWidget *label43a;
277     GtkWidget *volume_label;
278     GtkWidget *label44;
279 #ifdef MIDI_ALSA
280     GtkWidget *sysex_enable_button;
281     GtkObject *sysex_channel_spin_adj;
282     GtkWidget *frame15;
283     GtkWidget *frame4;
284     GtkWidget *table3;
285     GtkWidget *label11;
286 #endif /* MIDI_ALSA */
287     GtkWidget *configuration_tab_label;
288     GtkWidget *performance_table;
289     GtkWidget *performance_tab_label;
290     GtkAccelGroup *accel_group;
291 
292     accel_group = gtk_accel_group_new ();
293 
294     main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
295     gtk_object_set_data (GTK_OBJECT (main_window), "main_window", main_window);
296     gtk_window_set_title (GTK_WINDOW (main_window), tag);
297 
298     vbox1 = gtk_vbox_new (FALSE, 0);
299     gtk_widget_ref (vbox1);
300     gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox1", vbox1,
301                               (GtkDestroyNotify) gtk_widget_unref);
302     gtk_widget_show (vbox1);
303     gtk_container_add (GTK_CONTAINER (main_window), vbox1);
304 
305     menubar1 = gtk_menu_bar_new ();
306     gtk_widget_ref (menubar1);
307     gtk_object_set_data_full (GTK_OBJECT (main_window), "menubar1", menubar1,
308                               (GtkDestroyNotify) gtk_widget_unref);
309     gtk_widget_show (menubar1);
310     gtk_box_pack_start (GTK_BOX (vbox1), menubar1, FALSE, FALSE, 0);
311 
312     file1 = gtk_menu_item_new_with_label ("File");
313     gtk_widget_ref (file1);
314     gtk_object_set_data_full (GTK_OBJECT (main_window), "file1", file1,
315                               (GtkDestroyNotify) gtk_widget_unref);
316     gtk_widget_show (file1);
317     gtk_container_add (GTK_CONTAINER (menubar1), file1);
318 
319     file1_menu = gtk_menu_new ();
320     gtk_widget_ref (file1_menu);
321     gtk_object_set_data_full (GTK_OBJECT (main_window), "file1_menu", file1_menu,
322                               (GtkDestroyNotify) gtk_widget_unref);
323     gtk_menu_item_set_submenu (GTK_MENU_ITEM (file1), file1_menu);
324 
325     menu_import = gtk_menu_item_new_with_label ("Import Patch Bank...");
326     gtk_widget_ref (menu_import);
327     gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_import", menu_import,
328                               (GtkDestroyNotify) gtk_widget_unref);
329     gtk_widget_show (menu_import);
330     gtk_container_add (GTK_CONTAINER (file1_menu), menu_import);
331     gtk_widget_add_accelerator (menu_import, "activate", accel_group,
332                                 GDK_O, GDK_CONTROL_MASK,
333                                 GTK_ACCEL_VISIBLE);
334 
335     menu_export = gtk_menu_item_new_with_label ("Export Patch Bank...");
336     gtk_widget_ref (menu_export);
337     gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_export", menu_export,
338                               (GtkDestroyNotify) gtk_widget_unref);
339     gtk_widget_show (menu_export);
340     gtk_container_add (GTK_CONTAINER (file1_menu), menu_export);
341     gtk_widget_add_accelerator (menu_export, "activate", accel_group,
342                                 GDK_S, GDK_CONTROL_MASK,
343                                 GTK_ACCEL_VISIBLE);
344 
345     separator1 = gtk_menu_item_new ();
346     gtk_widget_ref (separator1);
347     gtk_object_set_data_full (GTK_OBJECT (main_window), "separator1", separator1,
348                               (GtkDestroyNotify) gtk_widget_unref);
349     gtk_widget_show (separator1);
350     gtk_container_add (GTK_CONTAINER (file1_menu), separator1);
351     gtk_widget_set_sensitive (separator1, FALSE);
352 
353     menu_quit = gtk_menu_item_new_with_label ("Quit");
354     gtk_widget_ref (menu_quit);
355     gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_quit", menu_quit,
356                               (GtkDestroyNotify) gtk_widget_unref);
357     gtk_widget_show (menu_quit);
358     gtk_container_add (GTK_CONTAINER (file1_menu), menu_quit);
359     gtk_widget_add_accelerator (menu_quit, "activate", accel_group,
360                                 GDK_Q, GDK_CONTROL_MASK,
361                                 GTK_ACCEL_VISIBLE);
362 
363     edit1 = gtk_menu_item_new_with_label ("Edit");
364     gtk_widget_show (edit1);
365     gtk_container_add (GTK_CONTAINER (menubar1), edit1);
366     gtk_menu_item_right_justify (GTK_MENU_ITEM (edit1));
367 
368     edit1_menu = gtk_menu_new ();
369     gtk_menu_item_set_submenu (GTK_MENU_ITEM (edit1), edit1_menu);
370 
371     menu_edit = gtk_menu_item_new_with_label ("Edit Patch...");
372     gtk_widget_show (menu_edit);
373     gtk_container_add (GTK_CONTAINER (edit1_menu), menu_edit);
374     gtk_widget_add_accelerator (menu_edit, "activate", accel_group,
375                                 GDK_E, GDK_CONTROL_MASK,
376                                 GTK_ACCEL_VISIBLE);
377 
378     help1 = gtk_menu_item_new_with_label ("About");
379     gtk_widget_ref (help1);
380     gtk_object_set_data_full (GTK_OBJECT (main_window), "help1", help1,
381                               (GtkDestroyNotify) gtk_widget_unref);
382     gtk_widget_show (help1);
383     gtk_container_add (GTK_CONTAINER (menubar1), help1);
384     gtk_menu_item_right_justify (GTK_MENU_ITEM (help1));
385 
386     help1_menu = gtk_menu_new ();
387     gtk_widget_ref (help1_menu);
388     gtk_object_set_data_full (GTK_OBJECT (main_window), "help1_menu", help1_menu,
389                               (GtkDestroyNotify) gtk_widget_unref);
390     gtk_menu_item_set_submenu (GTK_MENU_ITEM (help1), help1_menu);
391 
392     menu_about = gtk_menu_item_new_with_label ("About hexter");
393     gtk_widget_ref (menu_about);
394     gtk_object_set_data_full (GTK_OBJECT (main_window), "menu_about", menu_about,
395                               (GtkDestroyNotify) gtk_widget_unref);
396     gtk_widget_show (menu_about);
397     gtk_container_add (GTK_CONTAINER (help1_menu), menu_about);
398 
399     notebook1 = gtk_notebook_new ();
400     gtk_widget_ref (notebook1);
401     gtk_object_set_data_full (GTK_OBJECT (main_window), "notebook1", notebook1,
402                               (GtkDestroyNotify) gtk_widget_unref);
403     gtk_widget_show (notebook1);
404     gtk_box_pack_start (GTK_BOX (vbox1), notebook1, TRUE, TRUE, 0);
405 
406     scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
407     gtk_widget_ref (scrolledwindow1);
408     gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow1", scrolledwindow1,
409                               (GtkDestroyNotify) gtk_widget_unref);
410     gtk_widget_show (scrolledwindow1);
411     gtk_container_add (GTK_CONTAINER (notebook1), scrolledwindow1);
412     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
413 
414     patches_clist = gtk_clist_new (2);
415     gtk_widget_ref (patches_clist);
416     gtk_object_set_data_full (GTK_OBJECT (main_window), "patches_clist", patches_clist,
417                               (GtkDestroyNotify) gtk_widget_unref);
418     gtk_widget_show (patches_clist);
419     gtk_container_add (GTK_CONTAINER (scrolledwindow1), patches_clist);
420     gtk_clist_set_column_width (GTK_CLIST (patches_clist), 0, 50);
421     gtk_clist_set_column_width (GTK_CLIST (patches_clist), 1, 80);
422     gtk_clist_column_titles_show (GTK_CLIST (patches_clist));
423 
424     label45 = gtk_label_new ("Prog No");
425     gtk_widget_ref (label45);
426     gtk_object_set_data_full (GTK_OBJECT (main_window), "label45", label45,
427                               (GtkDestroyNotify) gtk_widget_unref);
428     gtk_widget_show (label45);
429     gtk_clist_set_column_widget (GTK_CLIST (patches_clist), 0, label45);
430 
431     label46 = gtk_label_new ("Name");
432     gtk_widget_ref (label46);
433     gtk_object_set_data_full (GTK_OBJECT (main_window), "label46", label46,
434                               (GtkDestroyNotify) gtk_widget_unref);
435     gtk_widget_show (label46);
436     gtk_clist_set_column_widget (GTK_CLIST (patches_clist), 1, label46);
437 
438     patches_tab_label = gtk_label_new ("Patches");
439     gtk_widget_ref (patches_tab_label);
440     gtk_object_set_data_full (GTK_OBJECT (main_window), "patches_tab_label", patches_tab_label,
441                               (GtkDestroyNotify) gtk_widget_unref);
442     gtk_widget_show (patches_tab_label);
443     gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 0), patches_tab_label);
444 
445     /* Configuration tab */
446     vbox2 = gtk_vbox_new (FALSE, 5);
447     gtk_widget_ref (vbox2);
448     gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox2", vbox2,
449                               (GtkDestroyNotify) gtk_widget_unref);
450     gtk_widget_show (vbox2);
451     gtk_container_add (GTK_CONTAINER (notebook1), vbox2);
452     gtk_container_set_border_width (GTK_CONTAINER (vbox2), 5);
453 
454     frame14 = gtk_frame_new ("Synthesizer");
455     gtk_widget_ref (frame14);
456     gtk_object_set_data_full (GTK_OBJECT (main_window), "frame14", frame14,
457                               (GtkDestroyNotify) gtk_widget_unref);
458     gtk_widget_show (frame14);
459     gtk_box_pack_start (GTK_BOX (vbox2), frame14, TRUE, TRUE, 0);
460 
461     table16 = gtk_table_new (2, 6, FALSE);
462     gtk_widget_ref (table16);
463     gtk_object_set_data_full (GTK_OBJECT (main_window), "table16", table16,
464                               (GtkDestroyNotify) gtk_widget_unref);
465     gtk_widget_show (table16);
466     gtk_container_add (GTK_CONTAINER (frame14), table16);
467     gtk_container_set_border_width (GTK_CONTAINER (table16), 2);
468     gtk_table_set_row_spacings (GTK_TABLE (table16), 5);
469     gtk_table_set_col_spacings (GTK_TABLE (table16), 5);
470 
471     label43a = gtk_label_new ("tuning");
472     gtk_widget_ref (label43a);
473     gtk_object_set_data_full (GTK_OBJECT (main_window), "label43a", label43a,
474                               (GtkDestroyNotify) gtk_widget_unref);
475     gtk_widget_show (label43a);
476     gtk_table_attach (GTK_TABLE (table16), label43a, 0, 1, 0, 1,
477                       (GtkAttachOptions) (GTK_FILL),
478                       (GtkAttachOptions) (0), 0, 0);
479     gtk_misc_set_alignment (GTK_MISC (label43a), 0, 0.5);
480     gtk_misc_set_padding (GTK_MISC (label43a), 2, 0);
481 
482     tuning_adj = gtk_adjustment_new (440.0, 415.3, 466.2, 0.1, 1, 0);
483     tuning = gtk_spin_button_new (GTK_ADJUSTMENT (tuning_adj), 1, 1);
484     gtk_widget_ref (tuning);
485     gtk_object_set_data_full (GTK_OBJECT (main_window), "tuning", tuning,
486                               (GtkDestroyNotify) gtk_widget_unref);
487     gtk_widget_show (tuning);
488     gtk_table_attach (GTK_TABLE (table16), tuning, 1, 2, 0, 1,
489                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
490                       (GtkAttachOptions) (GTK_FILL), 0, 0);
491     gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (tuning), GTK_UPDATE_IF_VALID);
492     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (tuning), TRUE);
493 
494     volume_label = gtk_label_new ("volume (dB)");
495     gtk_widget_ref (volume_label);
496     gtk_object_set_data_full (GTK_OBJECT (main_window), "volume_label", volume_label,
497                               (GtkDestroyNotify) gtk_widget_unref);
498     gtk_widget_show (volume_label);
499     gtk_table_attach (GTK_TABLE (table16), volume_label, 0, 1, 1, 2,
500                       (GtkAttachOptions) (GTK_FILL),
501                       (GtkAttachOptions) (0), 0, 0);
502     gtk_misc_set_alignment (GTK_MISC (volume_label), 0, 0.5);
503     gtk_misc_set_padding (GTK_MISC (volume_label), 2, 0);
504 
505     volume_adj = gtk_adjustment_new (0.0, -70.0, 20.0, 0.1, 1, 0);
506     volume = gtk_spin_button_new (GTK_ADJUSTMENT (volume_adj), 1, 1);
507     gtk_widget_ref (volume);
508     gtk_object_set_data_full (GTK_OBJECT (main_window), "volume", volume,
509                               (GtkDestroyNotify) gtk_widget_unref);
510     gtk_widget_show (volume);
511     gtk_table_attach (GTK_TABLE (table16), volume, 1, 2, 1, 2,
512                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
513                       (GtkAttachOptions) (GTK_FILL), 0, 0);
514     gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON (volume), GTK_UPDATE_IF_VALID);
515     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (volume), TRUE);
516 
517     monophonic_option_menu = gtk_option_menu_new ();
518     gtk_widget_ref (monophonic_option_menu);
519     gtk_object_set_data_full (GTK_OBJECT (main_window), "monophonic_option_menu", monophonic_option_menu,
520                               (GtkDestroyNotify) gtk_widget_unref);
521     gtk_widget_show (monophonic_option_menu);
522     gtk_table_attach (GTK_TABLE (table16), monophonic_option_menu, 1, 2, 4, 5,
523                       (GtkAttachOptions) (GTK_FILL),
524                       (GtkAttachOptions) (0), 0, 0);
525     optionmenu5_menu = gtk_menu_new ();
526     mono_mode_off = gtk_menu_item_new_with_label ("Off");
527     gtk_widget_show (mono_mode_off);
528     gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_off);
529     mono_mode_on = gtk_menu_item_new_with_label ("On");
530     gtk_widget_show (mono_mode_on);
531     gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_on);
532     mono_mode_once = gtk_menu_item_new_with_label ("Once");
533     gtk_widget_show (mono_mode_once);
534     gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_once);
535     mono_mode_both = gtk_menu_item_new_with_label ("Both");
536     gtk_widget_show (mono_mode_both);
537     gtk_menu_append (GTK_MENU (optionmenu5_menu), mono_mode_both);
538     gtk_option_menu_set_menu (GTK_OPTION_MENU (monophonic_option_menu), optionmenu5_menu);
539 
540     polyphony_instance_adj = gtk_adjustment_new (HEXTER_DEFAULT_POLYPHONY, 1, HEXTER_MAX_POLYPHONY, 1, 10, 0);
541     polyphony_instance = gtk_spin_button_new (GTK_ADJUSTMENT (polyphony_instance_adj), 1, 0);
542     gtk_widget_ref (polyphony_instance);
543     gtk_object_set_data_full (GTK_OBJECT (main_window), "polyphony_instance", polyphony_instance,
544                               (GtkDestroyNotify) gtk_widget_unref);
545     gtk_widget_show (polyphony_instance);
546     gtk_table_attach (GTK_TABLE (table16), polyphony_instance, 1, 2, 2, 3,
547                       (GtkAttachOptions) (GTK_FILL),
548                       (GtkAttachOptions) (0), 0, 0);
549 
550     label43 = gtk_label_new ("polyphony (instance)");
551     gtk_widget_ref (label43);
552     gtk_object_set_data_full (GTK_OBJECT (main_window), "label43", label43,
553                               (GtkDestroyNotify) gtk_widget_unref);
554     gtk_widget_show (label43);
555     gtk_table_attach (GTK_TABLE (table16), label43, 0, 1, 2, 3,
556                       (GtkAttachOptions) (GTK_FILL),
557                       (GtkAttachOptions) (0), 0, 0);
558     gtk_misc_set_alignment (GTK_MISC (label43), 0, 0.5);
559     gtk_misc_set_padding (GTK_MISC (label43), 2, 0);
560 
561     polyphony_global_adj = gtk_adjustment_new (HEXTER_DEFAULT_POLYPHONY, 1, HEXTER_MAX_POLYPHONY, 1, 10, 0);
562     polyphony_global = gtk_spin_button_new (GTK_ADJUSTMENT (polyphony_global_adj), 1, 0);
563     gtk_widget_ref (polyphony_global);
564     gtk_object_set_data_full (GTK_OBJECT (main_window), "polyphony_global", polyphony_global,
565                               (GtkDestroyNotify) gtk_widget_unref);
566     gtk_widget_show (polyphony_global);
567     gtk_table_attach (GTK_TABLE (table16), polyphony_global, 1, 2, 3, 4,
568                       (GtkAttachOptions) (GTK_FILL),
569                       (GtkAttachOptions) (0), 0, 0);
570 
571     label42 = gtk_label_new ("polyphony (global)");
572     gtk_widget_ref (label42);
573     gtk_object_set_data_full (GTK_OBJECT (main_window), "label42", label42,
574                               (GtkDestroyNotify) gtk_widget_unref);
575     gtk_widget_show (label42);
576     gtk_table_attach (GTK_TABLE (table16), label42, 0, 1, 3, 4,
577                       (GtkAttachOptions) (GTK_FILL),
578                       (GtkAttachOptions) (0), 0, 0);
579     gtk_misc_set_alignment (GTK_MISC (label42), 0, 0.5);
580     gtk_misc_set_padding (GTK_MISC (label42), 2, 0);
581 
582     label44 = gtk_label_new ("monophonic mode");
583     gtk_widget_ref (label44);
584     gtk_object_set_data_full (GTK_OBJECT (main_window), "label44", label44,
585                               (GtkDestroyNotify) gtk_widget_unref);
586     gtk_widget_show (label44);
587     gtk_table_attach (GTK_TABLE (table16), label44, 0, 1, 4, 5,
588                       (GtkAttachOptions) (GTK_FILL),
589                       (GtkAttachOptions) (0), 0, 0);
590     gtk_misc_set_alignment (GTK_MISC (label44), 0, 0.5);
591     gtk_misc_set_padding (GTK_MISC (label44), 2, 0);
592 
593     label44 = gtk_label_new ("disable LFO/Mod/Perf\n"
594                              "(0.5.x compatibility)");
595     gtk_widget_show (label44);
596     gtk_table_attach (GTK_TABLE (table16), label44, 0, 1, 5, 6,
597                       (GtkAttachOptions) (GTK_FILL),
598                       (GtkAttachOptions) (0), 0, 0);
599     gtk_misc_set_alignment (GTK_MISC (label44), 0, 0.5);
600     gtk_misc_set_padding (GTK_MISC (label44), 2, 0);
601 
602     compat059_button = gtk_check_button_new();
603     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(compat059_button), 0);
604     gtk_widget_show (compat059_button);
605     gtk_table_attach (GTK_TABLE (table16), compat059_button, 1, 2, 5, 6,
606                       (GtkAttachOptions) (GTK_FILL),
607                       (GtkAttachOptions) (0), 0, 0);
608 
609 #ifdef HEXTER_DEBUG_CONTROL
610     {   GtkWidget *w;
611         test_adj = gtk_adjustment_new(0, 0, 16383, 1, 10, 0);
612         w = gtk_hscale_new(GTK_ADJUSTMENT(test_adj));
613         gtk_scale_set_value_pos (GTK_SCALE (w), GTK_POS_RIGHT);
614         gtk_scale_set_digits (GTK_SCALE (w), 0);
615         gtk_range_set_update_policy (GTK_RANGE (w), GTK_UPDATE_DELAYED);
616         gtk_widget_show(w);
617         gtk_table_attach (GTK_TABLE(table16), w, 0, 2, 6, 7,
618                           (GtkAttachOptions) (GTK_FILL),
619                           (GtkAttachOptions) (0), 0, 0);
620         g_signal_connect(G_OBJECT(test_adj), "value-changed", G_CALLBACK(on_test_changed), NULL);
621     }
622 #endif /* HEXTER_DEBUG_CONTROL */
623 
624 #ifdef MIDI_ALSA
625     frame15 = gtk_frame_new ("Sys-Ex Patch Editing");
626     gtk_widget_ref (frame15);
627     gtk_object_set_data_full (GTK_OBJECT (main_window), "frame15", frame15,
628                               (GtkDestroyNotify) gtk_widget_unref);
629     gtk_widget_show (frame15);
630     gtk_box_pack_start (GTK_BOX (vbox2), frame15, TRUE, TRUE, 0);
631 
632     table3 = gtk_table_new (3, 2, FALSE);
633     gtk_widget_ref (table3);
634     gtk_object_set_data_full (GTK_OBJECT (main_window), "table3", table3,
635                               (GtkDestroyNotify) gtk_widget_unref);
636     gtk_widget_show (table3);
637     gtk_container_add (GTK_CONTAINER (frame15), table3);
638     gtk_container_set_border_width (GTK_CONTAINER (table3), 2);
639     gtk_table_set_row_spacings (GTK_TABLE (table3), 5);
640     gtk_table_set_col_spacings (GTK_TABLE (table3), 5);
641 
642     label11 = gtk_label_new ("Enable Sys-Ex Editing");
643     gtk_widget_ref (label11);
644     gtk_object_set_data_full (GTK_OBJECT (main_window), "label11", label11,
645                               (GtkDestroyNotify) gtk_widget_unref);
646     gtk_widget_show (label11);
647     gtk_table_attach (GTK_TABLE (table3), label11, 0, 1, 0, 1,
648                       (GtkAttachOptions) (GTK_FILL),
649                       (GtkAttachOptions) (0), 0, 0);
650     gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5);
651 
652     sysex_enable_button = gtk_check_button_new_with_label ("");
653     gtk_widget_ref (sysex_enable_button);
654     gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_enable_button", sysex_enable_button,
655                               (GtkDestroyNotify) gtk_widget_unref);
656     gtk_widget_show (sysex_enable_button);
657     gtk_table_attach (GTK_TABLE (table3), sysex_enable_button, 1, 2, 0, 1,
658                       (GtkAttachOptions) (GTK_FILL),
659                       (GtkAttachOptions) (0), 0, 0);
660 
661     sysex_channel_label = gtk_label_new ("Sys-Ex Receive Channel");
662     gtk_widget_ref (sysex_channel_label);
663     gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_channel_label", sysex_channel_label,
664                               (GtkDestroyNotify) gtk_widget_unref);
665     gtk_widget_show (sysex_channel_label);
666     gtk_table_attach (GTK_TABLE (table3), sysex_channel_label, 0, 1, 1, 2,
667                       (GtkAttachOptions) (GTK_FILL),
668                       (GtkAttachOptions) (0), 0, 0);
669     gtk_misc_set_alignment (GTK_MISC (sysex_channel_label), 0, 0.5);
670     gtk_widget_set_sensitive (sysex_channel_label, FALSE);
671 
672     sysex_channel_spin_adj = gtk_adjustment_new (1, 1, 16, 1, 10, 0);
673     sysex_channel_spin = gtk_spin_button_new (GTK_ADJUSTMENT (sysex_channel_spin_adj), 1, 0);
674     gtk_widget_ref (sysex_channel_spin);
675     gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_channel_spin", sysex_channel_spin,
676                               (GtkDestroyNotify) gtk_widget_unref);
677     gtk_widget_show (sysex_channel_spin);
678     gtk_table_attach (GTK_TABLE (table3), sysex_channel_spin, 1, 2, 1, 2,
679                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
680                       (GtkAttachOptions) (0), 0, 0);
681     gtk_widget_set_sensitive (sysex_channel_spin, FALSE);
682 
683     frame4 = gtk_frame_new (NULL);
684     gtk_widget_ref (frame4);
685     gtk_object_set_data_full (GTK_OBJECT (main_window), "frame4", frame4,
686                               (GtkDestroyNotify) gtk_widget_unref);
687     gtk_widget_show (frame4);
688     gtk_table_attach (GTK_TABLE (table3), frame4, 0, 2, 2, 3,
689                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
690                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
691     gtk_frame_set_shadow_type (GTK_FRAME (frame4), GTK_SHADOW_IN);
692 
693     sysex_status_label = gtk_label_new (" ");
694     gtk_widget_ref (sysex_status_label);
695     gtk_object_set_data_full (GTK_OBJECT (main_window), "sysex_status_label", sysex_status_label,
696                               (GtkDestroyNotify) gtk_widget_unref);
697     gtk_widget_show (sysex_status_label);
698     gtk_container_add (GTK_CONTAINER (frame4), sysex_status_label);
699     gtk_label_set_line_wrap (GTK_LABEL (sysex_status_label), TRUE);
700     gtk_misc_set_alignment (GTK_MISC (sysex_status_label), 0, 0.5);
701 #endif /* MIDI_ALSA */
702 
703     configuration_tab_label = gtk_label_new ("Configuration");
704     gtk_widget_ref (configuration_tab_label);
705     gtk_object_set_data_full (GTK_OBJECT (main_window), "configuration_tab_label", configuration_tab_label,
706                               (GtkDestroyNotify) gtk_widget_unref);
707     gtk_widget_show (configuration_tab_label);
708     gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 1), configuration_tab_label);
709 
710     /* Performance tab */
711     performance_frame = gtk_frame_new ("Global Performance Parameters");
712     gtk_widget_ref (performance_frame);
713     gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_frame", performance_frame,
714                               (GtkDestroyNotify) gtk_widget_unref);
715     gtk_widget_show (performance_frame);
716     gtk_container_add (GTK_CONTAINER (notebook1), performance_frame);
717     gtk_container_set_border_width (GTK_CONTAINER (performance_frame), 5);
718 
719     performance_table = gtk_table_new (2, 10, FALSE);
720     gtk_widget_ref (performance_table);
721     gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_table", performance_table,
722                               (GtkDestroyNotify) gtk_widget_unref);
723     gtk_widget_show (performance_table);
724     gtk_container_add (GTK_CONTAINER (performance_frame), performance_table);
725     gtk_container_set_border_width (GTK_CONTAINER (performance_table), 2);
726     gtk_table_set_row_spacings (GTK_TABLE (performance_table), 5);
727     gtk_table_set_col_spacings (GTK_TABLE (performance_table), 5);
728 
729     create_performance_spin  (main_window, "pitch bend range", performance_table, 0, PP_PITCH_BEND_RANGE, 12, 2);
730     create_performance_spin  (main_window, "portamento time",  performance_table, 1, PP_PORTAMENTO_TIME, 99, 0);
731     create_performance_spin  (main_window, "mod wheel sens.",  performance_table, 2, PP_MOD_WHEEL_SENSITIVITY, 15, 15);
732     create_performance_assign(main_window, "mod wheel assign", performance_table, 3, PP_MOD_WHEEL_ASSIGN, 0x01);
733     create_performance_spin  (main_window, "foot sensitivity", performance_table, 4, PP_FOOT_SENSITIVITY, 15, 0);
734     create_performance_assign(main_window, "foot assign",      performance_table, 5, PP_FOOT_ASSIGN, 0x04);
735     create_performance_spin  (main_window, "pressure sens.",   performance_table, 6, PP_PRESSURE_SENSITIVITY, 15, 15);
736     create_performance_assign(main_window, "pressure assign",  performance_table, 7, PP_PRESSURE_ASSIGN, 0x02);
737     create_performance_spin  (main_window, "breath sens.",     performance_table, 8, PP_BREATH_SENSITIVITY, 15, 15);
738     create_performance_assign(main_window, "breath assign",    performance_table, 9, PP_BREATH_ASSIGN, 0x02);
739 
740     performance_tab_label = gtk_label_new ("Performance");
741     gtk_widget_ref (performance_tab_label);
742     gtk_object_set_data_full (GTK_OBJECT (main_window), "performance_tab_label", performance_tab_label,
743                               (GtkDestroyNotify) gtk_widget_unref);
744     gtk_widget_show (performance_tab_label);
745     gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 2), performance_tab_label);
746 
747     /* Test note widgets */
748     frame12 = gtk_frame_new ("Test Note");
749     gtk_widget_ref (frame12);
750     gtk_object_set_data_full (GTK_OBJECT (main_window), "frame12", frame12,
751                               (GtkDestroyNotify) gtk_widget_unref);
752     gtk_widget_show (frame12);
753     gtk_container_set_border_width (GTK_CONTAINER (frame12), 7);
754     gtk_box_pack_start (GTK_BOX (vbox1), frame12, TRUE, TRUE, 0);
755 
756     table15 = gtk_table_new (2, 3, FALSE);
757     gtk_widget_ref (table15);
758     gtk_object_set_data_full (GTK_OBJECT (main_window), "table15", table15,
759                               (GtkDestroyNotify) gtk_widget_unref);
760     gtk_widget_show (table15);
761     gtk_container_add (GTK_CONTAINER (frame12), table15);
762     gtk_container_set_border_width (GTK_CONTAINER (table15), 4);
763     gtk_table_set_row_spacings (GTK_TABLE (table15), 5);
764     gtk_table_set_col_spacings (GTK_TABLE (table15), 5);
765 
766     label10 = gtk_label_new ("key");
767     gtk_widget_ref (label10);
768     gtk_object_set_data_full (GTK_OBJECT (main_window), "label10", label10,
769                               (GtkDestroyNotify) gtk_widget_unref);
770     gtk_widget_show (label10);
771     gtk_table_attach (GTK_TABLE (table15), label10, 0, 1, 0, 1,
772                       (GtkAttachOptions) (GTK_FILL),
773                       (GtkAttachOptions) (0), 0, 0);
774     gtk_misc_set_alignment (GTK_MISC (label10), 0, 0.5);
775     gtk_misc_set_padding (GTK_MISC (label10), 2, 0);
776 
777     label10a = gtk_label_new ("velocity");
778     gtk_widget_ref (label10a);
779     gtk_object_set_data_full (GTK_OBJECT (main_window), "label10a", label10a,
780                               (GtkDestroyNotify) gtk_widget_unref);
781     gtk_widget_show (label10a);
782     gtk_table_attach (GTK_TABLE (table15), label10a, 0, 1, 1, 2,
783                       (GtkAttachOptions) (GTK_FILL),
784                       (GtkAttachOptions) (0), 0, 0);
785     gtk_misc_set_alignment (GTK_MISC (label10a), 0, 0.5);
786     gtk_misc_set_padding (GTK_MISC (label10a), 2, 0);
787 
788     test_note_button = gtk_button_new_with_label ("Send Test Note");
789     gtk_widget_ref (test_note_button);
790     gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_button", test_note_button,
791                               (GtkDestroyNotify) gtk_widget_unref);
792     gtk_widget_show (test_note_button);
793     gtk_table_attach (GTK_TABLE (table15), test_note_button, 0, 2, 2, 3,
794                       (GtkAttachOptions) (0),
795                       (GtkAttachOptions) (0), 4, 0);
796     gtk_container_set_border_width (GTK_CONTAINER (test_note_button), 2);
797 
798     test_note_key_adj = gtk_adjustment_new (60, 12, 132, 1, 12, 12);
799     test_note_key = gtk_hscale_new (GTK_ADJUSTMENT (test_note_key_adj));
800     gtk_widget_ref (test_note_key);
801     gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_key", test_note_key,
802                               (GtkDestroyNotify) gtk_widget_unref);
803     gtk_widget_show (test_note_key);
804     gtk_table_attach (GTK_TABLE (table15), test_note_key, 1, 2, 0, 1,
805                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
806                       (GtkAttachOptions) (GTK_FILL), 0, 0);
807     gtk_scale_set_value_pos (GTK_SCALE (test_note_key), GTK_POS_RIGHT);
808     gtk_scale_set_digits (GTK_SCALE (test_note_key), 0);
809     gtk_range_set_update_policy (GTK_RANGE (test_note_key), GTK_UPDATE_DELAYED);
810 
811     test_note_velocity_adj = gtk_adjustment_new (84, 1, 137, 1, 10, 10);
812     test_note_velocity = gtk_hscale_new (GTK_ADJUSTMENT (test_note_velocity_adj));
813     gtk_widget_ref (test_note_velocity);
814     gtk_object_set_data_full (GTK_OBJECT (main_window), "test_note_velocity", test_note_velocity,
815                               (GtkDestroyNotify) gtk_widget_unref);
816     gtk_widget_show (test_note_velocity);
817     gtk_table_attach (GTK_TABLE (table15), test_note_velocity, 1, 2, 1, 2,
818                       (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
819                       (GtkAttachOptions) (GTK_FILL), 0, 0);
820     gtk_scale_set_value_pos (GTK_SCALE (test_note_velocity), GTK_POS_RIGHT);
821     gtk_scale_set_digits (GTK_SCALE (test_note_velocity), 0);
822     gtk_range_set_update_policy (GTK_RANGE (test_note_velocity), GTK_UPDATE_DELAYED);
823 
824     /* connect main window */
825     gtk_signal_connect(GTK_OBJECT(main_window), "destroy",
826                        GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
827     gtk_signal_connect (GTK_OBJECT (main_window), "delete_event",
828                         (GtkSignalFunc)on_delete_event_wrapper,
829                         (gpointer)on_menu_quit_activate);
830 
831     /* connect menu items */
832     gtk_signal_connect (GTK_OBJECT (menu_import), "activate",
833                         GTK_SIGNAL_FUNC (on_menu_import_activate),
834                         NULL);
835     gtk_signal_connect (GTK_OBJECT (menu_export), "activate",
836                         GTK_SIGNAL_FUNC (on_menu_export_activate),
837                         NULL);
838     gtk_signal_connect (GTK_OBJECT (menu_quit), "activate",
839                         GTK_SIGNAL_FUNC (on_menu_quit_activate),
840                         NULL);
841     gtk_signal_connect (GTK_OBJECT (menu_edit), "activate",
842                         GTK_SIGNAL_FUNC (on_menu_edit_activate),
843                         NULL);
844     gtk_signal_connect (GTK_OBJECT (menu_about), "activate",
845                         GTK_SIGNAL_FUNC (on_menu_about_activate),
846                         NULL);
847 
848     /* connect patch list */
849     gtk_signal_connect(GTK_OBJECT(patches_clist), "select_row",
850                        GTK_SIGNAL_FUNC(on_patches_selection),
851                        NULL);
852 
853     /* connect synth configuration widgets */
854     gtk_signal_connect (GTK_OBJECT (tuning_adj), "value_changed",
855                         GTK_SIGNAL_FUNC(on_tuning_change),
856                         NULL);
857     gtk_signal_connect (GTK_OBJECT (volume_adj), "value_changed",
858                         GTK_SIGNAL_FUNC(on_volume_change),
859                         NULL);
860     gtk_signal_connect (GTK_OBJECT (polyphony_instance_adj), "value_changed",
861                         GTK_SIGNAL_FUNC(on_polyphony_change),
862                         (gpointer)0);
863     gtk_signal_connect (GTK_OBJECT (polyphony_global_adj), "value_changed",
864                         GTK_SIGNAL_FUNC(on_polyphony_change),
865                         (gpointer)1);
866     gtk_signal_connect (GTK_OBJECT (mono_mode_off), "activate",
867                         GTK_SIGNAL_FUNC (on_mono_mode_activate),
868                         (gpointer)"off");
869     gtk_signal_connect (GTK_OBJECT (mono_mode_on), "activate",
870                         GTK_SIGNAL_FUNC (on_mono_mode_activate),
871                         (gpointer)"on");
872     gtk_signal_connect (GTK_OBJECT (mono_mode_once), "activate",
873                         GTK_SIGNAL_FUNC (on_mono_mode_activate),
874                         (gpointer)"once");
875     gtk_signal_connect (GTK_OBJECT (mono_mode_both), "activate",
876                         GTK_SIGNAL_FUNC (on_mono_mode_activate),
877                         (gpointer)"both");
878     gtk_signal_connect (GTK_OBJECT (compat059_button), "toggled",
879                         GTK_SIGNAL_FUNC (on_compat059_toggled),
880                         NULL);
881 #ifdef MIDI_ALSA
882     /* connect sys-ex widgets */
883     gtk_signal_connect (GTK_OBJECT (sysex_enable_button), "toggled",
884                         GTK_SIGNAL_FUNC (on_sysex_enable_toggled),
885                         NULL);
886     gtk_signal_connect (GTK_OBJECT (sysex_channel_spin_adj), "value_changed",
887                         GTK_SIGNAL_FUNC (on_sysex_channel_change),
888                         NULL);
889 #endif /* MIDI_ALSA */
890 
891     /* connect test note widgets */
892     gtk_signal_connect (GTK_OBJECT (test_note_key_adj),
893                         "value_changed", GTK_SIGNAL_FUNC(on_test_note_slider_change),
894                         (gpointer)0);
895     gtk_signal_connect (GTK_OBJECT (test_note_velocity_adj),
896                         "value_changed", GTK_SIGNAL_FUNC(on_test_note_slider_change),
897                         (gpointer)1);
898     gtk_signal_connect (GTK_OBJECT (test_note_button), "pressed",
899                         GTK_SIGNAL_FUNC (on_test_note_button_press),
900                         (gpointer)1);
901     gtk_signal_connect (GTK_OBJECT (test_note_button), "released",
902                         GTK_SIGNAL_FUNC (on_test_note_button_press),
903                         (gpointer)0);
904 
905     gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group);
906 }
907 
908 void
create_about_window(const char * tag)909 create_about_window (const char *tag)
910 {
911     GtkWidget *vbox2;
912     GtkWidget *frame1;
913     GtkWidget *about_pixmap;
914     GtkWidget *closeabout;
915 
916     about_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
917     gtk_object_set_data (GTK_OBJECT (about_window), "about_window", about_window);
918     gtk_window_set_title (GTK_WINDOW (about_window), "About hexter");
919     gtk_widget_realize(about_window);  /* window must be realized for create_about_pixmap() */
920 
921     vbox2 = gtk_vbox_new (FALSE, 0);
922     gtk_widget_ref (vbox2);
923     gtk_object_set_data_full (GTK_OBJECT (about_window), "vbox2", vbox2,
924                               (GtkDestroyNotify) gtk_widget_unref);
925     gtk_widget_show (vbox2);
926     gtk_container_add (GTK_CONTAINER (about_window), vbox2);
927 
928     frame1 = gtk_frame_new (NULL);
929     gtk_widget_ref (frame1);
930     gtk_object_set_data_full (GTK_OBJECT (main_window), "frame1", frame1,
931                               (GtkDestroyNotify) gtk_widget_unref);
932     gtk_widget_show (frame1);
933     gtk_box_pack_start (GTK_BOX (vbox2), frame1, FALSE, FALSE, 0);
934 
935     about_pixmap = (GtkWidget *)create_about_pixmap (about_window);
936     gtk_widget_ref (about_pixmap);
937     gtk_object_set_data_full (GTK_OBJECT (about_window), "about_pixmap", about_pixmap,
938                               (GtkDestroyNotify) gtk_widget_unref);
939     gtk_widget_show (about_pixmap);
940     gtk_container_add (GTK_CONTAINER (frame1), about_pixmap);
941     gtk_misc_set_padding (GTK_MISC (about_pixmap), 5, 5);
942 
943     about_label = gtk_label_new ("Some message\ngoes here");
944     gtk_widget_ref (about_label);
945     gtk_object_set_data_full (GTK_OBJECT (about_window), "about_label", about_label,
946                               (GtkDestroyNotify) gtk_widget_unref);
947     gtk_widget_show (about_label);
948     gtk_box_pack_start (GTK_BOX (vbox2), about_label, FALSE, FALSE, 0);
949     // gtk_label_set_line_wrap (GTK_LABEL (about_label), TRUE);
950     gtk_label_set_justify (GTK_LABEL (about_label), GTK_JUSTIFY_CENTER);
951     gtk_misc_set_padding (GTK_MISC (about_label), 5, 5);
952 
953     closeabout = gtk_button_new_with_label ("Dismiss");
954     gtk_widget_ref (closeabout);
955     gtk_object_set_data_full (GTK_OBJECT (about_window), "closeabout", closeabout,
956                               (GtkDestroyNotify) gtk_widget_unref);
957     gtk_widget_show (closeabout);
958     gtk_box_pack_start (GTK_BOX (vbox2), closeabout, FALSE, FALSE, 0);
959 
960     gtk_signal_connect (GTK_OBJECT (about_window), "destroy",
961                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
962     gtk_signal_connect (GTK_OBJECT (about_window), "delete_event",
963                         GTK_SIGNAL_FUNC (on_delete_event_wrapper),
964                         (gpointer)on_about_dismiss);
965     gtk_signal_connect (GTK_OBJECT (closeabout), "clicked",
966                         GTK_SIGNAL_FUNC (on_about_dismiss),
967                         NULL);
968 }
969 
970 void
create_import_file_selection(const char * tag)971 create_import_file_selection (const char *tag)
972 {
973     char      *title;
974     GtkWidget *ok_button;
975     GtkWidget *cancel_button;
976 
977     title = (char *)malloc(strlen(tag) + 21);
978     sprintf(title, "%s - Import Patch Bank", tag);
979     import_file_selection = gtk_file_selection_new (title);
980     free(title);
981     gtk_object_set_data (GTK_OBJECT (import_file_selection), "import_file_selection", import_file_selection);
982     gtk_container_set_border_width (GTK_CONTAINER (import_file_selection), 10);
983 
984     ok_button = GTK_FILE_SELECTION (import_file_selection)->ok_button;
985     gtk_object_set_data (GTK_OBJECT (import_file_selection), "ok_button", ok_button);
986     gtk_widget_show (ok_button);
987     GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
988 
989     cancel_button = GTK_FILE_SELECTION (import_file_selection)->cancel_button;
990     gtk_object_set_data (GTK_OBJECT (import_file_selection), "cancel_button", cancel_button);
991     gtk_widget_show (cancel_button);
992     GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
993 
994     gtk_signal_connect (GTK_OBJECT (import_file_selection), "destroy",
995                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
996     gtk_signal_connect (GTK_OBJECT (import_file_selection), "delete_event",
997                         (GtkSignalFunc)on_delete_event_wrapper,
998                         (gpointer)on_import_file_cancel);
999     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (import_file_selection)->ok_button),
1000                         "clicked", (GtkSignalFunc)on_import_file_ok,
1001                         NULL);
1002     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (import_file_selection)->cancel_button),
1003                         "clicked", (GtkSignalFunc)on_import_file_cancel,
1004                         NULL);
1005 }
1006 
1007 void
create_import_file_position_window(const char * tag)1008 create_import_file_position_window (const char *tag)
1009 {
1010     GtkWidget *vbox4;
1011     GtkWidget *position_text_label;
1012     GtkWidget *hbox2;
1013     GtkWidget *label50;
1014     GtkWidget *position_spin;
1015     GtkWidget *hbox3;
1016     GtkWidget *position_cancel;
1017     GtkWidget *position_ok;
1018 
1019     import_file_position_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1020     gtk_object_set_data (GTK_OBJECT (import_file_position_window),
1021                          "import_file_position_window", import_file_position_window);
1022     set_window_title(import_file_position_window, tag, "Import Position");
1023 
1024     vbox4 = gtk_vbox_new (FALSE, 0);
1025     gtk_widget_ref (vbox4);
1026     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "vbox4",
1027                               vbox4, (GtkDestroyNotify) gtk_widget_unref);
1028     gtk_widget_show (vbox4);
1029     gtk_container_add (GTK_CONTAINER (import_file_position_window), vbox4);
1030     gtk_container_set_border_width (GTK_CONTAINER (vbox4), 6);
1031 
1032     position_text_label = gtk_label_new ("Select the Program Number at which you "
1033                                          "wish to begin importing patches (existing "
1034                                          "patches will be overwritten)");
1035     gtk_widget_ref (position_text_label);
1036     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1037                               "position_text_label", position_text_label,
1038                               (GtkDestroyNotify) gtk_widget_unref);
1039     gtk_widget_show (position_text_label);
1040     gtk_box_pack_start (GTK_BOX (vbox4), position_text_label, TRUE, TRUE, 0);
1041     gtk_label_set_justify (GTK_LABEL (position_text_label), GTK_JUSTIFY_FILL);
1042     gtk_label_set_line_wrap (GTK_LABEL (position_text_label), TRUE);
1043     gtk_misc_set_padding (GTK_MISC (position_text_label), 0, 6);
1044 
1045     hbox2 = gtk_hbox_new (FALSE, 0);
1046     gtk_widget_ref (hbox2);
1047     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "hbox2",
1048                               hbox2, (GtkDestroyNotify) gtk_widget_unref);
1049     gtk_widget_show (hbox2);
1050     gtk_box_pack_start (GTK_BOX (vbox4), hbox2, TRUE, TRUE, 0);
1051     gtk_container_set_border_width (GTK_CONTAINER (hbox2), 6);
1052 
1053     label50 = gtk_label_new ("Program Number");
1054     gtk_widget_ref (label50);
1055     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "label50",
1056                               label50, (GtkDestroyNotify) gtk_widget_unref);
1057     gtk_widget_show (label50);
1058     gtk_box_pack_start (GTK_BOX (hbox2), label50, FALSE, TRUE, 2);
1059 
1060     import_file_position_spin_adj = gtk_adjustment_new (0, 0, 127, 1, 10, 0);
1061     position_spin = gtk_spin_button_new (GTK_ADJUSTMENT (import_file_position_spin_adj), 1, 0);
1062     gtk_widget_ref (position_spin);
1063     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1064                               "position_spin", position_spin,
1065                               (GtkDestroyNotify) gtk_widget_unref);
1066     gtk_widget_show (position_spin);
1067     gtk_box_pack_start (GTK_BOX (hbox2), position_spin, FALSE, FALSE, 2);
1068     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (position_spin), TRUE);
1069 
1070     import_file_position_name_label = gtk_label_new ("default voice");
1071     gtk_widget_ref (import_file_position_name_label);
1072     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1073                               "import_file_position_name_label",
1074                               import_file_position_name_label,
1075                               (GtkDestroyNotify) gtk_widget_unref);
1076     gtk_widget_show (import_file_position_name_label);
1077     gtk_box_pack_start (GTK_BOX (hbox2), import_file_position_name_label, FALSE, FALSE, 2);
1078     gtk_label_set_justify (GTK_LABEL (import_file_position_name_label), GTK_JUSTIFY_LEFT);
1079 
1080     hbox3 = gtk_hbox_new (FALSE, 0);
1081     gtk_widget_ref (hbox3);
1082     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window), "hbox3", hbox3,
1083                               (GtkDestroyNotify) gtk_widget_unref);
1084     gtk_widget_show (hbox3);
1085     gtk_box_pack_start (GTK_BOX (vbox4), hbox3, TRUE, TRUE, 0);
1086     gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1087 
1088     position_cancel = gtk_button_new_with_label ("Cancel");
1089     gtk_widget_ref (position_cancel);
1090     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1091                               "position_cancel", position_cancel,
1092                               (GtkDestroyNotify) gtk_widget_unref);
1093     gtk_widget_show (position_cancel);
1094     gtk_box_pack_start (GTK_BOX (hbox3), position_cancel, TRUE, FALSE, 12);
1095 
1096     position_ok = gtk_button_new_with_label ("Import");
1097     gtk_widget_ref (position_ok);
1098     gtk_object_set_data_full (GTK_OBJECT (import_file_position_window),
1099                               "position_ok", position_ok,
1100                               (GtkDestroyNotify) gtk_widget_unref);
1101     gtk_widget_show (position_ok);
1102     gtk_box_pack_end (GTK_BOX (hbox3), position_ok, TRUE, FALSE, 12);
1103 
1104     gtk_signal_connect (GTK_OBJECT (import_file_position_window), "destroy",
1105                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1106     gtk_signal_connect (GTK_OBJECT (import_file_position_window), "delete_event",
1107                         (GtkSignalFunc)on_delete_event_wrapper,
1108                         (gpointer)on_import_file_position_cancel);
1109     gtk_signal_connect (GTK_OBJECT (import_file_position_spin_adj),
1110                         "value_changed", GTK_SIGNAL_FUNC(on_position_change),
1111                         (gpointer)import_file_position_name_label);
1112     gtk_signal_connect (GTK_OBJECT (position_ok), "clicked",
1113                         (GtkSignalFunc)on_import_file_position_ok,
1114                         NULL);
1115     gtk_signal_connect (GTK_OBJECT (position_cancel), "clicked",
1116                         (GtkSignalFunc)on_import_file_position_cancel,
1117                         NULL);
1118 }
1119 
1120 void
create_notice_window(const char * tag)1121 create_notice_window (const char *tag)
1122 {
1123     GtkWidget *vbox3;
1124     GtkWidget *hbox1;
1125     GtkWidget *notice_dismiss;
1126 
1127     notice_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1128     gtk_object_set_data (GTK_OBJECT (notice_window), "notice_window", notice_window);
1129     set_window_title(notice_window, tag, "Notice");
1130     gtk_window_set_position (GTK_WINDOW (notice_window), GTK_WIN_POS_MOUSE);
1131     gtk_window_set_modal (GTK_WINDOW (notice_window), TRUE);
1132 
1133     vbox3 = gtk_vbox_new (FALSE, 0);
1134     gtk_widget_ref (vbox3);
1135     gtk_object_set_data_full (GTK_OBJECT (notice_window), "vbox3", vbox3,
1136                               (GtkDestroyNotify) gtk_widget_unref);
1137     gtk_widget_show (vbox3);
1138     gtk_container_add (GTK_CONTAINER (notice_window), vbox3);
1139 
1140     notice_label_1 = gtk_label_new ("Some message\ngoes here");
1141     gtk_widget_ref (notice_label_1);
1142     gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_label_1", notice_label_1,
1143                               (GtkDestroyNotify) gtk_widget_unref);
1144     gtk_widget_show (notice_label_1);
1145     gtk_box_pack_start (GTK_BOX (vbox3), notice_label_1, TRUE, TRUE, 0);
1146     gtk_label_set_line_wrap (GTK_LABEL (notice_label_1), TRUE);
1147     gtk_misc_set_padding (GTK_MISC (notice_label_1), 10, 5);
1148 
1149     notice_label_2 = gtk_label_new ("more text\ngoes here");
1150     gtk_widget_ref (notice_label_2);
1151     gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_label_2", notice_label_2,
1152                               (GtkDestroyNotify) gtk_widget_unref);
1153     gtk_widget_show (notice_label_2);
1154     gtk_box_pack_start (GTK_BOX (vbox3), notice_label_2, FALSE, FALSE, 0);
1155     gtk_label_set_line_wrap (GTK_LABEL (notice_label_2), TRUE);
1156     gtk_misc_set_padding (GTK_MISC (notice_label_2), 10, 5);
1157 
1158     hbox1 = gtk_hbox_new (FALSE, 0);
1159     gtk_widget_ref (hbox1);
1160     gtk_object_set_data_full (GTK_OBJECT (notice_window), "hbox1", hbox1,
1161                               (GtkDestroyNotify) gtk_widget_unref);
1162     gtk_widget_show (hbox1);
1163     gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1164 
1165     notice_dismiss = gtk_button_new_with_label ("Dismiss");
1166     gtk_widget_ref (notice_dismiss);
1167     gtk_object_set_data_full (GTK_OBJECT (notice_window), "notice_dismiss", notice_dismiss,
1168                               (GtkDestroyNotify) gtk_widget_unref);
1169     gtk_widget_show (notice_dismiss);
1170     gtk_box_pack_start (GTK_BOX (hbox1), notice_dismiss, TRUE, FALSE, 0);
1171     gtk_container_set_border_width (GTK_CONTAINER (notice_dismiss), 7);
1172 
1173     gtk_signal_connect (GTK_OBJECT (notice_window), "destroy",
1174                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1175     gtk_signal_connect (GTK_OBJECT (notice_window), "delete_event",
1176                         GTK_SIGNAL_FUNC (on_delete_event_wrapper),
1177                         (gpointer)on_notice_dismiss);
1178     gtk_signal_connect (GTK_OBJECT (notice_dismiss), "clicked",
1179                         GTK_SIGNAL_FUNC (on_notice_dismiss),
1180                         NULL);
1181 }
1182 
1183 void
create_export_file_type_window(const char * tag)1184 create_export_file_type_window (const char *tag)
1185 {
1186     GtkWidget *vbox1;
1187     GtkWidget *label1;
1188     GtkWidget *table1;
1189     GtkWidget *label2;
1190     GtkWidget *label3;
1191     GSList *save_type_group = NULL;
1192     GtkWidget *save_type_raw;
1193     GtkWidget *hseparator1;
1194     GtkWidget *label4;
1195     GtkWidget *table2;
1196     GtkWidget *label5;
1197     GtkWidget *export_file_start_spin;
1198     GtkWidget *hseparator2;
1199     GtkWidget *hbox3;
1200     GtkWidget *sft_position_cancel;
1201     GtkWidget *sft_position_ok;
1202 
1203     export_file_type_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1204     gtk_object_set_data (GTK_OBJECT (export_file_type_window), "export_file_type_window",
1205                          export_file_type_window);
1206     set_window_title(export_file_type_window, tag, "Export File Type");
1207 
1208     vbox1 = gtk_vbox_new (FALSE, 0);
1209     gtk_widget_ref (vbox1);
1210     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "vbox1", vbox1,
1211                               (GtkDestroyNotify) gtk_widget_unref);
1212     gtk_widget_show (vbox1);
1213     gtk_container_add (GTK_CONTAINER (export_file_type_window), vbox1);
1214     gtk_container_set_border_width (GTK_CONTAINER (vbox1), 6);
1215 
1216     label1 = gtk_label_new ("Select the patch file format you wish to use for this export:");
1217     gtk_widget_ref (label1);
1218     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label1", label1,
1219                               (GtkDestroyNotify) gtk_widget_unref);
1220     gtk_widget_show (label1);
1221     gtk_box_pack_start (GTK_BOX (vbox1), label1, TRUE, TRUE, 0);
1222     gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_FILL);
1223     gtk_label_set_line_wrap (GTK_LABEL (label1), TRUE);
1224     gtk_misc_set_padding (GTK_MISC (label1), 0, 6);
1225 
1226     table1 = gtk_table_new (2, 2, FALSE);
1227     gtk_widget_ref (table1);
1228     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "table1", table1,
1229                               (GtkDestroyNotify) gtk_widget_unref);
1230     gtk_widget_show (table1);
1231     gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
1232 
1233     label2 = gtk_label_new ("(32 patches, 4104 bytes, any suffix)");
1234     gtk_widget_ref (label2);
1235     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label2", label2,
1236                               (GtkDestroyNotify) gtk_widget_unref);
1237     gtk_widget_show (label2);
1238     gtk_table_attach (GTK_TABLE (table1), label2, 1, 2, 0, 1,
1239                       (GtkAttachOptions) (GTK_FILL),
1240                       (GtkAttachOptions) (0), 0, 0);
1241     gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
1242     gtk_misc_set_padding (GTK_MISC (label2), 5, 0);
1243 
1244     label3 = gtk_label_new ("(any number of patches, 128 bytes per patch, hexter expects\".dx7\" suffix)");
1245     gtk_widget_ref (label3);
1246     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label3", label3,
1247                               (GtkDestroyNotify) gtk_widget_unref);
1248     gtk_widget_show (label3);
1249     gtk_table_attach (GTK_TABLE (table1), label3, 1, 2, 1, 2,
1250                       (GtkAttachOptions) (GTK_FILL),
1251                       (GtkAttachOptions) (0), 0, 0);
1252     gtk_label_set_line_wrap (GTK_LABEL (label3), TRUE);
1253     gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
1254     gtk_misc_set_padding (GTK_MISC (label3), 5, 0);
1255 
1256     export_file_type_sysex = gtk_radio_button_new_with_label (save_type_group, "DX7 sys-ex file");
1257     save_type_group = gtk_radio_button_group (GTK_RADIO_BUTTON (export_file_type_sysex));
1258     gtk_widget_ref (export_file_type_sysex);
1259     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_type_sysex", export_file_type_sysex,
1260                               (GtkDestroyNotify) gtk_widget_unref);
1261     gtk_widget_show (export_file_type_sysex);
1262     gtk_table_attach (GTK_TABLE (table1), export_file_type_sysex, 0, 1, 0, 1,
1263                       (GtkAttachOptions) (GTK_FILL),
1264                       (GtkAttachOptions) (0), 4, 4);
1265     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (export_file_type_sysex), TRUE);
1266 
1267     save_type_raw = gtk_radio_button_new_with_label (save_type_group, "raw DX7 patch file");
1268     save_type_group = gtk_radio_button_group (GTK_RADIO_BUTTON (save_type_raw));
1269     gtk_widget_ref (save_type_raw);
1270     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "save_type_raw", save_type_raw,
1271                               (GtkDestroyNotify) gtk_widget_unref);
1272     gtk_widget_show (save_type_raw);
1273     gtk_table_attach (GTK_TABLE (table1), save_type_raw, 0, 1, 1, 2,
1274                       (GtkAttachOptions) (GTK_FILL),
1275                       (GtkAttachOptions) (0), 4, 4);
1276 
1277     hseparator1 = gtk_hseparator_new ();
1278     gtk_widget_ref (hseparator1);
1279     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hseparator1", hseparator1,
1280                               (GtkDestroyNotify) gtk_widget_unref);
1281     gtk_widget_show (hseparator1);
1282     gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, FALSE, 2);
1283 
1284     label4 = gtk_label_new ("Select the program numbers for the range of patches you wish to export:");
1285     gtk_widget_ref (label4);
1286     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label4", label4,
1287                               (GtkDestroyNotify) gtk_widget_unref);
1288     gtk_widget_show (label4);
1289     gtk_box_pack_start (GTK_BOX (vbox1), label4, TRUE, TRUE, 0);
1290     gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_FILL);
1291     gtk_label_set_line_wrap (GTK_LABEL (label4), TRUE);
1292     gtk_misc_set_padding (GTK_MISC (label4), 0, 6);
1293 
1294     table2 = gtk_table_new (2, 3, FALSE);
1295     gtk_widget_ref (table2);
1296     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "table2", table2,
1297                               (GtkDestroyNotify) gtk_widget_unref);
1298     gtk_widget_show (table2);
1299     gtk_box_pack_start (GTK_BOX (vbox1), table2, TRUE, TRUE, 0);
1300     gtk_container_set_border_width (GTK_CONTAINER (table2), 4);
1301     gtk_table_set_col_spacings (GTK_TABLE (table2), 2);
1302 
1303     label5 = gtk_label_new ("Start Program Number");
1304     gtk_widget_ref (label5);
1305     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "label5", label5,
1306                               (GtkDestroyNotify) gtk_widget_unref);
1307     gtk_widget_show (label5);
1308     gtk_table_attach (GTK_TABLE (table2), label5, 0, 1, 0, 1,
1309                       (GtkAttachOptions) (GTK_FILL),
1310                       (GtkAttachOptions) (0), 0, 0);
1311     gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
1312 
1313     export_file_end_label = gtk_label_new ("End Program (inclusive)");
1314     gtk_widget_ref (export_file_end_label);
1315     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_label", export_file_end_label,
1316                               (GtkDestroyNotify) gtk_widget_unref);
1317     gtk_widget_show (export_file_end_label);
1318     gtk_table_attach (GTK_TABLE (table2), export_file_end_label, 0, 1, 1, 2,
1319                       (GtkAttachOptions) (GTK_FILL),
1320                       (GtkAttachOptions) (0), 0, 0);
1321     gtk_misc_set_alignment (GTK_MISC (export_file_end_label), 0, 0.5);
1322       gtk_widget_set_sensitive (export_file_end_label, FALSE);
1323 
1324     export_file_start_spin_adj = gtk_adjustment_new (0, 0, 96, 1, 10, 0);
1325     export_file_start_spin = gtk_spin_button_new (GTK_ADJUSTMENT (export_file_start_spin_adj), 1, 0);
1326     gtk_widget_ref (export_file_start_spin);
1327     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_start_spin", export_file_start_spin,
1328                               (GtkDestroyNotify) gtk_widget_unref);
1329     gtk_widget_show (export_file_start_spin);
1330     gtk_table_attach (GTK_TABLE (table2), export_file_start_spin, 1, 2, 0, 1,
1331                       (GtkAttachOptions) (0),
1332                       (GtkAttachOptions) (0), 0, 0);
1333     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (export_file_start_spin), TRUE);
1334 
1335     export_file_end_spin_adj = gtk_adjustment_new (31, 0, 127, 1, 10, 0);
1336     export_file_end_spin = gtk_spin_button_new (GTK_ADJUSTMENT (export_file_end_spin_adj), 1, 0);
1337     gtk_widget_ref (export_file_end_spin);
1338     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_spin", export_file_end_spin,
1339                               (GtkDestroyNotify) gtk_widget_unref);
1340     gtk_widget_show (export_file_end_spin);
1341     gtk_table_attach (GTK_TABLE (table2), export_file_end_spin, 1, 2, 1, 2,
1342                       (GtkAttachOptions) (0),
1343                       (GtkAttachOptions) (0), 0, 0);
1344     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (export_file_end_spin), TRUE);
1345     gtk_widget_set_sensitive (export_file_end_spin, FALSE);
1346 
1347     export_file_start_name = gtk_label_new ("(unset)");
1348     gtk_widget_ref (export_file_start_name);
1349     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_start_name", export_file_start_name,
1350                               (GtkDestroyNotify) gtk_widget_unref);
1351     gtk_widget_show (export_file_start_name);
1352     gtk_table_attach (GTK_TABLE (table2), export_file_start_name, 2, 3, 0, 1,
1353                       (GtkAttachOptions) (GTK_FILL),
1354                       (GtkAttachOptions) (0), 0, 0);
1355     gtk_label_set_justify (GTK_LABEL (export_file_start_name), GTK_JUSTIFY_LEFT);
1356     gtk_misc_set_alignment (GTK_MISC (export_file_start_name), 0, 0.5);
1357 
1358     export_file_end_name = gtk_label_new ("(unset)");
1359     gtk_widget_ref (export_file_end_name);
1360     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "export_file_end_name", export_file_end_name,
1361                               (GtkDestroyNotify) gtk_widget_unref);
1362     gtk_widget_show (export_file_end_name);
1363     gtk_table_attach (GTK_TABLE (table2), export_file_end_name, 2, 3, 1, 2,
1364                       (GtkAttachOptions) (GTK_FILL),
1365                       (GtkAttachOptions) (0), 0, 0);
1366     gtk_misc_set_alignment (GTK_MISC (export_file_end_name), 0, 0.5);
1367 
1368     hseparator2 = gtk_hseparator_new ();
1369     gtk_widget_ref (hseparator2);
1370     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hseparator2", hseparator2,
1371                               (GtkDestroyNotify) gtk_widget_unref);
1372     gtk_widget_show (hseparator2);
1373     gtk_box_pack_start (GTK_BOX (vbox1), hseparator2, FALSE, FALSE, 2);
1374 
1375     hbox3 = gtk_hbox_new (FALSE, 0);
1376     gtk_widget_ref (hbox3);
1377     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window), "hbox3", hbox3,
1378                               (GtkDestroyNotify) gtk_widget_unref);
1379     gtk_widget_show (hbox3);
1380     gtk_box_pack_start (GTK_BOX (vbox1), hbox3, TRUE, TRUE, 0);
1381     gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1382 
1383     sft_position_cancel = gtk_button_new_with_label ("Cancel");
1384     gtk_widget_ref (sft_position_cancel);
1385     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window),
1386                               "sft_position_cancel", sft_position_cancel,
1387                               (GtkDestroyNotify) gtk_widget_unref);
1388     gtk_widget_show (sft_position_cancel);
1389     gtk_box_pack_start (GTK_BOX (hbox3), sft_position_cancel, TRUE, FALSE, 12);
1390 
1391     sft_position_ok = gtk_button_new_with_label ("Export");
1392     gtk_widget_ref (sft_position_ok);
1393     gtk_object_set_data_full (GTK_OBJECT (export_file_type_window),
1394                               "sft_position_ok", sft_position_ok,
1395                               (GtkDestroyNotify) gtk_widget_unref);
1396     gtk_widget_show (sft_position_ok);
1397     gtk_box_pack_end (GTK_BOX (hbox3), sft_position_ok, TRUE, FALSE, 12);
1398 
1399     gtk_signal_connect (GTK_OBJECT (export_file_type_window), "destroy",
1400                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1401     gtk_signal_connect (GTK_OBJECT (export_file_type_window), "delete_event",
1402                         GTK_SIGNAL_FUNC (on_delete_event_wrapper),
1403                         (gpointer)on_export_file_type_cancel);
1404     gtk_signal_connect (GTK_OBJECT (export_file_type_sysex), "pressed",
1405                         GTK_SIGNAL_FUNC (on_export_file_type_press),
1406                         (gpointer)0);
1407     gtk_signal_connect (GTK_OBJECT (save_type_raw), "pressed",
1408                         GTK_SIGNAL_FUNC (on_export_file_type_press),
1409                         (gpointer)1);
1410     gtk_signal_connect (GTK_OBJECT (export_file_start_spin_adj),
1411                         "value_changed", GTK_SIGNAL_FUNC(on_export_file_position_change),
1412                         (gpointer)0);
1413     gtk_signal_connect (GTK_OBJECT (export_file_end_spin_adj),
1414                         "value_changed", GTK_SIGNAL_FUNC(on_export_file_position_change),
1415                         (gpointer)1);
1416     gtk_signal_connect (GTK_OBJECT (sft_position_ok), "clicked",
1417                         (GtkSignalFunc)on_export_file_type_ok,
1418                         NULL);
1419     gtk_signal_connect (GTK_OBJECT (sft_position_cancel), "clicked",
1420                         (GtkSignalFunc)on_export_file_type_cancel,
1421                         NULL);
1422 }
1423 
1424 void
create_export_file_selection(const char * tag)1425 create_export_file_selection (const char *tag)
1426 {
1427     char      *title;
1428     GtkWidget *ok_button;
1429     GtkWidget *cancel_button;
1430 
1431     title = (char *)malloc(strlen(tag) + 21);
1432     sprintf(title, "%s - Export Patch Bank", tag);
1433     export_file_selection = gtk_file_selection_new (title);
1434     free(title);
1435     gtk_object_set_data (GTK_OBJECT (export_file_selection), "export_file_selection", export_file_selection);
1436     gtk_container_set_border_width (GTK_CONTAINER (export_file_selection), 10);
1437 
1438     ok_button = GTK_FILE_SELECTION (export_file_selection)->ok_button;
1439     gtk_object_set_data (GTK_OBJECT (export_file_selection), "ok_button", ok_button);
1440     gtk_widget_show (ok_button);
1441     GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
1442 
1443     cancel_button = GTK_FILE_SELECTION (export_file_selection)->cancel_button;
1444     gtk_object_set_data (GTK_OBJECT (export_file_selection), "cancel_button", cancel_button);
1445     gtk_widget_show (cancel_button);
1446     GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
1447 
1448     gtk_signal_connect (GTK_OBJECT (export_file_selection), "destroy",
1449                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1450     gtk_signal_connect (GTK_OBJECT (export_file_selection), "delete_event",
1451                         (GtkSignalFunc)on_delete_event_wrapper,
1452                         (gpointer)on_export_file_cancel);
1453     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (export_file_selection)->ok_button),
1454                         "clicked", (GtkSignalFunc)on_export_file_ok,
1455                         NULL);
1456     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (export_file_selection)->cancel_button),
1457                         "clicked", (GtkSignalFunc)on_export_file_cancel,
1458                         NULL);
1459 }
1460 
1461 void
create_edit_save_position_window(const char * tag)1462 create_edit_save_position_window (const char *tag)
1463 {
1464     GtkWidget *vbox4;
1465     GtkWidget *hbox2;
1466     GtkWidget *edit_save_position_text_label;
1467     GtkWidget *label50;
1468     GtkWidget *position_spin;
1469     GtkWidget *hbox3;
1470     GtkWidget *position_cancel;
1471     GtkWidget *position_ok;
1472 
1473     edit_save_position_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1474     gtk_object_set_data (GTK_OBJECT (edit_save_position_window),
1475                          "edit_save_position_window", edit_save_position_window);
1476     set_window_title(edit_save_position_window, tag, "Edit Save Position");
1477 
1478     vbox4 = gtk_vbox_new (FALSE, 0);
1479     gtk_widget_ref (vbox4);
1480     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "vbox4",
1481                               vbox4, (GtkDestroyNotify) gtk_widget_unref);
1482     gtk_widget_show (vbox4);
1483     gtk_container_add (GTK_CONTAINER (edit_save_position_window), vbox4);
1484     gtk_container_set_border_width (GTK_CONTAINER (vbox4), 6);
1485 
1486     edit_save_position_text_label = gtk_label_new ("Select the Program Number into which you "
1487                                                    "wish to save the edited patch "
1488                                                    "(the existing patch will be overwritten):");
1489     gtk_widget_ref (edit_save_position_text_label);
1490     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1491                               "edit_save_position_text_label", edit_save_position_text_label,
1492                               (GtkDestroyNotify) gtk_widget_unref);
1493     gtk_widget_show (edit_save_position_text_label);
1494     gtk_box_pack_start (GTK_BOX (vbox4), edit_save_position_text_label, TRUE, TRUE, 0);
1495     gtk_label_set_justify (GTK_LABEL (edit_save_position_text_label), GTK_JUSTIFY_FILL);
1496     gtk_label_set_line_wrap (GTK_LABEL (edit_save_position_text_label), TRUE);
1497     gtk_misc_set_padding (GTK_MISC (edit_save_position_text_label), 0, 6);
1498 
1499     hbox2 = gtk_hbox_new (FALSE, 0);
1500     gtk_widget_ref (hbox2);
1501     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "hbox2",
1502                               hbox2, (GtkDestroyNotify) gtk_widget_unref);
1503     gtk_widget_show (hbox2);
1504     gtk_box_pack_start (GTK_BOX (vbox4), hbox2, TRUE, TRUE, 0);
1505     gtk_container_set_border_width (GTK_CONTAINER (hbox2), 6);
1506 
1507     label50 = gtk_label_new ("Program Number");
1508     gtk_widget_ref (label50);
1509     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "label50",
1510                               label50, (GtkDestroyNotify) gtk_widget_unref);
1511     gtk_widget_show (label50);
1512     gtk_box_pack_start (GTK_BOX (hbox2), label50, FALSE, TRUE, 2);
1513 
1514     edit_save_position_spin_adj = gtk_adjustment_new (0, 0, 127, 1, 10, 0);
1515     position_spin = gtk_spin_button_new (GTK_ADJUSTMENT (edit_save_position_spin_adj), 1, 0);
1516     gtk_widget_ref (position_spin);
1517     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1518                               "position_spin", position_spin,
1519                               (GtkDestroyNotify) gtk_widget_unref);
1520     gtk_widget_show (position_spin);
1521     gtk_box_pack_start (GTK_BOX (hbox2), position_spin, FALSE, FALSE, 2);
1522     gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (position_spin), TRUE);
1523 
1524     edit_save_position_name_label = gtk_label_new ("default voice");
1525     gtk_widget_ref (edit_save_position_name_label);
1526     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1527                               "edit_save_position_name_label",
1528                               edit_save_position_name_label,
1529                               (GtkDestroyNotify) gtk_widget_unref);
1530     gtk_widget_show (edit_save_position_name_label);
1531     gtk_box_pack_start (GTK_BOX (hbox2), edit_save_position_name_label, FALSE, FALSE, 2);
1532     gtk_label_set_justify (GTK_LABEL (edit_save_position_name_label), GTK_JUSTIFY_LEFT);
1533 
1534     hbox3 = gtk_hbox_new (FALSE, 0);
1535     gtk_widget_ref (hbox3);
1536     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window), "hbox3", hbox3,
1537                               (GtkDestroyNotify) gtk_widget_unref);
1538     gtk_widget_show (hbox3);
1539     gtk_box_pack_start (GTK_BOX (vbox4), hbox3, TRUE, TRUE, 0);
1540     gtk_container_set_border_width (GTK_CONTAINER (hbox3), 6);
1541 
1542     position_cancel = gtk_button_new_with_label ("Cancel");
1543     gtk_widget_ref (position_cancel);
1544     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1545                               "position_cancel", position_cancel,
1546                               (GtkDestroyNotify) gtk_widget_unref);
1547     gtk_widget_show (position_cancel);
1548     gtk_box_pack_start (GTK_BOX (hbox3), position_cancel, TRUE, FALSE, 12);
1549 
1550     position_ok = gtk_button_new_with_label ("Save");
1551     gtk_widget_ref (position_ok);
1552     gtk_object_set_data_full (GTK_OBJECT (edit_save_position_window),
1553                               "position_ok", position_ok,
1554                               (GtkDestroyNotify) gtk_widget_unref);
1555     gtk_widget_show (position_ok);
1556     gtk_box_pack_end (GTK_BOX (hbox3), position_ok, TRUE, FALSE, 12);
1557 
1558     gtk_signal_connect (GTK_OBJECT (edit_save_position_window), "destroy",
1559                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1560     gtk_signal_connect (GTK_OBJECT (edit_save_position_window), "delete_event",
1561                         (GtkSignalFunc)on_delete_event_wrapper,
1562                         (gpointer)on_edit_save_position_cancel);
1563     gtk_signal_connect (GTK_OBJECT (edit_save_position_spin_adj),
1564                         "value_changed", GTK_SIGNAL_FUNC(on_position_change),
1565                         (gpointer)edit_save_position_name_label);
1566     gtk_signal_connect (GTK_OBJECT (position_ok), "clicked",
1567                         (GtkSignalFunc)on_edit_save_position_ok,
1568                         NULL);
1569     gtk_signal_connect (GTK_OBJECT (position_cancel), "clicked",
1570                         (GtkSignalFunc)on_edit_save_position_cancel,
1571                         NULL);
1572 }
1573 
1574 void
create_windows(const char * instance_tag)1575 create_windows(const char *instance_tag)
1576 {
1577     char tag[50];
1578 
1579     /* build a nice identifier string for the window titles */
1580     if (strlen(instance_tag) == 0) {
1581         strcpy(tag, "hexter v" VERSION);
1582     } else if (strstr(instance_tag, "hexter")) {
1583         if (strlen(instance_tag) > 49) {
1584             snprintf(tag, 50, "...%s", instance_tag + strlen(instance_tag) - 46); /* hope the unique info is at the end */
1585         } else {
1586             strcpy(tag, instance_tag);
1587         }
1588     } else {
1589         if (strlen(instance_tag) > 42) {
1590             snprintf(tag, 50, "hexter ...%s", instance_tag + strlen(instance_tag) - 39);
1591         } else {
1592             snprintf(tag, 50, "hexter %s", instance_tag);
1593         }
1594     }
1595 
1596     create_main_window(tag);
1597     create_editor_window(tag);
1598     create_about_window(tag);
1599     create_import_file_selection(tag);
1600     create_import_file_position_window(tag);
1601     create_export_file_type_window(tag);
1602     create_export_file_selection(tag);
1603     create_edit_save_position_window(tag);
1604     create_notice_window(tag);
1605 }
1606 
1607