aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/mozilla-notifiers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'embed/mozilla/mozilla-notifiers.cpp')
-rw-r--r--embed/mozilla/mozilla-notifiers.cpp124
1 files changed, 121 insertions, 3 deletions
diff --git a/embed/mozilla/mozilla-notifiers.cpp b/embed/mozilla/mozilla-notifiers.cpp
index 19ffd1a98..9901bdbe2 100644
--- a/embed/mozilla/mozilla-notifiers.cpp
+++ b/embed/mozilla/mozilla-notifiers.cpp
@@ -72,7 +72,8 @@ free_pref_data (PrefData *data)
{
g_free (data->gconf_key);
g_free (data->mozilla_pref);
- g_free (data);
+
+ g_slice_free (PrefData, data);
}
static gboolean
@@ -414,6 +415,9 @@ static const PrefData notifier_entries[] =
{ CONF_SECURITY_ALLOW_POPUPS,
"dom.disable_open_during_load",
mozilla_notifier_transform_bool_invert },
+ { CONF_DISPLAY_SMOOTHSCROLL,
+ "general.smoothScroll",
+ mozilla_notifier_transform_bool },
{ CONF_IMAGE_ANIMATION_MODE,
"image.animation_mode",
transform_image_animation_mode },
@@ -485,10 +489,23 @@ mozilla_pref_set (const char *pref,
g_return_val_if_fail (value != NULL, FALSE);
nsresult rv;
+ PRInt32 prefType;
+ rv = gPrefBranch->GetPrefType (pref, &prefType);
+ if (NS_FAILED (rv))
+ {
+ /* probably just an unset pref */
+ prefType = nsIPrefBranch::PREF_INVALID;
+ rv = NS_OK;
+ }
+
switch (G_VALUE_TYPE (value))
{
case G_TYPE_INT:
{
+ if (prefType != nsIPrefBranch::PREF_INT &&
+ prefType != nsIPrefBranch::PREF_INVALID)
+ break;
+
PRInt32 old_value = 0;
PRInt32 new_value = g_value_get_int (value);
rv = gPrefBranch->GetIntPref (pref, &old_value);
@@ -500,6 +517,10 @@ mozilla_pref_set (const char *pref,
}
case G_TYPE_BOOLEAN:
{
+ if (prefType != nsIPrefBranch::PREF_BOOL &&
+ prefType != nsIPrefBranch::PREF_INVALID)
+ break;
+
PRBool old_value = PR_FALSE;
PRBool new_value = g_value_get_boolean (value);
rv = gPrefBranch->GetBoolPref (pref, &old_value);
@@ -511,6 +532,10 @@ mozilla_pref_set (const char *pref,
}
case G_TYPE_STRING:
{
+ if (prefType != nsIPrefBranch::PREF_STRING &&
+ prefType != nsIPrefBranch::PREF_INVALID)
+ break;
+
const char *new_value = g_value_get_string (value);
if (new_value == NULL)
{
@@ -586,8 +611,7 @@ mozilla_notifier_add (const char *gconf_key,
client = eel_gconf_client_get_global ();
g_return_val_if_fail (client != NULL, 0);
- /* FIXME: use slice allocator */
- data = g_new (PrefData, 1);
+ data = g_slice_new (PrefData);
data->gconf_key = g_strdup (gconf_key);
data->mozilla_pref = g_strdup (mozilla_pref);
data->func = func;
@@ -1085,6 +1109,95 @@ mozilla_font_notifiers_shutdown (void)
g_free (minimum_font_size_data);
}
+#if 0
+static void
+notify_generic_cb (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *gcentry,
+ gpointer data)
+{
+ GConfValue *gcvalue;
+ const char *key, *pref;
+ static const gsize len = strlen ("/apps/epiphany/web/gecko_prefs/");
+ GValue value = { 0, };
+
+ key = gconf_entry_get_key (gcentry);
+ if (!key || strlen (key) <= len) return;
+
+ pref = key + len;
+
+ gcvalue = gconf_entry_get_value (gcentry);
+ if (!gcvalue) return;
+
+ switch (gcvalue->type)
+ {
+ case GCONF_VALUE_STRING:
+ g_value_init (&value, G_TYPE_STRING);
+ g_value_set_static_string (&value, gconf_value_get_string (gcvalue));
+ break;
+ case GCONF_VALUE_INT:
+ g_value_init (&value, G_TYPE_INT);
+ g_value_set_int (&value, gconf_value_get_int (gcvalue));
+ break;
+ case GCONF_VALUE_BOOL:
+ g_value_init (&value, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&value, gconf_value_get_bool (gcvalue));
+ break;
+ /* case GCONF_VALUE_INVALID: */
+ /* case GCONF_VALUE_FLOAT: */
+ /* case GCONF_VALUE_SCHEMA: */
+ /* case GCONF_VALUE_LIST: */
+ /* case GCONF_VALUE_PAIR: */
+ default:
+ g_warning ("Unsupported value type for key '%s'\n", key);
+ return;
+ }
+
+ g_assert (G_IS_VALUE (&value));
+ mozilla_pref_set (pref, &value);
+ g_value_unset (&value);
+}
+
+static void
+mozilla_generic_notifier_init (void)
+{
+ GConfClient *client;
+ GError *error = NULL;
+ guint cnxn_id;
+ PrefData *data;
+ GSList *list, *l;
+
+ client = eel_gconf_client_get_global ();
+
+ cnxn_id = gconf_client_notify_add (client, "/apps/epiphany/web/gecko_prefs",
+ (GConfClientNotifyFunc) notify_generic_cb,
+ NULL, NULL, &error);
+ if (eel_gconf_handle_error (&error))
+ {
+ if (cnxn_id != EEL_GCONF_UNDEFINED_CONNECTION)
+ {
+ gconf_client_notify_remove (client, cnxn_id);
+ }
+
+ return;
+ }
+
+ data = g_slice_new0 (PrefData);
+ data->cnxn_id = cnxn_id;
+ notifiers = g_list_prepend (notifiers, data);
+
+ list = gconf_client_all_entries (client, "/apps/epiphany/web/gecko_prefs", NULL);
+ for (l = list; l != NULL; l = l->next)
+ {
+ GConfEntry *gcentry = (GConfEntry *) l->data;
+
+ notify_generic_cb (client, cnxn_id, gcentry, NULL);
+ gconf_entry_unref (gcentry);
+ }
+ g_slist_free (list);
+}
+#endif
+
extern "C" gboolean
mozilla_notifiers_init (void)
{
@@ -1103,6 +1216,11 @@ mozilla_notifiers_init (void)
return FALSE;
}
+#if 0
+ /* First init the generic notifier, so our regular prefs override prefs set there */
+ mozilla_generic_notifier_init ();
+#endif
+
for (i = 0; i < G_N_ELEMENTS (notifier_entries); i++)
{
mozilla_notifier_add (notifier_entries[i].gconf_key,