diff options
author | Tom Feist <shabble@metavore.org> | 2011-04-18 15:33:59 +0000 |
---|---|---|
committer | Tom Feist <shabble@metavore.org> | 2011-04-18 15:33:59 +0000 |
commit | fdcab7762591fca9677ed74ada21267481e255e6 (patch) | |
tree | ba92e4a4b3927e07af1365a1e81d7e6fac203557 | |
parent | moved older scripts out of prompt-info to ensure uberprompt readme is correct... (diff) | |
download | irssi-scripts-fdcab7762591fca9677ed74ada21267481e255e6.tar.gz irssi-scripts-fdcab7762591fca9677ed74ada21267481e255e6.zip |
moved older scripts out of prompt-info to ensure uberprompt readme is correctly generated (2)
-rw-r--r-- | prompt_info/old/input_overlay.pl | 288 | ||||
-rw-r--r-- | prompt_info/old/overlays.pl | 198 | ||||
-rw-r--r-- | prompt_info/old/prompt_info.pl | 114 | ||||
-rw-r--r-- | prompt_info/old/prompt_replace.pl | 346 | ||||
-rw-r--r-- | prompt_info/old/visual.pl | 168 |
5 files changed, 1114 insertions, 0 deletions
diff --git a/prompt_info/old/input_overlay.pl b/prompt_info/old/input_overlay.pl new file mode 100644 index 0000000..9d2a42b --- /dev/null +++ b/prompt_info/old/input_overlay.pl @@ -0,0 +1,288 @@ + +use strict; +use warnings; + +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw +use Data::Dumper; + + +# TODO: maybe eval { use Term::Size } and use tthat if poss. +our $VERSION = "0.2"; +our %IRSSI = + ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "overlays", + description => "Library script for drawing overlays on irssi UI", + license => "MIT", + changed => "24/7/2010" + ); + +# overlay := { $num1 => line1, $num2 => line2 } +# line := [ region, region, region ] +# region := { start => x, end => y, ...? } + +my @regions; + +my ($term_w, $term_h) = (0, 0); + +my $overlay_active = 0; +my $prompt_len = 5; +my $region_id = 0; + +sub DEBUG () { 1 } + +sub update_terminal_size { + + my @stty_data = qx/stty -a/; + my $line = $stty_data[0]; + + # linux + # speed 38400 baud; rows 36; columns 126; line = 0; + if ($line =~ m/rows (\d+); columns (\d+);/) { + $term_h = $1; + $term_w = $2; + # osx + # speed 9600 baud; 40 rows; 235 columns; + } elsif ($line =~ m/(\d+) rows; (\d+) columns;/) { + $term_h = $1; + $term_w = $2; + } else { + # guess? + $term_h = 24; + $term_w = 80; + } + + print "Terminal detected as $term_w cols by $term_h rows" if DEBUG; +} + +sub find_region { + my ($pos) = @_; + foreach my $region (@regions) { + next unless $pos > $region->{start}; + return $region if $pos <= $region->{end}; + } + print "failed to find region for pos: $pos"; + return undef; +} + +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 observe_keypress { + my $key = shift; + print "Key " . chr ($key) . " pressed, pos: " . _pos(); + if ($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; + + + my $pos = _pos(); + my $reg = find_region($pos); + + if (defined $reg) { + insert_into_region($key, $reg); + } elsif (not $latest_region->{open}) { + my $style = $overlay_active?'%_':''; + new_region($style, $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); + + setup_bindings(); + + Irssi::signal_add('prompt changed', sub { + print "Updated prompt length: $_[1]"; + $prompt_len = $_[1]; + }); + + Irssi::signal_emit('prompt length request'); + + update_terminal_size(); +} + +sub setup_bindings { + + Irssi::command_bind('region_start', \®ion_toggle); + Irssi::command_bind('region_clear', \®ion_clear); + Irssi::command_bind('region_print', \&print_regions); + + + Irssi::command('/bind ^C /region_start'); + ##Irssi::command('/bind ^D /region_clear'); + Irssi::command('/bind ^D /region_print'); + +} + + +################################################################################ + +sub escape_style { + my ($style) = @_; + $style =~ s/%/%%/g; + + return $style; +} + +sub print_regions { + foreach my $reg (@regions) { + printf("start: %d end: %d style: %s, text: \"%s\", open: %d, draw: %d", + $reg->{start}, $reg->{end}, escape_style($reg->{style}), + $reg->{text}, $reg->{open}, $reg->{draw}); + } +} + +sub new_region { + my ($style, $key) = @_; + + my $new_id = $region_id++; + _debug("Creating new Region: $new_id"); + + my $new_region + = { + id => $region_id++, + text => '', + start => _pos(), + end => _pos(), + style => $style, + open => 1, + draw => 1, + }; + + insert_into_region($key, $new_region); + + push @regions, $new_region; +} + +sub delete_region { + my ($region) = @_; + my $idx = 0; + foreach my $i (0..$#regions) { + if ($regions[$i]->{id} == $region->{id}) { + $idx = $i; + last; + } + } + print "Deleting region: $idx"; + splice(@regions, $idx, 1); # remove the selected region. +} + +sub insert_into_region { + my ($key, $region) = @_; + + my $pos = _pos(); + + if ($key == 127) { # backspace + substr($region->{text}, -1, 1) = ''; + $region->{end}--; + if ($region->{end} <= $region->{start}) { + delete_region($region); + } + } else { + printf("text: '%s', pos: %d, offset: %d", + $region->{text}, $pos, $pos - $region->{start}); + if ( $region->{end} < $pos) { + $region->{text} .= chr $key; + } else { + substr($region->{text}, $pos - $region->{start}, 0) = chr $key; + } + $region->{end}++; + } +} + +sub region_clear { + @regions = (); + Irssi::signal_emit('command redraw'); +} + +sub region_toggle { + $overlay_active = not $overlay_active; + _debug("Region is %sactive", $overlay_active?'':'in'); + #@regions = (); + # terminate the previous region + + my $region = find_region(_pos()); + if (defined $region) { + $region->{open} = 0; + $region->{end} = _pos(); + debug("Region closed: %d-%d", $region->{start}, $region->{end}); + } +} + +sub script_is_loaded { + my $name = shift; + _debug("Checking if $name is loaded"); + no strict 'refs'; + my $retval = %{ "Irssi::Script::${name}::" }; + use strict 'refs'; + + return $retval; +} + +sub _pos { + return Irssi::gui_input_get_pos(); +} + +sub _input { + return Irssi::parse_special('$L'); +} + +sub _debug { + printf @_ if DEBUG(); +} + +init(); + diff --git a/prompt_info/old/overlays.pl b/prompt_info/old/overlays.pl new file mode 100644 index 0000000..b3299e9 --- /dev/null +++ b/prompt_info/old/overlays.pl @@ -0,0 +1,198 @@ +# temp place for dumping all the stuff that doesn't belong in uberprompt. + +use strict; +use warnings; + +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw +use Data::Dumper; + + +# TODO: maybe eval { use Term::Size } and use tthat if poss. +our $VERSION = "0.2"; +our %IRSSI = + ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "overlays", + description => "Library script for drawing overlays on irssi UI", + license => "MIT", + changed => "24/7/2010" + ); + +# overlay := { $num1 => line1, $num2 => line2 } +# line := [ region, region, region ] +# region := { start => x, end => y, ...? } + +my $overlays; +my ($term_w, $term_h) = (0, 0); + +sub DEBUG () { 1 } + +sub update_terminal_size { + + my @stty_data = qx/stty -a/; + my $line = $stty_data[0]; + + # linux + # speed 38400 baud; rows 36; columns 126; line = 0; + if ($line =~ m/rows (\d+); columns (\d+);/) { + $term_h = $1; + $term_w = $2; + # osx + # speed 9600 baud; 40 rows; 235 columns; + } elsif ($line =~ m/(\d+) rows; (\d+) columns;/) { + $term_h = $1; + $term_w = $2; + } else { + # guess? + $term_h = 24; + $term_w = 80; + } + + print "Terminal detected as $term_w cols by $term_h rows" if DEBUG; +} + +sub _add_overlay_region { + my ($x, $y, $text) = @_; + my $region = { start => $x, + text => $text, + }; + + my $o_line = $overlays->{$y}; + + unless (defined $o_line) { + $o_line = []; + $overlays->{$y} = $o_line; + } + + # foreach my $cur_region (@$o_line) { + # if (_region_overlaps($cur_region, $region)) { + # # do something. + # print "Region overlaps"; + # last; + # } + # } + + push @$o_line, $region; + redraw_overlay(); +} + +# sub _remove_overlay_region { +# my ($line, $start, $end) = @_; + +# my $o_line = $overlay->{$line}; +# return unless $o_line; + +# my $i = 0; +# foreach my $region (@$o_line) { +# if ($region->{start} == $start && $region->{end} == $end) { +# last; +# } +# $i++; +# } +# splice @$o_line, $i, 1, (); # remove it. +# } + +sub redraw_overlay { + # TODO: we can't assume the active win is the only one with overlays. + Irssi::active_win->view->redraw(); + foreach my $y (sort keys %$overlays) { + my $line = $overlays->{$y}; + foreach my $region (@$line) { + Irssi::gui_printtext($region->{start}, $y, $region->{text}); + } + } +} + +sub augment_redraw { + #print "Redraw called" if DEBUG; + #redraw_overlay(); + Irssi::timeout_add_once(10, \&redraw_overlay, 0); +} + +sub ctrl_L_intercept { + my $key = shift; + + if ($key == 12) { # C-L + print "C-l pressed" if DEBUG; + Irssi::command("redraw"); + Irssi::signal_stop(); + } +} + +sub init { + + die "needs uberprompt" unless script_is_loaded('uberprompt'); + + Irssi::signal_add_last ('command redraw', \&augment_redraw); + Irssi::signal_add_first('gui key pressed', \&ctrl_L_intercept); + Irssi::signal_add ('terminal resized', \&update_terminal_size); + Irssi::signal_add_first('gui print text finished', \&augment_redraw); + + my $api_sigs = { + # input signals + 'overlay create' => [qw/int int string/], # x, y, str + 'overlay remove' => [qw/int int/], # x, y + 'overlay clear' => [], # no args + # output signals + + }; + + Irssi::signal_register($api_sigs); + + Irssi::signal_add('overlay create', \&_add_overlay_region); + # Irssi::signal_add('overlay remove', \&_add_overlay_region); + Irssi::signal_add('overlay clear', \&_clear_overlay); + + Irssi::command_bind('ocr', \&cmd_overlay_create); + Irssi::command_bind('ocl', sub { Irssi::signal_emit('overlay clear'); }); + +} + +sub cmd_overlay_create { + my ($args) = @_; + my ($y, $x, $text) = split(/\s+/, $args, 3); + print "overlaying $text at [$x, $y]"; + + Irssi::signal_emit('overlay create', $x, $y, $text); +} + +sub _clear_overlay { + $overlays = {}; + redraw_overlay(); +} + +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; +} +print "Moo!"; +init(); + +__END__ + +# sub _draw_overlay_menu { + +# my $w = 10; + +# my @lines = ( +# '%7+' . ('-' x $w) . '+%n', +# sprintf('%%7|%%n%*s%%7|%%n', $w, 'bacon'), +# sprintf('|%*s|', $w, 'bacon'), +# sprintf('|%*s|', $w, 'bacon'), +# sprintf('|%*s|', $w, 'bacon'), +# sprintf('|%*s|', $w, 'bacon'), +# sprintf('|%*s|', $w, 'bacon'), +# '%7+' . ('-' x $w) . '+%n', +# ); +# my $i = 10; # start vert offset. +# for my $line (@lines) { +# Irssi::gui_printtext(int ($term_w / 2), $i++, $line); +# } +# } diff --git a/prompt_info/old/prompt_info.pl b/prompt_info/old/prompt_info.pl new file mode 100644 index 0000000..8ad63ba --- /dev/null +++ b/prompt_info/old/prompt_info.pl @@ -0,0 +1,114 @@ +# Usage: + +# edit your theme, find the line beginning: +# +# prompt = "..." +# +# and add the string `$prompt_additional' somewhere inside it. +# If using the default: prompt = "[$*] ", then a good value would be: +# +# prompt = "[$*$prompt_additional] " +# +# Then place this script to your ~/.irssi/scripts directory (~/.irssi/scripts/) +# and symlink it to the ~/.irssi/scripts/autorun directory (which may need to +# be created first) +# +# You can also load it manually once the theme has been edited via +# +# /script load prompt_info.pl +# +# You will also need to reload your theme with the following command: +# +# /script exec Irssi::themes_reload() +# +# Once loaded, you can modify your prompt content by using the following command: +# +# /set_prompt <string> +# +# You can also use it from other scripts by issuing a signal as follows: +# +# Irssi:signal_emit('change prompt', +# +# report bugs / feature requests to http://github.com/shabble/irssi-scripts/issues +# +# NOTE: it does not appear to be possible to use colours in your prompt at present. +# This is unlikely to change without source-code changes to Irssi itself. + +use strict; +use warnings; + +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 => "prompt_info", + description => "Helper script for dynamically adding text " + . "into the input-bar prompt.", + license => "Public Domain", + changed => "24/7/2010" + ); + +#sub DEBUG () { 1 } +sub DEBUG () { 0 } + + +my $prompt_additional_content = ''; + +Irssi::expando_create('prompt_additional', \&expando_prompt, {}); + +sub expando_prompt { + my ($server, $witem, $arg) = @_; + return $prompt_additional_content; + #return Irssi::current_theme->format_expand("{sb + #$prompt_additional_content}", 0x0f); +} + +sub redraw_prompts { + Irssi::statusbar_items_redraw ('prompt'); + Irssi::statusbar_items_redraw ('prompt_empty'); +} + +sub handle_change_prompt_sig { + my ($text) = @_; + + my $expanded_text = Irssi::parse_special($text); + + print "Got prompt change sig with: $text -> $expanded_text" if DEBUG; + + my $changed = ($expanded_text ne $prompt_additional_content); + + $prompt_additional_content = $expanded_text; + + if ($changed) { + print "Redrawing prompts" if DEBUG; + redraw_prompts(); + } +} + +sub prompt_additional_cmd { + my ($str) = @_; + print "Setting prompt to: $str" if DEBUG; + Irssi::signal_emit('change prompt', $str); +} + +test_abstract_setup(); +Irssi::signal_register({'change prompt' => [qw/string/]}); +Irssi::signal_add('change prompt' => \&handle_change_prompt_sig); + +Irssi::command_bind('set_prompt' => \&prompt_additional_cmd); + +sub test_abstract_setup { + my $theme = Irssi::current_theme(); + my $prompt = $theme->format_expand('{prompt}', 0); + if ($prompt !~ m/\$prompt_additional/) { + print "Prompt_Info: It looks like you haven't modified your theme" + . " to include the \$prompt_additional expando. You will not see" + . " any prompt info messages until you do. See script comments" + . "for details"; + } +} diff --git a/prompt_info/old/prompt_replace.pl b/prompt_info/old/prompt_replace.pl new file mode 100644 index 0000000..30120f7 --- /dev/null +++ b/prompt_info/old/prompt_replace.pl @@ -0,0 +1,346 @@ +use strict; +use warnings; + +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw +use Data::Dumper; + + + +our $VERSION = "0.1"; +our %IRSSI = + ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "prompt_info", + description => "Helper script for dynamically adding text " + . "into the input-bar prompt.", + license => "Public Domain", + changed => "24/7/2010" + ); + +sub DEBUG () { 1 } +#sub DEBUG () { 0 } + +my $prompt_data = undef; +my $prompt_item = undef; + +my $region_active = 0; + +my ($term_w, $term_h) = (0, 0); + +# visual region selected. +my ($region_start, $region_end) = (0, 0); +my $region_content = ''; + +my $prompt_format = ''; + +init(); + +sub update_terminal_size { + + my @stty_data = qx/stty -a/; + my $line = $stty_data[0]; + + # linux + # speed 38400 baud; rows 36; columns 126; line = 0; + if ($line =~ m/rows (\d+); columns (\d+);/) { + $term_h = $1; + $term_w = $2; + # osx + # speed 9600 baud; 40 rows; 235 columns; + } elsif ($line =~ m/(\d+) rows; (\d+) columns;/) { + $term_h = $1; + $term_w = $2; + } else { + # guess? + $term_h = 24; + $term_w = 80; + } + + print "Terminal detected as $term_w cols by $term_h rows" if DEBUG; +} + +sub prompt_subcmd_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; # strip trailing whitespace. + Irssi::command_runsub('prompt', $data, $server, $item); +} + +sub visual_subcmd_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; # strip trailing whitespace. + Irssi::command_runsub('visual', $data, $server, $item); +} + +sub init { + + Irssi::statusbar_item_register ('uberprompt', 0, 'uberprompt_draw'); + + Irssi::settings_add_str('uberprompt', 'uberprompt_format', '[$*] '); + + Irssi::command_bind("prompt", \&prompt_subcmd_handler); + Irssi::command_bind('prompt on', \&replace_prompt_items); + Irssi::command_bind('prompt off', \&restore_prompt_items); + Irssi::command_bind('prompt set', + sub { Irssi::signal_emit 'change prompt', shift; }); + Irssi::command_bind('prompt clear', + sub { Irssi::signal_emit 'change prompt', '$p'; }); + + # misc faff + Irssi::command_bind('visual', \&visual_subcmd_handler); + Irssi::command_bind('visual toggle', \&cmd_toggle_visual); + Irssi::command_bind('visual clear', \&cmd_clear_visual); + + Irssi::command("^BIND ^F /visual toggle"); + Irssi::command("^BIND ^G /visual clear"); + + Irssi::command_bind 'print_test', + sub { + Irssi::gui_printtext(0, 0, '%8hello there%n'); + }; + + # redraw interception + Irssi::signal_add_last('command redraw', \&augment_redraw); + Irssi::signal_add_first('gui key pressed', \&ctrl_l_intercept); + + # for updating the overlay. + Irssi::signal_add_last ('gui key pressed', \&key_pressed); + + # things to refresh the overlay for. + Irssi::signal_add('window changed', \&uberprompt_refresh); + Irssi::signal_add('window name changed', \&uberprompt_refresh); + Irssi::signal_add('window changed automatic', \&uberprompt_refresh); + Irssi::signal_add('window item changed', \&uberprompt_refresh); + + Irssi::signal_add('terminal resized', \&update_terminal_size); + Irssi::signal_add('setup changed', \&reload_settings); + + # so we know where the bottom line is + update_terminal_size(); + + # intialise the prompt format. + reload_settings(); + + # install our statusbars. + replace_prompt_items(); + + # the actual API signals. + Irssi::signal_register({'change prompt' => [qw/string/]}); + Irssi::signal_add('change prompt' => \&change_prompt_sig); + + Irssi::signal_register({'prompt changed' => [qw/string int/]}); +} + +sub change_prompt_sig { + my ($text) = @_; + + $text = '$p' . $text; + print "Got prompt change sig with: $text" if DEBUG; + + my $changed; + $changed = defined $prompt_data ? $prompt_data ne $text : 1; + + $prompt_data = $text; + + if ($changed) { + print "Redrawing prompt" if DEBUG; + uberprompt_refresh(); + } +} + + +sub UNLOAD { + # remove uberprompt and return the original ones. + restore_prompt_items(); +} + +sub reload_settings { + my $new = Irssi::settings_get_str('uberprompt_format'); + if ($prompt_format ne $new) { + print "Updated prompt format" if DEBUG; + $prompt_format = $new; + Irssi::abstracts_register(['uberprompt', $prompt_format]); + } +} + +sub uberprompt_draw { + my ($sb_item, $get_size_only) = @_; + + my $default_prompt = ''; + + my $window = Irssi::active_win; + + # hack to produce the same defaults as prompt/prompt_empty sbars. + + if (scalar( () = $window->items )) { + $default_prompt = '{uberprompt $[.15]itemname}'; + } else { + $default_prompt = '{uberprompt $winname}'; + } + + my $p_copy = $prompt_data; + + if (defined $prompt_data) { + # replace the special marker '$p' with the original prompt. + $p_copy =~ s/\$p/$default_prompt/; + } else { + $p_copy = $default_prompt; + } + print "Redrawing with: $p_copy, size-only: $get_size_only" if DEBUG; + + $prompt_item = $sb_item; + + my $ret = $sb_item->default_handler($get_size_only, $p_copy, '', 0); + + Irssi::signal_emit('prompt changed', $p_copy, $sb_item->{size}); + + return $ret; +} + +sub augment_redraw { + print "Redraw called" if DEBUG; + uberprompt_refresh(); + Irssi::timeout_add_once(10, \&refresh_visual_overlay, 0); +} + +sub uberprompt_refresh { + Irssi::statusbar_items_redraw('uberprompt'); +} + + +sub cmd_clear_visual { + _clear_visual_region(); + #refresh_visual_overlay(); + Irssi::statusbar_items_redraw('input'); +} + +sub cmd_toggle_visual { + + $region_active = not $region_active; + + if ($region_active) { + $region_start = _pos(); + $region_end = 0; # reset end marker. + print "visual mode started at $region_start" if DEBUG; + } else { + $region_end = _pos(); + print "Visual mode ended at $region_end" if DEBUG; + + if ($region_end > $region_start) { + my $input = Irssi::parse_special('$L', 0, 0); + my $str = substr($input, $region_start, $region_end - $region_start); + print "Region selected: $str" if DEBUG; + } else { + print "Invalid region selection: [ $region_start - $region_end ]" + if DEBUG; + $region_start = $region_end = 0; + } + cmd_clear_visual(); + } +} + +sub ctrl_l_intercept { + my $key = shift; + + if ($key == 12) { # C-l + print "C-l pressed" if DEBUG; + Irssi::command("redraw"); + Irssi::signal_stop(); + } elsif ($key == 10) { # RET + _clear_visual_region(); + } +} + +sub key_pressed { + # this handler needs to be last so the actual character is printed by irssi + # before we overlay on it. Otherwise things are all a bit off-by-1 + return unless $region_active; + + refresh_visual_overlay(); +} + +sub _clear_visual_region { + print "Clearing Region markers" if DEBUG; + $region_end = 0; + $region_start = 0; +} + + +sub refresh_visual_overlay { + + my $end_pos = $region_end; + $end_pos ||= _pos(); # if not set, take current position as end. + + my $len = $end_pos - $region_start; + return unless $len; # no point drawing an empty overlay + + my $input = Irssi::parse_special('$L'); + my $offset = $prompt_item->{size} + $region_start; + + my $text = substr($input, $region_start, $len); + + print "printing '$text' at $offset [$region_start, $end_pos] ($len)" if DEBUG; + + $text = '%8' . $text . '%8'; + _draw_overlay($offset, $text, $len); + +} + +sub _draw_overlay { + my ($offset, $text, $len) = @_; + Irssi::gui_printtext($offset, $term_h, $text); +} + +sub replace_prompt_items { + # remove existing ones. + print "Removing original prompt" if DEBUG; + + _sbar_command('prompt', 'remove', 'prompt'); + _sbar_command('prompt', 'remove', 'prompt_empty'); + + # add the new one. + + _sbar_command('prompt', 'add', 'uberprompt', + qw/-alignment left -before input -priority '-1'/); + + _sbar_command('prompt', 'position', '100'); +} + +sub restore_prompt_items { + + _sbar_command('prompt', 'remove', 'uberprompt'); + + print "Restoring original prompt" if DEBUG; + + _sbar_command('prompt', 'add', 'prompt', + qw/-alignment left -before input -priority '-1'/); + _sbar_command('prompt', 'add', 'prompt_empty', + qw/-alignment left -after prompt -priority '-1'/); + + _sbar_command('prompt', 'position', '100'); + +} + +sub _sbar_command { + my ($bar, $cmd, $item, @args) = @_; + + my $args_str = join ' ', @args; + + $args_str .= ' ' if length $args_str && defined $item; + + my $command = sprintf 'STATUSBAR %s %s %s%s', + $bar, $cmd, $args_str, defined($item)?$item:''; + + print "Running command: $command" if DEBUG; + Irssi::command($command); +} + +sub _pos { + return Irssi::gui_input_get_pos(); +} + + +# bit of fakery so things don't complain about the lack of prompt_info (hoepfully) + +%Irssi::Script::prompt_info:: = (); diff --git a/prompt_info/old/visual.pl b/prompt_info/old/visual.pl new file mode 100644 index 0000000..b29875b --- /dev/null +++ b/prompt_info/old/visual.pl @@ -0,0 +1,168 @@ +use strict; +use warnings; + +use Irssi; +use Irssi::TextUI; # for sbar_items_redraw +use Data::Dumper; + + + +our $VERSION = "0.1"; +our %IRSSI = + ( + authors => "shabble", + contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode', + name => "prompt_info", + description => "Helper script for dynamically adding text " + . "into the input-bar prompt.", + license => "Public Domain", + changed => "24/7/2010" + ); + +sub DEBUG () { 1 } +#sub DEBUG () { 0 } + +my $region_active = 0; + +my ($term_w, $term_h) = (0, 0); + +# visual region selected. +my ($region_start, $region_end) = (0, 0); +my $region_content = ''; + + +sub visual_subcmd_handler { + my ($data, $server, $item) = @_; + $data =~ s/\s+$//g; # strip trailing whitespace. + Irssi::command_runsub('visual', $data, $server, $item); +} + +sub init { + + # misc faff + Irssi::command_bind('visual', \&visual_subcmd_handler); + Irssi::command_bind('visual toggle', \&cmd_toggle_visual); + Irssi::command_bind('visual clear', \&cmd_clear_visual); + + Irssi::command("^BIND ^F /visual toggle"); + Irssi::command("^BIND ^G /visual clear"); + + Irssi::command_bind 'print_test', + sub { + Irssi::gui_printtext(0, 0, '%8hello there%n'); + }; + + # redraw interception + Irssi::signal_add_last('command redraw', \&augment_redraw); + Irssi::signal_add_first('gui key pressed', \&ctrl_l_intercept); + + # for updating the overlay. + Irssi::signal_add_last ('gui key pressed', \&key_pressed); + + # things to refresh the overlay for. + Irssi::signal_add('window changed', \&uberprompt_refresh); + Irssi::signal_add('window name changed', \&uberprompt_refresh); + Irssi::signal_add('window changed automatic', \&uberprompt_refresh); + Irssi::signal_add('window item changed', \&uberprompt_refresh); + + Irssi::signal_add('terminal resized', \&update_terminal_size); + + # so we know where the bottom line is + update_terminal_size(); + + +} +sub cmd_clear_visual { + _clear_visual_region(); + #refresh_visual_overlay(); + Irssi::statusbar_items_redraw('input'); +} + + +sub augment_redraw { + print "Redraw called" if DEBUG; + uberprompt_refresh(); + Irssi::timeout_add_once(10, \&refresh_visual_overlay, 0); +} + + +sub cmd_toggle_visual { + + $region_active = not $region_active; + + if ($region_active) { + $region_start = _pos(); + $region_end = 0; # reset end marker. + print "visual mode started at $region_start" if DEBUG; + } else { + $region_end = _pos(); + print "Visual mode ended at $region_end" if DEBUG; + + if ($region_end > $region_start) { + my $input = Irssi::parse_special('$L', 0, 0); + my $str = substr($input, $region_start, $region_end - $region_start); + print "Region selected: $str" if DEBUG; + } else { + print "Invalid region selection: [ $region_start - $region_end ]" + if DEBUG; + $region_start = $region_end = 0; + } + cmd_clear_visual(); + } +} + +sub ctrl_l_intercept { + my $key = shift; + + if ($key == 12) { # C-l + print "C-l pressed" if DEBUG; + Irssi::command("redraw"); + Irssi::signal_stop(); + } elsif ($key == 10) { # RET + _clear_visual_region(); + } +} + +sub key_pressed { + # this handler needs to be last so the actual character is printed by irssi + # before we overlay on it. Otherwise things are all a bit off-by-1 + return unless $region_active; + + refresh_visual_overlay(); +} + +sub _clear_visual_region { + print "Clearing Region markers" if DEBUG; + $region_end = 0; + $region_start = 0; +} + + +sub refresh_visual_overlay { + + my $end_pos = $region_end; + $end_pos ||= _pos(); # if not set, take current position as end. + + my $len = $end_pos - $region_start; + return unless $len; # no point drawing an empty overlay + + my $input = Irssi::parse_special('$L'); + my $offset = $prompt_item->{size} + $region_start; + + my $text = substr($input, $region_start, $len); + + print "printing '$text' at $offset [$region_start, $end_pos] ($len)" if DEBUG; + + $text = '%8' . $text . '%8'; + _draw_overlay($offset, $text, $len); + +} + +sub _draw_overlay { + my ($offset, $text, $len) = @_; + Irssi::gui_printtext($offset, $term_h, $text); +} + +sub _pos { + return Irssi::gui_input_get_pos(); +} |