event-gui draws the touch contact as two concentric ellipses that indicate
contact pressure through oppacity.

Signed-off-by: Andreas Pokorny <andreas.poko...@canonical.com>
---
 tools/event-debug.c | 30 ++++++++++++++++++++++++++++--
 tools/event-gui.c   | 30 ++++++++++++++++++++++++++++--
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/tools/event-debug.c b/tools/event-debug.c
index 1ac0086..3ee9907 100644
--- a/tools/event-debug.c
+++ b/tools/event-debug.c
@@ -300,14 +300,40 @@ print_touch_event_with_coords(struct libinput_event *ev)
        double y = libinput_event_touch_get_y_transformed(t, screen_height);
        double xmm = libinput_event_touch_get_x(t);
        double ymm = libinput_event_touch_get_y(t);
+       double major = libinput_event_touch_get_major_transformed(
+               t,
+               screen_width,
+               screen_height);
+       double minor = libinput_event_touch_get_minor_transformed(
+               t,
+               screen_width,
+               screen_height);
+       double majormm = libinput_event_touch_get_major(t);
+       double minormm = libinput_event_touch_get_minor(t);
+       double pressure = libinput_event_touch_get_pressure(t);
+       double orientation = libinput_event_touch_get_orientation(t);
+       int has_major = libinput_event_touch_has_major(t);
+       int has_minor = libinput_event_touch_has_minor(t);
+       int has_orientation = libinput_event_touch_has_orientation(t);
+       int has_pressure = libinput_event_touch_has_pressure(t);
 
        print_event_time(libinput_event_touch_get_time(t));
 
-       printf("%d (%d) %5.2f/%5.2f (%5.2f/%5.2fmm)\n",
+       printf("%d (%d) %5.2f/%5.2f (%5.2f/%5.2fmm) %5.2f/%5.2f "
+              "(%5.2f/%5.2fmm) %3.2f° %1.5f [%d%d%d%d]\n",
               libinput_event_touch_get_slot(t),
               libinput_event_touch_get_seat_slot(t),
               x, y,
-              xmm, ymm);
+              xmm, ymm,
+              major, minor,
+              majormm, minormm,
+              orientation,
+              pressure,
+              has_major,
+              has_minor,
+              has_orientation,
+              has_pressure
+              );
 }
 
 static void
diff --git a/tools/event-gui.c b/tools/event-gui.c
index 0b0e9d7..7c2b546 100644
--- a/tools/event-gui.c
+++ b/tools/event-gui.c
@@ -49,6 +49,9 @@ struct tools_context context;
 struct touch {
        int active;
        int x, y;
+       double major, minor;
+       double angle;
+       double pressure;
 };
 
 struct window {
@@ -179,12 +182,21 @@ draw(GtkWidget *widget, cairo_t *cr, gpointer data)
        cairo_restore(cr);
 
        /* touch points */
-       cairo_set_source_rgb(cr, .8, .2, .2);
 
        ARRAY_FOR_EACH(w->touches, t) {
                cairo_save(cr);
-               cairo_arc(cr, t->x, t->y, 10, 0, 2 * M_PI);
+               /* paint a filled ellipse with the original major minor values 
*/
+               cairo_set_source_rgba(cr, .8, .2, .2, 0.5 + t->pressure / 2.);
+               cairo_translate (cr, t->x, t->y);
+               cairo_rotate(cr, t->angle * (M_PI / 180.0));
+               cairo_scale (cr, t->minor, t->major);
+               cairo_arc(cr, 0., 0., 1., 0, 2 * M_PI);
                cairo_fill(cr);
+
+               /* paint a larger surrounding ellipse */
+               cairo_arc(cr, 0., 0., 4., 0, 2 * M_PI);
+               cairo_stroke(cr);
+
                cairo_restore(cr);
        }
 
@@ -394,6 +406,8 @@ handle_event_touch(struct libinput_event *ev, struct window 
*w)
        int slot = libinput_event_touch_get_seat_slot(t);
        struct touch *touch;
        double x, y;
+       double major;
+       double minor;
 
        if (slot == -1 || slot >= (int) ARRAY_LENGTH(w->touches))
                return;
@@ -407,10 +421,22 @@ handle_event_touch(struct libinput_event *ev, struct 
window *w)
 
        x = libinput_event_touch_get_x_transformed(t, w->width),
        y = libinput_event_touch_get_y_transformed(t, w->height);
+       major = libinput_event_touch_get_major_transformed(t, w->width, 
w->height);
+       minor = libinput_event_touch_get_minor_transformed(t, w->width, 
w->height);
+
+       if (!libinput_event_touch_has_major(t))
+               major = 10.0;
+
+       if (!libinput_event_touch_has_minor(t))
+               minor = major;
 
        touch->active = 1;
        touch->x = (int)x;
        touch->y = (int)y;
+       touch->major = major;
+       touch->minor = minor;
+       touch->angle = libinput_event_touch_get_orientation(t);
+       touch->pressure = libinput_event_touch_get_pressure(t);
 }
 
 static void
-- 
2.5.0

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

Reply via email to