@ -77,52 +77,56 @@ static void handle_preverify_timeout(void *data) {
state - > verify_password_timer = NULL ;
state - > verify_password_timer = NULL ;
}
}
void swaylock_handle_key ( struct swaylock_state * state ,
static void submit_password ( struct swaylock_state * state ) {
xkb_keysym_t keysym , uint32_t codepoint ) {
if ( state - > args . ignore_empty & & state - > password . len = = 0 ) {
switch ( keysym ) {
return ;
case XKB_KEY_KP_Enter : /* fallthrough */
}
case XKB_KEY_Return :
if ( state - > args . ignore_empty & & state - > password . len = = 0 ) {
break ;
}
state - > auth_state = AUTH_STATE_VALIDATING ;
state - > auth_state = AUTH_STATE_VALIDATING ;
damage_state ( state ) ;
damage_state ( state ) ;
// We generally want to wait until all surfaces are showing the
// We generally want to wait until all surfaces are showing the
// "verifying" state before we go and verify the password, because
// "verifying" state before we go and verify the password, because
// verifying it is a blocking operation. However, if the surface is on
// verifying it is a blocking operation. However, if the surface is on
// an output with DPMS off then it won't update, so we set a timer.
// an output with DPMS off then it won't update, so we set a timer.
state - > verify_password_timer = loop_add_timer (
state - > verify_password_timer = loop_add_timer (
state - > eventloop , 50 , handle_preverify_timeout , state ) ;
state - > eventloop , 50 , handle_preverify_timeout , state ) ;
while ( state - > run_display & & state - > verify_password_timer ) {
while ( state - > run_display & & state - > verify_password_timer ) {
errno = 0 ;
errno = 0 ;
if ( wl_display_flush ( state - > display ) = = - 1 & & errno ! = EAGAIN ) {
if ( wl_display_flush ( state - > display ) = = - 1 & & errno ! = EAGAIN ) {
break ;
break ;
}
}
loop_poll ( state - > eventloop ) ;
loop_poll ( state - > eventloop ) ;
bool ok = 1 ;
bool ok = 1 ;
struct swaylock_surface * surface ;
struct swaylock_surface * surface ;
wl_list_for_each ( surface , & state - > surfaces , link ) {
wl_list_for_each ( surface , & state - > surfaces , link ) {
if ( surface - > dirty ) {
if ( surface - > dirty ) {
ok = 0 ;
ok = 0 ;
}
}
if ( ok ) {
break ;
}
}
}
}
wl_display_flush ( state - > display ) ;
if ( ok ) {
if ( attempt_password ( & state - > password ) ) {
state - > run_display = false ;
break ;
break ;
}
}
state - > auth_state = AUTH_STATE_INVALID ;
}
damage_state ( state ) ;
wl_display_flush ( state - > display ) ;
schedule_indicator_clear ( state ) ;
if ( attempt_password ( & state - > password ) ) {
state - > run_display = false ;
return ;
}
state - > auth_state = AUTH_STATE_INVALID ;
damage_state ( state ) ;
schedule_indicator_clear ( state ) ;
}
void swaylock_handle_key ( struct swaylock_state * state ,
xkb_keysym_t keysym , uint32_t codepoint ) {
switch ( keysym ) {
case XKB_KEY_KP_Enter : /* fallthrough */
case XKB_KEY_Return :
submit_password ( state ) ;
break ;
break ;
case XKB_KEY_Delete :
case XKB_KEY_Delete :
case XKB_KEY_BackSpace :
case XKB_KEY_BackSpace :
@ -165,6 +169,12 @@ void swaylock_handle_key(struct swaylock_state *state,
schedule_indicator_clear ( state ) ;
schedule_indicator_clear ( state ) ;
schedule_password_clear ( state ) ;
schedule_password_clear ( state ) ;
break ;
break ;
case XKB_KEY_d :
if ( state - > xkb . control ) {
submit_password ( state ) ;
break ;
}
// fallthrough
case XKB_KEY_c : /* fallthrough */
case XKB_KEY_c : /* fallthrough */
case XKB_KEY_u :
case XKB_KEY_u :
if ( state - > xkb . control ) {
if ( state - > xkb . control ) {