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