aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/platform/sdl/sdl.cpp32
-rw-r--r--backends/platform/sdl/sdl.h6
-rw-r--r--common/system.h32
-rw-r--r--gui/storagewizarddialog.cpp52
-rw-r--r--gui/widgets/editable.cpp35
5 files changed, 99 insertions, 58 deletions
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index 9f7b29233d..6862bb349f 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -64,6 +64,11 @@
#include <SDL/SDL_net.h>
#endif
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_clipboard.h>
+#endif
+
OSystem_SDL::OSystem_SDL()
:
#ifdef USE_OPENGL
@@ -171,6 +176,13 @@ void OSystem_SDL::init() {
}
+bool OSystem_SDL::hasFeature(Feature f) {
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ if (f == kFeatureClipboardSupport) return true;
+#endif
+ return ModularBackend::hasFeature(f);
+}
+
void OSystem_SDL::initBackend() {
// Check if backend has not been initialized
assert(!_inited);
@@ -453,6 +465,26 @@ Common::String OSystem_SDL::getSystemLanguage() const {
#endif // USE_DETECTLANG
}
+bool OSystem_SDL::hasTextInClipboard() {
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ return SDL_HasClipboardText() == SDL_TRUE;
+#else
+ return false;
+#endif
+}
+
+Common::String OSystem_SDL::getTextFromClipboard() {
+ if (!hasTextInClipboard()) return "";
+
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+ char *text = SDL_GetClipboardText();
+ if (text == nullptr) return "";
+ return text;
+#else
+ return "";
+#endif
+}
+
uint32 OSystem_SDL::getMillis(bool skipRecord) {
uint32 millis = SDL_GetTicks();
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index f440cd77bb..17b4e9b001 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -55,6 +55,8 @@ public:
*/
virtual SdlMixerManager *getMixerManager();
+ virtual bool hasFeature(Feature f);
+
// Override functions from ModularBackend and OSystem
virtual void initBackend();
#if defined(USE_TASKBAR)
@@ -69,6 +71,10 @@ public:
virtual Common::String getSystemLanguage() const;
+ // Clipboard
+ virtual bool hasTextInClipboard();
+ virtual Common::String getTextFromClipboard();
+
virtual void setWindowCaption(const char *caption);
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0);
virtual uint32 getMillis(bool skipRecord = false);
diff --git a/common/system.h b/common/system.h
index 3cbeee7d82..805eba68ed 100644
--- a/common/system.h
+++ b/common/system.h
@@ -314,7 +314,15 @@ public:
*
* This feature has no associated state.
*/
- kFeatureDisplayLogFile
+ kFeatureDisplayLogFile,
+
+ /**
+ * The presence of this feature indicates whether the hasTextInClipboard()
+ * and getTextFromClipboard() calls are supported.
+ *
+ * This feature has no associated state.
+ */
+ kFeatureClipboardSupport
};
/**
@@ -1239,6 +1247,28 @@ public:
virtual bool displayLogFile() { return false; }
/**
+ * Returns whether there is text available in the clipboard.
+ *
+ * The kFeatureClipboardSupport feature flag can be used to
+ * test whether this call has been implemented by the active
+ * backend.
+ *
+ * @return true if there is text in the clipboard, false otherwise
+ */
+ virtual bool hasTextInClipboard() { return false; }
+
+ /**
+ * Returns clipboard contents as a String.
+ *
+ * The kFeatureClipboardSupport feature flag can be used to
+ * test whether this call has been implemented by the active
+ * backend.
+ *
+ * @return clipboard contents ("" if hasTextInClipboard() == false)
+ */
+ virtual Common::String getTextFromClipboard() { return ""; }
+
+ /**
* Returns the locale of the system.
*
* This returns the currently set up locale of the system, on which
diff --git a/gui/storagewizarddialog.cpp b/gui/storagewizarddialog.cpp
index 6d0c504521..dd1a3aae37 100644
--- a/gui/storagewizarddialog.cpp
+++ b/gui/storagewizarddialog.cpp
@@ -20,13 +20,6 @@
*
*/
-#ifdef USE_SDL2
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_clipboard.h>
-#endif
-
#include "gui/storagewizarddialog.h"
#include "gui/gui-manager.h"
#include "gui/message.h"
@@ -217,32 +210,27 @@ void StorageWizardDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3
break;
}
case kPasteCodeCmd: {
-#ifdef USE_SDL2
- if (SDL_HasClipboardText() == SDL_TRUE) {
- char *text = SDL_GetClipboardText();
- if (text != nullptr) {
- Common::String message = text;
- for (uint32 i = 0; i < CODE_FIELDS; ++i) {
- if (message.empty()) break;
- Common::String subcode = "";
- for (uint32 j = 0; j < message.size(); ++j) {
- if (message[j] == ' ') {
- message.erase(0, j+1);
- break;
- }
- subcode += message[j];
- if (j+1 == message.size()) {
- message = "";
- break;
- }
+ if (g_system->hasTextInClipboard()) {
+ Common::String message = g_system->getTextFromClipboard();
+ for (uint32 i = 0; i < CODE_FIELDS; ++i) {
+ if (message.empty()) break;
+ Common::String subcode = "";
+ for (uint32 j = 0; j < message.size(); ++j) {
+ if (message[j] == ' ') {
+ message.erase(0, j+1);
+ break;
+ }
+ subcode += message[j];
+ if (j+1 == message.size()) {
+ message = "";
+ break;
}
- _codeWidget[i]->setEditString(subcode);
}
- handleCommand(sender, kCodeBoxCmd, data);
- draw();
+ _codeWidget[i]->setEditString(subcode);
}
+ handleCommand(sender, kCodeBoxCmd, data);
+ draw();
}
-#endif
break;
}
case kConnectCmd: {
@@ -302,11 +290,7 @@ void StorageWizardDialog::containerWidgetsReflow() {
}
if (_openUrlWidget) _openUrlWidget->setVisible(true);
if (_pasteCodeWidget) {
-#ifdef USE_SDL2
- bool visible = showFields;
-#else
- bool visible = false;
-#endif
+ bool visible = showFields && g_system->hasFeature(OSystem::kFeatureClipboardSupport);
_pasteCodeWidget->setVisible(visible);
}
diff --git a/gui/widgets/editable.cpp b/gui/widgets/editable.cpp
index 6c63074fd1..02defe9a56 100644
--- a/gui/widgets/editable.cpp
+++ b/gui/widgets/editable.cpp
@@ -20,13 +20,6 @@
*
*/
-#ifdef USE_SDL2
-#define FORBIDDEN_SYMBOL_ALLOW_ALL
-
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_clipboard.h>
-#endif
-
#include "common/rect.h"
#include "common/system.h"
#include "gui/widgets/editable.h"
@@ -192,24 +185,20 @@ bool EditableWidget::handleKeyDown(Common::KeyState state) {
forcecaret = true;
break;
-#ifdef USE_SDL2
- case Common::KEYCODE_v:
- if (state.flags & Common::KBD_CTRL) {
- if (SDL_HasClipboardText() == SDL_TRUE) {
- char *text = SDL_GetClipboardText();
- if (text != nullptr) {
- for (char *ptr = text; *ptr; ++ptr) {
- if (tryInsertChar(*ptr, _caretPos))
- ++_caretPos;
- }
- dirty = true;
- }
+ case Common::KEYCODE_v:
+ if (g_system->hasFeature(OSystem::kFeatureClipboardSupport) && state.flags & Common::KBD_CTRL) {
+ if (g_system->hasTextInClipboard()) {
+ String text = g_system->getTextFromClipboard();
+ for (uint32 i = 0; i < text.size(); ++i) {
+ if (tryInsertChar(text[i], _caretPos))
+ ++_caretPos;
}
- } else {
- defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ dirty = true;
}
- break;
-#endif
+ } else {
+ defaultKeyDownHandler(state, dirty, forcecaret, handled);
+ }
+ break;
#ifdef MACOSX
// Let ctrl-a / ctrl-e move the caret to the start / end of the line.