7 * This software is released under the GNU General Public License (GNU GPL).
8 * Please read the included file COPYING for more information.
9 * This software comes with no warranty of any kind, use at your own risk!
14 #include "preferences.h"
16 #include "cache_maint.h"
19 #include "fullscreen.h"
21 #include "layout_config.h"
22 #include "layout_util.h"
23 #include "pixbuf_util.h"
24 #include "slideshow.h"
26 #include "ui_fileops.h"
28 #include "ui_tabcomp.h"
29 #include "ui_utildlg.h"
31 #include "icons/config.xpm"
36 #define EDITOR_NAME_MAX_LENGTH 32
37 #define EDITOR_COMMAND_MAX_LENGTH 1024
40 typedef struct _ThumbSize ThumbSize;
47 static ThumbSize thumb_size_list[] =
71 /* config memory values */
72 static gint startup_path_enable_c;
73 static gint confirm_delete_c;
74 static gint enable_delete_key_c;
75 static gint safe_delete_enable_c;
76 static gint safe_delete_size_c;
77 static gint restore_tool_c;
78 static gint save_window_positions_c;
79 static gint zoom_mode_c;
80 static gint two_pass_zoom_c;
81 static gint fit_window_c;
82 static gint limit_window_size_c;
83 static gint zoom_to_fit_expands_c;
84 static gint max_window_size_c;
85 static gint progressive_key_scrolling_c;
86 static gint thumb_max_width_c;
87 static gint thumb_max_height_c;
88 static gint enable_thumb_caching_c;
89 static gint enable_thumb_dirs_c;
90 static gint use_xvpics_thumbnails_c;
91 static gint thumbnail_spec_standard_c;
92 static gint enable_metadata_dirs_c;
93 static gint show_dot_files_c;
94 static gint file_filter_disable_c;
95 static gint file_sort_case_sensitive_c;
96 static gint slideshow_delay_c;
97 static gint slideshow_random_c;
98 static gint slideshow_repeat_c;
100 static gint mousewheel_scrolls_c;
102 static gint enable_in_place_rename_c;
104 static gint collection_rectangular_selection_c;
106 static gint tile_cache_max_c;
108 static gint thumbnail_quality_c;
109 static gint zoom_quality_c;
111 static gint zoom_increment_c;
113 static gint enable_read_ahead_c;
115 static gint black_window_background_c;
117 static gint fullscreen_screen_c;
118 static gint fullscreen_clean_flip_c;
119 static gint fullscreen_disable_saver_c;
120 static gint fullscreen_above_c;
122 static gint dupe_custom_threshold_c;
124 static GtkWidget *configwindow = NULL;
125 static GtkWidget *startup_path_entry;
126 static GtkListStore *filter_store = NULL;
127 static GtkWidget *editor_name_entry[GQVIEW_EDITOR_SLOTS];
128 static GtkWidget *editor_command_entry[GQVIEW_EDITOR_SLOTS];
130 static GtkWidget *layout_widget;
132 static GtkWidget *safe_delete_path_entry;
134 static gint tree_descend_subdirs_c;
136 static gint update_on_time_change_c;
137 static gint exif_rotate_enable_c;
141 *-----------------------------------------------------------------------------
142 * option widget callbacks (private)
143 *-----------------------------------------------------------------------------
146 static void startup_path_set_current(GtkWidget *widget, gpointer data)
148 gtk_entry_set_text(GTK_ENTRY(startup_path_entry), layout_get_path(NULL));
151 static void zoom_mode_original_cb(GtkWidget *widget, gpointer data)
153 if (GTK_TOGGLE_BUTTON (widget)->active)
154 zoom_mode_c = ZOOM_RESET_ORIGINAL;
157 static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data)
159 if (GTK_TOGGLE_BUTTON (widget)->active)
160 zoom_mode_c = ZOOM_RESET_FIT_WINDOW;
163 static void zoom_mode_none_cb(GtkWidget *widget, gpointer data)
165 if (GTK_TOGGLE_BUTTON (widget)->active)
166 zoom_mode_c = ZOOM_RESET_NONE;
169 static void zoom_increment_cb(GtkWidget *spin, gpointer data)
171 zoom_increment_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 10.0 + 0.01);
174 static void slideshow_delay_cb(GtkWidget *spin, gpointer data)
176 slideshow_delay_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
177 (double)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
181 *-----------------------------------------------------------------------------
182 * sync progam to config window routine (private)
183 *-----------------------------------------------------------------------------
186 static void config_window_apply(void)
192 gint refresh = FALSE;
194 for(i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
196 g_free(editor_name[i]);
197 editor_name[i] = NULL;
198 buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i]));
199 if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf);
201 g_free(editor_command[i]);
202 editor_command[i] = NULL;
203 buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i]));
204 if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf);
206 layout_edit_update_all();
208 g_free(startup_path);
210 buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry));
211 if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf);
213 g_free(safe_delete_path);
214 safe_delete_path = NULL;
215 buf = gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry));
216 if (buf && strlen(buf) > 0) safe_delete_path = remove_trailing_slash(buf);
218 if (show_dot_files != show_dot_files_c) refresh = TRUE;
219 if (file_sort_case_sensitive != file_sort_case_sensitive_c) refresh = TRUE;
220 if (file_filter_disable != file_filter_disable_c) refresh = TRUE;
222 startup_path_enable = startup_path_enable_c;
223 confirm_delete = confirm_delete_c;
224 enable_delete_key = enable_delete_key_c;
225 safe_delete_enable = safe_delete_enable_c;
226 safe_delete_size = safe_delete_size_c;
227 restore_tool = restore_tool_c;
228 save_window_positions = save_window_positions_c;
229 zoom_mode = zoom_mode_c;
230 two_pass_zoom = two_pass_zoom_c;
231 fit_window = fit_window_c;
232 limit_window_size = limit_window_size_c;
233 zoom_to_fit_expands = zoom_to_fit_expands_c;
234 max_window_size = max_window_size_c;
235 progressive_key_scrolling = progressive_key_scrolling_c;
236 thumb_max_width = thumb_max_width_c;
237 thumb_max_height = thumb_max_height_c;
238 enable_thumb_caching = enable_thumb_caching_c;
239 enable_thumb_dirs = enable_thumb_dirs_c;
240 use_xvpics_thumbnails = use_xvpics_thumbnails_c;
241 thumbnail_spec_standard = thumbnail_spec_standard_c;
242 enable_metadata_dirs = enable_metadata_dirs_c;
243 show_dot_files = show_dot_files_c;
244 file_sort_case_sensitive = file_sort_case_sensitive_c;
245 file_filter_disable = file_filter_disable_c;
247 slideshow_random = slideshow_random_c;
248 slideshow_repeat = slideshow_repeat_c;
249 slideshow_delay = slideshow_delay_c;
251 mousewheel_scrolls = mousewheel_scrolls_c;
253 enable_in_place_rename = enable_in_place_rename_c;
255 collection_rectangular_selection = collection_rectangular_selection_c;
257 tile_cache_max = tile_cache_max_c;
259 thumbnail_quality = thumbnail_quality_c;
260 zoom_quality = zoom_quality_c;
262 zoom_increment = zoom_increment_c;
264 enable_read_ahead = enable_read_ahead_c;
266 if (black_window_background != black_window_background_c)
268 black_window_background = black_window_background_c;
270 layout_colors_update();
271 view_window_colors_update();
274 fullscreen_screen = fullscreen_screen_c;
275 fullscreen_clean_flip = fullscreen_clean_flip_c;
276 fullscreen_disable_saver = fullscreen_disable_saver_c;
277 fullscreen_above = fullscreen_above_c;
279 update_on_time_change = update_on_time_change_c;
280 exif_rotate_enable = exif_rotate_enable_c;
282 dupe_custom_threshold = dupe_custom_threshold_c;
284 tree_descend_subdirs = tree_descend_subdirs_c;
286 l_conf = layout_config_get(layout_widget, &new_style);
288 if (new_style != layout_style ||
289 (l_conf == NULL) != (layout_order == NULL) ||
291 strcmp(buf, layout_order) != 0)
293 if (refresh) filter_rebuild();
296 g_free(layout_order);
297 layout_order = l_conf;
300 layout_style = new_style;
302 layout_styles_update();
310 layout_refresh(NULL);
315 *-----------------------------------------------------------------------------
316 * config window main button callbacks (private)
317 *-----------------------------------------------------------------------------
320 static void config_window_close_cb(GtkWidget *widget, gpointer data)
322 gtk_widget_destroy(configwindow);
327 static gint config_window_delete(GtkWidget *w, GdkEventAny *event, gpointer data)
329 config_window_close_cb(NULL, NULL);
333 static void config_window_ok_cb(GtkWidget *widget, gpointer data)
335 config_window_apply();
336 config_window_close_cb(NULL, NULL);
339 static void config_window_apply_cb(GtkWidget *widget, gpointer data)
341 config_window_apply();
345 *-----------------------------------------------------------------------------
346 * config window setup (private)
347 *-----------------------------------------------------------------------------
350 static void quality_menu_cb(GtkWidget *combo, gpointer data)
354 switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
358 *option = GDK_INTERP_NEAREST;
361 *option = GDK_INTERP_TILES;
364 *option = GDK_INTERP_BILINEAR;
367 *option = GDK_INTERP_HYPER;
372 static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
373 gint option, gint *option_c)
380 pref_table_label(table, column, row, text, 0.0);
382 combo = gtk_combo_box_new_text();
384 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Nearest (worst, but fastest)"));
385 if (option == GDK_INTERP_NEAREST) current = 0;
386 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Tiles"));
387 if (option == GDK_INTERP_TILES) current = 1;
388 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Bilinear"));
389 if (option == GDK_INTERP_BILINEAR) current = 2;
390 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Hyper (best, but slowest)"));
391 if (option == GDK_INTERP_HYPER) current = 3;
393 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
395 g_signal_connect(G_OBJECT(combo), "changed",
396 G_CALLBACK(quality_menu_cb), option_c);
398 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
399 GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
400 gtk_widget_show(combo);
404 static void add_dither_menu(gint option, gint *option_c, gchar *text, GtkWidget *box)
412 hbox = pref_box_new(box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
413 pref_label_new(hbox, text);
415 omenu = gtk_option_menu_new();
416 menu = gtk_menu_new();
418 add_menu_item(menu, _("None"), option_c, (gint)GDK_RGB_DITHER_NONE);
419 add_menu_item(menu, _("Normal"), option_c, (gint)GDK_RGB_DITHER_NORMAL);
420 add_menu_item(menu, _("Best"), option_c, (gint)GDK_RGB_DITHER_MAX);
422 gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu);
423 gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), *option_c);
425 gtk_box_pack_start(GTK_BOX(hbox), omenu, FALSE, FALSE, 0);
426 gtk_widget_show(omenu);
430 static void thumb_size_menu_cb(GtkWidget *combo, gpointer data)
434 n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
436 if (n >= 0 && n < sizeof(thumb_size_list) / sizeof(ThumbSize))
438 thumb_max_width_c = thumb_size_list[n].w;
439 thumb_max_height_c = thumb_size_list[n].h;
443 thumb_max_width_c = thumb_max_width;
444 thumb_max_height_c = thumb_max_height;
448 static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *text)
456 thumb_max_width_c = thumb_max_width;
457 thumb_max_height_c = thumb_max_height;
459 pref_table_label(table, column, row, text, 0.0);
461 combo = gtk_combo_box_new_text();
471 w = thumb_size_list[i].w;
472 h = thumb_size_list[i].h;
478 buf = g_strdup_printf("%d x %d", w, h);
479 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
482 if (w == thumb_max_width && h == thumb_max_height) current = i;
498 buf = g_strdup_printf("%s %d x %d", _("Custom"), thumb_max_width, thumb_max_height);
499 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
505 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
506 g_signal_connect(G_OBJECT(combo), "changed",
507 G_CALLBACK(thumb_size_menu_cb), NULL);
509 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
510 GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
511 gtk_widget_show(combo);
514 static void filter_store_populate(void)
518 if (!filter_store) return;
520 gtk_list_store_clear(filter_store);
522 work = filter_get_list();
531 gtk_list_store_append(filter_store, &iter);
532 gtk_list_store_set(filter_store, &iter, 0, fe, -1);
536 static void filter_store_ext_edit_cb(GtkCellRendererText *cell, gchar *path_str,
537 gchar *new_text, gpointer data)
539 GtkWidget *model = data;
540 FilterEntry *fe = data;
544 if (!new_text || strlen(new_text) < 1) return;
546 tpath = gtk_tree_path_new_from_string(path_str);
547 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
548 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
550 g_free(fe->extensions);
551 fe->extensions = g_strdup(new_text);
553 gtk_tree_path_free(tpath);
557 static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str,
558 gchar *new_text, gpointer data)
560 GtkWidget *model = data;
565 if (!new_text || strlen(new_text) < 1) return;
567 tpath = gtk_tree_path_new_from_string(path_str);
568 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
569 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
571 g_free(fe->description);
572 fe->description = g_strdup(new_text);
574 gtk_tree_path_free(tpath);
577 static void filter_store_enable_cb(GtkCellRendererToggle *renderer,
578 gchar *path_str, gpointer data)
580 GtkWidget *model = data;
585 tpath = gtk_tree_path_new_from_string(path_str);
586 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
587 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
589 fe->enabled = !fe->enabled;
591 gtk_tree_path_free(tpath);
595 static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
596 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
600 gtk_tree_model_get(tree_model, iter, 0, &fe, -1);
602 switch(GPOINTER_TO_INT(data))
605 g_object_set(GTK_CELL_RENDERER(cell),
606 "active", fe->enabled, NULL);
609 g_object_set(GTK_CELL_RENDERER(cell),
610 "text", fe->extensions, NULL);
613 g_object_set(GTK_CELL_RENDERER(cell),
614 "text", fe->description, NULL);
619 static void filter_add_cb(GtkWidget *widget, gpointer data)
621 filter_add_unique("description", ".new", TRUE);
622 filter_store_populate();
624 /* FIXME: implement the scroll to/select row stuff for tree view */
627 static void filter_remove_cb(GtkWidget *widget, gpointer data)
629 GtkWidget *filter_view = data;
630 GtkTreeSelection *selection;
634 if (!filter_store) return;
635 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
636 if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
637 gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1);
640 filter_remove_entry(fe);
642 filter_store_populate();
645 static void filter_default_ok_cb(GenericDialog *gd, gpointer data)
648 filter_add_defaults();
650 filter_store_populate();
653 static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
655 /* no op, only so cancel button appears */
658 static void filter_default_cb(GtkWidget *widget, gpointer data)
662 gd = generic_dialog_new(_("Reset filters"),
663 "GQview", "reset_filter", widget, TRUE,
664 dummy_cancel_cb, NULL);
665 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"),
666 _("This will reset the file filters to the defaults.\nContinue?"));
667 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE);
668 gtk_widget_show(gd->dialog);
671 static void filter_disable_cb(GtkWidget* widget, gpointer data)
673 GtkWidget *frame = data;
675 gtk_widget_set_sensitive(frame,
676 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
679 static void editor_default_ok_cb(GenericDialog *gd, gpointer data)
683 editor_reset_defaults();
684 if (!configwindow) return;
686 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
688 gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),
689 (editor_name[i]) ? editor_name[i] : "");
690 gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]),
691 (editor_command[i]) ? editor_command[i] : "");
695 static void editor_default_cb(GtkWidget *widget, gpointer data)
699 gd = generic_dialog_new(_("Reset editors"),
700 "GQview", "reset_filter", widget, TRUE,
701 dummy_cancel_cb, NULL);
702 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"),
703 _("This will reset the edit commands to the defaults.\nContinue?"));
704 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, editor_default_ok_cb, TRUE);
705 gtk_widget_show(gd->dialog);
708 static void editor_help_cb(GtkWidget *widget, gpointer data)
710 help_window_show("editors");
713 static void safe_delete_view_cb(GtkWidget* widget, gpointer data)
715 layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
718 static void safe_delete_clear_ok_cb(GenericDialog *gd, gpointer data)
720 file_util_trash_clear();
723 static void safe_delete_clear_cb(GtkWidget* widget, gpointer data)
727 gd = generic_dialog_new(_("Clear trash"),
728 "GQview", "clear_trash", widget, TRUE,
729 dummy_cancel_cb, NULL);
730 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"),
731 _("This will remove the trash contents."));
732 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE);
733 entry = gtk_entry_new();
734 GTK_WIDGET_UNSET_FLAGS(entry, GTK_CAN_FOCUS);
735 gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
736 if (safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), safe_delete_path);
737 gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0);
738 gtk_widget_show(entry);
739 gtk_widget_show(gd->dialog);
742 static void config_window_create(void)
754 GtkWidget *ct_button;
759 GtkWidget *filter_view;
760 GtkCellRenderer *renderer;
761 GtkTreeSelection *selection;
762 GtkTreeViewColumn *column;
765 configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
766 gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
767 g_signal_connect(G_OBJECT (configwindow), "delete_event",
768 G_CALLBACK(config_window_delete), NULL);
769 gtk_window_set_resizable(GTK_WINDOW(configwindow), FALSE);
770 gtk_window_set_title(GTK_WINDOW(configwindow), _("GQview Preferences"));
771 gtk_window_set_wmclass(GTK_WINDOW(configwindow), "config", "GQview");
772 gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
774 window_set_icon(configwindow, (const gchar **)config_xpm, NULL);
776 win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
777 gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
778 gtk_widget_show(win_vbox);
780 hbox = gtk_hbutton_box_new();
781 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
782 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
783 gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
784 gtk_widget_show(hbox);
786 button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE,
787 G_CALLBACK(config_window_ok_cb), NULL);
788 gtk_container_add(GTK_CONTAINER(hbox), button);
789 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
790 gtk_widget_grab_default(button);
791 gtk_widget_show(button);
795 button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE,
796 G_CALLBACK(config_window_apply_cb), NULL);
797 gtk_container_add(GTK_CONTAINER(hbox), button);
798 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
799 gtk_widget_show(button);
801 button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE,
802 G_CALLBACK(config_window_close_cb), NULL);
803 gtk_container_add(GTK_CONTAINER(hbox), button);
804 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
805 gtk_widget_show(button);
807 if (!generic_dialog_get_alternative_button_order(configwindow))
809 gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1);
812 notebook = gtk_notebook_new();
813 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
814 gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
816 /* general options tab */
818 vbox = gtk_vbox_new(FALSE, 0);
819 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
820 gtk_widget_show(vbox);
821 label = gtk_label_new(_("General"));
822 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label);
824 group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL);
826 button = pref_checkbox_new_int(group, _("Change to folder:"),
827 startup_path_enable, &startup_path_enable_c);
829 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
830 pref_checkbox_link_sensitivity(button, hbox);
832 tabcomp = tab_completion_new(&startup_path_entry, startup_path, NULL, NULL);
833 tab_completion_add_select_button(startup_path_entry, NULL, TRUE);
834 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
835 gtk_widget_show(tabcomp);
837 button = pref_button_new(hbox, NULL, _("Use current"), FALSE,
838 G_CALLBACK(startup_path_set_current), NULL);
840 group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL);
842 table = pref_table_new(group, 2, 2, FALSE, FALSE);
843 add_thumb_size_menu(table, 0, 0, _("Size:"));
844 add_quality_menu(table, 0, 1, _("Quality:"), thumbnail_quality, &thumbnail_quality_c);
846 ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
847 enable_thumb_caching, &enable_thumb_caching_c);
849 subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
850 pref_checkbox_link_sensitivity(ct_button, subgroup);
852 button = pref_checkbox_new_int(subgroup, _("Use shared thumbnail cache"),
853 thumbnail_spec_standard, &thumbnail_spec_standard_c);
855 subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
856 pref_checkbox_link_sensitivity_swap(button, subgroup);
858 button = pref_checkbox_new_int(subgroup, _("Cache thumbnails into .thumbnails"),
859 enable_thumb_dirs, &enable_thumb_dirs_c);
861 button = pref_checkbox_new_int(subgroup, _("Use xvpics thumbnails when found (read only)"),
862 use_xvpics_thumbnails, &use_xvpics_thumbnails_c);
864 group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL);
866 slideshow_delay_c = slideshow_delay;
867 spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"),
868 SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1,
869 slideshow_delay ? (double)slideshow_delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
870 G_CALLBACK(slideshow_delay_cb), NULL);
871 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
873 pref_checkbox_new_int(group, _("Random"), slideshow_random, &slideshow_random_c);
874 pref_checkbox_new_int(group, _("Repeat"), slideshow_repeat, &slideshow_repeat_c);
878 vbox = gtk_vbox_new(FALSE, 0);
879 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
880 gtk_widget_show(vbox);
881 label = gtk_label_new(_("Image"));
882 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
884 group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL);
887 add_dither_menu(dither_quality, &dither_quality_c, _("Dithering method:"), group);
889 table = pref_table_new(group, 2, 1, FALSE, FALSE);
890 add_quality_menu(table, 0, 0, _("Quality:"), zoom_quality, &zoom_quality_c);
892 pref_checkbox_new_int(group, _("Two pass zooming"),
893 two_pass_zoom, &two_pass_zoom_c);
895 pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit."),
896 zoom_to_fit_expands, &zoom_to_fit_expands_c);
898 zoom_increment_c = zoom_increment;
899 spin = pref_spin_new(group, _("Zoom increment:"), NULL,
900 0.1, 4.0, 1.0, 1, (float)zoom_increment / 10.0,
901 G_CALLBACK(zoom_increment_cb), NULL);
902 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
904 group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_VERTICAL);
906 zoom_mode_c = zoom_mode;
907 button = pref_radiobutton_new(group, NULL, _("Zoom to original size"),
908 (zoom_mode == ZOOM_RESET_ORIGINAL),
909 G_CALLBACK(zoom_mode_original_cb), NULL);
910 button = pref_radiobutton_new(group, button, _("Fit image to window"),
911 (zoom_mode == ZOOM_RESET_FIT_WINDOW),
912 G_CALLBACK(zoom_mode_fit_cb), NULL);
913 button = pref_radiobutton_new(group, button, _("Leave Zoom at previous setting"),
914 (zoom_mode == ZOOM_RESET_NONE),
915 G_CALLBACK(zoom_mode_none_cb), NULL);
917 group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
919 pref_checkbox_new_int(group, _("Black background"),
920 black_window_background, &black_window_background_c);
922 group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
924 pref_checkbox_new_int(group, _("Refresh on file change"),
925 update_on_time_change, &update_on_time_change_c);
926 pref_checkbox_new_int(group, _("Preload next image"),
927 enable_read_ahead, &enable_read_ahead_c);
928 pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
929 exif_rotate_enable, &exif_rotate_enable_c);
934 vbox = gtk_vbox_new(FALSE, 0);
935 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
936 gtk_widget_show(vbox);
937 label = gtk_label_new(_("Windows"));
938 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
940 group = pref_group_new(vbox, FALSE, _("State"), GTK_ORIENTATION_VERTICAL);
942 pref_checkbox_new_int(group, _("Remember window positions"),
943 save_window_positions, &save_window_positions_c);
944 pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
945 restore_tool, &restore_tool_c);
947 group = pref_group_new(vbox, FALSE, _("Size"), GTK_ORIENTATION_VERTICAL);
949 pref_checkbox_new_int(group, _("Fit window to image when tools are hidden/floating"),
950 fit_window, &fit_window_c);
952 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
953 ct_button = pref_checkbox_new_int(hbox, _("Limit size when auto-sizing window (%):"),
954 limit_window_size, &limit_window_size_c);
955 spin = pref_spin_new_int(hbox, NULL, NULL,
957 max_window_size, &max_window_size_c);
958 pref_checkbox_link_sensitivity(ct_button, spin);
960 group = pref_group_new(vbox, FALSE, _("Layout"), GTK_ORIENTATION_VERTICAL);
962 layout_widget = layout_config_new();
963 layout_config_set(layout_widget, layout_style, layout_order);
964 gtk_box_pack_start(GTK_BOX(group), layout_widget, FALSE, FALSE, 0);
965 gtk_widget_show(layout_widget);
970 vbox = gtk_vbox_new(FALSE, 0);
971 gtk_container_set_border_width(GTK_CONTAINER (vbox), PREF_PAD_BORDER);
972 gtk_widget_show(vbox);
973 label = gtk_label_new(_("Filtering"));
974 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
976 group = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
978 pref_checkbox_new_int(group, _("Show entries that begin with a dot"),
979 show_dot_files, &show_dot_files_c);
980 pref_checkbox_new_int(group, _("Case sensitive sort"),
981 file_sort_case_sensitive, &file_sort_case_sensitive_c);
983 ct_button = pref_checkbox_new_int(group, _("Disable File Filtering"),
984 file_filter_disable, &file_filter_disable_c);
986 group = pref_group_new(vbox, TRUE, _("File types"), GTK_ORIENTATION_VERTICAL);
988 frame = pref_group_parent(group);
989 g_signal_connect(G_OBJECT(ct_button), "toggled",
990 G_CALLBACK(filter_disable_cb), frame);
991 gtk_widget_set_sensitive(frame, !file_filter_disable);
993 scrolled = gtk_scrolled_window_new(NULL, NULL);
994 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
995 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
996 gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
997 gtk_widget_show(scrolled);
999 filter_store = gtk_list_store_new(1, G_TYPE_POINTER);
1000 filter_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter_store));
1001 g_object_unref(filter_store);
1002 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
1003 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
1005 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(filter_view), FALSE);
1007 column = gtk_tree_view_column_new();
1008 gtk_tree_view_column_set_title(column, _("Filter"));
1009 gtk_tree_view_column_set_resizable(column, TRUE);
1011 renderer = gtk_cell_renderer_toggle_new();
1012 g_signal_connect(G_OBJECT(renderer), "toggled",
1013 G_CALLBACK(filter_store_enable_cb), filter_store);
1014 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1015 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1016 GINT_TO_POINTER(FE_ENABLE), NULL);
1018 renderer = gtk_cell_renderer_text_new();
1019 g_signal_connect(G_OBJECT(renderer), "edited",
1020 G_CALLBACK(filter_store_ext_edit_cb), filter_store);
1021 gtk_tree_view_column_pack_start(column, renderer, TRUE);
1022 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
1023 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1024 GINT_TO_POINTER(FE_EXTENSION), NULL);
1025 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
1027 column = gtk_tree_view_column_new();
1028 gtk_tree_view_column_set_title(column, _("Description"));
1029 gtk_tree_view_column_set_resizable(column, TRUE);
1030 renderer = gtk_cell_renderer_text_new();
1031 g_signal_connect(G_OBJECT(renderer), "edited",
1032 G_CALLBACK(filter_store_desc_edit_cb), filter_store);
1033 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
1034 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1035 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1036 GINT_TO_POINTER(FE_DESCRIPTION), NULL);
1037 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
1039 filter_store_populate();
1040 gtk_container_add(GTK_CONTAINER(scrolled), filter_view);
1041 gtk_widget_show(filter_view);
1043 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1045 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
1046 G_CALLBACK(filter_default_cb), NULL);
1047 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1048 gtk_widget_show(button);
1050 button = pref_button_new(NULL, GTK_STOCK_REMOVE, NULL, FALSE,
1051 G_CALLBACK(filter_remove_cb), filter_view);
1052 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1053 gtk_widget_show(button);
1055 button = pref_button_new(NULL, GTK_STOCK_ADD, NULL, FALSE,
1056 G_CALLBACK(filter_add_cb), NULL);
1057 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1058 gtk_widget_show(button);
1061 /* editor entry tab */
1063 vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
1064 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
1065 gtk_widget_show(vbox);
1066 label = gtk_label_new(_("Editors"));
1067 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
1069 table = pref_table_new(vbox, 3, 9, FALSE, FALSE);
1070 gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
1072 label = pref_table_label(table, 0, 0, _("#"), 1.0);
1073 pref_label_bold(label, TRUE, FALSE);
1075 label = pref_table_label(table, 1, 0, _("Menu name"), 0.0);
1076 pref_label_bold(label, TRUE, FALSE);
1078 label = pref_table_label(table, 2, 0, ("Command Line"), 0.0);
1079 pref_label_bold(label, TRUE, FALSE);
1081 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
1085 buf = g_strdup_printf("%d", i+1);
1086 pref_table_label(table, 0, i+1, buf, 1.0);
1089 editor_name_entry[i] = gtk_entry_new();
1090 gtk_entry_set_max_length(GTK_ENTRY(editor_name_entry[i]), EDITOR_NAME_MAX_LENGTH);
1091 gtk_widget_set_size_request(editor_name_entry[i],80,-1);
1092 if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]);
1093 gtk_table_attach(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2,
1094 GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
1095 gtk_widget_show(editor_name_entry[i]);
1097 editor_command_entry[i] = gtk_entry_new();
1098 gtk_entry_set_max_length(GTK_ENTRY(editor_command_entry[i]), EDITOR_COMMAND_MAX_LENGTH);
1099 gtk_widget_set_size_request(editor_command_entry[i],160,-1);
1100 tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL);
1101 if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]);
1102 gtk_table_attach(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2,
1103 GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
1104 gtk_widget_show(editor_command_entry[i]);
1107 hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1109 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
1110 G_CALLBACK(editor_default_cb), NULL);
1111 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1112 gtk_widget_show(button);
1114 button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
1115 G_CALLBACK(editor_help_cb), NULL);
1116 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1117 gtk_widget_show(button);
1119 /* advanced entry tab */
1121 scrolled = gtk_scrolled_window_new(NULL, NULL);
1122 gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
1123 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
1124 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1125 label = gtk_label_new(_("Advanced"));
1126 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
1127 gtk_widget_show(scrolled);
1129 viewport = gtk_viewport_new(NULL, NULL);
1130 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
1131 gtk_container_add(GTK_CONTAINER(scrolled), viewport);
1132 gtk_widget_show(viewport);
1134 vbox = gtk_vbox_new(FALSE, 0);
1135 gtk_container_add(GTK_CONTAINER(viewport), vbox);
1136 gtk_widget_show(vbox);
1138 group = pref_group_new(vbox, FALSE, _("Full screen"), GTK_ORIENTATION_VERTICAL);
1140 fullscreen_screen_c = fullscreen_screen;
1141 fullscreen_above_c = fullscreen_above;
1142 hbox = fullscreen_prefs_selection_new(_("Location:"), &fullscreen_screen_c, &fullscreen_above_c);
1143 gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
1144 gtk_widget_show(hbox);
1146 pref_checkbox_new_int(group, _("Smooth image flip"),
1147 fullscreen_clean_flip, &fullscreen_clean_flip_c);
1148 pref_checkbox_new_int(group, _("Disable screen saver"),
1149 fullscreen_disable_saver, &fullscreen_disable_saver_c);
1151 group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL);
1153 pref_checkbox_new_int(group, _("Confirm file delete"),
1154 confirm_delete, &confirm_delete_c);
1155 pref_checkbox_new_int(group, _("Enable Delete key"),
1156 enable_delete_key, &enable_delete_key_c);
1158 ct_button = pref_checkbox_new_int(group, _("Safe delete"),
1159 safe_delete_enable, &safe_delete_enable_c);
1161 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
1162 pref_checkbox_link_sensitivity(ct_button, hbox);
1164 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_SPACE);
1165 pref_label_new(hbox, _("Folder:"));
1167 tabcomp = tab_completion_new(&safe_delete_path_entry, safe_delete_path, NULL, NULL);
1168 tab_completion_add_select_button(safe_delete_path_entry, NULL, TRUE);
1169 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
1170 gtk_widget_show(tabcomp);
1172 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1173 pref_checkbox_link_sensitivity(ct_button, hbox);
1175 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP);
1176 pref_spin_new_int(hbox, _("Maximum size:"), _("MB"),
1177 1, 500, 1, safe_delete_size, &safe_delete_size_c);
1179 button = pref_button_new(NULL, NULL, _("View"), FALSE,
1180 G_CALLBACK(safe_delete_view_cb), NULL);
1181 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1182 gtk_widget_show(button);
1184 button = pref_button_new(NULL, GTK_STOCK_CLEAR, NULL, FALSE,
1185 G_CALLBACK(safe_delete_clear_cb), NULL);
1186 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1187 gtk_widget_show(button);
1189 group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
1191 pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
1192 collection_rectangular_selection, &collection_rectangular_selection_c);
1194 pref_checkbox_new_int(group, _("Descend folders in tree view"),
1195 tree_descend_subdirs, &tree_descend_subdirs_c);
1197 pref_checkbox_new_int(group, _("In place renaming"),
1198 enable_in_place_rename, &enable_in_place_rename_c);
1200 group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
1202 pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
1203 progressive_key_scrolling, &progressive_key_scrolling_c);
1204 pref_checkbox_new_int(group, _("Mouse wheel scrolls image"),
1205 mousewheel_scrolls, &mousewheel_scrolls_c);
1207 group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL);
1209 pref_checkbox_new_int(group, _("Store keywords and comments local to source images"),
1210 enable_metadata_dirs, &enable_metadata_dirs_c);
1212 pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
1213 0, 100, 1, dupe_custom_threshold, &dupe_custom_threshold_c);
1215 pref_spin_new_int(group, _("Offscreen cache size (Mb per image):"), NULL,
1216 0, 128, 1, tile_cache_max, &tile_cache_max_c);
1218 gtk_widget_show(notebook);
1220 gtk_widget_show(configwindow);
1224 *-----------------------------------------------------------------------------
1225 * config window show (public)
1226 *-----------------------------------------------------------------------------
1229 void show_config_window(void)
1233 gtk_window_present(GTK_WINDOW(configwindow));
1237 config_window_create();
1246 static GtkWidget *about = NULL;
1248 static gint about_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
1250 gtk_widget_destroy(about);
1256 static void about_window_close(GtkWidget *widget, gpointer data)
1260 gtk_widget_destroy(about);
1264 static void about_credits_cb(GtkWidget *widget, gpointer data)
1266 help_window_show("credits");
1269 void show_about_window(void)
1281 gtk_window_present(GTK_WINDOW(about));
1285 about = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1286 gtk_window_set_type_hint(GTK_WINDOW(about), GDK_WINDOW_TYPE_HINT_DIALOG);
1287 gtk_window_set_wmclass(GTK_WINDOW(about), "about", "GQview");
1288 g_signal_connect(G_OBJECT(about), "delete_event",
1289 G_CALLBACK(about_delete_cb), NULL);
1291 gtk_window_set_title(GTK_WINDOW(about), _("About - GQview"));
1292 gtk_container_set_border_width(GTK_CONTAINER(about), PREF_PAD_BORDER);
1294 vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
1295 gtk_container_add(GTK_CONTAINER(about), vbox);
1296 gtk_widget_show(vbox);
1298 pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
1299 button = gtk_image_new_from_pixbuf(pixbuf);
1300 g_object_unref(pixbuf);
1301 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
1302 gtk_widget_show(button);
1304 buf = g_strdup_printf(_("GQview %s\n\nCopyright (c) %s John Ellis\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
1307 "gqview.sourceforge.net",
1308 "gqview@users.sourceforge.net");
1309 label = gtk_label_new(buf);
1312 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
1313 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
1314 gtk_widget_show(label);
1316 hbox = gtk_hbutton_box_new();
1317 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
1318 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
1319 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1320 gtk_widget_show(hbox);
1322 button = pref_button_new(NULL, NULL, _("Credits..."), FALSE,
1323 G_CALLBACK(about_credits_cb), NULL);
1324 gtk_container_add(GTK_CONTAINER(hbox), button);
1325 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1326 gtk_widget_show(button);
1328 button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
1329 G_CALLBACK(about_window_close), NULL);
1330 gtk_container_add(GTK_CONTAINER(hbox), button);
1331 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1332 gtk_widget_grab_default(button);
1333 gtk_widget_show(button);
1335 window_set_icon(about, NULL, NULL);
1336 gtk_widget_show(about);