fixed missing render when a stacked dialog was closed in emulation

This commit is contained in:
thrust26 2020-11-13 11:18:25 +01:00
parent d627acb408
commit 7708a9a692
3 changed files with 27 additions and 22 deletions

View File

@ -311,7 +311,7 @@ FBInitStatus FrameBuffer::createDisplay(const string& title, BufferType type,
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FrameBuffer::update(bool force) void FrameBuffer::update(bool forceRedraw)
{ {
// Onscreen messages are a special case and require different handling than // Onscreen messages are a special case and require different handling than
// other objects; they aren't UI dialogs in the normal sense nor are they // other objects; they aren't UI dialogs in the normal sense nor are they
@ -322,11 +322,12 @@ void FrameBuffer::update(bool force)
// - at the bottom of ::update(), to actually draw them (this must come // - at the bottom of ::update(), to actually draw them (this must come
// last, since they are always drawn on top of everything else). // last, since they are always drawn on top of everything else).
// Forced rendering without drawing is required when messages are being disabled // Forced render without draw required if messages or dialogs were closed
// Only relevant for LAUNCHER, PAUSE and DEBUGGER modes // Note: For dialogs only relevant when two or more dialogs were stacked
bool rerender = force || (myMsg.enabled && myMsg.counter == 0); bool rerender = forceRedraw || myPendingRender;
myPendingRender = false;
bool redraw = force; bool redraw = forceRedraw;
switch(myOSystem.eventHandler().state()) switch(myOSystem.eventHandler().state())
{ {
case EventHandlerState::NONE: case EventHandlerState::NONE:
@ -357,7 +358,13 @@ void FrameBuffer::update(bool force)
{ {
clear(); clear();
myTIASurface->render(); myTIASurface->render();
myOSystem.menu().draw(force); myOSystem.menu().draw(forceRedraw);
}
else if(rerender)
{
clear();
myTIASurface->render();
myOSystem.menu().render();
} }
break; // EventHandlerState::OPTIONSMENU break; // EventHandlerState::OPTIONSMENU
} }
@ -370,7 +377,7 @@ void FrameBuffer::update(bool force)
{ {
clear(); clear();
myTIASurface->render(); myTIASurface->render();
myOSystem.commandMenu().draw(force); myOSystem.commandMenu().draw(forceRedraw);
} }
break; // EventHandlerState::CMDMENU break; // EventHandlerState::CMDMENU
} }
@ -383,7 +390,7 @@ void FrameBuffer::update(bool force)
{ {
clear(); clear();
myTIASurface->render(); myTIASurface->render();
myOSystem.messageMenu().draw(force); myOSystem.messageMenu().draw(forceRedraw);
} }
break; // EventHandlerState::MESSAGEMENU break; // EventHandlerState::MESSAGEMENU
} }
@ -396,7 +403,7 @@ void FrameBuffer::update(bool force)
{ {
clear(); clear();
myTIASurface->render(); myTIASurface->render();
myOSystem.timeMachine().draw(force); myOSystem.timeMachine().draw(forceRedraw);
} }
break; // EventHandlerState::TIMEMACHINE break; // EventHandlerState::TIMEMACHINE
} }
@ -440,7 +447,7 @@ void FrameBuffer::update(bool force)
myOSystem.launcher().tick(); myOSystem.launcher().tick();
redraw |= myOSystem.launcher().needsRedraw(); redraw |= myOSystem.launcher().needsRedraw();
if(redraw) if(redraw)
myOSystem.launcher().draw(force); myOSystem.launcher().draw(forceRedraw);
else if(rerender) else if(rerender)
myOSystem.launcher().render(); myOSystem.launcher().render();
break; // EventHandlerState::LAUNCHER break; // EventHandlerState::LAUNCHER
@ -453,7 +460,7 @@ void FrameBuffer::update(bool force)
myOSystem.debugger().tick(); myOSystem.debugger().tick();
redraw |= myOSystem.debugger().needsRedraw(); redraw |= myOSystem.debugger().needsRedraw();
if(redraw) if(redraw)
myOSystem.debugger().draw(force); myOSystem.debugger().draw(forceRedraw);
else if(rerender) else if(rerender)
myOSystem.debugger().render(); myOSystem.debugger().render();
break; // EventHandlerState::DEBUGGER break; // EventHandlerState::DEBUGGER
@ -684,6 +691,7 @@ inline bool FrameBuffer::drawMessage()
if(myMsg.counter == 0) if(myMsg.counter == 0)
{ {
myMsg.enabled = false; myMsg.enabled = false;
myPendingRender = true;
return false; return false;
} }

View File

@ -84,7 +84,7 @@ class FrameBuffer
Updates the display, which depending on the current mode could mean Updates the display, which depending on the current mode could mean
drawing the TIA, any pending menus, etc. drawing the TIA, any pending menus, etc.
*/ */
void update(bool force = false); void update(bool forceRedraw = false);
/** /**
There is a dedicated update method for emulation mode. There is a dedicated update method for emulation mode.
@ -92,9 +92,9 @@ class FrameBuffer
void updateInEmulationMode(float framesPerSecond); void updateInEmulationMode(float framesPerSecond);
/** /**
Render backend to screen. Set pending rendering flag.
*/ */
void renderToScreen() { myBackend->renderToScreen(); } void setPendingRender() { myPendingRender = true; }
/** /**
Shows a text message onscreen. Shows a text message onscreen.
@ -460,6 +460,9 @@ class FrameBuffer
// Supported renderers // Supported renderers
VariantList myRenderers; VariantList myRenderers;
// Flag for pending render
bool myPendingRender{false};
// The VideoModeHandler class takes responsibility for all video // The VideoModeHandler class takes responsibility for all video
// mode functionality // mode functionality
VideoModeHandler myVidModeHandler; VideoModeHandler myVidModeHandler;

View File

@ -169,14 +169,8 @@ void DialogContainer::removeDialog()
cerr << "remove dialog" << endl; cerr << "remove dialog" << endl;
myDialogStack.pop(); myDialogStack.pop();
if(!myDialogStack.empty()) // Inform the frame buffer that it has to render all surfaces
{ myOSystem.frameBuffer().setPendingRender();
// Rerender all dialogs
myDialogStack.applyAll([&](Dialog*& d){
d->render();
});
myOSystem.frameBuffer().renderToScreen();
}
} }
} }