[devhelp/gsettings-migration] Migrate to GSettings



commit 601e168430d6e0b70ed4baac33cd134b4027957d
Author: Thomas Bechtold <thomasbechtold jpberlin de>
Date:   Sun Nov 18 19:59:46 2012 +0100

    Migrate to GSettings
    
    https://bugzilla.gnome.org/show_bug.cgi?id=646402

 configure.ac                          |    1 +
 data/Makefile.am                      |   35 +-
 data/devhelp.convert                  |   28 ++
 data/devhelp.schemas.in               |  191 ---------
 data/org.gnome.devhelp.gschema.xml.in |  111 +++++
 src/Makefile.am                       |   13 +-
 src/dh-app.c                          |    1 +
 src/dh-assistant.c                    |   41 ++-
 src/dh-book-manager.c                 |   63 +++-
 src/dh-common.c                       |   43 --
 src/dh-main.c                         |    3 -
 src/dh-marshal.list                   |    1 +
 src/dh-preferences.c                  |  239 ++----------
 src/dh-settings.c                     |  219 ++++++++++
 src/dh-settings.h                     |   77 ++++
 src/dh-util.c                         |  733 +++++----------------------------
 src/dh-util.h                         |   38 +--
 src/dh-window.c                       |  131 +++++-
 src/ige-conf-gconf.c                  |  387 -----------------
 src/ige-conf-mac.c                    |  342 ---------------
 src/ige-conf-private.h                |   54 ---
 src/ige-conf.c                        |  337 ---------------
 src/ige-conf.h                        |   87 ----
 23 files changed, 806 insertions(+), 2369 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 8849c70..3931699 100644
--- a/configure.ac
+++ b/configure.ac
@@ -38,6 +38,7 @@ AM_PROG_CC_C_O
 LT_PREREQ([2.2])
 LT_INIT([disable-static])
 
+GLIB_GSETTINGS
 
 PKG_PROG_PKG_CONFIG
 AM_GCONF_SOURCE_2
diff --git a/data/Makefile.am b/data/Makefile.am
index 31d10fc..15516c1 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -8,42 +8,33 @@ assistant_DATA = 		\
 	assistant.js		\
 	assistant.css
 
+ INTLTOOL_SCHEMAS_RULE@
+ INTLTOOL_XML_NOMERGE_RULE@
+
+gsettings_SCHEMAS = org.gnome.devhelp.gschema.xml
+ GSETTINGS_RULES@
+
+gsettingsconvertdir = $(datadir)/GConf/gsettings
+gsettingsconvert_DATA = devhelp.convert
+
 @INTLTOOL_DESKTOP_RULE@
 
 desktopdir = $(datadir)/applications
 desktop_in_files = devhelp.desktop.in
 desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
 
-schemasdir = $(GCONF_SCHEMA_FILE_DIR)
-schemas_in_files = devhelp.schemas.in
-schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
- INTLTOOL_SCHEMAS_RULE@
-
-defaultsdir = $(datadir)/devhelp
-defaults_DATA = devhelp.defaults
-devhelp.defaults: devhelp.schemas.in
-	cp $(top_srcdir)/data/devhelp.schemas.in $(top_builddir)/data/devhelp.defaults
-
 EXTRA_DIST =			\
 	libdevhelp-3.0.pc.in    \
 	$(desktop_in_files)	\
-	$(schemas_in_files)     \
-	$(schemas_DATA)		\
+	org.gnome.devhelp.gschema.xml.in \
+	devhelp.convert \
 	$(assistant_DATA)
 
-install-data-local: $(schema_DATA)
-if GCONF_SCHEMAS_INSTALL
-	if test -z "$(DESTDIR)" ; then \
-	for p in $^ ; do \
-	GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $$p >&1 > /dev/null; \
-	done \
-	fi
-endif
-
 CLEANFILES =			\
 	$(DESKTOP_FILES)	\
+	$(gsettings_SCHEMAS)    \
 	$(defaults_DATA)
 
 DISTCLEANFILES =		\
 	$(desktop_DATA)		\
-	$(schemas_DATA)
+	$(gsettings_SCHEMAS)
diff --git a/data/devhelp.convert b/data/devhelp.convert
new file mode 100644
index 0000000..ee20a90
--- /dev/null
+++ b/data/devhelp.convert
@@ -0,0 +1,28 @@
+[org.gnome.devhelp.state.main.window]
+maximized=/apps/devhelp/state/main/window/maximized
+width=/apps/devhelp/state/main/window/width
+height=/apps/devhelp/state/main/window/height
+x-position=/apps/devhelp/state/main/window/x_position
+y-position=/apps/devhelp/state/main/window/y_position
+
+[org.gnome.devhelp.state.assistant.window]
+maximized=/apps/devhelp/state/assistant/window/maximized
+width=/apps/devhelp/state/assistant/window/width
+height=/apps/devhelp/state/assistant/window/height
+x-position=/apps/devhelp/state/assistant/window/x_position
+y-position=/apps/devhelp/state/assistant/window/y_position
+
+[org.gnome.devhelp.state.main.paned]
+position=/apps/devhelp/state/main/paned/position
+
+[org.gnome.devhelp.state.search_notebook]
+selected-tab=/apps/devhelp/state/main/search_notebook/selected_tab
+
+[org.gnome.devhelp.state.main.contents]
+books-disabled=/apps/devhelp/state/main/contents/books_disabled
+group-books-by-language=/apps/devhelp/state/main/contents/group_books_by_language
+
+[org.gnome.devhelp.fonts]
+use-system-fonts=/apps/devhelp/ui/use_system_fonts
+variable-fonts=/apps/devhelp/ui/variable_font
+fixed-font=/apps/devhelp/ui/fixed_font
diff --git a/data/org.gnome.devhelp.gschema.xml.in b/data/org.gnome.devhelp.gschema.xml.in
new file mode 100644
index 0000000..bcf1ccf
--- /dev/null
+++ b/data/org.gnome.devhelp.gschema.xml.in
@@ -0,0 +1,111 @@
+<schemalist gettext-domain="devhelp">
+  <schema id="org.gnome.devhelp" path="/org/gnome/devhelp/">
+    <child name="state" schema="org.gnome.devhelp.state"/>
+    <child name="ui" schema="org.gnome.devhelp.fonts"/>
+  </schema>
+  <schema id="org.gnome.devhelp.state" path="/org/gnome/devhelp/state/">
+    <child name="main" schema="org.gnome.devhelp.state.main"/>
+    <child name="assistant" schema="org.gnome.devhelp.state.assistant"/>
+  </schema>
+  <schema id="org.gnome.devhelp.state.main" path="/org/gnome/devhelp/state/main/">
+    <child name="window" schema="org.gnome.devhelp.state.main.window"/>
+    <child name="paned" schema="org.gnome.devhelp.state.main.paned"/>
+    <child name="search-notebook" schema="org.gnome.devhelp.state.main.search-notebook"/>
+    <child name="contents" schema="org.gnome.devhelp.state.main.contents"/>
+  </schema>
+  <schema id="org.gnome.devhelp.state.main.window" path="/org/gnome/devhelp/state/main/window/">
+    <key name="maximized" type="b">
+      <default>false</default>
+      <_summary>Main window maximized state</_summary>
+      <_description>Whether the main window should start maximized.</_description>
+    </key>
+    <key name="width" type="i">
+      <default>700</default>
+      <_summary>Width of the main window</_summary>
+      <_description>The width of the main window.</_description>
+    </key>
+    <key name="height" type="i">
+      <default>500</default>
+      <_summary>Height of main window</_summary>
+      <_description>The height of the main window.</_description>
+    </key>
+    <key name="x-position" type="i">
+      <default>100</default>
+      <_summary>X position of main window</_summary>
+      <_description>The X position of the main window.</_description>
+    </key>
+    <key name="y-position" type="i">
+      <default>100</default>
+      <_summary>Y position of main window</_summary>
+      <_description>The Y position of the main window.</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.devhelp.state.main.paned" path="/org/gnome/devhelp/state/main/paned/">
+    <key name="position" type="i">
+      <default>250</default>
+      <_summary>Width of the index and search pane</_summary>
+      <_description>The width of the index and search pane.</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.devhelp.state.main.search-notebook" path="/org/gnome/devhelp/state/main/search-notebook/">
+    <key name="selected-tab" type="s">
+      <default>'content'</default>
+      <_summary>Selected tab: "content" or "search"</_summary>
+      <_description>Which of the tabs is selected: "content" or "search".</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.devhelp.state.main.contents" path="/org/gnome/devhelp/state/main/contents/">
+    <key name="books-disabled" type="as">
+      <default>[]</default>
+      <_summary>Books disabled</_summary>
+      <_description>List of books disabled by the user.</_description>
+    </key>
+    <key name="group-books-by-language" type="b">
+      <default>false</default>
+      <_summary>Group by language</_summary>
+      <_description>Whether books should be grouped by language in the UI</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.devhelp.state.assistant" path="/org/gnome/devhelp/state/assistant/">
+    <child name="window" schema="org.gnome.devhelp.state.assistant.window"/>
+  </schema>
+  <schema id="org.gnome.devhelp.state.assistant.window" path="/org/gnome/devhelp/state/assistant/window/">
+    <key name="width" type="i">
+      <default>350</default>
+      <_summary>Width of the assistant window</_summary>
+      <_description>The width of the assistant window.</_description>
+    </key>
+    <key name="height" type="i">
+      <default>400</default>
+      <_summary>Height of assistant window</_summary>
+      <_description>The height of the assistant window.</_description>
+    </key>
+    <key name="x-position" type="i">
+      <default>0</default>
+      <_summary>X position of assistant window</_summary>
+      <_description>The X position of the assistant window.</_description>
+    </key>
+    <key name="y-position" type="i">
+      <default>0</default>
+      <_summary>Y position of assistant window</_summary>
+      <_description>The Y position of the assistant window.</_description>
+    </key>
+  </schema>
+  <schema id="org.gnome.devhelp.fonts" path="/org/gnome/devhelp/fonts/">
+    <key name="use-system-fonts" type="b">
+      <default>true</default>
+      <_summary>Use system fonts</_summary>
+      <_description>Use the system default fonts.</_description>
+    </key>
+    <key name="variable-font" type="s">
+      <default>'Sans 12'</default>
+      <_summary>Font for text</_summary>
+      <_description>Font for text with variable width.</_description>
+    </key>
+    <key name="fixed-font" type="s">
+      <default>'Monospace 12'</default>
+      <_summary>Font for fixed width text</_summary>
+      <_description>Font for text with fixed width, such as code examples.</_description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/src/Makefile.am b/src/Makefile.am
index 419c31c..0776177 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -68,7 +68,6 @@ devhelpincludedir = $(includedir)/devhelp-3.0/devhelp
 devhelpinclude_HEADERS = $(INST_H_FILES)
 
 libdevhelp_3_la_SOURCES =				\
-	dh-common.c					\
 	dh-marshal.c					\
 	dh-marshal.h					\
 	dh-enum-types.c					\
@@ -91,12 +90,10 @@ libdevhelp_3_la_SOURCES =				\
 	dh-parser.h					\
 	dh-preferences.h                                \
 	dh-util.h					\
+	dh-settings.c					\
+	dh-settings.h					\
 	eggfindbar.c					\
-	eggfindbar.h					\
-	ige-conf.c					\
-	ige-conf.h					\
-	ige-conf-private.h				\
-	$(conf_platform_sources)
+	eggfindbar.h
 
 libdevhelp_3_la_CPPFLAGS =				\
 	$(AM_CPPFLAGS)					\
@@ -123,9 +120,5 @@ dh-enum-types.c: dh-enum-types.c.template $(INST_H_FILES) $(GLIB_MKENUMS)
 	$(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template dh-enum-types.c.template $(INST_H_FILES)) > $@
 
 if HAVE_PLATFORM_OSX
-conf_platform_sources = ige-conf-mac.c
 libdevhelp_3_la_CPPFLAGS += -xobjective-c
 endif
-if HAVE_PLATFORM_X11
-conf_platform_sources = ige-conf-gconf.c
-endif
diff --git a/src/dh-app.c b/src/dh-app.c
index 3b2d0d2..819d754 100644
--- a/src/dh-app.c
+++ b/src/dh-app.c
@@ -156,6 +156,7 @@ about_cb (GSimpleAction *action,
                 "Johan Dahlin <johan gnome org>",
                 "Ross Burton <ross burtonini com>",
                 "Aleksander Morgado <aleksander lanedo com>",
+                "Thomas Bechtold <toabctl gnome org>",
                 NULL
         };
         const gchar **documenters = NULL;
diff --git a/src/dh-assistant.c b/src/dh-assistant.c
index c262b1a..2a7ed96 100644
--- a/src/dh-assistant.c
+++ b/src/dh-assistant.c
@@ -27,10 +27,12 @@
 #include "dh-util.h"
 #include "dh-assistant-view.h"
 #include "dh-assistant.h"
+#include "dh-settings.h"
 
 typedef struct {
         GtkWidget *main_box;
         GtkWidget *view;
+        DhSettings *settings;
 } DhAssistantPriv;
 
 static void dh_assistant_class_init (DhAssistantClass *klass);
@@ -54,10 +56,38 @@ assistant_key_press_event_cb (GtkWidget   *widget,
         return FALSE;
 }
 
+static gboolean
+window_configure_event_cb (GtkWidget *window,
+                           GdkEventConfigure *event,
+                           gpointer user_data)
+{
+        DhAssistant *assistant;
+        DhAssistantPriv  *priv;
+
+        assistant = DH_ASSISTANT (user_data);
+        priv = GET_PRIVATE (assistant);
+        dh_util_window_settings_save (
+                GTK_WINDOW (assistant),
+                dh_settings_peek_assistant_settings (priv->settings), FALSE);
+	return FALSE;
+}
+
+static void
+dispose (GObject *object)
+{
+        DhAssistant *assistant = DH_ASSISTANT (object);
+        DhAssistantPriv *priv = GET_PRIVATE (assistant);
+        g_clear_object (&priv->settings);
+
+        G_OBJECT_CLASS (dh_assistant_parent_class)->dispose (object);
+}
+
 static void
 dh_assistant_class_init (DhAssistantClass *klass)
 {
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
         g_type_class_add_private (klass, sizeof (DhAssistantPriv));
+        object_class->dispose = dispose;
 }
 
 static void
@@ -67,7 +97,7 @@ dh_assistant_init (DhAssistant *assistant)
 #ifndef HAVE_WEBKIT2
         GtkWidget       *scrolled_window;
 #endif
-
+        priv->settings = dh_settings_get ();
         priv->main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_widget_show (priv->main_box);
         gtk_container_add (GTK_CONTAINER (assistant), priv->main_box);
@@ -98,8 +128,13 @@ dh_assistant_init (DhAssistant *assistant)
                             scrolled_window, TRUE, TRUE, 0);
 #endif
 
-        dh_util_state_manage_window (GTK_WINDOW (assistant),
-                                     "assistant/window");
+        dh_util_window_settings_restore (
+                GTK_WINDOW (assistant),
+                dh_settings_peek_assistant_settings (priv->settings), FALSE);
+
+        g_signal_connect (GTK_WINDOW (assistant), "configure-event",
+                          G_CALLBACK (window_configure_event_cb),
+                          assistant);
 }
 
 GtkWidget *
diff --git a/src/dh-book-manager.c b/src/dh-book-manager.c
index aa1d605..af6ed72 100644
--- a/src/dh-book-manager.c
+++ b/src/dh-book-manager.c
@@ -4,6 +4,7 @@
  * Copyright (C) 2002 Mikael Hallendal <micke imendio com>
  * Copyright (C) 2004-2008 Imendio AB
  * Copyright (C) 2010 Lanedo GmbH
+ * Copyright (C) 2012 Thomas Bechtold <toabctl gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -25,11 +26,11 @@
 #include <string.h>
 
 #include "dh-link.h"
-#include "dh-util.h"
 #include "dh-book.h"
 #include "dh-language.h"
 #include "dh-book-manager.h"
 #include "dh-marshal.h"
+#include "dh-settings.h"
 
 #define NEW_POSSIBLE_BOOK_TIMEOUT_SECS 5
 
@@ -49,6 +50,7 @@ typedef struct {
         gboolean    group_by_language;
         /* List of programming languages with at least one book enabled */
         GList      *languages;
+        DhSettings *settings;
 } DhBookManagerPriv;
 
 enum {
@@ -77,6 +79,8 @@ G_DEFINE_TYPE (DhBookManager, dh_book_manager, G_TYPE_OBJECT);
 static void    dh_book_manager_init           (DhBookManager      *book_manager);
 static void    dh_book_manager_class_init     (DhBookManagerClass *klass);
 
+static void    book_manager_load_books_disabled (DhBookManager *book_manager);
+
 static void    book_manager_add_from_filepath (DhBookManager *book_manager,
                                                const gchar   *book_path);
 static void    book_manager_add_from_dir      (DhBookManager *book_manager,
@@ -131,6 +135,8 @@ book_manager_finalize (GObject *object)
         }
         g_slist_free (priv->books_disabled);
 
+        g_clear_object (&priv->settings);
+
         G_OBJECT_CLASS (dh_book_manager_parent_class)->finalize (object);
 }
 
@@ -227,8 +233,13 @@ dh_book_manager_init (DhBookManager *book_manager)
         priv->books = NULL;
         priv->monitors = NULL;
         priv->languages = NULL;
+        priv->books_disabled = NULL;
+        priv->settings = dh_settings_get ();
 
-        priv->books_disabled = dh_util_state_load_books_disabled ();
+        book_manager_load_books_disabled (book_manager);
+        g_settings_bind (dh_settings_peek_contents_settings (priv->settings),
+                         "group-books-by-language", book_manager,
+                         "group-by-language", G_SETTINGS_BIND_DEFAULT);
 }
 
 static void
@@ -271,6 +282,43 @@ book_manager_get_property (GObject    *object,
         }
 }
 
+static void
+book_manager_load_books_disabled (DhBookManager *book_manager)
+{
+        DhBookManagerPriv *priv = GET_PRIVATE (book_manager);
+
+        gchar **books_disabled_strv = g_settings_get_strv (
+                dh_settings_peek_contents_settings (priv->settings),
+                "books-disabled");
+        while (*books_disabled_strv != NULL) {
+                priv->books_disabled = g_slist_append (priv->books_disabled, *books_disabled_strv);
+                books_disabled_strv++;
+        }
+}
+
+static void
+book_manager_store_books_disabled (DhBookManager *book_manager)
+{
+        DhBookManagerPriv *priv = GET_PRIVATE (book_manager);
+        GVariantBuilder *builder;
+        GVariant *variant;
+        int i;
+
+        builder = g_variant_builder_new (G_VARIANT_TYPE_STRING_ARRAY);
+        for (i = 0; i < g_slist_length (priv->books_disabled); i++)
+        {
+                gchar *book = (gchar*) g_slist_nth_data (priv->books_disabled, i);
+                g_variant_builder_add (builder, "s", book);
+        }
+
+        variant = g_variant_builder_end (builder);
+
+        g_settings_set_value (
+                dh_settings_peek_contents_settings (priv->settings),
+                "books-disabled",
+                variant);
+}
+
 static gboolean
 book_manager_is_book_disabled_in_conf (DhBookManager *book_manager,
                                        DhBook        *book)
@@ -646,7 +694,7 @@ book_manager_book_enabled_cb (DhBook   *book,
          * disabled books list! */
         g_assert (li != NULL);
         priv->books_disabled = g_slist_delete_link (priv->books_disabled, li);
-        dh_util_state_store_books_disabled (priv->books_disabled);
+        book_manager_store_books_disabled (book_manager);
 
         /* Increment language count */
         book_manager_inc_language (book_manager,
@@ -673,7 +721,7 @@ book_manager_book_disabled_cb (DhBook   *book,
         g_assert (li == NULL);
         priv->books_disabled = g_slist_append (priv->books_disabled,
                                                g_strdup (dh_book_get_name (book)));
-        dh_util_state_store_books_disabled (priv->books_disabled);
+        book_manager_store_books_disabled (book_manager);
 
         /* Decrement language count */
         book_manager_dec_language (book_manager,
@@ -785,9 +833,6 @@ dh_book_manager_set_group_by_language (DhBookManager *book_manager,
 
         priv = GET_PRIVATE (book_manager);
 
-        /* Store in conf */
-        dh_util_state_store_group_books_by_language (group_by_language);
-
         priv->group_by_language = group_by_language;
         g_object_notify (G_OBJECT (book_manager), "group-by-language");
 }
@@ -860,8 +905,6 @@ dh_book_manager_get_languages (DhBookManager *book_manager)
 DhBookManager *
 dh_book_manager_new (void)
 {
-        return g_object_new (DH_TYPE_BOOK_MANAGER,
-                             "group-by-language", dh_util_state_load_group_books_by_language (),
-                             NULL);
+        return g_object_new (DH_TYPE_BOOK_MANAGER, NULL);
 }
 
diff --git a/src/dh-main.c b/src/dh-main.c
index 0d771a0..fd739bd 100644
--- a/src/dh-main.c
+++ b/src/dh-main.c
@@ -145,9 +145,6 @@ main (int argc, char **argv)
                 return EXIT_SUCCESS;
         }
 
-        /* Initialize Devhelp support */
-        dh_init ();
-
         /* Create new DhApp */
         application = dh_app_new ();
         g_signal_connect (application, "activate", G_CALLBACK (activate_cb), NULL);
diff --git a/src/dh-marshal.list b/src/dh-marshal.list
index 13f9cab..98b4030 100644
--- a/src/dh-marshal.list
+++ b/src/dh-marshal.list
@@ -5,3 +5,4 @@ VOID:STRING
 VOID:VOID
 BOOLEAN:STRING
 VOID:STRING,FLAGS
+VOID:STRING,STRING
diff --git a/src/dh-preferences.c b/src/dh-preferences.c
index 4d6581e..3fdfcfb 100644
--- a/src/dh-preferences.c
+++ b/src/dh-preferences.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2004-2008 Imendio AB
  * Copyright (C) 2010 Lanedo GmbH
+ * Copyright (C) 2012 Thomas Bechtold <toabctl gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -24,12 +25,13 @@
 #include <string.h>
 #include "dh-util.h"
 #include "dh-preferences.h"
-#include "ige-conf.h"
 #include "dh-app.h"
+#include "dh-settings.h"
 
 typedef struct {
         GtkWidget     *dialog;
         DhBookManager *book_manager;
+        DhSettings    *settings;
 
         /* Fonts tab */
         GtkWidget *system_fonts_button;
@@ -47,27 +49,6 @@ typedef struct {
         GtkWidget    *bookshelf_group_by_language_button;
 } DhPreferences;
 
-/* Fonts-tab related */
-static void     preferences_fonts_font_set_cb               (GtkFontButton    *button,
-                                                             gpointer          user_data);
-static void     preferences_fonts_system_fonts_toggled_cb   (GtkToggleButton  *button,
-                                                             gpointer          user_data);
-#if 0
-static void     preferences_fonts_var_font_notify_cb        (IgeConf          *client,
-                                                             const gchar      *path,
-                                                             gpointer          user_data);
-static void     preferences_fonts_fixed_font_notify_cb      (IgeConf          *client,
-                                                             const gchar      *path,
-                                                             gpointer          user_data);
-static void     preferences_fonts_use_system_font_notify_cb (IgeConf          *client,
-                                                             const gchar      *path,
-                                                             gpointer          user_data);
-static void     preferences_connect_conf_listeners          (void);
-#endif
-static void     preferences_fonts_get_font_names            (gboolean          use_system_fonts,
-                                                             gchar           **variable,
-                                                             gchar           **fixed);
-
 /* Bookshelf-tab related */
 static void     preferences_bookshelf_tree_selection_toggled_cb    (GtkCellRendererToggle *cell_renderer,
                                                                     gchar                 *path,
@@ -96,16 +77,6 @@ static void     preferences_bookshelf_find_book                    (DhBook
 static void     preferences_bookshelf_group_by_language_cb         (GObject               *object,
                                                                     GParamSpec            *pspec,
                                                                     gpointer               user_data);
-static void     preferences_bookshelf_group_by_language_toggled_cb (GtkToggleButton       *button,
-                                                                    gpointer               user_data);
-
-#define DH_CONF_PATH                  "/apps/devhelp"
-#define DH_CONF_USE_SYSTEM_FONTS      DH_CONF_PATH "/ui/use_system_fonts"
-#define DH_CONF_VARIABLE_FONT         DH_CONF_PATH "/ui/variable_font"
-#define DH_CONF_FIXED_FONT            DH_CONF_PATH "/ui/fixed_font"
-#define DH_CONF_SYSTEM_VARIABLE_FONT  "/desktop/gnome/interface/font_name"
-#define DH_CONF_SYSTEM_FIXED_FONT     "/desktop/gnome/interface/monospace_font_name"
-#define DH_CONF_GROUP_BY_LANGUAGE     DH_CONF_PATH "/ui/use_system_fonts"
 
 /* Book list store columns... */
 #define LTCOLUMN_ENABLED      0
@@ -132,6 +103,7 @@ preferences_init (void)
         }
 
         prefs = g_new0 (DhPreferences, 1);
+        prefs->settings = dh_settings_get ();
         prefs->book_manager = g_object_ref (dh_app_peek_book_manager (DH_APP (app)));
         g_signal_connect (prefs->book_manager,
                           "book-created",
@@ -154,7 +126,8 @@ preferences_shutdown (void)
                 return;
         }
 
-        g_object_unref (prefs->book_manager);
+        g_clear_object (&prefs->settings);
+        g_clear_object (&prefs->book_manager);
         gtk_list_store_clear (prefs->bookshelf_store);
         gtk_widget_destroy (GTK_WIDGET (prefs->dialog));
 
@@ -163,25 +136,6 @@ preferences_shutdown (void)
 }
 
 static void
-preferences_fonts_font_set_cb (GtkFontButton *button,
-                               gpointer       user_data)
-{
-	DhPreferences *prefs = user_data;
-	const gchar   *font_name;
-	const gchar   *key;
-
-	font_name = gtk_font_button_get_font_name (button);
-
-	if (GTK_WIDGET (button) == prefs->variable_font_button) {
-		key = DH_CONF_VARIABLE_FONT;
-	} else {
-		key = DH_CONF_FIXED_FONT;
-	}
-
-	ige_conf_set_string (ige_conf_get (), key, font_name);
-}
-
-static void
 preferences_fonts_system_fonts_toggled_cb (GtkToggleButton *button,
                                            gpointer         user_data)
 {
@@ -190,131 +144,9 @@ preferences_fonts_system_fonts_toggled_cb (GtkToggleButton *button,
 
 	active = gtk_toggle_button_get_active (button);
 
-	ige_conf_set_bool (ige_conf_get (),
-                           DH_CONF_USE_SYSTEM_FONTS,
-                           active);
-
 	gtk_widget_set_sensitive (prefs->fonts_table, !active);
 }
 
-#if 0
-static void
-preferences_fonts_var_font_notify_cb (IgeConf     *client,
-                                      const gchar *path,
-                                      gpointer     user_data)
-{
-	DhPreferences *prefs = user_data;
-	gboolean       use_system_fonts;
-	gchar         *font_name;
-
-        ige_conf_get_bool (ige_conf_get (),
-                           DH_CONF_USE_SYSTEM_FONTS,
-                           &use_system_fonts);
-
-	if (prefs->variable_font_button) {
-		ige_conf_get_string (ige_conf_get (), path, &font_name);
-		gtk_font_button_set_font_name (GTK_FONT_BUTTON (prefs->variable_font_button),
-					       font_name);
-                g_free (font_name);
-	}
-}
-
-static void
-preferences_fonts_fixed_font_notify_cb (IgeConf     *client,
-                                        const gchar *path,
-                                        gpointer     user_data)
-{
-	DhPreferences *prefs = user_data;
-	gboolean       use_system_fonts;
-	gchar         *font_name;
-
-	ige_conf_get_bool (ige_conf_get (),
-                           DH_CONF_USE_SYSTEM_FONTS,
-                           &use_system_fonts);
-
-	if (prefs->fixed_font_button) {
-                ige_conf_get_string (ige_conf_get (), path, &font_name);
-		gtk_font_button_set_font_name (GTK_FONT_BUTTON (prefs->fixed_font_button),
-					       font_name);
-                g_free (font_name);
-	}
-}
-
-static void
-preferences_fonts_use_system_font_notify_cb (IgeConf     *client,
-                                             const gchar *path,
-                                             gpointer     user_data)
-{
-	DhPreferences *prefs = user_data;
-	gboolean       use_system_fonts;
-
-	ige_conf_get_bool (ige_conf_get (), path, &use_system_fonts);
-
-	if (prefs->system_fonts_button) {
-		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->system_fonts_button),
-					      use_system_fonts);
-	}
-
-	if (prefs->fonts_table) {
-		gtk_widget_set_sensitive (prefs->fonts_table, !use_system_fonts);
-	}
-}
-
-/* FIXME: This is not hooked up yet (to update the dialog if the values are
- * changed outside of devhelp).
- */
-static void
-preferences_connect_conf_listeners (void)
-{
-	IgeConf *conf;
-
-	conf = ige_conf_get ();
-
-	prefs->use_system_fonts_id =
-		ige_conf_notify_add (conf,
-                                     DH_CONF_USE_SYSTEM_FONTS,
-                                     preferences_use_system_font_notify_cb,
-                                     prefs);
-	prefs->system_var_id =
-		ige_conf_notify_add (conf,
-                                     DH_CONF_SYSTEM_VARIABLE_FONT,
-                                     preferences_var_font_notify_cb,
-                                     prefs);
-	prefs->system_fixed_id =
-		ige_conf_notify_add (conf,
-                                     DH_CONF_SYSTEM_FIXED_FONT,
-                                     preferences_fixed_font_notify_cb,
-                                     prefs);
-	prefs->var_id =
-		ige_conf_notify_add (conf,
-                                     DH_CONF_VARIABLE_FONT,
-                                     preferences_var_font_notify_cb,
-                                     prefs);
-	prefs->fixed_id =
-		ige_conf_notify_add (conf,
-                                     DH_CONF_FIXED_FONT,
-                                     preferences_fixed_font_notify_cb,
-                                     prefs);
-}
-#endif
-
-static void
-preferences_fonts_get_font_names (gboolean   use_system_fonts,
-                                  gchar    **variable,
-                                  gchar    **fixed)
-{
-	gchar   *name;
-	gdouble  size;
-
-	dh_util_font_get_variable (&name, &size, use_system_fonts);
-	*variable = g_strdup_printf ("%s %u", name, (guint)size);
-	g_free (name);
-
-	dh_util_font_get_fixed (&name, &size, use_system_fonts);
-	*fixed = g_strdup_printf ("%s %u", name, (guint)size);
-	g_free (name);
-}
-
 static void
 preferences_bookshelf_set_language_inconsistent (const gchar *language)
 {
@@ -800,28 +632,12 @@ preferences_bookshelf_clean_store (void)
         gtk_list_store_clear (prefs->bookshelf_store);
 }
 
-static void
-preferences_bookshelf_group_by_language_toggled_cb (GtkToggleButton *button,
-                                                    gpointer         user_data)
-{
-	DhPreferences *prefs = user_data;
-	gboolean       active;
-
-	active = gtk_toggle_button_get_active (button);
-
-        if (dh_book_manager_get_group_by_language (prefs->book_manager) != active) {
-                dh_book_manager_set_group_by_language (prefs->book_manager,
-                                                       active);
-        }
-}
-
 void
 dh_preferences_show_dialog (void)
 {
         gchar      *path;
 	GtkBuilder *builder;
 	gboolean    use_system_fonts;
-	gchar      *var_font_name, *fixed_font_name;
 
         preferences_init ();
 
@@ -847,36 +663,33 @@ dh_preferences_show_dialog (void)
                 NULL);
         g_free (path);
 
+        /* setup GSettings bindings */
+        GSettings *settings_fonts = dh_settings_peek_fonts_settings (prefs->settings);
+        GSettings *settings_contents = dh_settings_peek_contents_settings (prefs->settings);
+        g_settings_bind (settings_fonts, "use-system-fonts",
+                         G_OBJECT (prefs->system_fonts_button),
+                         "active", G_SETTINGS_BIND_DEFAULT);
+        g_settings_bind (settings_fonts, "fixed-font",
+                         G_OBJECT (prefs->fixed_font_button),
+                         "font-name", G_SETTINGS_BIND_DEFAULT);
+        g_settings_bind (settings_fonts, "variable-font",
+                         G_OBJECT (prefs->variable_font_button),
+                         "font-name", G_SETTINGS_BIND_DEFAULT);
+
+        g_settings_bind (settings_contents,
+                         "group-books-by-language", G_OBJECT (prefs->bookshelf_group_by_language_button),
+                         "active", G_SETTINGS_BIND_DEFAULT);
+
 	dh_util_builder_connect (
                 builder,
                 prefs,
-                "variable_font_button", "font_set", preferences_fonts_font_set_cb,
-                "fixed_font_button", "font_set", preferences_fonts_font_set_cb,
                 "system_fonts_button", "toggled", preferences_fonts_system_fonts_toggled_cb,
                 "bookshelf_enabled_toggle", "toggled", preferences_bookshelf_tree_selection_toggled_cb,
-                "bookshelf_group_by_language_button", "toggled", preferences_bookshelf_group_by_language_toggled_cb,
                 NULL);
 
-	ige_conf_get_bool (ige_conf_get (),
-                           DH_CONF_USE_SYSTEM_FONTS,
-                           &use_system_fonts);
-	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->system_fonts_button),
-				      use_system_fonts);
-	gtk_widget_set_sensitive (prefs->fonts_table, !use_system_fonts);
-
-	preferences_fonts_get_font_names (FALSE, &var_font_name, &fixed_font_name);
-
-	if (var_font_name) {
-		gtk_font_button_set_font_name (GTK_FONT_BUTTON (prefs->variable_font_button),
-					       var_font_name);
-		g_free (var_font_name);
-	}
-
-	if (fixed_font_name) {
-		gtk_font_button_set_font_name (GTK_FONT_BUTTON (prefs->fixed_font_button),
-					       fixed_font_name);
-		g_free (fixed_font_name);
-	}
+	/* set initial sensitive */
+        use_system_fonts = g_settings_get_boolean (settings_fonts, "use-system-fonts");
+        gtk_widget_set_sensitive (prefs->fonts_table, !use_system_fonts);
 
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (prefs->bookshelf_group_by_language_button),
                                       dh_book_manager_get_group_by_language (prefs->book_manager));
diff --git a/src/dh-settings.c b/src/dh-settings.c
new file mode 100644
index 0000000..e570b95
--- /dev/null
+++ b/src/dh-settings.c
@@ -0,0 +1,219 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2012 Thomas Bechtold <toabctl gnome org>
+ *
+ * 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 of the
+ * License, 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 "config.h"
+
+
+#include "dh-settings.h"
+#include "dh-marshal.h"
+
+G_DEFINE_TYPE (DhSettings, dh_settings, G_TYPE_OBJECT);
+
+#define DH_SETTINGS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DH_TYPE_SETTINGS, DhSettingsPrivate))
+
+/* schema-ids for settings we need */
+#define SETTINGS_SCHEMA_ID_DESKTOP_INTERFACE "org.gnome.desktop.interface"
+#define SETTINGS_SCHEMA_ID_FONTS "org.gnome.devhelp.fonts"
+#define SETTINGS_SCHEMA_ID_WINDOW "org.gnome.devhelp.state.main.window"
+#define SETTINGS_SCHEMA_ID_CONTENTS "org.gnome.devhelp.state.main.contents"
+#define SETTINGS_SCHEMA_ID_PANED "org.gnome.devhelp.state.main.paned"
+#define SETTINGS_SCHEMA_ID_SEARCH_NOTEBOOK "org.gnome.devhelp.state.main.search-notebook"
+#define SETTINGS_SCHEMA_ID_ASSISTANT "org.gnome.devhelp.state.assistant.window"
+
+/* singleton object - all consumers of DhSettings get the same object (refcounted) */
+static DhSettings *singleton = NULL;
+
+/* Prototypes */
+static void fonts_changed_cb (GSettings *settings, gchar *key, gpointer user_data);
+
+
+struct _DhSettingsPrivate {
+        GSettings *settings_desktop_interface;
+        GSettings *settings_fonts;
+	GSettings *settings_window;
+        GSettings *settings_contents;
+        GSettings *settings_paned;
+        GSettings *settings_search_notebook;
+        GSettings *settings_assistant;
+};
+
+enum {
+        FONTS_CHANGED,
+        LAST_SIGNAL
+};
+
+static gint signals[LAST_SIGNAL] = { 0 };
+
+
+static void
+dh_settings_init (DhSettings *self)
+{
+        self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, DH_TYPE_SETTINGS, DhSettingsPrivate);
+
+        self->priv->settings_desktop_interface = g_settings_new (SETTINGS_SCHEMA_ID_DESKTOP_INTERFACE);
+        self->priv->settings_fonts = g_settings_new (SETTINGS_SCHEMA_ID_FONTS);
+        self->priv->settings_window = g_settings_new (SETTINGS_SCHEMA_ID_WINDOW);
+        self->priv->settings_contents = g_settings_new (SETTINGS_SCHEMA_ID_CONTENTS);
+        self->priv->settings_paned = g_settings_new (SETTINGS_SCHEMA_ID_PANED);
+        self->priv->settings_search_notebook = g_settings_new (SETTINGS_SCHEMA_ID_SEARCH_NOTEBOOK);
+        self->priv->settings_assistant = g_settings_new (SETTINGS_SCHEMA_ID_ASSISTANT);
+
+        /* setup GSettings notifications */
+        g_signal_connect (self->priv->settings_fonts,
+                          "changed",
+                          G_CALLBACK (fonts_changed_cb), self);
+}
+
+
+static void
+dispose (GObject *object)
+{
+	DhSettings *self = DH_SETTINGS (object);
+        g_clear_object (&self->priv->settings_desktop_interface);
+        g_clear_object (&self->priv->settings_fonts);
+	g_clear_object (&self->priv->settings_window);
+        g_clear_object (&self->priv->settings_contents);
+        g_clear_object (&self->priv->settings_paned);
+        g_clear_object (&self->priv->settings_search_notebook);
+        g_clear_object (&self->priv->settings_assistant);
+
+	G_OBJECT_CLASS (dh_settings_parent_class)->dispose (object);
+}
+
+
+static void
+finalize (GObject *object)
+{
+	singleton = NULL;
+
+	/* Chain up to the parent class */
+	G_OBJECT_CLASS (dh_settings_parent_class)->finalize(object);
+}
+
+
+static void
+dh_settings_class_init (DhSettingsClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (object_class, sizeof (DhSettingsPrivate));
+	object_class->dispose = dispose;
+	object_class->finalize = finalize;
+
+        signals[FONTS_CHANGED] =
+                g_signal_new ("fonts-changed",
+                              G_TYPE_FROM_CLASS (klass),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (DhSettingsClass, fonts_changed),
+                              NULL, NULL,
+                              _dh_marshal_VOID__STRING_STRING,
+                              G_TYPE_NONE,
+                              2,
+                              G_TYPE_STRING,
+                              G_TYPE_STRING);
+}
+
+static void
+fonts_changed_cb (GSettings *settings, gchar *key, gpointer user_data)
+{
+        DhSettings *self = DH_SETTINGS (user_data);
+        gchar *fixed_font = NULL;
+        gchar *variable_font = NULL;
+        dh_settings_get_selected_fonts (self, &fixed_font, &variable_font);
+        //emit signal - font changed
+        g_signal_emit (self, signals[FONTS_CHANGED], 0, fixed_font, variable_font);
+        g_free (fixed_font);
+        g_free (variable_font);
+}
+
+/*******************************************************************************
+ * Public Methods
+ ******************************************************************************/
+DhSettings *
+dh_settings_get (void)
+{
+	if (!singleton) {
+		singleton = DH_SETTINGS (g_object_new (DH_TYPE_SETTINGS, NULL));
+	} else {
+		g_object_ref (singleton);
+	}
+	g_assert (singleton);
+	return singleton;
+}
+
+void
+dh_settings_get_selected_fonts (DhSettings *self, gchar **font_name_fixed, gchar **font_name_variable)
+{
+        g_return_if_fail (font_name_fixed != NULL && *font_name_fixed == NULL);
+        g_return_if_fail (font_name_variable != NULL && *font_name_variable == NULL);
+
+        gboolean use_system_font = g_settings_get_boolean (
+                self->priv->settings_fonts, "use-system-fonts");
+        if (use_system_font) {
+                *font_name_fixed = g_settings_get_string (
+                        self->priv->settings_desktop_interface,
+                        "monospace-font-name");
+                *font_name_variable = g_settings_get_string (
+                        self->priv->settings_desktop_interface,
+                        "font-name");
+        } else {
+                *font_name_fixed = g_settings_get_string (
+                        self->priv->settings_fonts, "fixed-font");
+                *font_name_variable = g_settings_get_string (
+                        self->priv->settings_fonts, "variable-font");
+        }
+}
+
+GSettings *
+dh_settings_peek_fonts_settings (DhSettings *self)
+{
+        return self->priv->settings_fonts;
+}
+
+GSettings *
+dh_settings_peek_window_settings (DhSettings *self)
+{
+        return self->priv->settings_window;
+}
+
+GSettings *
+dh_settings_peek_contents_settings (DhSettings *self)
+{
+        return self->priv->settings_contents;
+}
+
+GSettings *
+dh_settings_peek_paned_settings (DhSettings *self)
+{
+        return self->priv->settings_paned;
+}
+
+GSettings *
+dh_settings_peek_search_notebook_settings (DhSettings *self)
+{
+        return self->priv->settings_search_notebook;
+}
+
+GSettings *
+dh_settings_peek_assistant_settings (DhSettings *self)
+{
+        return self->priv->settings_assistant;
+}
+
diff --git a/src/dh-settings.h b/src/dh-settings.h
new file mode 100644
index 0000000..0e5f37c
--- /dev/null
+++ b/src/dh-settings.h
@@ -0,0 +1,77 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2012 Thomas Bechtold <toabctl gnome org>
+ *
+ * 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 of the
+ * License, 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 __DH_SETTINGS_H__
+#define __DH_SETTINGS_H__
+
+#include <gio/gio.h>
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define DH_TYPE_SETTINGS (dh_settings_get_type ())
+#define DH_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DH_TYPE_SETTINGS, DhSettings))
+#define DH_IS_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DH_TYPE_SETTINGS))
+#define DH_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DH_TYPE_SETTINGS, DhSettingsClass))
+#define DH_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DH_TYPE_SETTINGS))
+#define DH_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DH_TYPE_SETTINGS, DhSettingsClass))
+
+
+typedef struct _DhSettings DhSettings;
+typedef struct _DhSettingsClass DhSettingsClass;
+typedef struct _DhSettingsPrivate DhSettingsPrivate;
+
+
+struct _DhSettings{
+	GObject parent;
+	/*<private>*/
+	DhSettingsPrivate *priv;
+};
+
+struct _DhSettingsClass{
+	GObjectClass parent;
+        /* Signals */
+        void (*fonts_changed) (DhSettings *settings,
+                               const gchar *font_name_fixed,
+                               const gchar *font_name_variable);
+} ;
+
+GType dh_settings_get_type (void) G_GNUC_CONST;;
+
+DhSettings * dh_settings_get (void);
+
+void dh_settings_get_selected_fonts (DhSettings *self, gchar **font_name_fixed, gchar **font_name_variable);
+
+GSettings * dh_settings_peek_fonts_settings (DhSettings *self);
+
+GSettings * dh_settings_peek_window_settings (DhSettings *self);
+
+GSettings * dh_settings_peek_contents_settings (DhSettings *self);
+
+GSettings * dh_settings_peek_paned_settings (DhSettings *self);
+
+GSettings * dh_settings_peek_search_notebook_settings (DhSettings *self);
+
+GSettings * dh_settings_peek_assistant_settings (DhSettings *self);
+
+
+G_END_DECLS
+
+#endif /* __DH_SETTINGS_H__ */
diff --git a/src/dh-util.c b/src/dh-util.c
index 08151a3..12a9670 100644
--- a/src/dh-util.c
+++ b/src/dh-util.c
@@ -27,10 +27,8 @@
 #ifdef GDK_WINDOWING_QUARTZ
 #include <gtkosxapplication.h>
 #endif
-#include "ige-conf.h"
 #include "dh-util.h"
 
-static GList *views;
 
 static GtkBuilder *
 get_builder_file (const gchar *filename,
@@ -188,627 +186,6 @@ dh_util_build_data_filename (const gchar *first_part,
         return ret;
 }
 
-typedef struct {
-        gchar *name;
-        guint  timeout_id;
-} DhUtilStateItem;
-
-static void
-util_state_item_free (DhUtilStateItem *item)
-{
-        g_free (item->name);
-        if (item->timeout_id) {
-                g_source_remove (item->timeout_id);
-        }
-        g_slice_free (DhUtilStateItem, item);
-}
-
-static void
-util_state_setup_widget (GtkWidget   *widget,
-                         const gchar *name)
-{
-        DhUtilStateItem *item;
-
-        item = g_slice_new0 (DhUtilStateItem);
-        item->name = g_strdup (name);
-
-        g_object_set_data_full (G_OBJECT (widget),
-                                "dh-util-state",
-                                item,
-                                (GDestroyNotify) util_state_item_free);
-}
-
-static gchar *
-util_state_get_key (const gchar *name,
-                    const gchar *key)
-{
-        return g_strdup_printf ("/apps/devhelp/state/%s/%s", name, key);
-}
-
-static void
-util_state_schedule_save (GtkWidget   *widget,
-                          GSourceFunc  func)
-
-{
-        DhUtilStateItem *item;
-
-        item = g_object_get_data (G_OBJECT (widget), "dh-util-state");
-        if (item->timeout_id) {
-		g_source_remove (item->timeout_id);
-	}
-
-	item->timeout_id = g_timeout_add (500,
-                                          func,
-                                          widget);
-}
-
-static void
-util_state_save_window (GtkWindow   *window,
-                        const gchar *name)
-{
-        gchar          *key;
-        GdkWindowState  state;
-        gboolean        maximized;
-        gint            width, height;
-        gint            x, y;
-
-        state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window)));
-        if (state & GDK_WINDOW_STATE_MAXIMIZED) {
-                maximized = TRUE;
-        } else {
-                maximized = FALSE;
-        }
-
-        key = util_state_get_key (name, "maximized");
-        ige_conf_set_bool (ige_conf_get (), key, maximized);
-        g_free (key);
-
-        /* If maximized don't save the size and position. */
-        if (maximized) {
-                return;
-        }
-
-        gtk_window_get_size (GTK_WINDOW (window), &width, &height);
-
-        key = util_state_get_key (name, "width");
-        ige_conf_set_int (ige_conf_get (), key, width);
-        g_free (key);
-
-        key = util_state_get_key (name, "height");
-        ige_conf_set_int (ige_conf_get (), key, height);
-        g_free (key);
-
-        gtk_window_get_position (GTK_WINDOW (window), &x, &y);
-
-        key = util_state_get_key (name, "x_position");
-        ige_conf_set_int (ige_conf_get (), key, x);
-        g_free (key);
-
-        key = util_state_get_key (name, "y_position");
-        ige_conf_set_int (ige_conf_get (), key, y);
-        g_free (key);
-}
-
-static void
-util_state_restore_window (GtkWindow   *window,
-                           const gchar *name)
-{
-        gchar     *key;
-        gboolean   maximized;
-        gint       width, height;
-        gint       x, y;
-        GdkScreen *screen;
-        gint       max_width, max_height;
-
-        key = util_state_get_key (name, "width");
-        ige_conf_get_int (ige_conf_get (), key, &width);
-        g_free (key);
-
-        key = util_state_get_key (name, "height");
-        ige_conf_get_int (ige_conf_get (), key, &height);
-        g_free (key);
-
-        key = util_state_get_key (name, "x_position");
-        ige_conf_get_int (ige_conf_get (), key, &x);
-        g_free (key);
-
-        key = util_state_get_key (name, "y_position");
-        ige_conf_get_int (ige_conf_get (), key, &y);
-        g_free (key);
-
-        if (width > 1 && height > 1) {
-                screen = gtk_widget_get_screen (GTK_WIDGET (window));
-                max_width = gdk_screen_get_width (screen);
-                max_height = gdk_screen_get_height (screen);
-
-                width = CLAMP (width, 0, max_width);
-                height = CLAMP (height, 0, max_height);
-
-                x = CLAMP (x, 0, max_width - width);
-                y = CLAMP (y, 0, max_height - height);
-
-                gtk_window_set_default_size (window, width, height);
-        }
-
-        gtk_window_move (window, x, y);
-
-        key = util_state_get_key (name, "maximized");
-        ige_conf_get_bool (ige_conf_get (), key, &maximized);
-        g_free (key);
-
-        if (maximized) {
-                gtk_window_maximize (window);
-        }
-}
-
-static gboolean
-util_state_window_timeout_cb (gpointer window)
-{
-        DhUtilStateItem *item;
-
-        item = g_object_get_data (window, "dh-util-state");
-        if (item) {
-                item->timeout_id = 0;
-                util_state_save_window (window, item->name);
-        }
-
-	return FALSE;
-}
-
-static gboolean
-util_state_window_configure_event_cb (GtkWidget         *window,
-                                      GdkEventConfigure *event,
-                                      gpointer           user_data)
-{
-	util_state_schedule_save (window, util_state_window_timeout_cb);
-	return FALSE;
-}
-
-static gboolean
-util_state_paned_timeout_cb (gpointer paned)
-{
-        DhUtilStateItem *item;
-
-        item = g_object_get_data (paned, "dh-util-state");
-        if (item) {
-                gchar *key;
-
-                item->timeout_id = 0;
-
-                key = util_state_get_key (item->name, "position");
-                ige_conf_set_int (ige_conf_get (),
-                                  key,
-                                  gtk_paned_get_position (paned));
-                g_free (key);
-        }
-
-	return FALSE;
-}
-
-static gboolean
-util_state_paned_changed_cb (GtkWidget *paned,
-                             gpointer   user_data)
-{
-	util_state_schedule_save (paned, util_state_paned_timeout_cb);
-	return FALSE;
-}
-
-void
-dh_util_state_manage_window (GtkWindow   *window,
-                             const gchar *name)
-{
-        util_state_setup_widget (GTK_WIDGET (window), name);
-
-        g_signal_connect (window, "configure-event",
-                          G_CALLBACK (util_state_window_configure_event_cb),
-                          NULL);
-
-        util_state_restore_window (window, name);
-}
-
-void
-dh_util_state_manage_paned (GtkPaned    *paned,
-                            const gchar *name)
-{
-        gchar *key;
-        gint   position;
-
-        util_state_setup_widget (GTK_WIDGET (paned), name);
-
-        key = util_state_get_key (name, "position");
-        if (ige_conf_get_int (ige_conf_get (), key, &position)) {
-                gtk_paned_set_position (paned, position);
-        }
-        g_free (key);
-
-        g_signal_connect (paned, "notify::position",
-                          G_CALLBACK (util_state_paned_changed_cb),
-                          NULL);
-}
-
-GSList *
-dh_util_state_load_books_disabled (void)
-{
-        gchar *key;
-        GSList *books_disabled = NULL;
-
-        key = util_state_get_key ("main/contents", "books_disabled");
-        ige_conf_get_string_list (ige_conf_get (), key, &books_disabled);
-        g_free (key);
-
-        return books_disabled;
-}
-
-void
-dh_util_state_store_books_disabled (GSList *books_disabled)
-{
-        gchar *key;
-
-        key = util_state_get_key ("main/contents", "books_disabled");
-        ige_conf_set_string_list (ige_conf_get (), key, books_disabled);
-        g_free (key);
-}
-
-gboolean
-dh_util_state_load_group_books_by_language (void)
-{
-        gchar *key;
-        gboolean group_books_by_language = FALSE;
-
-        key = util_state_get_key ("main/contents", "group_books_by_language");
-        ige_conf_get_bool (ige_conf_get (), key, &group_books_by_language);
-        g_free (key);
-
-        return group_books_by_language;
-}
-
-void
-dh_util_state_store_group_books_by_language (gboolean group_books_by_language)
-{
-        gchar *key;
-
-        key = util_state_get_key ("main/contents", "group_books_by_language");
-        ige_conf_set_bool (ige_conf_get (), key, group_books_by_language);
-        g_free (key);
-}
-
-static gboolean
-util_state_notebook_timeout_cb (gpointer notebook)
-{
-        DhUtilStateItem *item;
-
-        item = g_object_get_data (notebook, "dh-util-state");
-        if (item) {
-                GtkWidget   *page;
-                const gchar *page_name;
-
-                item->timeout_id = 0;
-
-                page = gtk_notebook_get_nth_page (
-                        notebook,
-                        gtk_notebook_get_current_page (notebook));
-                page_name = dh_util_state_get_notebook_page_name (page);
-                if (page_name) {
-                        gchar *key;
-
-                        key = util_state_get_key (item->name, "selected_tab");
-                        ige_conf_set_string (ige_conf_get (), key, page_name);
-                        g_free (key);
-                }
-        }
-
-	return FALSE;
-}
-
-static void
-util_state_notebook_switch_page_cb (GtkWidget       *notebook,
-                                    gpointer         page,
-                                    guint            page_num,
-                                    gpointer         user_data)
-{
-	util_state_schedule_save (notebook, util_state_notebook_timeout_cb);
-}
-
-void
-dh_util_state_set_notebook_page_name (GtkWidget   *page,
-                                      const gchar *page_name)
-{
-        g_object_set_data_full (G_OBJECT (page),
-                                "dh-util-state-tab-name",
-                                g_strdup (page_name),
-                                g_free);
-}
-
-const gchar *
-dh_util_state_get_notebook_page_name (GtkWidget *page)
-{
-        return g_object_get_data (G_OBJECT (page),
-                                  "dh-util-state-tab-name");
-}
-
-void
-dh_util_state_manage_notebook (GtkNotebook *notebook,
-                               const gchar *name,
-                               const gchar *default_tab)
-{
-        gchar     *key;
-        gchar     *tab;
-        gint       i;
-
-        util_state_setup_widget (GTK_WIDGET (notebook), name);
-
-        key = util_state_get_key (name, "selected_tab");
-        if (!ige_conf_get_string (ige_conf_get (), key, &tab)) {
-                tab = g_strdup (default_tab);
-        }
-        g_free (key);
-
-        for (i = 0; i < gtk_notebook_get_n_pages (notebook); i++) {
-                GtkWidget   *page;
-                const gchar *page_name;
-
-                page = gtk_notebook_get_nth_page (notebook, i);
-                page_name = dh_util_state_get_notebook_page_name (page);
-                if (page_name && strcmp (page_name, tab) == 0) {
-                        gtk_notebook_set_current_page (notebook, i);
-                        gtk_widget_grab_focus (page);
-                        break;
-                }
-        }
-
-        g_free (tab);
-
-        g_signal_connect (notebook, "switch-page",
-                          G_CALLBACK (util_state_notebook_switch_page_cb),
-                          NULL);
-}
-
-static gboolean
-split_font_string (const gchar  *name_and_size,
-                   gchar       **name,
-                   gdouble      *size)
-{
-	PangoFontDescription *desc;
-	PangoFontMask         mask;
-	gboolean              retval = FALSE;
-
-	desc = pango_font_description_from_string (name_and_size);
-	if (!desc) {
-		return FALSE;
-	}
-
-	mask = (PANGO_FONT_MASK_FAMILY | PANGO_FONT_MASK_SIZE);
-        if ((pango_font_description_get_set_fields (desc) & mask) == mask) {
-		*size = PANGO_PIXELS (pango_font_description_get_size (desc));
-		*name = g_strdup (pango_font_description_get_family (desc));
-		retval = TRUE;
-	}
-
-	pango_font_description_free (desc);
-
-	return retval;
-}
-
-#define DH_CONF_PATH                  "/apps/devhelp"
-#define DH_CONF_USE_SYSTEM_FONTS      DH_CONF_PATH "/ui/use_system_fonts"
-#define DH_CONF_VARIABLE_FONT         DH_CONF_PATH "/ui/variable_font"
-#define DH_CONF_FIXED_FONT            DH_CONF_PATH "/ui/fixed_font"
-#define DH_CONF_SYSTEM_VARIABLE_FONT  "/desktop/gnome/interface/font_name"
-#define DH_CONF_SYSTEM_FIXED_FONT     "/desktop/gnome/interface/monospace_font_name"
-
-void
-dh_util_font_get_variable (gchar    **name,
-                           gdouble   *size,
-                           gboolean   use_system_fonts)
-{
-	IgeConf *conf;
-	gchar   *name_and_size;
-	GSettings *settings;
-
-	conf = ige_conf_get ();
-
-	if (use_system_fonts) {
-#ifdef GDK_WINDOWING_QUARTZ
-                name_and_size = g_strdup ("Lucida Grande 14");
-#else
-		settings = g_settings_new ("org.gnome.desktop.interface");
-		name_and_size = g_settings_get_string (settings, "font-name");
-		g_object_unref (settings);
-#endif
-	} else {
-		ige_conf_get_string (conf,
-                                     DH_CONF_VARIABLE_FONT,
-                                     &name_and_size);
-	}
-
-        if (!split_font_string (name_and_size, name, size)) {
-                *name = g_strdup ("sans");
-                *size = 12;
-        }
-
-        g_free (name_and_size);
-}
-
-void
-dh_util_font_get_fixed (gchar    **name,
-                        gdouble   *size,
-                        gboolean   use_system_fonts)
-{
-	IgeConf *conf;
-	gchar   *name_and_size;
-	GSettings *settings;
-
-	conf = ige_conf_get ();
-
-	if (use_system_fonts) {
-#ifdef GDK_WINDOWING_QUARTZ
-                name_and_size = g_strdup ("Monaco 14");
-#else
-		settings = g_settings_new ("org.gnome.desktop.interface");
-		name_and_size = g_settings_get_string (settings, "monospace-font-name");
-		g_object_unref (settings);
-#endif
-	} else {
-		ige_conf_get_string (conf,
-                                     DH_CONF_FIXED_FONT,
-                                     &name_and_size);
-	}
-
-        if (!split_font_string (name_and_size, name, size)) {
-                *name = g_strdup ("monospace");
-                *size = 12;
-        }
-
-        g_free (name_and_size);
-}
-
-static void
-view_destroy_cb (GtkWidget *view,
-                 gpointer   user_data)
-{
-        views = g_list_remove (views, view);
-}
-
-#ifdef HAVE_WEBKIT2
-static gdouble
-get_screen_dpi (GdkScreen *screen)
-{
-        gdouble dpi;
-        gdouble dp, di;
-
-        dpi = gdk_screen_get_resolution (screen);
-        if (dpi != -1)
-                return dpi;
-
-        dp = hypot (gdk_screen_get_width (screen), gdk_screen_get_height (screen));
-        di = hypot (gdk_screen_get_width_mm (screen), gdk_screen_get_height_mm (screen)) / 25.4;
-
-        return dp / di;
-}
-#endif
-
-static guint
-dh_util_convert_font_size_to_pixels (GtkWidget *widget,
-                                     gdouble    font_size)
-{
-#ifdef HAVE_WEBKIT2
-        /* WebKit2 uses font sizes in pixels */
-        GdkScreen *screen;
-        gdouble    dpi;
-
-        screen = gtk_widget_has_screen (widget) ?
-                gtk_widget_get_screen (widget) : gdk_screen_get_default ();
-        dpi = screen ? get_screen_dpi (screen) : 96;
-
-        return font_size / 72.0 * dpi;
-#else
-        return font_size;
-#endif
-}
-
-static void
-view_setup_fonts (WebKitWebView *view)
-{
-#ifdef HAVE_WEBKIT2
-        WebKitSettings    *settings;
-#else
-        WebKitWebSettings *settings;
-#endif
-        IgeConf           *conf;
-        gboolean           use_system_fonts;
-	gchar             *variable_name;
-	gdouble            variable_size;
-        guint              variable_size_px;
-	gchar             *fixed_name;
-	gdouble            fixed_size;
-        guint              fixed_size_px;
-
-        conf = ige_conf_get ();
-
-        settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW (view));
-
-	ige_conf_get_bool (conf,
-                           DH_CONF_USE_SYSTEM_FONTS,
-                           &use_system_fonts);
-
-        dh_util_font_get_variable (&variable_name, &variable_size,
-                                   use_system_fonts);
-        dh_util_font_get_fixed (&fixed_name, &fixed_size,
-                                   use_system_fonts);
-
-        variable_size_px = dh_util_convert_font_size_to_pixels (GTK_WIDGET (view), fixed_size);
-        fixed_size_px = dh_util_convert_font_size_to_pixels (GTK_WIDGET (view), variable_size);
-
-        g_object_set (settings,
-#ifdef HAVE_WEBKIT2
-                      "zoom-text-only", TRUE,
-#endif
-                      "monospace-font-family", fixed_name,
-                      "default-monospace-font-size", fixed_size_px,
-                      "sans-serif-font-family", variable_name,
-                      "serif-font-family", variable_name,
-                      "default-font-size", variable_size_px,
-                      NULL);
-
-        g_free (variable_name);
-        g_free (fixed_name);
-}
-
-static void
-font_notify_cb (IgeConf     *conf,
-                const gchar *path,
-                gpointer     user_data)
-{
-        GList *l;
-
-        for (l = views; l; l = l->next) {
-                view_setup_fonts (l->data);
-        }
-}
-
-void
-dh_util_font_add_web_view (WebKitWebView *view)
-{
-        static gboolean setup;
-
-        if (!setup) {
-                IgeConf *conf;
-
-                conf = ige_conf_get ();
-
-		ige_conf_notify_add (conf,
-                                     DH_CONF_USE_SYSTEM_FONTS,
-                                     font_notify_cb,
-                                     NULL);
-		ige_conf_notify_add (conf,
-                                     DH_CONF_SYSTEM_VARIABLE_FONT,
-                                     font_notify_cb,
-                                     NULL);
-		ige_conf_notify_add (conf,
-                                     DH_CONF_SYSTEM_FIXED_FONT,
-                                     font_notify_cb,
-                                     NULL);
-		ige_conf_notify_add (conf,
-                                     DH_CONF_VARIABLE_FONT,
-                                     font_notify_cb,
-                                     NULL);
-		ige_conf_notify_add (conf,
-                                     DH_CONF_FIXED_FONT,
-                                     font_notify_cb,
-                                     NULL);
-
-                setup = TRUE;
-        }
-
-        views = g_list_prepend (views, view);
-
-        g_signal_connect (view, "destroy",
-                          G_CALLBACK (view_destroy_cb),
-                          NULL);
-
-        view_setup_fonts (view);
-}
-
 gint
 dh_util_cmp_book (DhLink *a, DhLink *b)
 {
@@ -892,3 +269,113 @@ dh_util_create_data_uri_for_filename (const gchar *filename,
 
         return uri;
 }
+
+/* set the given fonts on the given view */
+void
+dh_util_view_set_font (WebKitWebView *view, const gchar *font_name_fixed, const gchar *font_name_variable)
+{
+        /* get the font size */
+        PangoFontDescription *font_desc_fixed = pango_font_description_from_string (font_name_fixed);
+        PangoFontDescription *font_desc_variable = pango_font_description_from_string (font_name_variable);
+        gint font_size_fixed = PANGO_PIXELS (pango_font_description_get_size (font_desc_fixed));
+        gint font_size_variable = PANGO_PIXELS (pango_font_description_get_size (font_desc_variable));
+        pango_font_description_free (font_desc_fixed);
+        pango_font_description_free (font_desc_variable);
+
+        /* get the settings from the view */
+        #ifdef HAVE_WEBKIT2
+                WebKitSettings    *settings;
+#else
+                WebKitWebSettings *settings;
+#endif
+                settings = webkit_web_view_get_settings (view);
+                /* set the fonts */
+                g_object_set (settings,
+#ifdef HAVE_WEBKIT2
+                              "zoom-text-only", TRUE,
+#endif
+                              "monospace-font-family", font_name_fixed,
+                              "default-monospace-font-size", font_size_fixed,
+                              "serif-font-family", font_name_variable,
+                              "default-font-size", font_size_variable,
+                              NULL);
+        g_debug ("Set font-fixed to '%s' (%i) and font-variable to '%s' (%i).",
+                 font_name_fixed, font_size_fixed, font_name_variable, font_size_variable);
+}
+
+void
+dh_util_window_settings_save (GtkWindow *window, GSettings *settings, gboolean has_maximize)
+{
+        GdkWindowState  state;
+        gboolean        maximized;
+        gint            width, height;
+        gint            x, y;
+
+
+        if (has_maximize) {
+                state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window)));
+                if (state & GDK_WINDOW_STATE_MAXIMIZED) {
+                        maximized = TRUE;
+                } else {
+                        maximized = FALSE;
+                }
+
+                g_settings_set_boolean (settings, "maximized", maximized);
+
+                /* If maximized don't save the size and position. */
+                if (maximized) {
+                        return;
+                }
+        }
+
+        /* store the dimensions */
+        gtk_window_get_size (GTK_WINDOW (window), &width, &height);
+        g_settings_set_int (settings, "width", width);
+        g_settings_set_int (settings, "height", height);
+
+        /* store the position */
+        gtk_window_get_position (GTK_WINDOW (window), &x, &y);
+        g_settings_set_int (settings, "x-position", x);
+        g_settings_set_int (settings, "y-position", y);
+}
+
+void
+dh_util_window_settings_restore (GtkWindow *window,
+                                 GSettings *settings,
+                                 gboolean has_maximize)
+{
+        gboolean   maximized;
+        gint       width, height;
+        gint       x, y;
+        GdkScreen *screen;
+        gint       max_width, max_height;
+
+        width = g_settings_get_int (settings, "width");
+        height = g_settings_get_int (settings, "height");
+        x = g_settings_get_int (settings, "x-position");
+        y = g_settings_get_int (settings, "y-position");
+
+        if (width > 1 && height > 1) {
+                screen = gtk_widget_get_screen (GTK_WIDGET (window));
+                max_width = gdk_screen_get_width (screen);
+                max_height = gdk_screen_get_height (screen);
+
+                width = CLAMP (width, 0, max_width);
+                height = CLAMP (height, 0, max_height);
+
+                x = CLAMP (x, 0, max_width - width);
+                y = CLAMP (y, 0, max_height - height);
+
+                gtk_window_set_default_size (window, width, height);
+        }
+
+        gtk_window_move (window, x, y);
+
+        if (has_maximize) {
+                maximized = g_settings_get_boolean (settings, "maximized");
+
+                if (maximized) {
+                        gtk_window_maximize (window);
+                }
+        }
+}
diff --git a/src/dh-util.h b/src/dh-util.h
index 0ac9778..1727e4d 100644
--- a/src/dh-util.h
+++ b/src/dh-util.h
@@ -23,6 +23,7 @@
 #define __DH_UTIL_H__
 
 #include <gtk/gtk.h>
+#include <gio/gio.h>
 #ifdef HAVE_WEBKIT2
 #include <webkit2/webkit2.h>
 #else
@@ -43,31 +44,6 @@ void         dh_util_builder_connect              (GtkBuilder  *gui,
                                                    ...);
 gchar *      dh_util_build_data_filename          (const gchar *first_part,
                                                    ...);
-void         dh_util_state_manage_window          (GtkWindow   *window,
-                                                   const gchar *name);
-void         dh_util_state_manage_paned           (GtkPaned    *paned,
-                                                   const gchar *name);
-void         dh_util_state_manage_notebook        (GtkNotebook *notebook,
-                                                   const gchar *name,
-                                                   const gchar *default_tab);
-void         dh_util_state_set_notebook_page_name (GtkWidget   *page,
-                                                   const gchar *page_name);
-const gchar *dh_util_state_get_notebook_page_name (GtkWidget   *page);
-
-GSList *     dh_util_state_load_books_disabled    (void);
-void         dh_util_state_store_books_disabled   (GSList *books_disabled);
-
-gboolean     dh_util_state_load_group_books_by_language  (void);
-void         dh_util_state_store_group_books_by_language (gboolean group_books_by_language);
-
-void         dh_util_font_get_variable            (gchar        **name,
-                                                   gdouble       *size,
-                                                   gboolean       use_system_font);
-void         dh_util_font_get_fixed               (gchar        **name,
-                                                   gdouble       *size,
-                                                   gboolean       use_system_font);
-void         dh_util_font_add_web_view            (WebKitWebView *view);
-
 gint         dh_util_cmp_book                     (DhLink *a,
                                                    DhLink *b);
 
@@ -75,6 +51,18 @@ void         dh_util_ascii_strtitle               (gchar *str);
 gchar       *dh_util_create_data_uri_for_filename (const gchar *filename,
                                                    const gchar *mime_type);
 
+void         dh_util_view_set_font                (WebKitWebView *view,
+                                                   const gchar *font_name_fixed,
+                                                   const gchar *font_name_variable);
+
+void         dh_util_window_settings_save         (GtkWindow *window,
+                                                   GSettings *settings,
+                                                   gboolean has_maximize);
+
+void         dh_util_window_settings_restore      (GtkWindow *window,
+                                                   GSettings *settings,
+                                                   gboolean has_maximize);
+
 G_END_DECLS
 
 #endif /* __DH_UTIL_H__ */
diff --git a/src/dh-window.c b/src/dh-window.c
index cbd1a08..e45fc3e 100644
--- a/src/dh-window.c
+++ b/src/dh-window.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2001-2008 Imendio AB
  * Copyright (C) 2012 Aleksander Morgado <aleksander gnu org>
+ * Copyright (C) 2012 Thomas Bechtold <toabctl gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -50,6 +51,7 @@
 #include "dh-util.h"
 #include "dh-marshal.h"
 #include "dh-enum-types.h"
+#include "dh-settings.h"
 #include "eggfindbar.h"
 
 #define FULLSCREEN_ANIMATION_SPEED 4
@@ -75,6 +77,7 @@ struct _DhWindowPriv {
 
         DhLink         *selected_search_link;
         guint           find_source_id;
+        DhSettings     *settings;
 };
 
 enum {
@@ -191,7 +194,7 @@ print_cb (GSimpleAction *action,
         WebKitPrintOperation *print_operation;
 
         print_operation = webkit_print_operation_new (web_view);
-        webkit_print_operation_run_dialog (print_operation, GTK_WIDGET (window));
+        webkit_print_operation_run_dialog (print_operation, GTK_WINDOW (window));
         g_object_unref (print_operation);
 #else
         webkit_web_view_execute_script (web_view, "print();");
@@ -811,6 +814,40 @@ window_fullscreen_controls_show (DhWindow *window)
 }
 
 static void
+settings_fonts_changed_cb (DhSettings *settings,
+                           const gchar *font_name_fixed,
+                           const gchar *font_name_variable,
+                           gpointer user_data)
+{
+        DhWindow *window = DH_WINDOW (user_data);
+        DhWindowPriv *priv = window->priv;
+        gint i;
+        WebKitWebView *view;
+        /* change font for all pages */
+        for (i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK(priv->notebook)); i++) {
+                GtkWidget *page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), i);
+                view = WEBKIT_WEB_VIEW (g_object_get_data (G_OBJECT (page), "web_view"));
+                dh_util_view_set_font (view, font_name_fixed, font_name_variable);
+        }
+}
+
+static gboolean
+window_configure_event_cb (GtkWidget *window,
+                           GdkEventConfigure *event,
+                           gpointer user_data)
+{
+        DhWindow *dhwindow;
+        DhWindowPriv  *priv;
+
+        dhwindow = DH_WINDOW (user_data);
+        priv = GET_PRIVATE (dhwindow);
+        dh_util_window_settings_save (
+                GTK_WINDOW (window),
+                dh_settings_peek_window_settings (priv->settings), TRUE);
+	return FALSE;
+}
+
+static void
 dh_window_init (DhWindow *window)
 {
         DhWindowPriv  *priv;
@@ -825,6 +862,13 @@ dh_window_init (DhWindow *window)
 
         priv->selected_search_link = NULL;
 
+        /* handle settings */
+        priv->settings = dh_settings_get ();
+        g_signal_connect (priv->settings,
+                          "fonts-changed",
+                          G_CALLBACK (settings_fonts_changed_cb),
+                          window);
+
         /* Setup builder */
         priv->builder = gtk_builder_new ();
         path = dh_util_build_data_filename ("devhelp", "ui", "devhelp.builder", NULL);
@@ -863,9 +907,21 @@ dh_window_init (DhWindow *window)
 }
 
 static void
+dispose (GObject *object)
+{
+	DhWindow *self = DH_WINDOW (object);
+        g_clear_object (&self->priv->settings);
+
+	/* Chain up to the parent class */
+	G_OBJECT_CLASS (dh_window_parent_class)->dispose (object);
+}
+
+static void
 dh_window_class_init (DhWindowClass *klass)
 {
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
         g_type_class_add_private (klass, sizeof (DhWindowPriv));
+        object_class->dispose = dispose;
 
         signals[OPEN_LINK] =
                 g_signal_new ("open-link",
@@ -922,6 +978,11 @@ window_control_after_switch_page_cb (GtkWidget       *notebook,
         g_signal_handlers_unblock_by_func (priv->book_tree,
                                            window_tree_link_selected_cb,
                                            window);
+        /* save the current selected tab */
+        const gchar *label = gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (notebook), page);
+        g_settings_set_string (
+                dh_settings_peek_search_notebook_settings (priv->settings),
+                "selected-tab", label);
 }
 
 static void
@@ -976,6 +1037,8 @@ window_populate (DhWindow *window)
         GtkWidget     *book_tree_sw;
         DhBookManager *book_manager;
         GtkWidget     *toolbar;
+        gchar         *selected_tab;
+        guint         i;
 
         priv = window->priv;
 
@@ -1016,16 +1079,6 @@ window_populate (DhWindow *window)
 
         gtk_paned_add1 (GTK_PANED (priv->hpaned), priv->control_notebook);
 
-        g_signal_connect (priv->control_notebook,
-                          "switch-page",
-                          G_CALLBACK (window_control_switch_page_cb),
-                          window);
-
-        g_signal_connect_after (priv->control_notebook,
-                                "switch-page",
-                                G_CALLBACK (window_control_after_switch_page_cb),
-                                window);
-
         book_tree_sw = gtk_scrolled_window_new (NULL, NULL);
 
         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (book_tree_sw),
@@ -1040,7 +1093,6 @@ window_populate (DhWindow *window)
         priv->book_tree = dh_book_tree_new (book_manager);
         gtk_container_add (GTK_CONTAINER (book_tree_sw),
                            priv->book_tree);
-        dh_util_state_set_notebook_page_name (book_tree_sw, "content");
         gtk_notebook_append_page (GTK_NOTEBOOK (priv->control_notebook),
                                   book_tree_sw,
                                   gtk_label_new (_("Contents")));
@@ -1050,7 +1102,6 @@ window_populate (DhWindow *window)
                           window);
 
         priv->search = dh_search_new (book_manager);
-        dh_util_state_set_notebook_page_name (priv->search, "search");
         gtk_notebook_append_page (GTK_NOTEBOOK (priv->control_notebook),
                                   priv->search,
                                   gtk_label_new (_("Search")));
@@ -1062,6 +1113,36 @@ window_populate (DhWindow *window)
         priv->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_paned_add2 (GTK_PANED (priv->hpaned), priv->vbox);
 
+        g_signal_connect (priv->control_notebook,
+                          "switch-page",
+                          G_CALLBACK (window_control_switch_page_cb),
+                          window);
+
+        g_signal_connect_after (priv->control_notebook,
+                                "switch-page",
+                                G_CALLBACK (window_control_after_switch_page_cb),
+                                window);
+
+        /* restore selected control notebook page */
+        selected_tab = g_settings_get_string (
+                dh_settings_peek_search_notebook_settings (priv->settings),
+                "selected-tab");
+        for (i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (priv->control_notebook)); i++) {
+                GtkWidget   *page;
+                const gchar *page_name;
+
+                page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->control_notebook), i);
+                page_name = gtk_notebook_get_tab_label_text (GTK_NOTEBOOK (priv->control_notebook), page);
+
+                if (page_name && strcmp (page_name, selected_tab) == 0) {
+                        gtk_widget_set_visible (GTK_WIDGET (page), TRUE);
+                        gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->control_notebook), i);
+                        gtk_widget_grab_focus (page);
+                        break;
+                }
+        }
+        g_free (selected_tab);
+
         /* HTML tabs notebook. */
         priv->notebook = gtk_notebook_new ();
         gtk_container_set_border_width (GTK_CONTAINER (priv->notebook), 0);
@@ -1581,6 +1662,8 @@ window_open_new_tab (DhWindow    *window,
         GtkWidget    *label;
         gint          num;
         GtkWidget    *info_bar;
+        gchar *font_fixed = NULL;
+        gchar *font_variable = NULL;
 #ifndef HAVE_WEBKIT2
         GtkWidget    *scrolled_window;
 #endif
@@ -1590,7 +1673,11 @@ window_open_new_tab (DhWindow    *window,
         /* Prepare the web view */
         view = webkit_web_view_new ();
         gtk_widget_show (view);
-        dh_util_font_add_web_view (WEBKIT_WEB_VIEW (view));
+        /* get the current fonts and set them on the new view */
+        dh_settings_get_selected_fonts (priv->settings, &font_fixed, &font_variable);
+        dh_util_view_set_font (WEBKIT_WEB_VIEW (view), font_fixed, font_variable);
+        g_free (font_fixed);
+        g_free (font_variable);
 
         /* Prepare the info bar */
         info_bar = gtk_info_bar_new ();
@@ -1920,11 +2007,17 @@ dh_window_new (DhApp *application)
 
         gtk_window_set_icon_name (GTK_WINDOW (window), "devhelp");
 
-        dh_util_state_manage_window (GTK_WINDOW (window), "main/window");
-        dh_util_state_manage_paned (GTK_PANED (priv->hpaned), "main/paned");
-        dh_util_state_manage_notebook (GTK_NOTEBOOK (priv->control_notebook),
-                                       "main/search_notebook",
-                                       "content");
+        g_signal_connect (window, "configure-event",
+                          G_CALLBACK (window_configure_event_cb),
+                          window);
+
+        dh_util_window_settings_restore (
+                GTK_WINDOW (window),
+                dh_settings_peek_window_settings (priv->settings), TRUE);
+
+        g_settings_bind (dh_settings_peek_paned_settings (priv->settings),
+                         "position", G_OBJECT (priv->hpaned),
+                         "position", G_SETTINGS_BIND_DEFAULT);
 
         return GTK_WIDGET (window);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]