summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2001-03-03 21:34:19 +0000
committerOwen Taylor <otaylor@src.gnome.org>2001-03-03 21:34:19 +0000
commit445e90fa82b1ccccde303754725b0248bb07b622 (patch)
treeb586e8381c7a85d3c3e4ea236c29772874950aec /gtk
parenta859fa13aff7c2ceb848847d58eedf2cfafef54c (diff)
downloadgtk+-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.c52
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