aboutsummaryrefslogtreecommitdiffstats
path: root/prompt_info
diff options
context:
space:
mode:
authorTom Feist <shabble@metavore.org>2011-04-18 15:33:59 +0000
committerTom Feist <shabble@metavore.org>2011-04-18 15:33:59 +0000
commitfdcab7762591fca9677ed74ada21267481e255e6 (patch)
treeba92e4a4b3927e07af1365a1e81d7e6fac203557 /prompt_info
parentmoved older scripts out of prompt-info to ensure uberprompt readme is correct... (diff)
downloadirssi-scripts-fdcab7762591fca9677ed74ada21267481e255e6.tar.gz
irssi-scripts-fdcab7762591fca9677ed74ada21267481e255e6.zip
moved older scripts out of prompt-info to ensure uberprompt readme is correctly generated (2)
Diffstat (limited to 'prompt_info')
-rw-r--r--prompt_info/old/input_overlay.pl288
-rw-r--r--prompt_info/old/overlays.pl198
-rw-r--r--prompt_info/old/prompt_info.pl114
-rw-r--r--prompt_info/old/prompt_replace.pl346
-rw-r--r--prompt_info/old/visual.pl168
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', \&region_toggle);
+ Irssi::command_bind('region_clear', \&region_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();
+}