diff options
author | Marco Pesenti Gritti <marco@it.gnome.org> | 2003-05-10 17:53:38 +0800 |
---|---|---|
committer | Marco Pesenti Gritti <mpeseng@src.gnome.org> | 2003-05-10 17:53:38 +0800 |
commit | 38f165dfad2c29b25f93efce2a29b1ea771615e8 (patch) | |
tree | 8b0160686bc36600db975b038ccc41b0b46c169f /src | |
parent | d5b2112c4a55235afdd91d15146a1a623eb5bec6 (diff) | |
download | gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar.gz gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar.bz2 gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar.lz gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar.xz gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.tar.zst gsoc2013-epiphany-38f165dfad2c29b25f93efce2a29b1ea771615e8.zip |
Rework prefs dialog ui a bit. Remove jumpto and tabbed_popups prefs
2003-05-10 Marco Pesenti Gritti <marco@it.gnome.org>
* data/epiphany.schemas.in:
* data/glade/prefs-dialog.glade:
* lib/ephy-prefs.h:
* src/Makefile.am:
* src/ephy-shell.c: (ephy_shell_new_window_cb):
* src/ephy-tab.c: (ephy_tab_new_window_cb):
* src/prefs-dialog.c: (prefs_dialog_get_type), (prefs_dialog_new),
(prefs_dialog_show_help), (setup_font_menu), (save_font_menu),
(font_entry_changed_cb), (attach_font_signal),
(attach_fonts_signals), (size_spinbutton_changed_cb),
(attach_size_controls_signals), (setup_size_control),
(setup_size_controls), (setup_fonts),
(default_charset_menu_changed_cb), (find_charset_in_list_cmp),
(create_default_charset_menu), (general_prefs_new_language_menu),
(language_menu_changed_cb), (create_language_menu),
(set_homepage_entry), (prefs_dialog_init),
(prefs_dialog_response_cb),
(prefs_clear_disk_cache_button_clicked_cb),
(fonts_language_optionmenu_changed_cb),
(prefs_homepage_current_button_clicked_cb),
(prefs_homepage_blank_button_clicked_cb), (fill_language_editor),
(language_dialog_changed_cb),
(prefs_language_more_button_clicked_cb):
* src/prefs-dialog.h:
* src/window-commands.c: (window_cmd_edit_prefs):
Rework prefs dialog ui a bit. Remove jumpto and tabbed_popups
prefs (jumpto is still in the schemas.
Remove the crazy page by page separation in the code.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rwxr-xr-x | src/appearance-prefs.c | 453 | ||||
-rw-r--r-- | src/appearance-prefs.h | 58 | ||||
-rw-r--r-- | src/ephy-shell.c | 16 | ||||
-rw-r--r-- | src/ephy-tab.c | 16 | ||||
-rwxr-xr-x | src/general-prefs.c | 493 | ||||
-rw-r--r-- | src/prefs-dialog.c | 854 | ||||
-rw-r--r-- | src/prefs-dialog.h | 20 | ||||
-rw-r--r-- | src/window-commands.c | 10 |
9 files changed, 722 insertions, 1202 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 75b3e5edd..285976850 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,8 +43,6 @@ endif epiphany_bin_SOURCES = \ $(ephy_automation_interface_idl_sources) \ $(nautilus_view_sources) \ - appearance-prefs.c \ - appearance-prefs.h \ ephy-automation.c \ ephy-automation.h \ ephy-encoding-menu.c \ @@ -74,8 +72,6 @@ epiphany_bin_SOURCES = \ ephy-toolbars-model.h \ ephy-window.c \ ephy-window.h \ - general-prefs.c \ - general-prefs.h \ language-editor.c \ language-editor.h \ pdm-dialog.c \ diff --git a/src/appearance-prefs.c b/src/appearance-prefs.c deleted file mode 100755 index e19e95c79..000000000 --- a/src/appearance-prefs.c +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Copyright (C) 2002 Marco Pesenti Gritti - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "appearance-prefs.h" -#include "ephy-shell.h" -#include "ephy-prefs.h" -#include "ephy-embed-prefs.h" -#include "eel-gconf-extensions.h" - -#include <string.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtkspinbutton.h> -#include <gtk/gtkeditable.h> -#include <gtk/gtkoptionmenu.h> - -static void appearance_prefs_class_init (AppearancePrefsClass *klass); -static void appearance_prefs_init (AppearancePrefs *dialog); -static void appearance_prefs_finalize (GObject *object); - -/* Glade callbacks */ -void -fonts_language_optionmenu_changed_cb (GtkWidget *optionmenu, EphyDialog *dialog); - -static GObjectClass *parent_class = NULL; - -struct AppearancePrefsPrivate -{ - int language; - gboolean switching; -}; - -enum -{ - SERIF_PROP, - SANSSERIF_PROP, - MONOSPACE_PROP, - FIXED_SIZE_PROP, - VARIABLE_SIZE_PROP, - MIN_SIZE_PROP, - PROPORTIONAL_PROP, - BACKGROUND_PROP, - TEXT_PROP, - UNVISITED_PROP, - VISITED_PROP, - USE_SYSCOLORS_PROP, - USE_COLORS_PROP, - USE_FONTS_PROP, -}; - -static const -EphyDialogProperty properties [] = -{ - { SERIF_PROP, "serif_combo", NULL, PT_NORMAL, NULL }, - { SANSSERIF_PROP, "sansserif_combo", NULL, PT_NORMAL, NULL }, - { MONOSPACE_PROP, "monospace_combo", NULL, PT_NORMAL, NULL }, - { FIXED_SIZE_PROP, "fixed_size_spinbutton", NULL, PT_NORMAL, NULL }, - { VARIABLE_SIZE_PROP, "variable_size_spinbutton", NULL, PT_NORMAL, NULL }, - { MIN_SIZE_PROP, "min_size_spinbutton", NULL, PT_NORMAL, NULL }, - { PROPORTIONAL_PROP, "proportional_optionmenu", CONF_RENDERING_DEFAULT_FONT, PT_AUTOAPPLY, NULL }, - { BACKGROUND_PROP, "background_cpick", CONF_RENDERING_BG_COLOR, PT_AUTOAPPLY, NULL }, - { TEXT_PROP, "text_cpick", CONF_RENDERING_TEXT_COLOR, PT_AUTOAPPLY, NULL }, - { UNVISITED_PROP, "unvisited_cpick", CONF_RENDERING_UNVISITED_LINKS, PT_AUTOAPPLY, NULL }, - { VISITED_PROP, "visited_cpick", CONF_RENDERING_VISITED_LINKS, PT_AUTOAPPLY, NULL }, - { USE_SYSCOLORS_PROP, "use_syscolors_checkbutton", CONF_RENDERING_USE_SYSTEM_COLORS, PT_AUTOAPPLY, NULL }, - { USE_COLORS_PROP, "use_colors_checkbutton", CONF_RENDERING_USE_OWN_COLORS, PT_AUTOAPPLY, NULL }, - { USE_FONTS_PROP, "use_fonts_checkbutton", CONF_RENDERING_USE_OWN_FONTS, PT_AUTOAPPLY, NULL }, - - { -1, NULL, NULL } -}; - -/* FIXME duped in mozilla/ */ -const -char *lang_encode[] = -{ - "x-western", - "x-central-euro", - "ja", - "zh-TW", - "zh-CN", - "ko", - "x-cyrillic", - "x-baltic", - "el", - "tr", - "x-unicode", - "th", - "he", - "ar" -}; - -enum -{ - FONT_TYPE_SERIF, - FONT_TYPE_SANSSERIF, - FONT_TYPE_MONOSPACE -}; - -const -char *fonts_types[] = -{ - "serif", - "sans-serif", - "monospace" -}; - -enum -{ - FONT_SIZE_FIXED, - FONT_SIZE_VAR, - FONT_SIZE_MIN -}; - -const -char *size_prefs[] = -{ - CONF_RENDERING_FONT_FIXED_SIZE, - CONF_RENDERING_FONT_VAR_SIZE, - CONF_RENDERING_FONT_MIN_SIZE -}; - -GType -appearance_prefs_get_type (void) -{ - static GType appearance_prefs_type = 0; - - if (appearance_prefs_type == 0) - { - static const GTypeInfo our_info = - { - sizeof (AppearancePrefsClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) appearance_prefs_class_init, - NULL, - NULL, /* class_data */ - sizeof (AppearancePrefs), - 0, /* n_preallocs */ - (GInstanceInitFunc) appearance_prefs_init - }; - - appearance_prefs_type = g_type_register_static (EPHY_DIALOG_TYPE, - "AppearancePrefs", - &our_info, 0); - } - - return appearance_prefs_type; - -} - -static void -appearance_prefs_class_init (AppearancePrefsClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = appearance_prefs_finalize; -} - -static void -setup_font_menu (AppearancePrefs *dialog, - const char *type, - GtkWidget *combo) -{ - char *default_font; - GList *fonts; - const char *name; - char key[255]; - int pos; - GtkWidget *entry = GTK_COMBO(combo)->entry; - EphyEmbedSingle *single; - - single = ephy_embed_shell_get_embed_single - (EPHY_EMBED_SHELL (ephy_shell)); - - ephy_embed_single_get_font_list (single, - lang_encode[dialog->priv->language], - type, &fonts, &default_font); - - /* Get the default font */ - sprintf (key, "%s_%s_%s", CONF_RENDERING_FONT, type, - lang_encode[dialog->priv->language]); - name = eel_gconf_get_string (key); - if (name == NULL) - { - name = default_font; - } - - /* set popdown doesnt like NULL */ - if (fonts == NULL) - { - fonts = g_list_alloc (); - } - - gtk_combo_set_popdown_strings (GTK_COMBO(combo), fonts); - - /* set the default value */ - if (name != NULL) - { - gtk_editable_delete_text (GTK_EDITABLE(entry), 0, -1); - gtk_editable_insert_text (GTK_EDITABLE(entry), - name, g_utf8_strlen (name, -1), - &pos); - } - - g_free (default_font); - - g_list_foreach (fonts, (GFunc)g_free, NULL); - g_list_free (fonts); -} - -static void -save_font_menu (AppearancePrefs *dialog, - int type, - GtkWidget *entry) -{ - char *name; - char key[255]; - - name = gtk_editable_get_chars - (GTK_EDITABLE(entry), 0, -1); - - /* do not save empty fonts */ - if (!name || *name == '\0') - { - g_free (name); - return; - } - - sprintf (key, "%s_%s_%s", CONF_RENDERING_FONT, - fonts_types[type], - lang_encode[dialog->priv->language]); - eel_gconf_set_string (key, name); - g_free (name); -} - -static void -font_entry_changed_cb (GtkWidget *entry, AppearancePrefs *dialog) -{ - int type; - - if (dialog->priv->switching) return; - - type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(entry), - "type")); - save_font_menu (dialog, type, entry); -} - -static void -attach_font_signal (AppearancePrefs *dialog, int prop, - gpointer type) -{ - GtkWidget *combo; - GtkWidget *entry; - - combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), - prop); - entry = GTK_COMBO(combo)->entry; - g_object_set_data (G_OBJECT(entry), "type", type); - g_signal_connect (entry, "changed", - G_CALLBACK(font_entry_changed_cb), - dialog); -} - -static void -attach_fonts_signals (AppearancePrefs *dialog) -{ - attach_font_signal (dialog, SERIF_PROP, - GINT_TO_POINTER(FONT_TYPE_SERIF)); - attach_font_signal (dialog, SANSSERIF_PROP, - GINT_TO_POINTER(FONT_TYPE_SANSSERIF)); - attach_font_signal (dialog, MONOSPACE_PROP, - GINT_TO_POINTER(FONT_TYPE_MONOSPACE)); -} - -static void -size_spinbutton_changed_cb (GtkWidget *spin, AppearancePrefs *dialog) -{ - int type; - char key[255]; - - if (dialog->priv->switching) return; - - type = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(spin), "type")); - - sprintf (key, "%s_%s", - size_prefs[type], - lang_encode[dialog->priv->language]); - eel_gconf_set_integer (key, gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin))); -} - -static void -attach_size_controls_signals (AppearancePrefs *dialog) -{ - GtkWidget *spin; - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - FIXED_SIZE_PROP); - g_object_set_data (G_OBJECT(spin), "type", - GINT_TO_POINTER(FONT_SIZE_FIXED)); - g_signal_connect (spin, "value_changed", - G_CALLBACK(size_spinbutton_changed_cb), - dialog); - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - VARIABLE_SIZE_PROP); - g_object_set_data (G_OBJECT(spin), "type", - GINT_TO_POINTER(FONT_SIZE_VAR)); - g_signal_connect (spin, "value_changed", - G_CALLBACK(size_spinbutton_changed_cb), - dialog); - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - MIN_SIZE_PROP); - g_object_set_data (G_OBJECT(spin), "type", - GINT_TO_POINTER(FONT_SIZE_MIN)); - g_signal_connect (spin, "value_changed", - G_CALLBACK(size_spinbutton_changed_cb), - dialog); -} - -static void -setup_size_control (AppearancePrefs *dialog, - const char *pref, - int default_size, - GtkWidget *spin) -{ - char key[255]; - int size; - - sprintf (key, "%s_%s", pref, - lang_encode[dialog->priv->language]); - size = eel_gconf_get_integer (key); - - if (size == 0) size = default_size; - - gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin), size); -} - -static void -setup_size_controls (AppearancePrefs *dialog) -{ - GtkWidget *spin; - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - FIXED_SIZE_PROP); - setup_size_control (dialog, CONF_RENDERING_FONT_FIXED_SIZE, 12, spin); - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - VARIABLE_SIZE_PROP); - setup_size_control (dialog, CONF_RENDERING_FONT_VAR_SIZE, 16, spin); - - spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), - MIN_SIZE_PROP); - setup_size_control (dialog, CONF_RENDERING_FONT_MIN_SIZE, 0, spin); -} - -static void -setup_fonts (AppearancePrefs *dialog) -{ - GtkWidget *combo; - - dialog->priv->switching = TRUE; - - combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), - SERIF_PROP); - setup_font_menu (dialog, "serif", combo); - - combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), - SANSSERIF_PROP); - setup_font_menu (dialog, "sans-serif", combo); - - combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), - MONOSPACE_PROP); - setup_font_menu (dialog, "monospace", combo); - - dialog->priv->switching = FALSE; -} - -static void -appearance_prefs_init (AppearancePrefs *dialog) -{ - dialog->priv = g_new0 (AppearancePrefsPrivate, 1); - dialog->priv->switching = FALSE; - - ephy_dialog_construct (EPHY_DIALOG(dialog), - properties, - "prefs-dialog.glade", - "appearance_page_box"); - - setup_fonts (dialog); - setup_size_controls (dialog); - attach_fonts_signals (dialog); - attach_size_controls_signals (dialog); -} - -static void -appearance_prefs_finalize (GObject *object) -{ - AppearancePrefs *dialog; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_appearance_PREFS (object)); - - dialog = appearance_PREFS (object); - - g_return_if_fail (dialog->priv != NULL); - - g_free (dialog->priv); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -EphyDialog * -appearance_prefs_new (void) -{ - AppearancePrefs *dialog; - - dialog = appearance_PREFS (g_object_new (appearance_PREFS_TYPE, - NULL)); - - return EPHY_DIALOG(dialog); -} - -void -fonts_language_optionmenu_changed_cb (GtkWidget *optionmenu, - EphyDialog *dialog) -{ - int i; - - i = gtk_option_menu_get_history - (GTK_OPTION_MENU (optionmenu)); - - appearance_PREFS(dialog)->priv->language = i; - - setup_fonts (appearance_PREFS(dialog)); - setup_size_controls (appearance_PREFS(dialog)); -} diff --git a/src/appearance-prefs.h b/src/appearance-prefs.h deleted file mode 100644 index 17067b7e9..000000000 --- a/src/appearance-prefs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2002 Marco Pesenti Gritti - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef APPEARANCE_PREFS_H -#define APPEARANCE_PREFS_H - -#include "ephy-dialog.h" - -#include <glib-object.h> -#include <glib.h> - -G_BEGIN_DECLS - -typedef struct AppearancePrefs AppearancePrefs; -typedef struct AppearancePrefsClass AppearancePrefsClass; - -#define appearance_PREFS_TYPE (appearance_prefs_get_type ()) -#define appearance_PREFS(obj) (GTK_CHECK_CAST ((obj), appearance_PREFS_TYPE, AppearancePrefs)) -#define appearance_PREFS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), appearance_PREFS, AppearancePrefsClass)) -#define IS_appearance_PREFS(obj) (GTK_CHECK_TYPE ((obj), appearance_PREFS_TYPE)) -#define IS_appearance_PREFS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), appearance_PREFS)) - -typedef struct AppearancePrefsPrivate AppearancePrefsPrivate; - -struct AppearancePrefs -{ - EphyDialog parent; - AppearancePrefsPrivate *priv; -}; - -struct AppearancePrefsClass -{ - EphyDialogClass parent_class; -}; - -GType appearance_prefs_get_type (void); - -EphyDialog *appearance_prefs_new (void); - -G_END_DECLS - -#endif - diff --git a/src/ephy-shell.c b/src/ephy-shell.c index 56f31799e..daf5f4513 100644 --- a/src/ephy-shell.c +++ b/src/ephy-shell.c @@ -219,23 +219,11 @@ ephy_shell_new_window_cb (EphyEmbedShell *shell, { EphyTab *new_tab; EphyWindow *window; - gboolean open_in_tab; g_assert (new_embed != NULL); - open_in_tab = (chromemask & EMBED_CHROME_OPENASCHROME) ? - FALSE : - eel_gconf_get_boolean (CONF_TABS_TABBED_POPUPS); - - if (open_in_tab) - { - window = ephy_shell_get_active_window (ephy_shell); - } - else - { - window = ephy_window_new (); - ephy_window_set_chrome (window, chromemask); - } + window = ephy_window_new (); + ephy_window_set_chrome (window, chromemask); new_tab = ephy_tab_new (); ephy_window_add_tab (window, new_tab, EPHY_NOTEBOOK_INSERT_GROUPED, FALSE); diff --git a/src/ephy-tab.c b/src/ephy-tab.c index e146562d6..70302a595 100644 --- a/src/ephy-tab.c +++ b/src/ephy-tab.c @@ -646,21 +646,9 @@ ephy_tab_new_window_cb (EphyEmbed *embed, EphyEmbed **new_embed, { EphyTab *new_tab; EphyWindow *window; - gboolean open_in_tab; - open_in_tab = (chromemask & EMBED_CHROME_OPENASCHROME) ? - FALSE : - eel_gconf_get_boolean (CONF_TABS_TABBED_POPUPS); - - if (open_in_tab) - { - window = ephy_tab_get_window (tab); - } - else - { - window = ephy_window_new (); - ephy_window_set_chrome (window, chromemask); - } + window = ephy_window_new (); + ephy_window_set_chrome (window, chromemask); new_tab = ephy_tab_new (); ephy_window_add_tab (window, new_tab, EPHY_NOTEBOOK_INSERT_GROUPED, FALSE); diff --git a/src/general-prefs.c b/src/general-prefs.c deleted file mode 100755 index 81fb1c1e2..000000000 --- a/src/general-prefs.c +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Copyright (C) 2002 Marco Pesenti Gritti - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "general-prefs.h" -#include "ephy-shell.h" -#include "ephy-embed-single.h" -#include "ephy-prefs.h" -#include "ephy-embed-prefs.h" -#include "ephy-shell.h" -#include "eel-gconf-extensions.h" -#include "language-editor.h" - -#include <string.h> -#include <gtk/gtkeditable.h> -#include <gtk/gtkmenu.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtkmenuitem.h> -#include <bonobo/bonobo-i18n.h> - -static void general_prefs_class_init (GeneralPrefsClass *klass); -static void general_prefs_init (GeneralPrefs *dialog); -static void general_prefs_finalize (GObject *object); - -/* Glade callbacks */ -void -prefs_homepage_current_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog); -void -prefs_homepage_blank_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog); -void -prefs_language_more_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog); - -static GObjectClass *parent_class = NULL; - -struct GeneralPrefsPrivate -{ - gpointer dummy; -}; - -enum -{ - HOMEPAGE_ENTRY_PROP, - NEW_PAGE_PROP, - AUTOCHARSET_PROP, - DEFAULT_CHARSET_PROP, - LANGUAGE_PROP -}; - -static const -EphyDialogProperty properties [] = -{ - { HOMEPAGE_ENTRY_PROP, "homepage_entry", CONF_GENERAL_HOMEPAGE, PT_AUTOAPPLY, NULL }, - { NEW_PAGE_PROP, "new_page_show_homepage", CONF_GENERAL_NEWPAGE_TYPE, PT_AUTOAPPLY, NULL }, - { AUTOCHARSET_PROP, "autocharset_optionmenu", CONF_LANGUAGE_AUTODETECT_CHARSET, PT_AUTOAPPLY, NULL }, - { DEFAULT_CHARSET_PROP, "default_charset_optionmenu", NULL, PT_NORMAL, NULL }, - { LANGUAGE_PROP, "language_optionmenu", NULL, PT_NORMAL, NULL }, - - { -1, NULL, NULL } -}; - -static const -struct -{ - char *name; - char *code; -} -languages [] = -{ - { _("Afrikaans"), "ak" }, - { _("Albanian"), "sq" }, - { _("Arabic"), "ar" }, - { _("Azerbaijani"), "az" }, - { _("Basque"), "eu" }, - { _("Breton"), "br" }, - { _("Bulgarian"), "bg" }, - { _("Byelorussian"), "be" }, - { _("Catalan"), "ca" }, - { _("Chinese"), "zh" }, - { _("Croatian"), "hr" }, - { _("Czech"), "cs" }, - { _("Danish"), "da" }, - { _("Dutch"), "nl" }, - { _("English"), "en" }, - { _("Esperanto"), "eo" }, - { _("Estonian"), "et" }, - { _("Faeroese"), "fo" }, - { _("Finnish"), "fi" }, - { _("French"), "fr" }, - { _("Galician"), "gl" }, - { _("German"), "de" }, - { _("Greek"), "el" }, - { _("Hebrew"), "he" }, - { _("Hungarian"), "hu" }, - { _("Icelandic"), "is" }, - { _("Indonesian"), "id" }, - { _("Irish"), "ga" }, - { _("Italian"), "it" }, - { _("Japanese"), "ja" }, - { _("Korean"), "ko" }, - { _("Latvian"), "lv" }, - { _("Lithuanian"), "lt" }, - { _("Macedonian"), "mk" }, - { _("Malay"), "ms" }, - { _("Norwegian/Nynorsk"), "nn" }, - { _("Norwegian/Bokmaal"), "nb" }, - { _("Norwegian"), "no" }, - { _("Polish"), "pl" }, - { _("Portuguese"), "pt" }, - { _("Portuguese of Brazil"), "pt-BR" }, - { _("Romanian"), "ro" }, - { _("Russian"), "ru" }, - { _("Scottish"), "gd" }, - { _("Serbian"), "sr" }, - { _("Slovak"), "sk" }, - { _("Slovenian"), "sl" }, - { _("Spanish"), "es" }, - { _("Swedish"), "sv" }, - { _("Tamil"), "ta" }, - { _("Turkish"), "tr" }, - { _("Ukrainian"), "uk" }, - { _("Vietnamian"), "vi" }, - { _("Walloon"), "wa" }, - { NULL, NULL } -}; - -GType -general_prefs_get_type (void) -{ - static GType general_prefs_type = 0; - - if (general_prefs_type == 0) - { - static const GTypeInfo our_info = - { - sizeof (GeneralPrefsClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) general_prefs_class_init, - NULL, - NULL, /* class_data */ - sizeof (GeneralPrefs), - 0, /* n_preallocs */ - (GInstanceInitFunc) general_prefs_init - }; - - general_prefs_type = g_type_register_static (EPHY_DIALOG_TYPE, - "GeneralPrefs", - &our_info, 0); - } - - return general_prefs_type; - -} - -static void -general_prefs_class_init (GeneralPrefsClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->finalize = general_prefs_finalize; -} - -static void -default_charset_menu_changed_cb (GtkOptionMenu *option_menu, - EphyEmbedShell *shell) -{ - GList *charsets; - int i; - CharsetInfo *info; - EphyEmbedSingle *single; - - single = ephy_embed_shell_get_embed_single - (EPHY_EMBED_SHELL (ephy_shell)); - - ephy_embed_single_get_charset_titles (single, NULL, &charsets); - - i = gtk_option_menu_get_history (option_menu); - charsets = g_list_nth (charsets, i); - g_assert (charsets != NULL); - info = (CharsetInfo *) charsets->data; - eel_gconf_set_string (CONF_LANGUAGE_DEFAULT_CHARSET, - info->name); - - g_list_free (charsets); -} - -static gint -find_charset_in_list_cmp (gconstpointer a, - gconstpointer b) -{ - CharsetInfo *info = (CharsetInfo *)a; - const char *value = b; - - return (strcmp (info->name, value)); -} - -static void -create_default_charset_menu (GeneralPrefs *dialog) -{ - GList *l; - GList *charsets; - GtkWidget *menu; - GtkWidget *optionmenu; - char *value; - EphyEmbedSingle *single; - - single = ephy_embed_shell_get_embed_single - (EPHY_EMBED_SHELL (ephy_shell)); - - ephy_embed_single_get_charset_titles (single, NULL, &l); - - menu = gtk_menu_new (); - - optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), - DEFAULT_CHARSET_PROP); - - for (charsets = l; charsets != NULL; charsets = charsets->next) - { - CharsetInfo *info = (CharsetInfo *) charsets->data; - GtkWidget *item; - - item = gtk_menu_item_new_with_label (info->title); - gtk_menu_shell_append (GTK_MENU_SHELL(menu), - item); - gtk_widget_show (item); - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU(optionmenu), menu); - - /* init value */ - charsets = l; - value = eel_gconf_get_string (CONF_LANGUAGE_DEFAULT_CHARSET); - g_return_if_fail (value != NULL); - charsets = g_list_find_custom (charsets, (gconstpointer)value, - (GCompareFunc)find_charset_in_list_cmp); - gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), - g_list_position (l, charsets)); - g_free (value); - - g_signal_connect (optionmenu, "changed", - G_CALLBACK (default_charset_menu_changed_cb), - embed_shell); - - g_list_free (l); -} - -static GtkWidget * -general_prefs_new_language_menu (GeneralPrefs *dialog) -{ - int i; - GtkWidget *menu; - - menu = gtk_menu_new (); - - for (i = 0; languages[i].name != NULL; i++) - { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (languages[i].name); - gtk_menu_shell_append (GTK_MENU_SHELL(menu), - item); - gtk_widget_show (item); - g_object_set_data (G_OBJECT(item), "desc", - languages[i].name); - } - - return menu; -} - -static void -language_menu_changed_cb (GtkOptionMenu *option_menu, - gpointer data) -{ - GSList *list; - GSList *l = NULL; - int history; - - list = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); - l = g_slist_copy (list); - - /* Subst the first item according to the optionmenu */ - history = gtk_option_menu_get_history (option_menu); - l->data = languages [history].code; - - eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, l); - - g_slist_free (l); -} - -static void -create_language_menu (GeneralPrefs *dialog) -{ - GtkWidget *optionmenu; - GtkWidget *menu; - const char *value; - int i; - GSList *list; - - optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), - LANGUAGE_PROP); - - menu = general_prefs_new_language_menu (dialog); - - gtk_option_menu_set_menu (GTK_OPTION_MENU(optionmenu), menu); - - /* init value */ - list = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); - g_return_if_fail (list != NULL); - value = (const char *)list->data; - - i = 0; - while (languages[i].code && strcmp (languages[i].code, value) != 0) - { - i++; - } - - gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), i); - - g_signal_connect (optionmenu, "changed", - G_CALLBACK (language_menu_changed_cb), - NULL); -} - -static void -general_prefs_init (GeneralPrefs *dialog) -{ - dialog->priv = g_new0 (GeneralPrefsPrivate, 1); - - ephy_dialog_construct (EPHY_DIALOG(dialog), - properties, - "prefs-dialog.glade", - "general_page_box"); - - create_default_charset_menu (dialog); - create_language_menu (dialog); -} - -static void -general_prefs_finalize (GObject *object) -{ - GeneralPrefs *dialog; - - g_return_if_fail (object != NULL); - g_return_if_fail (IS_GENERAL_PREFS (object)); - - dialog = GENERAL_PREFS (object); - - g_return_if_fail (dialog->priv != NULL); - - g_free (dialog->priv); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -EphyDialog * -general_prefs_new (void) -{ - GeneralPrefs *dialog; - - dialog = GENERAL_PREFS (g_object_new (GENERAL_PREFS_TYPE, - NULL)); - - return EPHY_DIALOG(dialog); -} - -static void -set_homepage_entry (EphyDialog *dialog, - const char *new_location) -{ - GtkWidget *entry; - int pos; - - entry = ephy_dialog_get_control (dialog, HOMEPAGE_ENTRY_PROP); - - gtk_editable_delete_text (GTK_EDITABLE (entry), 0, -1); - gtk_editable_insert_text (GTK_EDITABLE (entry), new_location, - g_utf8_strlen (new_location, -1), - &pos); -} - -void -prefs_homepage_current_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog) -{ - EphyWindow *window; - EphyTab *tab; - - window = ephy_shell_get_active_window (ephy_shell); - g_return_if_fail (window != NULL); - - tab = ephy_window_get_active_tab (window); - g_return_if_fail (tab != NULL); - - set_homepage_entry (dialog, ephy_tab_get_location (tab)); -} - -void -prefs_homepage_blank_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog) -{ - set_homepage_entry (dialog, "about:blank"); -} - -static void -fill_language_editor (LanguageEditor *le) -{ - GSList *strings; - GSList *tmp; - int i; - - /* Fill the list */ - strings = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); - - for (tmp = strings; tmp != NULL; tmp = g_slist_next (tmp)) - { - char *value = (char *)tmp->data; - - i = 0; - while (languages[i].code && strcmp (languages[i].code, value) != 0) - { - i++; - } - - /* FIXME unsafe, bad prefs could cause it to access random memory */ - language_editor_add (le, languages[i].name, i); - } -} - -static void -language_dialog_changed_cb (LanguageEditor *le, - GSList *list, - GeneralPrefs *dialog) -{ - GtkWidget *optionmenu; - const GSList *l; - GSList *langs = NULL; - - optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), - LANGUAGE_PROP); - gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), - GPOINTER_TO_INT(list->data)); - - for (l = list; l != NULL; l = l->next) - { - int i = GPOINTER_TO_INT (l->data); - langs = g_slist_append (langs, languages[i].code); - } - - eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, langs); - g_slist_free (langs); -} - -void -prefs_language_more_button_clicked_cb (GtkWidget *button, - EphyDialog *dialog) -{ - LanguageEditor *editor; - GtkWidget *menu; - GtkWidget *toplevel; - - menu = general_prefs_new_language_menu (GENERAL_PREFS(dialog)); - - toplevel = gtk_widget_get_toplevel (button); - editor = language_editor_new (toplevel); - language_editor_set_menu (editor, menu); - fill_language_editor (editor); - ephy_dialog_set_modal (EPHY_DIALOG(editor), TRUE); - - g_signal_connect (editor, "changed", - G_CALLBACK(language_dialog_changed_cb), - dialog); - - ephy_dialog_show (EPHY_DIALOG(editor)); -} diff --git a/src/prefs-dialog.c b/src/prefs-dialog.c index de74939b1..6a9fa6e10 100644 --- a/src/prefs-dialog.c +++ b/src/prefs-dialog.c @@ -21,16 +21,15 @@ #endif #include "prefs-dialog.h" -#include "general-prefs.h" -#include "appearance-prefs.h" #include "ephy-dialog.h" #include "ephy-prefs.h" #include "ephy-embed-prefs.h" #include "ephy-shell.h" -#include "ephy-state.h" #include "ephy-gui.h" +#include "eel-gconf-extensions.h" +#include "language-editor.h" -#include <bonobo/bonobo-i18n.h> +#include <libgnome/gnome-i18n.h> #include <gtk/gtkframe.h> #include <gtk/gtkhbox.h> #include <gtk/gtkvbox.h> @@ -39,6 +38,7 @@ #include <gtk/gtkimage.h> #include <gtk/gtklabel.h> #include <gtk/gtkstock.h> +#include <string.h> static void prefs_dialog_class_init (PrefsDialogClass *klass); @@ -57,40 +57,204 @@ prefs_clear_memory_cache_button_clicked_cb (GtkWidget *button, void prefs_clear_disk_cache_button_clicked_cb (GtkWidget *button, gpointer data); +void +prefs_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer data); +void +fonts_language_optionmenu_changed_cb (GtkWidget *optionmenu, EphyDialog *dialog); +void +prefs_homepage_current_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog); +void +prefs_homepage_blank_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog); +void +prefs_language_more_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog); +/* FIXME duped in mozilla/ */ +const +char *lang_encode[] = +{ + "x-western", + "x-central-euro", + "ja", + "zh-TW", + "zh-CN", + "ko", + "x-cyrillic", + "x-baltic", + "el", + "tr", + "x-unicode", + "th", + "he", + "ar" +}; -/* Proxy page */ +static const +struct +{ + char *name; + char *code; +} +languages [] = +{ + { N_("Afrikaans"), "ak" }, + { N_("Albanian"), "sq" }, + { N_("Arabic"), "ar" }, + { N_("Azerbaijani"), "az" }, + { N_("Basque"), "eu" }, + { N_("Breton"), "br" }, + { N_("Bulgarian"), "bg" }, + { N_("Byelorussian"), "be" }, + { N_("Catalan"), "ca" }, + { N_("Chinese"), "zh" }, + { N_("Croatian"), "hr" }, + { N_("Czech"), "cs" }, + { N_("Danish"), "da" }, + { N_("Dutch"), "nl" }, + { N_("English"), "en" }, + { N_("Esperanto"), "eo" }, + { N_("Estonian"), "et" }, + { N_("Faeroese"), "fo" }, + { N_("Finnish"), "fi" }, + { N_("French"), "fr" }, + { N_("Galician"), "gl" }, + { N_("German"), "de" }, + { N_("Greek"), "el" }, + { N_("Hebrew"), "he" }, + { N_("Hungarian"), "hu" }, + { N_("Icelandic"), "is" }, + { N_("Indonesian"), "id" }, + { N_("Irish"), "ga" }, + { N_("Italian"), "it" }, + { N_("Japanese"), "ja" }, + { N_("Korean"), "ko" }, + { N_("Latvian"), "lv" }, + { N_("Lithuanian"), "lt" }, + { N_("Macedonian"), "mk" }, + { N_("Malay"), "ms" }, + { N_("Norwegian/Nynorsk"), "nn" }, + { N_("Norwegian/Bokmaal"), "nb" }, + { N_("Norwegian"), "no" }, + { N_("Polish"), "pl" }, + { N_("Portuguese"), "pt" }, + { N_("Portuguese of Brazil"), "pt-BR" }, + { N_("Romanian"), "ro" }, + { N_("Russian"), "ru" }, + { N_("Scottish"), "gd" }, + { N_("Serbian"), "sr" }, + { N_("Slovak"), "sk" }, + { N_("Slovenian"), "sl" }, + { N_("Spanish"), "es" }, + { N_("Swedish"), "sv" }, + { N_("Tamil"), "ta" }, + { N_("Turkish"), "tr" }, + { N_("Ukrainian"), "uk" }, + { N_("Vietnamian"), "vi" }, + { N_("Walloon"), "wa" }, + { NULL, NULL } +}; enum { - CACHE_COMPARE_PROP, - DISK_CACHE_PROP, - MEMORY_CACHE_PROP + FONT_TYPE_SERIF, + FONT_TYPE_SANSSERIF, + FONT_TYPE_MONOSPACE }; -static const -EphyDialogProperty network_properties [] = +const +char *fonts_types[] = { - { CACHE_COMPARE_PROP, "cache_compare_radiobutton", CONF_NETWORK_CACHE_COMPARE, PT_AUTOAPPLY, NULL }, - { DISK_CACHE_PROP, "disk_cache_spin", CONF_NETWORK_DISK_CACHE, PT_AUTOAPPLY, NULL }, - { MEMORY_CACHE_PROP, "memory_cache_spin", CONF_NETWORK_MEMORY_CACHE, PT_AUTOAPPLY, NULL }, + "serif", + "sans-serif", + "monospace" +}; - { -1, NULL, NULL } +enum +{ + FONT_SIZE_FIXED, + FONT_SIZE_VAR, + FONT_SIZE_MIN +}; + +const +char *size_prefs[] = +{ + CONF_RENDERING_FONT_FIXED_SIZE, + CONF_RENDERING_FONT_VAR_SIZE, + CONF_RENDERING_FONT_MIN_SIZE }; enum { + WINDOW_PROP, + NOTEBOOK_PROP, + + /* General */ OPEN_IN_TABS_PROP, - JUMP_TO_PROP, - POPUPS_PROP + HOMEPAGE_ENTRY_PROP, + NEW_PAGE_PROP, + AUTOCHARSET_PROP, + DEFAULT_CHARSET_PROP, + LANGUAGE_PROP, + + /* Appeareance */ + SERIF_PROP, + SANSSERIF_PROP, + MONOSPACE_PROP, + FIXED_SIZE_PROP, + VARIABLE_SIZE_PROP, + MIN_SIZE_PROP, + PROPORTIONAL_PROP, + BACKGROUND_PROP, + TEXT_PROP, + UNVISITED_PROP, + VISITED_PROP, + USE_SYSCOLORS_PROP, + USE_COLORS_PROP, + USE_FONTS_PROP, + + /* Advanced */ + CACHE_COMPARE_PROP, + DISK_CACHE_PROP, + MEMORY_CACHE_PROP }; static const -EphyDialogProperty ui_properties [] = +EphyDialogProperty properties [] = { + { WINDOW_PROP, "prefs_dialog", NULL, PT_NORMAL, NULL }, + { NOTEBOOK_PROP, "prefs_notebook", NULL, PT_NORMAL, NULL }, + + /* General */ { OPEN_IN_TABS_PROP, "open_in_tabs_checkbutton", CONF_TABS_TABBED, PT_AUTOAPPLY, NULL }, - { JUMP_TO_PROP, "jump_to_checkbutton", CONF_TABS_TABBED_AUTOJUMP, PT_AUTOAPPLY, NULL }, - { POPUPS_PROP, "popups_checkbutton", CONF_TABS_TABBED_POPUPS, PT_AUTOAPPLY, NULL }, + { HOMEPAGE_ENTRY_PROP, "homepage_entry", CONF_GENERAL_HOMEPAGE, PT_AUTOAPPLY, NULL }, + { NEW_PAGE_PROP, "new_page_show_homepage", CONF_GENERAL_NEWPAGE_TYPE, PT_AUTOAPPLY, NULL }, + { AUTOCHARSET_PROP, "autocharset_optionmenu", CONF_LANGUAGE_AUTODETECT_CHARSET, PT_AUTOAPPLY, NULL }, + { DEFAULT_CHARSET_PROP, "default_charset_optionmenu", NULL, PT_NORMAL, NULL }, + { LANGUAGE_PROP, "language_optionmenu", NULL, PT_NORMAL, NULL }, + + /* Appeareance */ + { SERIF_PROP, "serif_combo", NULL, PT_NORMAL, NULL }, + { SANSSERIF_PROP, "sansserif_combo", NULL, PT_NORMAL, NULL }, + { MONOSPACE_PROP, "monospace_combo", NULL, PT_NORMAL, NULL }, + { FIXED_SIZE_PROP, "fixed_size_spinbutton", NULL, PT_NORMAL, NULL }, + { VARIABLE_SIZE_PROP, "variable_size_spinbutton", NULL, PT_NORMAL, NULL }, + { MIN_SIZE_PROP, "min_size_spinbutton", NULL, PT_NORMAL, NULL }, + { PROPORTIONAL_PROP, "proportional_optionmenu", CONF_RENDERING_DEFAULT_FONT, PT_AUTOAPPLY, NULL }, + { BACKGROUND_PROP, "background_cpick", CONF_RENDERING_BG_COLOR, PT_AUTOAPPLY, NULL }, + { TEXT_PROP, "text_cpick", CONF_RENDERING_TEXT_COLOR, PT_AUTOAPPLY, NULL }, + { UNVISITED_PROP, "unvisited_cpick", CONF_RENDERING_UNVISITED_LINKS, PT_AUTOAPPLY, NULL }, + { VISITED_PROP, "visited_cpick", CONF_RENDERING_VISITED_LINKS, PT_AUTOAPPLY, NULL }, + { USE_SYSCOLORS_PROP, "use_syscolors_checkbutton", CONF_RENDERING_USE_SYSTEM_COLORS, PT_AUTOAPPLY, NULL }, + { USE_COLORS_PROP, "use_colors_checkbutton", CONF_RENDERING_USE_OWN_COLORS, PT_AUTOAPPLY, NULL }, + { USE_FONTS_PROP, "use_fonts_checkbutton", CONF_RENDERING_USE_OWN_FONTS, PT_AUTOAPPLY, NULL }, + + /* Advanced */ + { CACHE_COMPARE_PROP, "cache_compare_radiobutton", CONF_NETWORK_CACHE_COMPARE, PT_AUTOAPPLY, NULL }, + { DISK_CACHE_PROP, "disk_cache_spin", CONF_NETWORK_DISK_CACHE, PT_AUTOAPPLY, NULL }, + { MEMORY_CACHE_PROP, "memory_cache_spin", CONF_NETWORK_MEMORY_CACHE, PT_AUTOAPPLY, NULL }, { -1, NULL, NULL } }; @@ -98,6 +262,10 @@ EphyDialogProperty ui_properties [] = struct PrefsDialogPrivate { GtkWidget *notebook; + GtkWidget *window; + + int language; + gboolean switching; }; static GObjectClass *parent_class = NULL; @@ -122,7 +290,7 @@ prefs_dialog_get_type (void) (GInstanceInitFunc) prefs_dialog_init }; - prefs_dialog_type = g_type_register_static (GTK_TYPE_DIALOG, + prefs_dialog_type = g_type_register_static (EPHY_DIALOG_TYPE, "PrefsDialog", &our_info, 0); } @@ -131,12 +299,14 @@ prefs_dialog_get_type (void) } -GtkDialog * -prefs_dialog_new (void) +EphyDialog * +prefs_dialog_new (GtkWidget *parent) { - GtkDialog *dialog; + EphyDialog *dialog; - dialog = GTK_DIALOG (g_object_new (PREFS_DIALOG_TYPE, NULL)); + dialog = EPHY_DIALOG (g_object_new (PREFS_DIALOG_TYPE, + "ParentWindow", parent, + NULL)); return dialog; } @@ -168,188 +338,473 @@ prefs_dialog_finalize (GObject *object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static EphyDialog * -create_page (PrefsPageID id, - const char *page_widget, - const EphyDialogProperty *prop) +static void +prefs_dialog_show_help (PrefsDialog *pd) { - EphyDialog *page = NULL; + gint id; + + /* FIXME: Once we actually have documentation we + * should point these at the correct links. + */ + gchar *help_preferences[] = { + "setting-preferences", + "setting-preferences", + "setting-preferences", + "setting-preferences" + }; + + id = gtk_notebook_get_current_page (GTK_NOTEBOOK (pd->priv->notebook)); + + ephy_gui_help (GTK_WINDOW (pd), "epiphany", help_preferences[id]); +} + +static void +setup_font_menu (PrefsDialog *dialog, + const char *type, + GtkWidget *combo) +{ + char *default_font; + GList *fonts; + const char *name; + char key[255]; + int pos; + GtkWidget *entry = GTK_COMBO(combo)->entry; + EphyEmbedSingle *single; + + single = ephy_embed_shell_get_embed_single + (EPHY_EMBED_SHELL (ephy_shell)); + + ephy_embed_single_get_font_list (single, + lang_encode[dialog->priv->language], + type, &fonts, &default_font); + + /* Get the default font */ + sprintf (key, "%s_%s_%s", CONF_RENDERING_FONT, type, + lang_encode[dialog->priv->language]); + name = eel_gconf_get_string (key); + if (name == NULL) + { + name = default_font; + } + + /* set popdown doesnt like NULL */ + if (fonts == NULL) + { + fonts = g_list_alloc (); + } + + gtk_combo_set_popdown_strings (GTK_COMBO(combo), fonts); - switch (id) + /* set the default value */ + if (name != NULL) { - case PREFS_PAGE_GENERAL: - page = general_prefs_new (); - break; - case PREFS_PAGE_APPEARANCE: - page = appearance_prefs_new (); - break; - case PREFS_PAGE_UI: - case PREFS_PAGE_ADVANCED: - page = ephy_dialog_new (); - ephy_dialog_construct (EPHY_DIALOG(page), - prop, - "prefs-dialog.glade", - page_widget); - break; + gtk_editable_delete_text (GTK_EDITABLE(entry), 0, -1); + gtk_editable_insert_text (GTK_EDITABLE(entry), + name, g_utf8_strlen (name, -1), + &pos); } - return page; + g_free (default_font); + + g_list_foreach (fonts, (GFunc)g_free, NULL); + g_list_free (fonts); } -static EphyDialog * -prefs_dialog_get_page (PrefsDialog *pd, - PrefsPageID id) +static void +save_font_menu (PrefsDialog *dialog, + int type, + GtkWidget *entry) { - const char *page_widget = NULL; - EphyDialog *page; - const EphyDialogProperty *prop = NULL; + char *name; + char key[255]; - switch (id) + name = gtk_editable_get_chars + (GTK_EDITABLE(entry), 0, -1); + + /* do not save empty fonts */ + if (!name || *name == '\0') { - case PREFS_PAGE_APPEARANCE: - page_widget = "appearance_page_box"; - break; - case PREFS_PAGE_GENERAL: - page_widget = "general_page_box"; - break; - case PREFS_PAGE_UI: - page_widget = "ui_page_box"; - prop = ui_properties; - break; - case PREFS_PAGE_ADVANCED: - page_widget = "network_page_box"; - prop = network_properties; - break; + g_free (name); + return; } - g_assert (page_widget != NULL); + sprintf (key, "%s_%s_%s", CONF_RENDERING_FONT, + fonts_types[type], + lang_encode[dialog->priv->language]); + eel_gconf_set_string (key, name); + g_free (name); +} + +static void +font_entry_changed_cb (GtkWidget *entry, PrefsDialog *dialog) +{ + int type; - page = create_page (id, page_widget, prop); - g_assert (page != NULL); + if (dialog->priv->switching) return; - return page; + type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT(entry), + "type")); + save_font_menu (dialog, type, entry); } -void -prefs_dialog_show_page (PrefsDialog *pd, - PrefsPageID id) +static void +attach_font_signal (PrefsDialog *dialog, int prop, + gpointer type) { - gtk_notebook_set_current_page (GTK_NOTEBOOK (pd->priv->notebook), id); + GtkWidget *combo; + GtkWidget *entry; + + combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), + prop); + entry = GTK_COMBO(combo)->entry; + g_object_set_data (G_OBJECT(entry), "type", type); + g_signal_connect (entry, "changed", + G_CALLBACK(font_entry_changed_cb), + dialog); } static void -prefs_dialog_show_help (PrefsDialog *pd) +attach_fonts_signals (PrefsDialog *dialog) { - gint id; + attach_font_signal (dialog, SERIF_PROP, + GINT_TO_POINTER(FONT_TYPE_SERIF)); + attach_font_signal (dialog, SANSSERIF_PROP, + GINT_TO_POINTER(FONT_TYPE_SANSSERIF)); + attach_font_signal (dialog, MONOSPACE_PROP, + GINT_TO_POINTER(FONT_TYPE_MONOSPACE)); +} - /* FIXME: Once we actually have documentation we - * should point these at the correct links. - */ - gchar *help_preferences[] = { - "setting-preferences", - "setting-preferences", - "setting-preferences", - "setting-preferences" - }; +static void +size_spinbutton_changed_cb (GtkWidget *spin, PrefsDialog *dialog) +{ + int type; + char key[255]; - id = gtk_notebook_get_current_page (GTK_NOTEBOOK (pd->priv->notebook)); + if (dialog->priv->switching) return; - ephy_gui_help (GTK_WINDOW (pd), "epiphany", help_preferences[id]); + type = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(spin), "type")); + + sprintf (key, "%s_%s", + size_prefs[type], + lang_encode[dialog->priv->language]); + eel_gconf_set_integer (key, gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin))); } static void -prefs_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer data) +attach_size_controls_signals (PrefsDialog *dialog) { - if (response_id == GTK_RESPONSE_CLOSE) - { - gtk_widget_destroy (GTK_WIDGET(dialog)); - } - else if (response_id == GTK_RESPONSE_HELP) - { - PrefsDialog *pd = (PrefsDialog *)data; - prefs_dialog_show_help (pd); - } + GtkWidget *spin; + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + FIXED_SIZE_PROP); + g_object_set_data (G_OBJECT(spin), "type", + GINT_TO_POINTER(FONT_SIZE_FIXED)); + g_signal_connect (spin, "value_changed", + G_CALLBACK(size_spinbutton_changed_cb), + dialog); + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + VARIABLE_SIZE_PROP); + g_object_set_data (G_OBJECT(spin), "type", + GINT_TO_POINTER(FONT_SIZE_VAR)); + g_signal_connect (spin, "value_changed", + G_CALLBACK(size_spinbutton_changed_cb), + dialog); + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + MIN_SIZE_PROP); + g_object_set_data (G_OBJECT(spin), "type", + GINT_TO_POINTER(FONT_SIZE_MIN)); + g_signal_connect (spin, "value_changed", + G_CALLBACK(size_spinbutton_changed_cb), + dialog); +} + +static void +setup_size_control (PrefsDialog *dialog, + const char *pref, + int default_size, + GtkWidget *spin) +{ + char key[255]; + int size; + + sprintf (key, "%s_%s", pref, + lang_encode[dialog->priv->language]); + size = eel_gconf_get_integer (key); + + if (size == 0) size = default_size; + + gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin), size); +} + +static void +setup_size_controls (PrefsDialog *dialog) +{ + GtkWidget *spin; + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + FIXED_SIZE_PROP); + setup_size_control (dialog, CONF_RENDERING_FONT_FIXED_SIZE, 12, spin); + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + VARIABLE_SIZE_PROP); + setup_size_control (dialog, CONF_RENDERING_FONT_VAR_SIZE, 16, spin); + + spin = ephy_dialog_get_control (EPHY_DIALOG(dialog), + MIN_SIZE_PROP); + setup_size_control (dialog, CONF_RENDERING_FONT_MIN_SIZE, 0, spin); +} + +static void +setup_fonts (PrefsDialog *dialog) +{ + GtkWidget *combo; + + dialog->priv->switching = TRUE; + + combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), + SERIF_PROP); + setup_font_menu (dialog, "serif", combo); + + combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), + SANSSERIF_PROP); + setup_font_menu (dialog, "sans-serif", combo); + + combo = ephy_dialog_get_control (EPHY_DIALOG(dialog), + MONOSPACE_PROP); + setup_font_menu (dialog, "monospace", combo); + + dialog->priv->switching = FALSE; } static void -prefs_build_notebook (PrefsDialog *pd) +default_charset_menu_changed_cb (GtkOptionMenu *option_menu, + EphyEmbedShell *shell) { + GList *charsets; int i; - GtkWidget *nb; + CharsetInfo *info; + EphyEmbedSingle *single; + + single = ephy_embed_shell_get_embed_single + (EPHY_EMBED_SHELL (ephy_shell)); + + ephy_embed_single_get_charset_titles (single, NULL, &charsets); - struct + i = gtk_option_menu_get_history (option_menu); + charsets = g_list_nth (charsets, i); + g_assert (charsets != NULL); + info = (CharsetInfo *) charsets->data; + eel_gconf_set_string (CONF_LANGUAGE_DEFAULT_CHARSET, + info->name); + + g_list_free (charsets); +} + +static gint +find_charset_in_list_cmp (gconstpointer a, + gconstpointer b) +{ + CharsetInfo *info = (CharsetInfo *)a; + const char *value = b; + + return (strcmp (info->name, value)); +} + +static void +create_default_charset_menu (PrefsDialog *dialog) +{ + GList *l; + GList *charsets; + GtkWidget *menu; + GtkWidget *optionmenu; + char *value; + EphyEmbedSingle *single; + + single = ephy_embed_shell_get_embed_single + (EPHY_EMBED_SHELL (ephy_shell)); + + ephy_embed_single_get_charset_titles (single, NULL, &l); + + menu = gtk_menu_new (); + + optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), + DEFAULT_CHARSET_PROP); + + for (charsets = l; charsets != NULL; charsets = charsets->next) { - char *name; - int id; + CharsetInfo *info = (CharsetInfo *) charsets->data; + GtkWidget *item; + + item = gtk_menu_item_new_with_label (info->title); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), + item); + gtk_widget_show (item); } - pages[] = - { - { _("General"), PREFS_PAGE_GENERAL }, - { _("Appearance"), PREFS_PAGE_APPEARANCE }, - { _("User Interface"), PREFS_PAGE_UI }, - { _("Advanced"), PREFS_PAGE_ADVANCED }, - { NULL, 0 } - }; + gtk_option_menu_set_menu (GTK_OPTION_MENU(optionmenu), menu); - gtk_dialog_add_button (GTK_DIALOG (pd), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); + /* init value */ + charsets = l; + value = eel_gconf_get_string (CONF_LANGUAGE_DEFAULT_CHARSET); + g_return_if_fail (value != NULL); + charsets = g_list_find_custom (charsets, (gconstpointer)value, + (GCompareFunc)find_charset_in_list_cmp); + gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), + g_list_position (l, charsets)); + g_free (value); - gtk_dialog_add_button (GTK_DIALOG (pd), GTK_STOCK_HELP, GTK_RESPONSE_HELP); - g_signal_connect (pd, "response", - G_CALLBACK (prefs_dialog_response_cb), - pd); + g_signal_connect (optionmenu, "changed", + G_CALLBACK (default_charset_menu_changed_cb), + embed_shell); - gtk_container_set_border_width (GTK_CONTAINER (pd), 5); + g_list_free (l); +} + +static GtkWidget * +general_prefs_new_language_menu (PrefsDialog *dialog) +{ + int i; + GtkWidget *menu; - nb = gtk_notebook_new (); - gtk_container_set_border_width (GTK_CONTAINER (nb), 5); - gtk_widget_show (nb); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (pd)->vbox), nb); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (nb), TRUE); - pd->priv->notebook = nb; + menu = gtk_menu_new (); - for (i = 0; pages[i].name != NULL; i++) + for (i = 0; languages[i].name != NULL; i++) { - GtkWidget *label, *child; - EphyDialog *page; + GtkWidget *item; + + item = gtk_menu_item_new_with_label (languages[i].name); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), + item); + gtk_widget_show (item); + g_object_set_data (G_OBJECT(item), "desc", + languages[i].name); + } + + return menu; +} + +static void +language_menu_changed_cb (GtkOptionMenu *option_menu, + gpointer data) +{ + GSList *list; + GSList *l = NULL; + int history; + + list = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); + l = g_slist_copy (list); + + /* Subst the first item according to the optionmenu */ + history = gtk_option_menu_get_history (option_menu); + l->data = languages [history].code; + + eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, l); + + g_slist_free (l); +} + +static void +create_language_menu (PrefsDialog *dialog) +{ + GtkWidget *optionmenu; + GtkWidget *menu; + const char *value; + int i; + GSList *list; - page = prefs_dialog_get_page (pd, pages[i].id); + optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), + LANGUAGE_PROP); - child = gtk_hbox_new (FALSE, 0); - gtk_widget_show (child); - label = gtk_label_new (pages[i].name); - gtk_notebook_append_page (GTK_NOTEBOOK (nb), - child, label); + menu = general_prefs_new_language_menu (dialog); - ephy_dialog_show_embedded (page, child); + gtk_option_menu_set_menu (GTK_OPTION_MENU(optionmenu), menu); + + /* init value */ + list = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); + g_return_if_fail (list != NULL); + value = (const char *)list->data; + + i = 0; + while (languages[i].code && strcmp (languages[i].code, value) != 0) + { + i++; } + + gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), i); + + g_signal_connect (optionmenu, "changed", + G_CALLBACK (language_menu_changed_cb), + NULL); } static void +set_homepage_entry (EphyDialog *dialog, + const char *new_location) +{ + GtkWidget *entry; + int pos; + + entry = ephy_dialog_get_control (dialog, HOMEPAGE_ENTRY_PROP); + + gtk_editable_delete_text (GTK_EDITABLE (entry), 0, -1); + gtk_editable_insert_text (GTK_EDITABLE (entry), new_location, + g_utf8_strlen (new_location, -1), + &pos); +} + + +static void prefs_dialog_init (PrefsDialog *pd) { + EphyDialog *dialog = EPHY_DIALOG (pd); GdkPixbuf *icon; + pd->priv = g_new0 (PrefsDialogPrivate, 1); - gtk_window_set_title (GTK_WINDOW(pd), _("Preferences")); - gtk_dialog_set_has_separator (GTK_DIALOG(pd), FALSE); - - ephy_state_add_window (GTK_WIDGET(pd), - "prefs_dialog", -1, -1); - - icon = gtk_widget_render_icon (GTK_WIDGET(pd), - GTK_STOCK_PREFERENCES, - GTK_ICON_SIZE_MENU, - "prefs_dialog"); - gtk_window_set_icon (GTK_WINDOW(pd), icon); + ephy_dialog_construct (EPHY_DIALOG (pd), + properties, + "prefs-dialog.glade", + "prefs_dialog"); + + pd->priv->window = ephy_dialog_get_control (dialog, WINDOW_PROP); + pd->priv->notebook = ephy_dialog_get_control (dialog, NOTEBOOK_PROP); + + + icon = gtk_widget_render_icon (pd->priv->window, + GTK_STOCK_PREFERENCES, + GTK_ICON_SIZE_MENU, + "prefs_dialog"); + gtk_window_set_icon (GTK_WINDOW (pd->priv->window), icon); g_object_unref(icon); - prefs_build_notebook (pd); + pd->priv->switching = FALSE; + setup_fonts (pd); + setup_size_controls (pd); + attach_fonts_signals (pd); + attach_size_controls_signals (pd); + create_default_charset_menu (pd); + create_language_menu (pd); } /* Network page callbacks */ void +prefs_dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer data) +{ + if (response_id == GTK_RESPONSE_CLOSE) + { + gtk_widget_destroy (GTK_WIDGET(dialog)); + } + else if (response_id == GTK_RESPONSE_HELP) + { + PrefsDialog *pd = (PrefsDialog *)data; + prefs_dialog_show_help (pd); + } +} + +void prefs_clear_memory_cache_button_clicked_cb (GtkWidget *button, gpointer data) { @@ -372,3 +827,114 @@ prefs_clear_disk_cache_button_clicked_cb (GtkWidget *button, ephy_embed_single_clear_cache (single, DISK_CACHE); } + +void +fonts_language_optionmenu_changed_cb (GtkWidget *optionmenu, + EphyDialog *dialog) +{ + int i; + PrefsDialog *pd = PREFS_DIALOG (dialog); + + i = gtk_option_menu_get_history + (GTK_OPTION_MENU (optionmenu)); + + pd->priv->language = i; + + setup_fonts (pd); + setup_size_controls (pd); +} + +void +prefs_homepage_current_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog) +{ + EphyWindow *window; + EphyTab *tab; + + window = ephy_shell_get_active_window (ephy_shell); + g_return_if_fail (window != NULL); + + tab = ephy_window_get_active_tab (window); + g_return_if_fail (tab != NULL); + + set_homepage_entry (dialog, ephy_tab_get_location (tab)); +} + +void +prefs_homepage_blank_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog) +{ + set_homepage_entry (dialog, "about:blank"); +} + +static void +fill_language_editor (LanguageEditor *le) +{ + GSList *strings; + GSList *tmp; + int i; + + /* Fill the list */ + strings = eel_gconf_get_string_list (CONF_RENDERING_LANGUAGE); + + for (tmp = strings; tmp != NULL; tmp = g_slist_next (tmp)) + { + char *value = (char *)tmp->data; + + i = 0; + while (languages[i].code && strcmp (languages[i].code, value) != 0) + { + i++; + } + + /* FIXME unsafe, bad prefs could cause it to access random memory */ + language_editor_add (le, languages[i].name, i); + } +} + +static void +language_dialog_changed_cb (LanguageEditor *le, + GSList *list, + PrefsDialog *dialog) +{ + GtkWidget *optionmenu; + const GSList *l; + GSList *langs = NULL; + + optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog), + LANGUAGE_PROP); + gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu), + GPOINTER_TO_INT(list->data)); + + for (l = list; l != NULL; l = l->next) + { + int i = GPOINTER_TO_INT (l->data); + langs = g_slist_append (langs, languages[i].code); + } + + eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, langs); + g_slist_free (langs); +} + +void +prefs_language_more_button_clicked_cb (GtkWidget *button, + EphyDialog *dialog) +{ + LanguageEditor *editor; + GtkWidget *menu; + GtkWidget *toplevel; + + menu = general_prefs_new_language_menu (PREFS_DIALOG (dialog)); + + toplevel = gtk_widget_get_toplevel (button); + editor = language_editor_new (toplevel); + language_editor_set_menu (editor, menu); + fill_language_editor (editor); + ephy_dialog_set_modal (EPHY_DIALOG(editor), TRUE); + + g_signal_connect (editor, "changed", + G_CALLBACK(language_dialog_changed_cb), + dialog); + + ephy_dialog_show (EPHY_DIALOG(editor)); +} diff --git a/src/prefs-dialog.h b/src/prefs-dialog.h index 3c5528b2f..358886d10 100644 --- a/src/prefs-dialog.h +++ b/src/prefs-dialog.h @@ -19,7 +19,8 @@ #ifndef PREFS_DIALOG_H #define PREFS_DIALOG_H -#include <gtk/gtkdialog.h> +#include "ephy-dialog.h" + #include <glib-object.h> #include <glib.h> @@ -34,30 +35,19 @@ typedef struct PrefsDialogClass PrefsDialogClass; typedef struct PrefsDialogPrivate PrefsDialogPrivate; -typedef enum -{ - PREFS_PAGE_GENERAL, - PREFS_PAGE_APPEARANCE, - PREFS_PAGE_UI, - PREFS_PAGE_ADVANCED -} PrefsPageID; - struct PrefsDialog { - GtkDialog parent; + EphyDialog parent; PrefsDialogPrivate *priv; }; struct PrefsDialogClass { - GtkDialogClass parent_class; + EphyDialogClass parent_class; }; GType prefs_dialog_get_type (void); -GtkDialog *prefs_dialog_new (void); - -void prefs_dialog_show_page (PrefsDialog *pd, - PrefsPageID id); +EphyDialog *prefs_dialog_new (GtkWidget *parent); #endif diff --git a/src/window-commands.c b/src/window-commands.c index a64305efe..5d50f6e05 100644 --- a/src/window-commands.c +++ b/src/window-commands.c @@ -633,14 +633,10 @@ void window_cmd_edit_prefs (EggAction *action, EphyWindow *window) { - GtkDialog *dialog; + EphyDialog *dialog; - dialog = prefs_dialog_new (); - prefs_dialog_show_page (PREFS_DIALOG(dialog), - PREFS_PAGE_GENERAL); - gtk_window_set_transient_for (GTK_WINDOW (dialog), - GTK_WINDOW (window)); - gtk_widget_show (GTK_WIDGET(dialog)); + dialog = prefs_dialog_new (GTK_WIDGET (window)); + ephy_dialog_show (dialog); } static void |