Subject: bug#60334: closed (Re: bug#60334: [PATCH] whitespace: Use `define-globalized-minor-mode' for global mode)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 31 Dec 2022 08:51:02 +0000

Your bug report

#60334: [PATCH] whitespace: Use `define-globalized-minor-mode' for global mode

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
60334: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=60334
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#60334: [PATCH] whitespace: Use `define-globalized-minor-mode' for global mode
From: Eli Zaretskii <[email-masked]>
To: Richard Hansen <[email-masked]>
Cc: [email-masked]
Date: Sat, 31 Dec 2022 10:49:55 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

> Date: Sat, 31 Dec 2022 03:29:43 -0500
> Cc: [email-masked]
> From: Richard Hansen <[email-masked]>
> 
> On 12/31/22 03:20, Eli Zaretskii wrote:
> > I tried to install this on master (it's too late for such changes on
> > the emacs-29 branch), but the patch failed to apply.  Could you please
> > rebase this on master and resubmit?
> 
> See attached.

Thanks, installed on master, and closing the bug.

Subject: [PATCH] whitespace: Use `define-globalized-minor-mode' for global mode
From: Richard Hansen <[email-masked]>
To: [email-masked]
Date: Mon, 26 Dec 2022 01:32:20 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

Attached patch:

     whitespace: Use `define-globalized-minor-mode' for global mode

     * lisp/whitespace.el (global-whitespace-mode): Fix interoperability
     between `whitespace-mode' and `global-whitespace-mode' by using
     `define-globalized-minor-mode'.
     * test/lisp/whitespace-tests.el (whitespace-tests--global): Add a
     regression test.

It would be nice to install this on emacs-29, but I'm OK with this going 
on master.
From 55b683aa6b821564ec235fb02b48bec6d9f9630a Mon Sep 17 00:00:00 2001
From: Richard Hansen <[email-masked]>
Date: Sat, 10 Dec 2022 00:57:15 -0500
Subject: [PATCH] whitespace: Use `define-globalized-minor-mode' for global
 mode

* lisp/whitespace.el (global-whitespace-mode): Fix interoperability
between `whitespace-mode' and `global-whitespace-mode' by using
`define-globalized-minor-mode'.
* test/lisp/whitespace-tests.el (whitespace-tests--global): Add a
regression test.
---
 lisp/whitespace.el            | 35 ++++++-----------------------------
 test/lisp/whitespace-tests.el | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 29 deletions(-)

diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index bc9d4b7998..3dc4771da2 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -1014,34 +1014,11 @@ whitespace-newline-mode

 ;;;###autoload
-(define-minor-mode global-whitespace-mode
-  "Toggle whitespace visualization globally (Global Whitespace mode).
-
-See also `whitespace-style', `whitespace-newline' and
-`whitespace-display-mappings'."
-  :lighter    " WS"
+(define-globalized-minor-mode global-whitespace-mode
+  whitespace-mode
+  whitespace-turn-on-if-enabled
   :init-value nil
-  :global     t
-  :group      'whitespace
-  (cond
-   (noninteractive			; running a batch job
-    (setq global-whitespace-mode nil))
-   (global-whitespace-mode		; global-whitespace-mode on
-    (save-current-buffer
-      (add-hook 'find-file-hook 'whitespace-turn-on-if-enabled)
-      (add-hook 'after-change-major-mode-hook 'whitespace-turn-on-if-enabled)
-      (dolist (buffer (buffer-list))	; adjust all local mode
-	(set-buffer buffer)
-	(unless whitespace-mode
-	  (whitespace-turn-on-if-enabled)))))
-   (t					; global-whitespace-mode off
-    (save-current-buffer
-      (remove-hook 'find-file-hook 'whitespace-turn-on-if-enabled)
-      (remove-hook 'after-change-major-mode-hook 'whitespace-turn-on-if-enabled)
-      (dolist (buffer (buffer-list))	; adjust all local mode
-	(set-buffer buffer)
-	(unless whitespace-mode
-	  (whitespace-turn-off)))))))
+  :group 'whitespace)
 
 (defvar whitespace-enable-predicate
   (lambda ()
@@ -1067,7 +1044,7 @@ whitespace-enable-predicate
 
 (defun whitespace-turn-on-if-enabled ()
   (when (funcall whitespace-enable-predicate)
-    (whitespace-turn-on)))
+    (whitespace-mode)))
 
 ;;;###autoload
 (define-minor-mode global-whitespace-newline-mode
@@ -2559,7 +2536,7 @@ whitespace-display-char-on
 	(setq whitespace-display-table-was-local t)
         ;; Save the old table so we can restore it when
         ;; `whitespace-mode' is switched off again.
-        (when (or whitespace-mode global-whitespace-mode)
+        (when whitespace-mode
 	  (setq whitespace-display-table
 	        (copy-sequence buffer-display-table)))
 	;; Assure `buffer-display-table' is unique
diff --git a/test/lisp/whitespace-tests.el b/test/lisp/whitespace-tests.el
index 513328f5c7..e93d7ec92b 100644
--- a/test/lisp/whitespace-tests.el
+++ b/test/lisp/whitespace-tests.el
@@ -57,6 +57,24 @@ whitespace-tests--cleanup-string
     (whitespace-cleanup)
     (buffer-string)))
 
+(ert-deftest whitespace-tests--global ()
+  (let ((backup global-whitespace-mode)
+        (noninteractive nil)
+        (whitespace-enable-predicate (lambda () t)))
+    (unwind-protect
+        (progn
+          (global-whitespace-mode 1)
+          (ert-with-test-buffer-selected ()
+            (normal-mode)
+            (should whitespace-mode)
+            (global-whitespace-mode -1)
+            (should (null whitespace-mode))
+            (whitespace-mode 1)
+            (should whitespace-mode)
+            (global-whitespace-mode 1)
+            (should whitespace-mode)))
+      (global-whitespace-mode (if backup 1 -1)))))
+
 (ert-deftest whitespace-tests--clear-markers ()
   (whitespace-tests--with-test-buffer '(face empty)
     (whitespace-mode -1)
-- 
2.39.0