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