diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index ff47ac0f3..950815f02 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -210,6 +210,7 @@ void FurnaceGUI::doAction(int what) { followPattern=!followPattern; break; case GUI_ACTION_FULLSCREEN: + if (sysFullScreen) break; fullScreen=!fullScreen; SDL_SetWindowFullscreen(sdlWin,fullScreen?(SDL_WINDOW_FULLSCREEN|SDL_WINDOW_FULLSCREEN_DESKTOP):0); break; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 3c0c9a7f8..03422f538 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3987,7 +3987,7 @@ bool FurnaceGUI::loop() { break; case SDL_WINDOWEVENT: switch (ev.window.event) { - case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_RESIZED: { scrW=ev.window.data1; scrH=ev.window.data2; portrait=(scrWresized(ev); + + // check whether we're in fullscreen + int displayOfWindow=SDL_GetWindowDisplayIndex(sdlWin); + SDL_Rect displayRect; + if (displayOfWindow<0) { + logW("couldn't get display of window after resize! (%s)",SDL_GetError()); + break; + } + + if (SDL_GetDisplayBounds(displayOfWindow,&displayRect)!=0) { + logW("couldn't get display bounds after resize! (%s)",SDL_GetError()); + break; + } + + if (fullScreen) { + sysFullScreen=false; + } else { + if (scrW==displayRect.w && scrH==displayRect.h) { + logD("we may be in fullscreen"); + sysFullScreen=true; + } else { + sysFullScreen=false; + } + } break; + } case SDL_WINDOWEVENT_MOVED: scrX=ev.window.data1; scrY=ev.window.data2; @@ -4160,7 +4185,7 @@ bool FurnaceGUI::loop() { // update config x/y/w/h values based on scrMax state if (updateWindow) { logV("updateWindow is true"); - if (!scrMax && !fullScreen) { + if (!scrMax && !fullScreen && !sysFullScreen) { logV("updating scrConf"); scrConfX=scrX; scrConfY=scrY; @@ -4829,9 +4854,14 @@ bool FurnaceGUI::loop() { } if (ImGui::BeginMenu(settings.capitalMenuBar?_("Settings"):_("settings"))) { #ifndef IS_MOBILE - if (ImGui::MenuItem(_("full screen"),BIND_FOR(GUI_ACTION_FULLSCREEN),fullScreen)) { + ImGui::BeginDisabled(sysFullScreen); + if (ImGui::MenuItem(_("full screen"),BIND_FOR(GUI_ACTION_FULLSCREEN),fullScreen || sysFullScreen)) { doAction(GUI_ACTION_FULLSCREEN); } + ImGui::EndDisabled(); + if (sysFullScreen) { + ImGui::SetItemTooltip(_("the system has set Furnace to full screen.")); + } #endif if (ImGui::MenuItem(_("lock layout"),NULL,lockLayout)) { lockLayout=!lockLayout; @@ -8773,6 +8803,7 @@ FurnaceGUI::FurnaceGUI(): displayNew(false), displayPalette(false), fullScreen(false), + sysFullScreen(false), preserveChanPos(false), sysDupCloneChannels(true), sysDupEnd(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index a475dd6dd..c462c6790 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1740,7 +1740,7 @@ class FurnaceGUI { bool vgmExportDirectStream, displayInsTypeList, displayWaveSizeList; bool portrait, injectBackUp, mobileMenuOpen, warnColorPushed; bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu; - bool displayNew, displayExport, displayPalette, fullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd; + bool displayNew, displayExport, displayPalette, fullScreen, sysFullScreen, preserveChanPos, sysDupCloneChannels, sysDupEnd; unsigned char noteInputMode; bool notifyWaveChange, notifySampleChange; bool recalcTimestamps;