[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/exwm 981293f 44/64: Replay KeyPress events instead of f
From: |
Chris Feng |
Subject: |
[elpa] externals/exwm 981293f 44/64: Replay KeyPress events instead of fake them in line-mode |
Date: |
Thu, 17 Sep 2015 23:18:06 +0000 |
branch: externals/exwm
commit 981293f06af320f2929fd0d209eb97e63b4d8e3e
Author: Chris Feng <address@hidden>
Commit: Chris Feng <address@hidden>
Replay KeyPress events instead of fake them in line-mode
X windows in line-mode receive KeyPress events faked with SendEvent requests
previously. This causes many problems including:
* Some applications (e.g. xterm) ignore synthetic events completely
* KeyPress and KeyRelease evnets arrive disorderly
This commit makes EXWM exploiting AllowEvents requests (in ReplayKeyboard
mode)
to forward KeyPress events to X windows instead.
---
exwm-input.el | 77 +++++++++++++++++---------------------------------------
1 files changed, 24 insertions(+), 53 deletions(-)
diff --git a/exwm-input.el b/exwm-input.el
index 760e5c9..ede635c 100644
--- a/exwm-input.el
+++ b/exwm-input.el
@@ -241,61 +241,27 @@ It's updated in several occasions, and only used by
`exwm-input--set-focus'.")
(defvar exwm-input--temp-line-mode nil
"Non-nil indicates it's in temporary line-mode for char-mode.")
-;; ;; This implementation has a problem that it also releases queued keys after
-;; ;; requesting AllowEvent. The client window will capture unexpected key
events
-;; ;; in this case.
-;; ;; P.S.; to use this implementation, comment out the KeyRelease listener
-;; ;; together with this one and make GrabKey in Sync mode.
-;; (cl-defmethod exwm-input--on-KeyPress-line-mode ((obj xcb:KeyPress))
-;; "Parse X KeyPress event to Emacs key event and then feed the command
loop."
-;; (with-slots (detail state) obj
-;; (let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail
state))
-;; event window mode)
-;; (when (and keysym
-;; (setq event (xcb:keysyms:keysym->event keysym state))
-;; (or exwm-input--during-key-sequence
-;; (setq window (active-minibuffer-window))
-;; (eq event ?\C-c) ;mode-specific key
-;; (memq event exwm-input--global-prefix-keys)
-;; (memq event exwm-input-prefix-keys)
-;; (memq event
-;; exwm-input--simulation-prefix-keys)))
-;; (setq mode xcb:Allow:SyncKeyboard)
-;; (unless window (setq exwm-input--during-key-sequence t))
-;; (push event unread-command-events))
-;; (xcb:+request exwm--connection
-;; (make-instance 'xcb:AllowEvents
-;; :mode (or mode xcb:Allow:ReplayKeyboard)
-;; :time xcb:Time:CurrentTime))
-;; (xcb:flush exwm--connection))))
-
-;; This implementation has a drawback that some (legacy) applications
-;; (e.g. xterm) ignore the synthetic key events, making it only viable for EXWM
-;; to work in char-mode in such case.
(cl-defmethod exwm-input--on-KeyPress-line-mode ((obj xcb:KeyPress))
"Parse X KeyPress event to Emacs key event and then feed the command loop."
(with-slots (detail state) obj
(let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
- event minibuffer-window)
- (if (and keysym
- (setq event (xcb:keysyms:keysym->event keysym state))
- (or exwm-input--during-key-sequence
- (setq minibuffer-window (active-minibuffer-window))
- (eq event ?\C-c) ;mode-specific key
- (memq event exwm-input--global-prefix-keys)
- (memq event exwm-input-prefix-keys)
- (memq event exwm-input--simulation-prefix-keys)))
- ;; Forward key to Emacs frame
- (progn (unless minibuffer-window
- (setq exwm-input--during-key-sequence t))
- (push event unread-command-events))
- ;; Forward key to window
- (xcb:+request exwm--connection
- (make-instance 'xcb:SendEvent
- :propagate 0 :destination (slot-value obj 'event)
- :event-mask xcb:EventMask:NoEvent
- :event (xcb:marshal obj exwm--connection)))
- (xcb:flush exwm--connection)))))
+ event minibuffer-window mode)
+ (when (and keysym
+ (setq event (xcb:keysyms:keysym->event keysym state))
+ (or exwm-input--during-key-sequence
+ (setq minibuffer-window (active-minibuffer-window))
+ (eq event ?\C-c) ;mode-specific key
+ (memq event exwm-input--global-prefix-keys)
+ (memq event exwm-input-prefix-keys)
+ (memq event exwm-input--simulation-prefix-keys)))
+ (setq mode xcb:Allow:AsyncKeyboard)
+ (unless minibuffer-window (setq exwm-input--during-key-sequence t))
+ (push event unread-command-events))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:AllowEvents
+ :mode (or mode xcb:Allow:ReplayKeyboard)
+ :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection))))
(cl-defmethod exwm-input--on-KeyPress-char-mode ((obj xcb:KeyPress))
"Handle KeyPress event in char-mode."
@@ -307,7 +273,12 @@ It's updated in several occasions, and only used by
`exwm-input--set-focus'.")
(setq exwm-input--temp-line-mode t
exwm-input--during-key-sequence t)
(exwm-input--grab-keyboard)) ;grab keyboard temporarily
- (push event unread-command-events)))))
+ (push event unread-command-events))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:AllowEvents
+ :mode xcb:Allow:AsyncKeyboard
+ :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection))
(defun exwm-input--grab-keyboard (&optional id)
"Grab all key events on window ID."
@@ -319,7 +290,7 @@ It's updated in several occasions, and only used by
`exwm-input--set-focus'.")
:modifiers xcb:ModMask:Any
:key xcb:Grab:Any
:pointer-mode xcb:GrabMode:Async
- :keyboard-mode xcb:GrabMode:Async))
+ :keyboard-mode xcb:GrabMode:Sync))
(exwm--log "Failed to grab keyboard for #x%x" id))
(setq exwm--on-KeyPress 'exwm-input--on-KeyPress-line-mode)))
- [elpa] externals/exwm 04e4269 29/64: Improve input focus switch mechanism, (continued)
- [elpa] externals/exwm 04e4269 29/64: Improve input focus switch mechanism, Chris Feng, 2015/09/17
- [elpa] externals/exwm 7120291 38/64: Merge branch 'pipcet-robustness', Chris Feng, 2015/09/17
- [elpa] externals/exwm 5210e13 41/64: Only manage windows mapped as the direct children of root window (close #38), Chris Feng, 2015/09/17
- [elpa] externals/exwm 07e59e0 31/64: Fix multi-screen bugs, Chris Feng, 2015/09/17
- [elpa] externals/exwm d1806e9 37/64: Improve code robustness., Chris Feng, 2015/09/17
- [elpa] externals/exwm bb4ebde 46/64: Fix `exwm-workspace-rename-buffer`, Chris Feng, 2015/09/17
- [elpa] externals/exwm 94bdbfc 42/64: Avoid using the "no window manager" code in Emacs, Chris Feng, 2015/09/17
- [elpa] externals/exwm 874c383 43/64: Merge pull request #42 from pipcet/ewmh-fullscreen, Chris Feng, 2015/09/17
- [elpa] externals/exwm 5f9f673 47/64: Fix window size calculations, Chris Feng, 2015/09/17
- [elpa] externals/exwm 7032ee7 48/64: Re-enable complete refresh of keyboard mapping, Chris Feng, 2015/09/17
- [elpa] externals/exwm 981293f 44/64: Replay KeyPress events instead of fake them in line-mode,
Chris Feng <=
- [elpa] externals/exwm f7bec7a 51/64: Minor fix, Chris Feng, 2015/09/17
- [elpa] externals/exwm 5222dc1 49/64: Avoid deleting the frame created by Emacs client by accident, Chris Feng, 2015/09/17
- [elpa] externals/exwm f1d37b9 53/64: Ungrab pointer timely when resizing is aborted, Chris Feng, 2015/09/17
- [elpa] externals/exwm 76f4849 50/64: Drop intro to xelb-util, Chris Feng, 2015/09/17
- [elpa] externals/exwm 9eee94e 52/64: Merge pull request #52 from pipcet/minor-fix, Chris Feng, 2015/09/17
- [elpa] externals/exwm 637ac15 55/64: Code cleanups, Chris Feng, 2015/09/17
- [elpa] externals/exwm b50a6e6 45/64: Correct several EWMH properties, Chris Feng, 2015/09/17
- [elpa] externals/exwm 5373c1d 57/64: Add support for xcb:Atom:_NET_CLIENT_LIST_STACKING etc, Chris Feng, 2015/09/17
- [elpa] externals/exwm eafd031 56/64: Allow hide/show mode-line on floating frames, Chris Feng, 2015/09/17
- [elpa] externals/exwm 1d43515 59/64: Allow switch to normal buffers in exwm-workspace-switch-to-window, Chris Feng, 2015/09/17