From 16174d796f86fe31c4a20ece471bed10f23c229f Mon Sep 17 00:00:00 2001
From: Po Lu <luangruo@yahoo.com>
Date: Tue, 1 Feb 2022 02:03:05 +0000
Subject: [PATCH] Avoid extraneous selection querying if we own the selection

* lisp/select.el (gui--selection-value-internal): Return nil if
`gui-backend-selection-owner-p' on window systems where it is
reliable.
---
 lisp/select.el | 34 ++++++++++++++++++++--------------
 1 file changed, 20 insertions(+), 14 deletions(-)

diff --git a/lisp/select.el b/lisp/select.el
index 7f29f02dab9..420967c1b00 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -168,20 +168,26 @@ text/plain\\;charset=utf-8)."
 Call `gui-get-selection' with an appropriate DATA-TYPE argument
 decided by `x-select-request-type'.  The return value is already
 decoded.  If `gui-get-selection' signals an error, return nil."
-  (let ((request-type (if (memq window-system '(x pgtk))
-                          (or x-select-request-type
-                              '(UTF8_STRING COMPOUND_TEXT STRING text/plain\;charset=utf-8))
-                        'STRING))
-	text)
-    (with-demoted-errors "gui-get-selection: %S"
-      (if (consp request-type)
-          (while (and request-type (not text))
-            (setq text (gui-get-selection type (car request-type)))
-            (setq request-type (cdr request-type)))
-        (setq text (gui-get-selection type request-type))))
-    (if text
-	(remove-text-properties 0 (length text) '(foreign-selection nil) text))
-    text))
+  ;; The doc string of `interprogram-paste-function' says to return
+  ;; nil if no other program has provided text to paste.
+  (unless (and (memq window-system '(x haiku))
+               ;; gui-backend-selection-p might be unreliable on other
+               ;; window systems.
+               (gui-backend-selection-owner-p type))
+    (let ((request-type (if (memq window-system '(x pgtk))
+                            (or x-select-request-type
+                                '(UTF8_STRING COMPOUND_TEXT STRING text/plain\;charset=utf-8))
+                          'STRING))
+	  text)
+      (with-demoted-errors "gui-get-selection: %S"
+        (if (consp request-type)
+            (while (and request-type (not text))
+              (setq text (gui-get-selection type (car request-type)))
+              (setq request-type (cdr request-type)))
+          (setq text (gui-get-selection type request-type))))
+      (if text
+	  (remove-text-properties 0 (length text) '(foreign-selection nil) text))
+      text)))
 
 (defun gui-selection-value ()
   (let ((clip-text
-- 
2.39.5