From 5a9945adda3cd770a0d72f13e55f11950fd66015 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Mon, 16 Jan 2006 23:51:41 +0000 Subject: Fix number of /'s in URI. 2006-01-17 Christian Persch * data/chrome/epiphany.manifest.in: Fix number of /'s in URI. * data/epiphany.schemas.in: Add new entries. * embed/mozilla/EphyAboutModule.cpp: Fix title. * data/glade/prefs-dialog.glade: * embed/ephy-embed-prefs.h: * embed/mozilla/mozilla-embed-single.cpp: * embed/mozilla/mozilla-notifiers.cpp: * embed/mozilla/mozilla-notifiers.h: * lib/eel-gconf-extensions.c: (eel_gconf_unset_key), (eel_gconf_notify): * lib/eel-gconf-extensions.h: * lib/egg/egg-editable-toolbar.c: (popup_context_menu_cb), (button_press_event_cb), (egg_editable_toolbar_set_ui_manager), (egg_editable_toolbar_set_selected): * lib/ephy-dialog.c: (set_value_from_pref), (set_pref_from_value), (set_value_from_togglebutton), (strcmp_with_null), (get_index_from_value), (compare_values), (set_togglebutton_from_value), (set_pref_from_info_and_emit), (spinbutton_changed_cb), (save_info): * lib/ephy-dialog.h: * lib/ephy-file-helpers.c: (ephy_file_monitor_timeout_cb), (ephy_file_monitor_cb), (ephy_file_monitor_add), (ephy_file_monitor_cancel): * lib/ephy-file-helpers.h: * src/ephy-extensions-manager.c: (ephy_extensions_manager_load_file): * src/ephy-window.c: * src/popup-commands.c: (popup_cmd_bookmark_link): * src/prefs-dialog.c: (prefs_dialog_finalize), (setup_font_combo), (fonts_language_changed_cb), (font_prefs_dialog_response_cb), (row_is_separator), (setup_fonts_dialog), (font_prefs_button_clicked_cb), (css_checkbox_toggled), (css_edit_button_clicked_cb), (prefs_dialog_init): Rework font prefs, and add user stylesheet setting. * src/bookmarks/ephy-bookmark-action-group.c: (node_added_cb): * src/bookmarks/ephy-bookmarks.c: (ephy_bookmarks_get_local): * src/window-commands.c: (window_cmd_file_bookmark_page): Some build fixes. --- embed/mozilla/mozilla-embed-single.cpp | 178 ++++++++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 5 deletions(-) (limited to 'embed/mozilla/mozilla-embed-single.cpp') diff --git a/embed/mozilla/mozilla-embed-single.cpp b/embed/mozilla/mozilla-embed-single.cpp index d542dc20c..21b9d7462 100644 --- a/embed/mozilla/mozilla-embed-single.cpp +++ b/embed/mozilla/mozilla-embed-single.cpp @@ -102,22 +102,26 @@ #include #endif /* ALLOW_PRIVATE_API */ -#ifdef HAVE_GECKO_1_8 -#include -#include "EphyUtils.h" -#endif - #include #ifdef ENABLE_NETWORK_MANAGER #include #endif +#ifdef HAVE_GECKO_1_8 +#include +#include +#include "EphyUtils.h" +#include "ephy-file-helpers.h" +#endif + #define MOZILLA_PROFILE_DIR "/mozilla" #define MOZILLA_PROFILE_NAME "epiphany" #define MOZILLA_PROFILE_FILE "prefs.js" #define DEFAULT_PROFILE_FILE SHARE_DIR"/default-prefs.js" +#define USER_CSS_LOAD_DELAY 500 /* ms */ + #define MOZILLA_EMBED_SINGLE_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), MOZILLA_TYPE_EMBED_SINGLE, MozillaEmbedSinglePrivate)) struct MozillaEmbedSinglePrivate @@ -133,6 +137,12 @@ struct MozillaEmbedSinglePrivate libnm_glib_ctx *nm_context; guint nm_callback_id; #endif +#ifdef HAVE_GECKO_1_8 + char *user_css_uri; + guint user_css_enabled_notifier_id; + EphyFileMonitor *user_css_file_monitor; + guint user_css_enabled : 1; +#endif guint online : 1; }; @@ -592,6 +602,156 @@ mozilla_init_network_manager (MozillaEmbedSingle *single) #endif /* ENABLE_NETWORK_MANAGER */ +#ifdef HAVE_GECKO_1_8 + +static void +user_css_register (MozillaEmbedSingle *single) +{ + MozillaEmbedSinglePrivate *priv = single->priv; + + nsresult rv; + nsCOMPtr uri; + rv = EphyUtils::NewURI (getter_AddRefs (uri), + nsDependentCString (priv->user_css_uri)); + NS_ENSURE_SUCCESS (rv, ); + + nsCOMPtr service + (do_GetService ("@mozilla.org/content/style-sheet-service;1", &rv)); + NS_ENSURE_SUCCESS (rv, ); + + rv = service->LoadAndRegisterSheet (uri, nsIStyleSheetService::AGENT_SHEET); + if (NS_FAILED (rv)) + { + g_warning ("Registering the user stylesheet failed (rv=%x)!\n", rv); + } +} + +static void +user_css_unregister (MozillaEmbedSingle *single) +{ + MozillaEmbedSinglePrivate *priv = single->priv; + + nsresult rv; + nsCOMPtr uri; + rv = EphyUtils::NewURI (getter_AddRefs (uri), + nsDependentCString (priv->user_css_uri)); + NS_ENSURE_SUCCESS (rv, ); + + nsCOMPtr service + (do_GetService ("@mozilla.org/content/style-sheet-service;1", &rv)); + NS_ENSURE_SUCCESS (rv, ); + + PRBool isRegistered = PR_FALSE; + rv = service->SheetRegistered (uri, nsIStyleSheetService::USER_SHEET, + &isRegistered); + if (NS_SUCCEEDED (rv) && isRegistered) + { + rv = service->UnregisterSheet (uri, nsIStyleSheetService::USER_SHEET); + } + if (NS_FAILED (rv)) + { + g_warning ("Unregistering the user stylesheet failed (rv=%x)!\n", rv); + } +} + +static void +user_css_file_monitor_func (EphyFileMonitor *, + const char *, + MozillaEmbedSingle *single) +{ + LOG ("Reregistering the user style sheet"); + + user_css_unregister (single); + user_css_register (single); +} + +static void +user_css_enabled_notify (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + MozillaEmbedSingle *single) +{ + MozillaEmbedSinglePrivate *priv = single->priv; + guint enabled; + + enabled = eel_gconf_get_boolean (CONF_USER_CSS_ENABLED) != FALSE; + if (priv->user_css_enabled == enabled) return; + + LOG ("User stylesheet enabled: %s", enabled ? "t" : "f"); + + priv->user_css_enabled = enabled; + + if (enabled) + { + user_css_register (single); + + g_assert (priv->user_css_file_monitor == NULL); + priv->user_css_file_monitor = + ephy_file_monitor_add (priv->user_css_uri, + GNOME_VFS_MONITOR_FILE, + USER_CSS_LOAD_DELAY, + (EphyFileMonitorFunc) user_css_file_monitor_func, + NULL, + single); + } + else + { + if (priv->user_css_file_monitor != NULL) + { + ephy_file_monitor_cancel (priv->user_css_file_monitor); + priv->user_css_file_monitor = NULL; + } + + user_css_unregister (single); + } +} + +static void +mozilla_stylesheet_init (MozillaEmbedSingle *single) +{ + MozillaEmbedSinglePrivate *priv = single->priv; + char *user_css_file; + + user_css_file = g_build_filename (ephy_dot_dir (), + USER_STYLESHEET_FILENAME, + NULL); + priv->user_css_uri = gnome_vfs_get_uri_from_local_path (user_css_file); + g_free (user_css_file); + + user_css_enabled_notify (NULL, 0, NULL, single); + priv->user_css_enabled_notifier_id = + eel_gconf_notification_add + (CONF_USER_CSS_ENABLED, + (GConfClientNotifyFunc) user_css_enabled_notify, + single); +} + +static void +mozilla_stylesheet_shutdown (MozillaEmbedSingle *single) +{ + MozillaEmbedSinglePrivate *priv = single->priv; + + if (priv->user_css_enabled_notifier_id != 0) + { + eel_gconf_notification_remove (priv->user_css_enabled_notifier_id); + priv->user_css_enabled_notifier_id = 0; + } + + if (priv->user_css_file_monitor != NULL) + { + ephy_file_monitor_cancel (priv->user_css_file_monitor); + priv->user_css_file_monitor = NULL; + } + + if (priv->user_css_uri != NULL) + { + g_free (priv->user_css_uri); + priv->user_css_uri = NULL; + } +} + +#endif /* HAVE_GECKO_1_8 */ + static gboolean init_services (MozillaEmbedSingle *single) { @@ -641,6 +801,10 @@ init_services (MozillaEmbedSingle *single) mozilla_init_network_manager (single); #endif +#ifdef HAVE_GECKO_1_8 + mozilla_stylesheet_init (single); +#endif + return TRUE; } @@ -697,6 +861,10 @@ mozilla_embed_single_dispose (GObject *object) MozillaEmbedSingle *single = MOZILLA_EMBED_SINGLE (object); MozillaEmbedSinglePrivate *priv = single->priv; +#ifdef HAVE_GECKO_1_8 + mozilla_stylesheet_shutdown (single); +#endif + if (priv->mSingleObserver) { priv->mSingleObserver->Detach (); -- cgit v1.2.3