From 823e0002921c8e80f6373f271482fc3acc13bdc2 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Sat, 15 Jan 2011 04:06:20 +0000 Subject: bindings: added an example of parsing bindings a'la adv_windowlist. needs some attributions and cleanup though --- feature-tests/bindings.pl | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 feature-tests/bindings.pl (limited to 'feature-tests') diff --git a/feature-tests/bindings.pl b/feature-tests/bindings.pl new file mode 100644 index 0000000..006eaf1 --- /dev/null +++ b/feature-tests/bindings.pl @@ -0,0 +1,77 @@ +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; + +init(); + +sub init { + update_keymap(); + Irssi::command_bind('showbinds', 'cmd_showbinds'); +} + +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 get_keymap { + my ($text_dest, $str, $str_stripped) = @_; + + if ($text_dest->{level} == Irssi::MSGLEVEL_CLIENTCRAP and $text_dest->{target} eq '') { + if (not defined($text_dest->{'server'})) { + if ($str_stripped =~ m/((?:meta-)+)(.)\s+change_window (\d+)/) { + my ($level, $key, $window) = ($1, $2, $3); + #my $numlevel = ($level =~ y/-//) - 1; + my $kk = $level . $key; + $keymap->{$kk} = $window; + } + Irssi::signal_stop(); + } + } +} + +sub update_keymap { + $keymap = {}; + Irssi::signal_remove('command bind' => 'watch_keymap'); + Irssi::signal_add_first('print text' => 'get_keymap'); + Irssi::command('bind'); # stolen from grep + Irssi::signal_remove('print text' => 'get_keymap'); + Irssi::signal_add('command bind' => 'watch_keymap'); + #Irssi::timeout_add_once(100, 'eventChanged', undef); +} + +# watch keymap changes +sub watch_keymap { + Irssi::timeout_add_once(1000, 'update_keymap', undef); +} + + + -- cgit v1.2.3