From 9354c6a6eff5e6f323f9c91a45a78dc8a80fe45f Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 20 Mar 2024 20:41:31 +0500 Subject: [PATCH 1/3] Qt: Fix CD-ROM menu not updating after ejecting a CD from the guest --- src/qt/CMakeLists.txt | 1 - src/qt/qt_cdrom.c | 54 ----------------------------------------- src/qt/qt_mediamenu.cpp | 23 ++++++++++++++++++ src/qt/qt_mediamenu.hpp | 1 + 4 files changed, 24 insertions(+), 55 deletions(-) delete mode 100644 src/qt/qt_cdrom.c diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index e189ec569..422989a44 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -61,7 +61,6 @@ add_library(plat STATIC add_library(ui STATIC qt_ui.cpp - qt_cdrom.c qt_mainwindow.cpp qt_mainwindow.hpp diff --git a/src/qt/qt_cdrom.c b/src/qt/qt_cdrom.c deleted file mode 100644 index 1facae486..000000000 --- a/src/qt/qt_cdrom.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 86Box A hypervisor and IBM PC system emulator that specializes in - * running old operating systems and software designed for IBM - * PC systems and compatibles from 1981 through fairly recent - * system designs based on the PCI bus. - * - * This file is part of the 86Box distribution. - * - * Handle the platform-side of CDROM/ZIP/MO drives. - * - * - * - * Authors: Miran Grca, - * Fred N. van Kempen, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2017-2018 Fred N. van Kempen. - */ - -#include -#include -#include -#include -#include -#include <86box/86box.h> -#include <86box/config.h> -#include <86box/timer.h> -#include <86box/device.h> -#include <86box/cassette.h> -#include <86box/cartridge.h> -#include <86box/fdd.h> -#include <86box/hdd.h> -#include <86box/scsi_device.h> -#include <86box/cdrom.h> -#include <86box/mo.h> -#include <86box/zip.h> -#include <86box/scsi_disk.h> -#include <86box/plat.h> -#include <86box/ui.h> - -void -plat_cdrom_ui_update(uint8_t id, uint8_t reload) -{ - cdrom_t *drv = &cdrom[id]; - - if (drv->host_drive == 0) { - ui_sb_update_icon_state(SB_CDROM | id, 1); - } else { - ui_sb_update_icon_state(SB_CDROM | id, 0); - } - - // media_menu_update_cdrom(id); - ui_sb_update_tip(SB_CDROM | id); -} diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 541e31190..2365fb728 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -521,6 +521,23 @@ MediaMenu::cdromReload(int index, int slot) ui_sb_update_tip(SB_CDROM | index); } +void +MediaMenu::cdromUpdateUi(int i) +{ + cdrom_t *drv = &cdrom[i]; + + if (drv->host_drive == 0) { + mhm.addImageToHistory(i, ui::MediaType::Optical, drv->prev_image_path, QString()); + ui_sb_update_icon_state(SB_CDROM | i, 1); + } else { + mhm.addImageToHistory(i, ui::MediaType::Optical, drv->prev_image_path, drv->image_path); + ui_sb_update_icon_state(SB_CDROM | i, 0); + } + + cdromUpdateMenu(i); + ui_sb_update_tip(SB_CDROM | i); +} + void MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) { @@ -892,6 +909,12 @@ MediaMenu::getMediaOpenDirectory() // callbacks from 86box C code extern "C" { +void +plat_cdrom_ui_update(uint8_t id, uint8_t reload) +{ + MediaMenu::ptr->cdromUpdateUi(id); +} + void zip_eject(uint8_t id) { diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index 57fd8dfc2..03d046847 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -45,6 +45,7 @@ public: void cdromMount(int i, const QString &filename); void cdromEject(int i); void cdromReload(int index, int slot); + void cdromUpdateUi(int i); void updateImageHistory(int index, int slot, ui::MediaType type); void clearImageHistory(); void cdromUpdateMenu(int i); From 4052ae2e32dad231fdcd6e806c155d5c222df901 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 20 Mar 2024 21:25:14 +0500 Subject: [PATCH 2/3] Use a signal instead --- src/qt/qt_mediamenu.cpp | 3 ++- src/qt/qt_mediamenu.hpp | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 2365fb728..7f7d120b8 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -61,6 +61,7 @@ MediaMenu::MediaMenu(QWidget *parent) : QObject(parent) { parentWidget = parent; + connect(this, &MediaMenu::onCdromUpdateUi, this, &MediaMenu::cdromUpdateUi, Qt::QueuedConnection); } void @@ -912,7 +913,7 @@ extern "C" { void plat_cdrom_ui_update(uint8_t id, uint8_t reload) { - MediaMenu::ptr->cdromUpdateUi(id); + emit MediaMenu::ptr->onCdromUpdateUi(id); } void diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index 03d046847..7835077b3 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -10,7 +10,7 @@ extern "C" { } class QMenu; -class MediaMenu : QObject { +class MediaMenu : public QObject { Q_OBJECT public: MediaMenu(QWidget *parent); @@ -45,7 +45,6 @@ public: void cdromMount(int i, const QString &filename); void cdromEject(int i); void cdromReload(int index, int slot); - void cdromUpdateUi(int i); void updateImageHistory(int index, int slot, ui::MediaType type); void clearImageHistory(); void cdromUpdateMenu(int i); @@ -68,6 +67,12 @@ public: void nicDisconnect(int i); void nicUpdateMenu(int i); +public slots: + void cdromUpdateUi(int i); + +signals: + void onCdromUpdateUi(int i); + private: QWidget *parentWidget = nullptr; From df231b0d873d6fd9fab83d0e7b869f65e46e409b Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 20 Mar 2024 22:26:10 +0500 Subject: [PATCH 3/3] Implement the rest of _eject/_mount functions Implement the rest of media eject/mount functions declared in plat.h, intended for future use --- src/qt/qt_mediamenu.cpp | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 7f7d120b8..af6d40e79 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -909,6 +909,47 @@ MediaMenu::getMediaOpenDirectory() // callbacks from 86box C code extern "C" { +void +cassette_mount(char *fn, uint8_t wp) +{ + MediaMenu::ptr->cassetteMount(QString(fn), wp); +} + +void +cassette_eject(void) +{ + MediaMenu::ptr->cassetteEject(); +} + +void +cartridge_mount(uint8_t id, char *fn, uint8_t wp) +{ + MediaMenu::ptr->cartridgeMount(id, QString(fn)); +} + +void +cartridge_eject(uint8_t id) +{ + MediaMenu::ptr->cartridgeEject(id); +} + +void +floppy_mount(uint8_t id, char *fn, uint8_t wp) +{ + MediaMenu::ptr->floppyMount(id, QString(fn), wp); +} + +void +floppy_eject(uint8_t id) +{ + MediaMenu::ptr->floppyEject(id); +} + +void +cdrom_mount(uint8_t id, char *fn) +{ + MediaMenu::ptr->cdromMount(id, QString(fn)); +} void plat_cdrom_ui_update(uint8_t id, uint8_t reload) @@ -922,6 +963,12 @@ zip_eject(uint8_t id) MediaMenu::ptr->zipEject(id); } +void +zip_mount(uint8_t id, char *fn, uint8_t wp) +{ + MediaMenu::ptr->zipMount(id, QString(fn), wp); +} + void zip_reload(uint8_t id) { @@ -934,6 +981,12 @@ mo_eject(uint8_t id) MediaMenu::ptr->moEject(id); } +void +mo_mount(uint8_t id, char *fn, uint8_t wp) +{ + MediaMenu::ptr->moMount(id, QString(fn), wp); +} + void mo_reload(uint8_t id) {