diff options
Diffstat (limited to 'swaylock')
-rw-r--r-- | swaylock/password.c | 30 | ||||
-rw-r--r-- | swaylock/render.c | 16 | ||||
-rw-r--r-- | swaylock/seat.c | 1 |
3 files changed, 46 insertions, 1 deletions
diff --git a/swaylock/password.c b/swaylock/password.c index c8df3de8..1ad5cd81 100644 --- a/swaylock/password.c +++ b/swaylock/password.c | |||
@@ -105,11 +105,39 @@ void swaylock_handle_key(struct swaylock_state *state, | |||
105 | state->auth_state = AUTH_STATE_INVALID; | 105 | state->auth_state = AUTH_STATE_INVALID; |
106 | render_frames(state); | 106 | render_frames(state); |
107 | break; | 107 | break; |
108 | case XKB_KEY_Delete: | ||
108 | case XKB_KEY_BackSpace: | 109 | case XKB_KEY_BackSpace: |
109 | if (backspace(&state->password)) { | 110 | if (backspace(&state->password)) { |
110 | state->auth_state = AUTH_STATE_BACKSPACE; | 111 | state->auth_state = AUTH_STATE_BACKSPACE; |
111 | render_frames(state); | 112 | } else { |
113 | state->auth_state = AUTH_STATE_CLEAR; | ||
112 | } | 114 | } |
115 | render_frames(state); | ||
116 | break; | ||
117 | case XKB_KEY_Escape: | ||
118 | clear_password_buffer(&state->password); | ||
119 | state->auth_state = AUTH_STATE_CLEAR; | ||
120 | render_frames(state); | ||
121 | break; | ||
122 | case XKB_KEY_Caps_Lock: | ||
123 | /* The state is getting active after this | ||
124 | * so we need to manually toggle it */ | ||
125 | state->xkb.caps_lock = !state->xkb.caps_lock; | ||
126 | state->auth_state = AUTH_STATE_INPUT_NOP; | ||
127 | render_frames(state); | ||
128 | break; | ||
129 | case XKB_KEY_Shift_L: | ||
130 | case XKB_KEY_Shift_R: | ||
131 | case XKB_KEY_Control_L: | ||
132 | case XKB_KEY_Control_R: | ||
133 | case XKB_KEY_Meta_L: | ||
134 | case XKB_KEY_Meta_R: | ||
135 | case XKB_KEY_Alt_L: | ||
136 | case XKB_KEY_Alt_R: | ||
137 | case XKB_KEY_Super_L: | ||
138 | case XKB_KEY_Super_R: | ||
139 | state->auth_state = AUTH_STATE_INPUT_NOP; | ||
140 | render_frames(state); | ||
113 | break; | 141 | break; |
114 | default: | 142 | default: |
115 | if (codepoint) { | 143 | if (codepoint) { |
diff --git a/swaylock/render.c b/swaylock/render.c index cd387be5..7d9d25a5 100644 --- a/swaylock/render.c +++ b/swaylock/render.c | |||
@@ -43,6 +43,7 @@ void render_frame(struct swaylock_surface *surface) { | |||
43 | cairo_arc(cairo, buffer_width / 2, buffer_height / 2, arc_radius, 0, 2 * M_PI); | 43 | cairo_arc(cairo, buffer_width / 2, buffer_height / 2, arc_radius, 0, 2 * M_PI); |
44 | switch (state->auth_state) { | 44 | switch (state->auth_state) { |
45 | case AUTH_STATE_INPUT: | 45 | case AUTH_STATE_INPUT: |
46 | case AUTH_STATE_INPUT_NOP: | ||
46 | case AUTH_STATE_BACKSPACE: { | 47 | case AUTH_STATE_BACKSPACE: { |
47 | cairo_set_source_rgba(cairo, 0, 0, 0, 0.75); | 48 | cairo_set_source_rgba(cairo, 0, 0, 0, 0.75); |
48 | cairo_fill_preserve(cairo); | 49 | cairo_fill_preserve(cairo); |
@@ -61,6 +62,12 @@ void render_frame(struct swaylock_surface *surface) { | |||
61 | cairo_set_source_rgb(cairo, 125.0 / 255, 51.0 / 255, 0); | 62 | cairo_set_source_rgb(cairo, 125.0 / 255, 51.0 / 255, 0); |
62 | cairo_stroke(cairo); | 63 | cairo_stroke(cairo); |
63 | } break; | 64 | } break; |
65 | case AUTH_STATE_CLEAR: { | ||
66 | cairo_set_source_rgba(cairo, 229.0/255, 164.0/255, 69.0/255, 0.75); | ||
67 | cairo_fill_preserve(cairo); | ||
68 | cairo_set_source_rgb(cairo, 229.0/255, 164.0/255, 69.0/255); | ||
69 | cairo_stroke(cairo); | ||
70 | } break; | ||
64 | default: break; | 71 | default: break; |
65 | } | 72 | } |
66 | 73 | ||
@@ -77,6 +84,15 @@ void render_frame(struct swaylock_surface *surface) { | |||
77 | case AUTH_STATE_INVALID: | 84 | case AUTH_STATE_INVALID: |
78 | text = "wrong"; | 85 | text = "wrong"; |
79 | break; | 86 | break; |
87 | case AUTH_STATE_CLEAR: | ||
88 | text = "cleared"; | ||
89 | break; | ||
90 | case AUTH_STATE_INPUT: | ||
91 | case AUTH_STATE_INPUT_NOP: | ||
92 | if (state->xkb.caps_lock) { | ||
93 | text = "Caps Lock"; | ||
94 | cairo_set_source_rgb(cairo, 229.0/255, 164.0/255, 69.0/255); | ||
95 | } | ||
80 | default: break; | 96 | default: break; |
81 | } | 97 | } |
82 | 98 | ||
diff --git a/swaylock/seat.c b/swaylock/seat.c index 21db7c4f..a81899a6 100644 --- a/swaylock/seat.c +++ b/swaylock/seat.c | |||
@@ -88,6 +88,7 @@ static void keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, | |||
88 | xkb_mod_mask_t mask = xkb_state_serialize_mods(state->xkb.state, | 88 | xkb_mod_mask_t mask = xkb_state_serialize_mods(state->xkb.state, |
89 | XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); | 89 | XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED); |
90 | state->xkb.modifiers = 0; | 90 | state->xkb.modifiers = 0; |
91 | state->xkb.caps_lock = xkb_state_mod_name_is_active(state->xkb.state, XKB_MOD_NAME_CAPS, XKB_STATE_MODS_LOCKED); | ||
91 | for (uint32_t i = 0; i < MASK_LAST; ++i) { | 92 | for (uint32_t i = 0; i < MASK_LAST; ++i) { |
92 | if (mask & state->xkb.masks[i]) { | 93 | if (mask & state->xkb.masks[i]) { |
93 | state->xkb.modifiers |= XKB_MODS[i]; | 94 | state->xkb.modifiers |= XKB_MODS[i]; |