]> spindle.queued.net Git - midori/commitdiff
Split location and search entry
authorPeter Hatina <phatina@redhat.com>
Tue, 15 Nov 2011 22:43:14 +0000 (23:43 +0100)
committerChristian Dywan <christian@twotoasts.de>
Tue, 15 Nov 2011 22:43:14 +0000 (23:43 +0100)
Fixes: https://bugs.launchpad.net/midori/+bug/738422
midori/midori-browser.c
midori/midori-websettings.c

index ff1030259e9f9a6f2cae818f3e67802e79646e83..4aa01d7da3b1250fa3463d6db053675ec62b5cac 100644 (file)
@@ -19,6 +19,7 @@
 #include "midori-panel.h"
 #include "midori-locationaction.h"
 #include "midori-searchaction.h"
+#include "midori-panedaction.h"
 #include "midori-findbar.h"
 #include "midori-transferbar.h"
 #include "midori-platform.h"
@@ -2717,6 +2718,20 @@ _midori_browser_save_toolbar_items (MidoriBrowser* browser)
     g_free (items);
 }
 
+static void
+_midori_browser_save_search_item (MidoriBrowser* browser)
+{
+    MidoriPanedAction* paned_action = MIDORI_PANED_ACTION (_action_by_name (browser, "LocationSearch"));
+    GtkWidget* search = midori_paned_action_get_child_by_name (paned_action, "Search");
+    GtkAllocation allocation;
+    MidoriWebSettings* settings = browser->settings;
+    if (!search)
+        return;
+
+    gtk_widget_get_allocation (search, &allocation);
+    g_object_set (settings, "search-width", allocation.width, NULL);
+}
+
 /**
  * midori_browser_get_toolbar_actions:
  *
@@ -5523,6 +5538,8 @@ midori_browser_destroy_cb (MidoriBrowser* browser)
     if (G_UNLIKELY (browser->alloc_timeout))
         g_source_remove (browser->alloc_timeout);
 
+    _midori_browser_save_search_item (browser);
+
     /* Destroy panel first, so panels don't need special care */
     gtk_widget_destroy (browser->panel);
     /* Destroy tabs second, so child widgets don't need special care */
@@ -5953,6 +5970,12 @@ midori_browser_init (MidoriBrowser* browser)
         action, "<Ctrl>K");
     g_object_unref (action);
 
+    action = g_object_new (MIDORI_TYPE_PANED_ACTION,
+        "name", "LocationSearch",
+        NULL);
+    gtk_action_group_add_action (browser->action_group, action);
+    g_object_unref (action);
+
     action = g_object_new (KATZE_TYPE_ARRAY_ACTION,
         "name", "Trash",
         "stock-id", STOCK_USER_TRASH,
@@ -6377,18 +6400,73 @@ _midori_browser_set_toolbar_items (MidoriBrowser* browser,
     gchar** name;
     GtkAction* action;
     GtkWidget* toolitem;
+    const char* token_location = g_intern_static_string ("Location");
+    const char* token_search = g_intern_static_string ("Search");
+    const char* token_dontcare = g_intern_static_string ("Dontcare");
+    const char* token_current = token_dontcare;
+    const char* token_last = token_dontcare;
 
     gtk_container_foreach (GTK_CONTAINER (browser->navigationbar),
         (GtkCallback)gtk_widget_destroy, NULL);
 
     names = g_strsplit (items ? items : "", ",", 0);
     name = names;
-    while (*name)
+    for (; *name; ++name)
     {
         action = _action_by_name (browser, *name);
         if (action)
         {
-            toolitem = gtk_action_create_tool_item (action);
+            token_last = token_current;
+
+            /* Decide, what kind of token (item) we got now */
+            if (name && !g_strcmp0 (*name, "Location"))
+                token_current = token_location;
+            else if (name && !g_strcmp0 (*name, "Search"))
+                token_current = token_search;
+            else
+                token_current = token_dontcare;
+
+            if ((token_current == token_location || token_current == token_search) &&
+                 (token_last == token_location || token_last == token_search))
+            {
+                GtkWidget* toolitem_first = gtk_action_create_tool_item (
+                    _action_by_name (browser, token_last));
+                GtkWidget* toolitem_second = gtk_action_create_tool_item (
+                    _action_by_name (browser, token_current));
+                MidoriPanedAction* paned_action = MIDORI_PANED_ACTION (
+                    _action_by_name (browser, "LocationSearch"));
+                MidoriWebSettings* midori_settings = browser->settings;
+                midori_paned_action_set_child1 (paned_action, toolitem_first, token_last,
+                    token_last == token_search ? FALSE : TRUE, TRUE);
+                midori_paned_action_set_child2 (paned_action, toolitem_second, token_current,
+                    token_current == token_search ? FALSE : TRUE, TRUE);
+
+                gtk_widget_set_size_request (
+                    token_last == token_search ? toolitem_first : toolitem_second,
+                    katze_object_get_int ((gpointer) midori_settings,
+                    "search-width"),
+                    -1);
+
+                toolitem = gtk_action_create_tool_item (GTK_ACTION (paned_action));
+                token_current = token_dontcare;
+                token_last = token_dontcare;
+            }
+            else if (token_current == token_dontcare && token_last != token_dontcare)
+            {
+                /* There was a location or search item, but was not followed by
+                   the other one, that form a couple */
+                gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar),
+                    GTK_TOOL_ITEM (gtk_action_create_tool_item (
+                    _action_by_name (browser, token_last))),
+                    -1);
+
+                toolitem = gtk_action_create_tool_item (action);
+            }
+            else if (token_current != token_dontcare && token_last == token_dontcare)
+                continue;
+            else
+                toolitem = gtk_action_create_tool_item (action);
+
             if (gtk_bin_get_child (GTK_BIN (toolitem)))
                 g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)),
                     "button-press-event",
@@ -6405,9 +6483,17 @@ _midori_browser_set_toolbar_items (MidoriBrowser* browser,
             gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar),
                                 GTK_TOOL_ITEM (toolitem), -1);
         }
-        name++;
     }
     g_strfreev (names);
+
+    /* There was a last item, which could have formed a couple, but
+       there is no item left, we add that last item to toolbar as is */
+    if (token_current != token_dontcare)
+    {
+        gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar),
+            GTK_TOOL_ITEM (gtk_action_create_tool_item (
+            _action_by_name (browser, token_current))), -1);
+    }
 }
 
 static void
index 285652d89423fc2bb3cc6a3d677211889850a325..837c3cee487f239053e7b8d8af610fe3a2a4b10a 100644 (file)
@@ -67,6 +67,7 @@ struct _MidoriWebSettings
     gint last_web_search;
     gint maximum_cookie_age;
     gint maximum_history_age;
+    gint search_width;
 
     gchar* toolbar_items;
     gchar* homepage;
@@ -176,6 +177,8 @@ enum
     PROP_STRIP_REFERER,
     PROP_ENFORCE_FONT_FAMILY,
     PROP_USER_STYLESHEET_URI,
+
+    PROP_SEARCH_WIDTH,
 };
 
 GType
@@ -1077,6 +1080,22 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
                                      "Load stylesheets from a local URI",
                                      NULL,
                                      flags));
+
+    /**
+     * MidoriWebSettings:search-entry-width:
+     *
+     * Search action width in pixels
+     *
+     * Since: 0.4.3
+     **/
+    g_object_class_install_property (gobject_class,
+                                     PROP_SEARCH_WIDTH,
+                                     g_param_spec_int (
+                                     "search-width",
+                                     "Search action width",
+                                     "Search action width in pixels",
+                                     10, G_MAXINT, 200,
+                                     flags));
 }
 
 static void
@@ -1565,6 +1584,9 @@ midori_web_settings_set_property (GObject*      object,
             midori_web_settings_process_stylesheets (web_settings, new_len - old_len);
         }
         break;
+    case PROP_SEARCH_WIDTH:
+        web_settings->search_width = g_value_get_int (value);
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -1830,6 +1852,9 @@ midori_web_settings_get_property (GObject*    object,
         g_value_take_string (value, katze_object_get_string (web_settings,
             "WebKitWebSettings::user-stylesheet-uri"));
         break;
+    case PROP_SEARCH_WIDTH:
+        g_value_set_int (value, web_settings->search_width);
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;