subtree(3p/exwm): bump exwm to upstream commit '56db521a'

This bumps us past EXWM 0.28, which has several major fixes.

Change-Id: Ie89997cc5d60f4e5aaedfe60368571420b7e4b9d
This commit is contained in:
Vincent Ambo 2023-10-09 10:12:07 +03:00
commit 5f53841a34
13 changed files with 453 additions and 307 deletions

View file

@ -1,6 +1,6 @@
;;; exwm-input.el --- Input Module for EXWM -*- lexical-binding: t -*-
;; Copyright (C) 2015-2021 Free Software Foundation, Inc.
;; Copyright (C) 2015-2023 Free Software Foundation, Inc.
;; Author: Chris Feng <chris.w.feng@gmail.com>
@ -45,9 +45,9 @@
(defcustom exwm-input-prefix-keys
'(?\C-x ?\C-u ?\C-h ?\M-x ?\M-` ?\M-& ?\M-:)
"List of prefix keys EXWM should forward to Emacs when in line-mode.
"List of prefix keys EXWM should forward to Emacs when in `line-mode'.
The point is to make keys like 'C-x C-f' forwarded to Emacs in line-mode.
The point is to make keys like 'C-x C-f' forwarded to Emacs in `line-mode'.
There is no need to add prefix keys for global/simulation keys or those
defined in `exwm-mode-map' here."
:type '(repeat key-sequence)
@ -87,7 +87,7 @@ defined in `exwm-mode-map' here."
value))))
(defcustom exwm-input-line-mode-passthrough nil
"Non-nil makes 'line-mode' forward all events to Emacs."
"Non-nil makes `line-mode' forward all events to Emacs."
:type 'boolean)
;; Input focus update requests should be accumulated for a short time
@ -115,13 +115,13 @@ defined in `exwm-mode-map' here."
(defvar exwm-input--local-simulation-keys nil
"Whether simulation keys are local.")
(defvar exwm-input--simulation-keys nil "Simulation keys in line-mode.")
(defvar exwm-input--simulation-keys nil "Simulation keys in `line-mode'.")
(defvar exwm-input--skip-buffer-list-update nil
"Skip the upcoming 'buffer-list-update'.")
"Skip the upcoming `buffer-list-update'.")
(defvar exwm-input--temp-line-mode nil
"Non-nil indicates it's in temporary line-mode for char-mode.")
"Non-nil indicates it's in temporary line-mode for `char-mode'.")
(defvar exwm-input--timestamp-atom nil)
@ -452,9 +452,12 @@ ARGS are additional arguments to CALLBACK."
(t
;; Replay this event by default.
(setq fake-last-command t)
(setq mode xcb:Allow:ReplayPointer))))
(when fake-last-command
(exwm-input--fake-last-command))
(setq mode xcb:Allow:ReplayPointer)))
(when fake-last-command
(if buffer
(with-current-buffer buffer
(exwm-input--fake-last-command))
(exwm-input--fake-last-command))))
(xcb:+request exwm--connection
(make-instance 'xcb:AllowEvents :mode mode :time xcb:Time:CurrentTime))
(xcb:flush exwm--connection))
@ -584,9 +587,11 @@ instead."
(and (= emacs-major-version 26)
(< emacs-minor-version 2)))
(defsubst exwm-input--unread-event (event)
(declare (indent defun))
(setq unread-command-events
(append unread-command-events (list event))))
(defsubst exwm-input--unread-event (event)
(declare (indent defun))
(setq unread-command-events
(append unread-command-events `((t . ,event)))))))
@ -663,8 +668,26 @@ Current buffer must be an `exwm-mode' buffer."
(defun exwm-input--fake-last-command ()
"Fool some packages into thinking there is a change in the buffer."
(setq last-command #'exwm-input--noop)
(run-hooks 'pre-command-hook)
(run-hooks 'post-command-hook))
;; The Emacs manual says:
;; > Quitting is suppressed while running pre-command-hook and
;; > post-command-hook. If an error happens while executing one of these
;; > hooks, it does not terminate execution of the hook; instead the error is
;; > silenced and the function in which the error occurred is removed from the
;; > hook.
;; We supress errors but neither continue execution nor we remove from the
;; hook.
(condition-case err
(run-hooks 'pre-command-hook)
((error)
(exwm--log "Error occurred while running pre-command-hook: %s"
(error-message-string err))
(xcb-debug:backtrace)))
(condition-case err
(run-hooks 'post-command-hook)
((error)
(exwm--log "Error occurred while running post-command-hook: %s"
(error-message-string err))
(xcb-debug:backtrace))))
(defun exwm-input--on-KeyPress-line-mode (key-press raw-data)
"Parse X KeyPress event to Emacs key event and then feed the command loop."
@ -708,7 +731,7 @@ Current buffer must be an `exwm-mode' buffer."
(xcb:flush exwm--connection))))
(defun exwm-input--on-KeyPress-char-mode (key-press &optional _raw-data)
"Handle KeyPress event in char-mode."
"Handle KeyPress event in `char-mode'."
(with-slots (detail state) key-press
(let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
event raw-event)
@ -749,7 +772,7 @@ button event."
xcb:Allow:ReplayPointer))))
(defun exwm-input--on-ButtonPress-char-mode ()
"Handle button events in char-mode.
"Handle button events in `char-mode'.
The return value is used as event_mode to release the original
button event."
(exwm--log)
@ -825,7 +848,7 @@ button event."
;;;###autoload
(defun exwm-input-grab-keyboard (&optional id)
"Switch to line-mode."
"Switch to `line-mode'."
(interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer)))))
(when id
@ -836,7 +859,7 @@ button event."
;;;###autoload
(defun exwm-input-release-keyboard (&optional id)
"Switch to char-mode."
"Switch to `char-mode`."
(interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer)))))
(when id
@ -847,7 +870,7 @@ button event."
;;;###autoload
(defun exwm-input-toggle-keyboard (&optional id)
"Toggle between 'line-mode' and 'char-mode'."
"Toggle between `line-mode' and `char-mode'."
(interactive (list (when (derived-mode-p 'exwm-mode)
(exwm--buffer->id (window-buffer)))))
(when id
@ -964,7 +987,7 @@ multiple keys. If END-KEY is non-nil, stop sending keys if it's pressed."
It is an alist of the form (original-key . simulated-key), where both
original-key and simulated-key are key sequences. Original-key is what you
type to an X window in line-mode which then gets translated to simulated-key
type to an X window in `line-mode' which then gets translated to simulated-key
by EXWM and forwarded to the X window.
Notes:
@ -1075,7 +1098,7 @@ where both ORIGINAL-KEY and SIMULATED-KEY are key sequences."
(defmacro exwm-input-invoke-factory (keys)
"Make a command that invokes KEYS when called.
One use is to access the keymap bound to KEYS (as prefix keys) in char-mode."
One use is to access the keymap bound to KEYS (as prefix keys) in `char-mode'."
(let* ((keys (kbd keys))
(description (key-description keys)))
`(defun ,(intern (concat "exwm-input--invoke--" description)) ()
@ -1215,12 +1238,13 @@ One use is to access the keymap bound to KEYS (as prefix keys) in char-mode."
(when exwm-input--update-focus-timer
(cancel-timer exwm-input--update-focus-timer))
;; Make input focus working even without a WM.
(xcb:+request exwm--connection
(make-instance 'xcb:SetInputFocus
:revert-to xcb:InputFocus:PointerRoot
:focus exwm--root
:time xcb:Time:CurrentTime))
(xcb:flush exwm--connection))
(when (slot-value exwm--connection 'connected)
(xcb:+request exwm--connection
(make-instance 'xcb:SetInputFocus
:revert-to xcb:InputFocus:PointerRoot
:focus exwm--root
:time xcb:Time:CurrentTime))
(xcb:flush exwm--connection)))