This change adds flags to track which property of a touch point is set.
With that reasonable default values can be provided when an information
is not available.
---
 src/evdev.c    | 29 ++++++++++++++++++++---------
 src/evdev.h    | 10 ++++++++++
 src/libinput.c |  4 ++++
 test/touch.c   | 42 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+), 9 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index f75e1c3..5720c8c 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -315,10 +315,9 @@ evdev_flush_pending_event(struct evdev_device *device, 
uint64_t time)
                point = slot_data->point;
                transform_absolute(device, &point);
 
-               touch_notify_touch_down(base, time, slot, seat_slot,
-                                       &point, slot_data->touch_major,
-                                       slot_data->touch_minor, 
slot_data->orientation,
-                                       slot_data->pressure);
+               touch_notify_touch_down(base, time, slot, seat_slot, &point,
+                                       slot_data->touch_major, 
slot_data->touch_minor,
+                                       slot_data->orientation, 
slot_data->pressure);
                break;
        case EVDEV_ABSOLUTE_MT_MOTION:
                if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
@@ -333,10 +332,9 @@ evdev_flush_pending_event(struct evdev_device *device, 
uint64_t time)
                        break;
 
                transform_absolute(device, &point);
-               touch_notify_touch_motion(base, time, slot, seat_slot,
-                                         &point, slot_data->touch_major,
-                                         slot_data->touch_minor, 
slot_data->orientation,
-                                         slot_data->pressure);
+               touch_notify_touch_motion(base, time, slot, seat_slot, &point,
+                                         slot_data->touch_major, 
slot_data->touch_minor,
+                                         slot_data->orientation, 
slot_data->pressure);
                break;
        case EVDEV_ABSOLUTE_MT_UP:
                if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
@@ -572,8 +570,15 @@ evdev_process_touch(struct evdev_device *device,
                if (device->pending_event != EVDEV_NONE &&
                    device->pending_event != EVDEV_ABSOLUTE_MT_MOTION)
                        evdev_flush_pending_event(device, time);
-               if (e->value >= 0)
+               if (e->value >= 0) {
+                       struct mt_slot *current_slot = 
&device->mt.slots[device->mt.slot];
                        device->pending_event = EVDEV_ABSOLUTE_MT_DOWN;
+                       current_slot->available_data = TOUCH_SLOT_DATA_NONE;
+                       current_slot->pressure = DEFAULT_TOUCH_PRESSURE;
+                       current_slot->orientation = DEFAULT_TOUCH_ORIENTATION;
+                       current_slot->touch_major = DEFAULT_TOUCH_MAJOR;
+                       current_slot->touch_minor = DEFAULT_TOUCH_MINOR;
+               }
                else
                        device->pending_event = EVDEV_ABSOLUTE_MT_UP;
        } else {
@@ -589,18 +594,24 @@ evdev_process_touch(struct evdev_device *device,
                        wake_device_on_mt_motion(device);
                        break;
                case ABS_MT_TOUCH_MAJOR:
+                       current_slot->available_data |= 
TOUCH_SLOT_DATA_TOUCH_MAJOR;
                        current_slot->touch_major = e->value;
+                       if (!(current_slot->available_data & 
TOUCH_SLOT_DATA_TOUCH_MINOR))
+                               current_slot->touch_minor = e->value;
                        wake_device_on_mt_motion(device);
                        break;
                case ABS_MT_TOUCH_MINOR:
+                       current_slot->available_data |= 
TOUCH_SLOT_DATA_TOUCH_MINOR;
                        current_slot->touch_minor = e->value;
                        wake_device_on_mt_motion(device);
                        break;
                case ABS_MT_ORIENTATION:
+                       current_slot->available_data |= 
TOUCH_SLOT_DATA_ORIENTATION;
                        current_slot->orientation = e->value;
                        wake_device_on_mt_motion(device);
                        break;
                case ABS_MT_PRESSURE:
+                       current_slot->available_data |= 
TOUCH_SLOT_DATA_PRESSURE;
                        current_slot->pressure = e->value;
                        wake_device_on_mt_motion(device);
                        break;
diff --git a/src/evdev.h b/src/evdev.h
index c7d762b..68c4c5a 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -105,9 +105,19 @@ enum evdev_device_model {
        EVDEV_MODEL_CLEVO_W740SU,
 };
 
+/* optional slot data */
+enum touch_slot_data {
+       TOUCH_SLOT_DATA_NONE = 0,
+       TOUCH_SLOT_DATA_TOUCH_MAJOR = (1 << 1),
+       TOUCH_SLOT_DATA_TOUCH_MINOR = (1 << 2),
+       TOUCH_SLOT_DATA_ORIENTATION = (1 << 3),
+       TOUCH_SLOT_DATA_PRESSURE = (1 << 4),
+};
+
 struct mt_slot {
        int32_t seat_slot;
        struct device_coords point;
+       enum touch_slot_data available_data;
        int32_t touch_major;
        int32_t touch_minor;
        int32_t orientation;
diff --git a/src/libinput.c b/src/libinput.c
index 9357c01..afb1e8f 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -676,6 +676,8 @@ libinput_event_touch_get_orientation(struct 
libinput_event_touch *event)
                           LIBINPUT_EVENT_TOUCH_DOWN,
                           LIBINPUT_EVENT_TOUCH_MOTION);
 
+       if (!device->abs.absinfo_orientation)
+               return 0.0;
        if (device->abs.absinfo_orientation->minimum < 0)
                return evdev_scale_axis(device->abs.absinfo_orientation, 
event->orientation, 2.0) - 1.0;
        else /* this branch assume a simplisitic orientation calculation which 
either only yields 0 or 1
@@ -695,6 +697,8 @@ libinput_event_touch_get_pressure(struct 
libinput_event_touch *event)
                           LIBINPUT_EVENT_TOUCH_DOWN,
                           LIBINPUT_EVENT_TOUCH_MOTION);
 
+       if (!device->abs.absinfo_pressure)
+               return 1.0;
        return evdev_scale_axis(device->abs.absinfo_pressure, event->pressure, 
1.0);
 }
 
diff --git a/test/touch.c b/test/touch.c
index 10c4e2d..06fee1a 100644
--- a/test/touch.c
+++ b/test/touch.c
@@ -700,6 +700,46 @@ START_TEST(touch_point_properties)
 }
 END_TEST
 
+START_TEST(touch_point_default_values)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_event *ev;
+       struct libinput_event_touch *tev;
+
+       litest_drain_events(li);
+
+       litest_push_event_frame(dev);
+       litest_touch_down(dev, 0, 5, 95);
+       litest_touch_major(dev, 0, 9);
+       litest_pop_event_frame(dev);
+
+       litest_wait_for_event_of_type(li, LIBINPUT_EVENT_TOUCH_DOWN, -1);
+
+       ev = libinput_get_event(li);
+       tev = libinput_event_get_touch_event(ev);
+
+       litest_assert_double_eq(libinput_event_touch_get_orientation(tev), 0.0);
+       ck_assert_int_eq(libinput_event_touch_get_touch_major(tev), 9);
+       ck_assert_int_eq(libinput_event_touch_get_touch_minor(tev), 9);
+
+       libinput_event_destroy(ev);
+
+       litest_push_event_frame(dev);
+       litest_touch_major(dev, 0, 12);
+       litest_pop_event_frame(dev);
+       litest_wait_for_event_of_type(li, LIBINPUT_EVENT_TOUCH_MOTION, -1);
+
+       ev = libinput_get_event(li);
+       tev = libinput_event_get_touch_event(ev);
+
+       ck_assert_int_eq(libinput_event_touch_get_touch_major(tev), 12);
+       ck_assert_int_eq(libinput_event_touch_get_touch_minor(tev), 12);
+
+       libinput_event_destroy(ev);
+}
+END_TEST
+
 void
 litest_setup_tests(void)
 {
@@ -726,6 +766,8 @@ litest_setup_tests(void)
        litest_add("touch:protocol a", touch_protocol_a_2fg_touch, 
LITEST_PROTOCOL_A, LITEST_ANY);
        litest_add("touch:touch point properties", touch_point_properties, 
LITEST_TOUCH | LITEST_ELLIPSE_SIZE |
                    LITEST_ELLIPSE_ORIENTATION | LITEST_PRESSURE, LITEST_ANY);
+       litest_add("touch:default values", touch_point_default_values, 
LITEST_TOUCH | LITEST_ELLIPSE_SIZE |
+                   LITEST_PRESSURE, LITEST_ELLIPSE_ORIENTATION );
 
        litest_add_ranged("touch:state", touch_initial_state, LITEST_TOUCH, 
LITEST_PROTOCOL_A, &axes);
 }
-- 
2.1.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to