diff options
-rw-r--r-- | prompt_info/input_overlay.pl | 288 | ||||
-rw-r--r-- | prompt_info/overlays.pl | 198 | ||||
-rw-r--r-- | prompt_info/prompt_info.pl | 114 | ||||
-rw-r--r-- | prompt_info/prompt_replace.pl | 346 | ||||
-rw-r--r-- | prompt_info/uberprompt.pl | 39 | ||||
-rw-r--r-- | prompt_info/visual.pl | 168 |
6 files changed, 26 insertions, 1127 deletions
diff --git a/prompt_info/input_overlay.pl b/prompt_info/input_overlay.pl deleted file mode 100644 index 9d2a42b..0000000 --- a/prompt_info/input_overlay.pl +++ /dev/null @@ -1,288 +0,0 @@ - -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/overlays.pl b/prompt_info/overlays.pl deleted file mode 100644 index b3299e9..0000000 --- a/prompt_info/overlays.pl +++ /dev/null @@ -1,198 +0,0 @@ -# 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/prompt_info.pl b/prompt_info/prompt_info.pl deleted file mode 100644 index 8ad63ba..0000000 --- a/prompt_info/prompt_info.pl +++ /dev/null @@ -1,114 +0,0 @@ -# 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/prompt_replace.pl b/prompt_info/prompt_replace.pl deleted file mode 100644 index 30120f7..0000000 --- a/prompt_info/prompt_replace.pl +++ /dev/null @@ -1,346 +0,0 @@ -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/uberprompt.pl b/prompt_info/uberprompt.pl index adafee7..6a750ad 100644 --- a/prompt_info/uberprompt.pl +++ b/prompt_info/uberprompt.pl @@ -27,22 +27,35 @@ uberprompt_format setting. See below for details. Although the script is designed primarily for other scripts to set status information into the prompt, the following commands are available: -TODO: Document positional settings. +=over 4 + +=item * C</prompt set [-inner|-pre|-post|only] E<lt>msgE<gt>> + +Sets the prompt to the given argument. Any use of C<$p> in the argument will +be replaced by the original prompt content. + +A parameter corresponding to the C<UP_*> constants listed below is required, in +the format C</prompt set -inner Hello!> + +=item * C</prompt clear> -/prompt set - sets the prompt to the given argument. $p in the argument will - be replaced by the original prompt content. - A parameter corresponding to the UP_* constants listed below - is required, in the format `/prompt set -inner Hello!' +Clears the additional data provided to the prompt. -/prompt set [-inner|-pre|-post|only] <msg> +=item * C</prompt on> -/prompt clear - clears the additional data provided to the prompt. -/prompt on - enables the uberprompt (things may get confused if this is used - whilst the prompt is already enabled) -/prompt off - restore the original irssi prompt and prompt_empty statusbars. - unloading the script has the same effect. +Eenables the uberprompt (things may get confused if this is used +whilst the prompt is already enabled) -/help prompt - show help for uberprompt commands +=item * C</prompt off> + +Restore the original irssi prompt and prompt_empty statusbars. unloading the +script has the same effect. + +=item * C</help prompt> + +show help for uberprompt commands + +=back =head1 UBERPROMPT FORMAT: @@ -54,7 +67,7 @@ F<default.theme>. Changing this setting will update the prompt immediately, unlike editing your theme. An additional variable available within this format is C<$uber>, which expands to -the content of prompt data provided with the C<UP_INNER> or </prompt set -inner> +the content of prompt data provided with the C<UP_INNER> or C</prompt set -inner> placement argument. For all other placement arguments, it will expand to the empty string. diff --git a/prompt_info/visual.pl b/prompt_info/visual.pl deleted file mode 100644 index b29875b..0000000 --- a/prompt_info/visual.pl +++ /dev/null @@ -1,168 +0,0 @@ -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(); -} |