From 888acfb7d384d41c86b4bb0dbbec40f131fb4e5f Mon Sep 17 00:00:00 2001
From: and3md <and3md@gmail.com>
Date: Thu, 21 Sep 2017 18:37:58 +0200
Subject: [PATCH] Add Platform.hasClipboardText() to speed up checking 
 clipboard.

---
 src/dlangui/platforms/android/androidapp.d | 6 ++++++
 src/dlangui/platforms/common/platform.d    | 2 ++
 src/dlangui/platforms/console/consoleapp.d | 6 ++++++
 src/dlangui/platforms/sdl/sdlapp.d         | 7 +++++--
 src/dlangui/platforms/windows/winapp.d     | 7 +++++++
 src/dlangui/platforms/x11/x11app.d         | 5 +++++
 6 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/dlangui/platforms/android/androidapp.d b/src/dlangui/platforms/android/androidapp.d
index ee908bd2..54217ae3 100644
--- a/src/dlangui/platforms/android/androidapp.d
+++ b/src/dlangui/platforms/android/androidapp.d
@@ -575,6 +575,12 @@ class AndroidPlatform : Platform {
 	}
 
 	protected dstring _clipboardText;
+
+    /// check has clipboard text
+    override bool hasClipboardText(bool mouseBuffer = false) {
+        return (_clipboardText.length > 0);
+    }
+
 	/// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
 	override dstring getClipboardText(bool mouseBuffer = false) {
 		return _clipboardText;
diff --git a/src/dlangui/platforms/common/platform.d b/src/dlangui/platforms/common/platform.d
index a263f337..0cb9a792 100644
--- a/src/dlangui/platforms/common/platform.d
+++ b/src/dlangui/platforms/common/platform.d
@@ -1823,6 +1823,8 @@ class Platform {
      * When returned from this method, application is shutting down.
      */
     abstract int enterMessageLoop();
+    /// check has clipboard text
+    abstract bool hasClipboardText(bool mouseBuffer = false);
     /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
     abstract dstring getClipboardText(bool mouseBuffer = false);
     /// sets text to clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
diff --git a/src/dlangui/platforms/console/consoleapp.d b/src/dlangui/platforms/console/consoleapp.d
index f4d03fb4..eb0c746c 100644
--- a/src/dlangui/platforms/console/consoleapp.d
+++ b/src/dlangui/platforms/console/consoleapp.d
@@ -240,6 +240,12 @@ class ConsolePlatform : Platform {
         return 0;
     }
     private dstring _clipboardText;
+
+    /// check has clipboard text
+    override bool hasClipboardText(bool mouseBuffer = false) {
+        return (_clipboardText.length > 0);
+    }
+
     /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
     override dstring getClipboardText(bool mouseBuffer = false) {
         return _clipboardText;
diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d
index 046b17cf..8d3d0aaa 100644
--- a/src/dlangui/platforms/sdl/sdlapp.d
+++ b/src/dlangui/platforms/sdl/sdlapp.d
@@ -1462,10 +1462,13 @@ class SDLPlatform : Platform {
         return 0;
     }
 
+    /// check has clipboard text
+    override bool hasClipboardText(bool mouseBuffer = false) {
+        return (SDL_HasClipboardText() == SDL_TRUE);
+    }
+
     /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
     override dstring getClipboardText(bool mouseBuffer = false) {
-        if (!SDL_HasClipboardText())
-            return ""d;
         char * txt = SDL_GetClipboardText();
         if (!txt)
             return ""d;
diff --git a/src/dlangui/platforms/windows/winapp.d b/src/dlangui/platforms/windows/winapp.d
index 0cf7013d..d586454a 100644
--- a/src/dlangui/platforms/windows/winapp.d
+++ b/src/dlangui/platforms/windows/winapp.d
@@ -1158,6 +1158,13 @@ class Win32Platform : Platform {
         _windowsToDestroy.length = 0;
     }
 
+    /// check has clipboard text
+    override bool hasClipboardText(bool mouseBuffer = false) {
+        if (mouseBuffer)
+            return false;
+        return IsClipboardFormatAvailable(CF_UNICODETEXT);
+    }
+
     /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
     override dstring getClipboardText(bool mouseBuffer = false) {
         dstring res = null;
diff --git a/src/dlangui/platforms/x11/x11app.d b/src/dlangui/platforms/x11/x11app.d
index 43402bce..28c584dc 100644
--- a/src/dlangui/platforms/x11/x11app.d
+++ b/src/dlangui/platforms/x11/x11app.d
@@ -1633,6 +1633,11 @@ class X11Platform : Platform {
         return 0;
     }
 
+    /// check has clipboard text
+    override bool hasClipboardText(bool mouseBuffer = false) {
+        return (localClipboardContent.length != 0);
+    }
+
     /// retrieves text from clipboard (when mouseBuffer == true, use mouse selection clipboard - under linux)
     override dstring getClipboardText(bool mouseBuffer = false) {
         return toUTF32(localClipboardContent);