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.
This commit is contained in:
Alexander Tkachev 2016-07-26 12:21:15 +06:00
parent 527ab4cdf6
commit b9bba9bd4b
5 changed files with 99 additions and 58 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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.
*

View File

@ -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);
}

View File

@ -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.