]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix comparison of current values for the key-sequence :type
authorMauro Aranda <maurooaranda@gmail.com>
Sat, 15 Feb 2025 12:26:46 +0000 (09:26 -0300)
committerEshel Yaron <me@eshelyaron.com>
Sun, 23 Feb 2025 08:21:18 +0000 (09:21 +0100)
* lisp/cus-edit.el (custom-variable-modified-p): Round-trip
the option value before comparing it against the widget's value.
This mostly fixes comparison against the obsolete key-sequence
widget, but could fix other corner cases, when the widget
accepts different types as values.  (Bug#76156)

* test/lisp/cus-edit-tests.el (cus-edit-test-bug76156)
(cus-edit-test-bug76156-2): New test options.
(cus-edit-test-unedited-option): New test.

(cherry picked from commit f549cedaa2721bfc463fe714c00016aed21f7b5c)

lisp/cus-edit.el
test/lisp/cus-edit-tests.el

index 16985fb44d7a1a73cebca417c7480bda8b8bd330..1bdc5a287d6ee6f195e2c8b3a14fd7d0e6f4240a 100644 (file)
@@ -3105,11 +3105,18 @@ To check for other states, call `custom-variable-state'."
     (let* ((form (widget-get widget :custom-form))
            (symbol (widget-get widget :value))
            (get (or (get symbol 'custom-get) 'default-value))
-           (value (if (default-boundp symbol)
-                      (condition-case nil
-                          (funcall get symbol)
-                        (error (throw 'get-error t)))
-                    (symbol-value symbol)))
+           (value-widget (car (widget-get widget :children)))
+           ;; Round-trip the value, for the sake of widgets that accept
+           ;; values of different types (e.g., the obsolete key-sequence widget
+           ;; which takes either strings or vectors.  (Bug#76156)
+           (value
+            (widget-apply value-widget :value-to-external
+                          (widget-apply value-widget :value-to-internal
+                                        (if (default-boundp symbol)
+                                            (condition-case nil
+                                                (funcall get symbol)
+                                              (error (throw 'get-error t)))
+                                          (symbol-value symbol)))))
            (orig-value (widget-value (car (widget-get widget :children)))))
       (not (equal (if (memq form '(lisp mismatch))
                       ;; Mimic `custom-variable-value-create'.
index 2a122db9da9412a8a71580c91bc7e71eb1da7d5f..f898607ba266f5804f90c2d5ab2410785c8c9688 100644 (file)
   ;; No empty key/value pairs should show up.
   (should-not (search-forward "key" nil t)))
 
+(defcustom cus-edit-test-bug76156 "\C-c "
+  "Key-sequence option that might show up as EDITED even though it's not."
+  :type 'key-sequence)
+
+(defcustom cus-edit-test-bug76156-2 [(control ?z)]
+  "Key-sequence option that might show up as EDITED even though it's not."
+  :type 'key-sequence)
+
+(ert-deftest cus-edit-test-unedited-option ()
+  "Test that customizing unedited options doesn't show up as EDITED."
+  (dolist (option '(cus-edit-test-bug76156
+                    cus-edit-test-bug76156-2
+                    cus-edit-test-foo1))
+    (customize-option option)
+    (let ((widget (car custom-options)))
+      (should (eq (widget-get widget :custom-state) 'standard)))
+    (kill-buffer)))
+
 (provide 'cus-edit-tests)
 ;;; cus-edit-tests.el ends here