From 0e1eee26b9ab08cdcfafaddbd6894c0a65c686f1 Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Tue, 17 Aug 2010 23:29:15 +0300 Subject: [PATCH] [filechooserentry] don't show misplaced completion popup Override the key-press-event instead of overriding the focus method. Fixes #627139 --- gtk/gtkfilechooserentry.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c index 28cde5d73f..2a37a79d8b 100644 --- a/gtk/gtkfilechooserentry.c +++ b/gtk/gtkfilechooserentry.c @@ -31,6 +31,8 @@ #include "gtkwindow.h" #include "gtkintl.h" +#include "gdkkeysyms.h" + typedef struct _GtkFileChooserEntryClass GtkFileChooserEntryClass; #define GTK_FILE_CHOOSER_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_ENTRY, GtkFileChooserEntryClass)) @@ -105,8 +107,8 @@ static void gtk_file_chooser_entry_finalize (GObject *object) static void gtk_file_chooser_entry_dispose (GObject *object); static void gtk_file_chooser_entry_grab_focus (GtkWidget *widget); static void gtk_file_chooser_entry_unmap (GtkWidget *widget); -static gboolean gtk_file_chooser_entry_focus (GtkWidget *widget, - GtkDirectionType direction); +static gboolean gtk_file_chooser_entry_key_press_event (GtkWidget *widget, + GdkEventKey *event); static gboolean gtk_file_chooser_entry_focus_out_event (GtkWidget *widget, GdkEventFocus *event); static void gtk_file_chooser_entry_activate (GtkEntry *entry); @@ -181,7 +183,7 @@ _gtk_file_chooser_entry_class_init (GtkFileChooserEntryClass *class) widget_class->grab_focus = gtk_file_chooser_entry_grab_focus; widget_class->unmap = gtk_file_chooser_entry_unmap; - widget_class->focus = gtk_file_chooser_entry_focus; + widget_class->key_press_event = gtk_file_chooser_entry_key_press_event; widget_class->focus_out_event = gtk_file_chooser_entry_focus_out_event; entry_class->activate = gtk_file_chooser_entry_activate; @@ -1026,7 +1028,8 @@ show_completion_feedback_window (GtkFileChooserEntry *chooser_entry) get_entry_cursor_x (chooser_entry, &cursor_x); /* FIXME: fit to the screen if we bump on the screen's edge */ - feedback_x = entry_x + cursor_x + entry_allocation->height / 2; /* cheap "half M-width" */ + /* cheap "half M-width", use height as approximation of character em-size */ + feedback_x = entry_x + cursor_x + entry_allocation->height / 2; feedback_y = entry_y + (entry_allocation->height - feedback_req.height) / 2; gtk_window_move (GTK_WINDOW (chooser_entry->completion_feedback_window), feedback_x, feedback_y); @@ -1216,8 +1219,8 @@ start_explicit_completion (GtkFileChooserEntry *chooser_entry) } static gboolean -gtk_file_chooser_entry_focus (GtkWidget *widget, - GtkDirectionType direction) +gtk_file_chooser_entry_key_press_event (GtkWidget *widget, + GdkEventKey *event) { GtkFileChooserEntry *chooser_entry; GtkEditable *editable; @@ -1230,7 +1233,7 @@ gtk_file_chooser_entry_focus (GtkWidget *widget, entry = GTK_ENTRY (widget); if (!chooser_entry->eat_tabs) - return GTK_WIDGET_CLASS (_gtk_file_chooser_entry_parent_class)->focus (widget, direction); + return GTK_WIDGET_CLASS (_gtk_file_chooser_entry_parent_class)->key_press_event (widget, event); control_pressed = FALSE; @@ -1242,9 +1245,7 @@ gtk_file_chooser_entry_focus (GtkWidget *widget, /* This is a bit evil -- it makes Tab never leave the entry. It basically * makes it 'safe' for people to hit. */ - if ((direction == GTK_DIR_TAB_FORWARD) && - (gtk_widget_has_focus (widget)) && - (! control_pressed)) + if (event->keyval == GDK_Tab && !control_pressed) { if (chooser_entry->has_completion) gtk_editable_set_position (editable, gtk_entry_get_text_length (entry)); @@ -1252,9 +1253,10 @@ gtk_file_chooser_entry_focus (GtkWidget *widget, start_explicit_completion (chooser_entry); return TRUE; - } - else - return GTK_WIDGET_CLASS (_gtk_file_chooser_entry_parent_class)->focus (widget, direction); + } + + return GTK_WIDGET_CLASS (_gtk_file_chooser_entry_parent_class)->key_press_event (widget, event); + } static gboolean