GUI: detect when window manager sets Furnace to full screen

issue #2751
This commit is contained in:
tildearrow 2026-01-13 04:17:43 -05:00
parent 857d178860
commit a9a0b6055e
3 changed files with 36 additions and 4 deletions

View file

@ -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;

View file

@ -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=(scrW<scrH);
@ -3995,7 +3995,32 @@ bool FurnaceGUI::loop() {
logD("window resized to %dx%d",scrW,scrH);
updateWindow=true;
rend->resized(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),

View file

@ -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;