- Press `Ctrl+Q` or `Cmd+Q` to quit.
- SDL3 gamepads use the standard SDL layout: left stick and D-pad map to joystick directions, South/East/West/North map to the first four buttons, and CD32 mode follows the Windows default button order where possible.
- Non-gamepad SDL joysticks expose their native axes, hats, and buttons; hats also map to joystick directions by default.
-- Press `F12` to open the integrated Qt settings UI during emulation.
+- Press `F12` to open the integrated Qt settings UI during emulation. The button row matches the Windows GUI: `OK` applies the edited configuration and resumes (floppy/CD changes are picked up live, including ejects), `Reset` applies the configuration and hard-resets the Amiga, `Restart` quits the running Amiga and returns to the launcher, `Quit` exits the emulator, and `Cancel` resumes without applying changes.
- The screenshot file input event and integrated runtime Qt Output-page button save under the configured Screenshots directory. Unix uses PNG when libpng is found at configure time and falls back to BMP otherwise. On macOS, libpng must also pass the configured deployment-target check; a newer Homebrew libpng is skipped so release builds stay compatible with the selected minimum macOS. SDL3 builds can also copy the screenshot event output to the host clipboard as BMP data, and clipboard sharing can exchange PNG plus macOS TIFF image data when the matching native codecs are available. Unix screenshots now cover autoclip, palette-indexed PNG when the framebuffer has 256 or fewer colors, continuous screenshot directories, and the savestate thumbnail byte helper. The Output page can also start internal DIB RGB AVI capture, PCM-in-AVI audio capture, and WAV audio capture.
- SDL3 builds can enable an OpenGL shader presenter with `WINUAE_UNIX_WITH_OPENGL_SHADER_PIPELINE`. When OpenGL is available, the Filter page's portable color, blur, noise, scanline, bilinear, and geometry controls are applied by a native GLSL path. Direct3D shader preset files, mask/overlay chains, HDR, and Metal/Vulkan backends are still future work.
- CHD hardfile and CD image support is built by default. CHD FLAC codecs require libFLAC that is compatible with the configured macOS deployment target; otherwise CHD remains enabled without FLAC-compressed CD codecs.
content->addWidget(navigation);
content->addWidget(outerFrame, 1);
+ runtimeMode = hardwareProvider.pollHostWindowEvents != nullptr;
QPushButton *reset = new QPushButton(QStringLiteral("Reset"));
QPushButton *quit = new QPushButton(QStringLiteral("Quit"));
QPushButton *restart = new QPushButton(QStringLiteral("Restart"));
QPushButton *errorLog = new QPushButton(QStringLiteral("Error log"));
- QPushButton *start = new QPushButton(QStringLiteral("Start"));
+ QPushButton *start = new QPushButton(runtimeMode ? QStringLiteral("OK") : QStringLiteral("Start"));
QPushButton *cancel = new QPushButton(QStringLiteral("Cancel"));
QPushButton *help = new QPushButton(QStringLiteral("Help"));
- restart->setVisible(false);
+ restart->setVisible(runtimeMode);
errorLog->setVisible(false);
start->setDefault(true);
- connect(reset, &QPushButton::clicked, this, [this]() { resetDefaults(); });
- connect(quit, &QPushButton::clicked, this, &QDialog::reject);
+ connect(reset, &QPushButton::clicked, this, [this]() {
+ if (runtimeMode) {
+ /* Windows: hard-reset the Amiga with the edited config and
+ * resume (IDC_RESETAMIGA sends IDOK after uae_reset). */
+ requestStart(true);
+ } else {
+ resetDefaults();
+ }
+ });
+ connect(quit, &QPushButton::clicked, this, [this]() {
+ result.status = WinUaeQtLauncherStatus::QuitRequested;
+ accept();
+ });
+ connect(restart, &QPushButton::clicked, this, [this]() {
+ result.status = WinUaeQtLauncherStatus::RestartRequested;
+ accept();
+ });
connect(cancel, &QPushButton::clicked, this, &QDialog::reject);
connect(start, &QPushButton::clicked, this, [this]() { startEmulator(); });
connect(help, &QPushButton::clicked, this, [this]() { openHelp(); });
QTreeWidget *navigation = nullptr;
QStackedWidget *pageStack = nullptr;
QLabel *status = nullptr;
+ bool runtimeMode = false;
QComboBox *configName = nullptr;
QLineEdit *configPath = nullptr;
const int driveType = dfEnable[i]->isChecked() ? floppyTypeConfigValue(dfType[i]->currentText()) : -1;
settings.insert(QStringLiteral("floppy%1type").arg(i), QString::number(driveType));
settings.insert(QStringLiteral("floppy%1wp").arg(i), dfWriteProtect[i]->isChecked() ? QStringLiteral("true") : QStringLiteral("false"));
- if (driveType >= 0 && !dfPath[i]->currentText().isEmpty()) {
- settings.insert(QStringLiteral("floppy%1").arg(i), dfPath[i]->currentText());
- }
+ /* Always write the path, empty included, so ejecting a disk in
+ * the runtime GUI reaches the core's disk-change detection. */
+ settings.insert(QStringLiteral("floppy%1").arg(i), driveType >= 0 ? dfPath[i]->currentText() : QString());
}
settings.insert(QStringLiteral("nr_floppies"), QString::number(enabledFloppyCount()));
settings.insert(QStringLiteral("floppy_speed"), QString::number(floppySpeedConfigValue(floppySpeed->value())));
settings.insert(QStringLiteral("gfx_filter_enable_lace"), filterStateFromUi(2).enable ? QStringLiteral("1") : QStringLiteral("0"));
for (int i = 0; i < MaxCdSlots; i++) {
const QString value = cdSlotConfigValue(cdSlotState(i));
- if (!value.isEmpty()) {
+ /* Slot 0 is always written, empty included, so ejecting the CD
+ * in the runtime GUI reaches the core. */
+ if (!value.isEmpty() || i == 0) {
settings.insert(QStringLiteral("cdimage%1").arg(i), value);
}
}
}
void startEmulator()
+ {
+ requestStart(false);
+ }
+
+ void requestStart(bool hardReset)
{
const WinUaeQtConfig config = mergedConfig();
const QStringList validationErrors = config.validateForLaunch();
}
result.status = WinUaeQtLauncherStatus::StartRequested;
+ result.hardReset = hardReset;
result.config = config;
accept();
}