aboutsummaryrefslogtreecommitdiffstats
path: root/src/xfns.c
diff options
context:
space:
mode:
authorGerd Moellmann <[email protected]>2000-12-14 12:01:50 +0000
committerGerd Moellmann <[email protected]>2000-12-14 12:01:50 +0000
commit82bab41c67602d699de3b4dcc325f19ca1c1c874 (patch)
tree028d40219e156549000f5b56f79a7469fcc93522 /src/xfns.c
parentef0234c7558b7cf40270314bd7f2ce04eb8d72e2 (diff)
(Fx_backspace_delete_keys_p): New function.
(syms_of_xfns): Defsubr it.
Diffstat (limited to 'src/xfns.c')
-rw-r--r--src/xfns.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/xfns.c b/src/xfns.c
index b560c70c0d..04ef282a17 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -11059,6 +11059,68 @@ selection dialog's entry field, if MUSTMATCH is non-nil.")
/***********************************************************************
+ Keyboard
+ ***********************************************************************/
+
+#ifdef HAVE_XKBGETKEYBOARD
+#include <X11/XKBlib.h>
+#include <X11/keysym.h>
+#endif
+
+DEFUN ("x-backspace-delete-keys-p", Fx_backspace_delete_keys_p,
+ Sx_backspace_delete_keys_p, 0, 1, 0,
+ "Check if both Backspace and Delete keys are on the keyboard of FRAME.\n\
+FRAME nil means use the selected frame.\n\
+Value is t if we know that both keys are present, and are mapped to the\n\
+usual X keysyms.")
+ (frame)
+ Lisp_Object frame;
+{
+#ifdef HAVE_XKBGETKEYBOARD
+ XkbDescPtr kb;
+ struct frame *f = check_x_frame (frame);
+ Display *dpy = FRAME_X_DISPLAY (f);
+ Lisp_Object have_keys;
+
+ have_keys = Qnil;
+
+ BLOCK_INPUT;
+ kb = XkbGetKeyboard (dpy, XkbAllComponentsMask, XkbUseCoreKbd);
+ if (kb)
+ {
+ int delete_keycode = 0, backspace_keycode = 0, i;
+
+ for (i = kb->min_key_code;
+ (i < kb->max_key_code
+ && (delete_keycode == 0 || backspace_keycode == 0));
+ ++i)
+ {
+ /* The XKB symbolic key names can be seen most easily
+ in the PS file generated by `xkbprint -label name $DISPLAY'. */
+ if (bcmp ("DELE", kb->names->keys[i].name, 4) == 0)
+ delete_keycode = i;
+ else if (bcmp ("BKSP", kb->names->keys[i].name, 4) == 0)
+ backspace_keycode = i;
+ }
+
+ XkbFreeKeyboard (kb, XkbAllComponentsMask, True);
+
+ if (delete_keycode
+ && backspace_keycode
+ && XKeysymToKeycode (dpy, XK_Delete) == delete_keycode
+ && XKeysymToKeycode (dpy, XK_BackSpace) == backspace_keycode)
+ have_keys = Qt;
+ }
+ UNBLOCK_INPUT;
+ return have_keys;
+#else /* not HAVE_XKBGETKEYBOARD */
+ return Qnil;
+#endif /* not HAVE_XKBGETKEYBOARD */
+}
+
+
+
+/***********************************************************************
Initialization
***********************************************************************/
@@ -11326,7 +11388,8 @@ meaning don't clear the cache.");
defsubr (&Sx_display_list);
defsubr (&Sx_synchronize);
defsubr (&Sx_focus_frame);
-
+ defsubr (&Sx_backspace_delete_keys_p);
+
/* Setting callback functions for fontset handler. */
get_font_info_func = x_get_font_info;