summaryrefslogtreecommitdiff
path: root/src/managers/InputManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-06-03 18:59:39 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-06-03 18:59:39 +0200
commit1a93b2a7565d2bb6e376ce1884a4a43178ba443b (patch)
treecb4aa14b68422cd27d1b4e1a15946fb8c54fe78c /src/managers/InputManager.cpp
parent10c2bd06863e2b85ff740b71fdd57f4ae8ea5cad (diff)
Handle keyboards better
Also fixes some crashes of apps on reload
Diffstat (limited to 'src/managers/InputManager.cpp')
-rw-r--r--src/managers/InputManager.cpp50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/managers/InputManager.cpp b/src/managers/InputManager.cpp
index 0017a4f0..3df8f7fc 100644
--- a/src/managers/InputManager.cpp
+++ b/src/managers/InputManager.cpp
@@ -253,6 +253,10 @@ void CInputManager::newKeyboard(wlr_input_device* keyboard) {
PNEWKEYBOARD->hyprListener_keyboardKey.initCallback(&keyboard->keyboard->events.key, &Events::listener_keyboardKey, PNEWKEYBOARD, "Keyboard");
PNEWKEYBOARD->hyprListener_keyboardDestroy.initCallback(&keyboard->events.destroy, &Events::listener_keyboardDestroy, PNEWKEYBOARD, "Keyboard");
+ if (m_pActiveKeyboard)
+ m_pActiveKeyboard->active = false;
+ m_pActiveKeyboard = PNEWKEYBOARD;
+
wlr_seat_set_keyboard(g_pCompositor->m_sSeat.seat, keyboard->keyboard);
Debug::log(LOG, "New keyboard created, pointers Hypr: %x and WLR: %x", PNEWKEYBOARD, keyboard);
@@ -287,28 +291,29 @@ void CInputManager::setKeyboardLayout() {
const auto PLASTKEEB = wlr_seat_get_keyboard(g_pCompositor->m_sSeat.seat);
- // TODO: configure devices one by one
- for (auto& k : m_lKeyboards) {
- wlr_keyboard_set_keymap(k.keyboard->keyboard, KEYMAP);
+ if (!PLASTKEEB) {
+ xkb_keymap_unref(KEYMAP);
+ xkb_context_unref(CONTEXT);
- wlr_seat_set_keyboard(g_pCompositor->m_sSeat.seat, k.keyboard->keyboard);
-
- wlr_keyboard_modifiers wlrMods = {0};
+ Debug::log(ERR, "No Seat Keyboard???");
+ return;
+ }
- if (g_pConfigManager->getInt("input:numlock_by_default") == 1) {
- // lock numlock
- const auto IDX = xkb_map_mod_get_index(KEYMAP, XKB_MOD_NAME_NUM);
+ wlr_keyboard_set_keymap(PLASTKEEB, KEYMAP);
- if (IDX != XKB_MOD_INVALID)
- wlrMods.locked |= (uint32_t)1 << IDX;
- }
+ wlr_keyboard_modifiers wlrMods = {0};
- if (wlrMods.locked != 0) {
- wlr_seat_keyboard_notify_modifiers(g_pCompositor->m_sSeat.seat, &wlrMods);
- }
+ if (g_pConfigManager->getInt("input:numlock_by_default") == 1) {
+ // lock numlock
+ const auto IDX = xkb_map_mod_get_index(KEYMAP, XKB_MOD_NAME_NUM);
+
+ if (IDX != XKB_MOD_INVALID)
+ wlrMods.locked |= (uint32_t)1 << IDX;
+ }
+
+ if (wlrMods.locked != 0) {
+ wlr_seat_keyboard_notify_modifiers(g_pCompositor->m_sSeat.seat, &wlrMods);
}
-
- wlr_seat_set_keyboard(g_pCompositor->m_sSeat.seat, PLASTKEEB);
xkb_keymap_unref(KEYMAP);
xkb_context_unref(CONTEXT);
@@ -351,6 +356,17 @@ void CInputManager::destroyKeyboard(SKeyboard* pKeyboard) {
pKeyboard->hyprListener_keyboardMod.removeCallback();
pKeyboard->hyprListener_keyboardKey.removeCallback();
+ if (pKeyboard->active) {
+ m_lKeyboards.remove(*pKeyboard);
+
+ if (m_lKeyboards.size() > 0) {
+ m_pActiveKeyboard = &m_lKeyboards.back();
+ m_pActiveKeyboard->active = true;
+ } else {
+ m_pActiveKeyboard = nullptr;
+ }
+ }
+
m_lKeyboards.remove(*pKeyboard);
}