aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--embed/ephy-encodings.c159
-rw-r--r--embed/ephy-encodings.h3
-rw-r--r--src/ephy-encoding-dialog.c4
-rw-r--r--src/ephy-encoding-menu.c40
-rw-r--r--src/prefs-dialog.c2
6 files changed, 154 insertions, 73 deletions
diff --git a/ChangeLog b/ChangeLog
index 16cf95d04..c95a93710 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
2004-01-06 Christian Persch <chpe@cvs.gnome.org>
+ * embed/ephy-encodings.c: (add_encoding),
+ (ephy_encodings_get_node), (ephy_encodings_add_recent),
+ (ephy_encodings_get_recent), (ephy_encodings_init):
+ * embed/ephy-encodings.h:
+ * src/ephy-encoding-dialog.c: (sync_embed_cb):
+ * src/ephy-encoding-menu.c: (update_encoding_menu_cb),
+ (add_action), (ephy_encoding_menu_set_window):
+ * src/prefs-dialog.c: (create_node_combo):
+
+ Behave better when the encoding used on the page is unknown to us.
+ Previously we skipped important steps in menu building, resulting in
+ incorrect encoding indicator. Now, we dynamically add an entry with
+ name "Unknown" to our menu.
+
+ Also add back some rarely used encodings (us-ascii, UTF-16*, UTF-32*)
+ to our known encodings repertoire.
+
+2004-01-06 Christian Persch <chpe@cvs.gnome.org>
+
* src/ephy-encoding-menu.c: (update_encoding_menu_cb):
Always set the "automatic" toggle button correctly, even if the encoding
diff --git a/embed/ephy-encodings.c b/embed/ephy-encodings.c
index 2500c78b8..7af9877ee 100644
--- a/embed/ephy-encodings.c
+++ b/embed/ephy-encodings.c
@@ -137,6 +137,15 @@ encoding_entries [] =
{ N_("Western (_MacRoman)"), "x-mac-roman", LG_WESTERN, FALSE },
{ N_("Western (_Windows-1252)"), "windows-1252", LG_WESTERN, FALSE },
+ /* the following encodings are so rarely used that we don't want to pollute the "related"
+ * part of the encodings menu with them, so we set the language group to 0 here
+ */
+ { N_("English (_US-ASCII)"), "us-ascii", 0, FALSE },
+ { N_("Unicode (UTF-_16 BE)"), "UTF-16BE", 0, FALSE },
+ { N_("Unicode (UTF-1_6 LE)"), "UTF-16LE", 0, FALSE},
+ { N_("Unicode (UTF-_32 BE)"), "UTF-32BE", 0, FALSE },
+ { N_("Unicode (UTF-3_2 LE)"), "UTF-32LE", 0, FALSE },
+
{ N_("Off"), "", LG_NONE, TRUE },
{ N_("Chinese"), "zh_parallel_state_machine", LG_CHINESE_TRAD | LG_CHINESE_SIMP, TRUE },
{ N_("Chinese Simplified"), "zhcn_parallel_state_machine", LG_CHINESE_SIMP, TRUE },
@@ -226,13 +235,92 @@ ephy_encodings_class_init (EphyEncodingsClass *klass)
g_type_class_add_private (object_class, sizeof (EphyEncodingsPrivate));
}
+static EphyNode *
+add_encoding (EphyEncodings *encodings,
+ const char *title,
+ const char *code,
+ EphyLanguageGroup groups,
+ gboolean is_autodetector)
+{
+ EphyNode *node;
+ char *elided, *normalised;
+ GValue value = { 0, };
+
+ node = ephy_node_new (encodings->priv->db);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, title);
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_TITLE, &value);
+ g_value_unset (&value);
+
+ elided = ephy_string_elide_underscores (title);
+ normalised = g_utf8_normalize (elided, -1, G_NORMALIZE_DEFAULT);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_take_string (&value, g_utf8_collate_key (normalised, -1));
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_COLLATION_KEY, &value);
+ g_value_unset (&value);
+
+ g_free (normalised);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_take_string (&value, elided);
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_TITLE_ELIDED, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_string (&value, code);
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_ENCODING, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, groups);
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_LANGUAGE_GROUPS, &value);
+ g_value_unset (&value);
+
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, is_autodetector);
+ ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_IS_AUTODETECTOR, &value);
+ g_value_unset (&value);
+
+ /* now insert the node in our structure */
+ ephy_node_add_child (encodings->priv->root, node);
+ g_hash_table_insert (encodings->priv->hash, g_strdup (code), node);
+
+ if (is_autodetector)
+ {
+ ephy_node_add_child (encodings->priv->detectors, node);
+ }
+ else
+ {
+ ephy_node_add_child (encodings->priv->encodings, node);
+ }
+
+ return node;
+}
+
EphyNode *
ephy_encodings_get_node (EphyEncodings *encodings,
- const char *code)
+ const char *code,
+ gboolean add_if_not_found)
{
+ EphyNode *node;
+
g_return_val_if_fail (EPHY_IS_ENCODINGS (encodings), NULL);
- return g_hash_table_lookup (encodings->priv->hash, code);
+ node = g_hash_table_lookup (encodings->priv->hash, code);
+
+ /* if it doesn't exist, add a node for it */
+ if (!EPHY_IS_NODE (node) && add_if_not_found)
+ {
+ char *title;
+
+ title = g_strdup_printf (_("Unknown (%s)"), code);
+ node = add_encoding (encodings, title, code, 0, FALSE);
+ g_free (title);
+ }
+
+ return node;
}
GList *
@@ -287,7 +375,8 @@ ephy_encodings_add_recent (EphyEncodings *encodings,
g_return_if_fail (EPHY_IS_ENCODINGS (encodings));
g_return_if_fail (code != NULL);
- g_return_if_fail (ephy_encodings_get_node (encodings, code) != NULL);
+
+ if (ephy_encodings_get_node (encodings, code, FALSE) == NULL) return;
/* keep the list elements unique */
element = g_slist_find_custom (encodings->priv->recent, code,
@@ -328,7 +417,7 @@ ephy_encodings_get_recent (EphyEncodings *encodings)
{
EphyNode *node;
- node = ephy_encodings_get_node (encodings, (char *) l->data);
+ node = ephy_encodings_get_node (encodings, (char *) l->data, FALSE);
g_return_val_if_fail (EPHY_IS_NODE (node), NULL);
list = g_list_prepend (list, node);
@@ -351,7 +440,9 @@ ephy_encodings_init (EphyEncodings *encodings)
db = ephy_node_db_new ("EncodingsDB");
encodings->priv->db = db;
- encodings->priv->hash = g_hash_table_new (g_str_hash, g_str_equal);
+ encodings->priv->hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ NULL);
encodings->priv->root = ephy_node_new_with_id (db, ALL_NODE_ID);
encodings->priv->encodings = ephy_node_new_with_id (db, ENCODINGS_NODE_ID);
@@ -364,57 +455,11 @@ ephy_encodings_init (EphyEncodings *encodings)
/* now fill the db */
for (i = 0; i < n_encoding_entries; i++)
{
- EphyNode *node;
- char *elided, *normalised;
- GValue value = { 0, };
-
- node = ephy_node_new (db);
- ephy_node_add_child (encodings->priv->root, node);
- g_hash_table_insert (encodings->priv->hash, encoding_entries[i].code, node);
-
- if (encoding_entries[i].is_autodetector)
- {
- ephy_node_add_child (encodings->priv->detectors, node);
- }
- else
- {
- ephy_node_add_child (encodings->priv->encodings, node);
- }
-
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, _(encoding_entries[i].title));
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_TITLE, &value);
- g_value_unset (&value);
-
- elided = ephy_string_elide_underscores (_(encoding_entries[i].title));
- normalised = g_utf8_normalize (elided, -1, G_NORMALIZE_DEFAULT);
-
- g_value_init (&value, G_TYPE_STRING);
- g_value_take_string (&value, g_utf8_collate_key (normalised, -1));
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_COLLATION_KEY, &value);
- g_value_unset (&value);
-
- g_free (normalised);
-
- g_value_init (&value, G_TYPE_STRING);
- g_value_take_string (&value, elided);
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_TITLE_ELIDED, &value);
- g_value_unset (&value);
-
- g_value_init (&value, G_TYPE_STRING);
- g_value_set_string (&value, encoding_entries[i].code);
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_ENCODING, &value);
- g_value_unset (&value);
-
- g_value_init (&value, G_TYPE_INT);
- g_value_set_int (&value, encoding_entries[i].groups);
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_LANGUAGE_GROUPS, &value);
- g_value_unset (&value);
-
- g_value_init (&value, G_TYPE_BOOLEAN);
- g_value_set_boolean (&value, encoding_entries[i].is_autodetector);
- ephy_node_set_property (node, EPHY_NODE_ENCODING_PROP_IS_AUTODETECTOR, &value);
- g_value_unset (&value);
+ add_encoding (encodings,
+ _(encoding_entries[i].title),
+ encoding_entries[i].code,
+ encoding_entries[i].groups,
+ encoding_entries[i].is_autodetector);
}
/* get the list of recently used encodings */
@@ -428,7 +473,7 @@ ephy_encodings_init (EphyEncodings *encodings)
{
if (g_slist_find (encodings->priv->recent, l->data) == NULL
&& g_slist_length (encodings->priv->recent) < RECENT_MAX
- && ephy_encodings_get_node (encodings, l->data) != NULL)
+ && ephy_encodings_get_node (encodings, l->data, FALSE) != NULL)
{
encodings->priv->recent =
g_slist_prepend (encodings->priv->recent,
diff --git a/embed/ephy-encodings.h b/embed/ephy-encodings.h
index 9a565344a..6ab26cfa4 100644
--- a/embed/ephy-encodings.h
+++ b/embed/ephy-encodings.h
@@ -130,7 +130,8 @@ GType ephy_encodings_get_type (void);
EphyEncodings *ephy_encodings_new (void);
EphyNode *ephy_encodings_get_node (EphyEncodings *encodings,
- const char *code);
+ const char *code,
+ gboolean add_if_not_found);
GList *ephy_encodings_get_encodings (EphyEncodings *encodings,
EphyLanguageGroup group_mask);
diff --git a/src/ephy-encoding-dialog.c b/src/ephy-encoding-dialog.c
index e57ec558a..700f15c61 100644
--- a/src/ephy-encoding-dialog.c
+++ b/src/ephy-encoding-dialog.c
@@ -128,8 +128,8 @@ sync_embed_cb (EphyEncodingDialog *dialog, GParamSpec *pspec, gpointer dummy)
info = ephy_embed_get_encoding_info (embed);
if (info == NULL) return;
- node = ephy_encodings_get_node (dialog->priv->encodings, info->encoding);
- if (!EPHY_IS_NODE (node)) return;
+ node = ephy_encodings_get_node (dialog->priv->encodings, info->encoding, TRUE);
+ g_assert (EPHY_IS_NODE (node));
/* select the current encoding in the list view */
ephy_node_view_select_node (EPHY_NODE_VIEW (dialog->priv->enc_view),
diff --git a/src/ephy-encoding-menu.c b/src/ephy-encoding-menu.c
index ee42f692d..11c4d44aa 100644
--- a/src/ephy-encoding-menu.c
+++ b/src/ephy-encoding-menu.c
@@ -183,11 +183,8 @@ update_encoding_menu_cb (GtkAction *dummy, EphyEncodingMenu *menu)
encoding = info->encoding;
- enc_node = ephy_encodings_get_node (p->encodings, encoding);
- if (!EPHY_IS_NODE (enc_node))
- {
- goto build_menu;
- }
+ enc_node = ephy_encodings_get_node (p->encodings, encoding, TRUE);
+ g_assert (EPHY_IS_NODE (enc_node));
/* set the encodings group's active member */
g_snprintf (name, sizeof (name), "Encoding%s", encoding);
@@ -207,7 +204,7 @@ update_encoding_menu_cb (GtkAction *dummy, EphyEncodingMenu *menu)
if (g_list_find (related, enc_node) == NULL
&& g_list_find (recent, enc_node) == NULL)
{
- recent = g_list_prepend (recent, enc_node);
+ related = g_list_prepend (related, enc_node);
}
/* make sure related and recent are disjoint so we don't display twice */
@@ -227,7 +224,6 @@ build_menu:
gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), is_automatic);
g_object_set (G_OBJECT (action), "sensitive", !is_automatic, NULL);
-
/* clear the menu */
if (p->merge_id > 0)
{
@@ -313,7 +309,7 @@ encoding_activate_cb (GtkAction *action, EphyEncodingMenu *menu)
}
static void
-add_action (EphyNode *node, EphyEncodingMenu *menu)
+add_action (EphyNode *encodings, EphyNode *node, EphyEncodingMenu *menu)
{
GtkAction *action;
char name[128];
@@ -324,6 +320,8 @@ add_action (EphyNode *node, EphyEncodingMenu *menu)
title = ephy_node_get_property_string
(node, EPHY_NODE_ENCODING_PROP_TITLE);
+ LOG ("add_action for encoding '%s'", encoding)
+
g_snprintf (name, sizeof (name), "Encoding%s", encoding);
action = g_object_new (GTK_TYPE_RADIO_ACTION,
@@ -397,7 +395,9 @@ ephy_encoding_menu_set_window (EphyEncodingMenu *menu, EphyWindow *window)
{
GtkActionGroup *action_group;
GtkAction *action;
- GList *encodings;
+ EphyNode *encodings;
+ GPtrArray *children;
+ int i;
g_return_if_fail (EPHY_IS_WINDOW (window));
@@ -413,9 +413,25 @@ ephy_encoding_menu_set_window (EphyEncodingMenu *menu, EphyWindow *window)
gtk_action_group_add_toggle_actions (action_group, toggle_menu_entries,
n_toggle_menu_entries, menu);
- encodings = ephy_encodings_get_encodings (menu->priv->encodings, LG_ALL);
- g_list_foreach (encodings, (GFunc) add_action, menu);
- g_list_free (encodings);
+ /* add actions for the existing encodings */
+ encodings = ephy_encodings_get_all (menu->priv->encodings);
+ children = ephy_node_get_children (encodings);
+ for (i = 0; i < children->len; i++)
+ {
+ EphyNode *encoding;
+
+ encoding = (EphyNode *) g_ptr_array_index (children, i);
+ add_action (encodings, encoding, menu);
+ }
+
+ /* when we encounter an unknown encoding, it is added to the database,
+ * so we need to listen to child_added on the encodings node to
+ * add an action for it
+ */
+ ephy_node_signal_connect_object (encodings,
+ EPHY_NODE_CHILD_ADDED,
+ (EphyNodeCallback) add_action,
+ G_OBJECT (menu));
gtk_ui_manager_insert_action_group (menu->priv->manager,
action_group, 0);
diff --git a/src/prefs-dialog.c b/src/prefs-dialog.c
index f0efa27b2..5046aa267 100644
--- a/src/prefs-dialog.c
+++ b/src/prefs-dialog.c
@@ -590,7 +590,7 @@ create_node_combo (EphyDialog *dialog,
int title_col, data_col;
code = eel_gconf_get_string (key);
- if (code == NULL || ephy_encodings_get_node (encodings, code) == NULL)
+ if (code == NULL || ephy_encodings_get_node (encodings, code, FALSE) == NULL)
{
/* safe default */
eel_gconf_set_string (key, default_value);