From 9d7d5ec3c8ea3550ca3053a7a26e97231ad6fde9 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Wed, 12 Jun 2024 17:03:04 +0200 Subject: [PATCH] seatmgr: fix missing nullcheck in updateActiveKeyboardData sometimes we may set a keyboard that's about-to-be-deleted, we might as well check for that additionally avoid setting null keyboards altogether --- src/managers/SeatManager.cpp | 2 +- src/managers/input/InputManager.cpp | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp index c1b13ccb39a..a58bca7261f 100644 --- a/src/managers/SeatManager.cpp +++ b/src/managers/SeatManager.cpp @@ -94,7 +94,7 @@ void CSeatManager::setKeyboard(SP KEEB) { } void CSeatManager::updateActiveKeyboardData() { - if (keyboard) + if (keyboard && keyboard->wlr()) PROTO::seat->updateRepeatInfo(keyboard->wlr()->repeat_info.rate, keyboard->wlr()->repeat_info.delay); PROTO::seat->updateKeymap(); } diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 033f4d6db62..ed8e834cefd 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -1226,12 +1226,20 @@ void CInputManager::destroyKeyboard(SP pKeyboard) { std::erase_if(m_vKeyboards, [pKeyboard](const auto& other) { return other == pKeyboard; }); if (m_vKeyboards.size() > 0) { - const auto PNEWKEYBOARD = m_vKeyboards.back(); - g_pSeatManager->setKeyboard(PNEWKEYBOARD); - PNEWKEYBOARD->active = true; - } else { + bool found = false; + for (auto& k : m_vKeyboards | std::views::reverse) { + if (!k->wlr()) + continue; + + g_pSeatManager->setKeyboard(k); + found = true; + break; + } + + if (!found) + g_pSeatManager->setKeyboard(nullptr); + } else g_pSeatManager->setKeyboard(nullptr); - } removeFromHIDs(pKeyboard); }