summaryrefslogtreecommitdiffstats
path: root/swaylock
diff options
context:
space:
mode:
authorLibravatar Mattias Eriksson <snaggen@mayam.com>2018-04-20 14:46:30 +0200
committerLibravatar Mattias Eriksson <snaggen@mayam.com>2018-04-24 15:40:30 +0200
commit2d884d4e4f8b8e7cac87f8096c0cc31535bd0642 (patch)
tree35941cb448213c81a4956360af05c53537809ff5 /swaylock
parentMerge pull request #1851 from RyanDwyer/container-descendants-crash (diff)
downloadsway-2d884d4e4f8b8e7cac87f8096c0cc31535bd0642.tar.gz
sway-2d884d4e4f8b8e7cac87f8096c0cc31535bd0642.tar.zst
sway-2d884d4e4f8b8e7cac87f8096c0cc31535bd0642.zip
Improved key handling in swaylock
Make escape clear buffer Add indicator states for ctrl,shift,super et al Add CapsLock indicator
Diffstat (limited to 'swaylock')
-rw-r--r--swaylock/password.c30
-rw-r--r--swaylock/render.c16
-rw-r--r--swaylock/seat.c1
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];