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 thumbnail_fast_c;
92 static gint use_xvpics_thumbnails_c;
94 static gint thumbnail_spec_standard_c;
95 static gint enable_metadata_dirs_c;
96 static gint show_dot_files_c;
97 static gint file_filter_disable_c;
98 static gint file_sort_case_sensitive_c;
99 static gint slideshow_delay_c;
100 static gint slideshow_random_c;
101 static gint slideshow_repeat_c;
103 static gint mousewheel_scrolls_c;
105 static gint enable_in_place_rename_c;
107 static gint collection_rectangular_selection_c;
109 static gint tile_cache_max_c;
111 static gint thumbnail_quality_c;
112 static gint zoom_quality_c;
114 static gint zoom_increment_c;
116 static gint enable_read_ahead_c;
118 static gint black_window_background_c;
120 static gint fullscreen_screen_c;
121 static gint fullscreen_clean_flip_c;
122 static gint fullscreen_disable_saver_c;
123 static gint fullscreen_above_c;
125 static gint dupe_custom_threshold_c;
127 static GtkWidget *configwindow = NULL;
128 static GtkWidget *startup_path_entry;
129 static GtkListStore *filter_store = NULL;
130 static GtkWidget *editor_name_entry[GQVIEW_EDITOR_SLOTS];
131 static GtkWidget *editor_command_entry[GQVIEW_EDITOR_SLOTS];
133 static GtkWidget *layout_widget;
135 static GtkWidget *safe_delete_path_entry;
137 static gint tree_descend_subdirs_c;
139 static gint update_on_time_change_c;
140 static gint exif_rotate_enable_c;
144 *-----------------------------------------------------------------------------
145 * option widget callbacks (private)
146 *-----------------------------------------------------------------------------
149 static void startup_path_set_current(GtkWidget *widget, gpointer data)
151 gtk_entry_set_text(GTK_ENTRY(startup_path_entry), layout_get_path(NULL));
154 static void zoom_mode_original_cb(GtkWidget *widget, gpointer data)
156 if (GTK_TOGGLE_BUTTON (widget)->active)
157 zoom_mode_c = ZOOM_RESET_ORIGINAL;
160 static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data)
162 if (GTK_TOGGLE_BUTTON (widget)->active)
163 zoom_mode_c = ZOOM_RESET_FIT_WINDOW;
166 static void zoom_mode_none_cb(GtkWidget *widget, gpointer data)
168 if (GTK_TOGGLE_BUTTON (widget)->active)
169 zoom_mode_c = ZOOM_RESET_NONE;
172 static void zoom_increment_cb(GtkWidget *spin, gpointer data)
174 zoom_increment_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 10.0 + 0.01);
177 static void slideshow_delay_cb(GtkWidget *spin, gpointer data)
179 slideshow_delay_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
180 (double)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
184 *-----------------------------------------------------------------------------
185 * sync progam to config window routine (private)
186 *-----------------------------------------------------------------------------
189 static void config_window_apply(void)
195 gint refresh = FALSE;
197 for(i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
199 g_free(editor_name[i]);
200 editor_name[i] = NULL;
201 buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i]));
202 if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf);
204 g_free(editor_command[i]);
205 editor_command[i] = NULL;
206 buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i]));
207 if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf);
209 layout_edit_update_all();
211 g_free(startup_path);
213 buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry));
214 if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf);
216 g_free(safe_delete_path);
217 safe_delete_path = NULL;
218 buf = gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry));
219 if (buf && strlen(buf) > 0) safe_delete_path = remove_trailing_slash(buf);
221 if (show_dot_files != show_dot_files_c) refresh = TRUE;
222 if (file_sort_case_sensitive != file_sort_case_sensitive_c) refresh = TRUE;
223 if (file_filter_disable != file_filter_disable_c) refresh = TRUE;
225 startup_path_enable = startup_path_enable_c;
226 confirm_delete = confirm_delete_c;
227 enable_delete_key = enable_delete_key_c;
228 safe_delete_enable = safe_delete_enable_c;
229 safe_delete_size = safe_delete_size_c;
230 restore_tool = restore_tool_c;
231 save_window_positions = save_window_positions_c;
232 zoom_mode = zoom_mode_c;
233 two_pass_zoom = two_pass_zoom_c;
234 fit_window = fit_window_c;
235 limit_window_size = limit_window_size_c;
236 zoom_to_fit_expands = zoom_to_fit_expands_c;
237 max_window_size = max_window_size_c;
238 progressive_key_scrolling = progressive_key_scrolling_c;
239 thumb_max_width = thumb_max_width_c;
240 thumb_max_height = thumb_max_height_c;
241 enable_thumb_caching = enable_thumb_caching_c;
242 enable_thumb_dirs = enable_thumb_dirs_c;
243 thumbnail_fast = thumbnail_fast_c;
245 use_xvpics_thumbnails = use_xvpics_thumbnails_c;
247 thumbnail_spec_standard = thumbnail_spec_standard_c;
248 enable_metadata_dirs = enable_metadata_dirs_c;
249 show_dot_files = show_dot_files_c;
250 file_sort_case_sensitive = file_sort_case_sensitive_c;
251 file_filter_disable = file_filter_disable_c;
253 slideshow_random = slideshow_random_c;
254 slideshow_repeat = slideshow_repeat_c;
255 slideshow_delay = slideshow_delay_c;
257 mousewheel_scrolls = mousewheel_scrolls_c;
259 enable_in_place_rename = enable_in_place_rename_c;
261 collection_rectangular_selection = collection_rectangular_selection_c;
263 tile_cache_max = tile_cache_max_c;
265 thumbnail_quality = thumbnail_quality_c;
266 zoom_quality = zoom_quality_c;
268 zoom_increment = zoom_increment_c;
270 enable_read_ahead = enable_read_ahead_c;
272 if (black_window_background != black_window_background_c)
274 black_window_background = black_window_background_c;
276 layout_colors_update();
277 view_window_colors_update();
280 fullscreen_screen = fullscreen_screen_c;
281 fullscreen_clean_flip = fullscreen_clean_flip_c;
282 fullscreen_disable_saver = fullscreen_disable_saver_c;
283 fullscreen_above = fullscreen_above_c;
285 update_on_time_change = update_on_time_change_c;
286 exif_rotate_enable = exif_rotate_enable_c;
288 dupe_custom_threshold = dupe_custom_threshold_c;
290 tree_descend_subdirs = tree_descend_subdirs_c;
292 l_conf = layout_config_get(layout_widget, &new_style);
294 if (new_style != layout_style ||
295 (l_conf == NULL) != (layout_order == NULL) ||
297 strcmp(buf, layout_order) != 0)
299 if (refresh) filter_rebuild();
302 g_free(layout_order);
303 layout_order = l_conf;
306 layout_style = new_style;
308 layout_styles_update();
316 layout_refresh(NULL);
321 *-----------------------------------------------------------------------------
322 * config window main button callbacks (private)
323 *-----------------------------------------------------------------------------
326 static void config_window_close_cb(GtkWidget *widget, gpointer data)
328 gtk_widget_destroy(configwindow);
333 static gint config_window_delete(GtkWidget *w, GdkEventAny *event, gpointer data)
335 config_window_close_cb(NULL, NULL);
339 static void config_window_ok_cb(GtkWidget *widget, gpointer data)
341 config_window_apply();
342 config_window_close_cb(NULL, NULL);
345 static void config_window_apply_cb(GtkWidget *widget, gpointer data)
347 config_window_apply();
351 *-----------------------------------------------------------------------------
352 * config window setup (private)
353 *-----------------------------------------------------------------------------
356 static void quality_menu_cb(GtkWidget *combo, gpointer data)
360 switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
364 *option = GDK_INTERP_NEAREST;
367 *option = GDK_INTERP_TILES;
370 *option = GDK_INTERP_BILINEAR;
373 *option = GDK_INTERP_HYPER;
378 static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
379 gint option, gint *option_c)
386 pref_table_label(table, column, row, text, 0.0);
388 combo = gtk_combo_box_new_text();
390 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Nearest (worst, but fastest)"));
391 if (option == GDK_INTERP_NEAREST) current = 0;
392 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Tiles"));
393 if (option == GDK_INTERP_TILES) current = 1;
394 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Bilinear"));
395 if (option == GDK_INTERP_BILINEAR) current = 2;
396 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Hyper (best, but slowest)"));
397 if (option == GDK_INTERP_HYPER) current = 3;
399 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
401 g_signal_connect(G_OBJECT(combo), "changed",
402 G_CALLBACK(quality_menu_cb), option_c);
404 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
405 GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
406 gtk_widget_show(combo);
410 static void add_dither_menu(gint option, gint *option_c, gchar *text, GtkWidget *box)
418 hbox = pref_box_new(box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
419 pref_label_new(hbox, text);
421 omenu = gtk_option_menu_new();
422 menu = gtk_menu_new();
424 add_menu_item(menu, _("None"), option_c, (gint)GDK_RGB_DITHER_NONE);
425 add_menu_item(menu, _("Normal"), option_c, (gint)GDK_RGB_DITHER_NORMAL);
426 add_menu_item(menu, _("Best"), option_c, (gint)GDK_RGB_DITHER_MAX);
428 gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu);
429 gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), *option_c);
431 gtk_box_pack_start(GTK_BOX(hbox), omenu, FALSE, FALSE, 0);
432 gtk_widget_show(omenu);
436 static void thumb_size_menu_cb(GtkWidget *combo, gpointer data)
440 n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
442 if (n >= 0 && n < sizeof(thumb_size_list) / sizeof(ThumbSize))
444 thumb_max_width_c = thumb_size_list[n].w;
445 thumb_max_height_c = thumb_size_list[n].h;
449 thumb_max_width_c = thumb_max_width;
450 thumb_max_height_c = thumb_max_height;
454 static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *text)
462 thumb_max_width_c = thumb_max_width;
463 thumb_max_height_c = thumb_max_height;
465 pref_table_label(table, column, row, text, 0.0);
467 combo = gtk_combo_box_new_text();
477 w = thumb_size_list[i].w;
478 h = thumb_size_list[i].h;
484 buf = g_strdup_printf("%d x %d", w, h);
485 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
488 if (w == thumb_max_width && h == thumb_max_height) current = i;
504 buf = g_strdup_printf("%s %d x %d", _("Custom"), thumb_max_width, thumb_max_height);
505 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
511 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
512 g_signal_connect(G_OBJECT(combo), "changed",
513 G_CALLBACK(thumb_size_menu_cb), NULL);
515 gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
516 GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
517 gtk_widget_show(combo);
520 static void filter_store_populate(void)
524 if (!filter_store) return;
526 gtk_list_store_clear(filter_store);
528 work = filter_get_list();
537 gtk_list_store_append(filter_store, &iter);
538 gtk_list_store_set(filter_store, &iter, 0, fe, -1);
542 static void filter_store_ext_edit_cb(GtkCellRendererText *cell, gchar *path_str,
543 gchar *new_text, gpointer data)
545 GtkWidget *model = data;
546 FilterEntry *fe = data;
550 if (!new_text || strlen(new_text) < 1) return;
552 tpath = gtk_tree_path_new_from_string(path_str);
553 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
554 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
556 g_free(fe->extensions);
557 fe->extensions = g_strdup(new_text);
559 gtk_tree_path_free(tpath);
563 static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str,
564 gchar *new_text, gpointer data)
566 GtkWidget *model = data;
571 if (!new_text || strlen(new_text) < 1) return;
573 tpath = gtk_tree_path_new_from_string(path_str);
574 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
575 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
577 g_free(fe->description);
578 fe->description = g_strdup(new_text);
580 gtk_tree_path_free(tpath);
583 static void filter_store_enable_cb(GtkCellRendererToggle *renderer,
584 gchar *path_str, gpointer data)
586 GtkWidget *model = data;
591 tpath = gtk_tree_path_new_from_string(path_str);
592 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
593 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
595 fe->enabled = !fe->enabled;
597 gtk_tree_path_free(tpath);
601 static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
602 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
606 gtk_tree_model_get(tree_model, iter, 0, &fe, -1);
608 switch(GPOINTER_TO_INT(data))
611 g_object_set(GTK_CELL_RENDERER(cell),
612 "active", fe->enabled, NULL);
615 g_object_set(GTK_CELL_RENDERER(cell),
616 "text", fe->extensions, NULL);
619 g_object_set(GTK_CELL_RENDERER(cell),
620 "text", fe->description, NULL);
625 static void filter_add_cb(GtkWidget *widget, gpointer data)
627 filter_add_unique("description", ".new", TRUE);
628 filter_store_populate();
630 /* FIXME: implement the scroll to/select row stuff for tree view */
633 static void filter_remove_cb(GtkWidget *widget, gpointer data)
635 GtkWidget *filter_view = data;
636 GtkTreeSelection *selection;
640 if (!filter_store) return;
641 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
642 if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
643 gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1);
646 filter_remove_entry(fe);
648 filter_store_populate();
651 static void filter_default_ok_cb(GenericDialog *gd, gpointer data)
654 filter_add_defaults();
656 filter_store_populate();
659 static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
661 /* no op, only so cancel button appears */
664 static void filter_default_cb(GtkWidget *widget, gpointer data)
668 gd = generic_dialog_new(_("Reset filters"),
669 "GQview", "reset_filter", widget, TRUE,
670 dummy_cancel_cb, NULL);
671 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"),
672 _("This will reset the file filters to the defaults.\nContinue?"));
673 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE);
674 gtk_widget_show(gd->dialog);
677 static void filter_disable_cb(GtkWidget* widget, gpointer data)
679 GtkWidget *frame = data;
681 gtk_widget_set_sensitive(frame,
682 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
685 static void editor_default_ok_cb(GenericDialog *gd, gpointer data)
689 editor_reset_defaults();
690 if (!configwindow) return;
692 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
694 gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),
695 (editor_name[i]) ? editor_name[i] : "");
696 gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]),
697 (editor_command[i]) ? editor_command[i] : "");
701 static void editor_default_cb(GtkWidget *widget, gpointer data)
705 gd = generic_dialog_new(_("Reset editors"),
706 "GQview", "reset_filter", widget, TRUE,
707 dummy_cancel_cb, NULL);
708 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"),
709 _("This will reset the edit commands to the defaults.\nContinue?"));
710 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, editor_default_ok_cb, TRUE);
711 gtk_widget_show(gd->dialog);
714 static void editor_help_cb(GtkWidget *widget, gpointer data)
716 help_window_show("editors");
719 static void safe_delete_view_cb(GtkWidget* widget, gpointer data)
721 layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
724 static void safe_delete_clear_ok_cb(GenericDialog *gd, gpointer data)
726 file_util_trash_clear();
729 static void safe_delete_clear_cb(GtkWidget* widget, gpointer data)
733 gd = generic_dialog_new(_("Clear trash"),
734 "GQview", "clear_trash", widget, TRUE,
735 dummy_cancel_cb, NULL);
736 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"),
737 _("This will remove the trash contents."));
738 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE);
739 entry = gtk_entry_new();
740 GTK_WIDGET_UNSET_FLAGS(entry, GTK_CAN_FOCUS);
741 gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
742 if (safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), safe_delete_path);
743 gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0);
744 gtk_widget_show(entry);
745 gtk_widget_show(gd->dialog);
748 static void config_window_create(void)
760 GtkWidget *ct_button;
765 GtkWidget *filter_view;
766 GtkCellRenderer *renderer;
767 GtkTreeSelection *selection;
768 GtkTreeViewColumn *column;
771 configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
772 gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
773 g_signal_connect(G_OBJECT (configwindow), "delete_event",
774 G_CALLBACK(config_window_delete), NULL);
775 gtk_window_set_resizable(GTK_WINDOW(configwindow), FALSE);
776 gtk_window_set_title(GTK_WINDOW(configwindow), _("GQview Preferences"));
777 gtk_window_set_wmclass(GTK_WINDOW(configwindow), "config", "GQview");
778 gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
780 window_set_icon(configwindow, (const gchar **)config_xpm, NULL);
782 win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
783 gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
784 gtk_widget_show(win_vbox);
786 hbox = gtk_hbutton_box_new();
787 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
788 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
789 gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
790 gtk_widget_show(hbox);
792 button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE,
793 G_CALLBACK(config_window_ok_cb), NULL);
794 gtk_container_add(GTK_CONTAINER(hbox), button);
795 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
796 gtk_widget_grab_default(button);
797 gtk_widget_show(button);
801 button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE,
802 G_CALLBACK(config_window_apply_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 button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE,
808 G_CALLBACK(config_window_close_cb), NULL);
809 gtk_container_add(GTK_CONTAINER(hbox), button);
810 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
811 gtk_widget_show(button);
813 if (!generic_dialog_get_alternative_button_order(configwindow))
815 gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1);
818 notebook = gtk_notebook_new();
819 gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
820 gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
822 /* general options tab */
824 vbox = gtk_vbox_new(FALSE, 0);
825 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
826 gtk_widget_show(vbox);
827 label = gtk_label_new(_("General"));
828 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label);
830 group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL);
832 button = pref_checkbox_new_int(group, _("Change to folder:"),
833 startup_path_enable, &startup_path_enable_c);
835 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
836 pref_checkbox_link_sensitivity(button, hbox);
838 tabcomp = tab_completion_new(&startup_path_entry, startup_path, NULL, NULL);
839 tab_completion_add_select_button(startup_path_entry, NULL, TRUE);
840 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
841 gtk_widget_show(tabcomp);
843 button = pref_button_new(hbox, NULL, _("Use current"), FALSE,
844 G_CALLBACK(startup_path_set_current), NULL);
846 group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL);
848 table = pref_table_new(group, 2, 2, FALSE, FALSE);
849 add_thumb_size_menu(table, 0, 0, _("Size:"));
850 add_quality_menu(table, 0, 1, _("Quality:"), thumbnail_quality, &thumbnail_quality_c);
852 ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
853 enable_thumb_caching, &enable_thumb_caching_c);
855 subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
856 pref_checkbox_link_sensitivity(ct_button, subgroup);
858 button = pref_checkbox_new_int(subgroup, _("Use shared thumbnail cache"),
859 thumbnail_spec_standard, &thumbnail_spec_standard_c);
861 subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
862 pref_checkbox_link_sensitivity_swap(button, subgroup);
864 pref_checkbox_new_int(subgroup, _("Cache thumbnails into .thumbnails"),
865 enable_thumb_dirs, &enable_thumb_dirs_c);
868 pref_checkbox_new_int(subgroup, _("Use xvpics thumbnails when found (read only)"),
869 use_xvpics_thumbnails, &use_xvpics_thumbnails_c);
872 pref_checkbox_new_int(group, _("Faster jpeg thumbnailing (may reduce quality)"),
873 thumbnail_fast, &thumbnail_fast_c);
875 group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL);
877 slideshow_delay_c = slideshow_delay;
878 spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"),
879 SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1,
880 slideshow_delay ? (double)slideshow_delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
881 G_CALLBACK(slideshow_delay_cb), NULL);
882 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
884 pref_checkbox_new_int(group, _("Random"), slideshow_random, &slideshow_random_c);
885 pref_checkbox_new_int(group, _("Repeat"), slideshow_repeat, &slideshow_repeat_c);
889 vbox = gtk_vbox_new(FALSE, 0);
890 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
891 gtk_widget_show(vbox);
892 label = gtk_label_new(_("Image"));
893 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
895 group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL);
898 add_dither_menu(dither_quality, &dither_quality_c, _("Dithering method:"), group);
900 table = pref_table_new(group, 2, 1, FALSE, FALSE);
901 add_quality_menu(table, 0, 0, _("Quality:"), zoom_quality, &zoom_quality_c);
903 pref_checkbox_new_int(group, _("Two pass zooming"),
904 two_pass_zoom, &two_pass_zoom_c);
906 pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit."),
907 zoom_to_fit_expands, &zoom_to_fit_expands_c);
909 zoom_increment_c = zoom_increment;
910 spin = pref_spin_new(group, _("Zoom increment:"), NULL,
911 0.1, 4.0, 1.0, 1, (float)zoom_increment / 10.0,
912 G_CALLBACK(zoom_increment_cb), NULL);
913 gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
915 group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_VERTICAL);
917 zoom_mode_c = zoom_mode;
918 button = pref_radiobutton_new(group, NULL, _("Zoom to original size"),
919 (zoom_mode == ZOOM_RESET_ORIGINAL),
920 G_CALLBACK(zoom_mode_original_cb), NULL);
921 button = pref_radiobutton_new(group, button, _("Fit image to window"),
922 (zoom_mode == ZOOM_RESET_FIT_WINDOW),
923 G_CALLBACK(zoom_mode_fit_cb), NULL);
924 button = pref_radiobutton_new(group, button, _("Leave Zoom at previous setting"),
925 (zoom_mode == ZOOM_RESET_NONE),
926 G_CALLBACK(zoom_mode_none_cb), NULL);
928 group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
930 pref_checkbox_new_int(group, _("Black background"),
931 black_window_background, &black_window_background_c);
933 group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
935 pref_checkbox_new_int(group, _("Refresh on file change"),
936 update_on_time_change, &update_on_time_change_c);
937 pref_checkbox_new_int(group, _("Preload next image"),
938 enable_read_ahead, &enable_read_ahead_c);
939 pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
940 exif_rotate_enable, &exif_rotate_enable_c);
945 vbox = gtk_vbox_new(FALSE, 0);
946 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
947 gtk_widget_show(vbox);
948 label = gtk_label_new(_("Windows"));
949 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
951 group = pref_group_new(vbox, FALSE, _("State"), GTK_ORIENTATION_VERTICAL);
953 pref_checkbox_new_int(group, _("Remember window positions"),
954 save_window_positions, &save_window_positions_c);
955 pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
956 restore_tool, &restore_tool_c);
958 group = pref_group_new(vbox, FALSE, _("Size"), GTK_ORIENTATION_VERTICAL);
960 pref_checkbox_new_int(group, _("Fit window to image when tools are hidden/floating"),
961 fit_window, &fit_window_c);
963 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
964 ct_button = pref_checkbox_new_int(hbox, _("Limit size when auto-sizing window (%):"),
965 limit_window_size, &limit_window_size_c);
966 spin = pref_spin_new_int(hbox, NULL, NULL,
968 max_window_size, &max_window_size_c);
969 pref_checkbox_link_sensitivity(ct_button, spin);
971 group = pref_group_new(vbox, FALSE, _("Layout"), GTK_ORIENTATION_VERTICAL);
973 layout_widget = layout_config_new();
974 layout_config_set(layout_widget, layout_style, layout_order);
975 gtk_box_pack_start(GTK_BOX(group), layout_widget, FALSE, FALSE, 0);
976 gtk_widget_show(layout_widget);
981 vbox = gtk_vbox_new(FALSE, 0);
982 gtk_container_set_border_width(GTK_CONTAINER (vbox), PREF_PAD_BORDER);
983 gtk_widget_show(vbox);
984 label = gtk_label_new(_("Filtering"));
985 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
987 group = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
989 pref_checkbox_new_int(group, _("Show entries that begin with a dot"),
990 show_dot_files, &show_dot_files_c);
991 pref_checkbox_new_int(group, _("Case sensitive sort"),
992 file_sort_case_sensitive, &file_sort_case_sensitive_c);
994 ct_button = pref_checkbox_new_int(group, _("Disable File Filtering"),
995 file_filter_disable, &file_filter_disable_c);
997 group = pref_group_new(vbox, TRUE, _("File types"), GTK_ORIENTATION_VERTICAL);
999 frame = pref_group_parent(group);
1000 g_signal_connect(G_OBJECT(ct_button), "toggled",
1001 G_CALLBACK(filter_disable_cb), frame);
1002 gtk_widget_set_sensitive(frame, !file_filter_disable);
1004 scrolled = gtk_scrolled_window_new(NULL, NULL);
1005 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
1006 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1007 gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
1008 gtk_widget_show(scrolled);
1010 filter_store = gtk_list_store_new(1, G_TYPE_POINTER);
1011 filter_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter_store));
1012 g_object_unref(filter_store);
1013 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
1014 gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
1016 gtk_tree_view_set_enable_search(GTK_TREE_VIEW(filter_view), FALSE);
1018 column = gtk_tree_view_column_new();
1019 gtk_tree_view_column_set_title(column, _("Filter"));
1020 gtk_tree_view_column_set_resizable(column, TRUE);
1022 renderer = gtk_cell_renderer_toggle_new();
1023 g_signal_connect(G_OBJECT(renderer), "toggled",
1024 G_CALLBACK(filter_store_enable_cb), filter_store);
1025 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1026 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1027 GINT_TO_POINTER(FE_ENABLE), NULL);
1029 renderer = gtk_cell_renderer_text_new();
1030 g_signal_connect(G_OBJECT(renderer), "edited",
1031 G_CALLBACK(filter_store_ext_edit_cb), filter_store);
1032 gtk_tree_view_column_pack_start(column, renderer, TRUE);
1033 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
1034 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1035 GINT_TO_POINTER(FE_EXTENSION), NULL);
1036 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
1038 column = gtk_tree_view_column_new();
1039 gtk_tree_view_column_set_title(column, _("Description"));
1040 gtk_tree_view_column_set_resizable(column, TRUE);
1041 renderer = gtk_cell_renderer_text_new();
1042 g_signal_connect(G_OBJECT(renderer), "edited",
1043 G_CALLBACK(filter_store_desc_edit_cb), filter_store);
1044 g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
1045 gtk_tree_view_column_pack_start(column, renderer, FALSE);
1046 gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
1047 GINT_TO_POINTER(FE_DESCRIPTION), NULL);
1048 gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
1050 filter_store_populate();
1051 gtk_container_add(GTK_CONTAINER(scrolled), filter_view);
1052 gtk_widget_show(filter_view);
1054 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1056 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
1057 G_CALLBACK(filter_default_cb), NULL);
1058 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1059 gtk_widget_show(button);
1061 button = pref_button_new(NULL, GTK_STOCK_REMOVE, NULL, FALSE,
1062 G_CALLBACK(filter_remove_cb), filter_view);
1063 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1064 gtk_widget_show(button);
1066 button = pref_button_new(NULL, GTK_STOCK_ADD, NULL, FALSE,
1067 G_CALLBACK(filter_add_cb), NULL);
1068 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1069 gtk_widget_show(button);
1072 /* editor entry tab */
1074 vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
1075 gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
1076 gtk_widget_show(vbox);
1077 label = gtk_label_new(_("Editors"));
1078 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
1080 table = pref_table_new(vbox, 3, 9, FALSE, FALSE);
1081 gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
1083 label = pref_table_label(table, 0, 0, _("#"), 1.0);
1084 pref_label_bold(label, TRUE, FALSE);
1086 label = pref_table_label(table, 1, 0, _("Menu name"), 0.0);
1087 pref_label_bold(label, TRUE, FALSE);
1089 label = pref_table_label(table, 2, 0, ("Command Line"), 0.0);
1090 pref_label_bold(label, TRUE, FALSE);
1092 for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
1096 buf = g_strdup_printf("%d", i+1);
1097 pref_table_label(table, 0, i+1, buf, 1.0);
1100 editor_name_entry[i] = gtk_entry_new();
1101 gtk_entry_set_max_length(GTK_ENTRY(editor_name_entry[i]), EDITOR_NAME_MAX_LENGTH);
1102 gtk_widget_set_size_request(editor_name_entry[i],80,-1);
1103 if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]);
1104 gtk_table_attach(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2,
1105 GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
1106 gtk_widget_show(editor_name_entry[i]);
1108 editor_command_entry[i] = gtk_entry_new();
1109 gtk_entry_set_max_length(GTK_ENTRY(editor_command_entry[i]), EDITOR_COMMAND_MAX_LENGTH);
1110 gtk_widget_set_size_request(editor_command_entry[i],160,-1);
1111 tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL);
1112 if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]);
1113 gtk_table_attach(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2,
1114 GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
1115 gtk_widget_show(editor_command_entry[i]);
1118 hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1120 button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
1121 G_CALLBACK(editor_default_cb), NULL);
1122 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1123 gtk_widget_show(button);
1125 button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
1126 G_CALLBACK(editor_help_cb), NULL);
1127 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1128 gtk_widget_show(button);
1130 /* advanced entry tab */
1132 scrolled = gtk_scrolled_window_new(NULL, NULL);
1133 gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
1134 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
1135 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1136 label = gtk_label_new(_("Advanced"));
1137 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
1138 gtk_widget_show(scrolled);
1140 viewport = gtk_viewport_new(NULL, NULL);
1141 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
1142 gtk_container_add(GTK_CONTAINER(scrolled), viewport);
1143 gtk_widget_show(viewport);
1145 vbox = gtk_vbox_new(FALSE, 0);
1146 gtk_container_add(GTK_CONTAINER(viewport), vbox);
1147 gtk_widget_show(vbox);
1149 group = pref_group_new(vbox, FALSE, _("Full screen"), GTK_ORIENTATION_VERTICAL);
1151 fullscreen_screen_c = fullscreen_screen;
1152 fullscreen_above_c = fullscreen_above;
1153 hbox = fullscreen_prefs_selection_new(_("Location:"), &fullscreen_screen_c, &fullscreen_above_c);
1154 gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
1155 gtk_widget_show(hbox);
1157 pref_checkbox_new_int(group, _("Smooth image flip"),
1158 fullscreen_clean_flip, &fullscreen_clean_flip_c);
1159 pref_checkbox_new_int(group, _("Disable screen saver"),
1160 fullscreen_disable_saver, &fullscreen_disable_saver_c);
1162 group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL);
1164 pref_checkbox_new_int(group, _("Confirm file delete"),
1165 confirm_delete, &confirm_delete_c);
1166 pref_checkbox_new_int(group, _("Enable Delete key"),
1167 enable_delete_key, &enable_delete_key_c);
1169 ct_button = pref_checkbox_new_int(group, _("Safe delete"),
1170 safe_delete_enable, &safe_delete_enable_c);
1172 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
1173 pref_checkbox_link_sensitivity(ct_button, hbox);
1175 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_SPACE);
1176 pref_label_new(hbox, _("Folder:"));
1178 tabcomp = tab_completion_new(&safe_delete_path_entry, safe_delete_path, NULL, NULL);
1179 tab_completion_add_select_button(safe_delete_path_entry, NULL, TRUE);
1180 gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
1181 gtk_widget_show(tabcomp);
1183 hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
1184 pref_checkbox_link_sensitivity(ct_button, hbox);
1186 pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP);
1187 pref_spin_new_int(hbox, _("Maximum size:"), _("MB"),
1188 1, 500, 1, safe_delete_size, &safe_delete_size_c);
1190 button = pref_button_new(NULL, NULL, _("View"), FALSE,
1191 G_CALLBACK(safe_delete_view_cb), NULL);
1192 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1193 gtk_widget_show(button);
1195 button = pref_button_new(NULL, GTK_STOCK_CLEAR, NULL, FALSE,
1196 G_CALLBACK(safe_delete_clear_cb), NULL);
1197 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1198 gtk_widget_show(button);
1200 group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
1202 pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
1203 collection_rectangular_selection, &collection_rectangular_selection_c);
1205 pref_checkbox_new_int(group, _("Descend folders in tree view"),
1206 tree_descend_subdirs, &tree_descend_subdirs_c);
1208 pref_checkbox_new_int(group, _("In place renaming"),
1209 enable_in_place_rename, &enable_in_place_rename_c);
1211 group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
1213 pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
1214 progressive_key_scrolling, &progressive_key_scrolling_c);
1215 pref_checkbox_new_int(group, _("Mouse wheel scrolls image"),
1216 mousewheel_scrolls, &mousewheel_scrolls_c);
1218 group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL);
1220 pref_checkbox_new_int(group, _("Store keywords and comments local to source images"),
1221 enable_metadata_dirs, &enable_metadata_dirs_c);
1223 pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
1224 0, 100, 1, dupe_custom_threshold, &dupe_custom_threshold_c);
1226 pref_spin_new_int(group, _("Offscreen cache size (Mb per image):"), NULL,
1227 0, 128, 1, tile_cache_max, &tile_cache_max_c);
1229 gtk_widget_show(notebook);
1231 gtk_widget_show(configwindow);
1235 *-----------------------------------------------------------------------------
1236 * config window show (public)
1237 *-----------------------------------------------------------------------------
1240 void show_config_window(void)
1244 gtk_window_present(GTK_WINDOW(configwindow));
1248 config_window_create();
1257 static GtkWidget *about = NULL;
1259 static gint about_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
1261 gtk_widget_destroy(about);
1267 static void about_window_close(GtkWidget *widget, gpointer data)
1271 gtk_widget_destroy(about);
1275 static void about_credits_cb(GtkWidget *widget, gpointer data)
1277 help_window_show("credits");
1280 void show_about_window(void)
1292 gtk_window_present(GTK_WINDOW(about));
1296 about = gtk_window_new(GTK_WINDOW_TOPLEVEL);
1297 gtk_window_set_type_hint(GTK_WINDOW(about), GDK_WINDOW_TYPE_HINT_DIALOG);
1298 gtk_window_set_wmclass(GTK_WINDOW(about), "about", "GQview");
1299 g_signal_connect(G_OBJECT(about), "delete_event",
1300 G_CALLBACK(about_delete_cb), NULL);
1302 gtk_window_set_title(GTK_WINDOW(about), _("About - GQview"));
1303 gtk_container_set_border_width(GTK_CONTAINER(about), PREF_PAD_BORDER);
1305 vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
1306 gtk_container_add(GTK_CONTAINER(about), vbox);
1307 gtk_widget_show(vbox);
1309 pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
1310 button = gtk_image_new_from_pixbuf(pixbuf);
1311 g_object_unref(pixbuf);
1312 gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
1313 gtk_widget_show(button);
1315 buf = g_strdup_printf(_("GQview %s\n\nCopyright (c) %s John Ellis\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
1318 "gqview.sourceforge.net",
1319 "gqview@users.sourceforge.net");
1320 label = gtk_label_new(buf);
1323 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
1324 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
1325 gtk_widget_show(label);
1327 hbox = gtk_hbutton_box_new();
1328 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
1329 gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
1330 gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1331 gtk_widget_show(hbox);
1333 button = pref_button_new(NULL, NULL, _("Credits..."), FALSE,
1334 G_CALLBACK(about_credits_cb), NULL);
1335 gtk_container_add(GTK_CONTAINER(hbox), button);
1336 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1337 gtk_widget_show(button);
1339 button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
1340 G_CALLBACK(about_window_close), NULL);
1341 gtk_container_add(GTK_CONTAINER(hbox), button);
1342 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
1343 gtk_widget_grab_default(button);
1344 gtk_widget_show(button);
1346 window_set_icon(about, NULL, NULL);
1347 gtk_widget_show(about);