branch: externals/xelb
commit 39d4efb437dc2f68eb31fc8164648363cc113b8e
Author: Chris Feng <[email protected]>
Commit: Chris Feng <[email protected]>
Set XKB per-client flags
* xcb-keysyms.el (xcb:keysyms:-set-per-client-flags): New function for
setting XKB per-client flags (required for GrabKey and SendEvent).
(xcb:keysyms:init, xcb:keysyms:-on-NewKeyboardNotify): Use it.
---
xcb-keysyms.el | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/xcb-keysyms.el b/xcb-keysyms.el
index 290ecc2..e965683 100644
--- a/xcb-keysyms.el
+++ b/xcb-keysyms.el
@@ -80,6 +80,8 @@ This method must be called before using any other method in
this module."
;; Save the major opcode of XKB.
(setq xcb:keysyms:-opcode
(slot-value (xcb:get-extension-data obj 'xcb:xkb) 'major-opcode))
+ ;; Set per-client flags.
+ (xcb:keysyms:-set-per-client-flags obj xcb:xkb:ID:UseCoreKbd)
;; Update data.
(xcb:keysyms:-update-keytypes obj xcb:xkb:ID:UseCoreKbd)
(xcb:keysyms:-update-keycodes obj xcb:xkb:ID:UseCoreKbd)
@@ -111,6 +113,25 @@ This method must be called before using any other method
in this module."
:newKeyboardDetails new-keyboard)))
(xcb:flush obj))))
+(cl-defmethod xcb:keysyms:-set-per-client-flags ((obj xcb:connection) device)
+ "Set per-client flags."
+ (let ((per-client-flags (logior
+ ;; Instead of compatibility state.
+ xcb:xkb:PerClientFlag:GrabsUseXKBState
+ ;; Instead of grab state.
+ xcb:xkb:PerClientFlag:LookupStateWhenGrabbed
+ ;; Use XKB state in 'SendEvent'.
+ xcb:xkb:PerClientFlag:SendEventUsesXKBState)))
+ ;; The reply is not used.
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:xkb:PerClientFlags
+ :deviceSpec device
+ :change per-client-flags
+ :value per-client-flags
+ :ctrlsToChange 0
+ :autoCtrls 0
+ :autoCtrlsValues 0))))
+
(cl-defmethod xcb:keysyms:-on-NewKeyboardNotify ((obj xcb:connection) data)
"Handle 'NewKeyboardNotify' event."
(let ((obj1 (make-instance 'xcb:xkb:NewKeyboardNotify)))
@@ -131,6 +152,8 @@ This method must be called before using any other method in
this module."
;; (xcb:keysyms:-update-keytypes obj deviceID)
(xcb:keysyms:-update-keycodes obj deviceID)
(xcb:keysyms:-update-modkeys obj deviceID))
+ ;; Device changed; update the per-client flags and local data.
+ (xcb:keysyms:-set-per-client-flags obj deviceID)
(xcb:keysyms:-update-keytypes obj deviceID)
(xcb:keysyms:-update-keycodes obj deviceID)
(xcb:keysyms:-update-modkeys obj deviceID)))))