mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-18 21:30:38 +01:00
[ion/clipboard] Rework clipboard handling
Change the way the clipboard is fetched, so as to preserve the Poincare/Python translation feature, and remove the cap on the length of text being imported into the simulator. Change-Id: I0f3e83c0c8aa4b64eb08d882aa6891b31f191e22
This commit is contained in:
committed by
Émilie Feral
parent
010b474f77
commit
f66bde6d31
@@ -105,7 +105,12 @@ _mp_hal_input \
|
|||||||
_mp_import_name \
|
_mp_import_name \
|
||||||
_mp_parse_compile_execute \
|
_mp_parse_compile_execute \
|
||||||
_get_clipboard_text \
|
_get_clipboard_text \
|
||||||
|
_set_clipboard_text \
|
||||||
|
__ZN3Ion9Clipboard24fetchFromSystemClipboardEPcm \
|
||||||
|
__ZN3Ion9Clipboard21sendToSystemClipboardEPKc \
|
||||||
__ZN3Ion9Clipboard4readEPcm \
|
__ZN3Ion9Clipboard4readEPcm \
|
||||||
|
__ZN3Ion9Clipboard5writeEPKc \
|
||||||
|
__ZN9Clipboard5storeEPKci \
|
||||||
__ZN9Clipboard10storedTextEv \
|
__ZN9Clipboard10storedTextEv \
|
||||||
__ZN11LayoutField18privateHandleEventEN3Ion6Events5EventE \
|
__ZN11LayoutField18privateHandleEventEN3Ion6Events5EventE \
|
||||||
__ZN11LayoutField11handleEventEN3Ion6Events5EventE \
|
__ZN11LayoutField11handleEventEN3Ion6Events5EventE \
|
||||||
|
|||||||
@@ -15,7 +15,10 @@ void Clipboard::store(const char * storedText, int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char * Clipboard::storedText() {
|
const char * Clipboard::storedText() {
|
||||||
Ion::Clipboard::read(m_textBuffer, TextField::maxBufferSize());
|
const char * systemText = Ion::Clipboard::read();
|
||||||
|
if (systemText) {
|
||||||
|
return systemText;
|
||||||
|
}
|
||||||
|
|
||||||
/* In order to allow copy/paste of empty formulas, we need to add empty
|
/* In order to allow copy/paste of empty formulas, we need to add empty
|
||||||
* layouts between empty system parenthesis. This way, when the expression
|
* layouts between empty system parenthesis. This way, when the expression
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
#ifndef ION_CLIPBOARD_H
|
#ifndef ION_CLIPBOARD_H
|
||||||
#define ION_CLIPBOARD_H
|
#define ION_CLIPBOARD_H
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace Ion {
|
namespace Ion {
|
||||||
namespace Clipboard {
|
namespace Clipboard {
|
||||||
|
|
||||||
/* Write the text to the system clipboard. */
|
/* Write the text to the system clipboard. */
|
||||||
void write(const char * text);
|
void write(const char * text);
|
||||||
|
|
||||||
/* Fill the buffer with text from the system clipboard. */
|
/* Returns the system's clipboard text if it differs from the text previously
|
||||||
void read(char * buffer, size_t bufferSize);
|
* copied, and nullptr otherwise. */
|
||||||
|
const char * read();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,6 @@ namespace Ion {
|
|||||||
* On the device, the clipboard is fully handled by Escher::Clipboard. */
|
* On the device, the clipboard is fully handled by Escher::Clipboard. */
|
||||||
|
|
||||||
void Clipboard::write(const char * text) {}
|
void Clipboard::write(const char * text) {}
|
||||||
void Clipboard::read(char * buffer, size_t bufferSize) {}
|
const char * Clipboard::read() { return nullptr; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ ion_src += $(addprefix ion/src/simulator/shared/, \
|
|||||||
dummy/serial_number.cpp \
|
dummy/serial_number.cpp \
|
||||||
dummy/stack.cpp \
|
dummy/stack.cpp \
|
||||||
dummy/usb.cpp \
|
dummy/usb.cpp \
|
||||||
|
clipboard.cpp \
|
||||||
console_stdio.cpp:-consoledisplay \
|
console_stdio.cpp:-consoledisplay \
|
||||||
crc32.cpp \
|
crc32.cpp \
|
||||||
display.cpp:-headless \
|
display.cpp:-headless \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ ion_src += $(addprefix ion/src/simulator/android/src/cpp/, \
|
|||||||
ion_src += $(addprefix ion/src/simulator/shared/, \
|
ion_src += $(addprefix ion/src/simulator/shared/, \
|
||||||
dummy/callback.cpp \
|
dummy/callback.cpp \
|
||||||
dummy/language.cpp \
|
dummy/language.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
haptics.cpp \
|
haptics.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ ion_src += $(addprefix ion/src/simulator/shared/, \
|
|||||||
apple/language.m \
|
apple/language.m \
|
||||||
dummy/callback.cpp \
|
dummy/callback.cpp \
|
||||||
dummy/haptics_enabled.cpp \
|
dummy/haptics_enabled.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
haptics.cpp \
|
haptics.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ ion_src += $(addprefix ion/src/simulator/linux/, \
|
|||||||
ion_src += $(addprefix ion/src/simulator/shared/, \
|
ion_src += $(addprefix ion/src/simulator/shared/, \
|
||||||
dummy/callback.cpp \
|
dummy/callback.cpp \
|
||||||
dummy/haptics_enabled.cpp \
|
dummy/haptics_enabled.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
collect_registers_x86_64.s \
|
collect_registers_x86_64.s \
|
||||||
collect_registers.cpp \
|
collect_registers.cpp \
|
||||||
haptics.cpp \
|
haptics.cpp \
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ ion_src += $(addprefix ion/src/simulator/shared/, \
|
|||||||
apple/language.m \
|
apple/language.m \
|
||||||
dummy/callback.cpp \
|
dummy/callback.cpp \
|
||||||
dummy/haptics_enabled.cpp \
|
dummy/haptics_enabled.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
collect_registers_x86_64.s \
|
collect_registers_x86_64.s \
|
||||||
collect_registers.cpp \
|
collect_registers.cpp \
|
||||||
haptics.cpp \
|
haptics.cpp \
|
||||||
|
|||||||
@@ -1,27 +1,33 @@
|
|||||||
#include <ion/clipboard.h>
|
#include <ion/clipboard.h>
|
||||||
#include <SDL.h>
|
#include "clipboard_helper.h"
|
||||||
|
#include <ion.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
/* This file implements the methods to access the system clipboard on all
|
|
||||||
* targets but the web simulator. */
|
|
||||||
|
|
||||||
namespace Ion {
|
namespace Ion {
|
||||||
|
namespace Clipboard {
|
||||||
|
|
||||||
void Clipboard::write(const char * text) {
|
uint32_t localClipboardVersion;
|
||||||
|
|
||||||
|
void write(const char * text) {
|
||||||
/* FIXME : Handle the error if need be. */
|
/* FIXME : Handle the error if need be. */
|
||||||
SDL_SetClipboardText(text);
|
sendToSystemClipboard(text);
|
||||||
|
localClipboardVersion = crc32Byte(reinterpret_cast<const uint8_t *>(text), strlen(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clipboard::read(char * buffer, size_t bufferSize) {
|
const char * read() {
|
||||||
if (!SDL_HasClipboardText()) {
|
constexpr size_t bufferSize = 32768;
|
||||||
buffer[0] = '\0';
|
static char buffer[bufferSize];
|
||||||
return;
|
fetchFromSystemClipboard(buffer, bufferSize);
|
||||||
|
if (buffer[0] == '\0') {
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
char * text = SDL_GetClipboardText();
|
|
||||||
if (text) {
|
uint32_t version = crc32Byte(reinterpret_cast<const uint8_t *>(buffer), strlen(buffer));
|
||||||
strlcpy(buffer, text, bufferSize);
|
if (version == localClipboardVersion) {
|
||||||
SDL_free(text);
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
28
ion/src/simulator/shared/clipboard_helper.cpp
Normal file
28
ion/src/simulator/shared/clipboard_helper.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include "clipboard_helper.h"
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
namespace Ion {
|
||||||
|
namespace Clipboard {
|
||||||
|
|
||||||
|
void sendToSystemClipboard(const char * text) {
|
||||||
|
SDL_SetClipboardText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fetchFromSystemClipboard(char * buffer, size_t bufferSize) {
|
||||||
|
if (!SDL_HasClipboardText()) {
|
||||||
|
buffer[0] = '\0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char * text = SDL_GetClipboardText();
|
||||||
|
if (text) {
|
||||||
|
strlcpy(buffer, text, bufferSize);
|
||||||
|
} else {
|
||||||
|
buffer[0] = '\0';
|
||||||
|
}
|
||||||
|
SDL_free(text);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
15
ion/src/simulator/shared/clipboard_helper.h
Normal file
15
ion/src/simulator/shared/clipboard_helper.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef ION_CLIPBOARD_HELPER_H
|
||||||
|
#define ION_CLIPBOARD_HELPER_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
namespace Ion {
|
||||||
|
namespace Clipboard {
|
||||||
|
|
||||||
|
void sendToSystemClipboard(const char * text);
|
||||||
|
void fetchFromSystemClipboard(char * buffer, size_t bufferSize);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -15,7 +15,7 @@ LDFLAGS += --pre-js ion/src/simulator/web/preamble_env.js
|
|||||||
|
|
||||||
ion_src += $(addprefix ion/src/simulator/web/, \
|
ion_src += $(addprefix ion/src/simulator/web/, \
|
||||||
callback.cpp \
|
callback.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
helpers.cpp \
|
helpers.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#include <ion/clipboard.h>
|
#include "../shared/clipboard_helper.h"
|
||||||
#include <emscripten.h>
|
#include <emscripten.h>
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@@ -48,20 +48,17 @@ EM_JS(void, get_clipboard_text, (char * buffer, uint32_t bufferSize, AsyncStatus
|
|||||||
});
|
});
|
||||||
|
|
||||||
namespace Ion {
|
namespace Ion {
|
||||||
|
namespace Clipboard {
|
||||||
|
|
||||||
void Clipboard::write(const char * text) {
|
void sendToSystemClipboard(const char * text) {
|
||||||
/* FIXME : Handle the error if need be. */
|
|
||||||
/* As the rest of the execution does not depend on the system clipboard being
|
/* As the rest of the execution does not depend on the system clipboard being
|
||||||
* properly filled at this point, the call to set_clipboard_text does not
|
* properly filled at this point, the call to set_clipboard_text does not
|
||||||
* need to be made synchronous. */
|
* need to be made synchronous. */
|
||||||
AsyncStatus lock;
|
AsyncStatus lock;
|
||||||
set_clipboard_text(text, &lock, AsyncStatus::Failure, AsyncStatus::Success);
|
set_clipboard_text(text, &lock, AsyncStatus::Failure, AsyncStatus::Success);
|
||||||
/* Store a local copy of the text in case the browser does not grant access
|
|
||||||
* to the clipboard. */
|
|
||||||
SDL_SetClipboardText(text);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clipboard::read(char * buffer, size_t bufferSize) {
|
void fetchFromSystemClipboard(char * buffer, size_t bufferSize) {
|
||||||
AsyncStatus lock = AsyncStatus::Pending;
|
AsyncStatus lock = AsyncStatus::Pending;
|
||||||
static_assert(sizeof(size_t) <= sizeof(uint32_t), "Cast from size_t to uint32_t may overflow.");
|
static_assert(sizeof(size_t) <= sizeof(uint32_t), "Cast from size_t to uint32_t may overflow.");
|
||||||
get_clipboard_text(buffer, static_cast<uint32_t>(bufferSize), &lock, AsyncStatus::Failure, AsyncStatus::Success);
|
get_clipboard_text(buffer, static_cast<uint32_t>(bufferSize), &lock, AsyncStatus::Failure, AsyncStatus::Success);
|
||||||
@@ -71,17 +68,7 @@ void Clipboard::read(char * buffer, size_t bufferSize) {
|
|||||||
if (lock == AsyncStatus::Success) {
|
if (lock == AsyncStatus::Success) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* If the browser does not grant access to the clipboard, read from a local
|
|
||||||
* copy to at least maintain the basic copy-paste functionnality. */
|
|
||||||
if (!SDL_HasClipboardText()) {
|
|
||||||
buffer[0] = '\0';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
char * text = SDL_GetClipboardText();
|
|
||||||
if (text) {
|
|
||||||
strlcpy(buffer, text, bufferSize);
|
|
||||||
SDL_free(text);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ ion_src += $(addprefix ion/src/simulator/windows/, \
|
|||||||
ion_src += $(addprefix ion/src/simulator/shared/, \
|
ion_src += $(addprefix ion/src/simulator/shared/, \
|
||||||
dummy/callback.cpp \
|
dummy/callback.cpp \
|
||||||
dummy/haptics_enabled.cpp \
|
dummy/haptics_enabled.cpp \
|
||||||
clipboard.cpp \
|
clipboard_helper.cpp \
|
||||||
haptics.cpp \
|
haptics.cpp \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user