[PATCH] Testing an idea by Allan Day



---
 src/ephy-location-action.c |  114 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 114 insertions(+), 0 deletions(-)

diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c
index 38bcb1d..57ef73d 100644
--- a/src/ephy-location-action.c
+++ b/src/ephy-location-action.c
@@ -23,6 +23,7 @@
 
 #include "ephy-embed-container.h"
 #include "ephy-embed-utils.h"
+#include "ephy-favicon-cache.h"
 #include "ephy-location-action.h"
 #include "ephy-location-entry.h"
 #include "ephy-shell.h"
@@ -371,6 +372,115 @@ remove_completion_actions (GtkAction *gaction,
 }
 
 static void
+activate_item_cb (GtkMenuItem *item, EphyLocationAction *action)
+{
+	GtkWidget *entry;
+	EphyLocationEntry *lentry;
+	char *content;
+
+	lentry = EPHY_LOCATION_ENTRY (action->priv->proxy);
+	entry = ephy_location_entry_get_entry (lentry);
+	content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
+
+	if (content)
+	{
+		EphyNode *node;
+		const char *smart_url;
+		char *url;
+
+		node = g_object_get_data (G_OBJECT (item), "bmk");
+
+		smart_url = ephy_node_get_property_string
+			(node, EPHY_NODE_BMK_PROP_LOCATION);
+		g_return_if_fail (smart_url != NULL);
+
+		url = ephy_bookmarks_resolve_address
+			(action->priv->bookmarks, smart_url, content);
+		g_free (content);
+		if (url == NULL) return;
+
+		ephy_link_open (EPHY_LINK (action), url, NULL,
+				ephy_link_flags_from_current_event ());
+
+		GtkWidget *image;
+		image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM
+						       (item));
+
+		ephy_location_entry_set_favicon (lentry,
+						 gtk_image_get_pixbuf (image));
+
+		g_free (url);
+	}
+}
+
+static GtkWidget*
+build_search_engine_menu (EphyLocationAction *action)
+{
+	GtkWidget *menu;
+	GList *l = NULL;
+
+	menu = gtk_menu_new ();
+
+	for (l = action->priv->actions; l != NULL; l = l->next)
+	{
+		EphyNode *bmk = l->data;
+		const char *title;
+		const char *icon;
+		GtkWidget *item;
+
+		title = ephy_node_get_property_string
+			(bmk, EPHY_NODE_BMK_PROP_TITLE);
+
+		icon = ephy_node_get_property_string (bmk,
+						      EPHY_NODE_BMK_PROP_ICON);
+
+		LOG ("title: %s, icon: %s", title, icon);
+
+		item = gtk_image_menu_item_new_with_label (title);
+		g_object_set_data (G_OBJECT (item), "bmk", bmk);
+
+		if (icon)
+		{
+			GdkPixbuf *pixbuf;
+			GtkWidget *image;
+			EphyFaviconCache *fic;
+
+			fic = EPHY_FAVICON_CACHE
+				(ephy_embed_shell_get_favicon_cache
+				 EPHY_EMBED_SHELL (ephy_shell));
+
+			pixbuf = ephy_favicon_cache_get (fic, icon);
+			image = gtk_image_new_from_pixbuf (pixbuf);
+
+			gtk_image_menu_item_set_image
+				(GTK_IMAGE_MENU_ITEM (item), image);
+		}
+
+		g_signal_connect (item, "activate",
+				  G_CALLBACK (activate_item_cb), action);
+
+		gtk_widget_show_all (item);
+		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+	}
+
+	return menu;
+}
+
+static void
+icon_press_cb (GtkWidget *entry,
+	       GtkEntryIconPosition pos,
+	       GdkEvent *event,
+	       GtkAction *action)
+{
+	GtkWidget *menu;
+
+	menu = build_search_engine_menu (EPHY_LOCATION_ACTION (action));
+
+	gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+			event->button.button, gtk_get_current_event_time ());
+}
+
+static void
 add_completion_actions (GtkAction *gaction,
 			GtkWidget *proxy)
 {
@@ -532,6 +642,9 @@ connect_proxy (GtkAction *action, GtkWidget *proxy)
 					 G_CALLBACK (focus_in_event_cb), proxy, 0);
 		g_signal_connect_object (entry, "focus-out-event",
 					 G_CALLBACK (focus_out_event_cb), proxy, 0);
+
+		g_signal_connect_object (entry, "icon-press",
+					 G_CALLBACK (icon_press_cb), action, 0);
 	}
 
 	GTK_ACTION_CLASS (ephy_location_action_parent_class)->connect_proxy (action, proxy);
@@ -905,6 +1018,7 @@ ephy_location_action_init (EphyLocationAction *action)
 	priv->sync_address_is_blocked = FALSE;
 
 	init_actions_list (action);
+
 	
 	ephy_node_signal_connect_object (priv->smart_bmks,
 					 EPHY_NODE_CHILD_ADDED,
-- 
1.7.0.2


--=-b+wpPQBa7S+q26PreCqo--



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