1 /*
2  * Copyright (C) 2002 2003 2004 2005 2008 2009 2010 2011 2012, Magnus Hjorth
3  *
4  * This file is part of mhWaveEdit.
5  *
6  * mhWaveEdit is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * mhWaveEdit is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with mhWaveEdit; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 
22 #include <config.h>
23 #include <gdk/gdkkeysyms.h>
24 
25 #include <math.h>
26 
27 #include "sound.h"
28 #include "inifile.h"
29 #include "main.h"
30 #include "configdialog.h"
31 #include "um.h"
32 #include "mainwindow.h"
33 #include "tempfile.h"
34 #include "player.h"
35 #include "rateconv.h"
36 #include "gettext.h"
37 #include "filetypes.h"
38 
39 static GtkObjectClass *parent_class;
40 
config_dialog_destroy(GtkObject * obj)41 static void config_dialog_destroy(GtkObject *obj)
42 {
43      ConfigDialog *cd = CONFIG_DIALOG(obj);
44      cd->selected_tempdir = NULL;
45      parent_class->destroy(obj);
46 }
47 
config_dialog_class_init(GtkObjectClass * klass)48 static void config_dialog_class_init(GtkObjectClass *klass)
49 {
50      parent_class = gtk_type_class(gtk_window_get_type());
51      klass->destroy = config_dialog_destroy;
52 }
53 
config_dialog_ok(GtkButton * button,gpointer user_data)54 static void config_dialog_ok(GtkButton *button, gpointer user_data)
55 {
56     gchar *c;
57     gboolean b = FALSE;
58     GList *la,*lb;
59     GtkWidget *w;
60     ConfigDialog *cd = CONFIG_DIALOG(user_data);
61     if (intbox_check(cd->sound_buffer_size) ||
62         intbox_check(cd->disk_threshold) ||
63 	intbox_check(cd->view_quality) ||
64 	intbox_check_limit(cd->recent_files,0,MAINWINDOW_RECENT_MAX,
65 			   _("number of recent files")) ||
66         intbox_check_limit(cd->vzoom_max,1,9999, _("maximum vertical zoom")) ||
67 	format_selector_check(cd->fallback_format))
68         return;
69     /* c = (gchar *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(cd->sound_driver)->entry)); */
70     c = sound_driver_id_from_index(combo_selected_index(cd->sound_driver));
71     g_assert(c != NULL);
72 
73     if (gtk_toggle_button_get_active(cd->driver_autodetect))
74 	 inifile_set(INI_SETTING_SOUNDDRIVER,"auto");
75     else
76 	 b = inifile_set(INI_SETTING_SOUNDDRIVER,c) || b;
77 
78     b = inifile_set_guint32(INI_SETTING_SOUNDBUFSIZE,
79 			    cd->sound_buffer_size->val) || b;
80     if (b) user_info(_("Some of the settings you have changed will not be "
81 		     "activated until you restart the program"));
82 
83     inifile_set_guint32(INI_SETTING_REALMAX,cd->disk_threshold->val*1024);
84     inifile_set_guint32(INI_SETTING_VIEW_QUALITY,
85 			cd->view_quality->val);
86     inifile_set_gboolean(INI_SETTING_TIMESCALE,
87 			 gtk_toggle_button_get_active(cd->time_scale_default));
88     inifile_set_gboolean(INI_SETTING_VZOOM,
89 			 gtk_toggle_button_get_active(cd->vzoom_default));
90     inifile_set_gboolean(INI_SETTING_HZOOM,
91 			 gtk_toggle_button_get_active(cd->hzoom_default));
92     inifile_set_gboolean(INI_SETTING_SPEED,
93 			 gtk_toggle_button_get_active(cd->speed_default));
94     inifile_set_gboolean(INI_SETTING_SLABELS,
95 			 gtk_toggle_button_get_active(cd->labels_default));
96     inifile_set_gboolean(INI_SETTING_BUFPOS,
97 			 gtk_toggle_button_get_active(cd->bufpos_default));
98     inifile_set(INI_SETTING_MIXER,
99 		(char *)gtk_entry_get_text(cd->mixer_utility));
100     inifile_set_gboolean("useGeometry",
101 			 gtk_toggle_button_get_active(cd->remember_geometry));
102     inifile_set_gboolean("drawImprove",
103 			 gtk_toggle_button_get_active(cd->improve));
104     inifile_set_gboolean("mainwinFront",
105 			 gtk_toggle_button_get_active(cd->mainwin_front));
106 
107     default_time_mode = combo_selected_index(cd->time_display);
108     inifile_set_guint32(INI_SETTING_TIME_DISPLAY,default_time_mode);
109 
110     default_time_mode = combo_selected_index(cd->time_display);
111     inifile_set_guint32(INI_SETTING_TIME_DISPLAY,default_time_mode);
112 
113     default_timescale_mode = combo_selected_index(cd->time_display_timescale);
114     inifile_set_guint32(INI_SETTING_TIME_DISPLAY_SCALE,default_timescale_mode);
115 
116     sound_lock_driver = gtk_toggle_button_get_active(cd->sound_lock);
117     inifile_set_gboolean("soundLock",sound_lock_driver);
118 
119     status_bar_roll_cursor = gtk_toggle_button_get_active(cd->roll_cursor);
120     inifile_set_gboolean("rollCursor",status_bar_roll_cursor);
121 
122     output_byteswap_flag = gtk_toggle_button_get_active(cd->output_bswap);
123     inifile_set_gboolean("outputByteswap",output_byteswap_flag);
124 
125     output_stereo_flag = gtk_toggle_button_get_active(cd->output_stereo);
126     inifile_set_gboolean("outputStereo",output_stereo_flag);
127 
128     view_follow_strict_flag =
129 	 gtk_toggle_button_get_active(cd->center_cursor);
130     inifile_set_gboolean("centerCursor",view_follow_strict_flag);
131 
132     autoplay_mark_flag = gtk_toggle_button_get_active(cd->mark_autoplay);
133     inifile_set_gboolean("autoPlayMark",autoplay_mark_flag);
134 
135     la = gtk_container_children(GTK_CONTAINER(cd->tempdirs));
136     lb = NULL;
137     for (; la != NULL; la = la->next) {
138 	 w = GTK_WIDGET(la->data);
139 	 w = GTK_BIN(w)->child;
140 	 gtk_label_get(GTK_LABEL(w),&c);
141 	 lb = g_list_append(lb,c);
142     }
143     set_temp_directories(lb);
144     g_list_free(lb);
145 
146     inifile_set_guint32("recentFiles",cd->recent_files->val);
147 
148     inifile_set_guint32("vzoomMax",cd->vzoom_max->val);
149 
150     format_selector_get(cd->fallback_format,&player_fallback_format);
151     format_selector_save_to_inifile(cd->fallback_format,"playerFallback");
152 
153     chunk_filter_use_floating_tempfiles =
154 	 gtk_toggle_button_get_active(cd->floating_tempfiles);
155     inifile_set_gboolean("tempfilesFP",chunk_filter_use_floating_tempfiles);
156 
157     varispeed_reset_flag =
158 	 gtk_toggle_button_get_active(cd->varispeed_autoreset);
159     inifile_set_gboolean("speedReset",varispeed_reset_flag);
160 
161     varispeed_smooth_flag =
162 	 !gtk_toggle_button_get_active(cd->varispeed_fast);
163     inifile_set_gboolean("speedSmooth",varispeed_smooth_flag);
164 
165     b = gtk_toggle_button_get_active(cd->varispeed_enable);
166     inifile_set_gboolean("varispeed",b);
167     mainwindow_set_speed_sensitive(b);
168     inifile_set_guint32("varispeedConv",
169 			combo_selected_index(cd->varispeed_method));
170     inifile_set_guint32("speedConv",combo_selected_index(cd->speed_method));
171 
172     dither_editing = gtk_toggle_button_get_active(cd->dither_editing);
173     inifile_set_guint32("ditherEditing",
174 			dither_editing?DITHER_MINIMAL:DITHER_NONE);
175     dither_playback = gtk_toggle_button_get_active(cd->dither_playback);
176     inifile_set_guint32("ditherPlayback",
177 			dither_playback?DITHER_MINIMAL:DITHER_NONE);
178 
179     if (sndfile_ogg_supported())
180 	 inifile_set_guint32("sndfileOggMode",
181 			     combo_selected_index(cd->oggmode));
182 
183     sample_convert_mode = combo_selected_index(cd->convmode);
184     inifile_set_guint32("sampleMode",sample_convert_mode);
185 
186     gtk_widget_destroy(GTK_WIDGET(cd));
187 
188     mainwindow_update_texts();
189 }
190 
sound_settings_click(GtkButton * button,gpointer user_data)191 static void sound_settings_click(GtkButton *button, gpointer user_data)
192 {
193      ConfigDialog *cd = CONFIG_DIALOG(user_data);
194      sound_driver_show_preferences(
195 	  sound_driver_id_from_index(combo_selected_index(cd->sound_driver)));
196 }
197 
sound_driver_changed(Combo * combo,gpointer user_data)198 static void sound_driver_changed(Combo *combo, gpointer user_data)
199 {
200      ConfigDialog *cd = CONFIG_DIALOG(user_data);
201      gchar *c;
202      c = combo_selected_string(combo);
203      gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver_prefs),
204 			      sound_driver_has_preferences(
205 				   sound_driver_id_from_name(c)));
206      g_free(c);
207 }
208 
color_expose(GtkWidget * widget,GdkEventExpose * event,gpointer user_data)209 static gboolean color_expose(GtkWidget *widget, GdkEventExpose *event,
210 			     gpointer user_data)
211 {
212      GdkColor *c = (GdkColor *)user_data;
213      GdkGC *gc;
214      gc = gdk_gc_new(widget->window);
215      gdk_gc_set_foreground(gc,c);
216      gdk_draw_rectangle(widget->window,gc,TRUE,
217 			event->area.x,event->area.y,event->area.width,
218 			event->area.height);
219      gdk_gc_unref(gc);
220      return TRUE;
221 }
222 
223 
color_select(GtkList * list,GtkWidget * widget,gpointer user_data)224 static void color_select(GtkList *list, GtkWidget *widget,
225 			 gpointer user_data)
226 {
227      GtkColorSelection *cs = GTK_COLOR_SELECTION(user_data);
228      GdkColor *c = (GdkColor *)gtk_object_get_user_data(GTK_OBJECT(widget));
229      gdouble color[4];
230 
231      gtk_object_set_user_data(GTK_OBJECT(cs),widget);
232      color[0] = ((gdouble)(c->red))/65535.0;
233      color[1] = ((gdouble)(c->green))/65535.0;
234      color[2] = ((gdouble)(c->blue))/65535.0;
235      color[3] = 1.0;
236      gtk_color_selection_set_color(cs,color);
237 #if GTK_MAJOR_VERSION == 1
238 gtk_color_selection_set_color(cs,color);
239 #endif
240 #if GTK_MAJOR_VERSION == 2
241 gtk_color_selection_set_previous_color(cs, c);
242 #endif
243 }
244 
color_set(GtkColorSelection * selection,gpointer user_data)245 static void color_set(GtkColorSelection *selection, gpointer user_data)
246 {
247      gdouble color[4];
248      GtkWidget *widget;
249      GdkColor *c;
250      gtk_color_selection_get_color(selection,color);
251      widget = GTK_WIDGET(gtk_object_get_user_data(GTK_OBJECT(selection)));
252      c = gtk_object_get_user_data(GTK_OBJECT(widget));
253      c->red = (guint)(color[0]*65535.0);
254      c->green = (guint)(color[1]*65535.0);
255      c->blue = (guint)(color[2]*65535.0);
256      gdk_colormap_alloc_color(gdk_colormap_get_system(),c,FALSE,TRUE);
257      gtk_widget_queue_draw(widget);
258 }
259 
color_apply(GtkButton * button,gpointer user_data)260 static void color_apply(GtkButton *button, gpointer user_data)
261 {
262      GdkColor *c = (GdkColor *)user_data;
263      set_custom_colors(c);
264 }
265 
colors_click(GtkButton * button,gpointer user_data)266 static void colors_click(GtkButton *button, gpointer user_data)
267 {
268      GtkWidget *a,*b,*c,*d,*e,*f,*g;
269      GtkWidget *cs;
270      gint i,key;
271      ConfigDialog *cd = CONFIG_DIALOG(user_data);
272      GdkColor *ctable;
273      GtkAccelGroup* ag;
274      ag = gtk_accel_group_new();
275 
276      ctable = g_malloc((LAST_COLOR-FIRST_CUSTOM_COLOR)*sizeof(GdkColor));
277      for (i=FIRST_CUSTOM_COLOR; i<LAST_COLOR; i++)
278 	  memcpy(&ctable[i-FIRST_CUSTOM_COLOR],get_color(i),sizeof(GdkColor));
279 
280      cs = gtk_color_selection_new();
281 #if GTK_MAJOR_VERSION == 2
282      gtk_color_selection_set_has_opacity_control (GTK_COLOR_SELECTION(cs),
283 						  FALSE);
284      gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION(cs), TRUE);
285 #endif
286      gtk_signal_connect(GTK_OBJECT(cs),"color_changed",
287 			GTK_SIGNAL_FUNC(color_set),NULL);
288 
289      a = gtk_window_new(GTK_WINDOW_DIALOG);
290      gtk_window_set_modal(GTK_WINDOW(a),TRUE);
291      gtk_window_set_transient_for(GTK_WINDOW(a),GTK_WINDOW(cd));
292      gtk_window_set_title(GTK_WINDOW(a),_("Colors"));
293      gtk_window_set_policy(GTK_WINDOW(a),FALSE,FALSE,TRUE);
294      gtk_signal_connect_object(GTK_OBJECT(a),"delete_event",
295 			       GTK_SIGNAL_FUNC(g_free),(GtkObject *)ctable);
296      b = gtk_vbox_new(FALSE,5);
297      gtk_container_set_border_width(GTK_CONTAINER(b),5);
298      gtk_container_add(GTK_CONTAINER(a),b);
299      c = gtk_hbox_new(FALSE,10);
300      gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0);
301      d = gtk_list_new();
302      gtk_signal_connect(GTK_OBJECT(d),"select_child",
303 			GTK_SIGNAL_FUNC(color_select),cs);
304      gtk_list_set_selection_mode(GTK_LIST(d),GTK_SELECTION_BROWSE);
305      gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
306      for (i=FIRST_CUSTOM_COLOR; i<LAST_COLOR; i++) {
307 	  e = gtk_list_item_new();
308 	  gtk_object_set_user_data(GTK_OBJECT(e),
309 				   (gpointer)(&ctable[i-FIRST_CUSTOM_COLOR]));
310 	  gtk_container_add(GTK_CONTAINER(d),e);
311 	  f = gtk_hbox_new(FALSE,3);
312 	  gtk_container_set_border_width(GTK_CONTAINER(f),3);
313 	  gtk_container_add(GTK_CONTAINER(e),f);
314 	  g = gtk_drawing_area_new();
315 	  gtk_drawing_area_size(GTK_DRAWING_AREA(g),20,20);
316 	  gtk_signal_connect(GTK_OBJECT(g),"expose_event",
317 			     GTK_SIGNAL_FUNC(color_expose),
318 			     (gpointer)(&ctable[i-FIRST_CUSTOM_COLOR]));
319 	  gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
320 	  g = gtk_label_new(_(color_names[i]));
321 	  gtk_misc_set_alignment(GTK_MISC(g),0.0,1.0);
322 	  gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,0);
323      }
324      d = cs;
325      gtk_box_pack_start(GTK_BOX(c),d,TRUE,TRUE,0);
326      c = gtk_hbutton_box_new();
327      gtk_box_pack_start(GTK_BOX(b),c,FALSE,FALSE,0);
328      d = gtk_button_new_with_label("");
329      key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(d)->child),_("_Preview"));
330      gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK,
331 				 (GtkAccelFlags) 0);
332      gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(color_apply),
333 			ctable);
334      gtk_container_add(GTK_CONTAINER(c),d);
335      d = gtk_button_new_with_label("");
336      key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(d)->child),_("_OK"));
337      gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK,
338 				 (GtkAccelFlags) 0);
339      gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(color_apply),
340 			ctable);
341      gtk_signal_connect(GTK_OBJECT(d),"clicked",GTK_SIGNAL_FUNC(save_colors),
342 			NULL);
343      gtk_signal_connect_object(GTK_OBJECT(d),"clicked",
344 			       GTK_SIGNAL_FUNC(gtk_widget_destroy),
345 			       (GtkObject *)a);
346      gtk_signal_connect_object(GTK_OBJECT(d),"clicked",
347 			       GTK_SIGNAL_FUNC(g_free),(GtkObject *)ctable);
348      gtk_container_add(GTK_CONTAINER(c),d);
349      GTK_WIDGET_SET_FLAGS(d,GTK_CAN_DEFAULT);
350      gtk_widget_grab_default(d);
351 
352      d = gtk_button_new_with_label("");
353      key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(d)->child),_("_Cancel"));
354      gtk_widget_add_accelerator (d, "clicked", ag, key, GDK_MOD1_MASK,
355 				 (GtkAccelFlags) 0);
356      gtk_widget_add_accelerator (d, "clicked", ag, GDK_Escape, 0,
357 				 (GtkAccelFlags) 0);
358      gtk_signal_connect_object(GTK_OBJECT(d),"clicked",
359 			       GTK_SIGNAL_FUNC(set_custom_colors),
360 			       (GtkObject *)NULL);
361      gtk_signal_connect_object(GTK_OBJECT(d),"clicked",
362 			       GTK_SIGNAL_FUNC(g_free),(GtkObject *)ctable);
363      gtk_signal_connect_object(GTK_OBJECT(d),"clicked",
364 			       GTK_SIGNAL_FUNC(gtk_widget_destroy),
365 			       (GtkObject *)a);
366      gtk_container_add(GTK_CONTAINER(c),d);
367 
368      gtk_widget_show_all(a);
369      gtk_window_add_accel_group(GTK_WINDOW (a), ag);
370 }
371 
tempdir_add_click(GtkButton * button,gpointer user_data)372 static void tempdir_add_click(GtkButton *button, gpointer user_data)
373 {
374      ConfigDialog *cd = CONFIG_DIALOG(user_data);
375      GtkWidget *w;
376      gchar *ch;
377      ch = (gchar *)gtk_entry_get_text(cd->tempdir_add_entry);
378      if (ch[0] == 0) return;
379      w = gtk_list_item_new_with_label(ch);
380      gtk_container_add(GTK_CONTAINER(cd->tempdirs),w);
381      gtk_widget_show(w);
382      gtk_entry_set_text(cd->tempdir_add_entry,"");
383 }
384 
tempdir_remove_click(GtkButton * button,gpointer user_data)385 static void tempdir_remove_click(GtkButton *button, gpointer user_data)
386 {
387      ConfigDialog *cd = CONFIG_DIALOG(user_data);
388      gtk_container_remove(GTK_CONTAINER(cd->tempdirs),cd->selected_tempdir);
389 }
390 
tempdir_up_click(GtkButton * button,gpointer user_data)391 static void tempdir_up_click(GtkButton *button, gpointer user_data)
392 {
393      ConfigDialog *cd = CONFIG_DIALOG(user_data);
394      GtkWidget *w;
395      GList *l;
396      gint pos;
397      w = cd->selected_tempdir;
398      pos = gtk_list_child_position(cd->tempdirs,w);
399      if (pos == 0) return;
400      gtk_object_ref(GTK_OBJECT(w));
401      gtk_container_remove(GTK_CONTAINER(cd->tempdirs),w);
402      l = g_list_append(NULL,w);
403      gtk_list_insert_items(cd->tempdirs,l,pos-1);
404      gtk_list_toggle_row(cd->tempdirs,w);
405      gtk_object_unref(GTK_OBJECT(w));
406 }
407 
tempdir_down_click(GtkButton * button,gpointer user_data)408 static void tempdir_down_click(GtkButton *button, gpointer user_data)
409 {
410      ConfigDialog *cd = CONFIG_DIALOG(user_data);
411      GtkWidget *w;
412      GList *l;
413      gint pos;
414      w = cd->selected_tempdir;
415      pos = gtk_list_child_position(cd->tempdirs,w);
416      /* if (pos == 0) return; */
417      gtk_object_ref(GTK_OBJECT(w));
418      gtk_container_remove(GTK_CONTAINER(cd->tempdirs),w);
419      l = g_list_append(NULL,w);
420      gtk_list_insert_items(cd->tempdirs,l,pos+1);
421      gtk_list_toggle_row(cd->tempdirs,w);
422      gtk_object_unref(GTK_OBJECT(w));
423 }
424 
tempdir_browse_click(GtkButton * button,gpointer user_data)425 static void tempdir_browse_click(GtkButton *button, gpointer user_data)
426 {
427      ConfigDialog *cd = CONFIG_DIALOG(user_data);
428      gchar *c,*d;
429      c = (gchar *)gtk_entry_get_text(cd->tempdir_add_entry);
430      d = get_directory(c,_("Browse directory"));
431      if (d != NULL) {
432 	  gtk_entry_set_text(cd->tempdir_add_entry,d);
433 	  g_free(d);
434      }
435 }
436 
437 
tempdir_select(GtkList * list,GtkWidget * widget,gpointer user_data)438 static void tempdir_select(GtkList *list, GtkWidget *widget,
439 			   gpointer user_data)
440 {
441      ConfigDialog *cd = CONFIG_DIALOG(user_data);
442      cd->selected_tempdir = widget;
443      gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_remove),TRUE);
444      gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_up),TRUE);
445      gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_down),TRUE);
446 }
447 
tempdir_unselect(GtkList * list,GtkWidget * widget,gpointer user_data)448 static void tempdir_unselect(GtkList *list, GtkWidget *widget,
449 			     gpointer user_data)
450 {
451      ConfigDialog *cd = CONFIG_DIALOG(user_data);
452      if (cd->selected_tempdir == widget) {
453 	  cd->selected_tempdir = NULL;
454 	  gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_remove),FALSE);
455 	  gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_up),FALSE);
456 	  gtk_widget_set_sensitive(GTK_WIDGET(cd->tempdir_down),FALSE);
457      }
458 }
459 
driver_autodetect_toggled(GtkToggleButton * button,gpointer user_data)460 static void driver_autodetect_toggled(GtkToggleButton *button,
461 				      gpointer user_data)
462 {
463      ConfigDialog *cd = CONFIG_DIALOG(user_data);
464      gboolean b;
465      b = gtk_toggle_button_get_active(button);
466      if (b) combo_set_selection(cd->sound_driver,sound_driver_index());
467      gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver), !b);
468 }
469 
config_dialog_init(ConfigDialog * cd)470 static void config_dialog_init(ConfigDialog *cd)
471 {
472     GtkWidget *w,*a,*b,*c,*d,*e,*f,*g,*h;
473     GList *l;
474     GtkAccelGroup *ag;
475     guint key,i,j;
476     gchar *ch;
477 
478     ag = gtk_accel_group_new();
479 
480     gtk_window_set_title(GTK_WINDOW(cd),_("Preferences"));
481     gtk_window_set_modal(GTK_WINDOW(cd),TRUE);
482     gtk_window_set_position(GTK_WINDOW (cd), GTK_WIN_POS_CENTER);
483     gtk_window_set_default_size(GTK_WINDOW(cd),10,400);
484     gtk_container_set_border_width(GTK_CONTAINER(cd),5);
485 
486     /* Create the main widgets */
487 
488     w = intbox_new( inifile_get_guint32( INI_SETTING_REALMAX,
489 					 INI_SETTING_REALMAX_DEFAULT )/1024);
490     cd->disk_threshold = INTBOX(w);
491 
492     w = intbox_new(inifile_get_guint32(INI_SETTING_SOUNDBUFSIZE,
493                                        INI_SETTING_SOUNDBUFSIZE_DEFAULT));
494     cd->sound_buffer_size = INTBOX(w);
495 
496     w = combo_new();
497     cd->sound_driver = COMBO(w);
498     l = sound_driver_valid_names();
499     combo_set_items(cd->sound_driver,l,sound_driver_index());
500     gtk_signal_connect(GTK_OBJECT(cd->sound_driver),"selection_changed",
501 		       GTK_SIGNAL_FUNC(sound_driver_changed),cd);
502 
503     i = rateconv_driver_count(TRUE);
504     for (l=NULL,j=0; j<i; j++)
505 	 l = g_list_append(l,(gpointer)rateconv_driver_name(TRUE,j));
506 
507     w = combo_new();
508     cd->varispeed_method = COMBO(w);
509     j = inifile_get_guint32("varispeedConv",i-1);
510     if (j >= i) j = i-1;
511     combo_set_items(cd->varispeed_method, l, j);
512 
513     g_list_free(l);
514 
515     i = rateconv_driver_count(FALSE);
516     for (l=NULL,j=0; j<i; j++)
517 	 l = g_list_append(l,(gpointer)rateconv_driver_name(FALSE,j));
518 
519     w = combo_new();
520     cd->speed_method = COMBO(w);
521     j = inifile_get_guint32("speedConv",0);
522     if (j >= i) j = 0;
523     combo_set_items(cd->speed_method, l, j);
524 
525     g_list_free(l);
526 
527     w = gtk_entry_new();
528     cd->mixer_utility = GTK_ENTRY(w);
529     gtk_entry_set_text(cd->mixer_utility,inifile_get(INI_SETTING_MIXER,
530 						     INI_SETTING_MIXER_DEFAULT));
531 
532 
533     w = intbox_new(inifile_get_guint32(INI_SETTING_VIEW_QUALITY,
534 				       INI_SETTING_VIEW_QUALITY_DEFAULT));
535     cd->view_quality = INTBOX(w);
536 
537     w = gtk_check_button_new_with_label("");
538     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
539 				_("Show _time scale by default"));
540     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
541 				(GtkAccelFlags) 0);
542     cd->time_scale_default = GTK_TOGGLE_BUTTON(w);
543     gtk_toggle_button_set_active(cd->time_scale_default,inifile_get_gboolean(
544 				      INI_SETTING_TIMESCALE,
545 				      INI_SETTING_TIMESCALE_DEFAULT));
546 
547     w = gtk_check_button_new_with_label("");
548     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
549 				_("Show _horizontal zoom slider by default"));
550     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
551 				(GtkAccelFlags) 0);
552     cd->hzoom_default = GTK_TOGGLE_BUTTON(w);
553     gtk_toggle_button_set_active(cd->hzoom_default,inifile_get_gboolean(
554 				      INI_SETTING_HZOOM,
555 				      INI_SETTING_HZOOM_DEFAULT));
556 
557     w = gtk_check_button_new_with_label("");
558     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
559 				_("Show _vertical zoom slider by default"));
560     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
561 				(GtkAccelFlags) 0);
562     cd->vzoom_default = GTK_TOGGLE_BUTTON(w);
563     gtk_toggle_button_set_active(cd->vzoom_default,inifile_get_gboolean(
564 				      INI_SETTING_VZOOM,
565 				      INI_SETTING_VZOOM_DEFAULT));
566 
567     w = gtk_check_button_new_with_label("");
568     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
569 				_("Show _speed slider by default"));
570     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
571 				(GtkAccelFlags) 0);
572     cd->speed_default = GTK_TOGGLE_BUTTON(w);
573     gtk_toggle_button_set_active(cd->speed_default,inifile_get_gboolean(
574 				      INI_SETTING_SPEED,
575 				      INI_SETTING_SPEED_DEFAULT));
576 
577     w = gtk_check_button_new_with_label("");
578     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
579 				_("Show slider l_abels by default"));
580     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
581 				(GtkAccelFlags) 0);
582     cd->labels_default = GTK_TOGGLE_BUTTON(w);
583     gtk_toggle_button_set_active(cd->labels_default,
584 				 inifile_get_gboolean(INI_SETTING_SLABELS,
585 						      INI_SETTING_SLABELS_DEFAULT));
586 
587     w = gtk_check_button_new_with_label("");
588     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
589 				_("Show playback buffer positio_n by default"));
590     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
591 				(GtkAccelFlags) 0);
592     cd->bufpos_default = GTK_TOGGLE_BUTTON(w);
593     gtk_toggle_button_set_active(cd->bufpos_default,
594 				 inifile_get_gboolean(INI_SETTING_BUFPOS,
595 						      INI_SETTING_BUFPOS_DEFAULT));
596 
597     w = gtk_button_new_with_label("");
598     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Settings"));
599     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
600 			       (GtkAccelFlags) 0);
601     gtk_signal_connect(GTK_OBJECT(w),"clicked",
602 		       GTK_SIGNAL_FUNC(sound_settings_click),cd);
603     gtk_widget_set_sensitive(w,sound_driver_has_preferences(NULL));
604     cd->sound_driver_prefs = GTK_BUTTON(w);
605 
606     w = gtk_check_button_new_with_label("");
607     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
608 				_("_Keep sound driver opened (to avoid start/stop"
609 				" clicks)"));
610     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
611 				(GtkAccelFlags) 0);
612     cd->sound_lock = GTK_TOGGLE_BUTTON(w);
613     gtk_toggle_button_set_active(cd->sound_lock,sound_lock_driver);
614 
615     w = gtk_check_button_new_with_label("");
616     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
617 				_("_Byte-swap output (try this if playback "
618 				"sounds horrible)"));
619     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,
620 			       (GtkAccelFlags)0);
621     cd->output_bswap = GTK_TOGGLE_BUTTON(w);
622     gtk_toggle_button_set_active(cd->output_bswap,output_byteswap_flag);
623 
624     w = gtk_check_button_new_with_label("");
625     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
626 				_("Play _mono files as stereo"));
627     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,
628 			       (GtkAccelFlags)0);
629     cd->output_stereo = GTK_TOGGLE_BUTTON(w);
630     gtk_toggle_button_set_active(cd->output_stereo,output_stereo_flag);
631 
632     w = gtk_check_button_new_with_label("");
633     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
634 				_("_Update cursor information while playing"));
635     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
636 				(GtkAccelFlags) 0);
637     cd->roll_cursor = GTK_TOGGLE_BUTTON(w);
638     gtk_toggle_button_set_active(cd->roll_cursor,status_bar_roll_cursor);
639 
640     w = gtk_check_button_new_with_label("");
641     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
642 				_("_Keep cursor in center of view when "
643 				"following playback"));
644     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
645 				(GtkAccelFlags) 0);
646     cd->center_cursor = GTK_TOGGLE_BUTTON(w);
647     gtk_toggle_button_set_active(cd->center_cursor,
648 				 view_follow_strict_flag);
649 
650     w = gtk_check_button_new_with_label("");
651     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
652 				_("_Auto-start playback when jumping to mark"));
653     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
654 				(GtkAccelFlags) 0);
655     cd->mark_autoplay = GTK_TOGGLE_BUTTON(w);
656     gtk_toggle_button_set_active(cd->mark_autoplay,autoplay_mark_flag);
657 
658     w = gtk_check_button_new_with_label("");
659     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
660 				_("Enable _variable speed playback"));
661     gtk_widget_add_accelerator (w,"clicked", ag, key, GDK_MOD1_MASK,
662 				(GtkAccelFlags) 0);
663     cd->varispeed_enable = GTK_TOGGLE_BUTTON(w);
664     gtk_toggle_button_set_active(cd->varispeed_enable,
665 				 inifile_get_gboolean("varispeed",TRUE));
666 
667     w = gtk_check_button_new_with_label("");
668     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
669 				_("Auto-_reset speed"));
670     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,0);
671     cd->varispeed_autoreset = GTK_TOGGLE_BUTTON(w);
672     gtk_toggle_button_set_active(cd->varispeed_autoreset,varispeed_reset_flag);
673 
674     w = gtk_check_button_new_with_label("");
675     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
676 				_("Use fast and noisy method"));
677     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,0);
678     cd->varispeed_fast = GTK_TOGGLE_BUTTON(w);
679     gtk_toggle_button_set_active(cd->varispeed_fast,!varispeed_smooth_flag);
680 
681     w = combo_new();
682     cd->time_display = COMBO(w);
683     l = NULL;
684     l = g_list_append(l,_("(H')MM:SS.t"));
685     l = g_list_append(l,_("(H')MM:SS.mmmm"));
686     l = g_list_append(l,translate_strip(N_("TimeDisplay|Samples")));
687     l = g_list_append(l,_("Time Code 24fps"));
688     l = g_list_append(l,_("Time Code 25fps (PAL)"));
689     l = g_list_append(l,_("Time Code 29.97fps (NTSC)"));
690     l = g_list_append(l,_("Time Code 30fps"));
691     i = inifile_get_guint32(INI_SETTING_TIME_DISPLAY,0);
692     combo_set_items(cd->time_display,l,i);
693 
694     w = combo_new();
695     cd->time_display_timescale = COMBO(w);
696     i = inifile_get_guint32(INI_SETTING_TIME_DISPLAY_SCALE,i);
697     combo_set_items(cd->time_display_timescale,l,i);
698 
699     g_list_free(l);
700 
701     w = gtk_check_button_new_with_label("");
702     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
703 				_("_Remember window sizes/positions"));
704     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
705 				(GtkAccelFlags) 0);
706     cd->remember_geometry = GTK_TOGGLE_BUTTON(w);
707     gtk_toggle_button_set_active(cd->remember_geometry,
708 				 inifile_get_gboolean("useGeometry",FALSE));
709 
710     w = gtk_check_button_new_with_label("");
711     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
712 				_("_Draw waveform a second time with improved "
713 				"quality"));
714     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
715 				(GtkAccelFlags) 0);
716     cd->improve = GTK_TOGGLE_BUTTON(w);
717     gtk_toggle_button_set_active(cd->improve,
718 				 inifile_get_gboolean("drawImprove",TRUE));
719 
720 
721     w = gtk_list_new();
722     cd->tempdirs = GTK_LIST(w);
723     gtk_list_set_selection_mode(cd->tempdirs,GTK_SELECTION_SINGLE);
724     for (i=0; 1; i++) {
725 	 ch = get_temp_directory(i);
726 	 if (ch == NULL) break;
727 	 a = gtk_list_item_new_with_label(ch);
728 	 gtk_container_add(GTK_CONTAINER(w),a);
729     }
730     gtk_signal_connect(GTK_OBJECT(w),"select_child",
731 		       GTK_SIGNAL_FUNC(tempdir_select),cd);
732     gtk_signal_connect(GTK_OBJECT(w),"unselect_child",
733 		       GTK_SIGNAL_FUNC(tempdir_unselect),cd);
734     cd->selected_tempdir = NULL;
735 
736 
737     w = gtk_entry_new();
738     cd->tempdir_add_entry = GTK_ENTRY(w);
739 
740 
741     w = gtk_button_new_with_label("");
742     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Remove"));
743     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
744 			       (GtkAccelFlags) 0);
745     gtk_signal_connect(GTK_OBJECT(w),"clicked",
746 		       GTK_SIGNAL_FUNC(tempdir_remove_click),cd);
747     gtk_widget_set_sensitive(w,FALSE);
748     cd->tempdir_remove = GTK_BUTTON(w);
749     w = gtk_button_new_with_label("");
750     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Add"));
751     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
752 			       (GtkAccelFlags) 0);
753     gtk_signal_connect(GTK_OBJECT(w),"clicked",
754 		       GTK_SIGNAL_FUNC(tempdir_add_click),cd);
755     cd->tempdir_add = GTK_BUTTON(w);
756     w = gtk_button_new_with_label("");
757     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Browse..."));
758     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
759 			       (GtkAccelFlags) 0);
760     gtk_signal_connect(GTK_OBJECT(w),"clicked",
761 		       GTK_SIGNAL_FUNC(tempdir_browse_click),cd);
762     cd->tempdir_browse = GTK_BUTTON(w);
763     w = gtk_button_new_with_label("");
764     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Up"));
765     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
766 			       (GtkAccelFlags) 0);
767     gtk_signal_connect(GTK_OBJECT(w),"clicked",
768 		       GTK_SIGNAL_FUNC(tempdir_up_click),cd);
769     gtk_widget_set_sensitive(w,FALSE);
770     cd->tempdir_up = GTK_BUTTON(w);
771     w = gtk_button_new_with_label("");
772     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child), _("_Down"));
773     gtk_widget_add_accelerator(w, "clicked", ag, key, GDK_MOD1_MASK,
774 			       (GtkAccelFlags) 0);
775     gtk_signal_connect(GTK_OBJECT(w),"clicked",
776 		       GTK_SIGNAL_FUNC(tempdir_down_click),cd);
777     gtk_widget_set_sensitive(w,FALSE);
778     cd->tempdir_down = GTK_BUTTON(w);
779 
780     w = intbox_new(inifile_get_guint32("recentFiles",4));
781     cd->recent_files = INTBOX(w);
782 
783     w = intbox_new(inifile_get_guint32("vzoomMax",100));
784     cd->vzoom_max = INTBOX(w);
785 
786     w = gtk_check_button_new_with_label("");
787     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
788 				_("Keep main _window in front after "
789 				"applying effect"));
790     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
791 				(GtkAccelFlags) 0);
792     cd->mainwin_front = GTK_TOGGLE_BUTTON(w);
793     gtk_toggle_button_set_active(cd->mainwin_front,
794 				 inifile_get_gboolean("mainwinFront",TRUE));
795 
796 
797     w = format_selector_new(TRUE);
798     format_selector_set(FORMAT_SELECTOR(w),&player_fallback_format);
799     cd->fallback_format = FORMAT_SELECTOR(w);
800 
801 
802     w = gtk_check_button_new_with_label("");
803     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (w)->child),
804 				_("_Use floating-point temporary files"));
805     gtk_widget_add_accelerator (w, "clicked", ag, key, GDK_MOD1_MASK,
806 				(GtkAccelFlags) 0);
807     cd->floating_tempfiles = GTK_TOGGLE_BUTTON(w);
808     gtk_toggle_button_set_active(cd->floating_tempfiles,
809 				 chunk_filter_use_floating_tempfiles);
810 
811     w = gtk_check_button_new_with_label("");
812     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
813 				_("Enable _dithering for editing"));
814     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,
815 			       (GtkAccelFlags)0);
816     cd->dither_editing = GTK_TOGGLE_BUTTON(w);
817     gtk_toggle_button_set_active(cd->dither_editing,dither_editing);
818 
819     w = gtk_check_button_new_with_label("");
820     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
821 				_("Enable dithering for _playback"));
822     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,
823 			       (GtkAccelFlags)0);
824     cd->dither_playback = GTK_TOGGLE_BUTTON(w);
825     gtk_toggle_button_set_active(cd->dither_playback,dither_playback);
826 
827     w = gtk_check_button_new_with_label("");
828     key = gtk_label_parse_uline(GTK_LABEL(GTK_BIN(w)->child),
829 				_("Auto dete_ct driver on each start-up"));
830     gtk_widget_add_accelerator(w,"clicked",ag,key,GDK_MOD1_MASK,
831 			       (GtkAccelFlags)0);
832     cd->driver_autodetect = GTK_TOGGLE_BUTTON(w);
833     if (!strcmp(inifile_get(INI_SETTING_SOUNDDRIVER,DEFAULT_DRIVER),"auto")) {
834 	 gtk_widget_set_sensitive(GTK_WIDGET(cd->sound_driver),FALSE);
835 	 gtk_toggle_button_set_active(cd->driver_autodetect,TRUE);
836     }
837     gtk_signal_connect(GTK_OBJECT(w),"toggled",
838 		       GTK_SIGNAL_FUNC(driver_autodetect_toggled),cd);
839 
840     w = combo_new();
841     l = NULL;
842     l = g_list_append(l,_("Direct access"));
843     l = g_list_append(l,_("Decompress"));
844     l = g_list_append(l,_("Bypass"));
845     combo_set_items(COMBO(w),l,inifile_get_guint32("sndfileOggMode",1));
846     g_list_free(l);
847     if (!sndfile_ogg_supported()) {
848 	 combo_set_selection(COMBO(w),2);
849 	 gtk_widget_set_sensitive(w,FALSE);
850     }
851     cd->oggmode = COMBO(w);
852 
853     w = combo_new();
854     l = NULL;
855     l = g_list_append(l,_("Biased"));
856     l = g_list_append(l,_("Pure-Scaled"));
857     combo_set_items(COMBO(w),l,sample_convert_mode);
858     g_list_free(l);
859     cd->convmode = COMBO(w);
860 
861     /* Layout the window */
862 
863     a = gtk_vbox_new(FALSE,5);
864     gtk_container_add(GTK_CONTAINER(cd),a);
865     b = gtk_notebook_new();
866     gtk_notebook_set_tab_pos(GTK_NOTEBOOK(b),GTK_POS_TOP);
867     gtk_box_pack_start(GTK_BOX(a),b,TRUE,TRUE,0);
868 
869 
870 
871     c = gtk_vbox_new(FALSE,14);
872     gtk_container_set_border_width(GTK_CONTAINER(c),8);
873     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Interface")));
874     d = gtk_frame_new(_(" Main window "));
875     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
876     e = gtk_vbox_new(FALSE,3);
877     gtk_container_set_border_width(GTK_CONTAINER(e),5);
878     gtk_container_add(GTK_CONTAINER(d),e);
879     f = GTK_WIDGET(cd->remember_geometry);
880     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
881     f = GTK_WIDGET(cd->mainwin_front);
882     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
883     f = gtk_hbox_new(FALSE,3);
884     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
885     g = gtk_label_new(_("Number of recent files in File menu: "));
886     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
887     g = GTK_WIDGET(cd->recent_files);
888     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8);
889 
890     d = gtk_frame_new(_(" View "));
891     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
892     e = gtk_vbox_new(FALSE,3);
893     gtk_container_set_border_width(GTK_CONTAINER(e),5);
894     gtk_container_add(GTK_CONTAINER(d),e);
895     f = GTK_WIDGET(cd->improve);
896     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
897     f = gtk_hbox_new(FALSE,3);
898     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
899     g = gtk_button_new_with_label("");
900     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (g)->child),
901 				_("Customize co_lors..."));
902     gtk_widget_add_accelerator (g,"clicked",ag,key,GDK_MOD1_MASK,
903 				(GtkAccelFlags) 0);
904     gtk_signal_connect(GTK_OBJECT(g),"clicked",GTK_SIGNAL_FUNC(colors_click),
905 		       cd);
906     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
907 
908     d = gtk_frame_new(_(" Window contents "));
909     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
910     e = gtk_vbox_new(FALSE,3);
911     gtk_container_set_border_width(GTK_CONTAINER(e),5);
912     gtk_container_add(GTK_CONTAINER(d),e);
913     f = GTK_WIDGET(cd->time_scale_default);
914     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
915     f = GTK_WIDGET(cd->vzoom_default);
916     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
917     f = GTK_WIDGET(cd->speed_default);
918     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
919     f = GTK_WIDGET(cd->labels_default);
920     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
921     f = GTK_WIDGET(cd->bufpos_default);
922     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
923     f = gtk_hbox_new(FALSE,3);
924     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
925     g = gtk_label_new(_("Vertical zoom limit: "));
926     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
927     g = GTK_WIDGET(cd->vzoom_max);
928     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8);
929     g = gtk_label_new(_("x"));
930     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
931 
932 
933     c = gtk_vbox_new(FALSE,14);
934     gtk_container_set_border_width(GTK_CONTAINER(c),8);
935     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Sound")));
936     d = gtk_frame_new(_(" Driver options "));
937     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
938     e = gtk_vbox_new(FALSE,3);
939     gtk_container_set_border_width(GTK_CONTAINER(e),5);
940     gtk_container_add(GTK_CONTAINER(d),e);
941     f = gtk_hbox_new(FALSE,3);
942     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
943     g = gtk_label_new("");
944     key = gtk_label_parse_uline(GTK_LABEL (g), _("_Driver:"));
945     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
946     g = GTK_WIDGET(cd->sound_driver);
947     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
948 			       (GtkAccelFlags) 0);
949     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8);
950     g = GTK_WIDGET(cd->sound_driver_prefs);
951     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,3);
952     f = GTK_WIDGET(cd->driver_autodetect);
953     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
954     f = GTK_WIDGET(cd->output_bswap);
955     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
956     f = GTK_WIDGET(cd->sound_lock);
957     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
958     f = GTK_WIDGET(cd->output_stereo);
959     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
960 
961     d = gtk_frame_new(_(" Fallback format "));
962     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
963     e = gtk_vbox_new(FALSE,3);
964     gtk_container_set_border_width(GTK_CONTAINER(e),5);
965     gtk_container_add(GTK_CONTAINER(d),e);
966     f = gtk_label_new(_("Sample format to try when the sound file's format isn't"
967 		      " supported."));
968     gtk_label_set_line_wrap(GTK_LABEL(f),TRUE);
969     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
970     f = GTK_WIDGET(cd->fallback_format);
971     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
972 
973 
974 
975 
976     c = gtk_vbox_new(FALSE,14);
977     gtk_container_set_border_width(GTK_CONTAINER(c),8);
978     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Playback")));
979 
980     d = gtk_frame_new(_(" Playback settings "));
981     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
982     e = gtk_vbox_new(FALSE,3);
983     gtk_container_set_border_width(GTK_CONTAINER(e),5);
984     gtk_container_add(GTK_CONTAINER(d),e);
985     f = GTK_WIDGET(cd->mark_autoplay);
986     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
987     f = GTK_WIDGET(cd->roll_cursor);
988     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
989     f = GTK_WIDGET(cd->center_cursor);
990     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
991 
992     d = gtk_frame_new(_(" Variable speed "));
993     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
994     e = gtk_vbox_new(FALSE,3);
995     gtk_container_set_border_width(GTK_CONTAINER(e),5);
996     gtk_container_add(GTK_CONTAINER(d),e);
997     f = GTK_WIDGET(cd->varispeed_enable);
998     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
999     f = GTK_WIDGET(cd->varispeed_fast);
1000     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1001     f = GTK_WIDGET(cd->varispeed_autoreset);
1002     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1003 
1004 
1005     c = gtk_vbox_new(FALSE,14);
1006     gtk_container_set_border_width(GTK_CONTAINER(c),8);
1007     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Files")));
1008 
1009     d = gtk_frame_new(_(" Temporary file directories "));
1010     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1011     e = gtk_vbox_new(FALSE,3);
1012     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1013     gtk_container_add(GTK_CONTAINER(d),e);
1014     f = gtk_table_new(5,3,FALSE);
1015     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1016     g = gtk_scrolled_window_new(NULL,NULL);
1017     gtk_table_attach(GTK_TABLE(f),g,0,2,0,4,GTK_EXPAND|GTK_FILL,GTK_FILL,0,0);
1018     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g),GTK_POLICY_NEVER,
1019 				   GTK_POLICY_AUTOMATIC);
1020     h = GTK_WIDGET(cd->tempdirs);
1021     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(g),h);
1022     g = GTK_WIDGET(cd->tempdir_up);
1023     gtk_table_attach(GTK_TABLE(f),g,2,3,0,1,GTK_FILL,0,0,0);
1024     g = GTK_WIDGET(cd->tempdir_down);
1025     gtk_table_attach(GTK_TABLE(f),g,2,3,1,2,GTK_FILL,0,0,0);
1026     g = GTK_WIDGET(cd->tempdir_remove);
1027     gtk_table_attach(GTK_TABLE(f),g,2,3,2,3,GTK_FILL,0,0,0);
1028     g = GTK_WIDGET(cd->tempdir_add_entry);
1029     gtk_table_attach(GTK_TABLE(f),g,0,1,4,5,GTK_EXPAND|GTK_FILL,0,0,4);
1030     g = GTK_WIDGET(cd->tempdir_browse);
1031     gtk_table_attach(GTK_TABLE(f),g,1,2,4,5,GTK_FILL,0,0,4);
1032     g = GTK_WIDGET(cd->tempdir_add);
1033     gtk_table_attach(GTK_TABLE(f),g,2,3,4,5,GTK_FILL,0,0,4);
1034 
1035     d = gtk_frame_new(_(" Temporary file settings "));
1036     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1037     e = gtk_vbox_new(FALSE,3);
1038     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1039     gtk_container_add(GTK_CONTAINER(d),e);
1040     f = gtk_label_new(_("To avoid rounding errors when applying more than one "
1041 		      "effect on the same data, floating-point temporary "
1042 		      "files can be used. However, this will increase disk "
1043 		      "and CPU usage."));
1044     gtk_label_set_line_wrap(GTK_LABEL(f),TRUE);
1045     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1046     f = GTK_WIDGET(cd->floating_tempfiles);
1047     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1048     f = gtk_label_new(_("Some versions of libsndfile supports accessing "
1049 			"Ogg files without decompressing to a temporary "
1050 			"file."));
1051     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1052     gtk_label_set_line_wrap(GTK_LABEL(f),TRUE);
1053     f = gtk_hbox_new(FALSE,3);
1054     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1055     g = gtk_label_new("Libsndfile ogg handling: ");
1056     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1057     g = GTK_WIDGET(cd->oggmode);
1058     gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,0);
1059 
1060     c = gtk_vbox_new(FALSE,14);
1061     gtk_container_set_border_width(GTK_CONTAINER(c),8);
1062     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Quality")));
1063 
1064     d = gtk_frame_new(_(" Rate conversions "));
1065     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1066     e = gtk_vbox_new(FALSE,3);
1067     gtk_container_add(GTK_CONTAINER(d),e);
1068     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1069     f = gtk_table_new(2,2,FALSE);
1070     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1071     attach_label(_("Varispeed: "),f,0,0);
1072     attach_label(_("Speed effect: "),f,1,0);
1073     g = GTK_WIDGET(cd->varispeed_method);
1074     gtk_table_attach(GTK_TABLE(f),g,1,2,0,1,GTK_EXPAND|GTK_FILL,0,0,0);
1075     g = GTK_WIDGET(cd->speed_method);
1076     gtk_table_attach(GTK_TABLE(f),g,1,2,1,2,GTK_EXPAND|GTK_FILL,0,0,0);
1077     gtk_table_set_row_spacings(GTK_TABLE(f),4);
1078 
1079     d = gtk_frame_new(_(" Dithering "));
1080     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1081     e = gtk_vbox_new(FALSE,3);
1082     gtk_container_add(GTK_CONTAINER(d),e);
1083     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1084 
1085     f = GTK_WIDGET(cd->dither_editing);
1086     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1087     f = GTK_WIDGET(cd->dither_playback);
1088     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1089 
1090     d = gtk_frame_new(_(" Sample conversion "));
1091     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1092     e = gtk_vbox_new(FALSE,3);
1093     gtk_container_add(GTK_CONTAINER(d),e);
1094     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1095     f = gtk_hbox_new(FALSE,0);
1096     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1097     g = gtk_label_new(_("Normalization mode: "));
1098     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1099     g = GTK_WIDGET(cd->convmode);
1100     gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,0);
1101 
1102     c = gtk_vbox_new(FALSE,14);
1103     gtk_container_set_border_width(GTK_CONTAINER(c),8);
1104     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Other")));
1105 
1106     d = gtk_frame_new(_(" Time format "));
1107     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1108 
1109     e = gtk_table_new(2,2,FALSE);
1110     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1111     gtk_container_add(GTK_CONTAINER(d),e);
1112     gtk_table_set_row_spacings(GTK_TABLE(e),4);
1113 
1114     g = gtk_label_new("");
1115     key = gtk_label_parse_uline(GTK_LABEL(g), _("Display t_imes as: "));
1116     gtk_misc_set_alignment(GTK_MISC(g),0.0,0.5);
1117     gtk_table_attach(GTK_TABLE(e),g,0,1,0,1,GTK_FILL,0,0,0);
1118 
1119     g = GTK_WIDGET(cd->time_display);
1120     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
1121 			       (GtkAccelFlags) 0);
1122     gtk_table_attach(GTK_TABLE(e),g,1,2,0,1,GTK_FILL|GTK_EXPAND,0,0,0);
1123 
1124 
1125     g = gtk_label_new("");
1126     key = gtk_label_parse_uline(GTK_LABEL(g), _("Times_cale format: "));
1127     gtk_misc_set_alignment(GTK_MISC(g),0.0,0.5);
1128     gtk_table_attach(GTK_TABLE(e),g,0,1,1,2,GTK_FILL,0,0,0);
1129 
1130     g = GTK_WIDGET(cd->time_display_timescale);
1131     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
1132 			       (GtkAccelFlags) 0);
1133     gtk_table_attach(GTK_TABLE(e),g,1,2,1,2,GTK_FILL|GTK_EXPAND,0,0,0);
1134 
1135 
1136 
1137     d = gtk_frame_new(_(" External applications "));
1138     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1139     e = gtk_vbox_new(FALSE,3);
1140     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1141     gtk_container_add(GTK_CONTAINER(d),e);
1142     f = gtk_hbox_new(FALSE,3);
1143     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,3);
1144     g = gtk_label_new("");
1145     key = gtk_label_parse_uline(GTK_LABEL (g), _("Mi_xer utility: "));
1146     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1147     g = GTK_WIDGET(cd->mixer_utility);
1148     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
1149 			       (GtkAccelFlags) 0);
1150     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,8);
1151 
1152 
1153     c = gtk_vbox_new(FALSE,14);
1154     gtk_container_set_border_width(GTK_CONTAINER(c),8);
1155     gtk_notebook_append_page(GTK_NOTEBOOK(b),c,gtk_label_new(_("Advanced")));
1156     d = gtk_frame_new(_(" Advanced settings "));
1157     gtk_box_pack_start(GTK_BOX(c),d,FALSE,FALSE,0);
1158     e = gtk_vbox_new(FALSE,3);
1159     gtk_container_set_border_width(GTK_CONTAINER(e),5);
1160     gtk_container_add(GTK_CONTAINER(d),e);
1161     f = gtk_hbox_new(FALSE,3);
1162     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1163     g = gtk_label_new("");
1164     key = gtk_label_parse_uline(GTK_LABEL (g), _("Disk editing _threshold: "));
1165     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1166     g = GTK_WIDGET(cd->disk_threshold);
1167     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK, (GtkAccelFlags) 0);
1168     gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8);
1169     g = gtk_label_new("K ");
1170     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1171 
1172     f = gtk_hbox_new(FALSE,3);
1173     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1174     g = gtk_label_new("");
1175     key = gtk_label_parse_uline(GTK_LABEL (g), _("View _quality:"));
1176     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1177     g = GTK_WIDGET(cd->view_quality);
1178     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
1179 			       (GtkAccelFlags) 0);
1180     gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8);
1181     g = gtk_label_new(_("samples/pixel"));
1182     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1183 
1184     f = gtk_hbox_new(FALSE,3);
1185     gtk_box_pack_start(GTK_BOX(e),f,FALSE,FALSE,0);
1186     g = gtk_label_new("");
1187     key = gtk_label_parse_uline(GTK_LABEL (g), _("Output _buffer size:"));
1188     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1189     g = GTK_WIDGET(cd->sound_buffer_size);
1190     gtk_widget_add_accelerator(g, "grab_focus", ag, key, GDK_MOD1_MASK,
1191 			       (GtkAccelFlags) 0);
1192     gtk_box_pack_start(GTK_BOX(f),g,TRUE,TRUE,8);
1193     g = gtk_label_new(_("bytes"));
1194     gtk_box_pack_start(GTK_BOX(f),g,FALSE,FALSE,0);
1195 
1196 
1197 
1198 
1199     b = gtk_hbutton_box_new();
1200     gtk_box_pack_start(GTK_BOX(a),b,FALSE,TRUE,0);
1201 
1202 
1203     c = gtk_button_new_with_label("");
1204     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (c)->child), _("_OK"));
1205     gtk_widget_add_accelerator (c, "clicked", ag, key, GDK_MOD1_MASK,
1206 				(GtkAccelFlags) 0);
1207     gtk_widget_add_accelerator (c, "clicked", ag, GDK_KP_Enter, 0,
1208 				(GtkAccelFlags) 0);
1209     gtk_widget_add_accelerator (c, "clicked", ag, GDK_Return, 0,
1210 				(GtkAccelFlags) 0);
1211     gtk_signal_connect(GTK_OBJECT(c),"clicked",
1212 		       GTK_SIGNAL_FUNC(config_dialog_ok),cd);
1213 
1214     gtk_container_add (GTK_CONTAINER (b), c);
1215     GTK_WIDGET_SET_FLAGS (c, GTK_CAN_DEFAULT);
1216 
1217     c = gtk_button_new_with_label("");
1218     key = gtk_label_parse_uline(GTK_LABEL (GTK_BIN (c)->child), _("_Close"));
1219     gtk_widget_add_accelerator (c, "clicked", ag, key, GDK_MOD1_MASK,
1220 				(GtkAccelFlags) 0);
1221     gtk_widget_add_accelerator (c, "clicked", ag, GDK_Escape, 0,
1222 				(GtkAccelFlags) 0);
1223     gtk_signal_connect_object(GTK_OBJECT(c),"clicked",
1224                               GTK_SIGNAL_FUNC(gtk_widget_destroy),
1225                               GTK_OBJECT(cd));
1226     gtk_container_add (GTK_CONTAINER (b), c);
1227     GTK_WIDGET_SET_FLAGS (c, GTK_CAN_DEFAULT);
1228     gtk_widget_show_all(a);
1229 
1230     gtk_window_add_accel_group(GTK_WINDOW (cd), ag);
1231 
1232 
1233 }
1234 
config_dialog_get_type(void)1235 GtkType config_dialog_get_type(void)
1236 {
1237      static GtkType id = 0;
1238      if (!id) {
1239 	  GtkTypeInfo info = {
1240 	       "ConfigDialog",
1241 	       sizeof(ConfigDialog),
1242 	       sizeof(ConfigDialogClass),
1243 	       (GtkClassInitFunc) config_dialog_class_init,
1244 	       (GtkObjectInitFunc) config_dialog_init
1245 	  };
1246 	  id = gtk_type_unique(gtk_window_get_type(),&info);
1247      }
1248      return id;
1249 }
1250 
config_dialog_new(void)1251 GtkWidget *config_dialog_new(void)
1252 {
1253      return gtk_type_new(config_dialog_get_type());
1254 }
1255