emscripten: Support message skip

This commit is contained in:
kichikuou
2020-12-28 22:45:47 +09:00
parent 5ec0c0a7be
commit 6d5831c4e8
8 changed files with 61 additions and 23 deletions
+4 -7
View File
@@ -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() {
+3
View File
@@ -176,3 +176,6 @@ void menu_gtkmainiteration() {
menu_callback();
}
}
void menu_setSkipState(boolean enabled, boolean activated) {
}
+1 -2
View File
@@ -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 */
+3
View File
@@ -111,3 +111,6 @@ void menu_init(void) {
void menu_gtkmainiteration() {
return;
}
void menu_setSkipState(boolean enabled, boolean activated) {
}
+10
View File
@@ -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);
}
+5
View File
@@ -96,3 +96,8 @@ void menu_init(void) {
void menu_gtkmainiteration() {
return;
}
#ifndef _WIN32
void menu_setSkipState(boolean enabled, boolean activated) {
}
#endif
+24
View File
@@ -23,6 +23,10 @@
#include "mmap.h"
#include "input.h"
#include "scenario.h"
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#include <sys/mman.h>
#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__
+11 -14
View File
@@ -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);
}