diff --git a/src/input.c b/src/input.c index e10db38..8cfa726 100644 --- a/src/input.c +++ b/src/input.c @@ -44,17 +44,14 @@ void enable_msgSkip(boolean enable) { if (enable == msgskip_enabled) return; msgskip_enabled = enable; -#ifdef _WIN32 - win_menu_enableMsgSkip(enable); -#endif + menu_setSkipState(msgskip_enabled, skipToNextSel); } void set_skipMode(boolean skip) { -#ifdef _WIN32 - if (skipToNextSel != skip) - win_menu_skipModeChanged(skip); -#endif + if (skipToNextSel == skip) + return; skipToNextSel = skip; + menu_setSkipState(msgskip_enabled, skipToNextSel); } boolean get_skipMode() { diff --git a/src/menu.c b/src/menu.c index 0469276..f2341a6 100644 --- a/src/menu.c +++ b/src/menu.c @@ -176,3 +176,6 @@ void menu_gtkmainiteration() { menu_callback(); } } + +void menu_setSkipState(boolean enabled, boolean activated) { +} diff --git a/src/menu.h b/src/menu.h index cfc933c..d842602 100644 --- a/src/menu.h +++ b/src/menu.h @@ -54,13 +54,12 @@ extern void menu_msgbox_open(char *); extern void menu_widgetinit(void); extern void menu_init(); extern void menu_gtkmainiteration(); +extern void menu_setSkipState(boolean enabled, boolean activated); #ifdef _WIN32 struct SDL_SysWMmsg; extern void win_menu_init(void); extern void win_menu_onsyswmevent(struct SDL_SysWMmsg* msg); -extern void win_menu_skipModeChanged(boolean skip); -extern void win_menu_enableMsgSkip(boolean enabled); #endif #endif /* !__MENULL */ diff --git a/src/menu_android.c b/src/menu_android.c index 8b4bca2..3db6094 100644 --- a/src/menu_android.c +++ b/src/menu_android.c @@ -111,3 +111,6 @@ void menu_init(void) { void menu_gtkmainiteration() { return; } + +void menu_setSkipState(boolean enabled, boolean activated) { +} diff --git a/src/menu_emscripten.c b/src/menu_emscripten.c index 1de3ff2..ff60456 100644 --- a/src/menu_emscripten.c +++ b/src/menu_emscripten.c @@ -25,6 +25,7 @@ #include "portab.h" #include "menu.h" +#include "input.h" void menu_open(void) { return; @@ -74,3 +75,12 @@ void menu_init(void) { void menu_gtkmainiteration() { return; } + +EM_JS(void, menu_setSkipState, (boolean enabled, boolean activated), { + xsystem35.shell.setSkipButtonState(enabled, activated); +}); + +EMSCRIPTEN_KEEPALIVE +void msgskip_activate(int enable) { + set_skipMode(enable); +} diff --git a/src/menu_sdl.c b/src/menu_sdl.c index 8e0bb2d..d758f55 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -96,3 +96,8 @@ void menu_init(void) { void menu_gtkmainiteration() { return; } + +#ifndef _WIN32 +void menu_setSkipState(boolean enabled, boolean activated) { +} +#endif diff --git a/src/msgskip.c b/src/msgskip.c index 57344be..35a591b 100644 --- a/src/msgskip.c +++ b/src/msgskip.c @@ -23,6 +23,10 @@ #include "mmap.h" #include "input.h" #include "scenario.h" +#ifdef __EMSCRIPTEN__ +#include +#include +#endif // These parameters are chosen so that the false positive rate is less than 0.5% // in Kichikuou Rance (122,915 distinct messages). @@ -37,6 +41,7 @@ typedef struct { static struct { mmap_t *map; MsgSkipData *data; + boolean dirty; } msgskip; // Knuth's multiplicative hash. @@ -53,11 +58,16 @@ void msgskip_init(const char *msgskip_file) { return; msgskip.map = m; msgskip.data = m->addr; + msgskip.dirty = false; if (msgskip.data->size != BLOOM_FILTER_SIZE) { msgskip.data->size = BLOOM_FILTER_SIZE; memset(msgskip.data->bloom, 0, length - 4); } + +#ifdef __EMSCRIPTEN__ + EM_ASM({ setInterval(() => _msgskip_syncFile(), 5000); }); +#endif } void msgskip_onMessage(void) { @@ -73,9 +83,23 @@ void msgskip_onMessage(void) { msgskip.data->bloom[h >> 3] |= bit; } if (unseen) { + msgskip.dirty = true; set_skipMode(FALSE); enable_msgSkip(FALSE); } else { enable_msgSkip(TRUE); } } + +#ifdef __EMSCRIPTEN__ + +EMSCRIPTEN_KEEPALIVE +void msgskip_syncFile() { + if (!msgskip.dirty) + return; + msync(msgskip.map->addr, msgskip.map->length, MS_ASYNC); + EM_ASM( xsystem35.shell.syncfs(); ); + msgskip.dirty = false; +} + +#endif // __EMSCRIPTEN__ diff --git a/src/win/menubar.c b/src/win/menubar.c index c639cc3..296d514 100644 --- a/src/win/menubar.c +++ b/src/win/menubar.c @@ -64,9 +64,12 @@ void win_menu_onsyswmevent(SDL_SysWMmsg* msg) { } } -void win_menu_skipModeChanged(boolean skip) { +void menu_setSkipState(boolean enabled, boolean activated) { HWND hwnd = get_hwnd(sdl_window); HMENU hmenu = GetMenu(hwnd); + + EnableMenuItem(hmenu, ID_MSGSKIP, enabled ? MF_ENABLED : MF_GRAYED); + wchar_t buf[20]; MENUITEMINFOW menuitem = { .cbSize = sizeof(MENUITEMINFOW), @@ -74,19 +77,13 @@ void win_menu_skipModeChanged(boolean skip) { .dwTypeData = buf, .cch = sizeof(buf) / sizeof(wchar_t), }; - if (!GetMenuItemInfoW(hmenu, ID_MSGSKIP, false, &menuitem)) - return; - wchar_t *p = wcsrchr(buf, L'['); - if (!p) - return; - wcscpy(p, skip ? L"[on]" : L"[off]"); - SetMenuItemInfoW(hmenu, ID_MSGSKIP, false, &menuitem); - DrawMenuBar(hwnd); -} + if (GetMenuItemInfoW(hmenu, ID_MSGSKIP, false, &menuitem)) { + wchar_t *p = wcsrchr(buf, L'['); + if (p) { + wcscpy(p, activated ? L"[on]" : L"[off]"); + SetMenuItemInfoW(hmenu, ID_MSGSKIP, false, &menuitem); + } + } -void win_menu_enableMsgSkip(boolean enabled) { - HWND hwnd = get_hwnd(sdl_window); - HMENU hmenu = GetMenu(hwnd); - EnableMenuItem(hmenu, ID_MSGSKIP, enabled ? MF_ENABLED : MF_GRAYED); DrawMenuBar(hwnd); }