diff options
-rw-r--r-- | common/loop.c | 19 | ||||
-rw-r--r-- | include/swaylock/swaylock.h | 1 | ||||
-rw-r--r-- | swaylock/password.c | 22 |
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 @@ | |||
12 | struct loop_event { | 12 | struct 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 | ||
17 | struct loop { | 18 | struct 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 | ||
92 | bool loop_remove_event(struct loop *loop, struct loop_event *event) { | 101 | 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) { | |||
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 | ||
56 | struct swaylock_state { | 56 | struct 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 | ||
13 | void clear_password_buffer(struct swaylock_password *pw) { | 14 | void 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 | ||
43 | static 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 | |||
50 | static 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 | |||
42 | void swaylock_handle_key(struct swaylock_state *state, | 58 | void 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 | } |