]> git.eshelyaron.com Git - emacs.git/commitdiff
Use a popup menu for <select>s in eww
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 6 Sep 2020 17:04:00 +0000 (19:04 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 6 Sep 2020 17:04:00 +0000 (19:04 +0200)
* 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.

lisp/net/eww.el

index b720edc7fef929c6ff7c2339fdd64335841e5970..da71d469234d87719d8dbb8766f9253edf2f7d92 100644 (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