diff options
author | Martin Negyokru <negyokru@inf.u-szeged.hu> | 2022-10-24 12:28:17 +0200 |
---|---|---|
committer | Martin Negyokru <negyokru@inf.u-szeged.hu> | 2022-12-12 11:08:25 +0100 |
commit | 48fa0fb2c32df11f0e8df0b8a46d6eddec4f46f3 (patch) | |
tree | 92f00a78fc1e4d2a9d7440625ed1f5b20c9d3aa2 /src/core | |
parent | 62ec648716a28b72f4deeea6b37c2e01caa1ce44 (diff) |
Override chromium's pointer_device implementations
Use QInputDevice to query pointer device specs.
Fixes: QTBUG-63174
Change-Id: I34737c903d2d9c8cb387941ef5e9b1b93afce1f0
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/core/pointer_device_qt.cpp | 102 |
2 files changed, 103 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 1be73b2ba..f5cb6e04d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -153,6 +153,7 @@ foreach(arch ${archs}) ozone/surface_factory_qt.cpp ozone/surface_factory_qt.h permission_manager_qt.cpp permission_manager_qt.h platform_notification_service_qt.cpp platform_notification_service_qt.h + pointer_device_qt.cpp pref_service_adapter.cpp pref_service_adapter.h process_main.cpp profile_adapter.cpp profile_adapter.h diff --git a/src/core/pointer_device_qt.cpp b/src/core/pointer_device_qt.cpp new file mode 100644 index 000000000..a3d7f3d37 --- /dev/null +++ b/src/core/pointer_device_qt.cpp @@ -0,0 +1,102 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +// based on chromium/ui/base/pointer/pointer_device_linux.cc +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/base/pointer/pointer_device.h" + +#include <algorithm> +#include <QPointingDevice> + +namespace ui { + +namespace { + +bool IsTouchScreen(const QInputDevice *device) +{ + return device->type() & QPointingDevice::DeviceType::TouchScreen; +} + +bool IsMouseOrTouchpad(const QInputDevice *device) +{ + return device->type() + & (QPointingDevice::DeviceType::TouchPad | QPointingDevice::DeviceType::Mouse); +} + +bool IsTouchDevicePresent() +{ + QList<const QInputDevice *> devices = QInputDevice::devices(); + return std::any_of(devices.constBegin(), devices.constEnd(), IsTouchScreen); +} + +bool IsMouseOrTouchpadPresent() +{ + QList<const QInputDevice *> devices = QInputDevice::devices(); + return std::any_of(devices.constBegin(), devices.constEnd(), IsMouseOrTouchpad); +} + +} // namespace + +int GetAvailablePointerTypes() +{ + int available_pointer_types = POINTER_TYPE_NONE; + if (IsMouseOrTouchpadPresent()) + available_pointer_types |= POINTER_TYPE_FINE; + + if (IsTouchDevicePresent()) + available_pointer_types |= POINTER_TYPE_COARSE; + + return available_pointer_types; +} + +int GetAvailableHoverTypes() +{ + if (IsMouseOrTouchpadPresent()) + return HOVER_TYPE_HOVER; + + return HOVER_TYPE_NONE; +} + +TouchScreensAvailability GetTouchScreensAvailability() +{ + if (!IsTouchDevicePresent()) + return TouchScreensAvailability::NONE; + + return TouchScreensAvailability::ENABLED; +} + +int MaxTouchPoints() +{ + int max_touch = 0; + for (const auto *device : QInputDevice::devices()) { + if (IsTouchScreen(device)) { + int points = static_cast<const QPointingDevice *>(device)->maximumPoints(); + max_touch = points > max_touch ? points : max_touch; + } + } + + return max_touch; +} + +PointerType GetPrimaryPointerType(int available_pointer_types) +{ + if (available_pointer_types & POINTER_TYPE_FINE) + return POINTER_TYPE_FINE; + if (available_pointer_types & POINTER_TYPE_COARSE) + return POINTER_TYPE_COARSE; + Q_ASSERT(available_pointer_types == POINTER_TYPE_NONE); + return POINTER_TYPE_NONE; +} + +HoverType GetPrimaryHoverType(int available_hover_types) +{ + if (available_hover_types & HOVER_TYPE_HOVER) + return HOVER_TYPE_HOVER; + Q_ASSERT(available_hover_types == HOVER_TYPE_NONE); + return HOVER_TYPE_NONE; +} + +} // namespace ui |