diff --git i/platform/sdl/knativescreenSDL.cpp w/platform/sdl/knativescreenSDL.cpp index c4e0149..ac1da96 100644 --- i/platform/sdl/knativescreenSDL.cpp +++ w/platform/sdl/knativescreenSDL.cpp @@ -708,6 +708,9 @@ void KNativeScreenSDL::recreateMainWindow() { visible = false; + // The browser page owns display scaling and fullscreen. Keep the guest + // framebuffer intact even when it is larger than the mobile viewport. +#ifndef __EMSCRIPTEN__ SDL_DisplayMode dm; if (SDL_GetDesktopDisplayMode(0, &dm) != 0) { @@ -747,6 +750,8 @@ void KNativeScreenSDL::recreateMainWindow() { } } +#endif + window = SDL_CreateWindow("BoxedWine", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, cx, cy, flags); if (!window) { klog_fmt("SDL_CreateWindow failed: %s", SDL_GetError()); diff --git i/project/emscripten/makefile w/project/emscripten/makefile index a38b378..cc52329 100644 --- i/project/emscripten/makefile +++ w/project/emscripten/makefile @@ -102,9 +102,9 @@ $(OBJS): INCLUDES := -I../../include -I../../lib/simde $(SOFT_OBJS): INCLUDES := -I../../lib/softfloat/source/include -I../../lib/softfloat/source -I../../lib/softfloat/source/8086-SSE CXXFLAGS ?= -std=c++20 -CPPFLAGS ?= -O3 -s USE_SDL=2 -s USE_ZLIB=1 -DBOXEDWINE_ZLIB -DSDL2=1 -DBOXEDWINE_DISABLE_UI -DSIMDE_SSE2_NO_NATIVE $(GCC_EXTRA_FLAGS) -Wall -Wno-deprecated-pragma -Wno-format-security -Wno-unused-private-field -Wno-invalid-offsetof -Wno-delete-incomplete -Wno-unused-result -Wno-unknown-pragmas -Wno-unused-local-typedefs -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable $(INCLUDES) $(EXTRA_CPP_FLAGS) +CPPFLAGS ?= -O3 -fwasm-exceptions -s USE_SDL=2 -s USE_ZLIB=1 -DBOXEDWINE_ZLIB -DSDL2=1 -DBOXEDWINE_DISABLE_UI -DSIMDE_SSE2_NO_NATIVE $(GCC_EXTRA_FLAGS) -Wall -Wno-deprecated-pragma -Wno-format-security -Wno-unused-private-field -Wno-invalid-offsetof -Wno-delete-incomplete -Wno-unused-result -Wno-unknown-pragmas -Wno-unused-local-typedefs -Wno-unused-variable -Wno-unused-function -Wno-unused-but-set-variable $(INCLUDES) $(EXTRA_CPP_FLAGS) -LDFLAGS = -s FORCE_FILESYSTEM -lidbfs.js -s USE_SDL=2 -s USE_ZLIB=1 -fwasm-exceptions -s TOTAL_MEMORY=536870912 --shell-file $(SHELL_FILE) -s EXPORTED_RUNTIME_METHODS='["addRunDependency", "removeRunDependency","ERRNO_CODES"]' $(EXTRA_LD_FLAGS) +LDFLAGS = -s FORCE_FILESYSTEM -lidbfs.js -s USE_SDL=2 -s USE_ZLIB=1 -fwasm-exceptions -s TOTAL_MEMORY=536870912 -sALLOW_MEMORY_GROWTH=1 -sMAXIMUM_MEMORY=1073741824 --shell-file $(SHELL_FILE) -s EXPORTED_RUNTIME_METHODS='["addRunDependency", "removeRunDependency","ERRNO_CODES"]' $(EXTRA_LD_FLAGS) #$(TEST_BUILD_DIR)/boxedwineTest: $(TEST_OBJS) # $(CC) $(TEST_OBJS) -o $@ $(LDFLAGS) diff --git i/source/io/fsfilenode.cpp w/source/io/fsfilenode.cpp index 2cf9d94..52b46da 100644 --- i/source/io/fsfilenode.cpp +++ w/source/io/fsfilenode.cpp @@ -82,7 +82,7 @@ bool FsFileNode::remove() { } #ifdef BOXEDWINE_ZLIB if (zipNode) { - std::shared_ptr fsZip = zipNode->fsZip.lock(); + std::shared_ptr fsZip = zipNode->fsZip; if (fsZip) { fsZip->remove(this->path); } @@ -405,7 +405,7 @@ U32 FsFileNode::rename(BString path) { this->removeNodeFromParent(); #ifdef BOXEDWINE_ZLIB if (zipNode) { - std::shared_ptr fsZip = zipNode->fsZip.lock(); + std::shared_ptr fsZip = zipNode->fsZip; if (fsZip) { fsZip->remove(this->path); } diff --git i/source/io/fszipnode.h w/source/io/fszipnode.h index 7492198..581ca62 100644 --- i/source/io/fszipnode.h +++ w/source/io/fszipnode.h @@ -34,7 +34,8 @@ public: FsOpenNode* open(std::shared_ptr node, U32 flags); bool moveToFileSystem(std::shared_ptr node); - std::weak_ptr fsZip; + // ZIP-backed nodes retain their archive across the asynchronous browser loop. + std::shared_ptr fsZip; private: fsZipInfo zipInfo; }; diff --git i/source/io/fszipopennode.cpp w/source/io/fszipopennode.cpp index f6f062f..f59ac0b 100644 --- i/source/io/fszipopennode.cpp +++ w/source/io/fszipopennode.cpp @@ -93,7 +93,7 @@ bool FsZipOpenNode::canMap() { U32 FsZipOpenNode::readNative(U8* buffer, U32 len) { U32 result = 0; BOXEDWINE_CRITICAL_SECTION_WITH_MUTEX(*getReadMutex()); - std::shared_ptr fsZip = zipNode->fsZip.lock(); + std::shared_ptr fsZip = zipNode->fsZip; if (fsZip) { fsZip->setupZipRead(this->offset, this->pos); result = unzReadCurrentFile(fsZip->zipfile, buffer, len); @@ -113,7 +113,7 @@ void FsZipOpenNode::reopen() { } BOXEDWINE_MUTEX* FsZipOpenNode::getReadMutex() { - std::shared_ptr fsZip = zipNode->fsZip.lock(); + std::shared_ptr fsZip = zipNode->fsZip; if (fsZip) { return &fsZip->readMutex; } diff --git i/source/kernel/kscheduler.cpp w/source/kernel/kscheduler.cpp index b1192a5..3119b6e 100644 --- i/source/kernel/kscheduler.cpp +++ w/source/kernel/kscheduler.cpp @@ -134,8 +134,8 @@ void runThreadSlice(KThread* thread) { cpu = thread->cpu; cpu->blockInstructionCount = 0; cpu->yield = false; - cpu->nextOp = cpu->getNextOp(); // another thread that just ran could have modified this try { + cpu->nextOp = cpu->getNextOp(); // another thread that just ran could have modified this do { cpu->run(); } while ((int)cpu->blockInstructionCount < contextTimeRemaining && !cpu->yield);