From 0ca9121cd39fd0e684987751848a75ca32678503 Mon Sep 17 00:00:00 2001 From: Squall-Leonhart Date: Sat, 28 Mar 2026 20:35:17 +1100 Subject: [PATCH 1/3] revert #1731 and gate the bluez headers properly. 1731 took a sledge hammer to the pairing button and skipped it entirely by build gating it behind linux only libraries, when those linux only libraries exist in an attempt to prevent builds failing on distro's lacking the bluetooth headers provided by bluez. This reverts that and properly gates the headers behind the HAS_BLUEZ definition. --- src/gui/wxgui/CMakeLists.txt | 7 +++---- src/gui/wxgui/input/InputSettings2.cpp | 4 ---- src/gui/wxgui/input/PairingDialog.cpp | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/gui/wxgui/CMakeLists.txt b/src/gui/wxgui/CMakeLists.txt index 12fc62d9..a5d851de 100644 --- a/src/gui/wxgui/CMakeLists.txt +++ b/src/gui/wxgui/CMakeLists.txt @@ -76,6 +76,8 @@ add_library(CemuWxGui STATIC input/InputAPIAddWindow.h input/InputSettings2.cpp input/InputSettings2.h + input/PairingDialog.cpp + input/PairingDialog.h input/panels/ClassicControllerInputPanel.cpp input/panels/ClassicControllerInputPanel.h input/panels/InputPanel.cpp @@ -124,10 +126,7 @@ if (ENABLE_METAL) endif() if (ENABLE_BLUEZ) - target_sources(CemuWxGui PRIVATE - input/PairingDialog.cpp - input/PairingDialog.h - ) + target_compile_definitions(CemuWxGui PRIVATE HAS_BLUEZ) endif() set_property(TARGET CemuWxGui PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") diff --git a/src/gui/wxgui/input/InputSettings2.cpp b/src/gui/wxgui/input/InputSettings2.cpp index d77e1430..1370bf07 100644 --- a/src/gui/wxgui/input/InputSettings2.cpp +++ b/src/gui/wxgui/input/InputSettings2.cpp @@ -21,9 +21,7 @@ #include "wxgui/input/InputAPIAddWindow.h" #include "input/ControllerFactory.h" -#ifdef HAS_BLUEZ #include "wxgui/input/PairingDialog.h" -#endif #include "wxgui/input/panels/VPADInputPanel.h" #include "wxgui/input/panels/ProControllerInputPanel.h" @@ -257,14 +255,12 @@ wxWindow* InputSettings2::initialize_page(size_t index) page_data.m_controller_api_remove = remove_api; } -#ifdef HAS_BLUEZ auto* pairingDialog = new wxButton(page, wxID_ANY, _("Pair Wii/Wii U Controller")); pairingDialog->Bind(wxEVT_BUTTON, [this](wxEvent&) { PairingDialog pairing_dialog(this); pairing_dialog.ShowModal(); }); sizer->Add(pairingDialog, wxGBPosition(5, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL | wxALL, 5); -#endif // controller auto* controller_bttns = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/gui/wxgui/input/PairingDialog.cpp b/src/gui/wxgui/input/PairingDialog.cpp index 9bf2870f..1ac4254a 100644 --- a/src/gui/wxgui/input/PairingDialog.cpp +++ b/src/gui/wxgui/input/PairingDialog.cpp @@ -4,7 +4,7 @@ #if BOOST_OS_WINDOWS #include #endif -#if BOOST_OS_LINUX +#ifdef HAS_BLUEZ #include #include #include From d31ccf28f23e9712f8343a15cdbe923166c1ee6e Mon Sep 17 00:00:00 2001 From: Squall-Leonhart Date: Sat, 28 Mar 2026 23:08:18 +1100 Subject: [PATCH 2/3] Improve pairing of RVL-CNT-01-TR and stop leaking windows handles. --- src/gui/wxgui/input/PairingDialog.cpp | 40 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/gui/wxgui/input/PairingDialog.cpp b/src/gui/wxgui/input/PairingDialog.cpp index 1ac4254a..732bb37e 100644 --- a/src/gui/wxgui/input/PairingDialog.cpp +++ b/src/gui/wxgui/input/PairingDialog.cpp @@ -157,6 +157,7 @@ void PairingDialog::WorkerThread() DWORD result = BluetoothGetRadioInfo(radio, &radioInfo); if (result != ERROR_SUCCESS) { + CloseHandle(radio); UpdateCallback(PairingState::NoBluetoothAvailable); return; } @@ -165,8 +166,8 @@ void PairingDialog::WorkerThread() { .dwSize = sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS), - .fReturnAuthenticated = FALSE, - .fReturnRemembered = FALSE, + .fReturnAuthenticated = TRUE, + .fReturnRemembered = TRUE, .fReturnUnknown = TRUE, .fReturnConnected = FALSE, @@ -184,22 +185,51 @@ void PairingDialog::WorkerThread() HBLUETOOTH_DEVICE_FIND deviceFind = BluetoothFindFirstDevice(&searchParams, &info); if (deviceFind == nullptr) { + CloseHandle(radio); UpdateCallback(PairingState::SearchFailed); return; } while (!m_threadShouldQuit) { - if (info.szName == wiimoteName || info.szName == wiiUProControllerName) + if (wcscmp(info.szName, wiimoteName.c_str()) == 0 || wcscmp(info.szName, wiiUProControllerName.c_str()) == 0) { BluetoothFindDeviceClose(deviceFind); + if (info.fAuthenticated) + { + DWORD bthResult = BluetoothSetServiceState(radio, &info, &bthHidGuid, BLUETOOTH_SERVICE_ENABLE); + if (bthResult != ERROR_SUCCESS) + { + CloseHandle(radio); + UpdateCallback(PairingState::PairingFailed); + return; + } + CloseHandle(radio); + UpdateCallback(PairingState::Finished); + return; + } + + if (info.fRemembered && !info.fAuthenticated) + { + BluetoothRemoveDevice(&info.Address); + Sleep(500); + } + UpdateCallback(PairingState::Pairing); wchar_t passwd[6] = {radioInfo.address.rgBytes[0], radioInfo.address.rgBytes[1], radioInfo.address.rgBytes[2], radioInfo.address.rgBytes[3], radioInfo.address.rgBytes[4], radioInfo.address.rgBytes[5]}; DWORD bthResult = BluetoothAuthenticateDevice(nullptr, radio, &info, passwd, 6); + if (bthResult != ERROR_SUCCESS) { + wchar_t passwd2[6] = {info.Address.rgBytes[0], info.Address.rgBytes[1], info.Address.rgBytes[2], info.Address.rgBytes[3], info.Address.rgBytes[4], info.Address.rgBytes[5]}; + bthResult = BluetoothAuthenticateDevice(nullptr, radio, &info, passwd2, 6); + } + + if (bthResult != ERROR_SUCCESS) + { + CloseHandle(radio); UpdateCallback(PairingState::PairingFailed); return; } @@ -207,10 +237,12 @@ void PairingDialog::WorkerThread() bthResult = BluetoothSetServiceState(radio, &info, &bthHidGuid, BLUETOOTH_SERVICE_ENABLE); if (bthResult != ERROR_SUCCESS) { + CloseHandle(radio); UpdateCallback(PairingState::PairingFailed); return; } + CloseHandle(radio); UpdateCallback(PairingState::Finished); return; } @@ -224,6 +256,8 @@ void PairingDialog::WorkerThread() BluetoothFindDeviceClose(deviceFind); } + + CloseHandle(radio); } #elif defined(HAS_BLUEZ) void PairingDialog::WorkerThread() From 991d21af762fe72ac7651c87cd889e3e01c60a39 Mon Sep 17 00:00:00 2001 From: Squall-Leonhart Date: Sun, 29 Mar 2026 04:42:38 +1100 Subject: [PATCH 3/3] Fix wiimote settings GUI --- src/gui/wxgui/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/wxgui/CMakeLists.txt b/src/gui/wxgui/CMakeLists.txt index a5d851de..3b76395b 100644 --- a/src/gui/wxgui/CMakeLists.txt +++ b/src/gui/wxgui/CMakeLists.txt @@ -129,6 +129,10 @@ if (ENABLE_BLUEZ) target_compile_definitions(CemuWxGui PRIVATE HAS_BLUEZ) endif() +if (SUPPORTS_WIIMOTE) + target_compile_definitions(CemuWxGui PRIVATE SUPPORTS_WIIMOTE) +endif() + set_property(TARGET CemuWxGui PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") cemu_use_precompiled_header(CemuWxGui)