Use a popup menu for <select>s in eww

* lisp/net/eww.el (eww-change-select): Use a popup menu for the
select (bug#43218).
(eww--form-items): New utility function.
(eww-select-map): Allow using a mouse to click on select buttons.
This commit is contained in:
Lars Ingebrigtsen 2020-09-06 19:04:00 +02:00
parent b2f41a8a18
commit 3444f397c7

View file

@ -1134,6 +1134,8 @@ just re-display the HTML already fetched."
(defvar eww-select-map
(let ((map (make-sparse-keymap)))
(define-key map "\r" 'eww-change-select)
(define-key map [follow-link] 'mouse-face)
(define-key map [mouse-2] 'eww-change-select)
(define-key map [(control c) (control c)] 'eww-submit)
map))
@ -1436,26 +1438,30 @@ See URL `https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input'.")
(setq display (plist-get (cdr elem) :display))))
display))
(defun eww-change-select ()
(defun eww--form-items (form)
(cl-loop for elem in form
when (and (consp elem)
(eq (car elem) 'item))
collect (cdr elem)))
(defun eww-change-select (event)
"Change the value of the select drop-down menu under point."
(interactive)
(let* ((input (get-text-property (point) 'eww-form))
(completion-ignore-case t)
(options
(delq nil
(mapcar (lambda (elem)
(and (consp elem)
(eq (car elem) 'item)
(cons (plist-get (cdr elem) :display)
(plist-get (cdr elem) :value))))
input)))
(display (completing-read "Change value: " options nil 'require-match))
(inhibit-read-only t))
;; If the user doesn't enter anything, don't change anything.
(when (> (length display) 0)
(plist-put input :value (cdr (assoc-string display options t)))
(goto-char
(eww-update-field display)))))
(interactive (list last-nonmenu-event))
(mouse-set-point event)
(let ((input (get-text-property (point) 'eww-form)))
(popup-menu
(cons
"Change Value"
(mapcar
(lambda (elem)
(vector (plist-get elem :display)
(lambda ()
(interactive)
(plist-put input :value (plist-get elem :value))
(goto-char (eww-update-field (plist-get elem :display))))
t))
(eww--form-items input)))
event)))
(defun eww-update-field (string &optional offset)
(unless offset