diff options
author | Chris Feng <chris.w.feng@gmail.com> | 2018-07-14T16·00+0800 |
---|---|---|
committer | Chris Feng <chris.w.feng@gmail.com> | 2018-07-14T16·00+0800 |
commit | 6be729847e78576df599cbf70512e3f9e436114b (patch) | |
tree | 99f1698476557d67e643a0e4db6fc11f7d66b005 /exwm-input.el | |
parent | 4bb2d87a8dbaeaabdd3a79550421f60222d0de3c (diff) |
Also send a WM_TAKE_FOCUS when setting focus with SetInputFocus
* exwm-input.el (exwm-input--set-focus): Send an extra WM_TAKE_FOCUS event to workaround the key replay issue with Xorg 1.20 when keyboard is grabbed.
Diffstat (limited to 'exwm-input.el')
-rw-r--r-- | exwm-input.el | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/exwm-input.el b/exwm-input.el index 153410828f00..55949aa1b29a 100644 --- a/exwm-input.el +++ b/exwm-input.el @@ -158,36 +158,27 @@ This value should always be overwritten.") "Set input focus to window ID in a proper way." (when (exwm--id->buffer id) (with-current-buffer (exwm--id->buffer id) - (cond - ((and (not exwm--hints-input) - (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols)) - (when (= (frame-parameter nil 'exwm-id) - (slot-value (xcb:+request-unchecked+reply exwm--connection - (make-instance 'xcb:GetInputFocus)) - 'focus)) - (exwm--log "Focus on #x%x with WM_TAKE_FOCUS" id) - (exwm-input--update-timestamp - (lambda (timestamp id) - (let ((event (make-instance 'xcb:icccm:WM_TAKE_FOCUS - :window id - :time timestamp))) - (setq event (xcb:marshal event exwm--connection)) - (xcb:+request exwm--connection - (make-instance 'xcb:icccm:SendEvent - :destination id - :event event)) - (exwm-input--set-active-window id) - (xcb:flush exwm--connection))) - id))) - (t - (exwm--log "Focus on #x%x with SetInputFocus" id) - (xcb:+request exwm--connection - (make-instance 'xcb:SetInputFocus - :revert-to xcb:InputFocus:Parent - :focus id - :time xcb:Time:CurrentTime)) - (exwm-input--set-active-window id) - (xcb:flush exwm--connection)))))) + (exwm-input--update-timestamp + (lambda (timestamp id send-input-focus) + (when send-input-focus + (xcb:+request exwm--connection + (make-instance 'xcb:SetInputFocus + :revert-to xcb:InputFocus:Parent + :focus id + :time timestamp))) + (let ((event (make-instance 'xcb:icccm:WM_TAKE_FOCUS + :window id + :time timestamp))) + (setq event (xcb:marshal event exwm--connection)) + (xcb:+request exwm--connection + (make-instance 'xcb:icccm:SendEvent + :destination id + :event event))) + (exwm-input--set-active-window id) + (xcb:flush exwm--connection)) + id + (or exwm--hints-input + (not (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols))))))) (defun exwm-input--update-timestamp (callback &rest args) "Fetch the latest timestamp from the server and feed it to CALLBACK. |