From 90352618f680723a1a6a6cf59aec93917d64dbb1 Mon Sep 17 00:00:00 2001 From: Tom Feist Date: Sat, 9 Oct 2010 16:39:29 +0100 Subject: factored all the visual stuff out of prompt_replace into its own file. --- prompt_info/prompt_replace.pl | 171 +++--------------------------------------- 1 file changed, 12 insertions(+), 159 deletions(-) (limited to 'prompt_info/prompt_replace.pl') diff --git a/prompt_info/prompt_replace.pl b/prompt_info/prompt_replace.pl index 20fb7b1..c9bfcc8 100644 --- a/prompt_info/prompt_replace.pl +++ b/prompt_info/prompt_replace.pl @@ -25,41 +25,10 @@ sub DEBUG () { 1 } 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) = @_; @@ -67,57 +36,21 @@ sub prompt_subcmd_handler { 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::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", \&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(); + Irssi::signal_add('setup changed', \&reload_settings); # intialise the prompt format. reload_settings(); @@ -128,13 +61,12 @@ sub init { # the actual API signal. Irssi::signal_register({'change prompt' => [qw/string/]}); Irssi::signal_add('change prompt' => \&change_prompt_sig); - - } sub change_prompt_sig { my ($text) = @_; + # TODO: mroe intelligence about where to insert $p? $text = '$p' . $text; print "Got prompt change sig with: $text" if DEBUG; @@ -149,9 +81,9 @@ sub change_prompt_sig { } } - sub UNLOAD { # remove uberprompt and return the original ones. + print "Removing uberprompt and restoring original"; restore_prompt_items(); } @@ -187,19 +119,19 @@ sub uberprompt_draw { } else { $p_copy = $default_prompt; } + $p_copy =~ s/\$/\$\$/g; # escape all $ symbols + $p_copy =~ s/\\/\\\\/g; # escape backslashes. + print "Redrawing with: $p_copy, size-only: $get_size_only" if DEBUG; $prompt_item = $sb_item; - $sb_item->default_handler($get_size_only, $p_copy, '', 0); -} + my $ret = $sb_item->default_handler($get_size_only, $p_copy, '', 0); -sub augment_redraw { - print "Redraw called" if DEBUG; - uberprompt_refresh(); - Irssi::timeout_add_once(10, \&refresh_visual_overlay, 0); + return $ret; } + sub uberprompt_refresh { Irssi::statusbar_items_redraw('uberprompt'); } @@ -211,82 +143,6 @@ sub cmd_clear_visual { 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. @@ -332,9 +188,6 @@ sub _sbar_command { 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) -- cgit v1.2.3