]> spindle.queued.net Git - midori/commitdiff
Show at most 3 search engines in completion
authorChristian Dywan <christian@twotoasts.de>
Tue, 13 Mar 2012 23:24:42 +0000 (00:24 +0100)
committerChristian Dywan <christian@twotoasts.de>
Tue, 13 Mar 2012 23:24:42 +0000 (00:24 +0100)
If that's not enough, 'Search With...' appears.

midori/midori-locationaction.c
midori/midori-view.c

index 6f218e0718b0494217f1ef60822ea0b06fda4147..8389a9b6e933ffdd5b6e89ce1c291c47dc61ddd3 100644 (file)
@@ -369,6 +369,78 @@ midori_location_action_popup_position (MidoriLocationAction* action,
     gtk_window_move (GTK_WINDOW (popup), wx, wy);
 }
 
+static int
+midori_location_action_add_search_engines (MidoriLocationAction* action,
+                                           GtkListStore*         store,
+                                           gint                  matches)
+{
+    KatzeItem* item;
+    gint i = 0;
+    GtkStyle* style;
+
+    gtk_widget_realize (action->treeview);
+    style = gtk_widget_get_style (action->treeview);
+
+    /* FIXME: choose 3 most frequently except for default */
+    KATZE_ARRAY_FOREACH_ITEM (item, action->search_engines)
+    {
+        gchar* uri;
+        gchar* title;
+        const gchar* text;
+        gchar* desc;
+        GdkPixbuf* icon;
+
+        uri = midori_uri_for_search (katze_item_get_uri (item), action->key);
+        title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
+        text = katze_item_get_text (item);
+        desc = g_strdup_printf ("%s\n%s", title, text ? text : uri);
+        icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
+        gtk_list_store_insert_with_values (store, NULL, matches + i,
+            URI_COL, uri, TITLE_COL, desc, YALIGN_COL, 0.25,
+            BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
+            STYLE_COL, 1, FAVICON_COL, icon, -1);
+        g_free (uri);
+        g_free (title);
+        g_free (desc);
+        if (icon != NULL)
+            g_object_unref (icon);
+        i++;
+
+        if (i > 2 && matches > 0)
+        {
+            gtk_list_store_insert_with_values (store, NULL, matches + i,
+                URI_COL, "about:search", TITLE_COL, _("Search with..."),
+                YALIGN_COL, 0.25,
+                BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
+                STYLE_COL, 1, FAVICON_COL, NULL, -1);
+            i++;
+            break;
+        }
+    }
+    return i;
+}
+
+static void
+midori_location_action_complete (MidoriLocationAction* action,
+                                 GdkEventButton*       event,
+                                 const gchar*          uri)
+{
+    if (!strcmp (uri, "about:search"))
+    {
+        GtkListStore* store = GTK_LIST_STORE (action->completion_model);
+        gtk_list_store_clear (store);
+        midori_location_action_popup_position (action,
+            midori_location_action_add_search_engines (action, store, 0));
+    }
+    else
+    {
+        midori_location_action_popdown_completion (action);
+        gtk_entry_set_text (GTK_ENTRY (action->entry), uri);
+        g_signal_emit (action, signals[SUBMIT_URI], 0, uri,
+                       MIDORI_MOD_NEW_TAB (event->state));
+    }
+}
+
 static gboolean
 midori_location_action_treeview_button_press_cb (GtkWidget*            treeview,
                                                  GdkEventButton*       event,
@@ -384,13 +456,8 @@ midori_location_action_treeview_button_press_cb (GtkWidget*            treeview,
 
         gtk_tree_model_get_iter (action->completion_model, &iter, path);
         gtk_tree_path_free (path);
-
-        midori_location_action_popdown_completion (action);
-
         gtk_tree_model_get (action->completion_model, &iter, URI_COL, &uri, -1);
-        gtk_entry_set_text (GTK_ENTRY (action->entry), uri);
-        g_signal_emit (action, signals[SUBMIT_URI], 0, uri,
-                       MIDORI_MOD_NEW_TAB (event->state));
+        midori_location_action_complete (action, event, uri);
         g_free (uri);
 
         return TRUE;
@@ -411,7 +478,6 @@ midori_location_action_popup_timeout_cb (gpointer data)
     static sqlite3_stmt* stmt;
     const gchar* sqlcmd;
     gint matches, searches;
-    GtkStyle* style;
 
     if (!action->entry || !gtk_widget_has_focus (action->entry) || !action->history)
         return FALSE;
@@ -519,6 +585,8 @@ midori_location_action_popup_timeout_cb (gpointer data)
         renderer = gtk_cell_renderer_text_new ();
         g_object_set_data (G_OBJECT (renderer), "location-action", action);
         gtk_cell_renderer_set_fixed_size (renderer, 1, -1);
+        gtk_cell_renderer_text_set_fixed_height_from_font (
+            GTK_CELL_RENDERER_TEXT (renderer), 2);
         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column), renderer, TRUE);
         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (column), renderer,
             "cell-background-gdk", BACKGROUND_COL,
@@ -537,8 +605,6 @@ midori_location_action_popup_timeout_cb (gpointer data)
     gtk_list_store_clear (store);
 
     matches = searches = 0;
-    gtk_widget_realize (action->treeview);
-    style = gtk_widget_get_style (action->treeview);
     while (result == SQLITE_ROW)
     {
         sqlite3_int64 type = sqlite3_column_int64 (stmt, 0);
@@ -577,35 +643,7 @@ midori_location_action_popup_timeout_cb (gpointer data)
     }
 
     if (action->search_engines)
-    {
-        KatzeItem* item;
-        i = 0;
-        KATZE_ARRAY_FOREACH_ITEM (item, action->search_engines)
-        {
-            gchar* uri;
-            gchar* title;
-            const gchar* text;
-            gchar* desc;
-            GdkPixbuf* icon;
-
-            uri = midori_uri_for_search (katze_item_get_uri (item), action->key);
-            title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item));
-            text = katze_item_get_text (item);
-            desc = g_strdup_printf ("%s\n%s", title, text ? text : uri);
-            icon = midori_search_action_get_icon (item, action->treeview, NULL, FALSE);
-            gtk_list_store_insert_with_values (store, NULL, matches + i,
-                URI_COL, uri, TITLE_COL, desc, YALIGN_COL, 0.25,
-                BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL,
-                STYLE_COL, 1, FAVICON_COL, icon, -1);
-            g_free (uri);
-            g_free (title);
-            g_free (desc);
-            if (icon != NULL)
-                g_object_unref (icon);
-            i++;
-        }
-        searches += i;
-    }
+        searches += midori_location_action_add_search_engines (action, store, matches);
 
     if (!gtk_widget_get_visible (action->popup))
     {
@@ -918,27 +956,29 @@ midori_location_action_key_press_event_cb (GtkEntry*    entry,
             GtkTreeModel* model = location_action->completion_model;
             GtkTreeIter iter;
             gint selected = location_action->completion_index;
-            midori_location_action_popdown_completion (location_action);
             if (selected > -1 &&
                 gtk_tree_model_iter_nth_child (model, &iter, NULL, selected))
             {
                 gchar* uri;
                 gtk_tree_model_get (model, &iter, URI_COL, &uri, -1);
-                gtk_entry_set_text (entry, uri);
 
                 if (is_enter)
-                    g_signal_emit (action, signals[SUBMIT_URI], 0, uri,
-                                   MIDORI_MOD_NEW_TAB (event->state));
+                    midori_location_action_complete (location_action, (GdkEventButton*)event, uri);
+                else
+                {
+                    midori_location_action_popdown_completion (location_action);
+                    gtk_entry_set_text (entry, uri);
+                }
 
                 g_free (uri);
                 return TRUE;
             }
+            midori_location_action_popdown_completion (location_action);
         }
 
-        if (is_enter)
-            if ((text = gtk_entry_get_text (entry)) && *text)
-                g_signal_emit (action, signals[SUBMIT_URI], 0, text,
-                               MIDORI_MOD_NEW_TAB (event->state));
+        if (is_enter && (text = gtk_entry_get_text (entry)) && *text)
+            g_signal_emit (action, signals[SUBMIT_URI], 0, text,
+                           MIDORI_MOD_NEW_TAB (event->state));
         break;
     case GDK_KEY_Escape:
     {
index 0c9fb5b27ecaba7ae5d30475c74978b7cdcf846a..7b0efd336edc588b3df4bec234a83495430099f9 100644 (file)
@@ -2525,6 +2525,7 @@ midori_view_populate_popup (MidoriView* view,
         midori_view_insert_menu_item (menu_shell, 0,
             _("_Search the Web"), GTK_STOCK_FIND,
             G_CALLBACK (midori_web_view_menu_search_web_activate_cb), widget);
+        /* FIXME: choose 3 most frequently */
 
         g_strstrip (view->selected_text);
         if (midori_uri_is_valid (view->selected_text))