2 * Copyright © 200-2003 Marco Pesenti Gritti
3 * Copyright © 2003, 2004, 2005 Christian Persch
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 * $Id: prefs-dialog.c 7032 2007-05-19 16:40:23Z chpe $
24 #include "prefs-dialog.h"
25 #include "ephy-dialog.h"
26 #include "ephy-prefs.h"
27 #include "ephy-embed-shell.h"
28 #include "ephy-favicon-cache.h"
29 #include "ephy-session.h"
30 #include "ephy-embed-prefs.h"
31 #include "ephy-embed-single.h"
32 #include "ephy-shell.h"
34 #include "eel-gconf-extensions.h"
35 #include "ephy-langs.h"
36 #include "ephy-encodings.h"
37 #include "ephy-debug.h"
38 #include "ephy-file-chooser.h"
39 #include "ephy-file-helpers.h"
40 #include "ephy-tree-model-node.h"
41 #include "ephy-tree-model-sort.h"
43 #include <glib/gi18n.h>
44 #include <gtk/gtklabel.h>
45 #include <gtk/gtkcellrenderertext.h>
46 #include <gtk/gtkcelllayout.h>
47 #include <gtk/gtktreeselection.h>
48 #include <gtk/gtkframe.h>
49 #include <gtk/gtkhbox.h>
50 #include <gtk/gtkvbox.h>
51 #include <gtk/gtkradiobutton.h>
52 #include <gtk/gtktogglebutton.h>
53 #include <gtk/gtkcombobox.h>
54 #include <gtk/gtktreemodel.h>
55 #include <gtk/gtkliststore.h>
56 #include <gtk/gtkimage.h>
57 #include <gtk/gtklabel.h>
58 #include <gtk/gtkstock.h>
59 #include <gtk/gtknotebook.h>
60 #include <gtk/gtkfilechooserbutton.h>
61 #include <gtk/gtkmain.h>
64 #include <libgnomevfs/gnome-vfs-utils.h>
66 #define CONF_FONTS_FOR_LANGUAGE "/apps/epiphany/dialogs/preferences_font_language"
67 #define DOWNLOAD_BUTTON_WIDTH 8
69 static void prefs_dialog_class_init (PrefsDialogClass
*klass
);
70 static void prefs_dialog_init (PrefsDialog
*pd
);
72 #include "languages.h"
74 static const char * const cookies_accept_enum
[] =
76 "anywhere", "current site", "nowhere"
85 static const char * const fonts_types
[] =
98 static const char * const size_prefs
[] =
100 CONF_RENDERING_FONT_FIXED_SIZE
,
101 CONF_RENDERING_FONT_VAR_SIZE
,
102 CONF_RENDERING_FONT_MIN_SIZE
105 static const int default_size
[] =
119 HOMEPAGE_CURRENT_PROP
,
122 DOWNLOAD_PATH_HBOX_PROP
,
123 DOWNLOAD_PATH_LABEL_PROP
,
125 /* Fonts and Colors */
128 FONT_PREFS_BUTTON_PROP
,
133 CSS_EDIT_BUTTON_PROP
,
140 REMEMBER_PASSWORDS_PROP
,
142 CLEAR_CACHE_BUTTON_PROP
,
146 DEFAULT_ENCODING_PROP
,
147 DEFAULT_ENCODING_LABEL_PROP
,
148 AUTO_ENCODING_LABEL_PROP
,
149 LANGUAGE_ADD_BUTTON_PROP
,
150 LANGUAGE_REMOVE_BUTTON_PROP
,
151 LANGUAGE_UP_BUTTON_PROP
,
152 LANGUAGE_DOWN_BUTTON_PROP
,
153 LANGUAGE_TREEVIEW_PROP
157 EphyDialogProperty properties
[] =
159 { "prefs_dialog", NULL
, PT_NORMAL
, 0},
160 { "prefs_notebook", NULL
, PT_NORMAL
, 0},
163 { "homepage_entry", CONF_GENERAL_HOMEPAGE
, PT_AUTOAPPLY
, G_TYPE_STRING
},
164 { "homepage_current_button", NULL
, PT_NORMAL
, 0 },
165 { "homepage_blank_button", NULL
, PT_NORMAL
, 0 },
166 { "automatic_downloads_checkbutton", CONF_AUTO_DOWNLOADS
, PT_AUTOAPPLY
, 0 },
167 { "download_button_hbox", NULL
, PT_NORMAL
, 0 },
168 { "download_button_label", NULL
, PT_NORMAL
, 0 },
170 /* Fonts and Colors */
171 { "use_fonts_checkbutton", CONF_RENDERING_USE_OWN_FONTS
, PT_AUTOAPPLY
| PT_INVERTED
, 0 },
172 { "min_size_spinbutton", CONF_RENDERING_FONT_MIN_SIZE
, PT_AUTOAPPLY
, 0 },
173 { "font_prefs_button", NULL
, PT_NORMAL
, 0 },
174 { "use_colors_checkbutton", CONF_RENDERING_USE_OWN_COLORS
, PT_AUTOAPPLY
| PT_INVERTED
, 0 },
175 { "css_container", NULL
, PT_NORMAL
, 0 },
176 { "css_checkbox", CONF_USER_CSS_ENABLED
, PT_AUTOAPPLY
, 0 },
177 { "css_edit_box", NULL
, PT_NORMAL
, 0 },
178 { "css_edit_button", NULL
, PT_NORMAL
, 0 },
181 { "popups_allow_checkbutton", CONF_SECURITY_ALLOW_POPUPS
, PT_AUTOAPPLY
, 0 },
182 { "enable_java_checkbutton", CONF_SECURITY_JAVA_ENABLED
, PT_AUTOAPPLY
, 0 },
183 { "enable_javascript_checkbutton", CONF_SECURITY_JAVASCRIPT_ENABLED
, PT_AUTOAPPLY
, 0 },
184 { "cookies_radiobutton", CONF_SECURITY_COOKIES_ACCEPT
, PT_AUTOAPPLY
, G_TYPE_STRING
},
185 { "remember_passwords_checkbutton", CONF_PRIVACY_REMEMBER_PASSWORDS
, PT_AUTOAPPLY
, 0 },
186 { "disk_cache_spin", CONF_NETWORK_CACHE_SIZE
, PT_AUTOAPPLY
, 0 },
187 { "clear_cache_button", NULL
, PT_NORMAL
, 0 },
190 { "auto_encoding_combo", CONF_LANGUAGE_AUTODETECT_ENCODING
, PT_AUTOAPPLY
, G_TYPE_STRING
},
191 { "default_encoding_combo", CONF_LANGUAGE_DEFAULT_ENCODING
, PT_AUTOAPPLY
, G_TYPE_STRING
},
192 { "default_encoding_label", NULL
, PT_NORMAL
, 0 },
193 { "auto_encoding_label", NULL
, PT_NORMAL
, 0 },
194 { "lang_add_button", NULL
, PT_NORMAL
, 0 },
195 { "lang_remove_button", NULL
, PT_NORMAL
, 0 },
196 { "lang_up_button", NULL
, PT_NORMAL
, 0 },
197 { "lang_down_button", NULL
, PT_NORMAL
, 0 },
198 { "lang_treeview", NULL
, PT_NORMAL
, 0 },
207 LANGUAGE_ACCEPT_BUTTON_PROP
211 EphyDialogProperty add_lang_props
[] =
213 { "add_language_dialog", NULL
, PT_NORMAL
, 0 },
214 { "languages_treeview", NULL
, PT_NORMAL
, G_TYPE_STRING
},
215 { "add_button", NULL
, PT_NORMAL
, 0 },
225 FONTS_MONOSPACE_PROP
,
226 FONTS_VARIABLE_SIZE_PROP
,
227 FONTS_FIXED_SIZE_PROP
,
232 EphyDialogProperty fonts_properties
[] =
234 { "fonts_dialog", NULL
, PT_NORMAL
, 0},
235 { "fonts_language_combo", CONF_FONTS_FOR_LANGUAGE
, PT_AUTOAPPLY
, G_TYPE_STRING
},
236 { "variable_combo", NULL
, PT_AUTOAPPLY
, G_TYPE_STRING
},
237 { "monospace_combo", NULL
, PT_AUTOAPPLY
, G_TYPE_STRING
},
238 { "variable_size_spinbutton", NULL
, PT_AUTOAPPLY
, 0 },
239 { "fixed_size_spinbutton", NULL
, PT_AUTOAPPLY
, 0 },
240 { "min_size_spinbutton", NULL
, PT_AUTOAPPLY
, 0 },
272 COL_AUTODETECTOR_NAME
,
273 COL_AUTODETECTOR_DATA
,
274 COL_AUTODETECTOR_IS_SEP
277 #define EPHY_PREFS_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_PREFS_DIALOG, PrefsDialogPrivate))
279 struct PrefsDialogPrivate
281 GtkTreeView
*lang_treeview
;
282 GtkTreeModel
*lang_model
;
283 EphyDialog
*fonts_dialog
;
284 EphyDialog
*add_lang_dialog
;
285 GtkWidget
*lang_add_button
;
286 GtkWidget
*lang_remove_button
;
287 GtkWidget
*lang_up_button
;
288 GtkWidget
*lang_down_button
;
289 GHashTable
*iso_639_table
;
290 GHashTable
*iso_3166_table
;
293 static GObjectClass
*parent_class
= NULL
;
296 prefs_dialog_get_type (void)
298 static GType type
= 0;
300 if (G_UNLIKELY (type
== 0))
302 const GTypeInfo our_info
=
304 sizeof (PrefsDialogClass
),
305 NULL
, /* base_init */
306 NULL
, /* base_finalize */
307 (GClassInitFunc
) prefs_dialog_class_init
,
309 NULL
, /* class_data */
310 sizeof (PrefsDialog
),
312 (GInstanceInitFunc
) prefs_dialog_init
315 type
= g_type_register_static (EPHY_TYPE_DIALOG
,
324 prefs_dialog_finalize (GObject
*object
)
326 PrefsDialog
*dialog
= EPHY_PREFS_DIALOG (object
);
327 PrefsDialogPrivate
*priv
= dialog
->priv
;
329 if (priv
->fonts_dialog
!= NULL
)
331 EphyDialog
**fonts_dialog
= &priv
->fonts_dialog
;
333 g_object_remove_weak_pointer
334 (G_OBJECT (priv
->fonts_dialog
),
335 (gpointer
*) fonts_dialog
);
336 g_object_unref (priv
->fonts_dialog
);
339 if (priv
->add_lang_dialog
!= NULL
)
341 EphyDialog
**add_lang_dialog
= &priv
->add_lang_dialog
;
343 g_object_remove_weak_pointer
344 (G_OBJECT (priv
->add_lang_dialog
),
345 (gpointer
*) add_lang_dialog
);
346 g_object_unref (priv
->add_lang_dialog
);
349 g_hash_table_destroy (priv
->iso_639_table
);
350 g_hash_table_destroy (priv
->iso_3166_table
);
352 G_OBJECT_CLASS (parent_class
)->finalize (object
);
356 prefs_dialog_class_init (PrefsDialogClass
*klass
)
358 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
360 parent_class
= g_type_class_peek_parent (klass
);
362 object_class
->finalize
= prefs_dialog_finalize
;
364 g_type_class_add_private (object_class
, sizeof(PrefsDialogPrivate
));
368 prefs_dialog_show_help (EphyDialog
*dialog
)
370 GtkWidget
*window
, *notebook
;
373 static const char help_preferences
[][28] = {
374 "general-preferences",
375 "fonts-and-style-preferences",
376 "privacy-preferences",
377 "language-preferences"
380 ephy_dialog_get_controls (dialog
,
381 properties
[WINDOW_PROP
].id
, &window
,
382 properties
[NOTEBOOK_PROP
].id
, ¬ebook
,
385 id
= gtk_notebook_get_current_page (GTK_NOTEBOOK (notebook
));
386 id
= CLAMP (id
, 0, 3);
388 ephy_gui_help (GTK_WINDOW (window
), "epiphany", help_preferences
[id
]);
392 setup_font_combo (EphyDialog
*dialog
,
402 EphyEmbedSingle
*single
;
404 single
= EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (embed_shell
));
405 fonts
= ephy_embed_single_get_font_list (single
, code
);
406 fonts
= g_list_sort (fonts
, (GCompareFunc
) strcmp
);
408 g_snprintf (key
, 255, "%s_%s_%s", CONF_RENDERING_FONT
, type
, code
);
410 combo
= ephy_dialog_get_control (dialog
, fonts_properties
[prop
].id
);
411 store
= gtk_list_store_new (3, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_BOOLEAN
);
413 gtk_list_store_append (store
, &iter
);
414 gtk_list_store_set (store
, &iter
,
415 COL_FONT_NAME
, _("Default"),
417 COL_FONT_IS_SEP
, FALSE
,
419 gtk_list_store_append (store
, &iter
);
420 gtk_list_store_set (store
, &iter
,
423 COL_FONT_IS_SEP
, TRUE
,
426 for (l
= fonts
; l
!= NULL
; l
= l
->next
)
428 gtk_list_store_append (store
, &iter
);
429 gtk_list_store_set (store
, &iter
,
430 COL_FONT_NAME
, (char *) l
->data
,
431 COL_FONT_DATA
, (char *) l
->data
,
432 COL_FONT_IS_SEP
, FALSE
,
435 g_list_foreach (fonts
, (GFunc
) g_free
, NULL
);
438 ephy_dialog_set_pref (dialog
, fonts_properties
[prop
].id
, NULL
);
440 gtk_combo_box_set_model (GTK_COMBO_BOX (combo
), GTK_TREE_MODEL (store
));
441 gtk_combo_box_set_active (GTK_COMBO_BOX (combo
), -1);
443 ephy_dialog_set_pref (dialog
, fonts_properties
[prop
].id
, key
);
445 g_object_unref (store
);
449 fonts_language_changed_cb (EphyDialog
*dialog
,
457 code
= g_value_get_string (value
);
459 LOG ("fonts language combo changed, new code '%s'", code
);
461 setup_font_combo (dialog
, "variable", code
, FONTS_VARIABLE_PROP
);
462 setup_font_combo (dialog
, "monospace", code
, FONTS_MONOSPACE_PROP
);
464 g_snprintf (key
, sizeof (key
), "%s_%s", size_prefs
[FONT_SIZE_VAR
], code
);
465 size
= eel_gconf_get_integer (key
);
468 eel_gconf_set_integer (key
, default_size
[FONT_SIZE_VAR
]);
470 ephy_dialog_set_pref (dialog
, fonts_properties
[FONTS_VARIABLE_SIZE_PROP
].id
, key
);
472 g_snprintf (key
, sizeof (key
), "%s_%s", size_prefs
[FONT_SIZE_FIXED
], code
);
473 size
= eel_gconf_get_integer (key
);
476 eel_gconf_set_integer (key
, default_size
[FONT_SIZE_FIXED
]);
478 ephy_dialog_set_pref (dialog
, fonts_properties
[FONTS_FIXED_SIZE_PROP
].id
, key
);
480 g_snprintf (key
, sizeof (key
), "%s_%s", size_prefs
[FONT_SIZE_MIN
], code
);
481 size
= eel_gconf_get_integer (key
);
484 eel_gconf_set_integer (key
, default_size
[FONT_SIZE_MIN
]);
486 ephy_dialog_set_pref (dialog
, fonts_properties
[FONTS_MIN_SIZE_PROP
].id
, key
);
490 font_prefs_dialog_response_cb (GtkWidget
*widget
,
494 if (response
== GTK_RESPONSE_HELP
)
496 ephy_gui_help (GTK_WINDOW (widget
), "epiphany", "fonts-and-style-preferences");
500 g_object_unref (dialog
);
504 row_is_separator (GtkTreeModel
*model
,
508 int column
= GPOINTER_TO_INT (data
);
511 gtk_tree_model_get (model
, iter
, column
, &is_sep
, -1);
517 setup_fonts_dialog (PrefsDialog
*pd
)
520 GtkWidget
*window
, *parent
, *variable_combo
, *monospace_combo
;
522 GtkCellRenderer
*renderer
;
524 GtkTreeModel
*sortmodel
;
526 guint n_fonts_languages
, i
;
527 const EphyFontsLanguageInfo
*fonts_languages
;
529 parent
= ephy_dialog_get_control (EPHY_DIALOG (pd
),
530 properties
[WINDOW_PROP
].id
);
532 dialog
= EPHY_DIALOG (g_object_new (EPHY_TYPE_DIALOG
,
533 "parent-window", parent
,
536 ephy_dialog_construct (dialog
, fonts_properties
,
537 ephy_file ("prefs-dialog.glade"),
538 "fonts_dialog", NULL
);
540 ephy_dialog_get_controls
542 fonts_properties
[FONTS_WINDOW_PROP
].id
, &window
,
543 fonts_properties
[FONTS_LANGUAGE_PROP
].id
, &combo
,
544 fonts_properties
[FONTS_VARIABLE_PROP
].id
, &variable_combo
,
545 fonts_properties
[FONTS_MONOSPACE_PROP
].id
, &monospace_combo
,
548 gtk_window_group_add_window (ephy_gui_ensure_window_group (GTK_WINDOW (parent
)),
549 GTK_WINDOW (window
));
550 g_signal_connect (window
, "response",
551 G_CALLBACK (font_prefs_dialog_response_cb
), dialog
);
553 renderer
= gtk_cell_renderer_text_new ();
554 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (variable_combo
), renderer
, TRUE
);
555 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (variable_combo
), renderer
,
556 "text", COL_FONT_NAME
,
558 ephy_dialog_set_data_column (dialog
, fonts_properties
[FONTS_VARIABLE_PROP
].id
,
560 renderer
= gtk_cell_renderer_text_new ();
561 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (monospace_combo
), renderer
, TRUE
);
562 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (monospace_combo
), renderer
,
563 "text", COL_FONT_NAME
,
565 ephy_dialog_set_data_column (dialog
, fonts_properties
[FONTS_MONOSPACE_PROP
].id
,
568 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (variable_combo
),
569 (GtkTreeViewRowSeparatorFunc
) row_is_separator
,
570 GINT_TO_POINTER (COL_FONT_IS_SEP
), NULL
);
571 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (monospace_combo
),
572 (GtkTreeViewRowSeparatorFunc
) row_is_separator
,
573 GINT_TO_POINTER (COL_FONT_IS_SEP
), NULL
);
575 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_STRING
);
577 fonts_languages
= ephy_font_languages ();
578 n_fonts_languages
= ephy_font_n_languages ();
580 for (i
= 0; i
< n_fonts_languages
; i
++)
582 gtk_list_store_append (store
, &iter
);
583 gtk_list_store_set (store
, &iter
,
584 COL_FONTS_LANG_NAME
, Q_(fonts_languages
[i
].title
),
585 COL_FONTS_LANG_CODE
, fonts_languages
[i
].code
,
589 sortmodel
= gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store
));
590 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sortmodel
),
594 gtk_combo_box_set_model (GTK_COMBO_BOX (combo
), sortmodel
);
596 renderer
= gtk_cell_renderer_text_new ();
597 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo
), renderer
, TRUE
);
598 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo
), renderer
,
599 "text", COL_FONTS_LANG_NAME
,
602 ephy_dialog_set_data_column (dialog
, fonts_properties
[FONTS_LANGUAGE_PROP
].id
, COL_FONTS_LANG_CODE
);
604 g_signal_connect (dialog
, "changed::fonts_language_combo",
605 G_CALLBACK (fonts_language_changed_cb
),
608 g_object_unref (store
);
609 g_object_unref (sortmodel
);
615 font_prefs_button_clicked_cb (GtkWidget
*button
,
618 PrefsDialogPrivate
*priv
= pd
->priv
;
620 if (priv
->fonts_dialog
== NULL
)
622 EphyDialog
**fonts_dialog
;
624 priv
->fonts_dialog
= setup_fonts_dialog (pd
);
626 fonts_dialog
= &priv
->fonts_dialog
;
628 g_object_add_weak_pointer
629 (G_OBJECT (priv
->fonts_dialog
),
630 (gpointer
*) fonts_dialog
);
633 ephy_dialog_show (priv
->fonts_dialog
);
637 css_checkbox_toggled (GtkToggleButton
*button
,
640 g_object_set (widget
, "sensitive", gtk_toggle_button_get_active (button
), NULL
);
644 css_edit_button_clicked_cb (GtkWidget
*button
,
647 char *css_file
, *uri
;
649 css_file
= g_build_filename (ephy_dot_dir (),
650 USER_STYLESHEET_FILENAME
,
652 uri
= gnome_vfs_get_uri_from_local_path (css_file
);
654 ephy_file_launch_handler ("text/plain", uri
,
655 gtk_get_current_event_time ());
662 create_node_combo (EphyDialog
*dialog
,
664 EphyEncodings
*encodings
,
667 const char *default_value
)
669 EphyTreeModelNode
*nodemodel
;
670 GtkTreeModel
*sortmodel
;
672 GtkCellRenderer
*renderer
;
674 int title_col
, data_col
;
676 code
= eel_gconf_get_string (key
);
677 if (code
== NULL
|| ephy_encodings_get_node (encodings
, code
, FALSE
) == NULL
)
680 eel_gconf_set_string (key
, default_value
);
684 combo
= GTK_COMBO_BOX (ephy_dialog_get_control (dialog
, properties
[prop
].id
));
686 nodemodel
= ephy_tree_model_node_new (node
);
688 title_col
= ephy_tree_model_node_add_prop_column
689 (nodemodel
, G_TYPE_STRING
, EPHY_NODE_ENCODING_PROP_TITLE_ELIDED
);
690 data_col
= ephy_tree_model_node_add_prop_column
691 (nodemodel
, G_TYPE_STRING
, EPHY_NODE_ENCODING_PROP_ENCODING
);
693 sortmodel
= ephy_tree_model_sort_new (GTK_TREE_MODEL (nodemodel
));
695 gtk_tree_sortable_set_sort_column_id
696 (GTK_TREE_SORTABLE (sortmodel
), title_col
, GTK_SORT_ASCENDING
);
698 gtk_combo_box_set_model (combo
, GTK_TREE_MODEL (sortmodel
));
700 renderer
= gtk_cell_renderer_text_new ();
701 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo
), renderer
, TRUE
);
702 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo
), renderer
,
706 ephy_dialog_set_data_column (dialog
, properties
[prop
].id
, data_col
);
708 g_object_unref (nodemodel
);
709 g_object_unref (sortmodel
);
713 create_autodetectors_combo (EphyDialog
*dialog
,
715 EphyEncodings
*encodings
,
718 const char *default_value
)
724 GtkCellRenderer
*renderer
;
726 const char *off_title
= NULL
;
729 code
= eel_gconf_get_string (key
);
730 if (code
== NULL
|| ephy_encodings_get_node (encodings
, code
, FALSE
) == NULL
)
733 eel_gconf_set_string (key
, default_value
);
737 combo
= GTK_COMBO_BOX (ephy_dialog_get_control (dialog
, properties
[prop
].id
));
739 store
= gtk_list_store_new (3, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_BOOLEAN
);
741 children
= ephy_node_get_children (node
);
742 for (i
= 0; i
< children
->len
; ++i
)
744 EphyNode
*kid
= g_ptr_array_index (children
, i
);
745 const char *code
, *title
;
747 code
= ephy_node_get_property_string (kid
, EPHY_NODE_ENCODING_PROP_ENCODING
);
748 g_return_if_fail (code
!= NULL
);
750 title
= ephy_node_get_property_string (kid
, EPHY_NODE_ENCODING_PROP_TITLE_ELIDED
);
757 gtk_list_store_insert_with_values (store
, &iter
, -1,
758 COL_AUTODETECTOR_NAME
, title
,
759 COL_AUTODETECTOR_DATA
, code
,
760 COL_AUTODETECTOR_IS_SEP
, FALSE
,
765 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store
),
766 COL_AUTODETECTOR_NAME
,
768 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store
),
769 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID
,
772 g_assert (off_title
!= NULL
);
774 gtk_list_store_insert_with_values (store
, &iter
, 0,
775 COL_AUTODETECTOR_NAME
, off_title
,
776 COL_AUTODETECTOR_DATA
, "",
777 COL_AUTODETECTOR_IS_SEP
, FALSE
,
779 gtk_list_store_insert_with_values (store
, &iter
, 1,
780 COL_AUTODETECTOR_NAME
, NULL
,
781 COL_AUTODETECTOR_DATA
, "",
782 COL_AUTODETECTOR_IS_SEP
, TRUE
,
785 gtk_combo_box_set_model (combo
, GTK_TREE_MODEL (store
));
786 g_object_unref (store
);
788 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo
),
789 (GtkTreeViewRowSeparatorFunc
) row_is_separator
,
790 GINT_TO_POINTER (COL_AUTODETECTOR_IS_SEP
), NULL
);
793 renderer
= gtk_cell_renderer_text_new ();
794 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo
), renderer
, TRUE
);
795 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo
), renderer
,
796 "text", COL_AUTODETECTOR_NAME
,
799 ephy_dialog_set_data_column (dialog
, properties
[prop
].id
, COL_AUTODETECTOR_DATA
);
803 language_editor_add (PrefsDialog
*pd
,
809 g_return_if_fail (code
!= NULL
&& desc
!= NULL
);
811 if (gtk_tree_model_get_iter_first (pd
->priv
->lang_model
, &iter
))
817 gtk_tree_model_get (pd
->priv
->lang_model
, &iter
,
821 if (strcmp (code
, c
) == 0)
825 /* already in list, don't allow a duplicate */
830 while (gtk_tree_model_iter_next (pd
->priv
->lang_model
, &iter
));
833 gtk_list_store_append (GTK_LIST_STORE (pd
->priv
->lang_model
), &iter
);
835 gtk_list_store_set (GTK_LIST_STORE (pd
->priv
->lang_model
), &iter
,
842 language_editor_update_pref (PrefsDialog
*pd
)
845 GSList
*codes
= NULL
;
847 if (gtk_tree_model_get_iter_first (pd
->priv
->lang_model
, &iter
))
853 gtk_tree_model_get (pd
->priv
->lang_model
, &iter
,
854 COL_LANG_CODE
, &code
,
857 codes
= g_slist_prepend (codes
, code
);
859 while (gtk_tree_model_iter_next (pd
->priv
->lang_model
, &iter
));
862 codes
= g_slist_reverse (codes
);
863 eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE
, codes
);
865 g_slist_foreach (codes
, (GFunc
) g_free
, NULL
);
866 g_slist_free (codes
);
870 language_editor_update_buttons (PrefsDialog
*dialog
)
872 GtkTreeSelection
*selection
;
876 gboolean can_remove
= FALSE
, can_move_up
= FALSE
, can_move_down
= FALSE
;
879 selection
= gtk_tree_view_get_selection (dialog
->priv
->lang_treeview
);
881 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
883 path
= gtk_tree_model_get_path (model
, &iter
);
885 selected
= gtk_tree_path_get_indices (path
)[0];
888 can_move_up
= selected
> 0;
890 selected
< gtk_tree_model_iter_n_children (model
, NULL
) - 1;
892 gtk_tree_path_free (path
);
895 gtk_widget_set_sensitive (dialog
->priv
->lang_remove_button
, can_remove
);
896 gtk_widget_set_sensitive (dialog
->priv
->lang_up_button
, can_move_up
);
897 gtk_widget_set_sensitive (dialog
->priv
->lang_down_button
, can_move_down
);
901 add_lang_dialog_selection_changed (GtkTreeSelection
*selection
,
907 button
= ephy_dialog_get_control (dialog
, add_lang_props
[LANGUAGE_ACCEPT_BUTTON_PROP
].id
);
909 n_selected
= gtk_tree_selection_count_selected_rows (selection
);
910 gtk_widget_set_sensitive (button
, n_selected
> 0);
914 add_lang_dialog_response_cb (GtkWidget
*widget
,
918 EphyDialog
*dialog
= pd
->priv
->add_lang_dialog
;
919 GtkTreeView
*treeview
;
921 GtkTreeSelection
*selection
;
925 g_return_if_fail (dialog
!= NULL
);
927 if (response
== GTK_RESPONSE_ACCEPT
)
929 treeview
= GTK_TREE_VIEW (ephy_dialog_get_control
930 (dialog
, add_lang_props
[LANGUAGE_PROP
].id
));
931 selection
= gtk_tree_view_get_selection (treeview
);
933 rows
= gtk_tree_selection_get_selected_rows (selection
, &model
);
935 for (r
= rows
; r
!= NULL
; r
= r
->next
)
937 GtkTreePath
*path
= (GtkTreePath
*) r
->data
;
939 if (gtk_tree_model_get_iter (model
, &iter
, path
))
943 gtk_tree_model_get (model
, &iter
,
944 COL_LANG_NAME
, &desc
,
945 COL_LANG_CODE
, &code
,
948 language_editor_add (pd
, code
, desc
);
955 g_list_foreach (rows
, (GFunc
) gtk_tree_path_free
, NULL
);
958 language_editor_update_pref (pd
);
959 language_editor_update_buttons (pd
);
962 g_object_unref (dialog
);
966 get_name_for_lang_code (PrefsDialog
*pd
,
971 const char *langname
, *localename
;
974 str
= g_strsplit (code
, "-", -1);
975 len
= g_strv_length (str
);
976 g_return_val_if_fail (len
!= 0, NULL
);
978 langname
= (const char *) g_hash_table_lookup (pd
->priv
->iso_639_table
, str
[0]);
980 if (len
== 1 && langname
!= NULL
)
982 name
= g_strdup (dgettext (ISO_639_DOMAIN
, langname
));
984 else if (len
== 2 && langname
!= NULL
)
986 localename
= (const char *) g_hash_table_lookup (pd
->priv
->iso_3166_table
, str
[1]);
988 if (localename
!= NULL
)
990 /* Translators: The text before the "|" is context to help you decide on
991 * the correct translation. You MUST OMIT it in the translated string.
992 * Translators: the first %s is the language name, and the
993 * second %s is the locale name. Example:
996 name
= g_strdup_printf (Q_("language|%s (%s)"),
997 dgettext (ISO_639_DOMAIN
, langname
),
998 dgettext (ISO_3166_DOMAIN
, localename
));
1002 /* Translators: The text before the "|" is context to help you decide on
1003 * the correct translation. You MUST OMIT it in the translated string. */
1004 name
= g_strdup_printf (Q_("language|%s (%s)"),
1005 dgettext (ISO_639_DOMAIN
, langname
), str
[1]);
1010 /* Translators: The text before the "|" is context to help you decide on
1011 * the correct translation. You MUST OMIT it in the translated string.
1012 * Translators: this refers to a user-define language code
1013 * (one which isn't in our built-in list).
1015 name
= g_strdup_printf (Q_("language|User defined (%s)"), code
);
1024 add_system_language_entry (GtkListStore
*store
)
1028 char *system
, *text
;
1031 sys_langs
= ephy_langs_get_languages ();
1032 n_sys_langs
= g_strv_length (sys_langs
);
1034 system
= g_strjoinv (", ", sys_langs
);
1036 text
= g_strdup_printf
1037 (ngettext ("System language (%s)",
1038 "System languages (%s)", n_sys_langs
), system
);
1040 gtk_list_store_append (store
, &iter
);
1041 gtk_list_store_set (store
, &iter
,
1042 COL_LANG_NAME
, text
,
1043 COL_LANG_CODE
, "system",
1046 g_strfreev (sys_langs
);
1052 setup_add_language_dialog (PrefsDialog
*pd
)
1055 GtkWidget
*window
, *parent
;
1056 GtkListStore
*store
;
1057 GtkTreeModel
*sortmodel
;
1058 GtkTreeView
*treeview
;
1059 GtkCellRenderer
*renderer
;
1060 GtkTreeViewColumn
*column
;
1061 GtkTreeSelection
*selection
;
1065 parent
= ephy_dialog_get_control (EPHY_DIALOG (pd
), properties
[WINDOW_PROP
].id
);
1067 dialog
= EPHY_DIALOG (g_object_new (EPHY_TYPE_DIALOG
,
1068 "parent-window", parent
,
1069 "default-width", 260,
1070 "default-height", 230,
1073 ephy_dialog_construct (dialog
,
1075 ephy_file ("prefs-dialog.glade"),
1076 "add_language_dialog",
1079 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_STRING
);
1081 for (i
= 0; i
< G_N_ELEMENTS (languages
); i
++)
1083 const char *code
= languages
[i
];
1086 name
= get_name_for_lang_code (pd
, code
);
1088 gtk_list_store_append (store
, &iter
);
1089 gtk_list_store_set (store
, &iter
,
1090 COL_LANG_NAME
, name
,
1091 COL_LANG_CODE
, code
,
1096 add_system_language_entry (store
);
1098 sortmodel
= gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store
));
1099 gtk_tree_sortable_set_sort_column_id
1100 (GTK_TREE_SORTABLE (sortmodel
), COL_LANG_NAME
, GTK_SORT_ASCENDING
);
1102 ephy_dialog_get_controls (dialog
,
1103 add_lang_props
[LANGUAGE_PROP
].id
, &treeview
,
1104 add_lang_props
[LANGUAGE_DIALOG
].id
, &window
,
1107 gtk_window_group_add_window (GTK_WINDOW (parent
)->group
, GTK_WINDOW (window
));
1108 gtk_window_set_modal (GTK_WINDOW (window
), TRUE
);
1110 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (treeview
), FALSE
);
1112 gtk_tree_view_set_model (treeview
, sortmodel
);
1114 gtk_tree_view_set_headers_visible (treeview
, FALSE
);
1116 renderer
= gtk_cell_renderer_text_new ();
1118 gtk_tree_view_insert_column_with_attributes (treeview
,
1123 column
= gtk_tree_view_get_column (treeview
, 0);
1124 gtk_tree_view_column_set_resizable (column
, TRUE
);
1125 gtk_tree_view_column_set_sort_column_id (column
, COL_LANG_NAME
);
1127 selection
= gtk_tree_view_get_selection (treeview
);
1128 gtk_tree_selection_set_mode (selection
, GTK_SELECTION_MULTIPLE
);
1130 add_lang_dialog_selection_changed (GTK_TREE_SELECTION (selection
), dialog
);
1131 g_signal_connect (selection
, "changed",
1132 G_CALLBACK (add_lang_dialog_selection_changed
), dialog
);
1134 g_signal_connect (window
, "response",
1135 G_CALLBACK (add_lang_dialog_response_cb
), pd
);
1137 g_object_unref (store
);
1138 g_object_unref (sortmodel
);
1144 language_editor_add_button_clicked_cb (GtkWidget
*button
,
1147 if (pd
->priv
->add_lang_dialog
== NULL
)
1149 EphyDialog
**add_lang_dialog
;
1151 pd
->priv
->add_lang_dialog
= setup_add_language_dialog (pd
);
1153 add_lang_dialog
= &pd
->priv
->add_lang_dialog
;
1155 g_object_add_weak_pointer
1156 (G_OBJECT (pd
->priv
->add_lang_dialog
),
1157 (gpointer
*) add_lang_dialog
);
1160 ephy_dialog_show (pd
->priv
->add_lang_dialog
);
1164 language_editor_remove_button_clicked_cb (GtkWidget
*button
,
1167 GtkTreeSelection
*selection
;
1168 GtkTreeModel
*model
;
1171 selection
= gtk_tree_view_get_selection (pd
->priv
->lang_treeview
);
1173 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
1175 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
1178 language_editor_update_pref (pd
);
1179 language_editor_update_buttons (pd
);
1183 language_editor_up_button_clicked_cb (GtkWidget
*button
,
1186 GtkTreeSelection
*selection
;
1187 GtkTreeModel
*model
;
1188 GtkTreeIter iter
, iter_prev
;
1191 selection
= gtk_tree_view_get_selection (pd
->priv
->lang_treeview
);
1193 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
1195 path
= gtk_tree_model_get_path (model
, &iter
);
1197 if (!gtk_tree_path_prev (path
))
1199 gtk_tree_path_free (path
);
1203 gtk_tree_model_get_iter (model
, &iter_prev
, path
);
1205 gtk_list_store_swap (GTK_LIST_STORE (model
), &iter_prev
, &iter
);
1207 gtk_tree_path_free (path
);
1210 language_editor_update_pref (pd
);
1211 language_editor_update_buttons (pd
);
1215 language_editor_down_button_clicked_cb (GtkWidget
*button
,
1218 GtkTreeSelection
*selection
;
1219 GtkTreeModel
*model
;
1220 GtkTreeIter iter
, iter_next
;
1224 selection
= gtk_tree_view_get_selection (pd
->priv
->lang_treeview
);
1226 if (gtk_tree_selection_get_selected (selection
, &model
, &iter
))
1228 path
= gtk_tree_model_get_path (model
, &iter
);
1230 gtk_tree_path_next (path
);
1232 gtk_tree_model_get_iter (model
, &iter_next
, path
);
1234 gtk_list_store_swap (GTK_LIST_STORE (model
), &iter
, &iter_next
);
1236 gtk_tree_path_free (path
);
1239 language_editor_update_pref (pd
);
1240 language_editor_update_buttons (pd
);
1244 language_editor_treeview_drag_end_cb (GtkWidget
*widget
,
1245 GdkDragContext
*context
,
1246 PrefsDialog
*dialog
)
1248 language_editor_update_pref (dialog
);
1249 language_editor_update_buttons (dialog
);
1253 language_editor_selection_changed_cb (GtkTreeSelection
*selection
,
1254 PrefsDialog
*dialog
)
1256 language_editor_update_buttons (dialog
);
1260 create_language_section (EphyDialog
*dialog
)
1262 PrefsDialog
*pd
= EPHY_PREFS_DIALOG (dialog
);
1263 GtkListStore
*store
;
1264 GtkTreeView
*treeview
;
1265 GtkCellRenderer
*renderer
;
1266 GtkTreeViewColumn
*column
;
1267 GtkTreeSelection
*selection
;
1268 GSList
*list
, *l
, *ulist
= NULL
;
1270 pd
->priv
->iso_639_table
= ephy_langs_iso_639_table ();
1271 pd
->priv
->iso_3166_table
= ephy_langs_iso_3166_table ();
1273 ephy_dialog_get_controls
1275 properties
[LANGUAGE_TREEVIEW_PROP
].id
, &treeview
,
1276 properties
[LANGUAGE_ADD_BUTTON_PROP
].id
, &pd
->priv
->lang_add_button
,
1277 properties
[LANGUAGE_REMOVE_BUTTON_PROP
].id
, &pd
->priv
->lang_remove_button
,
1278 properties
[LANGUAGE_UP_BUTTON_PROP
].id
, &pd
->priv
->lang_up_button
,
1279 properties
[LANGUAGE_DOWN_BUTTON_PROP
].id
, &pd
->priv
->lang_down_button
,
1282 g_signal_connect (pd
->priv
->lang_add_button
, "clicked",
1283 G_CALLBACK (language_editor_add_button_clicked_cb
), dialog
);
1284 g_signal_connect (pd
->priv
->lang_remove_button
, "clicked",
1285 G_CALLBACK (language_editor_remove_button_clicked_cb
), dialog
);
1286 g_signal_connect (pd
->priv
->lang_up_button
, "clicked",
1287 G_CALLBACK (language_editor_up_button_clicked_cb
), dialog
);
1288 g_signal_connect (pd
->priv
->lang_down_button
, "clicked",
1289 G_CALLBACK (language_editor_down_button_clicked_cb
), dialog
);
1291 /* setup the languages treeview */
1292 pd
->priv
->lang_treeview
= treeview
;
1294 gtk_tree_view_set_reorderable (GTK_TREE_VIEW (treeview
), TRUE
);
1296 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_STRING
);
1298 pd
->priv
->lang_model
= GTK_TREE_MODEL (store
);
1300 gtk_tree_view_set_model (treeview
, pd
->priv
->lang_model
);
1301 g_object_unref (store
);
1303 gtk_tree_view_set_headers_visible (treeview
, FALSE
);
1305 renderer
= gtk_cell_renderer_text_new ();
1307 gtk_tree_view_insert_column_with_attributes (treeview
,
1312 column
= gtk_tree_view_get_column (treeview
, 0);
1313 gtk_tree_view_column_set_resizable (column
, TRUE
);
1314 gtk_tree_view_column_set_sort_column_id (column
, COL_LANG_NAME
);
1316 selection
= gtk_tree_view_get_selection (treeview
);
1317 gtk_tree_selection_set_mode (selection
, GTK_SELECTION_SINGLE
);
1319 /* Connect treeview signals */
1320 g_signal_connect (G_OBJECT (treeview
), "drag_end",
1321 G_CALLBACK (language_editor_treeview_drag_end_cb
), pd
);
1322 g_signal_connect (G_OBJECT (selection
), "changed",
1323 G_CALLBACK (language_editor_selection_changed_cb
), pd
);
1325 list
= eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE
);
1328 for (l
= list
; l
!= NULL
; l
= l
->next
)
1330 if (g_slist_find_custom (ulist
, l
->data
, (GCompareFunc
) strcmp
) == NULL
)
1332 ulist
= g_slist_prepend (ulist
, g_strdup (l
->data
));
1335 ulist
= g_slist_reverse (ulist
);
1337 /* if modified, write back */
1338 if (g_slist_length (ulist
) != g_slist_length (list
))
1340 eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE
, ulist
);
1343 /* Fill languages editor */
1344 for (l
= ulist
; l
!= NULL
; l
= l
->next
)
1346 const char *code
= (const char *) l
->data
;
1348 if (strcmp (code
, "system") == 0)
1350 add_system_language_entry (store
);
1352 else if (code
[0] != '\0')
1356 text
= get_name_for_lang_code (pd
, code
);
1357 language_editor_add (pd
, code
, text
);
1362 language_editor_update_buttons (pd
);
1364 /* Lockdown if key is not writable */
1365 if (eel_gconf_key_is_writable (CONF_RENDERING_LANGUAGE
) == FALSE
)
1367 gtk_widget_set_sensitive (pd
->priv
->lang_add_button
, FALSE
);
1368 gtk_widget_set_sensitive (pd
->priv
->lang_remove_button
, FALSE
);
1369 gtk_widget_set_sensitive (pd
->priv
->lang_up_button
, FALSE
);
1370 gtk_widget_set_sensitive (pd
->priv
->lang_down_button
, FALSE
);
1371 gtk_widget_set_sensitive (GTK_WIDGET (pd
->priv
->lang_treeview
), FALSE
);
1374 g_slist_foreach (list
, (GFunc
) g_free
, NULL
);
1375 g_slist_free (list
);
1377 g_slist_foreach (ulist
, (GFunc
) g_free
, NULL
);
1378 g_slist_free (ulist
);
1382 download_path_changed_cb (GtkFileChooser
*button
)
1384 char *dir
, *downloads_dir
, *desktop_dir
;
1386 /* FIXME: use _uri variant when we support downloading
1387 * to gnome-vfs remote locations
1389 dir
= gtk_file_chooser_get_filename (button
);
1390 if (dir
== NULL
) return;
1392 downloads_dir
= ephy_file_downloads_dir ();
1393 desktop_dir
= ephy_file_desktop_dir ();
1394 g_return_if_fail (downloads_dir
!= NULL
&& desktop_dir
!= NULL
);
1396 if (strcmp (dir
, downloads_dir
) == 0)
1398 eel_gconf_set_string (CONF_STATE_DOWNLOAD_DIR
, "Downloads");
1400 else if (strcmp (dir
, desktop_dir
) == 0)
1402 eel_gconf_set_string (CONF_STATE_DOWNLOAD_DIR
, "Desktop");
1406 eel_gconf_set_path (CONF_STATE_DOWNLOAD_DIR
, dir
);
1410 g_free (downloads_dir
);
1411 g_free (desktop_dir
);
1415 create_download_path_button (EphyDialog
*dialog
)
1417 GtkWidget
*parent
, *hbox
, *label
, *button
;
1418 EphyFileChooser
*fc
;
1421 dir
= ephy_file_get_downloads_dir ();
1423 ephy_dialog_get_controls (dialog
,
1424 properties
[DOWNLOAD_PATH_HBOX_PROP
].id
, &hbox
,
1425 properties
[DOWNLOAD_PATH_LABEL_PROP
].id
, &label
,
1426 properties
[WINDOW_PROP
].id
, &parent
,
1429 fc
= ephy_file_chooser_new (_("Select a Directory"),
1431 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
,
1432 NULL
, EPHY_FILE_FILTER_NONE
);
1434 /* Unset the destroy-with-parent, since gtkfilechooserbutton doesn't expect this */
1435 gtk_window_set_destroy_with_parent (GTK_WINDOW (fc
), FALSE
);
1437 button
= gtk_file_chooser_button_new_with_dialog (GTK_WIDGET (fc
));
1438 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (button
), dir
);
1439 gtk_file_chooser_button_set_width_chars (GTK_FILE_CHOOSER_BUTTON (button
),
1440 DOWNLOAD_BUTTON_WIDTH
);
1441 g_signal_connect (button
, "current-folder-changed",
1442 G_CALLBACK (download_path_changed_cb
), dialog
);
1443 gtk_label_set_mnemonic_widget (GTK_LABEL (label
), button
);
1444 gtk_box_pack_start (GTK_BOX (hbox
), button
, TRUE
, TRUE
, 0);
1445 gtk_widget_show (button
);
1447 gtk_widget_set_sensitive (button
, eel_gconf_key_is_writable (CONF_STATE_DOWNLOAD_DIR
));
1452 prefs_dialog_response_cb (GtkDialog
*widget
,
1456 if (response
== GTK_RESPONSE_HELP
)
1458 prefs_dialog_show_help (dialog
);
1462 g_object_unref (dialog
);
1466 prefs_clear_cache_button_clicked_cb (GtkWidget
*button
,
1467 PrefsDialog
*dialog
)
1469 EphyEmbedShell
*shell
;
1470 EphyEmbedSingle
*single
;
1471 EphyFaviconCache
*cache
;
1473 shell
= ephy_embed_shell_get_default ();
1475 single
= EPHY_EMBED_SINGLE (ephy_embed_shell_get_embed_single (shell
));
1476 ephy_embed_single_clear_cache (single
);
1478 cache
= EPHY_FAVICON_CACHE (ephy_embed_shell_get_favicon_cache (shell
));
1479 ephy_favicon_cache_clear (cache
);
1483 set_homepage_entry (EphyDialog
*dialog
,
1484 const char *new_location
)
1486 GValue value
= { 0, };
1488 g_value_init (&value
, G_TYPE_STRING
);
1489 g_value_set_string (&value
, new_location
);
1490 ephy_dialog_set_value (dialog
, properties
[HOMEPAGE_ENTRY_PROP
].id
, &value
);
1491 g_value_unset (&value
);
1495 prefs_homepage_current_button_clicked_cb (GtkWidget
*button
,
1498 EphySession
*session
;
1502 session
= EPHY_SESSION (ephy_shell_get_session (ephy_shell_get_default ()));
1503 window
= ephy_session_get_active_window (session
);
1505 /* can't do anything in this case */
1506 if (window
== NULL
) return;
1508 tab
= ephy_window_get_active_tab (window
);
1509 g_return_if_fail (tab
!= NULL
);
1511 set_homepage_entry (dialog
, ephy_tab_get_address (tab
));
1515 prefs_homepage_blank_button_clicked_cb (GtkWidget
*button
,
1518 set_homepage_entry (dialog
, NULL
);
1521 prefs_dialog_init (PrefsDialog
*pd
)
1523 EphyDialog
*dialog
= EPHY_DIALOG (pd
);
1524 EphyEncodings
*encodings
;
1525 GtkWidget
*window
, *curr_button
, *blank_button
;
1526 GtkWidget
*clear_cache_button
, *font_prefs_button
;
1527 GtkWidget
*css_checkbox
, *css_edit_box
, *css_edit_button
, *css_container
;
1530 pd
->priv
= EPHY_PREFS_DIALOG_GET_PRIVATE (pd
);
1532 ephy_dialog_construct (dialog
,
1534 ephy_file ("prefs-dialog.glade"),
1538 ephy_dialog_add_enum (dialog
, properties
[ACCEPT_COOKIES_PROP
].id
,
1539 G_N_ELEMENTS (cookies_accept_enum
), cookies_accept_enum
);
1541 ephy_dialog_get_controls
1543 properties
[WINDOW_PROP
].id
, &window
,
1544 properties
[HOMEPAGE_CURRENT_PROP
].id
, &curr_button
,
1545 properties
[HOMEPAGE_BLANK_PROP
].id
, &blank_button
,
1546 properties
[FONT_PREFS_BUTTON_PROP
].id
, &font_prefs_button
,
1547 properties
[CSS_CHECKBOX_PROP
].id
, &css_checkbox
,
1548 properties
[CSS_EDIT_BOX_PROP
].id
, &css_edit_box
,
1549 properties
[CSS_EDIT_BUTTON_PROP
].id
, &css_edit_button
,
1550 properties
[CSS_CONTAINER_PROP
].id
, &css_container
,
1551 properties
[CLEAR_CACHE_BUTTON_PROP
].id
, &clear_cache_button
,
1554 ephy_gui_ensure_window_group (GTK_WINDOW (window
));
1556 g_signal_connect (window
, "response",
1557 G_CALLBACK (prefs_dialog_response_cb
), dialog
);
1559 g_signal_connect (curr_button
, "clicked",
1560 G_CALLBACK (prefs_homepage_current_button_clicked_cb
), dialog
);
1561 g_signal_connect (blank_button
, "clicked",
1562 G_CALLBACK (prefs_homepage_blank_button_clicked_cb
), dialog
);
1564 /* set homepage button sensitivity */
1565 sensitive
= eel_gconf_key_is_writable (CONF_GENERAL_HOMEPAGE
);
1566 gtk_widget_set_sensitive (curr_button
, sensitive
);
1567 gtk_widget_set_sensitive (blank_button
, sensitive
);
1569 g_signal_connect (font_prefs_button
, "clicked",
1570 G_CALLBACK (font_prefs_button_clicked_cb
), dialog
);
1572 css_checkbox_toggled (GTK_TOGGLE_BUTTON (css_checkbox
), css_edit_box
);
1573 g_signal_connect (css_checkbox
, "toggled",
1574 G_CALLBACK (css_checkbox_toggled
), css_edit_box
);
1576 g_signal_connect (css_edit_button
, "clicked",
1577 G_CALLBACK (css_edit_button_clicked_cb
), dialog
);
1579 g_signal_connect (clear_cache_button
, "clicked",
1580 G_CALLBACK (prefs_clear_cache_button_clicked_cb
), dialog
);
1582 encodings
= EPHY_ENCODINGS (ephy_embed_shell_get_encodings
1583 (EPHY_EMBED_SHELL (ephy_shell
)));
1585 create_node_combo (dialog
, DEFAULT_ENCODING_PROP
, encodings
,
1586 ephy_encodings_get_all (encodings
),
1587 CONF_LANGUAGE_DEFAULT_ENCODING
, "ISO-8859-1");
1588 create_autodetectors_combo (dialog
, AUTO_ENCODING_PROP
, encodings
,
1589 ephy_encodings_get_detectors (encodings
),
1590 CONF_LANGUAGE_AUTODETECT_ENCODING
, "");
1592 create_language_section (dialog
);
1594 create_download_path_button (dialog
);