diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1c4a932c7..097d503b7 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -144,16 +144,11 @@ keyboard_getkeymap() } static LRESULT CALLBACK -emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) +input_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { LPKBDLLHOOKSTRUCT lpKdhs = (LPKBDLLHOOKSTRUCT) lParam; - /* Checks if CTRL was pressed. */ - BOOL bCtrlDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); uint16_t scancode = lpKdhs->scanCode & 0x00ff; - if ((nCode < 0) || (nCode != HC_ACTION) || (!mouse_capture && !video_fullscreen)) - return CallNextHookEx(NULL, nCode, wParam, lParam); - if (lpKdhs->flags & LLKHF_EXTENDED) scancode |= 0x100; @@ -184,7 +179,19 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) main_window->checkFullscreenHotkey(); - if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) && + return CallNextHookEx(NULL, nCode, wParam, lParam); +} + +static LRESULT CALLBACK +emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + LPKBDLLHOOKSTRUCT lpKdhs = (LPKBDLLHOOKSTRUCT) lParam; + /* Checks if CTRL was pressed. */ + BOOL bCtrlDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); + + if ((nCode < 0) || (nCode != HC_ACTION) || (!mouse_capture && !video_fullscreen)) + return CallNextHookEx(NULL, nCode, wParam, lParam); + else if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) return TRUE; else if ((lpKdhs->scanCode == 0x01) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) @@ -209,6 +216,11 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) } #endif +#ifdef Q_OS_WINDOWS +static HHOOK llhook = NULL; +static HHOOK llihook = NULL; +#endif + void main_thread_fn() { @@ -286,10 +298,6 @@ main_thread_fn() static std::thread *main_thread; -#ifdef Q_OS_WINDOWS -static HHOOK llhook = NULL; -#endif - int main(int argc, char *argv[]) { @@ -473,18 +481,12 @@ main(int argc, char *argv[]) }); } -#ifdef Q_OS_WINDOWS - if (!raw_input) { - llhook = SetWindowsHookEx(WH_KEYBOARD_LL, emu_LowLevelKeyboardProc, NULL, 0); - atexit([] () -> void { if (llhook) UnhookWindowsHookEx(llhook); }); - } -#endif - /* Setup raw input */ auto rawInputFilter = WindowsRawInputFilter::Register(main_window); if (rawInputFilter) { app.installNativeEventFilter(rawInputFilter.get()); - main_window->setSendKeyboardInput(false); + if (raw_input) + main_window->setSendKeyboardInput(false); } #endif @@ -543,6 +545,19 @@ main(int argc, char *argv[]) plat_pause(0); }); +#ifdef Q_OS_WINDOWS + if (!raw_input) { + llhook = SetWindowsHookEx(WH_KEYBOARD_LL, emu_LowLevelKeyboardProc, NULL, 0); + llihook = SetWindowsHookEx(WH_KEYBOARD_LL, input_LowLevelKeyboardProc, NULL, GetCurrentThreadId()); + atexit([] () -> void { + if (llihook) + UnhookWindowsHookEx(llihook); + if (llhook) + UnhookWindowsHookEx(llhook); + }); + } +#endif + const auto ret = app.exec(); cpu_thread_run = 0; main_thread->join(); diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 1fa5283d2..902ca10d6 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -524,7 +524,8 @@ MediaMenu::cdromMute(int i) void MediaMenu::cdromMount(int i, const QString &filename) { - QByteArray fn = filename.toUtf8().data(); + QByteArray fn = filename.toUtf8().data(); + int was_empty = cdrom_is_empty(i); cdrom_exit(i); @@ -542,9 +543,14 @@ MediaMenu::cdromMount(int i, const QString &filename) cdrom_image_open(&(cdrom[i]), fn.data()); /* Signal media change to the emulated machine. */ - if (cdrom[i].insert) + if (cdrom[i].insert) { cdrom[i].insert(cdrom[i].priv); + /* The drive was previously empty, transition directly to UNIT ATTENTION. */ + if (was_empty) + cdrom[i].insert(cdrom[i].priv); + } + if (strlen(cdrom[i].image_path) > 0) ui_sb_update_icon_state(SB_CDROM | i, 0); else