Changeset View
Changeset View
Standalone View
Standalone View
keyboard_input.cpp
Show First 20 Lines • Show All 383 Lines • ▼ Show 20 Line(s) | 383 | waylandServer()->seat()->updateKeyboardModifiers(xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_DEPRESSED)), | |||
---|---|---|---|---|---|
384 | xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LATCHED)), | 384 | xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LATCHED)), | ||
385 | xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LOCKED)), | 385 | xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LOCKED)), | ||
386 | layout); | 386 | layout); | ||
387 | } | 387 | } | ||
388 | } | 388 | } | ||
389 | 389 | | |||
390 | QString Xkb::layoutName() const | 390 | QString Xkb::layoutName() const | ||
391 | { | 391 | { | ||
392 | return QString::fromLocal8Bit(xkb_keymap_layout_get_name(m_keymap, m_currentLayout)); | 392 | return layoutName(m_currentLayout); | ||
393 | } | ||||
394 | | ||||
395 | QString Xkb::layoutName(xkb_layout_index_t layout) const | ||||
396 | { | ||||
397 | return QString::fromLocal8Bit(xkb_keymap_layout_get_name(m_keymap, layout)); | ||||
398 | } | ||||
399 | | ||||
400 | QMap<xkb_layout_index_t, QString> Xkb::layoutNames() const | ||||
401 | { | ||||
402 | QMap<xkb_layout_index_t, QString> layouts; | ||||
403 | const auto size = xkb_keymap_num_layouts(m_keymap); | ||||
404 | for (xkb_layout_index_t i = 0; i < size; i++) { | ||||
405 | layouts.insert(i, layoutName(i)); | ||||
406 | } | ||||
407 | return layouts; | ||||
393 | } | 408 | } | ||
394 | 409 | | |||
395 | void Xkb::updateConsumedModifiers(uint32_t key) | 410 | void Xkb::updateConsumedModifiers(uint32_t key) | ||
396 | { | 411 | { | ||
397 | Qt::KeyboardModifiers mods = Qt::NoModifier; | 412 | Qt::KeyboardModifiers mods = Qt::NoModifier; | ||
398 | if (xkb_state_mod_index_is_consumed2(m_state, key + 8, m_shiftModifier, XKB_CONSUMED_MODE_GTK) == 1) { | 413 | if (xkb_state_mod_index_is_consumed2(m_state, key + 8, m_shiftModifier, XKB_CONSUMED_MODE_GTK) == 1) { | ||
399 | mods |= Qt::ShiftModifier; | 414 | mods |= Qt::ShiftModifier; | ||
400 | } | 415 | } | ||
▲ Show 20 Lines • Show All 77 Lines • ▼ Show 20 Line(s) | |||||
478 | 493 | | |||
479 | void Xkb::switchToNextLayout() | 494 | void Xkb::switchToNextLayout() | ||
480 | { | 495 | { | ||
481 | if (!m_keymap || !m_state) { | 496 | if (!m_keymap || !m_state) { | ||
482 | return; | 497 | return; | ||
483 | } | 498 | } | ||
484 | const xkb_layout_index_t numLayouts = xkb_keymap_num_layouts(m_keymap); | 499 | const xkb_layout_index_t numLayouts = xkb_keymap_num_layouts(m_keymap); | ||
485 | const xkb_layout_index_t nextLayout = (xkb_state_serialize_layout(m_state, XKB_STATE_LAYOUT_EFFECTIVE) + 1) % numLayouts; | 500 | const xkb_layout_index_t nextLayout = (xkb_state_serialize_layout(m_state, XKB_STATE_LAYOUT_EFFECTIVE) + 1) % numLayouts; | ||
501 | switchToLayout(nextLayout); | ||||
502 | } | ||||
503 | | ||||
504 | void Xkb::switchToPreviousLayout() | ||||
505 | { | ||||
506 | if (!m_keymap || !m_state) { | ||||
507 | return; | ||||
508 | } | ||||
509 | const xkb_layout_index_t previousLayout = m_currentLayout == 0 ? numberOfLayouts() - 1 : m_currentLayout -1; | ||||
510 | switchToLayout(previousLayout); | ||||
511 | } | ||||
512 | | ||||
513 | void Xkb::switchToLayout(xkb_layout_index_t layout) | ||||
514 | { | ||||
515 | if (!m_keymap || !m_state) { | ||||
516 | return; | ||||
517 | } | ||||
518 | if (layout >= numberOfLayouts()) { | ||||
519 | return; | ||||
520 | } | ||||
486 | const xkb_mod_mask_t depressed = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_DEPRESSED)); | 521 | const xkb_mod_mask_t depressed = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_DEPRESSED)); | ||
487 | const xkb_mod_mask_t latched = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LATCHED)); | 522 | const xkb_mod_mask_t latched = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LATCHED)); | ||
488 | const xkb_mod_mask_t locked = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LOCKED)); | 523 | const xkb_mod_mask_t locked = xkb_state_serialize_mods(m_state, xkb_state_component(XKB_STATE_MODS_LOCKED)); | ||
489 | xkb_state_update_mask(m_state, depressed, latched, locked, 0, 0, nextLayout); | 524 | xkb_state_update_mask(m_state, depressed, latched, locked, 0, 0, layout); | ||
490 | updateModifiers(); | 525 | updateModifiers(); | ||
491 | } | 526 | } | ||
492 | 527 | | |||
528 | quint32 Xkb::numberOfLayouts() const | ||||
529 | { | ||||
530 | if (!m_keymap) { | ||||
531 | return 0; | ||||
532 | } | ||||
533 | return xkb_keymap_num_layouts(m_keymap); | ||||
534 | } | ||||
535 | | ||||
493 | KeyboardInputRedirection::KeyboardInputRedirection(InputRedirection *parent) | 536 | KeyboardInputRedirection::KeyboardInputRedirection(InputRedirection *parent) | ||
494 | : QObject(parent) | 537 | : QObject(parent) | ||
495 | , m_input(parent) | 538 | , m_input(parent) | ||
496 | , m_xkb(new Xkb(parent)) | 539 | , m_xkb(new Xkb(parent)) | ||
497 | { | 540 | { | ||
498 | } | 541 | } | ||
499 | 542 | | |||
500 | KeyboardInputRedirection::~KeyboardInputRedirection() = default; | 543 | KeyboardInputRedirection::~KeyboardInputRedirection() = default; | ||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Line(s) | |||||
553 | void KeyboardInputRedirection::init() | 596 | void KeyboardInputRedirection::init() | ||
554 | { | 597 | { | ||
555 | Q_ASSERT(!m_inited); | 598 | Q_ASSERT(!m_inited); | ||
556 | m_inited = true; | 599 | m_inited = true; | ||
557 | m_input->installInputEventSpy(new KeyStateChangedSpy(m_input)); | 600 | m_input->installInputEventSpy(new KeyStateChangedSpy(m_input)); | ||
558 | m_modifiersChangedSpy = new ModifiersChangedSpy(m_input); | 601 | m_modifiersChangedSpy = new ModifiersChangedSpy(m_input); | ||
559 | m_input->installInputEventSpy(m_modifiersChangedSpy); | 602 | m_input->installInputEventSpy(m_modifiersChangedSpy); | ||
560 | m_keyboardLayout = new KeyboardLayout(m_xkb.data()); | 603 | m_keyboardLayout = new KeyboardLayout(m_xkb.data()); | ||
604 | m_keyboardLayout->setConfig(KSharedConfig::openConfig(QStringLiteral("kxkbrc"), KConfig::NoGlobals)); | ||||
561 | m_keyboardLayout->init(); | 605 | m_keyboardLayout->init(); | ||
562 | m_input->installInputEventSpy(m_keyboardLayout); | 606 | m_input->installInputEventSpy(m_keyboardLayout); | ||
563 | 607 | | |||
564 | // setup key repeat | 608 | // setup key repeat | ||
565 | m_keyRepeat.timer = new QTimer(this); | 609 | m_keyRepeat.timer = new QTimer(this); | ||
566 | connect(m_keyRepeat.timer, &QTimer::timeout, this, | 610 | connect(m_keyRepeat.timer, &QTimer::timeout, this, | ||
567 | [this] { | 611 | [this] { | ||
568 | if (waylandServer()->seat()->keyRepeatRate() != 0) { | 612 | if (waylandServer()->seat()->keyRepeatRate() != 0) { | ||
▲ Show 20 Lines • Show All 154 Lines • Show Last 20 Lines |