aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/loop.c19
-rw-r--r--include/swaylock/swaylock.h1
-rw-r--r--swaylock/password.c22
3 files changed, 39 insertions, 3 deletions
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 @@
12struct loop_event { 12struct loop_event {
13 void (*callback)(int fd, short mask, void *data); 13 void (*callback)(int fd, short mask, void *data);
14 void *data; 14 void *data;
15 bool is_timer;
15}; 16};
16 17
17struct loop { 18struct loop {
@@ -52,6 +53,11 @@ void loop_poll(struct loop *loop) {
52 53
53 if (pfd.revents & events) { 54 if (pfd.revents & events) {
54 event->callback(pfd.fd, pfd.revents, event->data); 55 event->callback(pfd.fd, pfd.revents, event->data);
56
57 if (event->is_timer) {
58 loop_remove_event(loop, event);
59 --i;
60 }
55 } 61 }
56 } 62 }
57} 63}
@@ -82,11 +88,14 @@ struct loop_event *loop_add_timer(struct loop *loop, int ms,
82 struct itimerspec its; 88 struct itimerspec its;
83 its.it_interval.tv_sec = 0; 89 its.it_interval.tv_sec = 0;
84 its.it_interval.tv_nsec = 0; 90 its.it_interval.tv_nsec = 0;
85 its.it_value.tv_sec = ms / 1000000000; 91 its.it_value.tv_sec = ms / 1000;
86 its.it_value.tv_nsec = (ms * 1000000) % 1000000000; 92 its.it_value.tv_nsec = (ms % 1000) * 1000000;
87 timerfd_settime(fd, 0, &its, NULL); 93 timerfd_settime(fd, 0, &its, NULL);
88 94
89 return loop_add_fd(loop, fd, POLLIN, callback, data); 95 struct loop_event *event = loop_add_fd(loop, fd, POLLIN, callback, data);
96 event->is_timer = true;
97
98 return event;
90} 99}
91 100
92bool loop_remove_event(struct loop *loop, struct loop_event *event) { 101bool 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) {
94 if (loop->events->items[i] == event) { 103 if (loop->events->items[i] == event) {
95 list_del(loop->events, i); 104 list_del(loop->events, i);
96 105
106 if (event->is_timer) {
107 close(loop->fds[i].fd);
108 }
109
97 loop->fd_length--; 110 loop->fd_length--;
98 memmove(&loop->fds[i], &loop->fds[i + 1], sizeof(void*) * (loop->fd_length - i)); 111 memmove(&loop->fds[i], &loop->fds[i + 1], sizeof(void*) * (loop->fd_length - i));
99 112
diff --git a/include/swaylock/swaylock.h b/include/swaylock/swaylock.h
index c8732cb7..792d34cf 100644
--- a/include/swaylock/swaylock.h
+++ b/include/swaylock/swaylock.h
@@ -55,6 +55,7 @@ struct swaylock_password {
55 55
56struct swaylock_state { 56struct swaylock_state {
57 struct loop *eventloop; 57 struct loop *eventloop;
58 struct loop_event *clear_indicator_timer; // clears the indicator
58 struct wl_display *display; 59 struct wl_display *display;
59 struct wl_compositor *compositor; 60 struct wl_compositor *compositor;
60 struct zwlr_layer_shell_v1 *layer_shell; 61 struct zwlr_layer_shell_v1 *layer_shell;
diff --git a/swaylock/password.c b/swaylock/password.c
index 50b81f6b..fb610bf2 100644
--- a/swaylock/password.c
+++ b/swaylock/password.c
@@ -8,6 +8,7 @@
8#include <xkbcommon/xkbcommon.h> 8#include <xkbcommon/xkbcommon.h>
9#include "swaylock/swaylock.h" 9#include "swaylock/swaylock.h"
10#include "swaylock/seat.h" 10#include "swaylock/seat.h"
11#include "loop.h"
11#include "unicode.h" 12#include "unicode.h"
12 13
13void clear_password_buffer(struct swaylock_password *pw) { 14void clear_password_buffer(struct swaylock_password *pw) {
@@ -39,6 +40,21 @@ static void append_ch(struct swaylock_password *pw, uint32_t codepoint) {
39 pw->len += utf8_size; 40 pw->len += utf8_size;
40} 41}
41 42
43static void clear_indicator(int fd, short mask, void *data) {
44 struct swaylock_state *state = data;
45 state->clear_indicator_timer = NULL;
46 state->auth_state = AUTH_STATE_IDLE;
47 damage_state(state);
48}
49
50static void schedule_indicator_clear(struct swaylock_state *state) {
51 if (state->clear_indicator_timer) {
52 loop_remove_event(state->eventloop, state->clear_indicator_timer);
53 }
54 state->clear_indicator_timer = loop_add_timer(
55 state->eventloop, 3000, clear_indicator, state);
56}
57
42void swaylock_handle_key(struct swaylock_state *state, 58void swaylock_handle_key(struct swaylock_state *state,
43 xkb_keysym_t keysym, uint32_t codepoint) { 59 xkb_keysym_t keysym, uint32_t codepoint) {
44 switch (keysym) { 60 switch (keysym) {
@@ -79,11 +95,13 @@ void swaylock_handle_key(struct swaylock_state *state,
79 state->auth_state = AUTH_STATE_CLEAR; 95 state->auth_state = AUTH_STATE_CLEAR;
80 } 96 }
81 damage_state(state); 97 damage_state(state);
98 schedule_indicator_clear(state);
82 break; 99 break;
83 case XKB_KEY_Escape: 100 case XKB_KEY_Escape:
84 clear_password_buffer(&state->password); 101 clear_password_buffer(&state->password);
85 state->auth_state = AUTH_STATE_CLEAR; 102 state->auth_state = AUTH_STATE_CLEAR;
86 damage_state(state); 103 damage_state(state);
104 schedule_indicator_clear(state);
87 break; 105 break;
88 case XKB_KEY_Caps_Lock: 106 case XKB_KEY_Caps_Lock:
89 /* The state is getting active after this 107 /* The state is getting active after this
@@ -91,6 +109,7 @@ void swaylock_handle_key(struct swaylock_state *state,
91 state->xkb.caps_lock = !state->xkb.caps_lock; 109 state->xkb.caps_lock = !state->xkb.caps_lock;
92 state->auth_state = AUTH_STATE_INPUT_NOP; 110 state->auth_state = AUTH_STATE_INPUT_NOP;
93 damage_state(state); 111 damage_state(state);
112 schedule_indicator_clear(state);
94 break; 113 break;
95 case XKB_KEY_Shift_L: 114 case XKB_KEY_Shift_L:
96 case XKB_KEY_Shift_R: 115 case XKB_KEY_Shift_R:
@@ -104,12 +123,14 @@ void swaylock_handle_key(struct swaylock_state *state,
104 case XKB_KEY_Super_R: 123 case XKB_KEY_Super_R:
105 state->auth_state = AUTH_STATE_INPUT_NOP; 124 state->auth_state = AUTH_STATE_INPUT_NOP;
106 damage_state(state); 125 damage_state(state);
126 schedule_indicator_clear(state);
107 break; 127 break;
108 case XKB_KEY_u: 128 case XKB_KEY_u:
109 if (state->xkb.control) { 129 if (state->xkb.control) {
110 clear_password_buffer(&state->password); 130 clear_password_buffer(&state->password);
111 state->auth_state = AUTH_STATE_CLEAR; 131 state->auth_state = AUTH_STATE_CLEAR;
112 damage_state(state); 132 damage_state(state);
133 schedule_indicator_clear(state);
113 break; 134 break;
114 } 135 }
115 // fallthrough 136 // fallthrough
@@ -118,6 +139,7 @@ void swaylock_handle_key(struct swaylock_state *state,
118 append_ch(&state->password, codepoint); 139 append_ch(&state->password, codepoint);
119 state->auth_state = AUTH_STATE_INPUT; 140 state->auth_state = AUTH_STATE_INPUT;
120 damage_state(state); 141 damage_state(state);
142 schedule_indicator_clear(state);
121 } 143 }
122 break; 144 break;
123 } 145 }