sub __handle_key { my ( $s, $key_event, $key_code) = @_[1..3]; my $image_win = $s->image_win; # use Readonly; Readonly my $single_key_commands => "\003\015\033 +-0123456789RWbnpq"; Readonly my @single_key_functions => ( \&_abort, \&next_rand_or_recorded_entry, \&_abort, \&_space, \&inc_cur_rating, \&dec_cur_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_set_rating, \&_reset_to_beginning_entry, \&write_db, \&backup_entry, \&next_rand_or_recorded_entry, \&_pause, \&_quit ); Readonly my @key_code_commands => qw( Left Up Right Down Home KP_Home); Readonly my @key_code_functions => ( \&backup_entry,\&backup_entry, \&next_rand_or_recorded_entry, \&next_rand_or_recorded_entry, \&_set_to_beginning_entry, \&_set_to_beginning_entry, ); KEY_SWITCH: { if ($key_event ne '') { my $active_key=index $single_key_commands, $key_event; if ($active_key >= 0 ) { $single_key_functions[$active_key] -> ($s, $key_event, $key_code); last KEY_SWITCH; } } else { # ($key_event eq '') # ignore modkeys return if ($key_code =~ /^(?:Shift|Control|Alt)_[RL]$/ || $key_code =~ /^(:Shift|Num|Scroll)_Lock$/); ($key_code eq '') && do { # null event carp("key handler called with no key data\n"); error_beep(); return; }; my $active_key_code=_str_index @key_code_commands, $key_code; if ($active_key_code >= 0) { $key_code_functions[$active_key_code] -> ($s, $key_event, $key_code); last KEY_SWITCH; } } { # default (unhandled/unexpected key) printf "Unrecognized key \'%s\', code \'%s\'\n", $key_event, $key_code; error_beep(); return; }; } # end KEY_SWITCH; if ($s->disable_auto_advance()) { alarm 0; $s->timer_enabled(0); } else { $s->timer_ticked(0); alarm $s->auto_advance_time; $s->timer_enabled(1); } $s->show_cur_entry_in_imgwin(); }