Improve Clipboard support, add Clipboard.onUpdate (resolve #925)

This commit is contained in:
Joshua Granick
2017-06-06 19:32:33 -07:00
parent e17e4f45f8
commit f4e003d799
10 changed files with 241 additions and 57 deletions

View File

@@ -255,6 +255,7 @@
<file name="src/media/containers/WAV.cpp" />
<file name="src/media/AudioBuffer.cpp" />
<file name="src/system/CFFIPointer.cpp" />
<file name="src/system/ClipboardEvent.cpp" />
<file name="src/system/DisplayMode.cpp" />
<file name="src/system/JNI.cpp" if="android" />
<file name="src/system/Locale.cpp" unless="mac || ios" />

View File

@@ -0,0 +1,37 @@
#ifndef LIME_SYSTEM_CLIPBOARD_EVENT_H
#define LIME_SYSTEM_CLIPBOARD_EVENT_H
#include <hx/CFFI.h>
namespace lime {
enum ClipboardEventType {
CLIPBOARD_UPDATE
};
class ClipboardEvent {
public:
static AutoGCRoot* callback;
static AutoGCRoot* eventObject;
ClipboardEvent ();
static void Dispatch (ClipboardEvent* event);
ClipboardEventType type;
};
}
#endif

View File

@@ -22,6 +22,7 @@
#include <media/AudioBuffer.h>
#include <system/CFFIPointer.h>
#include <system/Clipboard.h>
#include <system/ClipboardEvent.h>
#include <system/JNI.h>
#include <system/Locale.h>
#include <system/SensorEvent.h>
@@ -272,6 +273,14 @@ namespace lime {
}
void lime_clipboard_event_manager_register (value callback, value eventObject) {
ClipboardEvent::callback = new AutoGCRoot (callback);
ClipboardEvent::eventObject = new AutoGCRoot (eventObject);
}
value lime_clipboard_get_text () {
if (Clipboard::HasText ()) {
@@ -1794,6 +1803,7 @@ namespace lime {
DEFINE_PRIME2 (lime_bytes_read_file);
DEFINE_PRIME1 (lime_cffi_get_native_pointer);
DEFINE_PRIME1 (lime_cffi_set_finalizer);
DEFINE_PRIME2v (lime_clipboard_event_manager_register);
DEFINE_PRIME0 (lime_clipboard_get_text);
DEFINE_PRIME1v (lime_clipboard_set_text);
DEFINE_PRIME2 (lime_data_pointer_offset);

View File

@@ -48,6 +48,7 @@ namespace lime {
nextUpdate = 0;
ApplicationEvent applicationEvent;
ClipboardEvent clipboardEvent;
DropEvent dropEvent;
GamepadEvent gamepadEvent;
JoystickEvent joystickEvent;
@@ -156,6 +157,11 @@ namespace lime {
inBackground = false;
break;
case SDL_CLIPBOARDUPDATE:
ProcessClipboardEvent (event);
break;
case SDL_CONTROLLERAXISMOTION:
case SDL_CONTROLLERBUTTONDOWN:
case SDL_CONTROLLERBUTTONUP:
@@ -316,6 +322,19 @@ namespace lime {
}
void SDLApplication::ProcessClipboardEvent (SDL_Event* event) {
if (ClipboardEvent::callback) {
clipboardEvent.type = CLIPBOARD_UPDATE;
ClipboardEvent::Dispatch (&clipboardEvent);
}
}
void SDLApplication::ProcessDropEvent (SDL_Event* event) {
if (DropEvent::callback) {

View File

@@ -6,6 +6,7 @@
#include <app/Application.h>
#include <app/ApplicationEvent.h>
#include <graphics/RenderEvent.h>
#include <system/ClipboardEvent.h>
#include <system/SensorEvent.h>
#include <ui/DropEvent.h>
#include <ui/GamepadEvent.h>
@@ -39,6 +40,7 @@ namespace lime {
private:
void HandleEvent (SDL_Event* event);
void ProcessClipboardEvent (SDL_Event* event);
void ProcessDropEvent (SDL_Event* event);
void ProcessGamepadEvent (SDL_Event* event);
void ProcessJoystickEvent (SDL_Event* event);
@@ -57,6 +59,7 @@ namespace lime {
bool active;
ApplicationEvent applicationEvent;
ClipboardEvent clipboardEvent;
Uint32 currentUpdate;
double framePeriod;
DropEvent dropEvent;

View File

@@ -0,0 +1,44 @@
#include <hx/CFFI.h>
#include <system/ClipboardEvent.h>
namespace lime {
AutoGCRoot* ClipboardEvent::callback = 0;
AutoGCRoot* ClipboardEvent::eventObject = 0;
static int id_type;
static bool init = false;
ClipboardEvent::ClipboardEvent () {
type = CLIPBOARD_UPDATE;
}
void ClipboardEvent::Dispatch (ClipboardEvent* event) {
if (ClipboardEvent::callback) {
if (!init) {
id_type = val_id ("type");
init = true;
}
value object = (ClipboardEvent::eventObject ? ClipboardEvent::eventObject->get () : alloc_empty_object ());
alloc_field (object, id_type, alloc_int (event->type));
val_call0 (ClipboardEvent::callback->get ());
}
}
}