Add xwidget-webkit-edit-mode to make using the WebKit browser easier

* doc/emacs/misc.texi: Document changes.
* etc/NEWS: Document recent changes.
* lisp/xwidget.el (xwidget-webkit-pass-command-event): New variable.
* lisp/xwidget.el (xwidget-perform-lispy-event): New function
declaration.
* lisp/xwidget.el (xwidget-webkit-edit-mode): New minor mode.
This commit is contained in:
Po Lu 2021-11-05 14:47:26 +08:00 committed by Lars Ingebrigtsen
parent b48a89fd2e
commit 6ed7454f17
3 changed files with 69 additions and 0 deletions

View file

@ -2953,6 +2953,14 @@ one-key commands for scrolling the widget, changing its size, and
reloading it. Type @w{@kbd{C-h b}} in that buffer to see the key
bindings.
@findex xwidget-webkit-edit-mode
@cindex xwidget-webkit-edit-mode
By default, typing a self-inserting character inside an xwidget
webkit buffer will do nothing, or trigger some special action. To
make those characters and other common editing keys insert themselves
when pressed, you can enable @code{xwidget-webkit-edit-mode}, which
redefines them to be passed through to the WebKit xwidget.
@node Browse-URL
@subsection Following URLs
@cindex World Wide Web

View file

@ -495,6 +495,13 @@ the buffer will take you to that directory.
This is a convenience function to extract the field data from
'exif-parse-file' and 'exif-parse-buffer'.
** Xwidgets
*** New minor mode `xwidget-webkit-edit-mode'.
When this mode is enabled, self-inserting characters and other common
web browser shotcut keys are redefined to send themselves to the
WebKit widget.
* New Modes and Packages in Emacs 29.1
@ -719,6 +726,14 @@ an exact match, then the lowercased '[menu-bar foo\ bar]' and finally
'[menu-bar foo-bar]'. This further improves backwards-compatibility
when converting menus to use 'easy-menu-define'.
+++
** New function `xwidget-perform-lispy-event'.
This function allows you to send events to xwidgets. Usually, some
equivalent of the event will be sent, but there is no guarantee of
what the widget will actually receive.
On GTK+, only key and function key events are implemented.
* Changes in Emacs 29.1 on Non-Free Operating Systems

View file

@ -124,6 +124,14 @@ in `split-window-right' with a new xwidget webkit session."
(with-selected-window (split-window-right)
(xwidget-webkit-new-session url))))
(declare-function xwidget-perform-lispy-event "xwidget.c")
(defun xwidget-webkit-pass-command-event ()
"Pass `last-command-event' to the current buffer's WebKit widget."
(interactive)
(xwidget-perform-lispy-event (xwidget-webkit-current-session)
last-command-event))
;;todo.
;; - check that the webkit support is compiled in
(defvar xwidget-webkit-mode-map
@ -684,6 +692,44 @@ You can retrieve the value with `xwidget-get'."
(set-xwidget-plist xwidget
(plist-put (xwidget-plist xwidget) propname value)))
(defvar xwidget-webkit-edit-mode-map (make-keymap))
(define-key xwidget-webkit-edit-mode-map [backspace] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [tab] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [left] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [right] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [up] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [down] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [return] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [C-left] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [C-right] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [C-up] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [C-down] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [C-return] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [S-left] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [S-right] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [S-up] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [S-down] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [S-return] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [M-left] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [M-right] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [M-up] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [M-down] 'xwidget-webkit-pass-command-event)
(define-key xwidget-webkit-edit-mode-map [M-return] 'xwidget-webkit-pass-command-event)
(define-minor-mode xwidget-webkit-edit-mode
"Minor mode for editing the content of WebKit buffers.
This defines most self-inserting characters and some common
keyboard shortcuts to `xwidget-webkit-pass-command-event', which
will pass the key events corresponding to these characters to the
WebKit widget."
:keymap xwidget-webkit-edit-mode-map)
(substitute-key-definition 'self-insert-command
'xwidget-webkit-pass-command-event
xwidget-webkit-edit-mode-map
global-map)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;