comparison src/audlegacy/ui_preferences.c @ 4811:7bf7f83a217e

rename src/audacious src/audlegacy so that both audlegacy and audacious can coexist.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Wed, 26 Nov 2008 00:44:56 +0900
parents src/audacious/ui_preferences.c@0ea6dd6bfb5a
children 34d54dc5576d
comparison
equal deleted inserted replaced
4810:c10e53092037 4811:7bf7f83a217e
1 /* Audacious - Cross-platform multimedia player
2 * Copyright (C) 2005-2007 Audacious development team.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; under version 3 of the License.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses>.
15 *
16 * The Audacious team does not consider modular code linking to
17 * Audacious or using our public API to be a derived work.
18 */
19
20 #ifdef HAVE_CONFIG_H
21 # include "config.h"
22 #endif
23
24 /* #define AUD_DEBUG */
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <string.h>
30 #include <stddef.h>
31 #include <stdio.h>
32 #include <sys/types.h>
33 #include <dirent.h>
34 #include <unistd.h>
35 #include <errno.h>
36 #include <sys/types.h>
37 #include <sys/stat.h>
38 #include <gdk/gdkkeysyms.h>
39
40 #include "plugin.h"
41 #include "pluginenum.h"
42 #include "input.h"
43 #include "effect.h"
44 #include "general.h"
45 #include "output.h"
46 #include "visualization.h"
47 #include "playlist.h"
48
49 #include "strings.h"
50 #include "util.h"
51 #include "dnd.h"
52 #include "configdb.h"
53 #include "preferences.h"
54
55 #include "legacy/ui_equalizer.h"
56 #include "legacy/ui_main.h"
57 #include "legacy/ui_playlist.h"
58 #include "legacy/ui_skinselector.h"
59 #include "ui_preferences.h"
60 #include "legacy/ui_skinned_playlist.h"
61 #include "legacy/ui_skinned_textbox.h"
62 #include "legacy/ui_skinned_window.h"
63
64 #include "build_stamp.h"
65
66 #define TITLESTRING_UPDATE_TIMEOUT 3
67
68 enum CategoryViewCols {
69 CATEGORY_VIEW_COL_ICON,
70 CATEGORY_VIEW_COL_NAME,
71 CATEGORY_VIEW_COL_ID,
72 CATEGORY_VIEW_N_COLS
73 };
74
75 enum PluginViewCols {
76 PLUGIN_VIEW_COL_ACTIVE,
77 PLUGIN_VIEW_COL_DESC,
78 PLUGIN_VIEW_COL_FILENAME,
79 PLUGIN_VIEW_COL_ID,
80 PLUGIN_VIEW_COL_PLUGIN_PTR,
81 PLUGIN_VIEW_N_COLS
82 };
83
84 enum PluginViewType {
85 PLUGIN_VIEW_TYPE_INPUT,
86 PLUGIN_VIEW_TYPE_GENERAL,
87 PLUGIN_VIEW_TYPE_VIS,
88 PLUGIN_VIEW_TYPE_EFFECT
89 };
90
91 typedef struct {
92 const gchar *icon_path;
93 const gchar *name;
94 } Category;
95
96 typedef struct {
97 const gchar *name;
98 const gchar *tag;
99 } TitleFieldTag;
100
101 typedef struct {
102 gint x;
103 gint y;
104 } MenuPos;
105
106 static GtkWidget *prefswin = NULL;
107 static GtkWidget *filepopup_settings = NULL;
108 static GtkWidget *colorize_settings = NULL;
109 static GtkWidget *category_treeview = NULL;
110 static GtkWidget *category_notebook = NULL;
111 GtkWidget *filepopupbutton = NULL;
112
113 /* colorize settings scales */
114 GtkWidget *green_scale;
115 GtkWidget *red_scale;
116 GtkWidget *blue_scale;
117
118 /* filepopup settings widgets */
119 GtkWidget *filepopup_settings_cover_name_include;
120 GtkWidget *filepopup_settings_cover_name_exclude;
121 GtkWidget *filepopup_settings_recurse_for_cover;
122 GtkWidget *filepopup_settings_recurse_for_cover_depth;
123 GtkWidget *filepopup_settings_recurse_for_cover_depth_box;
124 GtkWidget *filepopup_settings_use_file_cover;
125 GtkWidget *filepopup_settings_showprogressbar;
126 GtkWidget *filepopup_settings_delay;
127
128 /* prefswin widgets */
129 GtkWidget *titlestring_entry;
130 GtkWidget *skin_view;
131 GtkWidget *skin_refresh_button;
132 GtkWidget *filepopup_for_tuple_settings_button;
133 GtkTooltips *tooltips;
134 static gint titlestring_timeout_counter = 0;
135
136 static Category categories[] = {
137 {DATA_DIR "/images/appearance.png", N_("Appearance")},
138 {DATA_DIR "/images/audio.png", N_("Audio")},
139 {DATA_DIR "/images/replay_gain.png", N_("Replay Gain")},
140 {DATA_DIR "/images/connectivity.png", N_("Connectivity")},
141 {DATA_DIR "/images/mouse.png", N_("Mouse")},
142 {DATA_DIR "/images/playback.png", N_("Playback")},
143 {DATA_DIR "/images/playlist.png", N_("Playlist")},
144 {DATA_DIR "/images/plugins.png", N_("Plugins")},
145 };
146
147 static gint n_categories = G_N_ELEMENTS(categories);
148
149 static TitleFieldTag title_field_tags[] = {
150 { N_("Artist") , "${artist}" },
151 { N_("Album") , "${album}" },
152 { N_("Title") , "${title}" },
153 { N_("Tracknumber"), "${track-number}" },
154 { N_("Genre") , "${genre}" },
155 { N_("Filename") , "${file-name}" },
156 { N_("Filepath") , "${file-path}" },
157 { N_("Date") , "${date}" },
158 { N_("Year") , "${year}" },
159 { N_("Comment") , "${comment}" },
160 { N_("Codec") , "${codec}" },
161 { N_("Quality") , "${quality}" },
162 };
163 static const guint n_title_field_tags = G_N_ELEMENTS(title_field_tags);
164
165
166 const gchar *chardet_detector_presets[] = {
167 N_("None"),
168 N_("Japanese"),
169 N_("Taiwanese"),
170 N_("Chinese"),
171 N_("Korean"),
172 N_("Russian"),
173 N_("Greek"),
174 N_("Hebrew"),
175 N_("Turkish"),
176 N_("Arabic"),
177 #ifdef HAVE_UDET
178 N_("Universal")
179 #endif
180 };
181 const guint n_chardet_detector_presets = G_N_ELEMENTS(chardet_detector_presets);
182
183
184 typedef struct {
185 void *next;
186 GtkWidget *container;
187 char *pg_name;
188 char *img_url;
189 } CategoryQueueEntry;
190
191 CategoryQueueEntry *category_queue = NULL;
192
193 static void playlist_show_pl_separator_numbers_cb();
194 static void show_wm_decorations_cb();
195 static void bitmap_fonts_cb();
196 static void mainwin_font_set_cb();
197 static void playlist_font_set_cb();
198 GtkWidget *ui_preferences_chardet_table_populate(void);
199 static GtkWidget *ui_preferences_bit_depth(void);
200 static GtkWidget *ui_preferences_rg_params(void);
201
202 static PreferencesWidget appearance_misc_widgets[] = {
203 {WIDGET_LABEL, N_("<b>_Fonts</b>"), NULL, NULL, NULL, FALSE},
204 {WIDGET_FONT_BTN, N_("_Player:"), &cfg.mainwin_font, G_CALLBACK(mainwin_font_set_cb), N_("Select main player window font:"), FALSE},
205 {WIDGET_FONT_BTN, N_("_Playlist:"), &cfg.playlist_font, G_CALLBACK(playlist_font_set_cb), N_("Select playlist font:"), FALSE},
206 {WIDGET_CHK_BTN, N_("Use Bitmap fonts if available"), &cfg.mainwin_use_bitmapfont, G_CALLBACK(bitmap_fonts_cb), N_("Use bitmap fonts if they are available. Bitmap fonts do not support Unicode strings."), FALSE},
207 {WIDGET_LABEL, N_("<b>_Miscellaneous</b>"), NULL, NULL, NULL, FALSE},
208 {WIDGET_CHK_BTN, N_("Show track numbers in playlist"), &cfg.show_numbers_in_pl,
209 G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
210 {WIDGET_CHK_BTN, N_("Show separators in playlist"), &cfg.show_separator_in_pl,
211 G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
212 {WIDGET_CHK_BTN, N_("Show window manager decoration"), &cfg.show_wm_decorations, G_CALLBACK(show_wm_decorations_cb),
213 N_("This enables the window manager to show decorations for windows."), FALSE},
214 {WIDGET_CHK_BTN, N_("Use two-way text scroller"), &cfg.twoway_scroll, NULL,
215 N_("If selected, the file information text in the main window will scroll back and forth. If not selected, the text will only scroll in one direction."), FALSE},
216 {WIDGET_CHK_BTN, N_("Disable inline gtk theme"), &cfg.disable_inline_gtk, NULL, NULL, FALSE},
217 {WIDGET_CHK_BTN, N_("Allow loading incomplete skins"), &cfg.allow_broken_skins, NULL,
218 N_("If selected, audacious won't refuse loading broken skins. Use only if your favourite skin doesn't work"), FALSE},
219 };
220
221 static PreferencesWidget audio_page_widgets[] = {
222 {WIDGET_LABEL, N_("<b>Format Detection</b>"), NULL, NULL, NULL, FALSE},
223 {WIDGET_CHK_BTN, N_("Detect file formats on demand, instead of immediately."), &cfg.playlist_detect, NULL,
224 N_("When checked, Audacious will detect file formats on demand. This can result in a messier playlist, but delivers a major speed benefit."), FALSE},
225 {WIDGET_CHK_BTN, N_("Detect file formats by extension."), &cfg.use_extension_probing, NULL,
226 N_("When checked, Audacious will detect file formats based by extension. Only files with extensions of supported formats will be loaded."), FALSE},
227 {WIDGET_LABEL, N_("<b>Bit Depth</b>"), NULL, NULL, NULL, FALSE},
228 {WIDGET_CUSTOM, NULL, NULL, NULL, NULL, FALSE, ui_preferences_bit_depth},
229 };
230
231 static PreferencesWidget audio_page_widgets2[] = {
232 {WIDGET_LABEL, N_("<b>Volume Control</b>"), NULL, NULL, NULL, FALSE},
233 {WIDGET_CHK_BTN, N_("Use software volume control"), &cfg.software_volume_control, NULL,
234 N_("Use software volume control. This may be useful for situations where your audio system does not support controlling the playback volume."), FALSE},
235 {WIDGET_LABEL, N_("<b>Advanced</b>"), NULL, NULL, NULL, FALSE},
236 {WIDGET_CHK_BTN, N_("Bypass all of signal processing if possible"), &cfg.bypass_dsp, NULL,
237 N_("Try to pass input plugin's output directly to output plugin, if the latter supports "
238 "format produced by input plugin. If it's true, all signal processing will be disabled "
239 "(i.e. DSP plugins, equalizer, resampling, Replay Gain and software volume control)."), FALSE},
240 };
241
242 static PreferencesWidget replay_gain_page_widgets[] = {
243 {WIDGET_LABEL, N_("<b>Replay Gain configuration</b>"), NULL, NULL, NULL, FALSE},
244 {WIDGET_CHK_BTN, N_("Enable Replay Gain"), &cfg.enable_replay_gain, NULL, NULL, FALSE},
245 {WIDGET_LABEL, N_("<b>Replay Gain mode</b>"), NULL, NULL, NULL, TRUE},
246 {WIDGET_RADIO_BTN, N_("Track gain/peak"), &cfg.replay_gain_track, NULL, NULL, TRUE},
247 {WIDGET_RADIO_BTN, N_("Album gain/peak"), &cfg.replay_gain_album, NULL, NULL, TRUE},
248 {WIDGET_LABEL, N_("<b>Miscellaneous</b>"), NULL, NULL, NULL, TRUE},
249 {WIDGET_CHK_BTN, N_("Enable peak info clipping prevention"), &cfg.enable_clipping_prevention, NULL,
250 N_("Use peak value from Replay Gain info for clipping prevention"), TRUE},
251 {WIDGET_CHK_BTN, N_("Dynamically adjust scale factor to prevent clipping"), &cfg.enable_adaptive_scaler, NULL,
252 N_("Decrease scale factor (gain) if clipping nevertheless occurred"), TRUE},
253 {WIDGET_CUSTOM, NULL, NULL, NULL, NULL, TRUE, ui_preferences_rg_params},
254 };
255
256 static PreferencesWidget playback_page_widgets[] = {
257 {WIDGET_LABEL, N_("<b>Playback</b>"), NULL, NULL, NULL, FALSE},
258 {WIDGET_CHK_BTN, N_("Continue playback on startup"), &cfg.resume_playback_on_startup, NULL,
259 N_("When Audacious starts, automatically begin playing from the point where we stopped before."), FALSE},
260 {WIDGET_CHK_BTN, N_("Don't advance in the playlist"), &cfg.no_playlist_advance, NULL,
261 N_("When finished playing a song, don't automatically advance to the next."), FALSE},
262 {WIDGET_CHK_BTN, N_("Pause between songs"), &cfg.pause_between_songs, NULL, NULL, FALSE},
263 {WIDGET_SPIN_BTN, N_("Pause for"), &cfg.pause_between_songs_time, NULL, N_("seconds"), TRUE},
264 };
265
266 static PreferencesWidget playlist_page_widgets[] = {
267 {WIDGET_LABEL, N_("<b>Filename</b>"), NULL, NULL, NULL, FALSE},
268 {WIDGET_CHK_BTN, N_("Convert underscores to blanks"), &cfg.convert_underscore, NULL, NULL, FALSE},
269 {WIDGET_CHK_BTN, N_("Convert %20 to blanks"), &cfg.convert_twenty, NULL, NULL, FALSE},
270 {WIDGET_CHK_BTN, N_("Convert backslash '\\' to forward slash '/'"), &cfg.convert_slash, NULL, NULL, FALSE},
271 {WIDGET_LABEL, N_("<b>Metadata</b>"), NULL, NULL, NULL, FALSE},
272 {WIDGET_CHK_BTN, N_("Load metadata from playlists and files"), &cfg.use_pl_metadata, NULL, N_("Load metadata (tag information) from music files."), FALSE},
273 {WIDGET_RADIO_BTN, N_("On load"), &cfg.get_info_on_load, NULL, N_("Load metadata when adding the file to the playlist or opening it"), TRUE},
274 {WIDGET_RADIO_BTN, N_("On display"), &cfg.get_info_on_demand, NULL, N_("Load metadata on demand when displaying the file in the playlist. You may need to set \"Detect file formats on demand\" in Audio page for full benefit."), TRUE},
275 {WIDGET_CUSTOM, NULL, NULL, NULL, NULL, TRUE, ui_preferences_chardet_table_populate},
276 {WIDGET_LABEL, N_("<b>File Dialog</b>"), NULL, NULL, NULL, FALSE},
277 {WIDGET_CHK_BTN, N_("Always refresh directory when opening file dialog"), &cfg.refresh_file_list, NULL, N_("Always refresh the file dialog (this will slow opening the dialog on large directories, and Gnome VFS should handle automatically)."), FALSE},
278 };
279
280 static PreferencesWidget mouse_page_widgets[] = {
281 {WIDGET_LABEL, N_("<b>Mouse wheel</b>"), NULL, NULL, NULL, FALSE},
282 {WIDGET_SPIN_BTN, N_("Changes volume by"), &cfg.mouse_change, NULL, N_("percent"), FALSE},
283 {WIDGET_SPIN_BTN, N_("Scrolls playlist by"), &cfg.scroll_pl_by, NULL, N_("lines"), FALSE},
284 };
285
286 static void create_colorize_settings(void);
287 static void prefswin_page_queue_destroy(CategoryQueueEntry *ent);
288
289 static void
290 change_category(GtkNotebook * notebook,
291 GtkTreeSelection * selection)
292 {
293 GtkTreeModel *model;
294 GtkTreeIter iter;
295 gint index;
296
297 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
298 return;
299
300 gtk_tree_model_get(model, &iter, CATEGORY_VIEW_COL_ID, &index, -1);
301 gtk_notebook_set_current_page(notebook, index);
302 }
303
304 void
305 prefswin_set_category(gint index)
306 {
307 g_return_if_fail(index >= 0 && index < n_categories);
308
309 gtk_notebook_set_current_page(GTK_NOTEBOOK(category_treeview), index);
310 }
311
312 static void
313 output_plugin_open_prefs(GtkComboBox * cbox,
314 gpointer data)
315 {
316 output_configure(gtk_combo_box_get_active(cbox));
317 }
318
319 static void
320 output_plugin_open_info(GtkComboBox * cbox,
321 gpointer data)
322 {
323 output_about(gtk_combo_box_get_active(cbox));
324 }
325
326 static void
327 plugin_toggle(GtkCellRendererToggle * cell,
328 const gchar * path_str,
329 gpointer data)
330 {
331 GtkTreeModel *model = GTK_TREE_MODEL(data);
332 GtkTreeIter iter;
333 GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
334 gint pluginnr;
335 gint plugin_type = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(data), "plugin_type"));
336
337 /* get toggled iter */
338 gtk_tree_model_get_iter(model, &iter, path);
339
340 if (plugin_type == PLUGIN_VIEW_TYPE_INPUT) {
341 Plugin *plugin;
342 /*GList *diplist, *tmplist; */
343
344 gtk_tree_model_get(model, &iter,
345 PLUGIN_VIEW_COL_ID, &pluginnr,
346 PLUGIN_VIEW_COL_PLUGIN_PTR, &plugin, -1);
347
348 /* do something with the value */
349 plugin->enabled ^= 1;
350
351 /* set new value */
352 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
353 PLUGIN_VIEW_COL_ACTIVE, plugin->enabled, -1);
354 } else {
355 gboolean fixed;
356 gtk_tree_model_get(model, &iter,
357 PLUGIN_VIEW_COL_ACTIVE, &fixed,
358 PLUGIN_VIEW_COL_ID, &pluginnr, -1);
359
360 /* do something with the value */
361 fixed ^= 1;
362
363 switch (plugin_type) {
364 case PLUGIN_VIEW_TYPE_GENERAL:
365 enable_general_plugin(pluginnr, fixed);
366 break;
367 case PLUGIN_VIEW_TYPE_VIS:
368 enable_vis_plugin(pluginnr, fixed);
369 break;
370 case PLUGIN_VIEW_TYPE_EFFECT:
371 enable_effect_plugin(pluginnr, fixed);
372 break;
373 }
374
375 /* set new value */
376 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
377 PLUGIN_VIEW_COL_ACTIVE, fixed, -1);
378 }
379
380 /* clean up */
381 gtk_tree_path_free(path);
382 }
383
384 static void
385 on_output_plugin_cbox_changed(GtkComboBox * combobox,
386 gpointer data)
387 {
388 gint selected;
389 selected = gtk_combo_box_get_active(combobox);
390
391 set_current_output_plugin(selected);
392 }
393
394 static void
395 on_output_plugin_cbox_realize(GtkComboBox * cbox,
396 gpointer data)
397 {
398 GList *olist = get_output_list();
399 OutputPlugin *op, *cp = get_current_output_plugin();
400 gint i = 0, selected = 0;
401
402 if (!olist) {
403 gtk_widget_set_sensitive(GTK_WIDGET(cbox), FALSE);
404 return;
405 }
406
407 for (i = 0; olist; i++, olist = g_list_next(olist)) {
408 op = OUTPUT_PLUGIN(olist->data);
409
410 if (olist->data == cp)
411 selected = i;
412
413 gtk_combo_box_append_text(cbox, op->description);
414 }
415
416 gtk_combo_box_set_active(cbox, selected);
417 g_signal_connect(cbox, "changed",
418 G_CALLBACK(on_output_plugin_cbox_changed), NULL);
419 }
420
421 static void
422 on_plugin_view_realize(GtkTreeView * treeview,
423 GCallback callback,
424 gpointer data,
425 gint plugin_type)
426 {
427 GtkListStore *store;
428 GtkTreeIter iter;
429
430 GtkCellRenderer *renderer;
431 GtkTreeViewColumn *column;
432
433 GList *ilist;
434 gchar *description[2];
435 gint id = 0;
436
437 GList *list = (GList *) data;
438
439 store = gtk_list_store_new(PLUGIN_VIEW_N_COLS,
440 G_TYPE_BOOLEAN, G_TYPE_STRING,
441 G_TYPE_STRING, G_TYPE_INT, G_TYPE_POINTER);
442 g_object_set_data(G_OBJECT(store), "plugin_type" , GINT_TO_POINTER(plugin_type));
443
444 column = gtk_tree_view_column_new();
445 gtk_tree_view_column_set_title(column, _("Enabled"));
446 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
447 gtk_tree_view_column_set_spacing(column, 4);
448 gtk_tree_view_column_set_resizable(column, FALSE);
449 gtk_tree_view_column_set_fixed_width(column, 50);
450
451 renderer = gtk_cell_renderer_toggle_new();
452 g_signal_connect(renderer, "toggled",
453 G_CALLBACK(callback), store);
454 gtk_tree_view_column_pack_start(column, renderer, TRUE);
455 gtk_tree_view_column_set_attributes(column, renderer, "active",
456 PLUGIN_VIEW_COL_ACTIVE, NULL);
457
458 gtk_tree_view_append_column(treeview, column);
459
460 column = gtk_tree_view_column_new();
461 gtk_tree_view_column_set_title(column, _("Description"));
462 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
463 gtk_tree_view_column_set_spacing(column, 4);
464 gtk_tree_view_column_set_resizable(column, TRUE);
465
466
467 renderer = gtk_cell_renderer_text_new();
468 gtk_tree_view_column_pack_start(column, renderer, FALSE);
469 gtk_tree_view_column_set_attributes(column, renderer,
470 "text", PLUGIN_VIEW_COL_DESC, NULL);
471 gtk_tree_view_append_column(treeview, column);
472
473 column = gtk_tree_view_column_new();
474
475 gtk_tree_view_column_set_title(column, _("Filename"));
476 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
477 gtk_tree_view_column_set_spacing(column, 4);
478 gtk_tree_view_column_set_resizable(column, TRUE);
479
480 renderer = gtk_cell_renderer_text_new();
481 gtk_tree_view_column_pack_start(column, renderer, TRUE);
482 gtk_tree_view_column_set_attributes(column, renderer, "text",
483 PLUGIN_VIEW_COL_FILENAME, NULL);
484
485 gtk_tree_view_append_column(treeview, column);
486
487 MOWGLI_ITER_FOREACH(ilist, list)
488 {
489 Plugin *plugin = PLUGIN(ilist->data);
490
491 description[0] = g_strdup(plugin->description);
492 description[1] = g_strdup(plugin->filename);
493
494 gtk_list_store_append(store, &iter);
495 gtk_list_store_set(store, &iter,
496 PLUGIN_VIEW_COL_ACTIVE, plugin->enabled,
497 PLUGIN_VIEW_COL_DESC, description[0],
498 PLUGIN_VIEW_COL_FILENAME, description[1],
499 PLUGIN_VIEW_COL_ID, id++,
500 PLUGIN_VIEW_COL_PLUGIN_PTR, plugin, -1);
501
502 g_free(description[1]);
503 g_free(description[0]);
504 }
505
506 gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
507 }
508
509 static void
510 on_input_plugin_view_realize(GtkTreeView * treeview,
511 gpointer data)
512 {
513 on_plugin_view_realize(treeview, G_CALLBACK(plugin_toggle), ip_data.input_list, PLUGIN_VIEW_TYPE_INPUT);
514 }
515
516 static void
517 on_effect_plugin_view_realize(GtkTreeView * treeview,
518 gpointer data)
519 {
520 on_plugin_view_realize(treeview, G_CALLBACK(plugin_toggle), ep_data.effect_list, PLUGIN_VIEW_TYPE_EFFECT);
521 }
522
523 static void
524 on_general_plugin_view_realize(GtkTreeView * treeview,
525 gpointer data)
526 {
527 on_plugin_view_realize(treeview, G_CALLBACK(plugin_toggle), gp_data.general_list, PLUGIN_VIEW_TYPE_GENERAL);
528 }
529
530 static void
531 on_vis_plugin_view_realize(GtkTreeView * treeview,
532 gpointer data)
533 {
534 on_plugin_view_realize(treeview, G_CALLBACK(plugin_toggle), vp_data.vis_list, PLUGIN_VIEW_TYPE_VIS);
535 }
536
537 static void
538 editable_insert_text(GtkEditable * editable,
539 const gchar * text,
540 gint * pos)
541 {
542 gtk_editable_insert_text(editable, text, strlen(text), pos);
543 }
544
545 static void
546 titlestring_tag_menu_callback(GtkMenuItem * menuitem,
547 gpointer data)
548 {
549 const gchar *separator = " - ";
550 gint item = GPOINTER_TO_INT(data);
551 gint pos;
552
553 pos = gtk_editable_get_position(GTK_EDITABLE(titlestring_entry));
554
555 /* insert separator as needed */
556 if (g_utf8_strlen(gtk_entry_get_text(GTK_ENTRY(titlestring_entry)), -1) > 0)
557 editable_insert_text(GTK_EDITABLE(titlestring_entry), separator, &pos);
558
559 editable_insert_text(GTK_EDITABLE(titlestring_entry), _(title_field_tags[item].tag),
560 &pos);
561
562 gtk_editable_set_position(GTK_EDITABLE(titlestring_entry), pos);
563 }
564
565 static void
566 util_menu_position(GtkMenu * menu, gint * x, gint * y,
567 gboolean * push_in, gpointer data)
568 {
569 GtkRequisition requisition;
570 gint screen_width;
571 gint screen_height;
572 MenuPos *pos = data;
573
574 gtk_widget_size_request(GTK_WIDGET(menu), &requisition);
575
576 screen_width = gdk_screen_width();
577 screen_height = gdk_screen_height();
578
579 *x = CLAMP(pos->x - 2, 0, MAX(0, screen_width - requisition.width));
580 *y = CLAMP(pos->y - 2, 0, MAX(0, screen_height - requisition.height));
581 }
582
583 static void
584 on_titlestring_help_button_clicked(GtkButton * button,
585 gpointer data)
586 {
587 GtkMenu *menu;
588 MenuPos *pos = g_new0(MenuPos, 1);
589 GdkWindow *parent;
590
591 gint x_ro, y_ro;
592 gint x_widget, y_widget;
593 gint x_size, y_size;
594
595 g_return_if_fail (button != NULL);
596 g_return_if_fail (GTK_IS_MENU (data));
597
598 parent = gtk_widget_get_parent_window(GTK_WIDGET(button));
599
600 gdk_drawable_get_size(parent, &x_size, &y_size);
601 gdk_window_get_root_origin(GTK_WIDGET(button)->window, &x_ro, &y_ro);
602 gdk_window_get_position(GTK_WIDGET(button)->window, &x_widget, &y_widget);
603
604 pos->x = x_size + x_ro;
605 pos->y = y_size + y_ro - 100;
606
607 menu = GTK_MENU(data);
608 gtk_menu_popup (menu, NULL, NULL, util_menu_position, pos,
609 0, GDK_CURRENT_TIME);
610 }
611
612
613 static void
614 on_titlestring_entry_realize(GtkWidget * entry,
615 gpointer data)
616 {
617 gtk_entry_set_text(GTK_ENTRY(entry), cfg.gentitle_format);
618 }
619
620 static gboolean
621 titlestring_timeout_proc (gpointer data)
622 {
623 titlestring_timeout_counter--;
624
625 if(titlestring_timeout_counter <= 0) {
626 titlestring_timeout_counter = 0;
627 playlist_update_all_titles();
628 return FALSE;
629 } else {
630 return TRUE;
631 }
632 }
633
634 static void
635 on_titlestring_entry_changed(GtkWidget * entry,
636 gpointer data)
637 {
638 g_free(cfg.gentitle_format);
639 cfg.gentitle_format = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
640
641 if(titlestring_timeout_counter == 0) {
642 g_timeout_add_seconds (1, (GSourceFunc) titlestring_timeout_proc, NULL);
643 }
644
645 titlestring_timeout_counter = TITLESTRING_UPDATE_TIMEOUT;
646 }
647
648 static void
649 on_titlestring_cbox_realize(GtkWidget * cbox,
650 gpointer data)
651 {
652 gtk_combo_box_set_active(GTK_COMBO_BOX(cbox), cfg.titlestring_preset);
653 gtk_widget_set_sensitive(GTK_WIDGET(data),
654 (cfg.titlestring_preset == (gint)n_titlestring_presets));
655 }
656
657 static void
658 on_titlestring_cbox_changed(GtkWidget * cbox,
659 gpointer data)
660 {
661 gint position = gtk_combo_box_get_active(GTK_COMBO_BOX(cbox));
662
663 cfg.titlestring_preset = position;
664 gtk_widget_set_sensitive(GTK_WIDGET(data), (position == 6));
665
666 playlist_update_all_titles(); /* update titles */
667 }
668
669 static void
670 on_font_btn_realize(GtkFontButton * button, gchar **cfg)
671 {
672 gtk_font_button_set_font_name(button, *cfg);
673 }
674
675 static void
676 on_font_btn_font_set(GtkFontButton * button, gchar **cfg)
677 {
678 g_free(*cfg);
679 *cfg = g_strdup(gtk_font_button_get_font_name(button));
680 AUDDBG("Returned font name: \"%s\"\n", *cfg);
681 void (*callback) (void) = g_object_get_data(G_OBJECT(button), "callback");
682 if (callback) callback();
683 }
684
685 static void
686 mainwin_font_set_cb()
687 {
688 ui_skinned_textbox_set_xfont(mainwin_info, !cfg.mainwin_use_bitmapfont, cfg.mainwin_font);
689 }
690
691 static void
692 playlist_font_set_cb()
693 {
694 AUDDBG("Attempt to set font \"%s\"\n", cfg.playlist_font);
695 ui_skinned_playlist_set_font(cfg.playlist_font);
696 playlistwin_set_sinfo_font(cfg.playlist_font); /* propagate font setting to playlistwin_sinfo */
697 playlistwin_update_list(playlist_get_active());
698 }
699
700 static void
701 playlist_show_pl_separator_numbers_cb()
702 {
703 playlistwin_update_list(playlist_get_active());
704 }
705
706 /* proxy */
707 static void
708 on_proxy_button_realize(GtkToggleButton *button, gchar *cfg)
709 {
710 g_return_if_fail(cfg != NULL);
711
712 mcs_handle_t *db;
713 gboolean ret;
714
715 db = cfg_db_open();
716
717 if (cfg_db_get_bool(db, NULL, cfg, &ret) != FALSE)
718 gtk_toggle_button_set_active(button, ret);
719
720 cfg_db_close(db);
721 }
722
723 static void
724 on_proxy_button_toggled(GtkToggleButton *button, gchar *cfg)
725 {
726 g_return_if_fail(cfg != NULL);
727
728 mcs_handle_t *db;
729 gboolean ret = gtk_toggle_button_get_active(button);
730
731 db = cfg_db_open();
732 cfg_db_set_bool(db, NULL, cfg, ret);
733 cfg_db_close(db);
734 }
735
736 static void
737 on_proxy_entry_changed(GtkEntry *entry, gchar *cfg)
738 {
739 g_return_if_fail(cfg != NULL);
740
741 mcs_handle_t *db;
742 gchar *ret = g_strdup(gtk_entry_get_text(entry));
743
744 db = cfg_db_open();
745 cfg_db_set_string(db, NULL, cfg, ret);
746 cfg_db_close(db);
747
748 g_free(ret);
749 }
750
751 static void
752 on_proxy_entry_realize(GtkEntry *entry, gchar *cfg)
753 {
754 g_return_if_fail(cfg != NULL);
755
756 mcs_handle_t *db;
757 gchar *ret;
758
759 db = cfg_db_open();
760
761 if (cfg_db_get_string(db, NULL, cfg, &ret) != FALSE)
762 gtk_entry_set_text(entry, ret);
763
764 cfg_db_close(db);
765 }
766
767 static void
768 plugin_treeview_open_prefs(GtkTreeView *treeview)
769 {
770 GtkTreeSelection *selection;
771 GtkTreeModel *model;
772 GtkTreeIter iter;
773 Plugin *plugin = NULL;
774
775 selection = gtk_tree_view_get_selection(treeview);
776 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
777 return;
778 gtk_tree_model_get(model, &iter, PLUGIN_VIEW_COL_PLUGIN_PTR, &plugin, -1);
779
780 g_return_if_fail(plugin != NULL);
781 g_return_if_fail(plugin->configure != NULL);
782
783 plugin_set_current(plugin);
784 plugin->configure();
785 }
786
787 static void
788 plugin_treeview_open_info(GtkTreeView *treeview)
789 {
790 GtkTreeSelection *selection;
791 GtkTreeModel *model;
792 GtkTreeIter iter;
793 Plugin *plugin = NULL;
794
795 selection = gtk_tree_view_get_selection(treeview);
796 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
797 return;
798 gtk_tree_model_get(model, &iter, PLUGIN_VIEW_COL_PLUGIN_PTR, &plugin, -1);
799
800 g_return_if_fail(plugin != NULL);
801
802 plugin_set_current(plugin);
803 plugin->about();
804 }
805
806 static void
807 plugin_treeview_enable_prefs(GtkTreeView * treeview, GtkButton * button)
808 {
809 GtkTreeSelection *selection;
810 GtkTreeModel *model;
811 GtkTreeIter iter;
812 Plugin *plugin = NULL;
813
814 selection = gtk_tree_view_get_selection(treeview);
815 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
816 return;
817
818 gtk_tree_model_get(model, &iter, PLUGIN_VIEW_COL_PLUGIN_PTR, &plugin, -1);
819
820 g_return_if_fail(plugin != NULL);
821
822 gtk_widget_set_sensitive(GTK_WIDGET(button), plugin->configure != NULL);
823 }
824
825 static void
826 plugin_treeview_enable_info(GtkTreeView * treeview, GtkButton * button)
827 {
828 GtkTreeSelection *selection;
829 GtkTreeModel *model;
830 GtkTreeIter iter;
831 Plugin *plugin = NULL;
832
833 selection = gtk_tree_view_get_selection(treeview);
834 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
835 return;
836
837 gtk_tree_model_get(model, &iter, PLUGIN_VIEW_COL_PLUGIN_PTR, &plugin, -1);
838
839 g_return_if_fail(plugin != NULL);
840
841 gtk_widget_set_sensitive(GTK_WIDGET(button), plugin->about != NULL);
842 }
843
844
845 static void
846 output_plugin_enable_info(GtkComboBox * cbox, GtkButton * button)
847 {
848 GList *plist;
849
850 gint id = gtk_combo_box_get_active(cbox);
851
852 plist = get_output_list();
853 plist = g_list_nth(plist, id);
854
855 gtk_widget_set_sensitive(GTK_WIDGET(button),
856 OUTPUT_PLUGIN(plist->data)->about != NULL);
857 }
858
859 static void
860 output_plugin_enable_prefs(GtkComboBox * cbox, GtkButton * button)
861 {
862 GList *plist;
863 gint id = gtk_combo_box_get_active(cbox);
864
865 plist = get_output_list();
866 plist = g_list_nth(plist, id);
867
868 gtk_widget_set_sensitive(GTK_WIDGET(button),
869 OUTPUT_PLUGIN(plist->data)->configure != NULL);
870 }
871
872 static void
873 on_output_plugin_bufsize_realize(GtkSpinButton *button,
874 gpointer data)
875 {
876 gtk_spin_button_set_value(button, cfg.output_buffer_size);
877 }
878
879 static void
880 on_output_plugin_bufsize_value_changed(GtkSpinButton *button,
881 gpointer data)
882 {
883 cfg.output_buffer_size = gtk_spin_button_get_value_as_int(button);
884 }
885
886 static void
887 on_enable_src_realize(GtkToggleButton * button,
888 gpointer data)
889 {
890 #ifdef USE_SAMPLERATE
891 gtk_toggle_button_set_active(button, cfg.enable_src);
892 #else
893 gtk_toggle_button_set_active(button, FALSE);
894 gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE);
895 #endif
896 }
897
898 static void
899 on_enable_src_toggled(GtkToggleButton * button, gpointer data)
900 {
901 #ifdef USE_SAMPLERATE
902 cfg.enable_src = gtk_toggle_button_get_active(button);
903 #endif
904 }
905
906 static void
907 on_src_rate_realize(GtkSpinButton * button,
908 gpointer data)
909 {
910 #ifdef USE_SAMPLERATE
911 gtk_spin_button_set_value(button, (gdouble)cfg.src_rate);
912 #else
913 gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE);
914 #endif
915 }
916
917 static void
918 on_src_rate_value_changed(GtkSpinButton * button,
919 gpointer data)
920 {
921 #ifdef USE_SAMPLERATE
922 cfg.src_rate = gtk_spin_button_get_value_as_int(button);
923 #endif
924 }
925
926 static void
927 on_src_converter_type_realize(GtkComboBox * box,
928 gpointer data)
929 {
930 #ifdef USE_SAMPLERATE
931 gtk_combo_box_set_active(box, cfg.src_type);
932 #else
933 gtk_widget_set_sensitive(GTK_WIDGET(box), FALSE);
934 #endif
935 }
936
937 static void
938 on_src_converter_type_changed(GtkComboBox * box,
939 gpointer data)
940 {
941 #ifdef USE_SAMPLERATE
942 cfg.src_type = gtk_combo_box_get_active(box);
943 #endif
944 }
945
946 static void
947 on_spin_btn_realize(GtkSpinButton *button, gboolean *cfg)
948 {
949 gtk_spin_button_set_value(button, *cfg);
950 }
951
952 static void
953 on_spin_btn_changed(GtkSpinButton *button, gboolean *cfg)
954 {
955 *cfg = gtk_spin_button_get_value_as_int(button);
956 }
957
958 static void
959 on_skin_refresh_button_clicked(GtkButton * button,
960 gpointer data)
961 {
962 const mode_t mode755 = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
963
964 del_directory(aud_paths[BMP_PATH_SKIN_THUMB_DIR]);
965 make_directory(aud_paths[BMP_PATH_SKIN_THUMB_DIR], mode755);
966
967 skin_view_update(GTK_TREE_VIEW(skin_view), GTK_WIDGET(skin_refresh_button));
968 }
969
970 static gboolean
971 on_skin_view_realize(GtkTreeView * treeview,
972 gpointer data)
973 {
974 skin_view_realize(treeview);
975
976 return TRUE;
977 }
978
979 static void
980 on_category_treeview_realize(GtkTreeView * treeview,
981 GtkNotebook * notebook)
982 {
983 GtkListStore *store;
984 GtkCellRenderer *renderer;
985 GtkTreeViewColumn *column;
986 GtkTreeSelection *selection;
987 GtkTreeIter iter;
988 GdkPixbuf *img;
989 CategoryQueueEntry *qlist;
990 gint i;
991
992 column = gtk_tree_view_column_new();
993 gtk_tree_view_column_set_title(column, _("Category"));
994 gtk_tree_view_append_column(treeview, column);
995 gtk_tree_view_column_set_spacing(column, 2);
996
997 renderer = gtk_cell_renderer_pixbuf_new();
998 gtk_tree_view_column_pack_start(column, renderer, FALSE);
999 gtk_tree_view_column_set_attributes(column, renderer, "pixbuf", 0, NULL);
1000
1001 renderer = gtk_cell_renderer_text_new();
1002 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1003 gtk_tree_view_column_set_attributes(column, renderer, "text", 1, NULL);
1004
1005 gint width, height;
1006 gtk_widget_get_size_request(GTK_WIDGET(treeview), &width, &height);
1007 g_object_set(G_OBJECT(renderer), "wrap-width", width - 64 - 20, "wrap-mode", PANGO_WRAP_WORD, NULL);
1008
1009 store = gtk_list_store_new(CATEGORY_VIEW_N_COLS,
1010 GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
1011 gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
1012
1013 for (i = 0; i < n_categories; i++) {
1014 img = gdk_pixbuf_new_from_file(categories[i].icon_path, NULL);
1015 gtk_list_store_append(store, &iter);
1016 gtk_list_store_set(store, &iter,
1017 CATEGORY_VIEW_COL_ICON, img,
1018 CATEGORY_VIEW_COL_NAME,
1019 gettext(categories[i].name), CATEGORY_VIEW_COL_ID,
1020 i, -1);
1021 g_object_unref(img);
1022 }
1023
1024 selection = gtk_tree_view_get_selection(treeview);
1025
1026 g_signal_connect_swapped(selection, "changed",
1027 G_CALLBACK(change_category), notebook);
1028
1029 /* mark the treeview widget as available to third party plugins */
1030 category_treeview = GTK_WIDGET(treeview);
1031
1032 /* prefswin_page_queue_destroy already pops the queue forward for us. */
1033 for (qlist = category_queue; qlist != NULL; qlist = category_queue)
1034 {
1035 CategoryQueueEntry *ent = (CategoryQueueEntry *) qlist;
1036
1037 prefswin_page_new(ent->container, ent->pg_name, ent->img_url);
1038 prefswin_page_queue_destroy(ent);
1039 }
1040 }
1041
1042 void
1043 on_skin_view_drag_data_received(GtkWidget * widget,
1044 GdkDragContext * context,
1045 gint x, gint y,
1046 GtkSelectionData * selection_data,
1047 guint info, guint time,
1048 gpointer user_data)
1049 {
1050 mcs_handle_t *db;
1051 gchar *path;
1052
1053 if (!selection_data->data) {
1054 g_warning("DND data string is NULL");
1055 return;
1056 }
1057
1058 path = (gchar *) selection_data->data;
1059
1060 /* FIXME: use a real URL validator/parser */
1061
1062 if (str_has_prefix_nocase(path, "file:///")) {
1063 path[strlen(path) - 2] = 0; /* Why the hell a CR&LF? */
1064 path += 7;
1065 }
1066 else if (str_has_prefix_nocase(path, "file:")) {
1067 path += 5;
1068 }
1069
1070 if (file_is_archive(path)) {
1071 if (!aud_active_skin_load(path))
1072 return;
1073 skin_install_skin(path);
1074 skin_view_update(GTK_TREE_VIEW(widget),
1075 GTK_WIDGET(skin_refresh_button));
1076
1077 /* Change skin name in the config file */
1078 db = cfg_db_open();
1079 cfg_db_set_string(db, NULL, "skin", path);
1080 cfg_db_close(db);
1081 }
1082 }
1083
1084 static void
1085 on_chardet_detector_cbox_changed(GtkComboBox * combobox, gpointer data)
1086 {
1087 mcs_handle_t *db;
1088 gint position = 0;
1089
1090 position = gtk_combo_box_get_active(GTK_COMBO_BOX(combobox));
1091 cfg.chardet_detector = (char *)chardet_detector_presets[position];
1092
1093 db = cfg_db_open();
1094 cfg_db_set_string(db, NULL, "chardet_detector", cfg.chardet_detector);
1095 cfg_db_close(db);
1096 if (data != NULL)
1097 gtk_widget_set_sensitive(GTK_WIDGET(data), 1);
1098 }
1099
1100 static void
1101 on_chardet_detector_cbox_realize(GtkComboBox *combobox, gpointer data)
1102 {
1103 mcs_handle_t *db;
1104 gchar *ret=NULL;
1105 guint i=0,index=0;
1106
1107 for(i=0; i<n_chardet_detector_presets; i++) {
1108 gtk_combo_box_append_text(combobox, _(chardet_detector_presets[i]));
1109 }
1110
1111 db = cfg_db_open();
1112 if(cfg_db_get_string(db, NULL, "chardet_detector", &ret) != FALSE) {
1113 for(i=0; i<n_chardet_detector_presets; i++) {
1114 if(!strcmp(chardet_detector_presets[i], ret)) {
1115 cfg.chardet_detector = (char *)chardet_detector_presets[i];
1116 index = i;
1117 }
1118 }
1119 }
1120 cfg_db_close(db);
1121
1122 #ifdef USE_CHARDET
1123 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), index);
1124
1125 if (data != NULL)
1126 gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
1127
1128 g_signal_connect(combobox, "changed",
1129 G_CALLBACK(on_chardet_detector_cbox_changed), NULL);
1130 #else
1131 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), -1);
1132 gtk_widget_set_sensitive(GTK_WIDGET(combobox), 0);
1133 #endif
1134 if(ret)
1135 g_free(ret);
1136 }
1137
1138 static void
1139 on_chardet_fallback_realize(GtkEntry *entry, gpointer data)
1140 {
1141 mcs_handle_t *db;
1142 gchar *ret = NULL;
1143
1144 db = cfg_db_open();
1145
1146 if (cfg_db_get_string(db, NULL, "chardet_fallback", &ret) != FALSE) {
1147 if(cfg.chardet_fallback)
1148 g_free(cfg.chardet_fallback);
1149
1150 if(ret && strncasecmp(ret, "None", sizeof("None"))) {
1151 cfg.chardet_fallback = ret;
1152 } else {
1153 cfg.chardet_fallback = g_strdup("");
1154 }
1155 gtk_entry_set_text(entry, cfg.chardet_fallback);
1156 }
1157
1158 cfg_db_close(db);
1159 }
1160
1161 static void
1162 on_chardet_fallback_changed(GtkEntry *entry, gpointer data)
1163 {
1164 mcs_handle_t *db;
1165 gchar *ret = NULL;
1166
1167 if(cfg.chardet_fallback)
1168 g_free(cfg.chardet_fallback);
1169
1170 ret = g_strdup(gtk_entry_get_text(entry));
1171
1172 if(ret == NULL)
1173 cfg.chardet_fallback = g_strdup("");
1174 else
1175 cfg.chardet_fallback = ret;
1176
1177 db = cfg_db_open();
1178
1179 if(cfg.chardet_fallback == NULL || !strcmp(cfg.chardet_fallback, ""))
1180 cfg_db_set_string(db, NULL, "chardet_fallback", "None");
1181 else
1182 cfg_db_set_string(db, NULL, "chardet_fallback", cfg.chardet_fallback);
1183
1184 cfg_db_close(db);
1185 }
1186
1187 static void
1188 on_show_filepopup_for_tuple_realize(GtkToggleButton * button, gpointer data)
1189 {
1190 gtk_toggle_button_set_active(button, cfg.show_filepopup_for_tuple);
1191 filepopupbutton = GTK_WIDGET(button);
1192
1193 gtk_widget_set_sensitive(filepopup_for_tuple_settings_button, cfg.show_filepopup_for_tuple);
1194 }
1195
1196 static void
1197 on_show_filepopup_for_tuple_toggled(GtkToggleButton * button, gpointer data)
1198 {
1199 cfg.show_filepopup_for_tuple = gtk_toggle_button_get_active(button);
1200
1201 gtk_widget_set_sensitive(filepopup_for_tuple_settings_button, cfg.show_filepopup_for_tuple);
1202 }
1203
1204 static void
1205 on_recurse_for_cover_toggled(GtkToggleButton *button, gpointer data)
1206 {
1207 gtk_widget_set_sensitive(GTK_WIDGET(data),
1208 gtk_toggle_button_get_active(button));
1209 }
1210
1211 static void
1212 on_colorize_button_clicked(GtkButton *button, gpointer data)
1213 {
1214 if (colorize_settings)
1215 gtk_window_present(GTK_WINDOW(colorize_settings));
1216 else
1217 create_colorize_settings();
1218 }
1219
1220 static void
1221 reload_skin()
1222 {
1223 /* reload the skin to apply the change */
1224 skin_reload_forced();
1225 }
1226
1227 static void
1228 on_red_scale_value_changed(GtkHScale *scale, gpointer data)
1229 {
1230 cfg.colorize_r = gtk_range_get_value(GTK_RANGE(scale));
1231 reload_skin();
1232 }
1233
1234 static void
1235 on_green_scale_value_changed(GtkHScale *scale, gpointer data)
1236 {
1237 cfg.colorize_g = gtk_range_get_value(GTK_RANGE(scale));
1238 reload_skin();
1239 }
1240
1241 static void
1242 on_blue_scale_value_changed(GtkHScale *scale, gpointer data)
1243 {
1244 cfg.colorize_b = gtk_range_get_value(GTK_RANGE(scale));
1245 reload_skin();
1246 }
1247
1248 static void
1249 on_colorize_close_clicked(GtkButton *button, gpointer data)
1250 {
1251 gtk_widget_destroy(colorize_settings);
1252 colorize_settings = NULL;
1253 }
1254
1255 static void
1256 on_filepopup_for_tuple_settings_clicked(GtkButton *button, gpointer data)
1257 {
1258 gtk_entry_set_text(GTK_ENTRY(filepopup_settings_cover_name_include), cfg.cover_name_include);
1259 gtk_entry_set_text(GTK_ENTRY(filepopup_settings_cover_name_exclude), cfg.cover_name_exclude);
1260 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filepopup_settings_recurse_for_cover), cfg.recurse_for_cover);
1261 gtk_spin_button_set_value(GTK_SPIN_BUTTON(filepopup_settings_recurse_for_cover_depth), cfg.recurse_for_cover_depth);
1262 on_recurse_for_cover_toggled(GTK_TOGGLE_BUTTON(filepopup_settings_recurse_for_cover), filepopup_settings_recurse_for_cover_depth_box);
1263 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filepopup_settings_use_file_cover), cfg.use_file_cover);
1264 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filepopup_settings_showprogressbar), cfg.filepopup_showprogressbar);
1265 gtk_spin_button_set_value(GTK_SPIN_BUTTON(filepopup_settings_delay), cfg.filepopup_delay);
1266
1267 gtk_widget_show(filepopup_settings);
1268 }
1269
1270 static void
1271 on_filepopup_settings_ok_clicked(GtkButton *button, gpointer data)
1272 {
1273 g_free(cfg.cover_name_include);
1274 cfg.cover_name_include = g_strdup(gtk_entry_get_text(GTK_ENTRY(filepopup_settings_cover_name_include)));
1275
1276 g_free(cfg.cover_name_exclude);
1277 cfg.cover_name_exclude = g_strdup(gtk_entry_get_text(GTK_ENTRY(filepopup_settings_cover_name_exclude)));
1278
1279 cfg.recurse_for_cover = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filepopup_settings_recurse_for_cover));
1280 cfg.recurse_for_cover_depth = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(filepopup_settings_recurse_for_cover_depth));
1281 cfg.use_file_cover = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filepopup_settings_use_file_cover));
1282 cfg.filepopup_showprogressbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(filepopup_settings_showprogressbar));
1283 cfg.filepopup_delay = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(filepopup_settings_delay));
1284
1285 gtk_widget_hide(filepopup_settings);
1286 }
1287
1288 static void
1289 on_filepopup_settings_cancel_clicked(GtkButton *button, gpointer data)
1290 {
1291 gtk_widget_hide(filepopup_settings);
1292 }
1293
1294 static void
1295 on_toggle_button_toggled(GtkToggleButton * button, gboolean *cfg)
1296 {
1297 *cfg = gtk_toggle_button_get_active(button);
1298 void (*callback) (void) = g_object_get_data(G_OBJECT(button), "callback");
1299 if (callback) callback();
1300 GtkWidget *child = g_object_get_data(G_OBJECT(button), "child");
1301 if (child) gtk_widget_set_sensitive(GTK_WIDGET(child), *cfg);
1302 }
1303
1304 static void
1305 on_toggle_button_realize(GtkToggleButton * button, gboolean *cfg)
1306 {
1307 gtk_toggle_button_set_active(button, *cfg);
1308 GtkWidget *child = g_object_get_data(G_OBJECT(button), "child");
1309 if (child) gtk_widget_set_sensitive(GTK_WIDGET(child), *cfg);
1310 }
1311
1312 static void
1313 bitmap_fonts_cb()
1314 {
1315 ui_skinned_textbox_set_xfont(mainwin_info, !cfg.mainwin_use_bitmapfont, cfg.mainwin_font);
1316 playlistwin_set_sinfo_font(cfg.playlist_font);
1317
1318 if (cfg.playlist_shaded) {
1319 playlistwin_update_list(playlist_get_active());
1320 ui_skinned_window_draw_all(playlistwin);
1321 }
1322 }
1323
1324 static void
1325 show_wm_decorations_cb()
1326 {
1327 gtk_window_set_decorated(GTK_WINDOW(mainwin), cfg.show_wm_decorations);
1328 gtk_window_set_decorated(GTK_WINDOW(playlistwin), cfg.show_wm_decorations);
1329 gtk_window_set_decorated(GTK_WINDOW(equalizerwin), cfg.show_wm_decorations);
1330 }
1331
1332 void
1333 create_colorize_settings(void)
1334 {
1335 GtkWidget *vbox;
1336 GtkWidget *label;
1337 GtkWidget *table;
1338 GtkWidget *hbuttonbox;
1339 GtkWidget *colorize_close;
1340
1341 GtkWidget *green_label;
1342 GtkWidget *red_label;
1343 GtkWidget *blue_label;
1344
1345 colorize_settings = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1346 gtk_container_set_border_width(GTK_CONTAINER(colorize_settings), 12);
1347 gtk_window_set_title(GTK_WINDOW(colorize_settings), _("Color Adjustment"));
1348 gtk_window_set_type_hint(GTK_WINDOW(colorize_settings), GDK_WINDOW_TYPE_HINT_DIALOG);
1349 gtk_window_set_transient_for(GTK_WINDOW(colorize_settings), GTK_WINDOW(prefswin));
1350
1351 vbox = gtk_vbox_new(FALSE, 12);
1352 gtk_container_add(GTK_CONTAINER(colorize_settings), vbox);
1353
1354 label = gtk_label_new(_("Audacious allows you to alter the color balance of the skinned UI. The sliders below will allow you to do this."));
1355 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
1356 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1357 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
1358
1359 table = gtk_table_new(3, 2, FALSE);
1360 gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
1361 gtk_table_set_row_spacings(GTK_TABLE(table), 6);
1362 gtk_table_set_col_spacings(GTK_TABLE(table), 12);
1363
1364 blue_label = gtk_label_new(_("Blue"));
1365 gtk_table_attach(GTK_TABLE(table), blue_label, 0, 1, 2, 3,
1366 (GtkAttachOptions) (0),
1367 (GtkAttachOptions) (0), 0, 0);
1368 gtk_label_set_justify(GTK_LABEL(blue_label), GTK_JUSTIFY_RIGHT);
1369 gtk_misc_set_alignment(GTK_MISC(blue_label), 1, 0.5);
1370
1371 green_label = gtk_label_new(_("Green"));
1372 gtk_table_attach(GTK_TABLE(table), green_label, 0, 1, 1, 2,
1373 (GtkAttachOptions) (0),
1374 (GtkAttachOptions) (0), 0, 0);
1375 gtk_label_set_justify(GTK_LABEL(green_label), GTK_JUSTIFY_RIGHT);
1376 gtk_misc_set_alignment(GTK_MISC(green_label), 1, 0.5);
1377
1378 red_label = gtk_label_new(_("Red"));
1379 gtk_table_attach(GTK_TABLE(table), red_label, 0, 1, 0, 1,
1380 (GtkAttachOptions) (0),
1381 (GtkAttachOptions) (0), 0, 0);
1382 gtk_label_set_justify(GTK_LABEL(red_label), GTK_JUSTIFY_RIGHT);
1383 gtk_misc_set_alignment(GTK_MISC(red_label), 1, 0.5);
1384
1385 red_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
1386 gtk_table_attach(GTK_TABLE(table), red_scale, 1, 2, 0, 1,
1387 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1388 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1389 gtk_scale_set_draw_value(GTK_SCALE(red_scale), FALSE);
1390 gtk_scale_set_digits(GTK_SCALE(red_scale), 3);
1391
1392 green_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
1393 gtk_table_attach(GTK_TABLE(table), green_scale, 1, 2, 1, 2,
1394 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1395 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1396 gtk_scale_set_draw_value(GTK_SCALE(green_scale), FALSE);
1397 gtk_scale_set_digits(GTK_SCALE(green_scale), 3);
1398
1399 blue_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
1400 gtk_table_attach(GTK_TABLE(table), blue_scale, 1, 2, 2, 3,
1401 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1402 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1403 gtk_scale_set_draw_value(GTK_SCALE(blue_scale), FALSE);
1404 gtk_scale_set_digits(GTK_SCALE(blue_scale), 3);
1405
1406 hbuttonbox = gtk_hbutton_box_new();
1407 gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);
1408 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
1409 gtk_box_set_spacing(GTK_BOX(hbuttonbox), 6);
1410
1411 colorize_close = gtk_button_new_from_stock("gtk-close");
1412 gtk_container_add(GTK_CONTAINER(hbuttonbox), colorize_close);
1413 GTK_WIDGET_SET_FLAGS(colorize_close, GTK_CAN_DEFAULT);
1414
1415 g_signal_connect((gpointer) red_scale, "value_changed",
1416 G_CALLBACK(on_red_scale_value_changed),
1417 NULL);
1418 g_signal_connect((gpointer) green_scale, "value_changed",
1419 G_CALLBACK(on_green_scale_value_changed),
1420 NULL);
1421 g_signal_connect((gpointer) blue_scale, "value_changed",
1422 G_CALLBACK(on_blue_scale_value_changed),
1423 NULL);
1424 g_signal_connect((gpointer) colorize_close, "clicked",
1425 G_CALLBACK(on_colorize_close_clicked),
1426 NULL);
1427
1428 gtk_range_set_value(GTK_RANGE(red_scale), cfg.colorize_r);
1429 gtk_range_set_value(GTK_RANGE(green_scale), cfg.colorize_g);
1430 gtk_range_set_value(GTK_RANGE(blue_scale), cfg.colorize_b);
1431
1432 gtk_widget_grab_default(colorize_close);
1433 gtk_widget_show_all(colorize_settings);
1434 }
1435
1436 void
1437 create_filepopup_settings(void)
1438 {
1439 GtkWidget *vbox;
1440 GtkWidget *table;
1441
1442 GtkWidget *label_cover_retrieve;
1443 GtkWidget *label_cover_search;
1444 GtkWidget *label_exclude;
1445 GtkWidget *label_include;
1446 GtkWidget *label_search_depth;
1447 GtkWidget *label_misc;
1448 GtkWidget *label_delay;
1449
1450 GtkObject *recurse_for_cover_depth_adj;
1451 GtkObject *delay_adj;
1452 GtkWidget *alignment;
1453
1454 GtkWidget *hbox;
1455 GtkWidget *hbuttonbox;
1456 GtkWidget *btn_cancel;
1457 GtkWidget *btn_ok;
1458
1459 filepopup_settings = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1460 gtk_container_set_border_width(GTK_CONTAINER(filepopup_settings), 12);
1461 gtk_window_set_title(GTK_WINDOW(filepopup_settings), _("Popup Information Settings"));
1462 gtk_window_set_position(GTK_WINDOW(filepopup_settings), GTK_WIN_POS_CENTER_ON_PARENT);
1463 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(filepopup_settings), TRUE);
1464 gtk_window_set_type_hint(GTK_WINDOW(filepopup_settings), GDK_WINDOW_TYPE_HINT_DIALOG);
1465 gtk_window_set_transient_for(GTK_WINDOW(filepopup_settings), GTK_WINDOW(prefswin));
1466
1467 vbox = gtk_vbox_new(FALSE, 12);
1468 gtk_container_add(GTK_CONTAINER(filepopup_settings), vbox);
1469
1470 label_cover_retrieve = gtk_label_new(_("<b>Cover image retrieve</b>"));
1471 gtk_box_pack_start(GTK_BOX(vbox), label_cover_retrieve, FALSE, FALSE, 0);
1472 gtk_label_set_use_markup(GTK_LABEL(label_cover_retrieve), TRUE);
1473 gtk_misc_set_alignment(GTK_MISC(label_cover_retrieve), 0, 0.5);
1474
1475 label_cover_search = gtk_label_new(_("While searching for the album's cover, Audacious looks for certain words in the filename. You can specify those words in the lists below, separated using commas."));
1476 gtk_box_pack_start(GTK_BOX(vbox), label_cover_search, FALSE, FALSE, 0);
1477 gtk_label_set_line_wrap(GTK_LABEL(label_cover_search), TRUE);
1478 gtk_misc_set_alignment(GTK_MISC(label_cover_search), 0, 0);
1479 gtk_misc_set_padding(GTK_MISC(label_cover_search), 12, 0);
1480
1481 table = gtk_table_new(2, 2, FALSE);
1482 gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
1483 gtk_table_set_row_spacings(GTK_TABLE(table), 4);
1484 gtk_table_set_col_spacings(GTK_TABLE(table), 4);
1485
1486 filepopup_settings_cover_name_include = gtk_entry_new();
1487 gtk_table_attach(GTK_TABLE(table), filepopup_settings_cover_name_include, 1, 2, 0, 1,
1488 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1489 (GtkAttachOptions) (0), 0, 0);
1490 gtk_entry_set_activates_default(GTK_ENTRY(filepopup_settings_cover_name_include), TRUE);
1491
1492 label_exclude = gtk_label_new(_("Exclude:"));
1493 gtk_table_attach(GTK_TABLE(table), label_exclude, 0, 1, 1, 2,
1494 (GtkAttachOptions) (0),
1495 (GtkAttachOptions) (0), 0, 0);
1496 gtk_misc_set_alignment(GTK_MISC(label_exclude), 0, 0.5);
1497 gtk_misc_set_padding(GTK_MISC(label_exclude), 12, 0);
1498
1499 label_include = gtk_label_new(_("Include:"));
1500 gtk_table_attach(GTK_TABLE(table), label_include, 0, 1, 0, 1,
1501 (GtkAttachOptions) (0),
1502 (GtkAttachOptions) (0), 0, 0);
1503 gtk_misc_set_alignment(GTK_MISC(label_include), 0, 0.5);
1504 gtk_misc_set_padding(GTK_MISC(label_include), 12, 0);
1505
1506 filepopup_settings_cover_name_exclude = gtk_entry_new();
1507 gtk_table_attach(GTK_TABLE(table), filepopup_settings_cover_name_exclude, 1, 2, 1, 2,
1508 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1509 (GtkAttachOptions) (0), 0, 0);
1510 gtk_entry_set_activates_default(GTK_ENTRY(filepopup_settings_cover_name_exclude), TRUE);
1511
1512 alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
1513 gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 0);
1514 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1515
1516 filepopup_settings_recurse_for_cover = gtk_check_button_new_with_mnemonic(_("Recursively search for cover"));
1517 gtk_container_add(GTK_CONTAINER(alignment), filepopup_settings_recurse_for_cover);
1518
1519 alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
1520 gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1521 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 45, 0);
1522
1523 filepopup_settings_recurse_for_cover_depth_box = gtk_hbox_new(FALSE, 0);
1524 gtk_container_add(GTK_CONTAINER(alignment), filepopup_settings_recurse_for_cover_depth_box);
1525
1526 label_search_depth = gtk_label_new(_("Search depth: "));
1527 gtk_box_pack_start(GTK_BOX(filepopup_settings_recurse_for_cover_depth_box), label_search_depth, TRUE, TRUE, 0);
1528 gtk_misc_set_padding(GTK_MISC(label_search_depth), 4, 0);
1529
1530 recurse_for_cover_depth_adj = gtk_adjustment_new(0, 0, 100, 1, 10, 10);
1531 filepopup_settings_recurse_for_cover_depth = gtk_spin_button_new(GTK_ADJUSTMENT(recurse_for_cover_depth_adj), 1, 0);
1532 gtk_box_pack_start(GTK_BOX(filepopup_settings_recurse_for_cover_depth_box), filepopup_settings_recurse_for_cover_depth, TRUE, TRUE, 0);
1533 gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(filepopup_settings_recurse_for_cover_depth), TRUE);
1534
1535 alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
1536 gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 0);
1537 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1538
1539 filepopup_settings_use_file_cover = gtk_check_button_new_with_mnemonic(_("Use per-file cover"));
1540 gtk_container_add(GTK_CONTAINER(alignment), filepopup_settings_use_file_cover);
1541
1542 label_misc = gtk_label_new(_("<b>Miscellaneous</b>"));
1543 gtk_box_pack_start(GTK_BOX(vbox), label_misc, FALSE, FALSE, 0);
1544 gtk_label_set_use_markup(GTK_LABEL(label_misc), TRUE);
1545 gtk_misc_set_alignment(GTK_MISC(label_misc), 0, 0.5);
1546
1547 alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
1548 gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
1549 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1550
1551 filepopup_settings_showprogressbar = gtk_check_button_new_with_mnemonic(_("Show Progress bar for the current track"));
1552 gtk_container_add(GTK_CONTAINER(alignment), filepopup_settings_showprogressbar);
1553
1554 alignment = gtk_alignment_new(0, 0.5, 1, 1);
1555 gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 0);
1556 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1557
1558 hbox = gtk_hbox_new(FALSE, 0);
1559 gtk_container_add(GTK_CONTAINER(alignment), hbox);
1560
1561 label_delay = gtk_label_new(_("Delay until filepopup comes up: "));
1562 gtk_box_pack_start(GTK_BOX(hbox), label_delay, TRUE, TRUE, 0);
1563 gtk_misc_set_alignment(GTK_MISC(label_delay), 0, 0.5);
1564 gtk_misc_set_padding(GTK_MISC(label_delay), 12, 0);
1565
1566 delay_adj = gtk_adjustment_new(0, 0, 100, 1, 10, 10);
1567 filepopup_settings_delay = gtk_spin_button_new(GTK_ADJUSTMENT(delay_adj), 1, 0);
1568 gtk_box_pack_start(GTK_BOX(hbox), filepopup_settings_delay, TRUE, TRUE, 0);
1569 gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(filepopup_settings_delay), TRUE);
1570
1571 hbuttonbox = gtk_hbutton_box_new();
1572 gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);
1573 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
1574 gtk_box_set_spacing(GTK_BOX(hbuttonbox), 6);
1575
1576 btn_cancel = gtk_button_new_from_stock("gtk-cancel");
1577 gtk_container_add(GTK_CONTAINER(hbuttonbox), btn_cancel);
1578
1579 btn_ok = gtk_button_new_from_stock("gtk-ok");
1580 gtk_container_add(GTK_CONTAINER(hbuttonbox), btn_ok);
1581 GTK_WIDGET_SET_FLAGS(btn_ok, GTK_CAN_DEFAULT);
1582
1583 g_signal_connect(G_OBJECT(filepopup_settings), "delete_event",
1584 G_CALLBACK(gtk_widget_hide_on_delete),
1585 NULL);
1586 g_signal_connect(G_OBJECT(btn_cancel), "clicked",
1587 G_CALLBACK(on_filepopup_settings_cancel_clicked),
1588 NULL);
1589 g_signal_connect(G_OBJECT(btn_ok), "clicked",
1590 G_CALLBACK(on_filepopup_settings_ok_clicked),
1591 NULL);
1592 g_signal_connect(G_OBJECT(filepopup_settings_recurse_for_cover), "toggled",
1593 G_CALLBACK(on_recurse_for_cover_toggled),
1594 filepopup_settings_recurse_for_cover_depth_box);
1595
1596 gtk_widget_grab_default(btn_ok);
1597 gtk_widget_show_all(vbox);
1598 }
1599
1600 GtkWidget *
1601 ui_preferences_chardet_table_populate(void)
1602 {
1603 GtkWidget *widget = gtk_table_new(2, 2, FALSE);
1604 GtkWidget *label;
1605
1606 label = gtk_label_new(_("Auto character encoding detector for:"));
1607 gtk_table_attach(GTK_TABLE(widget), label, 0, 1, 0, 1,
1608 (GtkAttachOptions) (0),
1609 (GtkAttachOptions) (0), 0, 0);
1610 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
1611 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
1612
1613 GtkWidget *combobox = gtk_combo_box_new_text();
1614 gtk_table_attach(GTK_TABLE(widget), combobox, 1, 2, 0, 1,
1615 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1616 (GtkAttachOptions) (0), 0, 0);
1617 g_signal_connect_after(G_OBJECT(combobox), "realize",
1618 G_CALLBACK(on_chardet_detector_cbox_realize),
1619 NULL);
1620
1621 GtkWidget *entry = gtk_entry_new();
1622 gtk_table_attach(GTK_TABLE(widget), entry, 1, 2, 1, 2,
1623 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1624 (GtkAttachOptions) (0), 0, 0);
1625 gtk_tooltips_set_tip (tooltips, entry, _("List of character encodings used for fall back conversion of metadata. If automatic character encoding detector failed or has been disabled, encodings in this list would be treated as candidates of the encoding of metadata, and fall back conversion from these encodings to UTF-8 would be attempted."), NULL);
1626
1627 label = gtk_label_new(_("Fallback character encodings:"));
1628 gtk_table_attach(GTK_TABLE(widget), label, 0, 1, 1, 2,
1629 (GtkAttachOptions) (0),
1630 (GtkAttachOptions) (0), 0, 0);
1631 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
1632 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
1633
1634 g_signal_connect(G_OBJECT(entry), "changed",
1635 G_CALLBACK(on_chardet_fallback_changed),
1636 NULL);
1637 g_signal_connect_after(G_OBJECT(entry), "realize",
1638 G_CALLBACK(on_chardet_fallback_realize),
1639 NULL);
1640
1641 return widget;
1642 }
1643
1644 static void
1645 on_bit_depth_cbox_changed(GtkWidget *cbox, gpointer data)
1646 {
1647 gint active = gtk_combo_box_get_active(GTK_COMBO_BOX(cbox));
1648 cfg.output_bit_depth = (active == 1) ? 24 : 16;
1649 }
1650
1651 GtkWidget *
1652 ui_preferences_bit_depth(void)
1653 {
1654 GtkWidget *box = gtk_hbox_new(FALSE, 10);
1655 GtkWidget *label = gtk_label_new(_("Output bit depth:"));
1656 gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
1657 gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
1658
1659 GtkWidget *combo = gtk_combo_box_new_text ();
1660 gtk_combo_box_append_text(GTK_COMBO_BOX (combo), "16");
1661 gtk_combo_box_append_text(GTK_COMBO_BOX (combo), "24");
1662 gtk_box_pack_start(GTK_BOX(box), combo, FALSE, FALSE, 0);
1663
1664 gint active = (cfg.output_bit_depth == 24) ? 1 : 0;
1665 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), active);
1666 g_signal_connect(combo, "changed", G_CALLBACK(on_bit_depth_cbox_changed), NULL);
1667
1668 gtk_tooltips_set_tip (tooltips, box,
1669 _("All streams will be converted to this bit depth.\n"
1670 "This should be the max supported bit depth of\nthe sound card or output plugin."),
1671 NULL);
1672
1673 return box;
1674 }
1675
1676 static void
1677 on_rg_spin_changed(GtkSpinButton *spinbutton, gpointer user_data)
1678 {
1679 *((gfloat*) user_data) = gtk_spin_button_get_value(spinbutton);
1680 }
1681
1682 static GtkWidget *
1683 ui_preferences_rg_params(void)
1684 {
1685 GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1, 1);
1686 GtkWidget *table = gtk_table_new(2, 3, FALSE);
1687 gtk_table_set_row_spacings (GTK_TABLE (table), 6);
1688 gtk_table_set_col_spacings (GTK_TABLE (table), 6);
1689
1690 GtkWidget *label = gtk_label_new(_("Preamp:"));
1691 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
1692 (GtkAttachOptions) (GTK_FILL),
1693 (GtkAttachOptions) (0), 0, 0);
1694 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
1695
1696 GtkWidget *spin = gtk_spin_button_new_with_range(-15, 15, 0.01);
1697 gtk_table_attach(GTK_TABLE(table), spin, 1, 2, 0, 1,
1698 (GtkAttachOptions) (GTK_FILL),
1699 (GtkAttachOptions) (0), 0, 0);
1700 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), cfg.replay_gain_preamp);
1701 g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(on_rg_spin_changed), &cfg.replay_gain_preamp);
1702
1703 label = gtk_label_new(_("dB"));
1704 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1,
1705 (GtkAttachOptions) (GTK_FILL),
1706 (GtkAttachOptions) (0), 0, 0);
1707 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
1708
1709 label = gtk_label_new(_("Default gain:"));
1710 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2,
1711 (GtkAttachOptions) (GTK_FILL),
1712 (GtkAttachOptions) (0), 0, 0);
1713 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
1714
1715 spin = gtk_spin_button_new_with_range(-15, 15, 0.01);
1716 gtk_table_attach(GTK_TABLE(table), spin, 1, 2, 1, 2,
1717 (GtkAttachOptions) (GTK_FILL),
1718 (GtkAttachOptions) (0), 0, 0);
1719 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), cfg.default_gain);
1720 g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(on_rg_spin_changed), &cfg.default_gain);
1721 gtk_tooltips_set_tip (tooltips, spin, _("This gain will be used if file doesn't contain Replay Gain metadata."), NULL);
1722
1723 label = gtk_label_new(_("dB"));
1724 gtk_table_attach(GTK_TABLE(table), label, 2, 3, 1, 2,
1725 (GtkAttachOptions) (GTK_FILL),
1726 (GtkAttachOptions) (0), 0, 0);
1727 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
1728
1729 gtk_container_add(GTK_CONTAINER(alignment), table);
1730 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1731
1732 GtkWidget *image = gtk_image_new_from_stock ("gtk-info", GTK_ICON_SIZE_BUTTON);
1733 gtk_table_attach (GTK_TABLE (table), image, 0, 1, 2, 3,
1734 (GtkAttachOptions) (GTK_FILL),
1735 (GtkAttachOptions) (0), 0, 0);
1736
1737 label = gtk_label_new (_("<span size=\"small\">Please remember that the most efficient way to prevent signal clipping is not to use "
1738 "positive values above.</span>"));
1739 gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,
1740 (GtkAttachOptions) (GTK_FILL),
1741 (GtkAttachOptions) (0), 0, 0);
1742 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1743 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1744 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1745
1746 return alignment;
1747 }
1748
1749 /* it's at early stage */
1750 void
1751 create_widgets(GtkBox *box, PreferencesWidget *widgets, gint amt)
1752 {
1753 int x;
1754 GtkWidget *alignment = NULL, *widget = NULL;
1755 GtkWidget *child_box = NULL;
1756 GSList *radio_btn_group = NULL;
1757 int table_line=0; /* used for WIDGET_SPIN_BTN */
1758
1759 for (x = 0; x < amt; ++x) {
1760 if (widgets[x].child) { /* perhaps this logic can be better */
1761 if (!child_box) {
1762 child_box = gtk_vbox_new(FALSE, 0);
1763 g_object_set_data(G_OBJECT(widget), "child", child_box);
1764 alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
1765 gtk_box_pack_start(box, alignment, FALSE, FALSE, 0);
1766 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 24, 0);
1767 gtk_container_add (GTK_CONTAINER (alignment), child_box);
1768 }
1769 } else
1770 child_box = NULL;
1771
1772 alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
1773 gtk_box_pack_start(child_box ? GTK_BOX(child_box) : box, alignment, FALSE, FALSE, 0);
1774
1775 if (radio_btn_group && widgets[x].type != WIDGET_RADIO_BTN)
1776 radio_btn_group = NULL;
1777
1778 switch(widgets[x].type) {
1779 case WIDGET_CHK_BTN:
1780 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1781 widget = gtk_check_button_new_with_mnemonic(_(widgets[x].label));
1782 g_object_set_data(G_OBJECT(widget), "callback", widgets[x].callback);
1783 g_signal_connect(G_OBJECT(widget), "toggled",
1784 G_CALLBACK(on_toggle_button_toggled),
1785 widgets[x].cfg);
1786 g_signal_connect(G_OBJECT(widget), "realize",
1787 G_CALLBACK(on_toggle_button_realize),
1788 widgets[x].cfg);
1789 break;
1790 case WIDGET_LABEL:
1791 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 12, 6, 0, 0);
1792 widget = gtk_label_new_with_mnemonic(_(widgets[x].label));
1793 gtk_label_set_use_markup(GTK_LABEL(widget), TRUE);
1794 gtk_misc_set_alignment(GTK_MISC(widget), 0, 0.5);
1795 break;
1796 case WIDGET_RADIO_BTN:
1797 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 12, 0);
1798 widget = gtk_radio_button_new_with_mnemonic(radio_btn_group, _(widgets[x].label));
1799 radio_btn_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
1800 g_signal_connect(G_OBJECT(widget), "toggled",
1801 G_CALLBACK(on_toggle_button_toggled),
1802 widgets[x].cfg);
1803 g_signal_connect(G_OBJECT(widget), "realize",
1804 G_CALLBACK(on_toggle_button_realize),
1805 widgets[x].cfg);
1806 break;
1807 case WIDGET_SPIN_BTN:
1808 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
1809
1810 if (x > 1 && widgets[x-1].type == WIDGET_SPIN_BTN) {
1811 table_line++;
1812 } else {
1813 /* check how many WIDGET_SPIN_BTNs are there */
1814 gint lines = 0, i;
1815 for (i=x; i<amt && widgets[i].type == WIDGET_SPIN_BTN; i++)
1816 lines++;
1817
1818 widget = gtk_table_new(lines, 3, FALSE);
1819 gtk_table_set_row_spacings(GTK_TABLE(widget), 6);
1820 table_line=0;
1821 }
1822
1823 GtkWidget *label_pre = gtk_label_new(_(widgets[x].label));
1824 gtk_table_attach(GTK_TABLE (widget), label_pre, 0, 1, table_line, table_line+1,
1825 (GtkAttachOptions) (0),
1826 (GtkAttachOptions) (0), 0, 0);
1827 gtk_misc_set_alignment(GTK_MISC(label_pre), 0, 0.5);
1828 gtk_misc_set_padding(GTK_MISC(label_pre), 4, 0);
1829
1830 GtkObject *adj = gtk_adjustment_new (1, 0, 100, 1, 10, 10);
1831 GtkWidget *spin_btn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
1832 gtk_table_attach(GTK_TABLE(widget), spin_btn, 1, 2, table_line, table_line+1,
1833 (GtkAttachOptions) (0),
1834 (GtkAttachOptions) (0), 4, 0);
1835
1836 if (widgets[x].tooltip) {
1837 GtkWidget *label_past = gtk_label_new(_(widgets[x].tooltip));
1838 gtk_table_attach(GTK_TABLE(widget), label_past, 2, 3, table_line, table_line+1,
1839 (GtkAttachOptions) (0),
1840 (GtkAttachOptions) (0), 0, 0);
1841 gtk_misc_set_alignment(GTK_MISC(label_past), 0, 0.5);
1842 gtk_misc_set_padding(GTK_MISC(label_past), 4, 0);
1843 }
1844
1845 g_signal_connect(G_OBJECT(spin_btn), "value_changed",
1846 G_CALLBACK(on_spin_btn_changed),
1847 widgets[x].cfg);
1848 g_signal_connect(G_OBJECT(spin_btn), "realize",
1849 G_CALLBACK(on_spin_btn_realize),
1850 widgets[x].cfg);
1851 break;
1852 case WIDGET_CUSTOM: /* custom widget. --nenolod */
1853 if (widgets[x].populate)
1854 widget = widgets[x].populate();
1855 else
1856 widget = NULL;
1857
1858 break;
1859 case WIDGET_FONT_BTN:
1860 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 12, 0);
1861
1862 if (x > 1 && widgets[x-1].type == WIDGET_FONT_BTN) {
1863 table_line++;
1864 } else {
1865 /* check how many WIDGET_FONT_BTNs are there */
1866 gint lines = 0, i;
1867 for (i=x; i<amt && widgets[i].type == WIDGET_FONT_BTN; i++)
1868 lines++;
1869
1870 widget = gtk_table_new(lines, 2, FALSE);
1871 gtk_table_set_row_spacings(GTK_TABLE(widget), 8);
1872 gtk_table_set_col_spacings(GTK_TABLE(widget), 2);
1873 table_line=0;
1874 }
1875
1876 GtkWidget *label = gtk_label_new_with_mnemonic(_(widgets[x].label));
1877 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1878 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
1879 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1880 gtk_table_attach(GTK_TABLE (widget), label, 0, 1, table_line, table_line+1,
1881 (GtkAttachOptions) (0),
1882 (GtkAttachOptions) (0), 0, 0);
1883
1884 GtkWidget *font_btn = gtk_font_button_new();
1885 gtk_table_attach(GTK_TABLE(widget), font_btn, 1, 2, table_line, table_line+1,
1886 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1887 (GtkAttachOptions) (0), 0, 0);
1888
1889 gtk_font_button_set_use_font(GTK_FONT_BUTTON(font_btn), TRUE);
1890 gtk_font_button_set_use_size(GTK_FONT_BUTTON(font_btn), TRUE);
1891 gtk_label_set_mnemonic_widget(GTK_LABEL(label), font_btn);
1892 if (widgets[x].tooltip)
1893 gtk_font_button_set_title (GTK_FONT_BUTTON (font_btn), _(widgets[x].tooltip));
1894 g_object_set_data(G_OBJECT(font_btn), "callback", widgets[x].callback);
1895
1896 g_signal_connect(G_OBJECT(font_btn), "font_set",
1897 G_CALLBACK(on_font_btn_font_set),
1898 (char**)widgets[x].cfg);
1899 g_signal_connect(G_OBJECT(font_btn), "realize",
1900 G_CALLBACK(on_font_btn_realize),
1901 (char**)widgets[x].cfg);
1902 break;
1903 default:
1904 /* shouldn't ever happen - expect things to break */
1905 continue;
1906 }
1907
1908 if (widget && !gtk_widget_get_parent(widget))
1909 gtk_container_add(GTK_CONTAINER(alignment), widget);
1910 if (widget && widgets[x].tooltip && widgets[x].type != WIDGET_SPIN_BTN)
1911 gtk_tooltips_set_tip(tooltips, widget, _(widgets[x].tooltip), NULL);
1912 }
1913
1914 }
1915
1916 static GtkWidget *
1917 create_titlestring_tag_menu(void)
1918 {
1919 GtkWidget *titlestring_tag_menu, *menu_item;
1920 guint i;
1921
1922 titlestring_tag_menu = gtk_menu_new();
1923 for(i = 0; i < n_title_field_tags; i++) {
1924 menu_item = gtk_menu_item_new_with_label(_(title_field_tags[i].name));
1925 gtk_menu_shell_append(GTK_MENU_SHELL(titlestring_tag_menu), menu_item);
1926 g_signal_connect(menu_item, "activate",
1927 G_CALLBACK(titlestring_tag_menu_callback),
1928 GINT_TO_POINTER(i));
1929 };
1930 gtk_widget_show_all(titlestring_tag_menu);
1931
1932 return titlestring_tag_menu;
1933 }
1934
1935 static void
1936 create_appearence_category(void)
1937 {
1938 GtkWidget *appearance_page_vbox;
1939 GtkWidget *vbox37;
1940 GtkWidget *vbox38;
1941 GtkWidget *hbox12;
1942 GtkWidget *alignment94;
1943 GtkWidget *hbox13;
1944 GtkWidget *label103;
1945 GtkWidget *colorspace_button;
1946 GtkWidget *image11;
1947 GtkWidget *image12;
1948 GtkWidget *alignment95;
1949 GtkWidget *skin_view_scrolled_window;
1950
1951 appearance_page_vbox = gtk_vbox_new (FALSE, 0);
1952 gtk_container_add (GTK_CONTAINER (category_notebook), appearance_page_vbox);
1953
1954 vbox37 = gtk_vbox_new (FALSE, 0);
1955 gtk_box_pack_start (GTK_BOX (appearance_page_vbox), vbox37, TRUE, TRUE, 0);
1956
1957 vbox38 = gtk_vbox_new (FALSE, 0);
1958 gtk_box_pack_start (GTK_BOX (vbox37), vbox38, FALSE, TRUE, 0);
1959
1960 hbox12 = gtk_hbox_new (FALSE, 0);
1961 gtk_box_pack_start (GTK_BOX (vbox38), hbox12, TRUE, TRUE, 0);
1962
1963 alignment94 = gtk_alignment_new (0.5, 0.5, 1, 1);
1964 gtk_box_pack_start (GTK_BOX (hbox12), alignment94, TRUE, TRUE, 0);
1965 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment94), 0, 4, 0, 0);
1966
1967 hbox13 = gtk_hbox_new (FALSE, 0);
1968 gtk_container_add (GTK_CONTAINER (alignment94), hbox13);
1969
1970 label103 = gtk_label_new_with_mnemonic (_("<b>_Skin</b>"));
1971 gtk_box_pack_start (GTK_BOX (hbox13), label103, TRUE, TRUE, 0);
1972 gtk_label_set_use_markup (GTK_LABEL (label103), TRUE);
1973 gtk_misc_set_alignment (GTK_MISC (label103), 0, 0);
1974
1975 colorspace_button = gtk_button_new ();
1976 gtk_box_pack_start (GTK_BOX (hbox13), colorspace_button, FALSE, FALSE, 0);
1977
1978 image11 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_BUTTON);
1979 gtk_container_add (GTK_CONTAINER (colorspace_button), image11);
1980
1981 skin_refresh_button = gtk_button_new ();
1982 gtk_box_pack_start (GTK_BOX (hbox13), skin_refresh_button, FALSE, FALSE, 0);
1983 GTK_WIDGET_UNSET_FLAGS (skin_refresh_button, GTK_CAN_FOCUS);
1984 gtk_tooltips_set_tip (tooltips, skin_refresh_button, _("Refresh skin list"), NULL);
1985 gtk_button_set_relief (GTK_BUTTON (skin_refresh_button), GTK_RELIEF_HALF);
1986 gtk_button_set_focus_on_click (GTK_BUTTON (skin_refresh_button), FALSE);
1987
1988 image12 = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_BUTTON);
1989 gtk_container_add (GTK_CONTAINER (skin_refresh_button), image12);
1990
1991 alignment95 = gtk_alignment_new (0.5, 0.5, 1, 1);
1992 gtk_box_pack_start (GTK_BOX (vbox38), alignment95, TRUE, TRUE, 0);
1993 gtk_widget_set_size_request (alignment95, -1, 172);
1994 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment95), 0, 0, 12, 0);
1995
1996 skin_view_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1997 gtk_container_add (GTK_CONTAINER (alignment95), skin_view_scrolled_window);
1998 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1999 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_SHADOW_IN);
2000
2001 skin_view = gtk_tree_view_new ();
2002 gtk_container_add (GTK_CONTAINER (skin_view_scrolled_window), skin_view);
2003 gtk_widget_set_size_request (skin_view, -1, 100);
2004
2005 create_widgets(GTK_BOX(vbox37), appearance_misc_widgets, G_N_ELEMENTS(appearance_misc_widgets));
2006
2007
2008
2009 gtk_label_set_mnemonic_widget (GTK_LABEL (label103), category_notebook);
2010
2011 g_signal_connect(G_OBJECT(colorspace_button), "clicked",
2012 G_CALLBACK(on_colorize_button_clicked),
2013 NULL);
2014
2015 g_signal_connect(skin_view, "drag-data-received",
2016 G_CALLBACK(on_skin_view_drag_data_received),
2017 NULL);
2018 aud_drag_dest_set(skin_view);
2019
2020 g_signal_connect(mainwin, "drag-data-received",
2021 G_CALLBACK(mainwin_drag_data_received),
2022 skin_view);
2023
2024 g_signal_connect(skin_refresh_button, "clicked",
2025 G_CALLBACK(on_skin_refresh_button_clicked),
2026 NULL);
2027 }
2028
2029 static void
2030 create_mouse_category(void)
2031 {
2032 GtkWidget *mouse_page_vbox;
2033 GtkWidget *vbox20;
2034
2035 mouse_page_vbox = gtk_vbox_new (FALSE, 0);
2036 gtk_container_add (GTK_CONTAINER (category_notebook), mouse_page_vbox);
2037
2038 vbox20 = gtk_vbox_new (FALSE, 0);
2039 gtk_box_pack_start (GTK_BOX (mouse_page_vbox), vbox20, TRUE, TRUE, 0);
2040
2041 create_widgets(GTK_BOX(vbox20), mouse_page_widgets, G_N_ELEMENTS(mouse_page_widgets));
2042 }
2043
2044 static void
2045 create_playback_category(void)
2046 {
2047 GtkWidget *playback_page_vbox;
2048 GtkWidget *widgets_vbox;
2049
2050 playback_page_vbox = gtk_vbox_new (FALSE, 0);
2051 gtk_container_add (GTK_CONTAINER (category_notebook), playback_page_vbox);
2052
2053 widgets_vbox = gtk_vbox_new (FALSE, 0);
2054 create_widgets(GTK_BOX(widgets_vbox), playback_page_widgets, G_N_ELEMENTS(playback_page_widgets));
2055 gtk_box_pack_start (GTK_BOX (playback_page_vbox), widgets_vbox, TRUE, TRUE, 0);
2056 }
2057
2058 static void
2059 create_replay_gain_category(void)
2060 {
2061 GtkWidget *rg_page_vbox;
2062 GtkWidget *widgets_vbox;
2063
2064 rg_page_vbox = gtk_vbox_new (FALSE, 0);
2065 gtk_container_add (GTK_CONTAINER (category_notebook), rg_page_vbox);
2066
2067 widgets_vbox = gtk_vbox_new (FALSE, 0);
2068 create_widgets(GTK_BOX(widgets_vbox), replay_gain_page_widgets, G_N_ELEMENTS(replay_gain_page_widgets));
2069 gtk_box_pack_start (GTK_BOX (rg_page_vbox), widgets_vbox, TRUE, TRUE, 0);
2070 }
2071
2072 static void
2073 create_playlist_category(void)
2074 {
2075 GtkWidget *playlist_page_vbox;
2076 GtkWidget *vbox5;
2077 GtkWidget *alignment55;
2078 GtkWidget *label60;
2079 GtkWidget *alignment56;
2080 GtkWidget *table6;
2081 GtkWidget *titlestring_help_button;
2082 GtkWidget *image1;
2083 GtkWidget *titlestring_cbox;
2084 GtkWidget *label62;
2085 GtkWidget *label61;
2086 GtkWidget *alignment85;
2087 GtkWidget *label84;
2088 GtkWidget *alignment86;
2089 GtkWidget *hbox9;
2090 GtkWidget *vbox34;
2091 GtkWidget *checkbutton10;
2092 GtkWidget *image8;
2093 GtkWidget *titlestring_tag_menu = create_titlestring_tag_menu();
2094
2095
2096 playlist_page_vbox = gtk_vbox_new (FALSE, 0);
2097 gtk_container_add (GTK_CONTAINER (category_notebook), playlist_page_vbox);
2098
2099 vbox5 = gtk_vbox_new (FALSE, 0);
2100 gtk_box_pack_start (GTK_BOX (playlist_page_vbox), vbox5, TRUE, TRUE, 0);
2101
2102 create_widgets(GTK_BOX(vbox5), playlist_page_widgets, G_N_ELEMENTS(playlist_page_widgets));
2103
2104 alignment55 = gtk_alignment_new (0.5, 0.5, 1, 1);
2105 gtk_box_pack_start (GTK_BOX (vbox5), alignment55, FALSE, FALSE, 0);
2106 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment55), 12, 12, 0, 0);
2107
2108 label60 = gtk_label_new (_("<b>Song Display</b>"));
2109 gtk_container_add (GTK_CONTAINER (alignment55), label60);
2110 gtk_label_set_use_markup (GTK_LABEL (label60), TRUE);
2111 gtk_misc_set_alignment (GTK_MISC (label60), 0, 0.5);
2112
2113 alignment56 = gtk_alignment_new (0.5, 0.5, 1, 1);
2114 gtk_box_pack_start (GTK_BOX (vbox5), alignment56, FALSE, FALSE, 0);
2115 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment56), 0, 0, 12, 0);
2116
2117 table6 = gtk_table_new (2, 3, FALSE);
2118 gtk_container_add (GTK_CONTAINER (alignment56), table6);
2119 gtk_table_set_row_spacings (GTK_TABLE (table6), 4);
2120 gtk_table_set_col_spacings (GTK_TABLE (table6), 12);
2121
2122 titlestring_help_button = gtk_button_new ();
2123 gtk_table_attach (GTK_TABLE (table6), titlestring_help_button, 2, 3, 1, 2,
2124 (GtkAttachOptions) (0),
2125 (GtkAttachOptions) (0), 0, 0);
2126 GTK_WIDGET_UNSET_FLAGS (titlestring_help_button, GTK_CAN_FOCUS);
2127 gtk_tooltips_set_tip (tooltips, titlestring_help_button, _("Show information about titlestring format"), NULL);
2128 gtk_button_set_relief (GTK_BUTTON (titlestring_help_button), GTK_RELIEF_HALF);
2129 gtk_button_set_focus_on_click (GTK_BUTTON (titlestring_help_button), FALSE);
2130
2131 image1 = gtk_image_new_from_stock ("gtk-index", GTK_ICON_SIZE_BUTTON);
2132 gtk_container_add (GTK_CONTAINER (titlestring_help_button), image1);
2133
2134 titlestring_cbox = gtk_combo_box_new_text ();
2135 gtk_table_attach (GTK_TABLE (table6), titlestring_cbox, 1, 3, 0, 1,
2136 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2137 (GtkAttachOptions) (0), 0, 0);
2138 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("TITLE"));
2139 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("ARTIST - TITLE"));
2140 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("ARTIST - ALBUM - TITLE"));
2141 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("ARTIST - ALBUM - TRACK. TITLE"));
2142 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("ARTIST [ ALBUM ] - TRACK. TITLE"));
2143 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("ALBUM - TITLE"));
2144 gtk_combo_box_append_text (GTK_COMBO_BOX (titlestring_cbox), _("Custom"));
2145
2146 titlestring_entry = gtk_entry_new ();
2147 gtk_table_attach (GTK_TABLE (table6), titlestring_entry, 1, 2, 1, 2,
2148 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2149 (GtkAttachOptions) (0), 0, 0);
2150
2151 label62 = gtk_label_new (_("Custom string:"));
2152 gtk_table_attach (GTK_TABLE (table6), label62, 0, 1, 1, 2,
2153 (GtkAttachOptions) (0),
2154 (GtkAttachOptions) (0), 0, 0);
2155 gtk_label_set_justify (GTK_LABEL (label62), GTK_JUSTIFY_RIGHT);
2156 gtk_misc_set_alignment (GTK_MISC (label62), 1, 0.5);
2157
2158 label61 = gtk_label_new (_("Title format:"));
2159 gtk_table_attach (GTK_TABLE (table6), label61, 0, 1, 0, 1,
2160 (GtkAttachOptions) (0),
2161 (GtkAttachOptions) (0), 0, 0);
2162 gtk_label_set_justify (GTK_LABEL (label61), GTK_JUSTIFY_RIGHT);
2163 gtk_misc_set_alignment (GTK_MISC (label61), 1, 0.5);
2164
2165 alignment85 = gtk_alignment_new (0.5, 0.5, 1, 1);
2166 gtk_box_pack_start (GTK_BOX (vbox5), alignment85, FALSE, FALSE, 0);
2167 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment85), 12, 12, 0, 0);
2168
2169 label84 = gtk_label_new (_("<b>Popup Information</b>"));
2170 gtk_container_add (GTK_CONTAINER (alignment85), label84);
2171 gtk_label_set_use_markup (GTK_LABEL (label84), TRUE);
2172 gtk_misc_set_alignment (GTK_MISC (label84), 0, 0.5);
2173
2174 alignment86 = gtk_alignment_new (0.5, 0.5, 1, 1);
2175 gtk_box_pack_start (GTK_BOX (vbox5), alignment86, FALSE, FALSE, 0);
2176 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment86), 0, 0, 12, 0);
2177
2178 hbox9 = gtk_hbox_new (FALSE, 12);
2179 gtk_container_add (GTK_CONTAINER (alignment86), hbox9);
2180
2181 vbox34 = gtk_vbox_new (FALSE, 0);
2182 gtk_box_pack_start (GTK_BOX (hbox9), vbox34, TRUE, TRUE, 0);
2183
2184 checkbutton10 = gtk_check_button_new_with_mnemonic (_("Show popup information for playlist entries"));
2185 gtk_box_pack_start (GTK_BOX (vbox34), checkbutton10, TRUE, FALSE, 0);
2186 gtk_tooltips_set_tip (tooltips, checkbutton10, _("Toggles popup information window for the pointed entry in the playlist. The window shows title of song, name of album, genre, year of publish, track number, track length, and artwork."), NULL);
2187
2188 filepopup_for_tuple_settings_button = gtk_button_new ();
2189 gtk_box_pack_start (GTK_BOX (hbox9), filepopup_for_tuple_settings_button, FALSE, FALSE, 0);
2190 GTK_WIDGET_UNSET_FLAGS (filepopup_for_tuple_settings_button, GTK_CAN_FOCUS);
2191 gtk_tooltips_set_tip (tooltips, filepopup_for_tuple_settings_button, _("Edit settings for popup information"), NULL);
2192 gtk_button_set_relief (GTK_BUTTON (filepopup_for_tuple_settings_button), GTK_RELIEF_HALF);
2193
2194 image8 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_BUTTON);
2195 gtk_container_add (GTK_CONTAINER (filepopup_for_tuple_settings_button), image8);
2196
2197
2198
2199 g_signal_connect(G_OBJECT(checkbutton10), "toggled",
2200 G_CALLBACK(on_show_filepopup_for_tuple_toggled),
2201 NULL);
2202 g_signal_connect_after(G_OBJECT(checkbutton10), "realize",
2203 G_CALLBACK(on_show_filepopup_for_tuple_realize),
2204 NULL);
2205 g_signal_connect(G_OBJECT(filepopup_for_tuple_settings_button), "clicked",
2206 G_CALLBACK(on_filepopup_for_tuple_settings_clicked),
2207 NULL);
2208
2209 g_signal_connect(titlestring_cbox, "realize",
2210 G_CALLBACK(on_titlestring_cbox_realize),
2211 titlestring_entry);
2212 g_signal_connect(titlestring_cbox, "changed",
2213 G_CALLBACK(on_titlestring_cbox_changed),
2214 titlestring_entry);
2215
2216 g_signal_connect(titlestring_cbox, "changed",
2217 G_CALLBACK(on_titlestring_cbox_changed),
2218 titlestring_help_button);
2219 g_signal_connect(titlestring_help_button, "clicked",
2220 G_CALLBACK(on_titlestring_help_button_clicked),
2221 titlestring_tag_menu);
2222
2223 g_signal_connect(G_OBJECT(titlestring_entry), "changed",
2224 G_CALLBACK(on_titlestring_entry_changed),
2225 NULL);
2226 g_signal_connect_after(G_OBJECT(titlestring_entry), "realize",
2227 G_CALLBACK(on_titlestring_entry_realize),
2228 NULL);
2229
2230
2231
2232 /* Create window for filepopup settings */
2233 create_filepopup_settings();
2234 }
2235
2236
2237 static void
2238 create_audio_category(void)
2239 {
2240 GtkWidget *audio_page_vbox;
2241 GtkWidget *alignment74;
2242 GtkWidget *label77;
2243 GtkWidget *alignment73;
2244 GtkWidget *vbox33;
2245 GtkWidget *table11;
2246 GtkWidget *image7;
2247 GtkWidget *label79;
2248 GtkWidget *label82;
2249 GtkObject *output_plugin_bufsize_adj;
2250 GtkWidget *output_plugin_bufsize;
2251 GtkWidget *output_plugin_cbox;
2252 GtkWidget *label78;
2253 GtkWidget *alignment82;
2254 GtkWidget *output_plugin_button_box;
2255 GtkWidget *output_plugin_prefs;
2256 GtkWidget *alignment76;
2257 GtkWidget *hbox7;
2258 GtkWidget *image5;
2259 GtkWidget *label80;
2260 GtkWidget *output_plugin_info;
2261 GtkWidget *alignment77;
2262 GtkWidget *hbox8;
2263 GtkWidget *image6;
2264 GtkWidget *label81;
2265 GtkWidget *alignment90;
2266 GtkWidget *label93;
2267 GtkWidget *alignment92;
2268 GtkWidget *enable_src;
2269 GtkWidget *alignment91;
2270 GtkWidget *vbox36;
2271 GtkWidget *table13;
2272 GtkWidget *src_converter_type;
2273 GtkWidget *label94;
2274 GtkWidget *label92;
2275 GtkWidget *image9;
2276 GtkObject *src_rate_adj;
2277 GtkWidget *src_rate;
2278 GtkWidget *label91;
2279 GtkWidget *alignment4;
2280
2281 audio_page_vbox = gtk_vbox_new (FALSE, 0);
2282 gtk_container_add (GTK_CONTAINER (category_notebook), audio_page_vbox);
2283
2284 alignment74 = gtk_alignment_new (0.5, 0.5, 1, 1);
2285 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment74, FALSE, FALSE, 0);
2286 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment74), 0, 12, 0, 0);
2287
2288 label77 = gtk_label_new (_("<b>Audio System</b>"));
2289 gtk_container_add (GTK_CONTAINER (alignment74), label77);
2290 gtk_label_set_use_markup (GTK_LABEL (label77), TRUE);
2291 gtk_misc_set_alignment (GTK_MISC (label77), 0, 0.5);
2292
2293 alignment73 = gtk_alignment_new (0.5, 0.5, 1, 1);
2294 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment73, FALSE, FALSE, 0);
2295 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment73), 0, 6, 12, 0);
2296
2297 vbox33 = gtk_vbox_new (FALSE, 0);
2298 gtk_container_add (GTK_CONTAINER (alignment73), vbox33);
2299
2300 table11 = gtk_table_new (3, 2, FALSE);
2301 gtk_box_pack_start (GTK_BOX (vbox33), table11, FALSE, FALSE, 0);
2302 gtk_table_set_row_spacings (GTK_TABLE (table11), 6);
2303 gtk_table_set_col_spacings (GTK_TABLE (table11), 6);
2304
2305 image7 = gtk_image_new_from_stock ("gtk-info", GTK_ICON_SIZE_BUTTON);
2306 gtk_table_attach (GTK_TABLE (table11), image7, 0, 1, 2, 3,
2307 (GtkAttachOptions) (0),
2308 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
2309 gtk_misc_set_alignment (GTK_MISC (image7), 1, 0);
2310
2311 label79 = gtk_label_new (_("Buffer size:"));
2312 gtk_table_attach (GTK_TABLE (table11), label79, 0, 1, 1, 2,
2313 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2314 (GtkAttachOptions) (0), 0, 0);
2315 gtk_misc_set_alignment (GTK_MISC (label79), 1, 0.5);
2316
2317 label82 = gtk_label_new (_("<span size=\"small\">This is the amount of time to prebuffer audio streams by, in milliseconds.\nIncrease this value if you are experiencing audio skipping.\nPlease note however, that high values will result in Audacious performing poorly.</span>"));
2318 gtk_table_attach (GTK_TABLE (table11), label82, 1, 2, 2, 3,
2319 (GtkAttachOptions) (0),
2320 (GtkAttachOptions) (0), 0, 0);
2321 gtk_label_set_use_markup (GTK_LABEL (label82), TRUE);
2322 gtk_label_set_line_wrap (GTK_LABEL (label82), TRUE);
2323 gtk_misc_set_alignment (GTK_MISC (label82), 0, 0.5);
2324
2325 output_plugin_bufsize_adj = gtk_adjustment_new (0, 0, 600000, 100, 1000, 1000);
2326 output_plugin_bufsize = gtk_spin_button_new (GTK_ADJUSTMENT (output_plugin_bufsize_adj), 1, 0);
2327 gtk_table_attach (GTK_TABLE (table11), output_plugin_bufsize, 1, 2, 1, 2,
2328 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2329 (GtkAttachOptions) (0), 0, 0);
2330
2331 output_plugin_cbox = gtk_combo_box_new_text ();
2332 gtk_table_attach (GTK_TABLE (table11), output_plugin_cbox, 1, 2, 0, 1,
2333 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2334 (GtkAttachOptions) (0), 0, 0);
2335
2336 label78 = gtk_label_new (_("Current output plugin:"));
2337 gtk_table_attach (GTK_TABLE (table11), label78, 0, 1, 0, 1,
2338 (GtkAttachOptions) (0),
2339 (GtkAttachOptions) (0), 0, 0);
2340 gtk_misc_set_alignment (GTK_MISC (label78), 0, 0.5);
2341
2342 alignment82 = gtk_alignment_new (0.5, 0.5, 1, 1);
2343 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment82, FALSE, FALSE, 0);
2344 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment82), 0, 0, 12, 0);
2345
2346 output_plugin_button_box = gtk_hbutton_box_new ();
2347 gtk_container_add (GTK_CONTAINER (alignment82), output_plugin_button_box);
2348 gtk_button_box_set_layout (GTK_BUTTON_BOX (output_plugin_button_box), GTK_BUTTONBOX_START);
2349 gtk_box_set_spacing (GTK_BOX (output_plugin_button_box), 8);
2350
2351 output_plugin_prefs = gtk_button_new ();
2352 gtk_container_add (GTK_CONTAINER (output_plugin_button_box), output_plugin_prefs);
2353 gtk_widget_set_sensitive (output_plugin_prefs, FALSE);
2354 GTK_WIDGET_SET_FLAGS (output_plugin_prefs, GTK_CAN_DEFAULT);
2355
2356 alignment76 = gtk_alignment_new (0.5, 0.5, 0, 0);
2357 gtk_container_add (GTK_CONTAINER (output_plugin_prefs), alignment76);
2358
2359 hbox7 = gtk_hbox_new (FALSE, 2);
2360 gtk_container_add (GTK_CONTAINER (alignment76), hbox7);
2361
2362 image5 = gtk_image_new_from_stock ("gtk-preferences", GTK_ICON_SIZE_BUTTON);
2363 gtk_box_pack_start (GTK_BOX (hbox7), image5, FALSE, FALSE, 0);
2364
2365 label80 = gtk_label_new_with_mnemonic (_("Output Plugin Preferences"));
2366 gtk_box_pack_start (GTK_BOX (hbox7), label80, FALSE, FALSE, 0);
2367
2368 output_plugin_info = gtk_button_new ();
2369 gtk_container_add (GTK_CONTAINER (output_plugin_button_box), output_plugin_info);
2370 gtk_widget_set_sensitive (output_plugin_info, FALSE);
2371 GTK_WIDGET_SET_FLAGS (output_plugin_info, GTK_CAN_DEFAULT);
2372
2373 alignment77 = gtk_alignment_new (0.5, 0.5, 0, 0);
2374 gtk_container_add (GTK_CONTAINER (output_plugin_info), alignment77);
2375
2376 hbox8 = gtk_hbox_new (FALSE, 2);
2377 gtk_container_add (GTK_CONTAINER (alignment77), hbox8);
2378
2379 image6 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_BUTTON);
2380 gtk_box_pack_start (GTK_BOX (hbox8), image6, FALSE, FALSE, 0);
2381
2382 label81 = gtk_label_new_with_mnemonic (_("Output Plugin Information"));
2383 gtk_box_pack_start (GTK_BOX (hbox8), label81, FALSE, FALSE, 0);
2384
2385 create_widgets(GTK_BOX(audio_page_vbox), audio_page_widgets, G_N_ELEMENTS(audio_page_widgets));
2386
2387 alignment90 = gtk_alignment_new (0.5, 0.5, 1, 1);
2388 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment90, FALSE, FALSE, 0);
2389 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment90), 12, 12, 0, 0);
2390
2391 label93 = gtk_label_new (_("<b>Sampling Rate Converter</b>"));
2392 gtk_container_add (GTK_CONTAINER (alignment90), label93);
2393 gtk_label_set_use_markup (GTK_LABEL (label93), TRUE);
2394 gtk_misc_set_alignment (GTK_MISC (label93), 0, 0.5);
2395
2396 alignment92 = gtk_alignment_new (0.5, 0.5, 1, 1);
2397 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment92, FALSE, FALSE, 0);
2398 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment92), 0, 0, 12, 0);
2399
2400 enable_src = gtk_check_button_new_with_mnemonic (_("Enable Sampling Rate Converter"));
2401 gtk_container_add (GTK_CONTAINER (alignment92), enable_src);
2402 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (enable_src), TRUE);
2403
2404 alignment91 = gtk_alignment_new (0.5, 0.5, 1, 1);
2405 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment91, FALSE, FALSE, 0);
2406 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment91), 0, 6, 12, 0);
2407
2408 vbox36 = gtk_vbox_new (FALSE, 0);
2409 gtk_container_add (GTK_CONTAINER (alignment91), vbox36);
2410
2411 table13 = gtk_table_new (3, 2, FALSE);
2412 gtk_box_pack_start (GTK_BOX (vbox36), table13, FALSE, FALSE, 0);
2413 gtk_table_set_row_spacings (GTK_TABLE (table13), 6);
2414 gtk_table_set_col_spacings (GTK_TABLE (table13), 6);
2415
2416 src_converter_type = gtk_combo_box_new_text ();
2417 gtk_table_attach (GTK_TABLE (table13), src_converter_type, 1, 2, 1, 2,
2418 (GtkAttachOptions) (0),
2419 (GtkAttachOptions) (0), 0, 0);
2420 gtk_combo_box_append_text (GTK_COMBO_BOX (src_converter_type), _("Best Sinc Interpolation"));
2421 gtk_combo_box_append_text (GTK_COMBO_BOX (src_converter_type), _("Medium Sinc Interpolation"));
2422 gtk_combo_box_append_text (GTK_COMBO_BOX (src_converter_type), _("Fastest Sinc Interpolation"));
2423 gtk_combo_box_append_text (GTK_COMBO_BOX (src_converter_type), _("ZOH Interpolation"));
2424 gtk_combo_box_append_text (GTK_COMBO_BOX (src_converter_type), _("Linear Interpolation"));
2425
2426 label94 = gtk_label_new (_("Interpolation Engine:"));
2427 gtk_table_attach (GTK_TABLE (table13), label94, 0, 1, 1, 2,
2428 (GtkAttachOptions) (0),
2429 (GtkAttachOptions) (0), 0, 0);
2430 gtk_misc_set_alignment (GTK_MISC (label94), 0, 0.5);
2431
2432 label92 = gtk_label_new (_("<span size=\"small\">All streams will be converted to this sampling rate.\nThis should be the max supported sampling rate of\nthe sound card or output plugin.</span>"));
2433 gtk_table_attach (GTK_TABLE (table13), label92, 1, 2, 2, 3,
2434 (GtkAttachOptions) (0),
2435 (GtkAttachOptions) (0), 0, 0);
2436 gtk_label_set_use_markup (GTK_LABEL (label92), TRUE);
2437 gtk_label_set_line_wrap (GTK_LABEL (label92), TRUE);
2438 gtk_misc_set_alignment (GTK_MISC (label92), 0, 0.5);
2439
2440 image9 = gtk_image_new_from_stock ("gtk-info", GTK_ICON_SIZE_BUTTON);
2441 gtk_table_attach (GTK_TABLE (table13), image9, 0, 1, 2, 3,
2442 (GtkAttachOptions) (0),
2443 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
2444 gtk_misc_set_alignment (GTK_MISC (image9), 1, 0);
2445
2446 src_rate_adj = gtk_adjustment_new (96000, 1000, 768000, 1000, 1000, 1000);
2447 src_rate = gtk_spin_button_new (GTK_ADJUSTMENT (src_rate_adj), 1, 0);
2448 gtk_table_attach (GTK_TABLE (table13), src_rate, 1, 2, 0, 1,
2449 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2450 (GtkAttachOptions) (0), 0, 0);
2451
2452 label91 = gtk_label_new (_("Sampling Rate [Hz]:"));
2453 gtk_table_attach (GTK_TABLE (table13), label91, 0, 1, 0, 1,
2454 (GtkAttachOptions) (0),
2455 (GtkAttachOptions) (0), 0, 0);
2456 gtk_misc_set_alignment (GTK_MISC (label91), 0, 0.5);
2457
2458 alignment4 = gtk_alignment_new (0.5, 0.5, 1, 1);
2459 gtk_box_pack_start (GTK_BOX (audio_page_vbox), alignment4, FALSE, FALSE, 0);
2460 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment4), 12, 12, 0, 0);
2461
2462 create_widgets(GTK_BOX(audio_page_vbox), audio_page_widgets2, G_N_ELEMENTS(audio_page_widgets2));
2463
2464 g_signal_connect(G_OBJECT(output_plugin_bufsize), "value_changed",
2465 G_CALLBACK(on_output_plugin_bufsize_value_changed),
2466 NULL);
2467 g_signal_connect_after(G_OBJECT(output_plugin_bufsize), "realize",
2468 G_CALLBACK(on_output_plugin_bufsize_realize),
2469 NULL);
2470 g_signal_connect_after(G_OBJECT(output_plugin_cbox), "realize",
2471 G_CALLBACK(on_output_plugin_cbox_realize),
2472 NULL);
2473 g_signal_connect(G_OBJECT(enable_src), "toggled",
2474 G_CALLBACK(on_enable_src_toggled),
2475 NULL);
2476 g_signal_connect(G_OBJECT(enable_src), "realize",
2477 G_CALLBACK(on_enable_src_realize),
2478 NULL);
2479 g_signal_connect(G_OBJECT(src_converter_type), "changed",
2480 G_CALLBACK(on_src_converter_type_changed),
2481 NULL);
2482 g_signal_connect_after(G_OBJECT(src_converter_type), "realize",
2483 G_CALLBACK(on_src_converter_type_realize),
2484 NULL);
2485 g_signal_connect(G_OBJECT(src_rate), "value_changed",
2486 G_CALLBACK(on_src_rate_value_changed),
2487 NULL);
2488 g_signal_connect(G_OBJECT(src_rate), "realize",
2489 G_CALLBACK(on_src_rate_realize),
2490 NULL);
2491
2492 /* plugin->output page */
2493
2494 g_signal_connect(G_OBJECT(output_plugin_cbox), "changed",
2495 G_CALLBACK(output_plugin_enable_prefs),
2496 output_plugin_prefs);
2497 g_signal_connect_swapped(G_OBJECT(output_plugin_prefs), "clicked",
2498 G_CALLBACK(output_plugin_open_prefs),
2499 output_plugin_cbox);
2500
2501 g_signal_connect(G_OBJECT(output_plugin_cbox), "changed",
2502 G_CALLBACK(output_plugin_enable_info),
2503 output_plugin_info);
2504 g_signal_connect_swapped(G_OBJECT(output_plugin_info), "clicked",
2505 G_CALLBACK(output_plugin_open_info),
2506 output_plugin_cbox);
2507
2508 }
2509
2510 static void
2511 create_connectivity_category(void)
2512 {
2513 GtkWidget *connectivity_page_vbox;
2514 GtkWidget *vbox29;
2515 GtkWidget *alignment63;
2516 GtkWidget *connectivity_page_label;
2517 GtkWidget *alignment68;
2518 GtkWidget *vbox30;
2519 GtkWidget *alignment65;
2520 GtkWidget *proxy_use;
2521 GtkWidget *table8;
2522 GtkWidget *proxy_port;
2523 GtkWidget *proxy_host;
2524 GtkWidget *label69;
2525 GtkWidget *label68;
2526 GtkWidget *alignment67;
2527 GtkWidget *proxy_auth;
2528 GtkWidget *table9;
2529 GtkWidget *proxy_pass;
2530 GtkWidget *proxy_user;
2531 GtkWidget *label71;
2532 GtkWidget *label70;
2533 GtkWidget *alignment72;
2534 GtkWidget *hbox6;
2535 GtkWidget *image4;
2536 GtkWidget *label75;
2537
2538 connectivity_page_vbox = gtk_vbox_new (FALSE, 0);
2539 gtk_container_add (GTK_CONTAINER (category_notebook), connectivity_page_vbox);
2540
2541 vbox29 = gtk_vbox_new (FALSE, 0);
2542 gtk_box_pack_start (GTK_BOX (connectivity_page_vbox), vbox29, TRUE, TRUE, 0);
2543
2544 alignment63 = gtk_alignment_new (0.5, 0.5, 1, 1);
2545 gtk_box_pack_start (GTK_BOX (vbox29), alignment63, FALSE, FALSE, 0);
2546 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment63), 0, 12, 0, 0);
2547
2548 connectivity_page_label = gtk_label_new (_("<b>Proxy Configuration</b>"));
2549 gtk_container_add (GTK_CONTAINER (alignment63), connectivity_page_label);
2550 gtk_label_set_use_markup (GTK_LABEL (connectivity_page_label), TRUE);
2551 gtk_misc_set_alignment (GTK_MISC (connectivity_page_label), 0, 0.5);
2552
2553 alignment68 = gtk_alignment_new (0.5, 0.5, 1, 1);
2554 gtk_box_pack_start (GTK_BOX (vbox29), alignment68, TRUE, TRUE, 0);
2555 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment68), 0, 0, 12, 0);
2556
2557 vbox30 = gtk_vbox_new (FALSE, 0);
2558 gtk_container_add (GTK_CONTAINER (alignment68), vbox30);
2559
2560 alignment65 = gtk_alignment_new (0.5, 0.5, 1, 1);
2561 gtk_box_pack_start (GTK_BOX (vbox30), alignment65, FALSE, FALSE, 0);
2562 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment65), 0, 12, 0, 0);
2563
2564 proxy_use = gtk_check_button_new_with_mnemonic (_("Enable proxy usage"));
2565 gtk_container_add (GTK_CONTAINER (alignment65), proxy_use);
2566
2567 table8 = gtk_table_new (2, 2, FALSE);
2568 gtk_box_pack_start (GTK_BOX (vbox30), table8, FALSE, FALSE, 0);
2569 gtk_table_set_row_spacings (GTK_TABLE (table8), 6);
2570 gtk_table_set_col_spacings (GTK_TABLE (table8), 6);
2571
2572 proxy_port = gtk_entry_new ();
2573 gtk_table_attach (GTK_TABLE (table8), proxy_port, 1, 2, 1, 2,
2574 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2575 (GtkAttachOptions) (0), 0, 0);
2576
2577 proxy_host = gtk_entry_new ();
2578 gtk_table_attach (GTK_TABLE (table8), proxy_host, 1, 2, 0, 1,
2579 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2580 (GtkAttachOptions) (0), 0, 0);
2581
2582 label69 = gtk_label_new (_("Proxy port:"));
2583 gtk_table_attach (GTK_TABLE (table8), label69, 0, 1, 1, 2,
2584 (GtkAttachOptions) (0),
2585 (GtkAttachOptions) (0), 0, 0);
2586 gtk_misc_set_alignment (GTK_MISC (label69), 0, 0.5);
2587
2588 label68 = gtk_label_new (_("Proxy hostname:"));
2589 gtk_table_attach (GTK_TABLE (table8), label68, 0, 1, 0, 1,
2590 (GtkAttachOptions) (0),
2591 (GtkAttachOptions) (0), 0, 0);
2592 gtk_misc_set_alignment (GTK_MISC (label68), 0, 0);
2593
2594 alignment67 = gtk_alignment_new (0.5, 0.5, 1, 1);
2595 gtk_box_pack_start (GTK_BOX (vbox30), alignment67, FALSE, FALSE, 0);
2596 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment67), 12, 12, 0, 0);
2597
2598 proxy_auth = gtk_check_button_new_with_mnemonic (_("Use authentication with proxy"));
2599 gtk_container_add (GTK_CONTAINER (alignment67), proxy_auth);
2600
2601 table9 = gtk_table_new (2, 2, FALSE);
2602 gtk_box_pack_start (GTK_BOX (vbox30), table9, FALSE, FALSE, 0);
2603 gtk_table_set_row_spacings (GTK_TABLE (table9), 6);
2604 gtk_table_set_col_spacings (GTK_TABLE (table9), 6);
2605
2606 proxy_pass = gtk_entry_new ();
2607 gtk_table_attach (GTK_TABLE (table9), proxy_pass, 1, 2, 1, 2,
2608 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2609 (GtkAttachOptions) (0), 0, 0);
2610 gtk_entry_set_visibility (GTK_ENTRY (proxy_pass), FALSE);
2611
2612 proxy_user = gtk_entry_new ();
2613 gtk_table_attach (GTK_TABLE (table9), proxy_user, 1, 2, 0, 1,
2614 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
2615 (GtkAttachOptions) (0), 0, 0);
2616
2617 label71 = gtk_label_new (_("Proxy password:"));
2618 gtk_table_attach (GTK_TABLE (table9), label71, 0, 1, 1, 2,
2619 (GtkAttachOptions) (0),
2620 (GtkAttachOptions) (0), 0, 0);
2621 gtk_misc_set_alignment (GTK_MISC (label71), 0, 0.5);
2622
2623 label70 = gtk_label_new (_("Proxy username:"));
2624 gtk_table_attach (GTK_TABLE (table9), label70, 0, 1, 0, 1,
2625 (GtkAttachOptions) (0),
2626 (GtkAttachOptions) (0), 0, 0);
2627 gtk_misc_set_alignment (GTK_MISC (label70), 0, 0);
2628
2629 alignment72 = gtk_alignment_new (0.5, 0.5, 1, 1);
2630 gtk_box_pack_start (GTK_BOX (vbox30), alignment72, FALSE, FALSE, 0);
2631 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment72), 6, 0, 0, 0);
2632
2633 hbox6 = gtk_hbox_new (FALSE, 0);
2634 gtk_container_add (GTK_CONTAINER (alignment72), hbox6);
2635
2636 image4 = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_BUTTON);
2637 gtk_box_pack_start (GTK_BOX (hbox6), image4, FALSE, FALSE, 0);
2638 gtk_misc_set_padding (GTK_MISC (image4), 3, 0);
2639
2640 label75 = gtk_label_new (_("<span size=\"small\">Changing these settings will require a restart of Audacious.</span>"));
2641 gtk_box_pack_start (GTK_BOX (hbox6), label75, FALSE, FALSE, 0);
2642 gtk_label_set_use_markup (GTK_LABEL (label75), TRUE);
2643
2644
2645 g_signal_connect(G_OBJECT(proxy_use), "toggled",
2646 G_CALLBACK(on_proxy_button_toggled),
2647 "use_proxy");
2648 g_signal_connect(G_OBJECT(proxy_use), "realize",
2649 G_CALLBACK(on_proxy_button_realize),
2650 "use_proxy");
2651 g_signal_connect(G_OBJECT(proxy_port), "changed",
2652 G_CALLBACK(on_proxy_entry_changed),
2653 "proxy_port");
2654 g_signal_connect(G_OBJECT(proxy_port), "realize",
2655 G_CALLBACK(on_proxy_entry_realize),
2656 "proxy_port");
2657 g_signal_connect(G_OBJECT(proxy_host), "changed",
2658 G_CALLBACK(on_proxy_entry_changed),
2659 "proxy_host");
2660 g_signal_connect(G_OBJECT(proxy_host), "realize",
2661 G_CALLBACK(on_proxy_entry_realize),
2662 "proxy_host");
2663 g_signal_connect(G_OBJECT(proxy_auth), "toggled",
2664 G_CALLBACK(on_proxy_button_toggled),
2665 "proxy_use_auth");
2666 g_signal_connect(G_OBJECT(proxy_auth), "realize",
2667 G_CALLBACK(on_proxy_button_realize),
2668 "proxy_use_auth");
2669 g_signal_connect(G_OBJECT(proxy_pass), "changed",
2670 G_CALLBACK(on_proxy_entry_changed),
2671 "proxy_pass");
2672 g_signal_connect(G_OBJECT(proxy_pass), "realize",
2673 G_CALLBACK(on_proxy_entry_realize),
2674 "proxy_pass");
2675 g_signal_connect(G_OBJECT(proxy_user), "changed",
2676 G_CALLBACK(on_proxy_entry_changed),
2677 "proxy_user");
2678 g_signal_connect(G_OBJECT(proxy_user), "realize",
2679 G_CALLBACK(on_proxy_entry_realize),
2680 "proxy_user");
2681 }
2682
2683 static void
2684 create_plugin_category(void)
2685 {
2686 GtkWidget *plugin_page_vbox;
2687 GtkWidget *plugin_notebook;
2688 GtkWidget *plugin_input_vbox;
2689 GtkWidget *alignment43;
2690 GtkWidget *input_plugin_list_label;
2691 GtkWidget *scrolledwindow3;
2692 GtkWidget *input_plugin_view;
2693 GtkWidget *input_plugin_button_box;
2694 GtkWidget *input_plugin_prefs;
2695 GtkWidget *input_plugin_info;
2696 GtkWidget *plugin_input_label;
2697 GtkWidget *plugin_general_vbox;
2698 GtkWidget *alignment45;
2699 GtkWidget *label11;
2700 GtkWidget *scrolledwindow5;
2701 GtkWidget *general_plugin_view;
2702 GtkWidget *general_plugin_button_box;
2703 GtkWidget *general_plugin_prefs;
2704 GtkWidget *general_plugin_info;
2705 GtkWidget *plugin_general_label;
2706 GtkWidget *vbox21;
2707 GtkWidget *alignment46;
2708 GtkWidget *label53;
2709 GtkWidget *scrolledwindow7;
2710 GtkWidget *vis_plugin_view;
2711 GtkWidget *hbuttonbox6;
2712 GtkWidget *vis_plugin_prefs;
2713 GtkWidget *vis_plugin_info;
2714 GtkWidget *vis_label;
2715 GtkWidget *vbox25;
2716 GtkWidget *alignment58;
2717 GtkWidget *label64;
2718 GtkWidget *scrolledwindow9;
2719 GtkWidget *effect_plugin_view;
2720 GtkWidget *hbuttonbox9;
2721 GtkWidget *effect_plugin_prefs;
2722 GtkWidget *effect_plugin_info;
2723 GtkWidget *effects_label;
2724
2725 plugin_page_vbox = gtk_vbox_new (FALSE, 0);
2726 gtk_container_add (GTK_CONTAINER (category_notebook), plugin_page_vbox);
2727
2728 plugin_notebook = gtk_notebook_new ();
2729 gtk_box_pack_start (GTK_BOX (plugin_page_vbox), plugin_notebook, TRUE, TRUE, 0);
2730 gtk_notebook_set_show_border (GTK_NOTEBOOK (plugin_notebook), FALSE);
2731
2732 plugin_input_vbox = gtk_vbox_new (FALSE, 0);
2733 gtk_container_add (GTK_CONTAINER (plugin_notebook), plugin_input_vbox);
2734 gtk_container_set_border_width (GTK_CONTAINER (plugin_input_vbox), 12);
2735
2736 alignment43 = gtk_alignment_new (0.5, 0.5, 1, 1);
2737 gtk_box_pack_start (GTK_BOX (plugin_input_vbox), alignment43, FALSE, FALSE, 4);
2738 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment43), 0, 6, 0, 0);
2739
2740 input_plugin_list_label = gtk_label_new_with_mnemonic (_("_Decoder list:"));
2741 gtk_container_add (GTK_CONTAINER (alignment43), input_plugin_list_label);
2742 gtk_label_set_use_markup (GTK_LABEL (input_plugin_list_label), TRUE);
2743 gtk_misc_set_alignment (GTK_MISC (input_plugin_list_label), 0, 0.5);
2744
2745 scrolledwindow3 = gtk_scrolled_window_new (NULL, NULL);
2746 gtk_box_pack_start (GTK_BOX (plugin_input_vbox), scrolledwindow3, TRUE, TRUE, 0);
2747 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2748 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow3), GTK_SHADOW_IN);
2749
2750 input_plugin_view = gtk_tree_view_new ();
2751 gtk_container_add (GTK_CONTAINER (scrolledwindow3), input_plugin_view);
2752 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (input_plugin_view), TRUE);
2753 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (input_plugin_view), TRUE);
2754
2755 input_plugin_button_box = gtk_hbutton_box_new ();
2756 gtk_box_pack_start (GTK_BOX (plugin_input_vbox), input_plugin_button_box, FALSE, FALSE, 8);
2757 gtk_button_box_set_layout (GTK_BUTTON_BOX (input_plugin_button_box), GTK_BUTTONBOX_START);
2758 gtk_box_set_spacing (GTK_BOX (input_plugin_button_box), 8);
2759
2760 input_plugin_prefs = gtk_button_new_from_stock ("gtk-preferences");
2761 gtk_container_add (GTK_CONTAINER (input_plugin_button_box), input_plugin_prefs);
2762 gtk_widget_set_sensitive (input_plugin_prefs, FALSE);
2763 GTK_WIDGET_SET_FLAGS (input_plugin_prefs, GTK_CAN_DEFAULT);
2764
2765 input_plugin_info = gtk_button_new_from_stock ("gtk-dialog-info");
2766 gtk_container_add (GTK_CONTAINER (input_plugin_button_box), input_plugin_info);
2767 gtk_widget_set_sensitive (input_plugin_info, FALSE);
2768 GTK_WIDGET_SET_FLAGS (input_plugin_info, GTK_CAN_DEFAULT);
2769
2770 plugin_input_label = gtk_label_new (_("<span size=\"medium\"><b>Decoders</b></span>"));
2771 gtk_notebook_set_tab_label (GTK_NOTEBOOK (plugin_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (plugin_notebook), 0), plugin_input_label);
2772 gtk_label_set_use_markup (GTK_LABEL (plugin_input_label), TRUE);
2773 gtk_misc_set_alignment (GTK_MISC (plugin_input_label), 0, 0);
2774
2775 plugin_general_vbox = gtk_vbox_new (FALSE, 0);
2776 gtk_container_add (GTK_CONTAINER (plugin_notebook), plugin_general_vbox);
2777 gtk_container_set_border_width (GTK_CONTAINER (plugin_general_vbox), 12);
2778
2779 alignment45 = gtk_alignment_new (0.5, 0.5, 1, 1);
2780 gtk_box_pack_start (GTK_BOX (plugin_general_vbox), alignment45, FALSE, FALSE, 4);
2781 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment45), 0, 6, 0, 0);
2782
2783 label11 = gtk_label_new_with_mnemonic (_("_General plugin list:"));
2784 gtk_container_add (GTK_CONTAINER (alignment45), label11);
2785 gtk_label_set_use_markup (GTK_LABEL (label11), TRUE);
2786 gtk_misc_set_alignment (GTK_MISC (label11), 0, 0.5);
2787
2788 scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL);
2789 gtk_box_pack_start (GTK_BOX (plugin_general_vbox), scrolledwindow5, TRUE, TRUE, 0);
2790 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2791 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_SHADOW_IN);
2792
2793 general_plugin_view = gtk_tree_view_new ();
2794 gtk_container_add (GTK_CONTAINER (scrolledwindow5), general_plugin_view);
2795 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (general_plugin_view), TRUE);
2796 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (general_plugin_view), TRUE);
2797
2798 general_plugin_button_box = gtk_hbutton_box_new ();
2799 gtk_box_pack_start (GTK_BOX (plugin_general_vbox), general_plugin_button_box, FALSE, FALSE, 8);
2800 gtk_button_box_set_layout (GTK_BUTTON_BOX (general_plugin_button_box), GTK_BUTTONBOX_START);
2801 gtk_box_set_spacing (GTK_BOX (general_plugin_button_box), 8);
2802
2803 general_plugin_prefs = gtk_button_new_from_stock ("gtk-preferences");
2804 gtk_container_add (GTK_CONTAINER (general_plugin_button_box), general_plugin_prefs);
2805 gtk_widget_set_sensitive (general_plugin_prefs, FALSE);
2806 GTK_WIDGET_SET_FLAGS (general_plugin_prefs, GTK_CAN_DEFAULT);
2807
2808 general_plugin_info = gtk_button_new_from_stock ("gtk-dialog-info");
2809 gtk_container_add (GTK_CONTAINER (general_plugin_button_box), general_plugin_info);
2810 gtk_widget_set_sensitive (general_plugin_info, FALSE);
2811 GTK_WIDGET_SET_FLAGS (general_plugin_info, GTK_CAN_DEFAULT);
2812
2813 plugin_general_label = gtk_label_new (_("<span size=\"medium\"><b>General</b></span>"));
2814 gtk_notebook_set_tab_label (GTK_NOTEBOOK (plugin_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (plugin_notebook), 1), plugin_general_label);
2815 gtk_label_set_use_markup (GTK_LABEL (plugin_general_label), TRUE);
2816
2817 vbox21 = gtk_vbox_new (FALSE, 0);
2818 gtk_container_add (GTK_CONTAINER (plugin_notebook), vbox21);
2819 gtk_container_set_border_width (GTK_CONTAINER (vbox21), 12);
2820
2821 alignment46 = gtk_alignment_new (0.5, 0.5, 1, 1);
2822 gtk_box_pack_start (GTK_BOX (vbox21), alignment46, FALSE, FALSE, 4);
2823 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment46), 0, 6, 0, 0);
2824
2825 label53 = gtk_label_new_with_mnemonic (_("_Visualization plugin list:"));
2826 gtk_container_add (GTK_CONTAINER (alignment46), label53);
2827 gtk_label_set_use_markup (GTK_LABEL (label53), TRUE);
2828 gtk_misc_set_alignment (GTK_MISC (label53), 0, 0.5);
2829
2830 scrolledwindow7 = gtk_scrolled_window_new (NULL, NULL);
2831 gtk_box_pack_start (GTK_BOX (vbox21), scrolledwindow7, TRUE, TRUE, 0);
2832 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow7), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2833 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow7), GTK_SHADOW_IN);
2834
2835 vis_plugin_view = gtk_tree_view_new ();
2836 gtk_container_add (GTK_CONTAINER (scrolledwindow7), vis_plugin_view);
2837 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (vis_plugin_view), TRUE);
2838 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (vis_plugin_view), TRUE);
2839
2840 hbuttonbox6 = gtk_hbutton_box_new ();
2841 gtk_box_pack_start (GTK_BOX (vbox21), hbuttonbox6, FALSE, FALSE, 8);
2842 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox6), GTK_BUTTONBOX_START);
2843 gtk_box_set_spacing (GTK_BOX (hbuttonbox6), 8);
2844
2845 vis_plugin_prefs = gtk_button_new_from_stock ("gtk-preferences");
2846 gtk_container_add (GTK_CONTAINER (hbuttonbox6), vis_plugin_prefs);
2847 gtk_widget_set_sensitive (vis_plugin_prefs, FALSE);
2848 GTK_WIDGET_SET_FLAGS (vis_plugin_prefs, GTK_CAN_DEFAULT);
2849
2850 vis_plugin_info = gtk_button_new_from_stock ("gtk-dialog-info");
2851 gtk_container_add (GTK_CONTAINER (hbuttonbox6), vis_plugin_info);
2852 gtk_widget_set_sensitive (vis_plugin_info, FALSE);
2853 GTK_WIDGET_SET_FLAGS (vis_plugin_info, GTK_CAN_DEFAULT);
2854
2855 vis_label = gtk_label_new (_("<b>Visualization</b>"));
2856 gtk_notebook_set_tab_label (GTK_NOTEBOOK (plugin_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (plugin_notebook), 2), vis_label);
2857 gtk_label_set_use_markup (GTK_LABEL (vis_label), TRUE);
2858
2859 vbox25 = gtk_vbox_new (FALSE, 0);
2860 gtk_container_add (GTK_CONTAINER (plugin_notebook), vbox25);
2861 gtk_container_set_border_width (GTK_CONTAINER (vbox25), 12);
2862
2863 alignment58 = gtk_alignment_new (0.5, 0.5, 1, 1);
2864 gtk_box_pack_start (GTK_BOX (vbox25), alignment58, FALSE, FALSE, 4);
2865 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment58), 0, 6, 0, 0);
2866
2867 label64 = gtk_label_new_with_mnemonic (_("_Effect plugin list:"));
2868 gtk_container_add (GTK_CONTAINER (alignment58), label64);
2869 gtk_label_set_use_markup (GTK_LABEL (label64), TRUE);
2870 gtk_misc_set_alignment (GTK_MISC (label64), 0, 0.5);
2871
2872 scrolledwindow9 = gtk_scrolled_window_new (NULL, NULL);
2873 gtk_box_pack_start (GTK_BOX (vbox25), scrolledwindow9, TRUE, TRUE, 0);
2874 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow9), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2875 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow9), GTK_SHADOW_IN);
2876
2877 effect_plugin_view = gtk_tree_view_new ();
2878 gtk_container_add (GTK_CONTAINER (scrolledwindow9), effect_plugin_view);
2879 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (effect_plugin_view), TRUE);
2880 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (effect_plugin_view), TRUE);
2881
2882 hbuttonbox9 = gtk_hbutton_box_new ();
2883 gtk_box_pack_start (GTK_BOX (vbox25), hbuttonbox9, FALSE, FALSE, 8);
2884 gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox9), GTK_BUTTONBOX_START);
2885 gtk_box_set_spacing (GTK_BOX (hbuttonbox9), 8);
2886
2887 effect_plugin_prefs = gtk_button_new_from_stock ("gtk-preferences");
2888 gtk_container_add (GTK_CONTAINER (hbuttonbox9), effect_plugin_prefs);
2889 gtk_widget_set_sensitive (effect_plugin_prefs, FALSE);
2890 GTK_WIDGET_SET_FLAGS (effect_plugin_prefs, GTK_CAN_DEFAULT);
2891
2892 effect_plugin_info = gtk_button_new_from_stock ("gtk-dialog-info");
2893 gtk_container_add (GTK_CONTAINER (hbuttonbox9), effect_plugin_info);
2894 gtk_widget_set_sensitive (effect_plugin_info, FALSE);
2895 GTK_WIDGET_SET_FLAGS (effect_plugin_info, GTK_CAN_DEFAULT);
2896
2897 effects_label = gtk_label_new (_("<b>Effects</b>"));
2898 gtk_notebook_set_tab_label (GTK_NOTEBOOK (plugin_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (plugin_notebook), 3), effects_label);
2899 gtk_label_set_use_markup (GTK_LABEL (effects_label), TRUE);
2900
2901
2902
2903 gtk_label_set_mnemonic_widget (GTK_LABEL (input_plugin_list_label), category_notebook);
2904 gtk_label_set_mnemonic_widget (GTK_LABEL (label11), category_notebook);
2905 gtk_label_set_mnemonic_widget (GTK_LABEL (label53), category_notebook);
2906 gtk_label_set_mnemonic_widget (GTK_LABEL (label64), category_notebook);
2907
2908
2909
2910 g_signal_connect_after(G_OBJECT(input_plugin_view), "realize",
2911 G_CALLBACK(on_input_plugin_view_realize),
2912 NULL);
2913 g_signal_connect_after(G_OBJECT(general_plugin_view), "realize",
2914 G_CALLBACK(on_general_plugin_view_realize),
2915 NULL);
2916 g_signal_connect_after(G_OBJECT(vis_plugin_view), "realize",
2917 G_CALLBACK(on_vis_plugin_view_realize),
2918 NULL);
2919 g_signal_connect_after(G_OBJECT(effect_plugin_view), "realize",
2920 G_CALLBACK(on_effect_plugin_view_realize),
2921 NULL);
2922
2923
2924
2925 /* plugin->input page */
2926 g_object_set_data(G_OBJECT(input_plugin_view), "plugin_type" , GINT_TO_POINTER(PLUGIN_VIEW_TYPE_INPUT));
2927 g_signal_connect(G_OBJECT(input_plugin_view), "row-activated",
2928 G_CALLBACK(plugin_treeview_open_prefs),
2929 NULL);
2930 g_signal_connect(G_OBJECT(input_plugin_view), "cursor-changed",
2931 G_CALLBACK(plugin_treeview_enable_prefs),
2932 input_plugin_prefs);
2933
2934 g_signal_connect_swapped(G_OBJECT(input_plugin_prefs), "clicked",
2935 G_CALLBACK(plugin_treeview_open_prefs),
2936 input_plugin_view);
2937
2938 g_signal_connect(G_OBJECT(input_plugin_view), "cursor-changed",
2939 G_CALLBACK(plugin_treeview_enable_info),
2940 input_plugin_info);
2941 g_signal_connect_swapped(G_OBJECT(input_plugin_info), "clicked",
2942 G_CALLBACK(plugin_treeview_open_info),
2943 input_plugin_view);
2944
2945
2946 /* plugin->general page */
2947
2948 g_object_set_data(G_OBJECT(general_plugin_view), "plugin_type" , GINT_TO_POINTER(PLUGIN_VIEW_TYPE_GENERAL));
2949 g_signal_connect(G_OBJECT(general_plugin_view), "row-activated",
2950 G_CALLBACK(plugin_treeview_open_prefs),
2951 NULL);
2952
2953 g_signal_connect(G_OBJECT(general_plugin_view), "cursor-changed",
2954 G_CALLBACK(plugin_treeview_enable_prefs),
2955 general_plugin_prefs);
2956
2957 g_signal_connect_swapped(G_OBJECT(general_plugin_prefs), "clicked",
2958 G_CALLBACK(plugin_treeview_open_prefs),
2959 general_plugin_view);
2960
2961 g_signal_connect(G_OBJECT(general_plugin_view), "cursor-changed",
2962 G_CALLBACK(plugin_treeview_enable_info),
2963 general_plugin_info);
2964 g_signal_connect_swapped(G_OBJECT(general_plugin_info), "clicked",
2965 G_CALLBACK(plugin_treeview_open_info),
2966 general_plugin_view);
2967
2968
2969 /* plugin->vis page */
2970
2971 g_object_set_data(G_OBJECT(vis_plugin_view), "plugin_type" , GINT_TO_POINTER(PLUGIN_VIEW_TYPE_VIS));
2972 g_signal_connect(G_OBJECT(vis_plugin_view), "row-activated",
2973 G_CALLBACK(plugin_treeview_open_prefs),
2974 NULL);
2975 g_signal_connect_swapped(G_OBJECT(vis_plugin_prefs), "clicked",
2976 G_CALLBACK(plugin_treeview_open_prefs),
2977 vis_plugin_view);
2978 g_signal_connect(G_OBJECT(vis_plugin_view), "cursor-changed",
2979 G_CALLBACK(plugin_treeview_enable_prefs), vis_plugin_prefs);
2980
2981 g_signal_connect(G_OBJECT(vis_plugin_view), "cursor-changed",
2982 G_CALLBACK(plugin_treeview_enable_info), vis_plugin_info);
2983 g_signal_connect_swapped(G_OBJECT(vis_plugin_info), "clicked",
2984 G_CALLBACK(plugin_treeview_open_info),
2985 vis_plugin_view);
2986
2987
2988 /* plugin->effects page */
2989
2990 g_object_set_data(G_OBJECT(effect_plugin_view), "plugin_type" , GINT_TO_POINTER(PLUGIN_VIEW_TYPE_EFFECT));
2991 g_signal_connect(G_OBJECT(effect_plugin_view), "row-activated",
2992 G_CALLBACK(plugin_treeview_open_prefs),
2993 NULL);
2994 g_signal_connect_swapped(G_OBJECT(effect_plugin_prefs), "clicked",
2995 G_CALLBACK(plugin_treeview_open_prefs),
2996 effect_plugin_view);
2997 g_signal_connect(G_OBJECT(effect_plugin_view), "cursor-changed",
2998 G_CALLBACK(plugin_treeview_enable_prefs), effect_plugin_prefs);
2999
3000 g_signal_connect(G_OBJECT(effect_plugin_view), "cursor-changed",
3001 G_CALLBACK(plugin_treeview_enable_info), effect_plugin_info);
3002 g_signal_connect_swapped(G_OBJECT(effect_plugin_info), "clicked",
3003 G_CALLBACK(plugin_treeview_open_info),
3004 effect_plugin_view);
3005
3006 }
3007
3008 void
3009 create_prefs_window(void)
3010 {
3011 gchar *aud_version_string;
3012
3013 GtkWidget *vbox;
3014 GtkWidget *hbox1;
3015 GtkWidget *scrolledwindow6;
3016 GtkWidget *hseparator1;
3017 GtkWidget *hbox4;
3018 GtkWidget *audversionlabel;
3019 GtkWidget *prefswin_button_box;
3020 GtkWidget *hbox11;
3021 GtkWidget *image10;
3022 GtkWidget *close;
3023 GtkAccelGroup *accel_group;
3024
3025 tooltips = gtk_tooltips_new ();
3026
3027 accel_group = gtk_accel_group_new ();
3028
3029 prefswin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3030 gtk_container_set_border_width (GTK_CONTAINER (prefswin), 12);
3031 gtk_window_set_title (GTK_WINDOW (prefswin), _("Audacious Preferences"));
3032 gtk_window_set_position (GTK_WINDOW (prefswin), GTK_WIN_POS_CENTER);
3033 gtk_window_set_default_size (GTK_WINDOW (prefswin), 680, 400);
3034
3035 vbox = gtk_vbox_new (FALSE, 0);
3036 gtk_container_add (GTK_CONTAINER (prefswin), vbox);
3037
3038 hbox1 = gtk_hbox_new (FALSE, 8);
3039 gtk_box_pack_start (GTK_BOX (vbox), hbox1, TRUE, TRUE, 0);
3040
3041 scrolledwindow6 = gtk_scrolled_window_new (NULL, NULL);
3042 gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow6, TRUE, TRUE, 0);
3043 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow6), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
3044 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow6), GTK_SHADOW_IN);
3045
3046 category_treeview = gtk_tree_view_new ();
3047 gtk_container_add (GTK_CONTAINER (scrolledwindow6), category_treeview);
3048 gtk_widget_set_size_request (category_treeview, 172, -1);
3049 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (category_treeview), FALSE);
3050
3051 category_notebook = gtk_notebook_new ();
3052 gtk_box_pack_start (GTK_BOX (hbox1), category_notebook, TRUE, TRUE, 0);
3053 GTK_WIDGET_UNSET_FLAGS (category_notebook, GTK_CAN_FOCUS);
3054 gtk_notebook_set_show_tabs (GTK_NOTEBOOK (category_notebook), FALSE);
3055 gtk_notebook_set_show_border (GTK_NOTEBOOK (category_notebook), FALSE);
3056 gtk_notebook_set_scrollable (GTK_NOTEBOOK (category_notebook), TRUE);
3057
3058
3059
3060
3061 create_appearence_category();
3062 create_audio_category();
3063 create_replay_gain_category();
3064 create_connectivity_category();
3065 create_mouse_category();
3066 create_playback_category();
3067 create_playlist_category();
3068 create_plugin_category();
3069
3070
3071
3072
3073 hseparator1 = gtk_hseparator_new ();
3074 gtk_box_pack_start (GTK_BOX (vbox), hseparator1, FALSE, FALSE, 6);
3075
3076 hbox4 = gtk_hbox_new (FALSE, 0);
3077 gtk_box_pack_start (GTK_BOX (vbox), hbox4, FALSE, FALSE, 0);
3078
3079 audversionlabel = gtk_label_new ("");
3080 gtk_box_pack_start (GTK_BOX (hbox4), audversionlabel, FALSE, FALSE, 0);
3081 gtk_label_set_use_markup (GTK_LABEL (audversionlabel), TRUE);
3082
3083 prefswin_button_box = gtk_hbutton_box_new ();
3084 gtk_box_pack_start (GTK_BOX (hbox4), prefswin_button_box, TRUE, TRUE, 0);
3085 gtk_button_box_set_layout (GTK_BUTTON_BOX (prefswin_button_box), GTK_BUTTONBOX_END);
3086 gtk_box_set_spacing (GTK_BOX (prefswin_button_box), 6);
3087
3088 hbox11 = gtk_hbox_new (FALSE, 2);
3089
3090 image10 = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_BUTTON);
3091 gtk_box_pack_start (GTK_BOX (hbox11), image10, FALSE, FALSE, 0);
3092
3093 close = gtk_button_new_from_stock ("gtk-close");
3094 gtk_container_add (GTK_CONTAINER (prefswin_button_box), close);
3095 GTK_WIDGET_SET_FLAGS (close, GTK_CAN_DEFAULT);
3096 gtk_widget_add_accelerator (close, "clicked", accel_group,
3097 GDK_Escape, (GdkModifierType) 0,
3098 GTK_ACCEL_VISIBLE);
3099
3100
3101 gtk_window_add_accel_group (GTK_WINDOW (prefswin), accel_group);
3102
3103 /* connect signals */
3104 g_signal_connect(G_OBJECT(prefswin), "delete_event",
3105 G_CALLBACK(gtk_widget_hide_on_delete),
3106 NULL);
3107 g_signal_connect_swapped(G_OBJECT(skin_refresh_button), "clicked",
3108 G_CALLBACK(on_skin_refresh_button_clicked),
3109 prefswin);
3110 g_signal_connect_after(G_OBJECT(skin_view), "realize",
3111 G_CALLBACK(on_skin_view_realize),
3112 NULL);
3113 g_signal_connect_swapped(G_OBJECT(close), "clicked",
3114 G_CALLBACK(gtk_widget_hide),
3115 GTK_OBJECT (prefswin));
3116
3117 /* create category view */
3118 g_signal_connect_after(G_OBJECT(category_treeview), "realize",
3119 G_CALLBACK(on_category_treeview_realize),
3120 category_notebook);
3121
3122
3123 /* audacious version label */
3124
3125 aud_version_string = g_strdup_printf("<span size='small'>%s (%s) (%s@%s)</span>",
3126 "Audacious " PACKAGE_VERSION ,
3127 svn_stamp ,
3128 g_get_user_name() , g_get_host_name() );
3129
3130 gtk_label_set_markup( GTK_LABEL(audversionlabel) , aud_version_string );
3131 g_free(aud_version_string);
3132 gtk_widget_show_all(vbox);
3133 }
3134
3135 void
3136 show_prefs_window(void)
3137 {
3138 static gboolean skinlist_filled = FALSE;
3139
3140 gtk_window_present(GTK_WINDOW(prefswin)); /* show or raise prefs window */
3141
3142 if ( !skinlist_filled )
3143 {
3144 skin_view_update(GTK_TREE_VIEW(skin_view), GTK_WIDGET(skin_refresh_button));
3145 skinlist_filled = TRUE;
3146 }
3147 }
3148
3149 void
3150 hide_prefs_window(void)
3151 {
3152 g_return_if_fail(prefswin);
3153 gtk_widget_hide(GTK_WIDGET(prefswin));
3154 }
3155
3156 static void
3157 prefswin_page_queue_new(GtkWidget *container, gchar *name, gchar *imgurl)
3158 {
3159 CategoryQueueEntry *ent = g_malloc0(sizeof(CategoryQueueEntry));
3160
3161 ent->container = container;
3162 ent->pg_name = name;
3163 ent->img_url = imgurl;
3164
3165 if (category_queue)
3166 ent->next = category_queue;
3167
3168 category_queue = ent;
3169 }
3170
3171 static void
3172 prefswin_page_queue_destroy(CategoryQueueEntry *ent)
3173 {
3174 category_queue = ent->next;
3175 g_free(ent);
3176 }
3177
3178 /*
3179 * Public APIs for adding new pages to the prefs window.
3180 *
3181 * Basically, the concept here is that third party components can register themselves in the root
3182 * preferences window.
3183 *
3184 * From a usability standpoint this makes the application look more "united", instead of cluttered
3185 * and malorganised. Hopefully this option will be used further in the future.
3186 *
3187 * - nenolod
3188 */
3189 gint
3190 prefswin_page_new(GtkWidget *container, gchar *name, gchar *imgurl)
3191 {
3192 GtkTreeModel *model;
3193 GtkTreeIter iter;
3194 GdkPixbuf *img = NULL;
3195 GtkTreeView *treeview = GTK_TREE_VIEW(category_treeview);
3196 gint id;
3197
3198 if (treeview == NULL || category_notebook == NULL)
3199 {
3200 prefswin_page_queue_new(container, name, imgurl);
3201 return -1;
3202 }
3203
3204 model = gtk_tree_view_get_model(treeview);
3205
3206 if (model == NULL)
3207 {
3208 prefswin_page_queue_new(container, name, imgurl);
3209 return -1;
3210 }
3211
3212 /* Make sure the widgets are visible. */
3213 gtk_widget_show(container);
3214 id = gtk_notebook_append_page(GTK_NOTEBOOK(category_notebook), container, NULL);
3215
3216 if (id == -1)
3217 return -1;
3218
3219 if (imgurl != NULL)
3220 img = gdk_pixbuf_new_from_file(imgurl, NULL);
3221
3222 gtk_list_store_append(GTK_LIST_STORE(model), &iter);
3223 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
3224 CATEGORY_VIEW_COL_ICON, img,
3225 CATEGORY_VIEW_COL_NAME,
3226 name, CATEGORY_VIEW_COL_ID, id, -1);
3227
3228 if (img != NULL)
3229 g_object_unref(img);
3230
3231 return id;
3232 }
3233
3234 void
3235 prefswin_page_destroy(GtkWidget *container)
3236 {
3237 GtkTreeModel *model;
3238 GtkTreeIter iter;
3239 GtkTreeView *treeview = GTK_TREE_VIEW(category_treeview);
3240 gboolean ret;
3241 gint id;
3242 gint index = -1;
3243
3244 if (category_notebook == NULL || treeview == NULL || container == NULL)
3245 return;
3246
3247 id = gtk_notebook_page_num(GTK_NOTEBOOK(category_notebook), container);
3248
3249 if (id == -1)
3250 return;
3251
3252 gtk_notebook_remove_page(GTK_NOTEBOOK(category_notebook), id);
3253
3254 model = gtk_tree_view_get_model(treeview);
3255
3256 if (model == NULL)
3257 return;
3258
3259 ret = gtk_tree_model_get_iter_first(model, &iter);
3260
3261 while (ret == TRUE)
3262 {
3263 gtk_tree_model_get(model, &iter, CATEGORY_VIEW_COL_ID, &index, -1);
3264
3265 if (index == id)
3266 {
3267 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
3268 ret = gtk_tree_model_get_iter_first(model, &iter);
3269 }
3270
3271 if (index > id)
3272 {
3273 index--;
3274 gtk_list_store_set(GTK_LIST_STORE(model), &iter, CATEGORY_VIEW_COL_ID, index, -1);
3275 }
3276
3277 ret = gtk_tree_model_iter_next(model, &iter);
3278 }
3279 }