diff --git a/CMakeLists.txt b/CMakeLists.txt index 78d7531..0bc4c73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,7 +62,7 @@ elseif (EMSCRIPTEN) -sNO_EXIT_RUNTIME=1 "-sASYNCIFY_ADD=NACT::execute()" -sEXPORTED_FUNCTIONS=_main,_malloc - -sEXPORTED_RUNTIME_METHODS=FS,IDBFS,getValue,addRunDependency,removeRunDependency + -sEXPORTED_RUNTIME_METHODS=FS,IDBFS,getValue,addRunDependency,removeRunDependency,stringToUTF8OnStack --emit-tsd=system3.d.ts ) diff --git a/src/texthook.cpp b/src/texthook.cpp index 3a783f0..e158ca1 100644 --- a/src/texthook.cpp +++ b/src/texthook.cpp @@ -4,36 +4,36 @@ #include #include #include +#include "common.h" #include "texthook.h" - #ifdef __EMSCRIPTEN__ #include - -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); -} - -EM_JS(void, texthook_newline, (void), { - xsystem35.texthook.newline(); -}); - -EM_JS(void, texthook_nextpage, (void), { - xsystem35.texthook.nextpage(); -}); - -EM_JS(void, texthook_keywait, (void), { - xsystem35.texthook.keywait(); -}); - -#else +#endif namespace { +#ifdef __EMSCRIPTEN__ + +class EmscriptenTextHookHandler { +public: + void character(int page, int c) { + EM_ASM(xsystem35.texthook.message(String.fromCharCode($0)), c); + } + void newline(void) { + EM_ASM(xsystem35.texthook.newline()); + } + void nextpage(void) { + EM_ASM(xsystem35.texthook.nextpage()); + } + void keywait(void) { + EM_ASM(xsystem35.texthook.keywait()); + } +}; +EmscriptenTextHookHandler handler_; +EmscriptenTextHookHandler* handler = &handler_; + +#else // __EMSCRIPTEN__ + class TextHookHandler { public: virtual void character(int page, int c) = 0; @@ -132,6 +132,9 @@ private: } copy; TextHookHandler *handler = &none; + +#endif // __EMSCRIPTEN__ + std::unordered_set suppression_set; enum { INIT, @@ -142,6 +145,7 @@ enum { } // namespace void texthook_set_mode(TexthookMode mode) { +#ifndef __EMSCRIPTEN__ switch (mode) { case TEXTHOOK_NONE: handler = &none; @@ -153,9 +157,11 @@ void texthook_set_mode(TexthookMode mode) { handler = © break; } +#endif } // suppressions is a comma-separated list of page numbers to suppress. +EMSCRIPTEN_KEEPALIVE void texthook_set_suppression_list(const char *suppressions) { suppression_set.clear(); if (!suppressions || !*suppressions) @@ -192,5 +198,3 @@ void texthook_keywait(void) { handler->keywait(); suppression_state = INIT; } - -#endif