From c55cc8b2ea7007df172d0eba8d5ad54abb4622e1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 26 Jan 2024 02:44:47 -0500 Subject: [PATCH] GUI: delayed layout loading issue #1629 --- src/gui/gui.cpp | 14 ++++++++++++++ src/gui/gui.h | 3 +++ src/gui/settings.cpp | 9 ++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 359c27e51..b93c13753 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4001,12 +4001,24 @@ bool FurnaceGUI::loop() { layoutTimeBegin=SDL_GetPerformanceCounter(); + if (pendingLayoutImport!=NULL) { + ImGui::LoadIniSettingsFromMemory((const char*)pendingLayoutImport,pendingLayoutImportLen); + } + if (!rend->newFrame()) { fontsFailed=true; } ImGui_ImplSDL2_NewFrame(sdlWin); ImGui::NewFrame(); + if (pendingLayoutImport!=NULL) { + WAKE_UP; + ImGui::Render(); + delete[] pendingLayoutImport; + pendingLayoutImport=NULL; + continue; + } + // one second counter secondTimer+=ImGui::GetIO().DeltaTime; if (secondTimer>=1.0f) secondTimer=fmod(secondTimer,1.0f); @@ -7263,6 +7275,8 @@ FurnaceGUI::FurnaceGUI(): headFont(NULL), fontRange(NULL), prevInsData(NULL), + pendingLayoutImport(NULL), + pendingLayoutImportLen(0), curIns(0), curWave(0), curSample(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index 132032bc9..fba435170 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1976,6 +1976,9 @@ class FurnaceGUI { DivInstrument* prevInsData; + unsigned char* pendingLayoutImport; + size_t pendingLayoutImportLen; + int curIns, curWave, curSample, curOctave, curOrder, playOrder, prevIns, oldRow, editStep, exportLoops, soloChan, orderEditMode, orderCursor; int loopOrder, loopRow, loopEnd, isClipping, newSongCategory, latchTarget; int wheelX, wheelY, dragSourceX, dragSourceXFine, dragSourceY, dragDestinationX, dragDestinationXFine, dragDestinationY, oldBeat, oldBar; diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 049044cc4..584ce17ad 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4760,18 +4760,17 @@ bool FurnaceGUI::importLayout(String path) { fclose(f); return false; } - unsigned char* file=new unsigned char[len]; - if (fread(file,1,(size_t)len,f)!=(size_t)len) { + pendingLayoutImport=new unsigned char[len]; + if (fread(pendingLayoutImport,1,(size_t)len,f)!=(size_t)len) { perror("read error"); lastError=fmt::sprintf("on read: %s",strerror(errno)); fclose(f); - delete[] file; + delete[] pendingLayoutImport; return false; } fclose(f); - ImGui::LoadIniSettingsFromMemory((const char*)file,len); - delete[] file; + pendingLayoutImportLen=len; return true; }