From c242712262c5cb751fc0f89050a7f7a24433b105 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 13 Oct 2018 16:52:13 +1000 Subject: swaylock: Remove indicator after 3 seconds --- common/loop.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'common/loop.c') diff --git a/common/loop.c b/common/loop.c index bfbfd5a6..da3c2142 100644 --- a/common/loop.c +++ b/common/loop.c @@ -12,6 +12,7 @@ struct loop_event { void (*callback)(int fd, short mask, void *data); void *data; + bool is_timer; }; struct loop { @@ -52,6 +53,11 @@ void loop_poll(struct loop *loop) { if (pfd.revents & events) { event->callback(pfd.fd, pfd.revents, event->data); + + if (event->is_timer) { + loop_remove_event(loop, event); + --i; + } } } } @@ -82,11 +88,14 @@ struct loop_event *loop_add_timer(struct loop *loop, int ms, struct itimerspec its; its.it_interval.tv_sec = 0; its.it_interval.tv_nsec = 0; - its.it_value.tv_sec = ms / 1000000000; - its.it_value.tv_nsec = (ms * 1000000) % 1000000000; + its.it_value.tv_sec = ms / 1000; + its.it_value.tv_nsec = (ms % 1000) * 1000000; timerfd_settime(fd, 0, &its, NULL); - return loop_add_fd(loop, fd, POLLIN, callback, data); + struct loop_event *event = loop_add_fd(loop, fd, POLLIN, callback, data); + event->is_timer = true; + + return event; } bool loop_remove_event(struct loop *loop, struct loop_event *event) { @@ -94,6 +103,10 @@ bool loop_remove_event(struct loop *loop, struct loop_event *event) { if (loop->events->items[i] == event) { list_del(loop->events, i); + if (event->is_timer) { + close(loop->fds[i].fd); + } + loop->fd_length--; memmove(&loop->fds[i], &loop->fds[i + 1], sizeof(void*) * (loop->fd_length - i)); -- cgit v1.2.3-54-g00ecf