/* * Copyright (C) 2015 Red Hat * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * * Authored by: * Carlos Garnacho */ #include "config.h" #include "backends/native/meta-event-native.h" #include "backends/native/meta-input-device-native.h" #include "clutter/clutter-mutter.h" typedef struct _MetaEventNative MetaEventNative; struct _MetaEventNative { guint32 evcode; guint64 time_usec; gboolean has_relative_motion; double dx; double dy; double dx_unaccel; double dy_unaccel; }; static MetaEventNative * meta_event_native_new (void) { return g_slice_new0 (MetaEventNative); } MetaEventNative * meta_event_native_copy (MetaEventNative *event_evdev) { if (event_evdev != NULL) return g_slice_dup (MetaEventNative, event_evdev); return NULL; } void meta_event_native_free (MetaEventNative *event_evdev) { if (event_evdev != NULL) g_slice_free (MetaEventNative, event_evdev); } static MetaEventNative * meta_event_native_ensure_platform_data (ClutterEvent *event) { MetaEventNative *event_evdev = _clutter_event_get_platform_data (event); if (!event_evdev) { event_evdev = meta_event_native_new (); _clutter_event_set_platform_data (event, event_evdev); } return event_evdev; } void meta_event_native_set_event_code (ClutterEvent *event, guint32 evcode) { MetaEventNative *event_evdev; event_evdev = meta_event_native_ensure_platform_data (event); event_evdev->evcode = evcode; } void meta_event_native_set_time_usec (ClutterEvent *event, guint64 time_usec) { MetaEventNative *event_evdev; event_evdev = meta_event_native_ensure_platform_data (event); event_evdev->time_usec = time_usec; } void meta_event_native_set_relative_motion (ClutterEvent *event, double dx, double dy, double dx_unaccel, double dy_unaccel) { MetaEventNative *event_evdev; event_evdev = meta_event_native_ensure_platform_data (event); event_evdev->dx = dx; event_evdev->dy = dy; event_evdev->dx_unaccel = dx_unaccel; event_evdev->dy_unaccel = dy_unaccel; event_evdev->has_relative_motion = TRUE; } /** * meta_event_native_get_event_code: * @event: a #ClutterEvent * * Returns the event code of the original event. See linux/input.h for more * information. * * Returns: The event code. **/ guint32 meta_event_native_get_event_code (const ClutterEvent *event) { MetaEventNative *event_evdev = _clutter_event_get_platform_data (event); if (event_evdev) return event_evdev->evcode; return 0; } /** * meta_event_native_get_time_usec: * @event: a #ClutterEvent * * Returns the time in microsecond granularity, or 0 if unavailable. * * Returns: The time in microsecond granularity, or 0 if unavailable. */ guint64 meta_event_native_get_time_usec (const ClutterEvent *event) { MetaEventNative *event_evdev = _clutter_event_get_platform_data (event); if (event_evdev) return event_evdev->time_usec; return 0; } /** * meta_event_get_pointer_motion * @event: a #ClutterEvent * * If available, the normal and unaccelerated motion deltas are written * to the dx, dy, dx_unaccel and dy_unaccel and TRUE is returned. * * If unavailable, FALSE is returned. * * Returns: TRUE on success, otherwise FALSE. **/ gboolean meta_event_native_get_relative_motion (const ClutterEvent *event, double *dx, double *dy, double *dx_unaccel, double *dy_unaccel) { MetaEventNative *event_evdev = _clutter_event_get_platform_data (event); if (event_evdev && event_evdev->has_relative_motion) { if (dx) *dx = event_evdev->dx; if (dy) *dy = event_evdev->dy; if (dx_unaccel) *dx_unaccel = event_evdev->dx_unaccel; if (dy_unaccel) *dy_unaccel = event_evdev->dy_unaccel; return TRUE; } else return FALSE; } /** * meta_event_native_sequence_get_slot: * @sequence: a #ClutterEventSequence * * Retrieves the touch slot triggered by this @sequence * * Returns: the libinput touch slot. * * Since: 1.20 * Stability: unstable **/ int32_t meta_event_native_sequence_get_slot (const ClutterEventSequence *sequence) { if (!sequence) return -1; return GPOINTER_TO_INT (sequence) - 1; }