summaryrefslogtreecommitdiff
path: root/gdk
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 /gdk
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 'gdk')
-rw-r--r--gdk/x11/gdkevents-x11.c20
-rw-r--r--gdk/x11/gdkkeys-x11.c6
-rw-r--r--gdk/x11/gdkmain-x11.c11
-rw-r--r--gdk/x11/gdkprivate-x11.h7
4 files changed, 43 insertions, 1 deletions
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index 0f590774c7..87ed392952 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -530,7 +530,7 @@ gdk_event_translate (GdkEvent *event,
case KeyPress:
/* Lookup the string corresponding to the given keysym.
*/
-
+
#ifdef USE_XIM
if (buf_len == 0)
{
@@ -613,6 +613,24 @@ gdk_event_translate (GdkEvent *event,
case KeyRelease:
/* Lookup the string corresponding to the given keysym.
*/
+
+ /* Emulate detectable auto-repeat by checking to see
+ * if the next event is a key press with the same
+ * keycode and timestamp, and if so, ignoring the event.
+ */
+
+ if (!_gdk_have_xkb_autorepeat && XPending (gdk_display))
+ {
+ XEvent next_event;
+
+ XPeekEvent (gdk_display, &next_event);
+
+ if (next_event.type == KeyPress &&
+ next_event.xkey.keycode == xevent->xkey.keycode &&
+ next_event.xkey.time == xevent->xkey.time)
+ break;
+ }
+
#ifdef USE_XIM
if (buf_len == 0)
{
diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c
index dc807d8494..8d8876a1ad 100644
--- a/gdk/x11/gdkkeys-x11.c
+++ b/gdk/x11/gdkkeys-x11.c
@@ -82,6 +82,12 @@ get_xkb (void)
}
#endif /* HAVE_XKB */
+/* Whether we were able to turn on detectable-autorepeat using
+ * XkbSetDetectableAutorepeat. If FALSE, we'll fall back
+ * to checking the next event with XPending().
+ */
+gboolean _gdk_have_xkb_autorepeat = FALSE;
+
static KeySym* keymap = NULL;
static gint keysyms_per_keycode = 0;
static XModifierKeymap* mod_keymap = NULL;
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c
index ff6fa309cc..76a1ab1915 100644
--- a/gdk/x11/gdkmain-x11.c
+++ b/gdk/x11/gdkmain-x11.c
@@ -214,12 +214,23 @@ _gdk_windowing_init_check (int argc, char **argv)
if (XkbQueryExtension (gdk_display, NULL, NULL, NULL,
&xkb_major, &xkb_minor))
{
+ Bool detectable_autorepeat_supported;
+
_gdk_use_xkb = TRUE;
XkbSelectEvents (gdk_display,
XkbUseCoreKbd,
XkbMapNotifyMask,
XkbMapNotifyMask);
+
+ XkbSetDetectableAutoRepeat (gdk_display,
+ True,
+ &detectable_autorepeat_supported);
+
+ GDK_NOTE (MISC, g_message ("Detectable autorepeat %s.",
+ detectable_autorepeat_supported ? "supported" : "not supported"));
+
+ _gdk_have_xkb_autorepeat = detectable_autorepeat_supported;
}
}
}
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index 0d03177fd3..24f7075c40 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -113,8 +113,15 @@ extern GdkWindow *gdk_xim_window; /* currently using Window */
/* Used to detect not-up-to-date keymap */
extern guint _gdk_keymap_serial;
+
#ifdef HAVE_XKB
extern gboolean _gdk_use_xkb;
#endif
+/* Whether we were able to turn on detectable-autorepeat using
+ * XkbSetDetectableAutorepeat. If FALSE, we'll fall back
+ * to checking the next event with XPending().
+ */
+extern gboolean _gdk_have_xkb_autorepeat;
+
#endif /* __GDK_PRIVATE_X11_H__ */