Add texthook option

`-texthook print` prints text to console, and `-texthook copy`
automatically copies text to clipboard (for use with text hooker tools).

On Windows, copy mode can be toggled from the menu bar.
This commit is contained in:
kichikuou
2024-12-04 16:33:50 +09:00
parent 8da92f6856
commit 1e7a59f9cd
10 changed files with 191 additions and 46 deletions
+129 -43
View File
@@ -1,9 +1,15 @@
#include <string>
#include <stdio.h>
#include <SDL.h>
#include "texthook.h"
#ifdef __EMSCRIPTEN__ // ----------------------------------------------
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
void texthook_set_mode(TexthookMode m) {
// Do nothing
}
void texthook_character(int page, int character) {
EM_ASM_({ xsystem35.texthook.message(String.fromCharCode($0), $1); },
character, page);
@@ -21,59 +27,139 @@ EM_JS(void, texthook_keywait, (void), {
xsystem35.texthook.keywait();
});
#elif defined(TEXTHOOK_PRINT) // --------------------------------------
#else
static int newlines = 0;
namespace {
class TextHookHandler {
public:
virtual void character(int page, int c) = 0;
virtual void newline(void) = 0;
virtual void nextpage(void) = 0;
virtual void keywait(void) = 0;
};
class None : public TextHookHandler {
public:
void character(int page, int c) override {}
void newline(void) override {}
void nextpage(void) override {}
void keywait(void) override {}
} none;
class Print : public TextHookHandler {
public:
void character(int page, int c) override {
if (newlines)
printf("%d:", page);
newlines = 0;
if (c <= 0x7f) {
putchar(c);
} else if (c <= 0x7ff) {
putchar(0xc0 | c >> 6);
putchar(0x80 | (c & 0x3f));
} else {
putchar(0xe0 | c >> 12);
putchar(0x80 | (c >> 6 & 0x3f));
putchar(0x80 | (c & 0x3f));
}
}
void newline(void) override {
if (newlines < 2) {
putchar('\n');
fflush(stdout);
newlines++;
}
}
void nextpage(void) override {
while (newlines < 2) {
putchar('\n');
fflush(stdout);
newlines++;
}
}
void keywait(void) override {
newline();
}
private:
int newlines = 0;
} print;
class Copy : public TextHookHandler {
public:
void character(int page, int c) override {
if (c <= 0x7f) {
buf += c;
} else if (c <= 0x7ff) {
buf += static_cast<char>(0xc0 | c >> 6);
buf += static_cast<char>(0x80 | (c & 0x3f));
} else {
buf += static_cast<char>(0xe0 | c >> 12);
buf += static_cast<char>(0x80 | (c >> 6 & 0x3f));
buf += static_cast<char>(0x80 | (c & 0x3f));
}
}
void newline(void) override {
buf += "\n";
}
void nextpage(void) override {
if (!buf.empty())
copy_to_clipboard();
}
void keywait(void) override {
if (!buf.empty())
copy_to_clipboard();
}
private:
std::string buf;
void copy_to_clipboard(void) {
SDL_SetClipboardText(buf.c_str());
buf.clear();
}
} copy;
TextHookHandler *handler = &none;
} // namespace
void texthook_set_mode(TexthookMode mode) {
switch (mode) {
case TEXTHOOK_NONE:
handler = &none;
break;
case TEXTHOOK_PRINT:
handler = &print;
break;
case TEXTHOOK_COPY:
handler = &copy;
break;
}
}
void texthook_character(int page, int c) {
if (newlines)
printf("%d:", page);
newlines = 0;
if (c <= 0x7f) {
putchar(c);
} else if (c <= 0x7ff) {
putchar(0xc0 | c >> 6);
putchar(0x80 | (c & 0x3f));
} else {
putchar(0xe0 | c >> 12);
putchar(0x80 | (c >> 6 & 0x3f));
putchar(0x80 | (c & 0x3f));
}
handler->character(page, c);
}
void texthook_newline(void) {
if (newlines < 2) {
putchar('\n');
fflush(stdout);
newlines++;
}
handler->newline();
}
void texthook_nextpage(void) {
while (newlines < 2) {
putchar('\n');
fflush(stdout);
newlines++;
}
handler->nextpage();
}
void texthook_keywait(void) {
texthook_newline();
handler->keywait();
}
#else // --------------------------------------------------------------
void texthook_character(int page, int c) {
}
void texthook_newline(void) {
}
void texthook_nextpage(void) {
}
void texthook_keywait(void) {
}
#endif // -------------------------------------------------------------
#endif