diff options
author | Owen Taylor <otaylor@redhat.com> | 2001-03-03 21:34:19 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2001-03-03 21:34:19 +0000 |
commit | 445e90fa82b1ccccde303754725b0248bb07b622 (patch) | |
tree | b586e8381c7a85d3c3e4ea236c29772874950aec /gtk | |
parent | a859fa13aff7c2ceb848847d58eedf2cfafef54c (diff) | |
download | gtk+-445e90fa82b1ccccde303754725b0248bb07b622.tar.gz |
Detectable auto-repeat - make a repeating key generate
Sat Mar 3 16:26:33 2001 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkmain-x11.c gdk/x11/gdkkeys-x11.c
gdk/x11/gdkevents-x11.c gdk/x11/gdkprivate-x11.c:
Detectable auto-repeat - make a repeating key generate
press/press/press/release instead of press/release pairs.
If we have Xkb and XkbSetDectableAutoRepeat supports
that, we do it that way. Otherwise, when we get
a release event, we check ahead with XPending to see
if the next key is a KeyPress with the same keycode
and timestamp. (Not 100% reliable, but pretty close.)
Tue Feb 27 02:16:14 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtkmain.c (gtk_propagate_event): Only do special
special key-press grab handling for widgets within
GtkWindows. Otherwise, fall through to normal case.
This prevents key events being sent twice to GtkInvisible
widgets, which can cause all sorts of mischief.
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkmain.c | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 0689427e5a..f8801cc1b8 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1509,6 +1509,8 @@ gtk_propagate_event (GtkWidget *widget, handled_event = FALSE; + gtk_widget_ref (widget); + if ((event->type == GDK_KEY_PRESS) || (event->type == GDK_KEY_RELEASE)) { @@ -1520,29 +1522,53 @@ gtk_propagate_event (GtkWidget *widget, GtkWidget *window; window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW); - if (window) - { - if (GTK_WIDGET_IS_SENSITIVE (window)) - gtk_widget_event (window, event); - handled_event = TRUE; /* don't send to widget */ - } + if (window) + { + /* If there is a grab within the window, give the grab widget + * a first crack at the key event + */ + if (widget != window && GTK_WIDGET_HAS_GRAB (widget)) + handled_event = gtk_widget_event (widget, event); + + if (!handled_event) + { + window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW); + if (window) + { + if (GTK_WIDGET_IS_SENSITIVE (window)) + gtk_widget_event (window, event); + } + } + + handled_event = TRUE; /* don't send to widget */ + } } /* Other events get propagated up the widget tree * so that parents can see the button and motion * events of the children. */ - while (!handled_event && widget) + if (!handled_event) { - GtkWidget *tmp; + while (TRUE) + { + GtkWidget *tmp; + + handled_event = !GTK_WIDGET_IS_SENSITIVE (widget) || gtk_widget_event (widget, event); + tmp = widget->parent; + gtk_widget_unref (widget); - gtk_widget_ref (widget); - handled_event = !GTK_WIDGET_IS_SENSITIVE (widget) || gtk_widget_event (widget, event); - tmp = widget->parent; - gtk_widget_unref (widget); - widget = tmp; + widget = tmp; + + if (!handled_event && widget) + gtk_widget_ref (widget); + else + break; + } } + else + gtk_widget_unref (widget); } #if 0 |