[PATCHES] bookmark accelerators, smartbookmark activation

Juho Snellman <[email protected]> Thu, 15 Jan 2004 04:16:32 +0200
Newsgroups gmane.comp.web.galeon.devel
Message-ID <[email protected]>
Attached is a patch that adds keyboard accelerators for bookmarks. The
accelerator information is already present in the bookmark
information, and correctly imported from Galeon1 bookmarks. No
mechanism for adding/editing accelerators is provided, though.

In Galeon1 editing of the accelerators could be done simply by using
the normal accelerator editing in gtk menus. Enabling this for the
dynamically created bookmark menuitems (using GtkAccelMap) doesn't
seem to work. I assume that doing this for the egg-menus requires some
additional trickery.

Also attached is a one-liner that slightly changes the behaviour of
the "enter the arguments for this smart site"-dialog. Currently the
dialog is always shown when a smart bookmark with an empty "location"
field is activated. The patch changes this behaviour, so that the
dialog isn't shown if we already got the argument (for example the
user typed some text into the bookmark's entrybox in the bookmark
toolbar).

-- 
Juho Snellman
galeon-accel.patch (text/plain, 8.4 KB)
Index: bookmarks/bookmarks-folder-tb-widget.c
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-folder-tb-widget.c,v
retrieving revision 1.17
diff -u -r1.17 bookmarks-folder-tb-widget.c
--- bookmarks/bookmarks-folder-tb-widget.c	4 Aug 2003 20:26:33 -0000	1.17
+++ bookmarks/bookmarks-folder-tb-widget.c	10 Jan 2004 03:38:08 -0000
@@ -168,7 +168,7 @@
 		{
 			GbLocationSource *src = gb_tb_widget_get_location_source (GB_TB_WIDGET (w));
 			p->menu = gtk_menu_new ();
-			p->ggm = gb_gtk_menu_new (folder, GTK_MENU_SHELL (p->menu));
+			p->ggm = gb_gtk_menu_new (folder, GTK_MENU_SHELL (p->menu), NULL);
 			gb_gtk_menu_set_location_source (p->ggm, src);
 			g_signal_connect (p->menu, "hide", 
 					  G_CALLBACK (gb_folder_tb_widget_menu_hide_cb), w);
Index: bookmarks/bookmarks-gtk-menu-item.c
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-gtk-menu-item.c,v
retrieving revision 1.9
diff -u -r1.9 bookmarks-gtk-menu-item.c
--- bookmarks/bookmarks-gtk-menu-item.c	24 Oct 2003 20:38:15 -0000	1.9
+++ bookmarks/bookmarks-gtk-menu-item.c	10 Jan 2004 03:38:08 -0000
@@ -41,6 +42,7 @@
 struct _GbGtkMenuItemPrivate {
 	GbBookmark *bookmark;
 	GbGtkMenu *submenu;
+	GtkAccelGroup *accel_group;
 	guint rebuild_timeout;
 	GbLocationSource *location_source;
 
@@ -127,20 +129,24 @@
 	}
 
 	g_object_unref (G_OBJECT (p->bookmark));
+	g_object_unref (G_OBJECT (p->accel_group));
 	g_free (p);
 
 	G_OBJECT_CLASS (gtk_image_menu_item_class)->finalize (o);
 }
 
 GbGtkMenuItem *
-gb_gtk_menu_item_new (GbBookmark *bookmark)
+gb_gtk_menu_item_new (GbBookmark *bookmark, GtkAccelGroup *accel_group)
 {
 	GbGtkMenuItem *ret = g_object_new (GB_TYPE_GTK_MENU_ITEM, NULL);
	GbGtkMenuItemPrivate *p = ret->priv;
 
 	p->bookmark = bookmark;
 	g_object_ref (bookmark);

+	p->accel_group = accel_group;	
+	g_object_ref (G_OBJECT(accel_group));
+
 	g_signal_connect (bookmark, "modified", 
 			  G_CALLBACK (gb_gtk_menu_item_modied_cb), ret);
 	g_signal_connect (ret, "activate",
@@ -152,6 +182,16 @@
 				  G_CALLBACK (gb_gtk_menu_item_button_press_cb), NULL);
 
 		gb_bookmark_dnd_drag_source_set (GTK_WIDGET(ret), bookmark);
+            
+		if (GB_SITE(bookmark)->accel_key > 0) {
+                    	gtk_widget_add_accelerator (GTK_WIDGET (ret),
+                                                    "activate",
+                                                    accel_group,
+                                                    GB_SITE(bookmark)->accel_key,
+                                                    GB_SITE(bookmark)->accel_mods, 
+                                                    GTK_ACCEL_VISIBLE);
+               		
+                }
 	}
 
 	gb_gtk_menu_item_rebuild (ret);
@@ -216,7 +269,7 @@
 
 		g_return_if_fail (GTK_IS_MENU_SHELL (menu));
 		
-		p->submenu = gb_gtk_menu_new (GB_FOLDER (p->bookmark), GTK_MENU_SHELL (menu));
+		p->submenu = gb_gtk_menu_new (GB_FOLDER (p->bookmark), GTK_MENU_SHELL (menu), p->accel_group);
 		gb_gtk_menu_set_location_source (p->submenu, p->location_source);
 		
 		g_signal_connect (p->submenu, "bookmark-activated", 
Index: bookmarks/bookmarks-gtk-menu-item.h
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-gtk-menu-item.h,v
retrieving revision 1.2
diff -u -r1.2 bookmarks-gtk-menu-item.h
--- bookmarks/bookmarks-gtk-menu-item.h	1 Jan 2003 21:48:27 -0000	1.2
+++ bookmarks/bookmarks-gtk-menu-item.h	10 Jan 2004 03:38:09 -0000
@@ -66,7 +66,7 @@
 };
 
 GType		gb_gtk_menu_item_get_type			(void);
-GbGtkMenuItem *	gb_gtk_menu_item_new				(GbBookmark *bookmark);
+GbGtkMenuItem *	gb_gtk_menu_item_new				(GbBookmark *bookmark, GtkAccelGroup *accel_group);
 void		gb_gtk_menu_item_set_location_source		(GbGtkMenuItem *gm, GbLocationSource *src);
 void 		gb_gtk_menu_item_fill_submenu			(GbGtkMenuItem *bmi, gboolean children);
 
Index: bookmarks/bookmarks-gtk-menu.c
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-gtk-menu.c,v
retrieving revision 1.20
diff -u -r1.20 bookmarks-gtk-menu.c
--- bookmarks/bookmarks-gtk-menu.c	18 Dec 2003 23:42:19 -0000	1.20
+++ bookmarks/bookmarks-gtk-menu.c	10 Jan 2004 03:38:09 -0000
@@ -42,6 +42,7 @@
 struct _GbGtkMenuPrivate {
 	GbFolder *root;
 	GtkMenuShell *ms;
+	GtkAccelGroup *accel_group;    
 	guint rebuild_timeout;
 	gboolean context_only;
 
@@ -141,6 +142,7 @@
 	g_slist_free (p->menuitems);
 
 	g_object_unref (G_OBJECT (p->root));
+	g_object_unref (G_OBJECT (p->accel_group));
 	g_object_unref (G_OBJECT (p->ms));
 	g_free (p);
 
@@ -148,7 +150,7 @@
 }
 
 static GbGtkMenu *
-gb_gtk_menu_new_internal (GbFolder *root, GtkMenuShell *ms, gboolean context_only)
+gb_gtk_menu_new_internal (GbFolder *root, GtkMenuShell *ms, gboolean context_only, GtkAccelGroup *accel_group)
 {
 	GbGtkMenu *ret = g_object_new (GB_TYPE_GTK_MENU, NULL);
 	GbGtkMenuPrivate *p = ret->priv;
@@ -176,23 +178,26 @@
 	p->ms = ms;
 	g_object_ref (G_OBJECT (ms));
 
+	p->accel_group = accel_group;
+	g_object_ref (G_OBJECT (accel_group));
+
 	p->menuitems = NULL;
 	gb_gtk_menu_rebuild (ret);

 	return ret;
 }
 
 GbGtkMenu *
-gb_gtk_menu_new (GbFolder *root, GtkMenuShell *ms)
-{
-	GbGtkMenu *ret = gb_gtk_menu_new_internal (root, ms, FALSE);
+gb_gtk_menu_new (GbFolder *root, GtkMenuShell *ms, GtkAccelGroup *accel_group)
+{    
+	GbGtkMenu *ret = gb_gtk_menu_new_internal (root, ms, FALSE, accel_group);
 	return ret;
 }
 
 GbGtkMenu *
 gb_gtk_menu_new_context_only (GbBookmarkSet *set, GtkMenuShell *ms)
 {
-	GbGtkMenu *ret = gb_gtk_menu_new_internal (set->root, ms, TRUE);
+	GbGtkMenu *ret = gb_gtk_menu_new_internal (set->root, ms, TRUE, NULL);
 	return ret;
 }
 
@@ -249,7 +254,7 @@
 	GbGtkMenuPrivate *p = gm->priv;
 	GbGtkMenuItem *w;
 
-	w = gb_gtk_menu_item_new (item);
+	w = gb_gtk_menu_item_new (item, p->accel_group);
 	gb_gtk_menu_item_set_location_source (w, p->location_source);
 	g_signal_connect (w, "bookmark-activated", 
 			  G_CALLBACK (gb_gtk_menu_bookmark_activated_cb), gm);
Index: bookmarks/bookmarks-gtk-menu.h
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-gtk-menu.h,v
retrieving revision 1.8
diff -u -r1.8 bookmarks-gtk-menu.h
--- bookmarks/bookmarks-gtk-menu.h	18 Dec 2003 23:42:19 -0000	1.8
+++ bookmarks/bookmarks-gtk-menu.h	10 Jan 2004 03:38:10 -0000
@@ -65,7 +65,7 @@
 };
 
 GType		gb_gtk_menu_get_type			(void);
-GbGtkMenu *	gb_gtk_menu_new				(GbFolder *root, GtkMenuShell *ms);
+GbGtkMenu *	gb_gtk_menu_new				(GbFolder *root, GtkMenuShell *ms, GtkAccelGroup *accel_group);
 GbGtkMenu *	gb_gtk_menu_new_context_only		(GbBookmarkSet *set, GtkMenuShell *ms);
 void		gb_gtk_menu_set_location_source		(GbGtkMenu *gm, GbLocationSource *src);
 void		gb_gtk_menu_fill_children_submenus	(GbGtkMenu *gm);
Index: bookmarks/bookmarks-gtk-toolbar.c
===================================================================
RCS file: /cvs/gnome/galeon/bookmarks/bookmarks-gtk-toolbar.c,v
retrieving revision 1.2
diff -u -r1.2 bookmarks-gtk-toolbar.c
--- bookmarks/bookmarks-gtk-toolbar.c	18 Dec 2003 23:42:19 -0000	1.2
+++ bookmarks/bookmarks-gtk-toolbar.c	10 Jan 2004 03:38:10 -0000
@@ -248,7 +248,7 @@
 	GbGtkToolbarPrivate *p = gtb->priv;
 	GbTbWidget *tbw = GB_TB_WIDGET (GTK_BIN (item)->child);
 	GbBookmark *b = gb_tb_widget_get_bookmark (tbw);
-	GbGtkMenuItem *proxy = gb_gtk_menu_item_new (b);
+	GbGtkMenuItem *proxy = gb_gtk_menu_item_new (b, NULL);
 	gb_gtk_menu_item_set_location_source (proxy, p->location_source);
 	g_signal_connect (proxy, "bookmark-activated", 
 			  G_CALLBACK (gb_gtk_toolbar_bookmark_activated_cb), gtb);
Index: src/galeon-window.c
===================================================================
RCS file: /cvs/gnome/galeon/src/galeon-window.c,v
retrieving revision 1.222
diff -u -r1.222 galeon-window.c
--- src/galeon-window.c	9 Jan 2004 03:26:00 -0000	1.222
+++ src/galeon-window.c	10 Jan 2004 03:38:20 -0000
@@ -856,8 +857,9 @@
 	menu_item = egg_menu_merge_get_widget(window->merge,
 					      "/menu/Bookmarks");
 	menu_shell = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
	
-	p->bookmarks_menu = gb_gtk_menu_new (bs->root, GTK_MENU_SHELL(menu_shell));
+	p->bookmarks_menu = gb_gtk_menu_new (bs->root, GTK_MENU_SHELL(menu_shell), 
+                                             window->merge->accel_group);
 	gb_gtk_menu_set_location_source (p->bookmarks_menu, GB_LOCATION_SOURCE (window));
 	
 	gb_gtk_menu_fill_children_submenus (p->bookmarks_menu);
galeon-smartbkmk.patch (text/plain, 477 B)
diff -u -r1.222 galeon-window.c
--- src/galeon-window.c	9 Jan 2004 03:26:00 -0000	1.222
+++ src/galeon-window.c	10 Jan 2004 03:38:20 -0000
@@ -2657,11 +2659,12 @@
 		return;
 	}
 
	if (GB_IS_SMART_SITE (b) 
	    && GB_SMART_SITE (b)->smarturl != NULL 
	    && (GB_SITE (b)->url == NULL 
-		|| GB_SITE (b)->url[0]=='\0'))
+		|| GB_SITE (b)->url[0]=='\0')
+	    && ev->url[0] == '\0')
	{
 		smarted_url = handle_smartsite (w, GB_SMART_SITE (b));
 		if (smarted_url == NULL)
 		{