summaryrefslogtreecommitdiff
path: root/clients/clickdot.c
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>2018-03-09 11:54:40 +0200
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>2018-03-12 10:17:18 +0200
commit3f5f3afa813fd2d2c06def4f6979deb45b9455d2 (patch)
treea142ba2c96015e11c62177332c7dc6298ebcfe39 /clients/clickdot.c
parent3f83937414dd0d34bbbb43f55a3f4c08ccb7defb (diff)
downloadweston-3f5f3afa813fd2d2c06def4f6979deb45b9455d2.tar.gz
clients: consolidate timer code part 1
There are multiple copies for the timerfd handling code, and I need a timer in one more app. Consolidate all the timerfd code into window.c to reduce the duplication. Many of the copies were also flawed against the race mentioned in toytimer_fire(). This patch handles clickdot and window.c's tooltip timer and cursor timer. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Derek Foreman <derekf@osg.samsung.com> Acked-by: Daniel Stone <daniels@collabora.com>
Diffstat (limited to 'clients/clickdot.c')
-rw-r--r--clients/clickdot.c36
1 files changed, 8 insertions, 28 deletions
diff --git a/clients/clickdot.c b/clients/clickdot.c
index f52fbf04..f9e6e640 100644
--- a/clients/clickdot.c
+++ b/clients/clickdot.c
@@ -32,9 +32,8 @@
#include <cairo.h>
#include <math.h>
#include <assert.h>
-#include <sys/timerfd.h>
-#include <sys/epoll.h>
#include <unistd.h>
+#include <time.h>
#include <linux/input.h>
#include <wayland-client.h>
@@ -62,8 +61,7 @@ struct clickdot {
int reset;
struct input *cursor_timeout_input;
- int cursor_timeout_fd;
- struct task cursor_timeout_task;
+ struct toytimer cursor_timeout;
};
static void
@@ -224,14 +222,7 @@ button_handler(struct widget *widget,
static void
cursor_timeout_reset(struct clickdot *clickdot)
{
- const long cursor_timeout = 500;
- struct itimerspec its;
-
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
- its.it_value.tv_sec = cursor_timeout / 1000;
- its.it_value.tv_nsec = (cursor_timeout % 1000) * 1000 * 1000;
- timerfd_settime(clickdot->cursor_timeout_fd, 0, &its, NULL);
+ toytimer_arm_once_usec(&clickdot->cursor_timeout, 500 * 1000);
}
static int
@@ -271,15 +262,10 @@ leave_handler(struct widget *widget,
}
static void
-cursor_timeout_func(struct task *task, uint32_t events)
+cursor_timeout_func(struct toytimer *tt)
{
struct clickdot *clickdot =
- container_of(task, struct clickdot, cursor_timeout_task);
- uint64_t exp;
-
- if (read(clickdot->cursor_timeout_fd, &exp, sizeof (uint64_t)) !=
- sizeof(uint64_t))
- abort();
+ container_of(tt, struct clickdot, cursor_timeout);
input_set_pointer_image(clickdot->cursor_timeout_input,
CURSOR_LEFT_PTR);
@@ -317,12 +303,8 @@ clickdot_create(struct display *display)
clickdot->line.old_y = -1;
clickdot->reset = 0;
- clickdot->cursor_timeout_fd =
- timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
- clickdot->cursor_timeout_task.run = cursor_timeout_func;
- display_watch_fd(window_get_display(clickdot->window),
- clickdot->cursor_timeout_fd,
- EPOLLIN, &clickdot->cursor_timeout_task);
+ toytimer_init(&clickdot->cursor_timeout, CLOCK_MONOTONIC,
+ display, cursor_timeout_func);
return clickdot;
}
@@ -330,9 +312,7 @@ clickdot_create(struct display *display)
static void
clickdot_destroy(struct clickdot *clickdot)
{
- display_unwatch_fd(window_get_display(clickdot->window),
- clickdot->cursor_timeout_fd);
- close(clickdot->cursor_timeout_fd);
+ toytimer_fini(&clickdot->cursor_timeout);
if (clickdot->buffer)
cairo_surface_destroy(clickdot->buffer);
widget_destroy(clickdot->widget);