Adjust for 64bit time_t for 32bit architectures
authorPeter Hutterer <peter.hutterer@who-t.net>
Sun, 24 Nov 2019 01:23:56 +0000 (17:23 -0800)
committerPeter Hutterer <peter.hutterer@who-t.net>
Tue, 26 Nov 2019 05:11:44 +0000 (15:11 +1000)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
meson.build
src/evdev-mt-touchpad-buttons.c
src/evdev.c
src/util-input-event.h [new file with mode: 0644]
tools/libinput-record.c

index e1e02dd17a3d4fe7dddf77e220324799e217c11e..275eaa761d1d575634aafdf0fcdb3a0c5aeab141 100644 (file)
@@ -240,6 +240,7 @@ endif
 # necessary bits.
 util_headers = [
                'util-bits.h',
+               'util-input-event.h',
                'util-list.h',
                'util-macros.h',
                'util-matrix.h',
index df6ee126b82cf92de94d5a44d1665401c3b7723d..3fb7842cc1f7e0529aaee0330aff1ec3e906ec4c 100644 (file)
@@ -28,6 +28,7 @@
 #include <string.h>
 #include "linux/input.h"
 
+#include "util-input-event.h"
 #include "evdev-mt-touchpad.h"
 
 #define DEFAULT_BUTTON_ENTER_TIMEOUT ms2us(100)
@@ -1141,14 +1142,12 @@ tp_notify_clickpadbutton(struct tp_dispatch *tp,
        if (tp->buttons.trackpoint) {
                if (is_topbutton) {
                        struct evdev_dispatch *dispatch = tp->buttons.trackpoint->dispatch;
-                       struct input_event event;
-                       struct input_event syn_report = {{ 0, 0 }, EV_SYN, SYN_REPORT, 0 };
-
-                       event.time = us2tv(time);
-                       event.type = EV_KEY;
-                       event.code = button;
-                       event.value = (state == LIBINPUT_BUTTON_STATE_PRESSED) ? 1 : 0;
-                       syn_report.time = event.time;
+                       struct input_event event, syn_report;
+                       int value;
+
+                       value = (state == LIBINPUT_BUTTON_STATE_PRESSED) ? 1 : 0;
+                       event = input_event_init(time, EV_KEY, button, value);
+                       syn_report = input_event_init(time, EV_SYN, SYN_REPORT, 0);
                        dispatch->interface->process(dispatch,
                                                     tp->buttons.trackpoint,
                                                     &event,
index 20b8dac90754487b3630a80ad768c8e2b3d1e08a..bf85aa24dbd5d6b50dd56b08891296f57cfb041f 100644 (file)
@@ -43,6 +43,7 @@
 #include "filter.h"
 #include "libinput-private.h"
 #include "quirks.h"
+#include "util-input-event.h"
 
 #if HAVE_LIBWACOM
 #include <libwacom/libwacom.h>
@@ -939,7 +940,7 @@ evdev_print_event(struct evdev_device *device,
 {
        static uint32_t offset = 0;
        static uint32_t last_time = 0;
-       uint32_t time = us2ms(tv2us(&e->time));
+       uint32_t time = us2ms(input_event_time(e));
 
        if (offset == 0) {
                offset = time;
@@ -971,7 +972,7 @@ static inline void
 evdev_process_event(struct evdev_device *device, struct input_event *e)
 {
        struct evdev_dispatch *dispatch = device->dispatch;
-       uint64_t time = tv2us(&e->time);
+       uint64_t time = input_event_time(e);
 
 #if 0
        evdev_print_event(device, e);
diff --git a/src/util-input-event.h b/src/util-input-event.h
new file mode 100644 (file)
index 0000000..0c49bf7
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright © 2019 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#pragma once
+
+#include "config.h"
+
+#include "util-time.h"
+#include <linux/input.h>
+
+static inline struct input_event
+input_event_init(uint64_t time,
+                unsigned int type,
+                unsigned int code,
+                int value)
+{
+       struct input_event ev;
+       struct timeval tval = us2tv(time);
+
+       ev.input_event_sec = tval.tv_sec;
+       ev.input_event_usec = tval.tv_usec;
+       ev.type = type;
+       ev.code = code;
+       ev.value = value;
+
+       return ev;
+}
+
+static inline uint64_t
+input_event_time(const struct input_event *e)
+{
+       struct timeval tval;
+
+       tval.tv_sec = e->input_event_sec;
+       tval.tv_usec = e->input_event_usec;
+
+       return tv2us(&tval);
+}
+
+
+static inline void
+input_event_set_time(struct input_event *e,
+                    uint64_t time)
+{
+       struct timeval tval = us2tv(time);
+
+       e->input_event_sec = tval.tv_sec;
+       e->input_event_usec = tval.tv_usec;
+}
index 62e5bf020e205082a1c6c5a1be72c39550fc066a..0e2f288abab720365f22864ad598fe623f169832 100644 (file)
@@ -48,6 +48,7 @@
 #include "builddir.h"
 #include "util-list.h"
 #include "util-time.h"
+#include "util-input-event.h"
 #include "util-macros.h"
 
 static const int FILE_VERSION_NUMBER = 1;
@@ -199,8 +200,9 @@ print_evdev_event(struct record_context *ctx, struct input_event *ev)
        const char *cname;
        bool was_modified = false;
        char desc[1024];
+       uint64_t time = input_event_time(ev) - ctx->offset;
 
-       ev->time = us2tv(tv2us(&ev->time) - ctx->offset);
+       input_event_set_time(ev, time);
 
        /* Don't leak passwords unless the user wants to */
        if (!ctx->show_keycodes)
@@ -218,7 +220,7 @@ print_evdev_event(struct record_context *ctx, struct input_event *ev)
                static unsigned long last_ms = 0;
                unsigned long time, dt;
 
-               time = us2ms(tv2us(&ev->time));
+               time = us2ms(input_event_time(ev));
                dt = time - last_ms;
                last_ms = time;
 
@@ -242,8 +244,8 @@ print_evdev_event(struct record_context *ctx, struct input_event *ev)
 
        iprintf(ctx,
                "- [%3lu, %6u, %3d, %3d, %7d] # %s\n",
-               ev->time.tv_sec,
-               (unsigned int)ev->time.tv_usec,
+               ev->input_event_sec,
+               (unsigned int)ev->input_event_usec,
                ev->type,
                ev->code,
                ev->value,
@@ -271,16 +273,18 @@ handle_evdev_frame(struct record_context *ctx, struct record_device *d)
        while (libevdev_next_event(evdev,
                                   LIBEVDEV_READ_FLAG_NORMAL,
                                   &e) == LIBEVDEV_READ_STATUS_SUCCESS) {
+               uint64_t time;
 
                if (ctx->offset == 0)
-                       ctx->offset = tv2us(&e.time);
+                       ctx->offset = input_event_time(&e);
 
                if (d->nevents == d->events_sz)
                        resize(d->events, d->events_sz);
 
                event = &d->events[d->nevents++];
                event->type = EVDEV;
-               event->time = tv2us(&e.time) - ctx->offset;
+               time = input_event_time(&e);
+               input_event_set_time(&e, time - ctx->offset);
                event->u.evdev = e;
                count++;