libinput/device: Use button mapping that is used in input handling for supported buttons
Fixes and prevents inconsistencies between those.
This commit is contained in:
parent
938b8c87a1
commit
80d28499e1
8 changed files with 81 additions and 63 deletions
|
@ -1,7 +1,7 @@
|
|||
include_directories(${Libinput_INCLUDE_DIRS})
|
||||
|
||||
add_definitions(-DKWIN_BUILD_TESTING)
|
||||
add_library(LibInputTestObjects STATIC ../../src/backends/libinput/device.cpp ../../src/backends/libinput/events.cpp ../../src/inputdevice.cpp mock_libinput.cpp)
|
||||
add_library(LibInputTestObjects STATIC ../../src/backends/libinput/device.cpp ../../src/backends/libinput/events.cpp ../../src/inputdevice.cpp ../../src/mousebuttons.cpp mock_libinput.cpp)
|
||||
target_link_libraries(LibInputTestObjects Qt::Test Qt::Widgets Qt::DBus Qt::Gui KF5::ConfigCore)
|
||||
target_include_directories(LibInputTestObjects PUBLIC ${CMAKE_SOURCE_DIR}/src)
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ target_sources(kwin PRIVATE
|
|||
linux_dmabuf.cpp
|
||||
main.cpp
|
||||
modifier_only_shortcuts.cpp
|
||||
mousebuttons.cpp
|
||||
moving_client_x11_filter.cpp
|
||||
netinfo.cpp
|
||||
onscreennotification.cpp
|
||||
|
|
|
@ -12,8 +12,10 @@
|
|||
|
||||
#include "libinput_logging.h"
|
||||
#include "main.h"
|
||||
#include "mousebuttons.h"
|
||||
#include "output.h"
|
||||
#include "platform.h"
|
||||
#include "pointer_input.h"
|
||||
|
||||
#include <QDBusArgument>
|
||||
#include <QDBusConnection>
|
||||
|
@ -333,31 +335,14 @@ Device::Device(libinput_device *device, QObject *parent)
|
|||
m_size = QSizeF(width, height);
|
||||
}
|
||||
if (m_pointer) {
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_LEFT) == 1) {
|
||||
m_supportedButtons |= Qt::LeftButton;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_MIDDLE) == 1) {
|
||||
m_supportedButtons |= Qt::MiddleButton;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_RIGHT) == 1) {
|
||||
m_supportedButtons |= Qt::RightButton;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_SIDE) == 1) {
|
||||
m_supportedButtons |= Qt::ExtraButton1;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_EXTRA) == 1) {
|
||||
m_supportedButtons |= Qt::ExtraButton2;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_BACK) == 1) {
|
||||
m_supportedButtons |= Qt::BackButton;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_FORWARD) == 1) {
|
||||
m_supportedButtons |= Qt::ForwardButton;
|
||||
}
|
||||
if (libinput_device_pointer_has_button(m_device, BTN_TASK) == 1) {
|
||||
m_supportedButtons |= Qt::TaskButton;
|
||||
// 0x120 is the first joystick Button
|
||||
for (int button = BTN_LEFT; button < 0x120; ++button) {
|
||||
if (libinput_device_pointer_has_button(m_device, button)) {
|
||||
m_supportedButtons |= buttonToQtMouseButton(button);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_keyboard) {
|
||||
m_alphaNumericKeyboard = checkAlphaNumericKeyboard(m_device);
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "inputmethod.h"
|
||||
#include "keyboard_input.h"
|
||||
#include "main.h"
|
||||
#include "mousebuttons.h"
|
||||
#include "pointer_input.h"
|
||||
#include "session.h"
|
||||
#include "tablet_input.h"
|
||||
|
|
52
src/mousebuttons.cpp
Normal file
52
src/mousebuttons.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2022 David Redondo <kde@david-redondo.de>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
#include "mousebuttons.h"
|
||||
#include <QHash>
|
||||
#include <linux/input-event-codes.h>
|
||||
|
||||
namespace KWin
|
||||
{
|
||||
|
||||
static const QHash<uint32_t, Qt::MouseButton> s_buttonToQtMouseButton = {
|
||||
{BTN_LEFT, Qt::LeftButton},
|
||||
{BTN_MIDDLE, Qt::MiddleButton},
|
||||
{BTN_RIGHT, Qt::RightButton},
|
||||
// in QtWayland mapped like that
|
||||
{BTN_SIDE, Qt::ExtraButton1},
|
||||
// in QtWayland mapped like that
|
||||
{BTN_EXTRA, Qt::ExtraButton2},
|
||||
{BTN_BACK, Qt::BackButton},
|
||||
{BTN_FORWARD, Qt::ForwardButton},
|
||||
{BTN_TASK, Qt::TaskButton},
|
||||
// mapped like that in QtWayland
|
||||
{0x118, Qt::ExtraButton6},
|
||||
{0x119, Qt::ExtraButton7},
|
||||
{0x11a, Qt::ExtraButton8},
|
||||
{0x11b, Qt::ExtraButton9},
|
||||
{0x11c, Qt::ExtraButton10},
|
||||
{0x11d, Qt::ExtraButton11},
|
||||
{0x11e, Qt::ExtraButton12},
|
||||
{0x11f, Qt::ExtraButton13},
|
||||
};
|
||||
|
||||
uint32_t qtMouseButtonToButton(Qt::MouseButton button)
|
||||
{
|
||||
return s_buttonToQtMouseButton.key(button);
|
||||
}
|
||||
|
||||
Qt::MouseButton buttonToQtMouseButton(uint32_t button)
|
||||
{
|
||||
// all other values get mapped to ExtraButton24
|
||||
// this is actually incorrect but doesn't matter in our usage
|
||||
// KWin internally doesn't use these high extra buttons anyway
|
||||
// it's only needed for recognizing whether buttons are pressed
|
||||
// if multiple buttons are mapped to the value the evaluation whether
|
||||
// buttons are pressed is correct and that's all we care about.
|
||||
return s_buttonToQtMouseButton.value(button, Qt::ExtraButton24);
|
||||
}
|
||||
|
||||
}
|
17
src/mousebuttons.h
Normal file
17
src/mousebuttons.h
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2022 David Redondo <kde@david-redondo.de>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <qnamespace.h>
|
||||
|
||||
namespace KWin
|
||||
{
|
||||
|
||||
uint32_t qtMouseButtonToButton(Qt::MouseButton button);
|
||||
Qt::MouseButton buttonToQtMouseButton(uint32_t button);
|
||||
|
||||
}
|
|
@ -16,6 +16,7 @@
|
|||
#include "effects.h"
|
||||
#include "input_event.h"
|
||||
#include "input_event_spy.h"
|
||||
#include "mousebuttons.h"
|
||||
#include "osd.h"
|
||||
#include "output.h"
|
||||
#include "platform.h"
|
||||
|
@ -50,44 +51,6 @@
|
|||
namespace KWin
|
||||
{
|
||||
|
||||
static const QHash<uint32_t, Qt::MouseButton> s_buttonToQtMouseButton = {
|
||||
{BTN_LEFT, Qt::LeftButton},
|
||||
{BTN_MIDDLE, Qt::MiddleButton},
|
||||
{BTN_RIGHT, Qt::RightButton},
|
||||
// in QtWayland mapped like that
|
||||
{BTN_SIDE, Qt::ExtraButton1},
|
||||
// in QtWayland mapped like that
|
||||
{BTN_EXTRA, Qt::ExtraButton2},
|
||||
{BTN_BACK, Qt::BackButton},
|
||||
{BTN_FORWARD, Qt::ForwardButton},
|
||||
{BTN_TASK, Qt::TaskButton},
|
||||
// mapped like that in QtWayland
|
||||
{0x118, Qt::ExtraButton6},
|
||||
{0x119, Qt::ExtraButton7},
|
||||
{0x11a, Qt::ExtraButton8},
|
||||
{0x11b, Qt::ExtraButton9},
|
||||
{0x11c, Qt::ExtraButton10},
|
||||
{0x11d, Qt::ExtraButton11},
|
||||
{0x11e, Qt::ExtraButton12},
|
||||
{0x11f, Qt::ExtraButton13},
|
||||
};
|
||||
|
||||
uint32_t qtMouseButtonToButton(Qt::MouseButton button)
|
||||
{
|
||||
return s_buttonToQtMouseButton.key(button);
|
||||
}
|
||||
|
||||
static Qt::MouseButton buttonToQtMouseButton(uint32_t button)
|
||||
{
|
||||
// all other values get mapped to ExtraButton24
|
||||
// this is actually incorrect but doesn't matter in our usage
|
||||
// KWin internally doesn't use these high extra buttons anyway
|
||||
// it's only needed for recognizing whether buttons are pressed
|
||||
// if multiple buttons are mapped to the value the evaluation whether
|
||||
// buttons are pressed is correct and that's all we care about.
|
||||
return s_buttonToQtMouseButton.value(button, Qt::ExtraButton24);
|
||||
}
|
||||
|
||||
static bool screenContainsPos(const QPointF &pos)
|
||||
{
|
||||
const auto outputs = workspace()->outputs();
|
||||
|
|
|
@ -40,7 +40,6 @@ namespace Decoration
|
|||
class DecoratedClientImpl;
|
||||
}
|
||||
|
||||
uint32_t qtMouseButtonToButton(Qt::MouseButton button);
|
||||
|
||||
class KWIN_EXPORT PointerInputRedirection : public InputDeviceHandler
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue