diff options
-rw-r--r-- | feature-tests/format-test.pl | 26 | ||||
-rw-r--r-- | feature-tests/template.pl | 15 | ||||
-rw-r--r-- | prompt_info/input_overlay.pl | 151 | ||||
-rw-r--r-- | test/irssi/config | 74 |
4 files changed, 213 insertions, 53 deletions
diff --git a/feature-tests/format-test.pl b/feature-tests/format-test.pl new file mode 100644 index 0000000..d8be412 --- /dev/null +++ b/feature-tests/format-test.pl @@ -0,0 +1,26 @@ +use strict; +use warnings; + + +use Irssi; + + +our $VERSION = '0.1'; +our %IRSSI = ( + authors => '', + contact => '', + name => '', + description => '', + license => 'Public Domain', + ); + +init(); + +sub init { + Irssi::command_bind('ft', \&format_test); +} + + +sub format_test { + my ($args, $win, $server) = @_; +} diff --git a/feature-tests/template.pl b/feature-tests/template.pl new file mode 100644 index 0000000..2c75044 --- /dev/null +++ b/feature-tests/template.pl @@ -0,0 +1,15 @@ +use strict; +use warnings; + + +use Irssi; + + +our $VERSION = '0.1'; +our %IRSSI = ( + authors => '', + contact => '', + name => '', + description => '', + license => 'Public Domain', + ); diff --git a/prompt_info/input_overlay.pl b/prompt_info/input_overlay.pl index c815ffb..7a8dd9d 100644 --- a/prompt_info/input_overlay.pl +++ b/prompt_info/input_overlay.pl @@ -23,9 +23,13 @@ our %IRSSI = # line := [ region, region, region ] # region := { start => x, end => y, ...? } -my $overlays; +my @regions; + my ($term_w, $term_h) = (0, 0); +my $key_capture = 0; +my $prompt_len = 5; + sub DEBUG () { 1 } sub update_terminal_size { @@ -51,3 +55,148 @@ sub update_terminal_size { print "Terminal detected as $term_w cols by $term_h rows" if DEBUG; } + +sub redraw_overlay { + # TODO: we can't assume the active win is the only one with overlays. + #Irssi::active_win->view->redraw(); + foreach my $region (@regions) { + if ($region->{draw}) { + my $str = $region->{style} . $region->{text} . '%n'; + my $x_offset = $region->{start} + $prompt_len; + + Irssi::gui_printtext($x_offset, $term_h, $str); + } + } + # my $inp = Irssi::parse_special('$L'); + # Irssi::gui_input_set($inp . ''); +} + +sub augment_redraw { + #print "Redraw called" if DEBUG; + #redraw_overlay(); + Irssi::timeout_add_once(20, \&redraw_overlay, 0); +} + +sub intercept_keypress { + my $key = shift; + + # intercept C-l for redraw, and force it to call + # /redraw instead of the internal function. + if ($key == 12) { # C-L + print "C-l pressed" if DEBUG; + Irssi::command("redraw"); + Irssi::signal_stop; + } + +} + +sub new_region { + my $key = shift; + print "Creating new Region"; + my $new_region + = { + text => '', + start => _pos() -1, + style => '%_', + open => 1, + draw => 1, + }; + + insert_into_region($key, $new_region); + + push @regions, $new_region; +} + +sub insert_into_region { + my ($key, $region) = @_; + + # if ($key == 127) { # backspace + # substr($region->{text}, -1, 1) = ''; + # } else { + # $region->{text} .= chr $key; + # } + my $input = Irssi::parse_special('$L'); + my $len = _pos() - $region->{start}; +# print "Input: $input, len: $len" if DEBUG; + + my $str = substr($input, $region->{start} , $len); +# print "Str: $str" if DEBUG; + $region->{text} = $str; + + # printf("region [%d-%d] now contains '%s'", + # $region->{start}, _pos(), + # $region->{text}) if DEBUG; +} + +sub observe_keypress { + my $key = shift; + if ($key_capture && $key > 31 && $key <= 127) { + # see if we're still appending to the last region: + #print "Observed printable key: " . chr($key) if DEBUG; + #print ''; + my $latest_region = $regions[-1]; + $latest_region = {} unless defined $latest_region; + + if (not $latest_region->{open}) { + new_region($key); + } else { + insert_into_region($key, $latest_region); + } + #Irssi::signal_stop; + # TODO: if the cursor pos is inside a region, handle it + # extend the region on addition? + redraw_overlay(); + } +} +sub init { + + die "This script requires uberprompt.pl" + unless script_is_loaded('uberprompt'); + + Irssi::signal_add_last ('command redraw', \&augment_redraw); + Irssi::signal_add_first('gui key pressed', \&intercept_keypress); + Irssi::signal_add_last ('gui key pressed', \&observe_keypress); + + Irssi::signal_add ('terminal resized', \&update_terminal_size); + Irssi::signal_add_first('gui print text finished', \&augment_redraw); + + Irssi::command_bind('region_start', \®ion_toggle); + Irssi::command('/bind ^C /region_start'); + + Irssi::signal_add('prompt changed', sub { + print "Updated prompt length: $_[1]"; + $prompt_len = $_[1]; + }); + + Irssi::signal_emit('prompt length request'); + + update_terminal_size(); +} + +sub region_toggle { + $key_capture = not $key_capture; + printf("Region is %sactive", $key_capture?'':'in'); + #@regions = (); + # terminate the previous region + my $latest_region = $regions[-1]; + if (defined $latest_region) { + $latest_region->{open} = 0; + } +} + +sub script_is_loaded { + my $name = shift; + print "Checking if $name is loaded" if DEBUG; + no strict 'refs'; + my $retval = defined %{ "Irssi::Script::${name}::" }; + use strict 'refs'; + + return $retval; +} + +sub _pos { + return Irssi::gui_input_get_pos(); +} + +init(); + diff --git a/test/irssi/config b/test/irssi/config index 5a7b307..031d15f 100644 --- a/test/irssi/config +++ b/test/irssi/config @@ -1,8 +1,9 @@ servers = ( { address = "eu.irc6.net"; chatnet = "IRCnet"; port = "6667"; }, + { address = "open.ircnet.net"; chatnet = "IRCnet"; port = "6667"; }, { - address = "irc.open-ircnet.net"; - chatnet = "IRCnet"; + address = "chat.freenode.net"; + chatnet = "Freenode"; port = "6667"; }, { address = "irc.efnet.org"; chatnet = "EFNet"; port = "6667"; }, @@ -26,14 +27,7 @@ servers = ( { address = "irc.webchat.org"; chatnet = "WebChat"; port = "6667"; }, { address = "irc.rizon.net"; chatnet = "Rizon"; port = "6667"; }, { address = "irc.link-net.org"; chatnet = "LinkNet"; port = "6667"; }, - { address = "silc.silcnet.org"; chatnet = "SILC"; port = "706"; }, - { - address = "blondu.dyndns.ws"; - chatnet = "botnettest"; - port = "6667"; - use_ssl = "no"; - ssl_verify = "no"; - } + { address = "silc.silcnet.org"; chatnet = "SILC"; port = "706"; } ); chatnets = { @@ -50,6 +44,12 @@ chatnets = { max_msgs = "3"; max_whois = "1"; }; + Freenode = { + type = "IRC"; + max_kicks = "1"; + max_msgs = "4"; + max_whois = "1"; + }; Undernet = { type = "IRC"; max_kicks = "1"; @@ -99,7 +99,6 @@ chatnets = { max_whois = "30"; }; SILC = { type = "SILC"; }; - botnettest = { type = "IRC"; }; }; channels = ( @@ -146,7 +145,7 @@ aliases = { GOTO = "sb goto"; CHAT = "dcc chat"; RUN = "SCRIPT LOAD"; - CALC = "exec - if which bc &>/dev/null\\; then echo '$*' | bc | awk '{print \"$*=\"$$1}'\\; else echo bc was not found\\; fi"; + CALC = "exec - if command -v bc >/dev/null 2>&1\\; then printf '%s=' '$*'\\; echo '$*' | bc -l\\; else echo bc was not found\\; fi"; SBAR = "STATUSBAR"; INVITELIST = "mode $C +I"; Q = "QUERY"; @@ -155,19 +154,7 @@ aliases = { ATAG = "WINDOW SERVER"; UNSET = "set -clear"; RESET = "set -default"; - s = "script"; - rltest = "/script unload history_search; /script load history_search.pl"; - DUMP = "script exec use Data::Dumper\\; print Data::Dumper->new([\\\\$0-])->Dump"; - funcs_for = "/dump [map *\\$_{NAME}, grep ref(\\$_) eq 'GLOB' && *\\$_{CODE} && *\\$_{PACKAGE} eq 'Irssi::UI::Window', values \\%Irssi::UI::Window::]"; - et = "/script unload expando_test.pl; /script load expando_test"; - se = "script exec"; - detach = "eval exec - screen -X detach"; - xxx = "/dump Irssi::bindings()"; - showbind = "/script exec \\%foo = Irssi::UI::bindings()\\; print \\$foo{\"\\\\$0\"}\\;"; - botaway = "/away auto-away [\002BX\002-MsgLog On] (Away since 1:43 am Mon Aug 24)"; - vim = "script load vim_mode.pl"; - unvim = "/script unload vim_mode"; - pl = "script load prompt_replace.pl"; + "/vim" = "/script load vim_mode.pl"; }; statusbar = { @@ -190,7 +177,7 @@ statusbar = { # treated specially .. window is printed with non-empty windows, # window_empty is printed with empty windows - window = "{sb $winref:$tag/$itemname{sbmode $M_nopass}}"; + window = "{sb $winref:$tag/$itemname{sbmode $M}}"; window_empty = "{sb $winref{sbservertag $tag}}"; prompt = "{prompt $[.15]itemname}"; prompt_empty = "{prompt $winname}"; @@ -267,51 +254,34 @@ statusbar = { topicbarend = { priority = "100"; alignment = "right"; }; }; }; + add = { }; prompt = { items = { - prompt = { }; - prompt_empty = { }; + uberprompt = { priority = "-1"; }; input = { priority = "10"; }; }; position = "100"; }; - promptadd = { disabled = "yes"; }; }; }; settings = { core = { - real_name = "fjkdlafad"; + real_name = "shabble"; user_name = "tomfeist"; nick = "tomfeist"; - timestamp_format = "%+"; }; - "fe-text" = { actlist_sort = "refnum"; indent = "1"; }; + "fe-text" = { actlist_sort = "refnum"; }; "perl/core/scripts" = { - autoinstall_custom_prompt = "yes"; - mass_hilight_action = "/echo $nick"; - mass_hilight_threshold = "0"; + vim_mode_prompt_leading_space = "no"; vim_mode_debug = "yes"; - superprompt_format = "%K[%W$tag%c/%K$cumode%n$*%K]%n "; - uberprompt_format = "[$*] "; }; - "fe-common/core" = { bell_beeps = "yes"; }; - "irc/core" = { ctcp_userinfo_reply = ""; }; }; keyboard = ( + { key = "^C"; id = "command"; data = "region_start "; }, { - key = "meta-g"; + key = "meta-q"; id = "command"; - data = "se print defined(Irssi::gui_input_set(\"hello\"))?1:0"; + data = "script exec print Irssi::gui_input_get_pos()"; }, - { key = "meta-x"; id = "command"; data = "history_search "; }, - { key = "^Z"; id = "command"; data = "echo moo"; }, - { key = "^R"; id = "command"; data = "history_search_start "; }, - { key = "meta-h"; id = "command"; data = "echo moo /echo moo"; }, - { key = "meta-q"; id = "command"; data = "echo bacons"; }, - { key = "meta-c"; id = "command"; data = "echo moo ; /echo bar"; }, - { key = "meta-l"; id = "command"; data = "visual "; }, - { key = "meta-m"; id = "command"; data = "redraw "; }, - { key = "^V"; id = "command"; data = "visual "; }, - { key = "^F"; id = "command"; data = "visual toggle"; }, - { key = "^G"; id = "command"; data = "visual clear"; } + { key = "^R"; id = "command"; data = "history_search_start "; } ); |