From b9bba9bd4bec1bf00a61c347f411a8ecf9ea69e8 Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Tue, 26 Jul 2016 12:21:15 +0600 Subject: ALL: Move Clipboard support to OSystem Commit adds kFeatureClipboardSupport. hasTextInClipboard() and getTextFromClipboard(). OSystem_SDL has this feature if SDL2 is used. EditableWidget and StorageWizardDialog use g_system to access clipboard now. --- backends/platform/sdl/sdl.cpp | 32 ++++++++++++++++++++++++++ backends/platform/sdl/sdl.h | 6 +++++ common/system.h | 32 +++++++++++++++++++++++++- gui/storagewizarddialog.cpp | 52 +++++++++++++++---------------------------- gui/widgets/editable.cpp | 35 ++++++++++------------------- 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 #endif +#if SDL_VERSION_ATLEAST(2, 0, 0) +#include +#include +#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 }; /** @@ -1238,6 +1246,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. * 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 -#include -#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 -#include -#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. -- cgit v1.2.3