Add support for high-resolution wheel scrolling
This commit is contained in:
parent
fc23da9a04
commit
b6d27861d8
56
0001-Upgrade-the-default-scroll-distance-to-120.patch
Normal file
56
0001-Upgrade-the-default-scroll-distance-to-120.patch
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
From bf8dc2e2ed0780b947eccfc9ac3694c518dee605 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
Date: Wed, 23 Jan 2019 09:01:24 +1000
|
||||||
|
Subject: [PATCH xf86-input-libinput 1/3] Upgrade the default scroll distance
|
||||||
|
to 120
|
||||||
|
|
||||||
|
This is just a number, to be used as divider and shouldn't have any effect in
|
||||||
|
correctly written clients. With the high-res scrolling coming up however, we
|
||||||
|
have a few devices where the dist cannot be expressed as an integer fraction
|
||||||
|
of 15, so let's up it to 120 because we know all hardware wheels have to be an
|
||||||
|
integer fraction of that that, thanks to Microsoft's API requirements.
|
||||||
|
|
||||||
|
For non-wheel scrolls we need to now map into the new range. Previously we
|
||||||
|
just passed the scroll events on from the touchpad/button scrolling, meaning a
|
||||||
|
vdist of 15 meant 15 "libinput pixels" of scrolling resulted in a logical
|
||||||
|
wheel click. Now that we have 120 as vdist, we need to times the input data by
|
||||||
|
8 to keep the same proportions.
|
||||||
|
|
||||||
|
See 39b0bb4585106a56a51236d8e9843b2da8d745a5 for the previous revert.
|
||||||
|
|
||||||
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
---
|
||||||
|
src/xf86libinput.c | 9 ++++++---
|
||||||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
|
||||||
|
index 33b02da..adbc724 100644
|
||||||
|
--- a/src/xf86libinput.c
|
||||||
|
+++ b/src/xf86libinput.c
|
||||||
|
@@ -1652,8 +1652,11 @@ calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
* device. The user may change the ScrollPixelDistance
|
||||||
|
* though, so where we have a dist of 10 but an increment of
|
||||||
|
* 15, we need to scale from 0..10 into 0..15.
|
||||||
|
+ *
|
||||||
|
+ * We now switched to vdist of 120, so make this
|
||||||
|
+ * proportionate - 120/15 is 8.
|
||||||
|
*/
|
||||||
|
- value = value/dist * SCROLL_INCREMENT;
|
||||||
|
+ value = value/dist * SCROLL_INCREMENT * 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
*value_out = value;
|
||||||
|
@@ -3585,8 +3588,8 @@ xf86libinput_pre_init(InputDriverPtr drv,
|
||||||
|
* affect touchpad scroll speed. For wheels it doesn't matter as
|
||||||
|
* we're using the discrete value only.
|
||||||
|
*/
|
||||||
|
- driver_data->scroll.v.dist = SCROLL_INCREMENT;
|
||||||
|
- driver_data->scroll.h.dist = SCROLL_INCREMENT;
|
||||||
|
+ driver_data->scroll.v.dist = 120;
|
||||||
|
+ driver_data->scroll.h.dist = 120;
|
||||||
|
|
||||||
|
if (!is_subdevice) {
|
||||||
|
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER))
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
91
0002-Get-scroll-source-in-the-event-handler.patch
Normal file
91
0002-Get-scroll-source-in-the-event-handler.patch
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
From ca9042c7f08f8f0dc214b9cc19f3243728ec8c4a Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jose.exposito89@gmail.com>
|
||||||
|
Date: Wed, 4 Aug 2021 17:51:26 +0200
|
||||||
|
Subject: [PATCH xf86-input-libinput 2/3] Get scroll source in the event
|
||||||
|
handler
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Where libinput supports high-resolution scroll events, the scroll source
|
||||||
|
is encoded in the event type.
|
||||||
|
|
||||||
|
Get the scroll source in xf86libinput_handle_event to facilitate the
|
||||||
|
migration.
|
||||||
|
|
||||||
|
Refactor, no functional changes.
|
||||||
|
|
||||||
|
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
|
||||||
|
---
|
||||||
|
src/xf86libinput.c | 13 ++++++++-----
|
||||||
|
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
|
||||||
|
index adbc724..a8b7013 100644
|
||||||
|
--- a/src/xf86libinput.c
|
||||||
|
+++ b/src/xf86libinput.c
|
||||||
|
@@ -1631,15 +1631,14 @@ static inline bool
|
||||||
|
calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
enum libinput_pointer_axis axis,
|
||||||
|
struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis_source source,
|
||||||
|
double *value_out)
|
||||||
|
{
|
||||||
|
- enum libinput_pointer_axis_source source;
|
||||||
|
double value;
|
||||||
|
|
||||||
|
if (!libinput_event_pointer_has_axis(event, axis))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
- source = libinput_event_pointer_get_axis_source(event);
|
||||||
|
if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL) {
|
||||||
|
value = get_wheel_scroll_value(driver_data, event, axis);
|
||||||
|
} else {
|
||||||
|
@@ -1665,7 +1664,9 @@ calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
-xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *event)
|
||||||
|
+xf86libinput_handle_axis(InputInfoPtr pInfo,
|
||||||
|
+ struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis_source source)
|
||||||
|
{
|
||||||
|
DeviceIntPtr dev = pInfo->dev;
|
||||||
|
struct xf86libinput *driver_data = pInfo->private;
|
||||||
|
@@ -1678,7 +1679,6 @@ xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *even
|
||||||
|
|
||||||
|
valuator_mask_zero(mask);
|
||||||
|
|
||||||
|
- source = libinput_event_pointer_get_axis_source(event);
|
||||||
|
switch(source) {
|
||||||
|
case LIBINPUT_POINTER_AXIS_SOURCE_FINGER:
|
||||||
|
case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL:
|
||||||
|
@@ -1691,6 +1691,7 @@ xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *even
|
||||||
|
if (calculate_axis_value(driver_data,
|
||||||
|
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
|
||||||
|
event,
|
||||||
|
+ source,
|
||||||
|
&value))
|
||||||
|
valuator_mask_set_double(mask, 3, value);
|
||||||
|
|
||||||
|
@@ -1700,6 +1701,7 @@ xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *even
|
||||||
|
if (calculate_axis_value(driver_data,
|
||||||
|
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
|
||||||
|
event,
|
||||||
|
+ source,
|
||||||
|
&value))
|
||||||
|
valuator_mask_set_double(mask, 2, value);
|
||||||
|
|
||||||
|
@@ -2381,7 +2383,8 @@ xf86libinput_handle_event(struct libinput_event *event)
|
||||||
|
break;
|
||||||
|
case LIBINPUT_EVENT_POINTER_AXIS:
|
||||||
|
xf86libinput_handle_axis(pInfo,
|
||||||
|
- libinput_event_get_pointer_event(event));
|
||||||
|
+ libinput_event_get_pointer_event(event),
|
||||||
|
+ libinput_event_pointer_get_axis_source(event));
|
||||||
|
break;
|
||||||
|
case LIBINPUT_EVENT_TOUCH_FRAME:
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
210
0003-Use-the-new-v120-API-from-libinput-if-available.patch
Normal file
210
0003-Use-the-new-v120-API-from-libinput-if-available.patch
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
From beb94333e1450006942a7f0ee38bc2a2f5719238 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
Date: Wed, 23 Jan 2019 20:07:37 +1000
|
||||||
|
Subject: [PATCH xf86-input-libinput 3/3] Use the new v120 API from libinput if
|
||||||
|
available
|
||||||
|
|
||||||
|
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||||
|
---
|
||||||
|
configure.ac | 12 ++++++
|
||||||
|
src/xf86libinput.c | 105 ++++++++++++++++++++++++++++++++++++++-------
|
||||||
|
2 files changed, 101 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 176d22e..f747a3d 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -62,6 +62,18 @@ AC_LINK_IFELSE(
|
||||||
|
[libinput_have_scroll_button_lock=yes]],
|
||||||
|
[AC_MSG_RESULT([no])
|
||||||
|
[libinput_have_scroll_button_lock=no]])
|
||||||
|
+
|
||||||
|
+AC_MSG_CHECKING([if libinput_event_pointer_get_scroll_value_v120 is available])
|
||||||
|
+AC_LINK_IFELSE(
|
||||||
|
+ [AC_LANG_PROGRAM([[#include <libinput.h>]],
|
||||||
|
+ [[libinput_event_pointer_get_scroll_value_v120(NULL, 0)]])],
|
||||||
|
+ [AC_MSG_RESULT([yes])
|
||||||
|
+ AC_DEFINE(HAVE_LIBINPUT_AXIS_VALUE_V120, [1],
|
||||||
|
+ [libinput_event_pointer_get_scroll_value_v120() is available])
|
||||||
|
+ [libinput_have_axis_value_v120=yes]],
|
||||||
|
+ [AC_MSG_RESULT([no])
|
||||||
|
+ [libinput_have_axis_value_v120=no]])
|
||||||
|
+
|
||||||
|
LIBS=$OLD_LIBS
|
||||||
|
CFLAGS=$OLD_CFLAGS
|
||||||
|
|
||||||
|
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
|
||||||
|
index a8b7013..0cb0c3c 100644
|
||||||
|
--- a/src/xf86libinput.c
|
||||||
|
+++ b/src/xf86libinput.c
|
||||||
|
@@ -1565,9 +1565,9 @@ xf86libinput_handle_key(InputInfoPtr pInfo, struct libinput_event_keyboard *even
|
||||||
|
* so the use-case above shouldn't matter anymore.
|
||||||
|
*/
|
||||||
|
static inline double
|
||||||
|
-get_wheel_scroll_value(struct xf86libinput *driver_data,
|
||||||
|
- struct libinput_event_pointer *event,
|
||||||
|
- enum libinput_pointer_axis axis)
|
||||||
|
+guess_wheel_scroll_value(struct xf86libinput *driver_data,
|
||||||
|
+ struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis axis)
|
||||||
|
{
|
||||||
|
struct scroll_axis *s;
|
||||||
|
double f;
|
||||||
|
@@ -1627,6 +1627,54 @@ out:
|
||||||
|
return s->dist/s->fraction * discrete;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if HAVE_LIBINPUT_AXIS_VALUE_V120
|
||||||
|
+static inline double
|
||||||
|
+get_wheel_120_value(struct xf86libinput *driver_data,
|
||||||
|
+ struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis axis)
|
||||||
|
+{
|
||||||
|
+ struct scroll_axis *s;
|
||||||
|
+ double angle;
|
||||||
|
+
|
||||||
|
+ switch (axis) {
|
||||||
|
+ case LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL:
|
||||||
|
+ s = &driver_data->scroll.h;
|
||||||
|
+ break;
|
||||||
|
+ case LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL:
|
||||||
|
+ s = &driver_data->scroll.v;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ return 0.0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ angle = libinput_event_pointer_get_scroll_value_v120(event, axis);
|
||||||
|
+ return s->dist * angle/120;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+static inline double
|
||||||
|
+get_wheel_scroll_value(struct xf86libinput *driver_data,
|
||||||
|
+ struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis axis)
|
||||||
|
+{
|
||||||
|
+#if HAVE_LIBINPUT_AXIS_VALUE_V120
|
||||||
|
+ return get_wheel_120_value(driver_data, event, axis);
|
||||||
|
+#else
|
||||||
|
+ return guess_wheel_scroll_value(driver_data, event, axis);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline double
|
||||||
|
+get_finger_or_continuous_scroll_value(struct libinput_event_pointer *event,
|
||||||
|
+ enum libinput_pointer_axis axis)
|
||||||
|
+{
|
||||||
|
+#if HAVE_LIBINPUT_AXIS_VALUE_V120
|
||||||
|
+ return libinput_event_pointer_get_scroll_value(event, axis);
|
||||||
|
+#else
|
||||||
|
+ return libinput_event_pointer_get_axis_value(event, axis);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static inline bool
|
||||||
|
calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
enum libinput_pointer_axis axis,
|
||||||
|
@@ -1639,13 +1687,21 @@ calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
if (!libinput_event_pointer_has_axis(event, axis))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
+ /* Event may be LIBINPUT_POINTER_AXIS or
|
||||||
|
+ * LIBINPUT_EVENT_POINTER_SCROLL_{WHEEL|FINGER|CONTINUOUS}, depending
|
||||||
|
+ * on the libinput version.
|
||||||
|
+ *
|
||||||
|
+ * libinput guarantees the axis source is set for the second set of
|
||||||
|
+ * events too but we can switch to the event type once we ditch
|
||||||
|
+ * libinput < 1.19 support.
|
||||||
|
+ */
|
||||||
|
if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL) {
|
||||||
|
value = get_wheel_scroll_value(driver_data, event, axis);
|
||||||
|
} else {
|
||||||
|
double dist = driver_data->options.scroll_pixel_distance;
|
||||||
|
assert(dist != 0.0);
|
||||||
|
|
||||||
|
- value = libinput_event_pointer_get_axis_value(event, axis);
|
||||||
|
+ value = get_finger_or_continuous_scroll_value(event, axis);
|
||||||
|
/* We need to scale this value into our scroll increment range
|
||||||
|
* because that one is constant for the lifetime of the
|
||||||
|
* device. The user may change the ScrollPixelDistance
|
||||||
|
@@ -1665,29 +1721,21 @@ calculate_axis_value(struct xf86libinput *driver_data,
|
||||||
|
|
||||||
|
static void
|
||||||
|
xf86libinput_handle_axis(InputInfoPtr pInfo,
|
||||||
|
- struct libinput_event_pointer *event,
|
||||||
|
+ struct libinput_event *e,
|
||||||
|
enum libinput_pointer_axis_source source)
|
||||||
|
{
|
||||||
|
+ struct libinput_event_pointer *event;
|
||||||
|
DeviceIntPtr dev = pInfo->dev;
|
||||||
|
struct xf86libinput *driver_data = pInfo->private;
|
||||||
|
ValuatorMask *mask = driver_data->valuators;
|
||||||
|
double value;
|
||||||
|
- enum libinput_pointer_axis_source source;
|
||||||
|
|
||||||
|
if ((driver_data->capabilities & CAP_POINTER) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
valuator_mask_zero(mask);
|
||||||
|
|
||||||
|
- switch(source) {
|
||||||
|
- case LIBINPUT_POINTER_AXIS_SOURCE_FINGER:
|
||||||
|
- case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL:
|
||||||
|
- case LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS:
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ event = libinput_event_get_pointer_event(e);
|
||||||
|
if (calculate_axis_value(driver_data,
|
||||||
|
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
|
||||||
|
event,
|
||||||
|
@@ -1705,6 +1753,11 @@ xf86libinput_handle_axis(InputInfoPtr pInfo,
|
||||||
|
&value))
|
||||||
|
valuator_mask_set_double(mask, 2, value);
|
||||||
|
|
||||||
|
+ if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL &&
|
||||||
|
+ !valuator_mask_isset(mask, 2) &&
|
||||||
|
+ !valuator_mask_isset(mask, 3))
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
out:
|
||||||
|
xf86PostMotionEventM(dev, Relative, mask);
|
||||||
|
}
|
||||||
|
@@ -2382,10 +2435,30 @@ xf86libinput_handle_event(struct libinput_event *event)
|
||||||
|
libinput_event_get_keyboard_event(event));
|
||||||
|
break;
|
||||||
|
case LIBINPUT_EVENT_POINTER_AXIS:
|
||||||
|
+#if !HAVE_LIBINPUT_AXIS_VALUE_V120
|
||||||
|
+ /* ignore POINTER_AXIS where we have libinput 1.19 and higher */
|
||||||
|
xf86libinput_handle_axis(pInfo,
|
||||||
|
- libinput_event_get_pointer_event(event),
|
||||||
|
+ event,
|
||||||
|
libinput_event_pointer_get_axis_source(event));
|
||||||
|
+#endif
|
||||||
|
break;
|
||||||
|
+#if HAVE_LIBINPUT_AXIS_VALUE_V120
|
||||||
|
+ case LIBINPUT_EVENT_POINTER_SCROLL_WHEEL:
|
||||||
|
+ xf86libinput_handle_axis(pInfo,
|
||||||
|
+ event,
|
||||||
|
+ LIBINPUT_POINTER_AXIS_SOURCE_WHEEL);
|
||||||
|
+ break;
|
||||||
|
+ case LIBINPUT_EVENT_POINTER_SCROLL_FINGER:
|
||||||
|
+ xf86libinput_handle_axis(pInfo,
|
||||||
|
+ event,
|
||||||
|
+ LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
|
||||||
|
+ break;
|
||||||
|
+ case LIBINPUT_EVENT_POINTER_SCROLL_CONTINUOUS:
|
||||||
|
+ xf86libinput_handle_axis(pInfo,
|
||||||
|
+ event,
|
||||||
|
+ LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS);
|
||||||
|
+ break;
|
||||||
|
+#endif
|
||||||
|
case LIBINPUT_EVENT_TOUCH_FRAME:
|
||||||
|
break;
|
||||||
|
case LIBINPUT_EVENT_TOUCH_UP:
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
@ -8,7 +8,7 @@
|
|||||||
Summary: Xorg X11 libinput input driver
|
Summary: Xorg X11 libinput input driver
|
||||||
Name: xorg-x11-drv-libinput
|
Name: xorg-x11-drv-libinput
|
||||||
Version: 1.1.0
|
Version: 1.1.0
|
||||||
Release: 1%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist}
|
Release: 2%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
|
|
||||||
@ -23,6 +23,11 @@ Source1: 71-libinput-overrides-wacom.conf
|
|||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1413306
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1413306
|
||||||
Patch01: 0001-Add-a-DPIScaleFactor-option-as-temporary-solution-to.patch
|
Patch01: 0001-Add-a-DPIScaleFactor-option-as-temporary-solution-to.patch
|
||||||
|
|
||||||
|
# High-resolution wheel scrolling (needs libinput 1.19)
|
||||||
|
Patch02: 0001-Upgrade-the-default-scroll-distance-to-120.patch
|
||||||
|
Patch03: 0002-Get-scroll-source-in-the-event-handler.patch
|
||||||
|
Patch04: 0003-Use-the-new-v120-API-from-libinput-if-available.patch
|
||||||
|
|
||||||
BuildRequires: make
|
BuildRequires: make
|
||||||
BuildRequires: autoconf automake libtool
|
BuildRequires: autoconf automake libtool
|
||||||
BuildRequires: xorg-x11-server-devel >= 1.14.0
|
BuildRequires: xorg-x11-server-devel >= 1.14.0
|
||||||
@ -78,6 +83,9 @@ Xorg X11 libinput input driver development files.
|
|||||||
%{_includedir}/xorg/libinput-properties.h
|
%{_includedir}/xorg/libinput-properties.h
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Sep 03 2021 Peter Hutterer <peter.hutterer@redhat.com> - 1.1.0-2
|
||||||
|
- Add support for high-resolution wheel scrolling
|
||||||
|
|
||||||
* Fri Sep 03 2021 Peter Hutterer <peter.hutterer@redhat.com> - 1.1.0-1
|
* Fri Sep 03 2021 Peter Hutterer <peter.hutterer@redhat.com> - 1.1.0-1
|
||||||
- xf86-input-libinput 1.1.0
|
- xf86-input-libinput 1.1.0
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user