correctly propagate video settings changes to all windows

This commit is contained in:
Arisotura 2024-10-27 13:43:26 +01:00
parent e576538268
commit 6d345cc1ea
6 changed files with 42 additions and 24 deletions

View File

@ -241,12 +241,12 @@ void EmuInstance::deleteAllWindows()
} }
void EmuInstance::broadcastCommand(int cmd) void EmuInstance::broadcastCommand(int cmd, QVariant param)
{ {
broadcastInstanceCommand(cmd, instanceID); broadcastInstanceCommand(cmd, param, instanceID);
} }
void EmuInstance::handleCommand(int cmd) void EmuInstance::handleCommand(int cmd, QVariant& param)
{ {
switch (cmd) switch (cmd)
{ {
@ -265,6 +265,10 @@ void EmuInstance::handleCommand(int cmd)
windowList[i]->loadRecentFilesMenu(true); windowList[i]->loadRecentFilesMenu(true);
} }
break; break;
/*case InstCmd_UpdateVideoSettings:
mainWindow->updateVideoSettings(param.value<bool>());
break;*/
} }
} }

View File

@ -92,8 +92,8 @@ public:
Config::Table& getGlobalConfig() { return globalCfg; } Config::Table& getGlobalConfig() { return globalCfg; }
Config::Table& getLocalConfig() { return localCfg; } Config::Table& getLocalConfig() { return localCfg; }
void broadcastCommand(int cmd); void broadcastCommand(int cmd, QVariant param = QVariant());
void handleCommand(int cmd); void handleCommand(int cmd, QVariant& param);
std::string instanceFileSuffix(); std::string instanceFileSuffix();

View File

@ -2147,14 +2147,11 @@ void MainWindow::onEmuReset()
void MainWindow::onUpdateVideoSettings(bool glchange) void MainWindow::onUpdateVideoSettings(bool glchange)
{ {
if (windowID != 0) // if we have a parent window: pass the message over to the parent
{ // the topmost parent takes care of updating all the windows
MainWindow* parentwin = (MainWindow*)parentWidget(); MainWindow* parentwin = (MainWindow*)parentWidget();
if (parentwin) if (parentwin)
parentwin->onUpdateVideoSettings(glchange); return parentwin->onUpdateVideoSettings(glchange);
return;
}
bool hadOGL = hasOGL; bool hadOGL = hasOGL;
if (glchange) if (glchange)
@ -2170,18 +2167,33 @@ void MainWindow::onUpdateVideoSettings(bool glchange)
if (glchange) if (glchange)
{ {
if (hasOGL) emuThread->initContext(windowID); if (hasOGL) emuThread->initContext(windowID);
}
if (windowID == 0) // update any child windows we have
auto childwins = findChildren<MainWindow *>(nullptr, Qt::FindDirectChildrenOnly);
for (auto child: childwins)
{
// child windows may belong to a different instance
// in that case we need to signal their thread appropriately
auto thread = child->getEmuInstance()->getEmuThread();
if (glchange)
{ {
auto childwins = findChildren<MainWindow *>(nullptr, Qt::FindDirectChildrenOnly); if (hadOGL) thread->deinitContext(child->windowID);
for (auto child: childwins) child->createScreenPanel();
{
if (hadOGL) emuThread->deinitContext(child->windowID);
child->createScreenPanel();
if (hasOGL) emuThread->initContext(child->windowID);
}
} }
if (child->getWindowID() == 0)
thread->updateVideoSettings();
if (glchange)
{
if (hasOGL) thread->initContext(child->windowID);
}
}
if (glchange)
{
emuThread->emuUnpause(); emuThread->emuUnpause();
} }
} }

View File

@ -135,6 +135,7 @@ public:
void updateMPInterface(melonDS::MPInterfaceType type); void updateMPInterface(melonDS::MPInterfaceType type);
void loadRecentFilesMenu(bool loadcfg); void loadRecentFilesMenu(bool loadcfg);
//void updateVideoSettings(bool glchange);
protected: protected:
void keyPressEvent(QKeyEvent* event) override; void keyPressEvent(QKeyEvent* event) override;

View File

@ -168,14 +168,14 @@ int numEmuInstances()
} }
void broadcastInstanceCommand(int cmd, int sourceinst) void broadcastInstanceCommand(int cmd, QVariant& param, int sourceinst)
{ {
for (int i = 0; i < kMaxEmuInstances; i++) for (int i = 0; i < kMaxEmuInstances; i++)
{ {
if (i == sourceinst) continue; if (i == sourceinst) continue;
if (!emuInstances[i]) continue; if (!emuInstances[i]) continue;
emuInstances[i]->handleCommand(cmd); emuInstances[i]->handleCommand(cmd, param);
} }
} }

View File

@ -37,6 +37,7 @@ enum
InstCmd_Unpause, InstCmd_Unpause,
InstCmd_UpdateRecentFiles, InstCmd_UpdateRecentFiles,
//InstCmd_UpdateVideoSettings,
}; };
class MelonApplication : public QApplication class MelonApplication : public QApplication
@ -58,7 +59,7 @@ void deleteEmuInstance(int id);
void deleteAllEmuInstances(int first = 0); void deleteAllEmuInstances(int first = 0);
int numEmuInstances(); int numEmuInstances();
void broadcastInstanceCommand(int cmd, int sourceinst); void broadcastInstanceCommand(int cmd, QVariant& param, int sourceinst);
void setMPInterface(melonDS::MPInterfaceType type); void setMPInterface(melonDS::MPInterfaceType type);