From: Lars Ingebrigtsen Date: Sun, 6 Sep 2020 17:04:00 +0000 (+0200) Subject: Use a popup menu for 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. --- diff --git a/lisp/net/eww.el b/lisp/net/eww.el index b720edc7fef..da71d469234 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -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