Some Autocompletion window patches

Crispin Flowerday <[email protected]>
Newsgroups gmane.comp.web.galeon.devel
Message-ID <1057182985.16721.4.camel@drno>
Hi,

While attempting to add CTRL+Enter support into the drop-down
autocompletion window, I noticed that it has a rather nasty signal leak,
in that every time the autocompletion window is shown we reattach the
signals for key press and button press, but never disconnect them!

Attached is a patch to fix the signal leak, and one to add the
CTRL+Enter into the autocompletion box. For the CTRL+Enter one, you also
need my previous patch for CTRL+Enter in the location bar.

Cheers

Crispin
galeon_autocomplete_ctrl_enter.diff (text/plain, 4 KB)
--- utils/galeon-autocompletion-window.c	2 Jul 2003 21:42:15 -0000
+++ utils/galeon-autocompletion-window.c	2 Jul 2003 21:46:28 -0000
@@ -102,7 +102,7 @@
 								 GdkEventKey *event,
 								 GaleonAutocompletionWindow *aw);
 static gboolean	galeon_autocompletion_window_key_press_hack	(GaleonAutocompletionWindow *aw, 
-								 guint keyval);
+								 GdkEventKey *event);
 static void 	hack_tree_view_move_selection 			(GtkTreeView *tv, int dir);
 static void	galeon_autocompletion_window_event_after_cb	(GtkWidget *wid, GdkEvent *event,
 								 GaleonAutocompletionWindow *aw);
@@ -141,8 +141,8 @@
 		G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
                 G_STRUCT_OFFSET (GaleonAutocompletionWindowClass, url_activated), 
 		NULL, NULL, 
-		galeon_marshal_VOID__STRING,
-		G_TYPE_NONE, 1, G_TYPE_STRING);
+		galeon_marshal_VOID__STRING_INT,
+		G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN);
 
 	GaleonAutocompletionWindowSignals[GALEON_AUTOCOMPLETION_WINDOW_HIDDEN] = g_signal_new (
 		"hidden", G_OBJECT_CLASS_TYPE (klass),  
@@ -658,7 +658,7 @@
 	    || ((event->keyval == GDK_space || event->keyval == GDK_Return)
 		&& p->selected))
 	{
-		return galeon_autocompletion_window_key_press_hack (aw, event->keyval);
+		return galeon_autocompletion_window_key_press_hack (aw, event);
 	}
 	else
 	{
@@ -687,10 +687,11 @@
 }
 
 static gboolean
-galeon_autocompletion_window_key_press_hack (GaleonAutocompletionWindow *aw, guint keyval)
+galeon_autocompletion_window_key_press_hack (GaleonAutocompletionWindow *aw, 
+					     GdkEventKey *event)
 {
 	GaleonAutocompletionWindowPrivate *p = aw->priv;
-	switch (keyval)
+	switch (event->keyval)
 	{
 	case GDK_Up:
 		hack_tree_view_move_selection (p->tree_view, -1);
@@ -708,8 +709,13 @@
 	case GDK_space:
 		if (p->selected)
 		{
+			gboolean new_tab_or_window = FALSE;
+			if ( event->state & GDK_CONTROL_MASK )
+				new_tab_or_window = TRUE;
+
 			g_signal_emit (aw, GaleonAutocompletionWindowSignals
-				       [GALEON_AUTOCOMPLETION_WINDOW_URL_ACTIVATED], 0, p->selected->data);
+				       [GALEON_AUTOCOMPLETION_WINDOW_URL_ACTIVATED], 0, 
+				       p->selected->data, new_tab_or_window);
 		}
 		break;
 	default:
@@ -820,7 +826,8 @@
 		if (p->selected)
 		{
 			g_signal_emit (aw, GaleonAutocompletionWindowSignals
-				       [GALEON_AUTOCOMPLETION_WINDOW_URL_ACTIVATED], 0, p->selected->data);
+				       [GALEON_AUTOCOMPLETION_WINDOW_URL_ACTIVATED], 0, 
+				       p->selected->data, FALSE);
 		}
 	}
 }
--- utils/galeon-autocompletion-window.h	29 Sep 2002 20:07:49 -0000	1.2
+++ utils/galeon-autocompletion-window.h	2 Jul 2003 21:46:28 -0000
@@ -55,7 +55,8 @@
 	/* signals */
 	void		(*hidden)			(GaleonAutocompletionWindow *aw);
 	void		(*url_activated)		(GaleonAutocompletionWindow *aw, 
-							 const gchar *item);
+							 const gchar *item,
+							 gboolean new_tab_or_window);
 
 };
 
--- utils/location-entry.c	15 Jun 2003 08:01:09 -0000	1.14
+++ utils/location-entry.c	2 Jul 2003 21:46:28 -0000
@@ -77,6 +77,7 @@
 static void		galeon_location_entry_autocompletion_window_url_activated_cb
 /***/								(GaleonAutocompletionWindow *aw, 
 								 const gchar *url, 
+								 gboolean new_tab_or_window,
 								 GaleonLocationEntry *w);
 static void		galeon_location_entry_list_event_after_cb (GtkWidget *list,
 								   GdkEvent *event, 
@@ -605,7 +631,9 @@
 
 static void
 galeon_location_entry_autocompletion_window_url_activated_cb (GaleonAutocompletionWindow *aw, 
-							      const gchar *url, GaleonLocationEntry *w)
+							      const gchar *url, 
+							      gboolean new_tab_or_window,
+							      GaleonLocationEntry *w)
 {
 	real_set_location (w, url);
 
@@ -613,7 +641,7 @@
 
 	galeon_location_entry_autocompletion_hide_alternatives (w);
 
-	emit_activated_signal (w, url);
+	emit_activated_signal (w, url, new_tab_or_window);
 }
 
 static void
@@ -672,7 +700,7 @@
 		if (url && url[0] != '\0')
 		{
 			p->hack_for_going_to_the_site_when_clicking_in_the_location_history = FALSE;
-			emit_activated_signal (e, url);
+			emit_activated_signal (e, url, FALSE);
 			g_free (url);
 		}
 	}
galeon_autocomplete_signal_leak.diff (text/x-patch, 3 KB)
diff -u -r1.11 utils/galeon-autocompletion-window.c
--- utils/galeon-autocompletion-window.c	2 Oct 2002 15:06:48 -0000	1.11
+++ utils/galeon-autocompletion-window.c	2 Jul 2003 21:42:15 -0000
@@ -78,6 +78,10 @@
 	guint add_matches_timeout;
 	
 	gboolean shown;
+	gulong window_button_press_event_id;
+	gulong window_key_press_event_id;
+	gulong parent_key_press_event_id;
+	gulong tree_view_event_after_id;
 };
 
 /**
@@ -580,21 +584,28 @@
 				  GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK |
 				  GDK_BUTTON_RELEASE_MASK,
 				  NULL, NULL, GDK_CURRENT_TIME);
-		gdk_keyboard_grab (p->parent->window, TRUE, GDK_CURRENT_TIME);\
+		gdk_keyboard_grab (p->parent->window, TRUE, GDK_CURRENT_TIME);
 		gtk_grab_add (p->window);
 		
-		g_signal_connect (p->window, "button-press-event", 
-				  G_CALLBACK (galeon_autocompletion_window_button_press_event_cb),
-				  aw);
-		g_signal_connect (p->window, "key-press-event",
-				  G_CALLBACK (galeon_autocompletion_window_key_press_cb),
-				  aw);
-		g_signal_connect (p->parent, "key-press-event",
-				  G_CALLBACK (galeon_autocompletion_window_key_press_cb),
-				  aw);
-		g_signal_connect (p->tree_view, "event-after", 
-				  G_CALLBACK (galeon_autocompletion_window_event_after_cb),
-				  aw);
+		p->window_button_press_event_id =
+			g_signal_connect (p->window, "button-press-event", 
+					  G_CALLBACK (galeon_autocompletion_window_button_press_event_cb),
+					  aw);
+
+		p->window_key_press_event_id =
+			g_signal_connect (p->window, "key-press-event",
+					  G_CALLBACK (galeon_autocompletion_window_key_press_cb),
+					  aw);
+
+		p->parent_key_press_event_id = 
+			g_signal_connect (p->parent, "key-press-event",
+					  G_CALLBACK (galeon_autocompletion_window_key_press_cb),
+					  aw);
+
+		p->tree_view_event_after_id = 
+			g_signal_connect_after (p->tree_view, "event-after", 
+					  G_CALLBACK (galeon_autocompletion_window_event_after_cb),
+					  aw);
 		p->shown = TRUE;
 	}
 
@@ -711,16 +728,28 @@
 void
 galeon_autocompletion_window_hide (GaleonAutocompletionWindow *aw)
 {
-	if (aw->priv->window)
+	GaleonAutocompletionWindowPrivate *p = aw->priv;
+	if (p->window && p->shown == TRUE)
 	{
-		gtk_widget_hide (aw->priv->window);
-		gtk_grab_remove (aw->priv->window);
+		gtk_widget_hide (p->window);
+		gtk_grab_remove (p->window);
 		gdk_pointer_ungrab (GDK_CURRENT_TIME);
 		gdk_keyboard_ungrab (GDK_CURRENT_TIME);
 		galeon_autocompletion_window_unselect (aw);
+
+		g_signal_handler_disconnect( p->window, p->window_button_press_event_id );
+		g_signal_handler_disconnect( p->window, p->window_key_press_event_id );
+		g_signal_handler_disconnect( p->parent, p->parent_key_press_event_id );
+		g_signal_handler_disconnect( p->tree_view, p->tree_view_event_after_id );
+
+		p->window_button_press_event_id = 0;
+		p->window_key_press_event_id = 0;
+		p->parent_key_press_event_id = 0;
+		p->tree_view_event_after_id = 0;
+		
 		g_signal_emit (aw, GaleonAutocompletionWindowSignals[GALEON_AUTOCOMPLETION_WINDOW_HIDDEN], 0);
 	}
-	aw->priv->shown = FALSE;
+	p->shown = FALSE;
 }
 
 static void
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.