diff options
Diffstat (limited to '')
-rw-r--r-- | history-search/key_test.pl | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/history-search/key_test.pl b/history-search/key_test.pl new file mode 100644 index 0000000..b16ff00 --- /dev/null +++ b/history-search/key_test.pl @@ -0,0 +1,100 @@ +use strict; +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw + +use vars qw($VERSION %IRSSI); +$VERSION = "1.0.1"; +%IRSSI = ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "", + description => "", + license => "Public Domain", + changed => "" +); + + +Irssi::signal_add_last 'gui key pressed' => \&got_key; + +my $buf = ''; + +sub got_key { + my ($key) = @_; + $buf .= " $key"; + my $res = decode_keypress($key); + if (defined $res) { + print "codes: $buf"; + print "Keypress: $res"; + $buf = ''; + } +} + +# 1 means we've seen an esc, 2 means we've +# seen an esc,[. 0 is normal. + +my $decoder_state = 0; + +sub decode_keypress { + my ($code) = @_; + + if ($decoder_state == 1) { + + # seen esc/meta. + if ($code == ord('[')) { + $decoder_state = 2; + return undef; + } else { + $decoder_state = 0; + return 'meta-' . chr($code); + } + + } elsif ($decoder_state == 2) { + + if ($code == ord('A')) { + $decoder_state = 0; + return 'up-arrow'; + } elsif ($code == ord('B')) { + $decoder_state = 0; + return 'dn-arrow' + } elsif ($code == ord('C')) { + $decoder_state = 0; + return 'right-arrow' + } elsif ($code == ord('D')) { + $decoder_state = 0; + return 'left-arrow' + } + + $decoder_state = 0; + return undef; + + } else { + + if ($code < 27) { + + if ($code == 9) { + return 'tab'; + } + + return 'ctrl-' . chr($code + ord('a') -1); + } + + if ($code > 32 && $code < 127) { + return chr($code); + } + + if ($code == 32) { + return 'space'; + } + + if ($code == 127) { + return 'backspace'; + } + + if ($code == 27) { + $decoder_state = 1; + return undef; + } + + return 'unknown ' . $code; + } +} |