aboutsummaryrefslogblamecommitdiffstats
path: root/feature-tests/bindings.pl
blob: ece220d23078c349197f7c311cbaa390e4b78319 (plain) (tree)
























                                                          






                               


          


                 
                                                      


















                                                             













                                                                             

                    

                                                  












                                                                    
     




                                                                  

 

                       
                                                               
                                                                  
                                                  

                                                               

 
 

                      
                                                                  



 
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);
}