]> spindle.queued.net Git - midori/commitdiff
Switch configuration to MidoriWebSettings.
authorChristian Dywan <christian@twotoasts.de>
Sun, 13 Apr 2008 19:51:43 +0000 (21:51 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sun, 13 Apr 2008 19:51:43 +0000 (21:51 +0200)
Switch configuration logic from a custom structure to
fully rely on MidoriWebSettings. This includes revamping
the preferences dialog. The old logic is not yet
replaced completely, this will follow soon, thus several
settings will have no effect right now.

po/POTFILES.in
src/conf.c
src/main.c
src/midori-browser.c
src/midori-trash.c
src/midori-webview.c
src/prefs.c
src/prefs.h
src/sokoke.c
src/sokoke.h

index c6203f0bb61839d7b340c921321255d4f8da84d5..acd019feedfa44a314b94e00b4cff5e84c33eed5 100644 (file)
@@ -4,6 +4,7 @@ midori.desktop.in
 src/conf.c
 src/helpers.c
 src/main.c
+src/midori-console.c
 src/midori-browser.c
 src/midori-panel.c
 src/midori-trash.c
index 91d12d290af5e0ae4235b673249e70572d2effa9..d77a7323702740d7d2abbbd89257c5b03a804828 100644 (file)
@@ -34,58 +34,6 @@ gboolean config_from_file(CConfig* config, const gchar* filename, GError** error
 {
     GKeyFile* keyFile = g_key_file_new();
     g_key_file_load_from_file(keyFile, filename, G_KEY_FILE_KEEP_COMMENTS, error);
-    /*g_key_file_load_from_data_dirs(keyFile, sFilename, NULL
-     , G_KEY_FILE_KEEP_COMMENTS, error);*/
-    #define GET_INT(var, key, default) \
-     var = sokoke_key_file_get_integer_default( \
-     keyFile, "browser", key, default, NULL)
-    #define GET_STR(var, key, default) \
-     var = sokoke_key_file_get_string_default( \
-     keyFile, "browser", key, default, NULL)
-    GET_INT(config->startup, "Startup", CONFIG_STARTUP_HOMEPAGE);
-    GET_STR(config->homepage, "Homepage", "http://www.google.com");
-    GET_STR(config->locationSearch, "LocationSearch", "http://www.google.com/search?q=%s");
-    GET_INT(config->toolbarNavigation, "ToolbarNavigation", TRUE);
-    GET_INT(config->toolbarBookmarks, "ToolbarBookmarks", FALSE);
-    GET_INT(config->toolbarStatus, "ToolbarStatus", TRUE);
-    //GET_INT(config->toolbarTransfer, "ToolbarTransfer", FALSE);
-    GET_INT(config->toolbarStyle, "ToolbarStyle", CONFIG_TOOLBAR_DEFAULT);
-    GET_INT(config->toolbarSmall, "ToolbarSmall", FALSE);
-    GET_INT(config->toolbarWebSearch, "ToolbarWebSearch", TRUE);
-    GET_INT(config->toolbarNewTab, "ToolbarNewTab", TRUE);
-    GET_INT(config->toolbarClosedTabs, "ToolbarClosedTabs", TRUE);
-    GET_INT(config->panelShow, "PanelShow", FALSE);
-    GET_INT(config->panelActive, "PanelActive", 0);
-    GET_STR(config->panelPageholder, "PanelPageholder", "http://www.google.com");
-    GET_INT(config->tabSize, "TabSize", 10);
-    GET_INT(config->tabClose, "TabClose", TRUE);
-    GET_INT(config->newPages, "NewPages", CONFIG_NEWPAGES_TAB_NEW);
-    GET_INT(config->openTabsInTheBackground, "OpenTabsInTheBackground", FALSE);
-    GET_INT(config->openPopupsInTabs, "OpenPopupsInTabs", FALSE);
-    GET_INT(config->middleClickGoto, "MiddleClickGoto", FALSE);
-    #undef GET_INT
-    #undef GET_STR
-
-    #define GET_INT(var, key, default) \
-     var = sokoke_key_file_get_integer_default( \
-     keyFile, "content", key, default, NULL)
-    #define GET_STR(var, key, default) \
-     var = sokoke_key_file_get_string_default( \
-     keyFile, "content", key, default, NULL)
-    GET_STR(config->defaultFontFamily, "DefaultFontFamily", "Sans");
-    GET_INT(config->defaultFontSize, "DefaultFontSize", 10);
-    GET_INT(config->minimumFontSize, "MinimumFontSize", 5);
-    GET_STR(config->defaultEncoding, "DefaultEncoding", "UTF-8");
-    GET_INT(config->autoLoadImages, "AutoLoadImages", TRUE);
-    GET_INT(config->autoShrinkImages, "AutoShrinkImages", TRUE);
-    GET_INT(config->printBackgrounds, "PrintBackgrounds", FALSE);
-    GET_INT(config->resizableTextAreas, "ResizableTextAreas", FALSE);
-    GET_INT(config->userStylesheet, "UserStylesheet", FALSE);
-    GET_STR(config->userStylesheetUri, "UserStylesheetUri", "");
-    GET_INT(config->enableScripts, "EnableScripts", TRUE);
-    GET_INT(config->enablePlugins, "EnablePlugins", TRUE);
-    #undef GET_INT
-    #undef GET_STR
 
     #define GET_INT(var, key, default) \
      var = sokoke_key_file_get_integer_default( \
@@ -109,41 +57,6 @@ gboolean config_to_file(CConfig* config, const gchar* filename, GError** error)
 {
     GKeyFile* keyFile = g_key_file_new();
 
-    g_key_file_set_integer(keyFile, "browser", "Startup", config->startup);
-    g_key_file_set_string (keyFile, "browser", "Homepage", config->homepage);
-    g_key_file_set_string (keyFile, "browser", "LocationSearch", config->locationSearch);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarNavigation", config->toolbarNavigation);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarBookmarks", config->toolbarBookmarks);
-    //g_key_file_set_integer(keyFile, "browser", "ToolbarTransfers", config->toolbarTransfers);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarStatus", config->toolbarStatus);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarStyle", config->toolbarStyle);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarSmall", config->toolbarSmall);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarWebSearch", config->toolbarWebSearch);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarNewTab", config->toolbarNewTab);
-    g_key_file_set_integer(keyFile, "browser", "ToolbarClosedTabs", config->toolbarClosedTabs);
-    g_key_file_set_integer(keyFile, "browser", "PanelShow", config->panelShow);
-    g_key_file_set_integer(keyFile, "browser", "PanelActive", config->panelActive);
-    g_key_file_set_string (keyFile, "browser", "PanelPageholder", config->panelPageholder);
-    g_key_file_set_integer(keyFile, "browser", "TabSize", config->tabSize);
-    g_key_file_set_integer(keyFile, "browser", "TabClose", config->tabClose);
-    g_key_file_set_integer(keyFile, "browser", "NewPages", config->newPages);
-    g_key_file_set_integer(keyFile, "browser", "OpenTabsInTheBackground", config->openTabsInTheBackground);
-    g_key_file_set_integer(keyFile, "browser", "OpenPopupsInTabs", config->openPopupsInTabs);
-    g_key_file_set_integer(keyFile, "browser", "MiddleClickGoto", config->middleClickGoto);
-
-    g_key_file_set_string (keyFile, "content", "DefaultFontFamily", config->defaultFontFamily);
-    g_key_file_set_integer(keyFile, "content", "DefaultFontSize", config->defaultFontSize);
-    g_key_file_set_integer(keyFile, "content", "MinimumFontSize", config->minimumFontSize);
-    g_key_file_set_string (keyFile, "content", "DefaultEncoding", config->defaultEncoding);
-    g_key_file_set_integer(keyFile, "content", "AutoLoadImages", config->autoLoadImages);
-    g_key_file_set_integer(keyFile, "content", "AutoShrinkImages", config->autoShrinkImages);
-    g_key_file_set_integer(keyFile, "content", "PrintBackgrounds", config->printBackgrounds);
-    g_key_file_set_integer(keyFile, "content", "ResizableTextAreas", config->resizableTextAreas);
-    g_key_file_set_integer(keyFile, "content", "UserStylesheet", config->userStylesheet);
-    g_key_file_set_string (keyFile, "content", "UserStylesheetUri", config->userStylesheetUri);
-    g_key_file_set_integer(keyFile, "content", "EnableScripts", config->enableScripts);
-    g_key_file_set_integer(keyFile, "content", "EnablePlugins", config->enablePlugins);
-
     g_key_file_set_integer(keyFile, "session", "RememberWinSize", config->rememberWinSize);
     g_key_file_set_integer(keyFile, "session", "WinWidth", config->winWidth);
     g_key_file_set_integer(keyFile, "session", "WinHeight", config->winHeight);
index 061501f621c889d205eab84677dc2f3ce159afc0..1ea8fdb61021072c517af558c22929778e9447dd 100644 (file)
@@ -133,17 +133,141 @@ locale_init (void)
 #endif
 }
 
+static MidoriWebSettings*
+settings_new_from_file (const gchar* filename)
+{
+    MidoriWebSettings* settings = midori_web_settings_new ();
+    GKeyFile* key_file = g_key_file_new ();
+    GError* error = NULL;
+    if (!g_key_file_load_from_file (key_file, filename,
+                                   G_KEY_FILE_KEEP_COMMENTS, &error))
+    {
+        if (error->code != G_FILE_ERROR_NOENT)
+            printf (_("The configuration couldn't be loaded. %s\n"),
+                    error->message);
+        g_error_free (error);
+    }
+    GObjectClass* class = G_OBJECT_GET_CLASS (settings);
+    guint i, n_properties;
+    GParamSpec** pspecs = g_object_class_list_properties (class, &n_properties);
+    for (i = 0; i < n_properties; i++)
+    {
+        GParamSpec* pspec = pspecs[i];
+        if (!(pspec->flags & G_PARAM_WRITABLE))
+            continue;
+        GType type = G_PARAM_SPEC_TYPE (pspec);
+        const gchar* property = g_param_spec_get_name (pspec);
+        if (type == G_TYPE_PARAM_STRING)
+        {
+            gchar* string = sokoke_key_file_get_string_default (key_file,
+                "settings", property,
+                G_PARAM_SPEC_STRING (pspec)->default_value, NULL);
+            g_object_set (settings, property, string, NULL);
+            g_free (string);
+        }
+        else if (type == G_TYPE_PARAM_INT)
+        {
+            guint integer = sokoke_key_file_get_integer_default (key_file,
+                "settings", property,
+                G_PARAM_SPEC_INT (pspec)->default_value, NULL);
+            g_object_set (settings, property, integer, NULL);
+        }
+        else if (type == G_TYPE_PARAM_BOOLEAN)
+        {
+            gboolean boolean = sokoke_key_file_get_boolean_default (key_file,
+                "settings", property,
+                G_PARAM_SPEC_BOOLEAN (pspec)->default_value, NULL);
+            g_object_set (settings, property, boolean, NULL);
+        }
+        else if (type == G_TYPE_PARAM_ENUM)
+        {
+            GEnumClass* enum_class = G_ENUM_CLASS (
+                g_type_class_ref (pspec->value_type));
+            GEnumValue* enum_value = g_enum_get_value (enum_class,
+                G_PARAM_SPEC_ENUM (pspec)->default_value);
+            gchar* string = sokoke_key_file_get_string_default (key_file,
+                "settings", property,
+                enum_value->value_name, NULL);
+            enum_value = g_enum_get_value_by_name (enum_class, string);
+            g_object_set (settings, property, enum_value->value, NULL);
+            g_free (string);
+            g_type_class_unref (enum_class);
+        }
+        else
+            g_warning ("Unhandled settings property '%s'", property);
+    }
+    return settings;
+}
+
+static gboolean
+settings_save_to_file (MidoriWebSettings* settings,
+                       const gchar*       filename,
+                       GError**           error)
+{
+    GKeyFile* key_file = g_key_file_new ();
+    GObjectClass* class = G_OBJECT_GET_CLASS (settings);
+    guint i, n_properties;
+    GParamSpec** pspecs = g_object_class_list_properties (class, &n_properties);
+    for (i = 0; i < n_properties; i++)
+    {
+        GParamSpec* pspec = pspecs[i];
+        GType type = G_PARAM_SPEC_TYPE (pspec);
+        const gchar* property = g_param_spec_get_name (pspec);
+        if (!(pspec->flags & G_PARAM_WRITABLE))
+        {
+            gchar* comment = g_strdup_printf ("# %s", property);
+            g_key_file_set_string (key_file, "settings", comment, "");
+            g_free (comment);
+            continue;
+        }
+        if (type == G_TYPE_PARAM_STRING)
+        {
+            const gchar* string;
+            g_object_get (settings, property, &string, NULL);
+            g_key_file_set_string (key_file, "settings", property,
+                                   string ? string : "");
+        }
+        else if (type == G_TYPE_PARAM_INT)
+        {
+            gint integer;
+            g_object_get (settings, property, &integer, NULL);
+            g_key_file_set_integer (key_file, "settings", property, integer);
+        }
+        else if (type == G_TYPE_PARAM_BOOLEAN)
+        {
+            gboolean boolean;
+            g_object_get (settings, property, &boolean, NULL);
+            g_key_file_set_boolean (key_file, "settings", property, boolean);
+        }
+        else if (type == G_TYPE_PARAM_ENUM)
+        {
+            GEnumClass* enum_class = G_ENUM_CLASS (
+                g_type_class_ref (pspec->value_type));
+            gint integer;
+            g_object_get (settings, property, &integer, NULL);
+            GEnumValue* enum_value = g_enum_get_value (enum_class, integer);
+            g_key_file_set_string (key_file, "settings", property,
+                                   enum_value->value_name);
+        }
+        else
+            g_warning ("Unhandled settings property '%s'", property);
+    }
+    gboolean saved = sokoke_key_file_save_to_file (key_file, filename, error);
+    g_key_file_free (key_file);
+    return saved;
+}
+
 int main(int argc, char** argv)
 {
     locale_init();
     g_set_application_name(_("midori"));
 
     // Parse cli options
-    gint repeats = 2;
     gboolean version = FALSE;
     GOptionEntry entries[] =
     {
-     { "version", 'v', 0, G_OPTION_ARG_NONE, &version, N_("Display program version"), NULL }
+     { "version", 'v', 0, G_OPTION_ARG_NONE, &version,
+       N_("Display program version"), NULL }
     };
 
     GError* error = NULL;
@@ -179,75 +303,69 @@ int main(int argc, char** argv)
     }
 
     // Load configuration files
-    GString* errorMessages = g_string_new(NULL);
-    // TODO: What about default config in a global config folder?
-    gchar* configPath = g_build_filename(g_get_user_config_dir(), PACKAGE_NAME, NULL);
-    g_mkdir_with_parents(configPath, 0755);
-    gchar* configFile = g_build_filename(configPath, "config", NULL);
+    GString* error_messages = g_string_new (NULL);
+    gchar* config_path = g_build_filename (g_get_user_config_dir (),
+                                           PACKAGE_NAME, NULL);
+    g_mkdir_with_parents (config_path, 0755);
+    gchar* config_file = g_build_filename (config_path, "config", NULL);
     error = NULL;
-    /*CConfig* */config = config_new();
-    if(!config_from_file(config, configFile, &error))
-    {
-        if(error->code != G_FILE_ERROR_NOENT)
-            g_string_append_printf(errorMessages
-             , _("The configuration couldn't be loaded. %s\n"), error->message);
-        g_error_free(error);
-    }
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "accels", NULL);
-    gtk_accel_map_load(configFile);
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "search", NULL);
+    MidoriWebSettings* settings = settings_new_from_file (config_file);
+    webSettings = settings;
+    katze_assign (config_file, g_build_filename (config_path, "accels", NULL));
+    gtk_accel_map_load (config_file);
+    katze_assign (config_file, g_build_filename (config_path, "search", NULL));
     error = NULL;
-    searchEngines = search_engines_new();
-    if(!search_engines_from_file(&searchEngines, configFile, &error))
+    searchEngines = search_engines_new ();
+    if (!search_engines_from_file (&searchEngines, config_file, &error))
     {
         // FIXME: We may have a "file empty" error, how do we recognize that?
-        /*if(error->code != G_FILE_ERROR_NOENT)
-            g_string_append_printf(errorMessages
-             , _("The search engines couldn't be loaded. %s\n"), error->message);*/
-        g_error_free(error);
+        /*if (error->code != G_FILE_ERROR_NOENT)
+            g_string_append_printf (error_messages,
+                _("The search engines couldn't be loaded. %s\n"),
+                error->message);*/
+        g_error_free (error);
     }
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
+    katze_assign (config_file, g_build_filename (config_path, "bookmarks.xbel",
+                                                 NULL));
     bookmarks = katze_xbel_folder_new();
     error = NULL;
-    if(!katze_xbel_folder_from_file(bookmarks, configFile, &error))
+    if (!katze_xbel_folder_from_file (bookmarks, config_file, &error))
     {
-        if(error->code != G_FILE_ERROR_NOENT)
-            g_string_append_printf(errorMessages
-             , _("The bookmarks couldn't be loaded. %s\n"), error->message);
-        g_error_free(error);
+        if (error->code != G_FILE_ERROR_NOENT)
+            g_string_append_printf (error_messages,
+                _("The bookmarks couldn't be loaded. %s\n"), error->message);
+        g_error_free (error);
     }
-    g_free(configFile);
+    g_free (config_file);
     KatzeXbelItem* _session = katze_xbel_folder_new();
+    config = config_new ();
     if(config->startup == CONFIG_STARTUP_SESSION)
     {
-        configFile = g_build_filename(configPath, "session.xbel", NULL);
+        config_file = g_build_filename (config_path, "session.xbel", NULL);
         error = NULL;
-        if(!katze_xbel_folder_from_file(_session, configFile, &error))
+        if (!katze_xbel_folder_from_file (_session, config_file, &error))
         {
-            if(error->code != G_FILE_ERROR_NOENT)
-                g_string_append_printf(errorMessages
-                 , _("The session couldn't be loaded. %s\n"), error->message);
-            g_error_free(error);
+            if (error->code != G_FILE_ERROR_NOENT)
+                g_string_append_printf (error_messages,
+                    _("The session couldn't be loaded. %s\n"), error->message);
+            g_error_free (error);
         }
-        g_free(configFile);
+        g_free (config_file);
     }
-    configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
-    KatzeXbelItem* xbel_trash = katze_xbel_folder_new();
+    config_file = g_build_filename (config_path, "tabtrash.xbel", NULL);
+    KatzeXbelItem* xbel_trash = katze_xbel_folder_new ();
     error = NULL;
-    if(!katze_xbel_folder_from_file(xbel_trash, configFile, &error))
+    if (!katze_xbel_folder_from_file (xbel_trash, config_file, &error))
     {
-        if(error->code != G_FILE_ERROR_NOENT)
-            g_string_append_printf(errorMessages
-             , _("The trash couldn't be loaded. %s\n"), error->message);
-        g_error_free(error);
+        if (error->code != G_FILE_ERROR_NOENT)
+            g_string_append_printf(error_messages,
+                _("The trash couldn't be loaded. %s\n"), error->message);
+        g_error_free (error);
     }
-    g_free(configFile);
+    g_free (config_file);
 
     // In case of errors
-    if(errorMessages->len)
+    if (error_messages->len)
     {
         GtkWidget* dialog = gtk_message_dialog_new(NULL
          , 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE
@@ -257,7 +375,7 @@ int main(int argc, char** argv)
         // FIXME: Use custom program icon
         gtk_window_set_icon_name(GTK_WINDOW(dialog), "web-browser");
         gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog)
-         , "%s", errorMessages->str);
+         , "%s", error_messages->str);
         gtk_dialog_add_buttons(GTK_DIALOG(dialog)
          , GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL
          , "_Ignore", GTK_RESPONSE_ACCEPT
@@ -269,14 +387,14 @@ int main(int argc, char** argv)
             katze_xbel_item_unref(bookmarks);
             katze_xbel_item_unref(_session);
             katze_xbel_item_unref(xbel_trash);
-            g_string_free(errorMessages, TRUE);
+            g_string_free(error_messages, TRUE);
             return 0;
         }
         gtk_widget_destroy(dialog);
         /* FIXME: Since we will overwrite files that could not be loaded
                   , would we want to make backups? */
     }
-    g_string_free(errorMessages, TRUE);
+    g_string_free (error_messages, TRUE);
 
     // TODO: Handle any number of separate uris from argv
     // Open as many tabs as we have uris, seperated by pipes
@@ -301,36 +419,15 @@ int main(int argc, char** argv)
             katze_xbel_bookmark_set_href(item, config->homepage);
         katze_xbel_folder_prepend_item(_session, item);
     }
-    g_free(configPath);
+    g_free (config_path);
 
     stock_items_init();
 
-    MidoriWebSettings* settings;
-    settings = g_object_new (MIDORI_TYPE_WEB_SETTINGS,
-                             "default-font-family", config->defaultFontFamily,
-                             "default-font-size", config->defaultFontSize,
-                             "minimum-font-size", config->minimumFontSize,
-                             "default-encoding", config->defaultEncoding,
-                             "auto-load-images", config->autoLoadImages,
-                             "auto-shrink-images", config->autoShrinkImages,
-                             "print-backgrounds", config->printBackgrounds,
-                             "resizable-text-areas", config->resizableTextAreas,
-                             "user-stylesheet-uri",
-                             config->userStylesheet ?
-                             config->userStylesheetUri : NULL,
-                             "enable-scripts", config->enableScripts,
-                             "enable-plugins", config->enablePlugins,
-                             "tab-label-size", config->tabSize,
-                             "close-buttons-on-tabs", config->tabClose,
-                             "middle-click-opens-selection", config->middleClickGoto,
-                             NULL);
-    webSettings = settings;
-
     MidoriTrash* trash = g_object_new (MIDORI_TYPE_TRASH,
                                        "limit", 10,
                                        NULL);
-    guint i;
     guint n = katze_xbel_folder_get_n_items (xbel_trash);
+    guint i;
     for (i = 0; i < n; i++)
     {
         KatzeXbelItem* item = katze_xbel_folder_get_nth_item (xbel_trash, i);
@@ -367,59 +464,58 @@ int main(int argc, char** argv)
     g_object_unref (accel_group);
 
     // Save configuration files
-    configPath = g_build_filename(g_get_user_config_dir(), PACKAGE_NAME, NULL);
-    g_mkdir_with_parents(configPath, 0755);
-    configFile = g_build_filename(configPath, "search", NULL);
+    config_path = g_build_filename (g_get_user_config_dir(), PACKAGE_NAME,
+                                    NULL);
+    g_mkdir_with_parents (config_path, 0755);
+    config_file = g_build_filename (config_path, "search", NULL);
     error = NULL;
-    if(!search_engines_to_file(searchEngines, configFile, &error))
+    if (!search_engines_to_file (searchEngines, config_file, &error))
     {
         g_warning("The search engines couldn't be saved. %s", error->message);
         g_error_free(error);
     }
     search_engines_free(searchEngines);
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "bookmarks.xbel", NULL);
+    g_free (config_file);
+    config_file = g_build_filename (config_path, "bookmarks.xbel", NULL);
     error = NULL;
-    if(!katze_xbel_folder_to_file(bookmarks, configFile, &error))
+    if (!katze_xbel_folder_to_file (bookmarks, config_file, &error))
     {
         g_warning("The bookmarks couldn't be saved. %s", error->message);
         g_error_free(error);
     }
     katze_xbel_item_unref(bookmarks);
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "tabtrash.xbel", NULL);
+    g_free (config_file);
+    config_file = g_build_filename (config_path, "tabtrash.xbel", NULL);
     error = NULL;
-    if (!katze_xbel_folder_to_file (xbel_trash, configFile, &error))
+    if (!katze_xbel_folder_to_file (xbel_trash, config_file, &error))
     {
         g_warning ("The trash couldn't be saved. %s", error->message);
         g_error_free (error);
     }
     katze_xbel_item_unref (xbel_trash);
-    g_free (configFile);
     if(config->startup == CONFIG_STARTUP_SESSION)
     {
-        configFile = g_build_filename(configPath, "session.xbel", NULL);
+        katze_assign (config_file, g_build_filename (config_path,
+                                                     "session.xbel", NULL));
         error = NULL;
-        if(!katze_xbel_folder_to_file(session, configFile, &error))
+        if (!katze_xbel_folder_to_file (session, config_file, &error))
         {
-            g_warning("The session couldn't be saved. %s", error->message);
-            g_error_free(error);
+            g_warning ("The session couldn't be saved. %s", error->message);
+            g_error_free (error);
         }
-        g_free(configFile);
     }
-    katze_xbel_item_unref(session);
-    configFile = g_build_filename(configPath, "config", NULL);
+    katze_xbel_item_unref (session);
+    katze_assign (config_file, g_build_filename (config_path, "config", NULL));
     error = NULL;
-    if(!config_to_file(config, configFile, &error))
+    if (!settings_save_to_file (settings, config_file, &error))
     {
-        g_warning("The configuration couldn't be saved. %s", error->message);
-        g_error_free(error);
+        g_warning ("The configuration couldn't be saved. %s", error->message);
+        g_error_free (error);
     }
-    config_free(config);
-    g_free(configFile);
-    configFile = g_build_filename(configPath, "accels", NULL);
-    gtk_accel_map_save(configFile);
-    g_free(configFile);
-    g_free(configPath);
+    config_free (config);
+    katze_assign (config_file, g_build_filename (config_path, "accels", NULL));
+    gtk_accel_map_save (config_file);
+    g_free (config_file);
+    g_free (config_path);
     return 0;
 }
index 62f98b5b22363ec3bd0732d236f02f6763326cb2..57fac4e88a42402cbb5470957cb197f564c46beb 100644 (file)
@@ -867,7 +867,10 @@ _action_preferences_activate (GtkAction*     action,
         gtk_window_present (GTK_WINDOW (dialog));
     else
     {
-        dialog = prefs_preferences_dialog_new (browser);
+        MidoriBrowserPrivate* priv = browser->priv;
+
+        dialog = prefs_preferences_dialog_new (GTK_WINDOW (browser),
+                                               priv->settings);
         gtk_widget_show (dialog);
     }
 }
index 26573fa219915f951a4cf0c92597f9f1a9e25da3..efc2d312935e819f74ebe9d17fc8e3f1fbce9641 100644 (file)
@@ -46,21 +46,21 @@ static void
 midori_trash_finalize (GObject* object);
 
 static void
-midori_trash_set_property (GObject* object,
-                           guint prop_id,
+midori_trash_set_property (GObject*      object,
+                           guint         prop_id,
                            const GValue* value,
-                           GParamSpec* pspec);
+                           GParamSpec*   pspec);
 
 static void
-midori_trash_get_property (GObject* object,
-                           guint prop_id,
-                           GValue* value,
+midori_trash_get_property (GObject*    object,
+                           guint       prop_id,
+                           GValue*     value,
                            GParamSpec* pspec);
 
 static void
 midori_trash_class_init (MidoriTrashClass* class)
 {
-    signals[INSERTED] = g_signal_new(
+    signals[INSERTED] = g_signal_new (
         "inserted",
         G_TYPE_FROM_CLASS(class),
         (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
@@ -71,7 +71,7 @@ midori_trash_class_init (MidoriTrashClass* class)
         G_TYPE_NONE, 1,
         G_TYPE_UINT);
 
-    signals[REMOVED] = g_signal_new(
+    signals[REMOVED] = g_signal_new (
         "removed",
         G_TYPE_FROM_CLASS(class),
         (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
@@ -288,8 +288,8 @@ midori_trash_prepend_xbel_item (MidoriTrash*   trash,
  * Nothing happens if the function fails.
  **/
 void
-midori_trash_remove_nth_item (MidoriTrash*   trash,
-                              guint          n)
+midori_trash_remove_nth_item (MidoriTrash* trash,
+                              guint        n)
 {
     g_return_if_fail (MIDORI_IS_TRASH (trash));
 
@@ -310,7 +310,7 @@ midori_trash_remove_nth_item (MidoriTrash*   trash,
  * Deletes all items currently contained in @trash.
  **/
 void
-midori_trash_empty (MidoriTrash*   trash)
+midori_trash_empty (MidoriTrash* trash)
 {
     g_return_if_fail (MIDORI_IS_TRASH (trash));
 
index 9466d8d2ab67489fe98c9de65ee5089ca27e82c3..77f319c3aec512489eff3c1da6a96a473912ad60 100644 (file)
@@ -14,7 +14,7 @@
 #include "global.h"
 #include "sokoke.h"
 
-#include <webkit/webkitwebframe.h>
+#include <webkit/webkit.h>
 #include <string.h>
 
 // This is unstable API, so we need to declare it
@@ -38,7 +38,7 @@ struct _MidoriWebViewPrivate
 
     gint tab_label_size;
     gboolean close_button;
-    gboolean middle_click_goto;
+    gboolean middle_click_opens_selection;
     MidoriWebSettings* settings;
 
     GtkWidget* proxy_menu_item;
@@ -419,7 +419,7 @@ gtk_widget_button_press_event_after (MidoriWebView*  web_view,
 {
     MidoriWebViewPrivate* priv = web_view->priv;
 
-    if (event->button == 2 && priv->middle_click_goto)
+    if (event->button == 2 && priv->middle_click_opens_selection)
     {
         GdkModifierType state = (GdkModifierType) event->state;
         GtkClipboard* clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
@@ -544,7 +544,7 @@ _midori_web_view_update_settings (MidoriWebView* web_view)
     g_object_get (G_OBJECT (priv->settings),
                   "tab-label-size", &priv->tab_label_size,
                   "close-buttons-on-tabs", &priv->close_button,
-                  "middle-click-opens-selection", &priv->middle_click_goto,
+                  "middle-click-opens-selection", &priv->middle_click_opens_selection,
                   NULL);
 }
 
@@ -572,7 +572,7 @@ midori_web_view_settings_notify (MidoriWebSettings* web_settings,
             sokoke_widget_set_visible (priv->tab_close, priv->close_button);
     }
     else if (name == g_intern_string ("middle-click-opens-selection"))
-        priv->middle_click_goto = g_value_get_boolean (&value);
+        priv->middle_click_opens_selection = g_value_get_boolean (&value);
     else if (!g_object_class_find_property (G_OBJECT_GET_CLASS (web_settings),
                                             name))
         g_warning("Unexpected setting '%s'", name);
@@ -591,7 +591,7 @@ midori_web_view_init (MidoriWebView* web_view)
     priv->settings = midori_web_settings_new ();
     _midori_web_view_update_settings (web_view);
     g_signal_connect (priv->settings, "notify",
-                      G_CALLBACK(midori_web_view_settings_notify), web_view);
+                      G_CALLBACK (midori_web_view_settings_notify), web_view);
 
     WebKitWebFrame* web_frame;
     web_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view));
index 1dea73edbbc8fa9e65eca1c5a866fd8aeffcfaee..ffdee1fe1a52a503a805996aaf039009bbce7c2d 100644 (file)
 #include "prefs.h"
 
 #include "helpers.h"
-#include "global.h"
 #include "sokoke.h"
 
+#include <glib/gi18n.h>
 #include <stdlib.h>
 #include <string.h>
 
-static gboolean on_prefs_homepage_focus_out(GtkWidget* widget
- , GdkEventFocus event, CPrefs* prefs)
+static void
+clear_button_clicked_cb (GtkWidget* button, GtkWidget* file_chooser)
 {
-    katze_assign(config->homepage, g_strdup(gtk_entry_get_text(GTK_ENTRY(widget))));
-    return FALSE;
+    gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (file_chooser), "");
+    // Emit "file-set" manually for Gtk doesn't emit it otherwise
+    g_signal_emit_by_name (file_chooser, "file-set");
 }
 
-static void on_prefs_loadonstartup_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    config->startup = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
-}
-
-static void on_prefs_defaultFont_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    const gchar* font = gtk_font_button_get_font_name(GTK_FONT_BUTTON(widget));
-    gchar** components = g_strsplit(font, " ", 0);
-    guint i, n = g_strv_length(components) - 1;
-    GString* fontName = g_string_new(NULL);
-    for(i = 0; i < n; i++)
-        g_string_append_printf(fontName, "%s ", components[i]);
-    katze_assign(config->defaultFontFamily, g_string_free(fontName, FALSE));
-    config->defaultFontSize = atoi(components[n]);
-    g_strfreev(components);
-    g_object_set(webSettings, "default-font-family", config->defaultFontFamily
-     , "default-font-size", config->defaultFontSize, NULL);
-}
-
-static void on_prefs_minimumFontSize_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    config->minimumFontSize = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
-    g_object_set(webSettings, "minimum-font-size", config->minimumFontSize, NULL);
-}
-
-static void on_prefs_defaultEncoding_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    gchar* encoding;
-    switch(gtk_combo_box_get_active(GTK_COMBO_BOX(widget)))
-    {
-    case 0:
-        encoding = g_strdup("BIG5");
-        break;
-    case 1:
-        encoding = g_strdup("SHIFT_JIS");
-        break;
-    case 2:
-        encoding = g_strdup("KOI8-R");
-        break;
-    case 3:
-        encoding = g_strdup("UTF-8");
-        break;
-    case 4:
-        encoding = g_strdup("ISO-8859-1");
-        break;
-    default:
-        encoding = g_strdup("UTF-8");
-        g_warning("Invalid default encoding");
-    }
-    katze_assign(config->defaultEncoding, encoding);
-    g_object_set(webSettings, "default-encoding", config->defaultEncoding, NULL);
-}
-
-static void on_prefs_newpages_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    config->newPages = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
-}
-
-void on_prefs_middleClickGoto_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->middleClickGoto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-}
-
-void on_prefs_openTabsInTheBackground_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->openTabsInTheBackground = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-}
-
-static void on_prefs_openPopupsInTabs_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->openPopupsInTabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-}
-
-static void on_prefs_loadImagesAutomatically_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->autoLoadImages = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "auto-load-images", config->autoLoadImages, NULL);
-}
-
-static void on_prefs_shrinkImagesToFit_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->autoShrinkImages = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "auto-shrink-images", config->autoShrinkImages, NULL);
-}
-
-static void on_prefs_printBackgrounds_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->printBackgrounds = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "print-backgrounds", config->printBackgrounds, NULL);
-}
-
-static void on_prefs_resizableTextAreas_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->resizableTextAreas = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "resizable-text-areas", config->resizableTextAreas, NULL);
-}
-
-static void on_prefs_enableJavaScript_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->enableScripts = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "enable-scripts", config->enableScripts, NULL);
-}
-
-static void on_prefs_enablePlugins_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->enablePlugins = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "enable-plugins", config->enablePlugins, NULL);
-}
-
-static void on_prefs_userStylesheet_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->userStylesheet = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    gtk_widget_set_sensitive(prefs->userStylesheetUri, config->userStylesheet);
-    const gchar* uri = config->userStylesheet ? config->userStylesheetUri : "";
-    g_object_set(webSettings, "user-stylesheet-uri", uri, NULL);
-}
-
-static void on_prefs_userStylesheetUri_file_set(GtkWidget* widget, CPrefs* prefs)
-{
-    katze_assign(config->userStylesheetUri, g_strdup(gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(widget))));
-    g_object_set(webSettings, "user-stylesheet-uri", config->userStylesheetUri, NULL);
-}
-
-static void on_prefs_toolbarstyle_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    config->toolbarStyle = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
-    /*gtk_toolbar_set_style(GTK_TOOLBAR(prefs->browser->navibar)
-     , config_to_toolbarstyle(config->toolbarStyle));*/
-}
-
-static void on_prefs_toolbarSmall_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->toolbarSmall = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    /*gtk_toolbar_set_icon_size(GTK_TOOLBAR(prefs->browser->navibar)
-     , config_to_toolbariconsize(config->toolbarSmall));*/
-}
-
-static void on_prefs_tabClose_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->tabClose = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    g_object_set(webSettings, "close-button", config->tabClose, NULL);
-}
-
-static void on_prefs_tabSize_changed(GtkWidget* widget, CPrefs* prefs)
-{
-    config->tabSize = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
-    g_object_set(webSettings, "tab-label-size", config->tabSize, NULL);
-}
-
-static void on_prefs_toolbarWebSearch_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->toolbarWebSearch = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    //sokoke_widget_set_visible(prefs->browser->webSearch, config->toolbarWebSearch);
-}
-
-static void on_prefs_toolbarNewTab_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->toolbarNewTab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    //sokoke_widget_set_visible(prefs->browser->newTab, config->toolbarNewTab);
-}
-
-static void on_prefs_toolbarClosedTabs_toggled(GtkWidget* widget, CPrefs* prefs)
-{
-    config->toolbarClosedTabs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-    //sokoke_widget_set_visible(prefs->browser->closedTabs, config->toolbarClosedTabs);
-}
-
-static gboolean on_prefs_locationsearch_focus_out(GtkWidget* widget
- , GdkEventFocus event, CPrefs* prefs)
-{
-    katze_assign(config->locationSearch, g_strdup(gtk_entry_get_text(GTK_ENTRY(widget))));
-    return FALSE;
-}
-
-static void on_prefs_protocols_render_icon(GtkTreeViewColumn* column
- , GtkCellRenderer* renderer, GtkTreeModel* model, GtkTreeIter* iter, CPrefs* prefs)
-{
-    gchar* command;
-    gtk_tree_model_get(model, iter, PROTOCOLS_COL_COMMAND, &command, -1);
-
-    // TODO: Would it be better, to not do this on every redraw?
-    // Determine the actual binary to be able to display an icon
-    gchar* binary = NULL;
-    if(command)
-        binary = strtok(command, " ");
-    if(binary)
-    {
-        gchar* path;
-        if((path = g_find_program_in_path(binary)))
-        {
-            GdkScreen* screen = gtk_widget_get_screen(prefs->treeview);
-            if(!screen)
-                screen = gdk_screen_get_default();
-            GtkIconTheme* icon_theme = gtk_icon_theme_get_for_screen(screen);
-            if(g_path_is_absolute(binary))
-            {
-                g_free(path); path = g_path_get_basename(binary);
-            }
-            // TODO: Is it good to just display nothing if there is no icon?
-            if(!gtk_icon_theme_has_icon(icon_theme, binary))
-                binary = NULL;
-            #if GTK_CHECK_VERSION(2, 10, 0)
-            g_object_set(renderer, "icon-name", binary, NULL);
-            #else
-            GdkPixbuf* icon = binary != NULL
-             ? gtk_icon_theme_load_icon(gtk_icon_theme_get_default()
-             , binary, GTK_ICON_SIZE_MENU, 0, NULL) : NULL;
-            g_object_set(renderer, "pixbuf", icon, NULL);
-            if(icon)
-                g_object_unref(icon);
-            #endif
-            g_free(path);
-        }
-        else
-        {
-            #if GTK_CHECK_VERSION(2, 10, 0)
-            g_object_set(renderer, "icon-name", NULL, NULL);
-            #endif
-            g_object_set(renderer, "stock-id", GTK_STOCK_DIALOG_ERROR, NULL);
-        }
-    }
-    else
-    {
-        // We need to reset the icon
-        #if GTK_CHECK_VERSION(2, 10, 0)
-        g_object_set(renderer, "icon-name", NULL, NULL);
-        #else
-        g_object_set(renderer, "stock-id", NULL, NULL);
-        #endif
-    }
-    g_free(command);
-}
-
-GtkWidget* prefs_preferences_dialog_new(MidoriBrowser* browser)
+GtkWidget* prefs_preferences_dialog_new (GtkWindow* window,
+                                         MidoriWebSettings* settings)
 {
     gchar* dialogTitle = g_strdup_printf(_("%s Preferences"), g_get_application_name());
     GtkWidget* dialog = gtk_dialog_new_with_buttons(dialogTitle
-        , GTK_WINDOW(browser)
+        , window
         , GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR
         , GTK_STOCK_HELP, GTK_RESPONSE_HELP
         , GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE
@@ -274,7 +42,6 @@ GtkWidget* prefs_preferences_dialog_new(MidoriBrowser* browser)
     g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog);
 
     CPrefs* prefs = g_new0(CPrefs, 1);
-    prefs->browser = browser;
     g_signal_connect(dialog, "response", G_CALLBACK(g_free), prefs);
 
     // TODO: Do we want tooltips for explainations or can we omit that?
@@ -282,17 +49,16 @@ GtkWidget* prefs_preferences_dialog_new(MidoriBrowser* browser)
     // TODO: Take multiple windows into account when applying changes
     GtkWidget* xfce_heading;
     if((xfce_heading = sokoke_xfce_header_new(
-     gtk_window_get_icon_name(GTK_WINDOW(browser)), dialogTitle)))
+     gtk_window_get_icon_name(window), dialogTitle)))
         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox)
          , xfce_heading, FALSE, FALSE, 0);
     g_free(dialogTitle);
     GtkWidget* notebook = gtk_notebook_new();
     gtk_container_set_border_width(GTK_CONTAINER(notebook), 6);
     GtkSizeGroup* sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-    GtkSizeGroup* sizegroup2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
     GtkWidget* page; GtkWidget* frame; GtkWidget* table; GtkWidget* align;
-    GtkWidget* button; GtkWidget* checkbutton; GtkWidget* colorbutton;
-    GtkWidget* combobox; GtkWidget* entry; GtkWidget* hbox; GtkWidget* spinbutton;
+    GtkWidget* label; GtkWidget* button;
+    GtkWidget* entry; GtkWidget* hbox;
     #define PAGE_NEW(__label) page = gtk_vbox_new(FALSE, 0);\
      gtk_container_set_border_width(GTK_CONTAINER(page), 5);\
      gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, gtk_label_new(__label))
@@ -315,342 +81,166 @@ GtkWidget* prefs_preferences_dialog_new(MidoriBrowser* browser)
      gtk_container_add(GTK_CONTAINER(align), __widget);\
      gtk_size_group_add_widget(sizegroup, align);\
      WIDGET_ADD(align, __left, __right, __top, __bottom)
-    #define SEMI_INDENTED_ADD(__widget, __left, __right, __top, __bottom)\
-     align = gtk_alignment_new(0, 0.5, 0, 0);\
-     gtk_container_add(GTK_CONTAINER(align), __widget);\
-     gtk_size_group_add_widget(sizegroup2, align);\
-     WIDGET_ADD(align, __left, __right, __top, __bottom)
     #define SPANNED_ADD(__widget, __left, __right, __top, __bottom)\
      align = gtk_alignment_new(0, 0.5, 0, 0);\
      gtk_container_add(GTK_CONTAINER(align), __widget);\
      FILLED_ADD(align, __left, __right, __top, __bottom)
     // Page "General"
-    PAGE_NEW(_("General"));
-    FRAME_NEW(_("Startup"));
-    TABLE_NEW(2, 2);
-    INDENTED_ADD(gtk_label_new(_("Load on startup")), 0, 1, 0, 1);
-    combobox = gtk_combo_box_new_text();
-    sokoke_combo_box_add_strings(GTK_COMBO_BOX(combobox)
-     , _("Blank page"), _("Homepage"), _("Last open pages"), NULL);
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), config->startup);
-    g_signal_connect(combobox, "changed"
-     , G_CALLBACK(on_prefs_loadonstartup_changed), prefs);
-    FILLED_ADD(combobox, 1, 2, 0, 1);
-    INDENTED_ADD(gtk_label_new(_("Homepage")), 0, 1, 1, 2);
-    entry = gtk_entry_new();
-    gtk_entry_set_text(GTK_ENTRY(entry), config->homepage);
-    g_signal_connect(entry, "focus-out-event"
-    , G_CALLBACK(on_prefs_homepage_focus_out), prefs);
-    FILLED_ADD(entry, 1, 2, 1, 2);
+    PAGE_NEW (_("General"));
+    FRAME_NEW (_("Startup"));
+    TABLE_NEW (2, 2);
+    label = katze_property_label (settings, "load-on-startup");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "load-on-startup", NULL);
+    FILLED_ADD (button, 1, 2, 0, 1);
+    label = katze_property_label (settings, "homepage");
+    INDENTED_ADD (label, 0, 1, 1, 2);
+    entry = katze_property_proxy (settings, "homepage", NULL);
+    FILLED_ADD (entry, 1, 2, 1, 2);
     // TODO: We need something like "use current website"
-    FRAME_NEW(_("Transfers"));
-    TABLE_NEW(1, 2);
-    INDENTED_ADD(gtk_label_new(_("Download folder")), 0, 1, 0, 1);
-    GtkWidget* filebutton = gtk_file_chooser_button_new(
-     _("Choose downloaded files folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
-    // FIXME: The default should probably be ~/Desktop
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filebutton)
-     , g_get_home_dir()); //...
-    gtk_widget_set_sensitive(filebutton, FALSE); //...
-    FILLED_ADD(filebutton, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic
-     (_("Show a notification window for finished transfers"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 1, 2);
-    FRAME_NEW(_("Languages"));
-    TABLE_NEW(1, 2);
-    INDENTED_ADD(gtk_label_new(_("Preferred languages")), 0, 1, 0, 1);
-    entry = gtk_entry_new();
-    // TODO: Make sth like get_browser_languages_default filtering encodings and C out
-    // TODO: Provide a real ui with real language names (iso-codes)
-    const gchar* const* sLanguages = g_get_language_names();
-    gchar* sLanguagesPreferred = g_strjoinv(",", (gchar**)sLanguages);
-    gtk_entry_set_text(GTK_ENTRY(entry), sLanguagesPreferred/*config->sLanguagesPreferred*/);
-    g_free(sLanguagesPreferred);
-    gtk_widget_set_sensitive(entry, FALSE); //...
-    FILLED_ADD(entry, 1, 2, 0, 1);
+    FRAME_NEW (_("Transfers"));
+    TABLE_NEW (1, 2);
+    label = katze_property_label (settings, "download-folder");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "download-folder", "folder");
+    FILLED_ADD (button, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "show-download-notification", "blurb");
+    SPANNED_ADD (button, 0, 2, 1, 2);
 
     // Page "Appearance"
-    PAGE_NEW(_("Appearance"));
-    FRAME_NEW(_("Font settings"));
-    TABLE_NEW(5, 2);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("Default _font")), 0, 1, 0, 1);
-    gchar* defaultFont = g_strdup_printf("%s %d"
-     , config->defaultFontFamily, config->defaultFontSize);
-    button = gtk_font_button_new_with_font(defaultFont);
-    g_free(defaultFont);
-    g_signal_connect(button, "font-set", G_CALLBACK(on_prefs_defaultFont_changed), prefs);
-    FILLED_ADD(button, 1, 2, 0, 1);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("_Minimum font size")), 0, 1, 1, 2);
-    hbox = gtk_hbox_new(FALSE, 4);
-    spinbutton = gtk_spin_button_new_with_range(1, G_MAXINT, 1);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), config->minimumFontSize);
-    g_signal_connect(spinbutton, "value-changed"
-     , G_CALLBACK(on_prefs_minimumFontSize_changed), prefs);
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    button = gtk_button_new_with_mnemonic(_("_Advanced"));
-    gtk_widget_set_sensitive(button, FALSE); //...
-    gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 4);
-    FILLED_ADD(hbox, 1, 2, 1, 2);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("Default _encoding")), 0, 1, 2, 3);
-    combobox = gtk_combo_box_new_text();
-    sokoke_combo_box_add_strings(GTK_COMBO_BOX(combobox)
-     , _("Chinese (BIG5)"), _("Japanese (SHIFT_JIS)"), _("Russian (KOI8-R)")
-     , _("Unicode (UTF-8)"), _("Western (ISO-8859-1)"), NULL);
-    if(!strcmp(config->defaultEncoding, "BIG5"))
-        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
-    else if(!strcmp(config->defaultEncoding, "SHIFT_JIS"))
-        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 1);
-    else if(!strcmp(config->defaultEncoding, "KOI8-R"))
-        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 2);
-    else if(!strcmp(config->defaultEncoding, "UTF-8"))
-        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 3);
-    else if(!strcmp(config->defaultEncoding, "ISO-8859-1"))
-        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 4);
-    // FIXME: Provide a 'Custom' item
-    g_signal_connect(combobox, "changed"
-     , G_CALLBACK(on_prefs_defaultEncoding_changed), prefs);
-    FILLED_ADD(combobox, 1, 2, 2, 3);
-    button = gtk_button_new_with_label(_("Advanced settings"));
-    gtk_widget_set_sensitive(button, FALSE); //...
-    WIDGET_ADD(button, 1, 2, 2, 3);
-    FRAME_NEW(_("Default colors"));
-    TABLE_NEW(2, 4);
-    SEMI_INDENTED_ADD(gtk_label_new(_("Text color")), 0, 1, 0, 1);
-    colorbutton = gtk_color_button_new();
-    gtk_widget_set_sensitive(colorbutton, FALSE); //...
-    WIDGET_ADD(colorbutton, 1, 2, 0, 1);
-    SEMI_INDENTED_ADD(gtk_label_new(_("Background color")), 2, 3, 0, 1);
-    colorbutton = gtk_color_button_new();
-    gtk_widget_set_sensitive(colorbutton, FALSE); //...
-    WIDGET_ADD(colorbutton, 3, 4, 0, 1);
-    SEMI_INDENTED_ADD(gtk_label_new(_("Link color")), 0, 1, 1, 2);
-    colorbutton = gtk_color_button_new();
-    gtk_widget_set_sensitive(colorbutton, FALSE); //...
-    WIDGET_ADD(colorbutton, 1, 2, 1, 2);
-    SEMI_INDENTED_ADD(gtk_label_new(_("Visited link color")), 2, 3, 1, 2);
-    colorbutton = gtk_color_button_new();
-    gtk_widget_set_sensitive(colorbutton, FALSE); //...
-    WIDGET_ADD(colorbutton, 3, 4, 1, 2);
+    PAGE_NEW (_("Appearance"));
+    FRAME_NEW (_("Font settings"));
+    TABLE_NEW (5, 2);
+    label = katze_property_label (settings, "default-font-family");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    hbox = gtk_hbox_new (FALSE, 4);
+    button = katze_property_proxy (settings, "default-font-family", NULL);
+    gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+    entry = katze_property_proxy (settings, "default-font-size", NULL);
+    gtk_box_pack_end (GTK_BOX (hbox), entry, FALSE, FALSE, 4);
+    FILLED_ADD (hbox, 1, 2, 0, 1);
+    label = katze_property_label (settings, "minimum-font-size");
+    INDENTED_ADD (label, 0, 1, 1, 2);
+    hbox = gtk_hbox_new (FALSE, 4);
+    entry = katze_property_proxy (settings, "minimum-font-size", NULL);
+    INDENTED_ADD (entry, 1, 2, 1, 2);
+    label = katze_property_label (settings, "preferred-encoding");
+    INDENTED_ADD (label, 0, 1, 2, 3);
+    button = katze_property_proxy (settings, "preferred-encoding", NULL);
+    FILLED_ADD (button, 1, 2, 2, 3);
 
     // Page "Behavior"
-    PAGE_NEW(_("Behavior"));
-    FRAME_NEW(_("Browsing"));
-    TABLE_NEW(3, 2);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("Open _new pages in")), 0, 1, 0, 1);
-    combobox = gtk_combo_box_new_text();
-    sokoke_combo_box_add_strings(GTK_COMBO_BOX(combobox)
-     , _("New tab"), _("New window"), _("Current tab"), NULL);
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), config->newPages);
-    g_signal_connect(combobox, "changed", G_CALLBACK(on_prefs_newpages_changed), prefs);
-    gtk_widget_set_sensitive(combobox, FALSE); //...
-    FILLED_ADD(combobox, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("_Middle click opens selection"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->middleClickGoto);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_middleClickGoto_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Open tabs in the _background"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->openTabsInTheBackground);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_openTabsInTheBackground_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Open popups in _tabs"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->openPopupsInTabs);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_openPopupsInTabs_toggled), prefs);
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 2, 3);
-    FRAME_NEW(_("Features"));
-    TABLE_NEW(4, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Load _images"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->autoLoadImages);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_loadImagesAutomatically_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("_Shrink images to fit"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->autoShrinkImages);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_shrinkImagesToFit_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Print _backgrounds"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->printBackgrounds);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_printBackgrounds_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("_Resizable textareas"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->resizableTextAreas);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_resizableTextAreas_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Enable _scripts"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->enableScripts);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_enableJavaScript_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 2, 3);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Enable _plugins"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->enablePlugins);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_enablePlugins_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 2, 3);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("_User Stylesheet"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->userStylesheet);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_userStylesheet_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 3, 4);
-    filebutton = gtk_file_chooser_button_new(
-     _("Choose user stylesheet"), GTK_FILE_CHOOSER_ACTION_OPEN);
-    prefs->userStylesheetUri = filebutton;
-    gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(filebutton), config->userStylesheetUri);
-    g_signal_connect(filebutton, "file-set"
-     , G_CALLBACK(on_prefs_userStylesheetUri_file_set), prefs);
-    gtk_widget_set_sensitive(filebutton, config->userStylesheet);
-    FILLED_ADD(filebutton, 1, 2, 3, 4);
+    PAGE_NEW (_("Behavior"));
+    FRAME_NEW (_("Features"));
+    TABLE_NEW (5, 2);
+    button = katze_property_proxy (settings, "auto-load-images", NULL);
+    INDENTED_ADD (button, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "auto-shrink-images", NULL);
+    SPANNED_ADD (button, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "print-backgrounds", NULL);
+    INDENTED_ADD (button, 0, 1, 1, 2);
+    button = katze_property_proxy (settings, "resizable-text-areas", NULL);
+    SPANNED_ADD (button, 1, 2, 1, 2);
+    button = katze_property_proxy (settings, "enable-scripts", NULL);
+    INDENTED_ADD (button, 0, 1, 2, 3);
+    button = katze_property_proxy (settings, "enable-plugins", NULL);
+    SPANNED_ADD(button, 1, 2, 2, 3);
+    label = katze_property_label (settings, "user-stylesheet-uri");
+    INDENTED_ADD (label, 0, 1, 3, 4);
+    hbox = gtk_hbox_new (FALSE, 4);
+    entry = katze_property_proxy (settings, "user-stylesheet-uri", "uri");
+    gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+    button = gtk_button_new ();
+    gtk_container_add (GTK_CONTAINER (button),
+        gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU));
+    g_signal_connect (button, "clicked",
+                      G_CALLBACK (clear_button_clicked_cb), entry);
+    gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 4);
+    FILLED_ADD (hbox, 1, 2, 3, 4);
+    label = katze_property_label (settings, "location-entry-search");
+    INDENTED_ADD (label, 0, 1, 4, 5);
+    entry = katze_property_proxy (settings, "location-entry-search", NULL);
+    FILLED_ADD (entry, 1, 2, 4, 5);
 
     // Page "Interface"
-    PAGE_NEW(_("Interface"));
-    FRAME_NEW(_("Navigationbar"));
-    TABLE_NEW(3, 2);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("_Toolbar style")), 0, 1, 0, 1);
-    combobox = gtk_combo_box_new_text();
-    sokoke_combo_box_add_strings(GTK_COMBO_BOX(combobox)
-     , _("Default"), _("Icons"), _("Text"), _("Both"), _("Both horizontal"), NULL);
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), config->toolbarStyle);
-    g_signal_connect(combobox, "changed"
-     , G_CALLBACK(on_prefs_toolbarstyle_changed), prefs);
-    FILLED_ADD(combobox, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Show small _icons"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->toolbarSmall);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_toolbarSmall_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Show Web_search"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->toolbarWebSearch);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_toolbarWebSearch_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Show _New Tab"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->toolbarNewTab);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_toolbarNewTab_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 2, 3);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Show _Trash"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->toolbarClosedTabs);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_toolbarClosedTabs_toggled), prefs);
-    SPANNED_ADD(checkbutton, 1, 2, 2, 3);
-    FRAME_NEW(_("Miscellaneous"));
-    TABLE_NEW(2, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Close _buttons on tabs"));
-    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), config->tabClose);
-    g_signal_connect(checkbutton, "toggled"
-     , G_CALLBACK(on_prefs_tabClose_toggled), prefs);
-    INDENTED_ADD(checkbutton, 0, 1, 0, 1);
-    hbox = gtk_hbox_new(FALSE, 4);
-    gtk_box_pack_start(GTK_BOX(hbox)
-     , gtk_label_new_with_mnemonic(_("Tab Si_ze")), FALSE, FALSE, 4);
-    spinbutton = gtk_spin_button_new_with_range(0, 36, 1);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), config->tabSize);
-    g_signal_connect(spinbutton, "changed"
-     , G_CALLBACK(on_prefs_tabSize_changed), prefs);
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    FILLED_ADD(hbox, 1, 2, 0, 1);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("_Location search engine")), 0, 1, 1, 2);
-    entry = gtk_entry_new();
-    gtk_entry_set_text(GTK_ENTRY(entry), config->locationSearch);
-    g_signal_connect(entry, "focus-out-event"
-     , G_CALLBACK(on_prefs_locationsearch_focus_out), prefs);
-    FILLED_ADD(entry, 1, 2, 1, 2);
+    PAGE_NEW (_("Interface"));
+    FRAME_NEW (_("Navigationbar"));
+    TABLE_NEW (3, 2);
+    INDENTED_ADD (katze_property_label (settings, "toolbar-style"), 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "toolbar-style", NULL);
+    FILLED_ADD(button, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "small-toolbar", NULL);
+    INDENTED_ADD (button, 0, 1, 1, 2);
+    button = katze_property_proxy (settings, "show-web-search", NULL);
+    SPANNED_ADD (button, 1, 2, 1, 2);
+    button = katze_property_proxy (settings, "show-new-tab", NULL);
+    INDENTED_ADD (button, 0, 1, 2, 3);
+    button = katze_property_proxy (settings, "show-trash", NULL);
+    SPANNED_ADD (button, 1, 2, 2, 3);
+    FRAME_NEW(_("Browsing"));
+    TABLE_NEW (3, 2);
+    label = katze_property_label (settings, "open-new-pages-in");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "open-new-pages-in", NULL);
+    FILLED_ADD (button, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "middle-click-opens-selection", NULL);
+    INDENTED_ADD (button, 0, 1, 1, 2);
+    button = katze_property_proxy (settings, "open-tabs-in-the-background", NULL);
+    SPANNED_ADD (button, 1, 2, 1, 2);
+    button = katze_property_proxy (settings, "open-popups-in-tabs", NULL);
+    SPANNED_ADD (button, 0, 1, 2, 3);
+    button = katze_property_proxy (settings, "close-buttons-on-tabs", NULL);
+    SPANNED_ADD (button, 1, 2, 2, 3);
 
     // Page "Network"
-    PAGE_NEW(_("Network"));
-    FRAME_NEW(_("Proxy Server"));
-    TABLE_NEW(5, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("_Custom proxy server"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 0, 1);
-    hbox = gtk_hbox_new(FALSE, 4);
-    INDENTED_ADD(gtk_label_new_with_mnemonic(_("_Host/ Port")), 0, 1, 1, 2);
-    entry = gtk_entry_new();
-    gtk_widget_set_sensitive(entry, FALSE); //...
-    gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
-    spinbutton = gtk_spin_button_new_with_range(0, 65535, 1);
-    gtk_widget_set_sensitive(spinbutton, FALSE); //...
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    FILLED_ADD(hbox, 1, 2, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic
-     (_("Proxy requires authentication"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    // TODO: The proxy user and pass need to be indented further
-    SPANNED_ADD(checkbutton, 0, 2, 2, 3);
-    INDENTED_ADD(gtk_label_new(_("Username")), 0, 1, 3, 4);
-    entry = gtk_entry_new();
-    gtk_widget_set_sensitive(entry, FALSE); //...
-    FILLED_ADD(entry, 1, 2, 3, 4);
-    INDENTED_ADD(gtk_label_new(_("Password")), 0, 1, 4, 5);
-    entry = gtk_entry_new();
-    gtk_widget_set_sensitive(entry, FALSE); //...
-    FILLED_ADD(entry, 1, 2, 4, 5);
-    FRAME_NEW(_("Cache"));
-    TABLE_NEW(1, 2);
-    INDENTED_ADD(gtk_label_new(_("Cache size")), 0, 1, 0, 1);
-    hbox = gtk_hbox_new(FALSE, 4);
-    spinbutton = gtk_spin_button_new_with_range(0, 10000, 10);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), 100/*config->iCacheSize*/);
-    gtk_widget_set_sensitive(spinbutton, FALSE); //...
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("MB")), FALSE, FALSE, 0);
-    button = gtk_button_new_with_label(_("Clear cache"));
-    gtk_widget_set_sensitive(button, FALSE); //...
-    gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 4);
-    FILLED_ADD(hbox, 1, 2, 0, 1);
+    PAGE_NEW (_("Network"));
+    FRAME_NEW (_("Network"));
+    TABLE_NEW (2, 2);
+    label = katze_property_label (settings, "http-proxy");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "http-proxy", NULL);
+    FILLED_ADD (button, 1, 2, 0, 1);
+    label = katze_property_label (settings, "cache-size");
+    INDENTED_ADD (label, 0, 1, 1, 2);
+    hbox = gtk_hbox_new (FALSE, 4);
+    entry = katze_property_proxy (settings, "cache-size", NULL);
+    gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("MB")),
+                        FALSE, FALSE, 0);
+    FILLED_ADD (hbox, 1, 2, 1, 2);
 
     // Page "Privacy"
-    PAGE_NEW(_("Privacy"));
-    FRAME_NEW(_("Cookies"));
-    TABLE_NEW(3, 2);
-    INDENTED_ADD(gtk_label_new(_("Accept cookies")), 0, 1, 0, 1);
-    combobox = gtk_combo_box_new_text();
-    sokoke_combo_box_add_strings(GTK_COMBO_BOX(combobox)
-     , _("All cookies"), _("Session cookies"), _("None"), NULL);
-    gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0); //...
-    gtk_widget_set_sensitive(combobox, FALSE); //...
-    FILLED_ADD(combobox, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic
-     (_("Allow cookies from the original website only"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 1, 2);
-    INDENTED_ADD(gtk_label_new(_("Maximum cookie age")), 0, 1, 2, 3);
-    hbox = gtk_hbox_new(FALSE, 4);
-    spinbutton = gtk_spin_button_new_with_range(0, 360, 1);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), 30/*config->iCookieAgeMax*/);
-    gtk_widget_set_sensitive(spinbutton, FALSE); //...
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("days")), FALSE, FALSE, 0);
-    button = gtk_button_new_with_label(_("View cookies"));
-    gtk_widget_set_sensitive(button, FALSE); //...
-    gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 4);
-    FILLED_ADD(hbox, 1, 2, 2, 3);
-    FRAME_NEW(_("History"));
-    TABLE_NEW(3, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic(_("Remember my visited pages"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 1, 0, 1);
-    hbox = gtk_hbox_new(FALSE, 4);
-    spinbutton = gtk_spin_button_new_with_range(0, 360, 1);
-    gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), 30/*config->iHistoryAgeMax*/);
-    gtk_widget_set_sensitive(spinbutton, FALSE); //...
-    gtk_box_pack_start(GTK_BOX(hbox), spinbutton, FALSE, FALSE, 0);
-    gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(_("days")), FALSE, FALSE, 0);
-    SPANNED_ADD(hbox, 1, 2, 0, 1);
-    checkbutton = gtk_check_button_new_with_mnemonic
-     (_("Remember my form inputs"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 1, 2);
-    checkbutton = gtk_check_button_new_with_mnemonic
-     (_("Remember my downloaded files"));
-    gtk_widget_set_sensitive(checkbutton, FALSE); //...
-    SPANNED_ADD(checkbutton, 0, 2, 2, 3);
+    PAGE_NEW (_("Privacy"));
+    FRAME_NEW (_("Cookies"));
+    TABLE_NEW (3, 2);
+    label = katze_property_label (settings, "accept-cookies");
+    INDENTED_ADD (label, 0, 1, 0, 1);
+    button = katze_property_proxy (settings, "accept-cookies", NULL);
+    FILLED_ADD (button, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "original-cookies-only", "blurb");
+    SPANNED_ADD (button, 0, 2, 1, 2);
+    label = katze_property_label (settings, "maximum-cookie-age");
+    INDENTED_ADD (label, 0, 1, 2, 3);
+    hbox = gtk_hbox_new (FALSE, 4);
+    entry = katze_property_proxy (settings, "maximum-cookie-age", NULL);
+    gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")),
+                        FALSE, FALSE, 0);
+    FILLED_ADD (hbox, 1, 2, 2, 3);
+    FRAME_NEW (_("History"));
+    TABLE_NEW (3, 2);
+    button = katze_property_proxy (settings, "remember-last-visited-pages", NULL);
+    SPANNED_ADD (button, 0, 1, 0, 1);
+    hbox = gtk_hbox_new (FALSE, 4);
+    button = katze_property_proxy (settings, "maximum-history-age", NULL);
+    gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("days")),
+                        FALSE, FALSE, 0);
+    SPANNED_ADD (hbox, 1, 2, 0, 1);
+    button = katze_property_proxy (settings, "remember-last-form-inputs", NULL);
+    SPANNED_ADD (button, 0, 2, 1, 2);
+    button = katze_property_proxy (settings, "remember-last-downloaded-files", NULL);
+    SPANNED_ADD (button, 0, 2, 2, 3);
 
     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox)
      , notebook, FALSE, FALSE, 4);
index e56d2087573c8a75e8dfee51f653351f15181b35..990def93d35130386f6ee0e7b4abf0f67b536205 100644 (file)
 #ifndef __PREFS_H__
 #define __PREFS_H__ 1
 
-#include "midori-browser.h"
-
 #include <gtk/gtk.h>
 
+#include "midori-websettings.h"
+
 // -- Types
 
 typedef struct
 {
-    MidoriBrowser* browser;
     GtkWidget* userStylesheetUri;
     GtkWidget* treeview;
     GtkWidget* combobox;
@@ -37,6 +36,6 @@ enum
 // -- Declarations
 
 GtkWidget*
-prefs_preferences_dialog_new(MidoriBrowser*);
+prefs_preferences_dialog_new(GtkWindow*, MidoriWebSettings*);
 
 #endif /* !__PREFS_H__ */
index 41272465103531a1b26c1d34f2319b37b352cf00..bda6479ba2e28f34a0bcc8e7b2d4136d73e133a4 100644 (file)
@@ -316,6 +316,18 @@ gint sokoke_key_file_get_integer_default(GKeyFile* keyFile
     return g_key_file_get_integer(keyFile, group, key, error);
 }
 
+gboolean
+sokoke_key_file_get_boolean_default (GKeyFile*      key_file,
+                                     const gchar*   group,
+                                     const gchar*   key,
+                                     const gboolean default_value,
+                                     GError**       error)
+{
+    if (!g_key_file_has_key (key_file, group, key, NULL))
+        return default_value;
+    return g_key_file_get_boolean (key_file, group, key, error);
+}
+
 gboolean sokoke_key_file_save_to_file(GKeyFile* keyFile
  , const gchar* filename, GError** error)
 {
index 4424ea401113cbf4629a42cff874ed819c79518b..bbb5e7a2e600a4345b7dd210e140ad4948dcb54e 100644 (file)
@@ -64,6 +64,13 @@ gint
 sokoke_key_file_get_integer_default(GKeyFile*, const gchar*, const gchar*
  , const gint, GError**);
 
+gboolean
+sokoke_key_file_get_boolean_default (GKeyFile*    key_file,
+                                     const gchar* group,
+                                     const gchar* key,
+                                     gboolean     default_value,
+                                     GError**     error);
+
 gboolean
 sokoke_key_file_save_to_file(GKeyFile*, const gchar*, GError**);