aboutsummaryrefslogtreecommitdiffstats
path: root/src/general-prefs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/general-prefs.c')
-rwxr-xr-xsrc/general-prefs.c484
1 files changed, 484 insertions, 0 deletions
diff --git a/src/general-prefs.c b/src/general-prefs.c
new file mode 100755
index 000000000..f9eecf4e6
--- /dev/null
+++ b/src/general-prefs.c
@@ -0,0 +1,484 @@
+/*
+ * 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-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;
+
+ ephy_embed_shell_get_charset_titles (shell, 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)
+{
+ EphyEmbedShell *shell;
+ GList *l;
+ GList *charsets;
+ GtkWidget *menu;
+ GtkWidget *optionmenu;
+ char *value;
+
+ shell = ephy_shell_get_embed_shell (ephy_shell);
+ ephy_embed_shell_get_charset_titles (shell, 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);
+ 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),
+ 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;
+ GSList *l = list;
+ GSList *langs = NULL;
+
+ optionmenu = ephy_dialog_get_control (EPHY_DIALOG (dialog),
+ LANGUAGE_PROP);
+ gtk_option_menu_set_history (GTK_OPTION_MENU(optionmenu),
+ (int)(l->data));
+
+ for (; l != NULL; l = l->next)
+ {
+ int i = (int)l->data;
+ langs = g_slist_append (langs, languages[i].code);
+ }
+
+ eel_gconf_set_string_list (CONF_RENDERING_LANGUAGE, 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));
+}