diff options
Diffstat (limited to 'feature-tests/bindings.pl')
-rw-r--r-- | feature-tests/bindings.pl | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/feature-tests/bindings.pl b/feature-tests/bindings.pl new file mode 100644 index 0000000..ece220d --- /dev/null +++ b/feature-tests/bindings.pl @@ -0,0 +1,114 @@ +use strict; +use warnings; + + +use Irssi; +use Irssi::Irc; +use Irssi::TextUI; + +use Data::Dumper; + + +our $VERSION = '0.1'; +our %IRSSI = ( + authors => 'shabble', + contact => 'shabble+irssi@metavore.org', + name => '', + description => '', + licence => q(GNU GPLv2 or later), + + ); + +# code taken from adv_windowlist + +my $keymap; + +sub STATE_HEADER () { 0 } +sub STATE_BODY () { 1 } +sub STATE_END () { 2 } +my $parse_state = STATE_HEADER; + +my $binding_formats = {}; + +init(); + +sub init { + + $keymap = {}; + + Irssi::command_bind('showbinds', 'cmd_showbinds'); + Irssi::signal_add('command bind' => 'watch_keymap'); + + $binding_formats = get_binding_formats(); + + capture_bind_data(); +} + +sub get_binding_formats { + my $theme = Irssi::current_theme(); + my @keys = qw/bind_header bind_list bind_command_list + bind_footer bind_unknown_id/; + + my $ret = {}; + foreach my $key (@keys) { + my $tmp = $theme->get_format('fe-common/core', $key); + #$tmp =~ s/%/%%/g; # escape colour codes? + $ret->{$key} = $tmp; + } + return $ret; +} + +sub cmd_showbinds { + my ($args, @rest) = @_; + + my $win = Irssi::active_win(); + $win->print("Change window bindings:", Irssi::MSGLEVEL_CLIENTCRAP); + for my $w (sort keys %$keymap) { + my $x = $keymap->{$w}; + $win->print("$w ==> $x", Irssi::MSGLEVEL_CLIENTCRAP); + } + $win->print("Done showing window bindings:", Irssi::MSGLEVEL_CLIENTCRAP); + +} + +sub sig_print_text { + my ($text_dest, $str, $str_stripped) = @_; + + return unless $text_dest->{level} == Irssi::MSGLEVEL_CLIENTCRAP; + return unless $text_dest->{target} eq ''; + return unless not defined $text_dest->{server}; + + # if ($parse_state = STATE_HEADER) { + # if ($str =~ m/\Q$binding_formats->{bind_header}\E/) { + # $parse_state = STATE_BODY; + # } + # } elsif ($parse_state = STATE_BODY) { + print "Data is: $str_stripped"; + if ($str_stripped =~ m/^.*?(\S{,20})\s+(\S+)\s+(\S+)/) { + $keymap->{$1} = "$2, $3"; + print "Parsed $1 as $2, $3"; + } + Irssi::signal_stop(); + # } elsif ($str =~ m/$binding_formats->{bind_footer}\E/) { + # $parse_state = STATE_END; + # } + # } +} + + +sub capture_bind_data { + Irssi::signal_remove('command bind' => 'watch_keymap'); + Irssi::signal_add_first('print text' => 'sig_print_text'); + Irssi::command('bind'); # stolen from grep + Irssi::signal_remove('print text' => 'sig_print_text'); + +} + + +# watch keymap changes +sub watch_keymap { + Irssi::timeout_add_once(1000, 'capture_bind_data', undef); +} + + + |