From 4f9af2eb779ac540b8ca557acdb2182c4b036f27 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 17 Feb 2022 10:25:37 +0600 Subject: [PATCH 1/4] Xi2: Warp mouse cursor only on Xi2 thread --- src/qt/xinput2_mouse.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index ff67b6a2c..b8af6f309 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -120,6 +120,14 @@ void xinput2_proc() prev_rel_coords[0] = relative_coords[0]; prev_rel_coords[1] = relative_coords[1]; prev_time = rawev->time; + if (!mouse_capture) break; + XWindowAttributes winattrib{}; + if (XGetWindowAttributes(disp, main_window->winId(), &winattrib)) { + auto globalPoint = main_window->mapToGlobal(QPoint(main_window->width() / 2, main_window->height() / 2)); + XWarpPointer(disp, XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), 0, 0, 0, 0, globalPoint.x(), globalPoint.y()); + XFlush(disp); + } + } case XI_Motion: { if (XKeysymToKeycode(disp, XK_Home) == 69) { @@ -175,13 +183,6 @@ void xinput2_poll() { mouse_x = xi2_mouse_x; mouse_y = xi2_mouse_y; - XWindowAttributes winattrib{}; - if (XGetWindowAttributes(disp, main_window->winId(), &winattrib)) - { - auto globalPoint = main_window->mapToGlobal(QPoint(main_window->width() / 2, main_window->height() / 2)); - XWarpPointer(disp, XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), XRootWindow(disp, XScreenNumberOfScreen(winattrib.screen)), 0, 0, 0, 0, globalPoint.x(), globalPoint.y()); - XFlush(disp); - } } xi2_mouse_x = 0; xi2_mouse_y = 0; From be3501cfe194e8417a7fe72d14d954432661b438 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 17 Feb 2022 11:45:42 +0600 Subject: [PATCH 2/4] qt: Avoid crashes on X11 at exit --- src/qt/qt_mainwindow.cpp | 4 ++++ src/qt/xinput2_mouse.cpp | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 6d7fb6592..986151b7c 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -445,6 +445,10 @@ void MainWindow::closeEvent(QCloseEvent *event) { } qt_nvr_save(); config_save(); +#ifdef __unix__ + extern void xinput2_exit(); + if (QApplication::platformName() == "xcb") xinput2_exit(); +#endif event->accept(); } diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index b8af6f309..0c31f6ca0 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -152,9 +152,12 @@ void xinput2_proc() void xinput2_exit() { - exitthread = true; - procThread->wait(5000); - procThread->terminate(); + if (!exitthread) + { + exitthread = true; + procThread->wait(5000); + procThread->terminate(); + } } void xinput2_init() From d87d0be2f8fde006da0fe1bb4608616fe6392d63 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 17 Feb 2022 11:51:24 +0600 Subject: [PATCH 3/4] qt: Uncapture mouse before exit --- src/qt/qt_platform.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 7c329c074..e676a1b92 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -337,6 +337,7 @@ extern int nvr_save(void); void plat_power_off(void) { + plat_mouse_capture(0); confirm_exit = 0; nvr_save(); config_save(); From 0ea4508ce3818de8d3acf9afe4abc6e2201f2af8 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 17 Feb 2022 14:45:52 +0600 Subject: [PATCH 4/4] qt: Fix media menu not appearing for non-HDD storage devices with certain IDE controllers --- src/qt/qt_machinestatus.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 71be8c232..ea83b630b 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -259,8 +259,8 @@ void MachineStatus::iterateCDROM(const std::function &cb) { for (size_t i = 0; i < CDROM_NUM; i++) { /* Could be Internal or External IDE.. */ if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((cdrom[i].bus_type == CDROM_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && @@ -277,8 +277,8 @@ void MachineStatus::iterateZIP(const std::function &cb) { for (size_t i = 0; i < ZIP_NUM; i++) { /* Could be Internal or External IDE.. */ if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((zip_drives[i].bus_type == ZIP_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) && @@ -295,8 +295,8 @@ void MachineStatus::iterateMO(const std::function &cb) { for (size_t i = 0; i < MO_NUM; i++) { /* Could be Internal or External IDE.. */ if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && - !hasIDE() && hdc_name != QStringLiteral("ide") && - hdc_name != QStringLiteral("xtide")) + !hasIDE() && hdc_name.left(3) != QStringLiteral("ide") && + hdc_name.left(5) != QStringLiteral("xtide")) continue; if ((mo_drives[i].bus_type == MO_BUS_SCSI) && !hasSCSI() && (scsi_card_current[0] == 0) && (scsi_card_current[1] == 0) &&