emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/xelb 801ab28 3/3: Fix Emacs event to KEYSYM conversion


From: Chris Feng
Subject: [elpa] externals/xelb 801ab28 3/3: Fix Emacs event to KEYSYM conversion
Date: Mon, 5 Aug 2019 11:51:48 -0400 (EDT)

branch: externals/xelb
commit 801ab287616c252e00bb8e06ca12a607a2c08bc6
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>

    Fix Emacs event to KEYSYM conversion
    
    * xcb-keysyms.el (xcb:keysyms:keycode->keysym): Now support probing
    modifier keys.
    (xcb:keysyms:event->keysyms): New method returns all possible
    KEYSYM-MODIFIERS combinations capable of generating an Emacs event.
    (xcb:keysyms:event->keysym): Now return the first result of
    `xcb:keysyms:event->keysyms' (kept for backward compatibility).
---
 xcb-keysyms.el | 89 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 58 insertions(+), 31 deletions(-)

diff --git a/xcb-keysyms.el b/xcb-keysyms.el
index 417bc21..af4f97b 100644
--- a/xcb-keysyms.el
+++ b/xcb-keysyms.el
@@ -371,9 +371,14 @@ FIRST-KEYCODE and COUNT specify the keycode range to 
update."
 
 (cl-defmethod xcb:keysyms:keycode->keysym ((obj xcb:connection) keycode
                                            modifiers)
-  "Convert keycode to (keysym . mod-mask).
+  "Convert KEYCODE to keysym or get possible modifier combinations for keycode.
 
-Return (0 . 0) when conversion fails."
+If MODIFIERS is non-nil, return (KEYSYM . CONSUMED-MODIFIERS) where
+CONSUMED-MODIFIERS should be lognot'ed with MODIFIERS so as to make further
+conversion correct.  (0 . 0) is returned when conversion fails.
+
+If MODIFIERS is nil, return all possible modifier combinations for this
+keycode.  The caller is responsible for checking which modifiers to use."
   (let ((preserve 0)
         group group-info group-number index keytype)
     (with-slots (keytypes keycodes min-keycode max-keycode)
@@ -390,7 +395,9 @@ Return (0 . 0) when conversion fails."
         ;; Check group number.
         (when (= group-number 0)
           (throw 'return '(0 . 0)))
-        (setq group (logand (lsh modifiers -13) #b11)) ;The 13, 14 bits.
+        (setq group (if (null modifiers)
+                        0
+                      (logand (lsh modifiers -13) #b11))) ;The 13, 14 bits.
         ;; Wrap group.
         (when (>= group group-number)
           (pcase (logand group-info #xC0) ;See <XKBstr.h>.
@@ -408,23 +415,28 @@ Return (0 . 0) when conversion fails."
         ;; Get key type.
         (setq keytype (aref keytypes
                             (elt (slot-value keycode 'kt-index) group)))
-        ;; Find the shift level and preserved modifiers.
         (with-slots (mods-mask hasPreserve map (preserve* preserve)) keytype
-          (catch 'break
-            (dolist (entry map)
-              (with-slots (active (mods-mask* mods-mask) level) entry
-                (when (and (= 1 active)
-                           (= (logand modifiers mods-mask) mods-mask*))
-                  (cl-incf index level)
-                  (when (= 1 hasPreserve)
-                    (setq preserve (slot-value (elt preserve*
-                                                    (cl-position entry map))
-                                               'mask)))
-                  (throw 'break nil)))))
-          ;; FIXME: Use of preserved modifiers (e.g. capitalize the keysym
-          ;;        when LOCK is preserved)?
-          (cons (elt (slot-value keycode 'syms) index)
-                (logand mods-mask (lognot preserve))))))))
+          (if (null modifiers)
+              ;; Return all possible modifier combinations.
+              (delq nil
+                    (mapcar (lambda (entry)
+                              (when (= (slot-value entry 'active) 1)
+                                (slot-value entry 'mods-mask)))
+                            map))
+            ;; Find the shift level and preserved modifiers.
+            (catch 'break
+              (dolist (entry map)
+                (with-slots (active (mods-mask* mods-mask) level) entry
+                  (when (and (= 1 active)
+                             (= (logand modifiers mods-mask) mods-mask*))
+                    (cl-incf index level)
+                    (when (= 1 hasPreserve)
+                      (setq preserve (slot-value (elt preserve*
+                                                      (cl-position entry map))
+                                                 'mask)))
+                    (throw 'break nil)))))
+            (cons (elt (slot-value keycode 'syms) index)
+                  (logand mods-mask (lognot preserve)))))))))
 
 (cl-defmethod xcb:keysyms:keysym->keycode ((obj xcb:connection) keysym)
   "Convert keysym to (the first matching) keycode.
@@ -574,9 +586,13 @@ Return 0 if conversion fails."
   "Emacs event representations of XF86keysym (#x1008ff00 - #x1008ffff).")
 
 (cl-defmethod xcb:keysyms:event->keysym ((obj xcb:connection) event)
-  "Translate Emacs key event EVENT to (keysym . mod-mask).
+  (declare (obsolete nil "27"))
+  (car (xcb:keysyms:event->keysyms obj event)))
+
+(cl-defmethod xcb:keysyms:event->keysyms ((obj xcb:connection) event)
+  "Translate Emacs key event EVENT to list of (keysym . mod-mask).
 
-Return (0 . 0) when conversion fails."
+Return ((0 . 0)) when conversion fails."
   (let ((modifiers (event-modifiers event))
         (event (event-basic-type event))
         keysym)
@@ -626,14 +642,7 @@ Return (0 . 0) when conversion fails."
                                 (throw 'break key)))
                             x-keysym-table)))))))
     (if (not keysym)
-        '(0 . 0)
-      (let ((keycode (xcb:keysyms:keysym->keycode obj keysym))
-            keysym*)
-        (when (/= 0 keycode)
-          (setq keysym* (xcb:keysyms:keycode->keysym obj keycode 0))
-          (unless (= keysym (car keysym*))
-            ;; This keysym requires additional modifiers to input.
-            (push (cdr keysym*) modifiers))))
+        '((0 . 0))
       (when modifiers
         ;; Do transforms: * -> x-*-keysym -> xcb:keysyms:*-mask.
         (setq modifiers (mapcar (lambda (i)
@@ -674,8 +683,26 @@ Return (0 . 0) when conversion fails."
                                     (_
                                      ;; Include but not limit to: down.
                                      0)))
-                                modifiers)))
-      (cons keysym (apply #'logior modifiers)))))
+                                modifiers)
+              modifiers (apply #'logior modifiers)))
+      (let ((keycode (xcb:keysyms:keysym->keycode obj keysym))
+            extra-modifiers)
+        (when (/= 0 keycode)
+          (setq extra-modifiers (xcb:keysyms:keycode->keysym obj keycode nil)
+                ;; Always try without other modifier.
+                extra-modifiers (append '(0) extra-modifiers)
+                ;; Keep all modifiers helping convert keycode to this keysym.
+                extra-modifiers
+                (delq nil
+                      (mapcar (lambda (modifier)
+                                (when (= (car (xcb:keysyms:keycode->keysym
+                                               obj keycode modifier))
+                                         keysym)
+                                  modifier))
+                              extra-modifiers))))
+        (mapcar (lambda (extra-modifier)
+                  (cons keysym (logior (or modifiers 0) extra-modifier)))
+                extra-modifiers)))))
 
 (cl-defmethod xcb:keysyms:keysym->event ((_obj xcb:connection) keysym
                                          &optional mask allow-modifiers)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]