diff options
Diffstat (limited to 'prompt_info')
| -rw-r--r-- | prompt_info/overlays.pl | 213 | ||||
| -rw-r--r-- | prompt_info/uberprompt.pl | 18 | ||||
| -rw-r--r-- | prompt_info/visual.pl | 23 | 
3 files changed, 178 insertions, 76 deletions
| diff --git a/prompt_info/overlays.pl b/prompt_info/overlays.pl index 47a3eef..b3299e9 100644 --- a/prompt_info/overlays.pl +++ b/prompt_info/overlays.pl @@ -1,89 +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 $overlay; - +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 ($line, $start, $end, $text, $len) = @_; -    my $region = { start => $start, -                   end => $end, +    my ($x, $y, $text) = @_; +    my $region = { start => $x,                     text => $text, -                   len => $len }; +                 }; -    my $o_line = $overlay->{$line}; +    my $o_line = $overlays->{$y};      unless (defined $o_line) {          $o_line = []; -        $overlay->{$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; -        } -    } +    # 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) = @_; +# sub _remove_overlay_region { +#     my ($line, $start, $end) = @_; -    my $o_line = $overlay->{$line}; -    return unless $o_line; +#     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; +#     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});          } -        $i++;      } -    splice @$o_line, $i, 1, (); # remove it.  } -sub _redraw_overlay { -    foreach my $line_num (sort keys %$overlay) { -        my $line = $overlay->{$line_num}; +sub augment_redraw { +    #print "Redraw called" if DEBUG; +    #redraw_overlay(); +    Irssi::timeout_add_once(10, \&redraw_overlay, 0); +} -        foreach my $region (@$line) { -            Irssi::gui_printtext($region->{start}, $line_num, -                                 $region->{text}); -        } +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 { -    Irssi::active_win->view->redraw(); +    $overlays = {}; +    redraw_overlay();  } -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); -    } +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/uberprompt.pl b/prompt_info/uberprompt.pl index 7b3e022..ded45cf 100644 --- a/prompt_info/uberprompt.pl +++ b/prompt_info/uberprompt.pl @@ -153,14 +153,25 @@ sub prompt_subcmd_handler {  }  sub UNLOAD { +    deinit(); +} + +sub exp_lbrace { '{' } +sub exp_rbrace { '}' } + +sub deinit { +    Irssi::expando_destroy('brace');      # remove uberprompt and return the original ones.      print "Removing uberprompt and restoring original";      restore_prompt_items();  } -  sub init {      Irssi::statusbar_item_register('uberprompt', 0, 'uberprompt_draw'); +    # TODO: flags to prevent these from being recomputed? +    Irssi::expando_create('lbrace', \&exp_lbrace, {}); +    Irssi::expando_create('rbrace', \&exp_rbrace, {}); +      Irssi::settings_add_str('uberprompt', 'uberprompt_format', '[$*$uber] ');      Irssi::settings_add_bool('uberprompt', 'uberprompt_debug', 0);      Irssi::settings_add_bool('uberprompt', 'uberprompt_autostart', 1); @@ -255,6 +266,10 @@ sub _escape_prompt_special {      my $str = shift;      $str =~ s/\$/\$\$/g;      $str =~ s/\\/\\\\/g; +    #$str =~ s/%/%%/g; +    $str =~ s/{/\$lbrace/g; +    $str =~ s/}/\$rbrace/g; +      return $str;  } @@ -292,6 +307,7 @@ sub uberprompt_draw {          $prompt = $pdata_copy;      } elsif ($prompt_data_pos eq 'UP_INNER' && defined $prompt_data) { +          my $esc = _escape_prompt_special($prompt_data);          $prompt =~ s/\$\$uber/$esc/; diff --git a/prompt_info/visual.pl b/prompt_info/visual.pl index 1413d0d..b29875b 100644 --- a/prompt_info/visual.pl +++ b/prompt_info/visual.pl @@ -30,29 +30,6 @@ my ($term_w, $term_h) = (0, 0);  my ($region_start, $region_end) = (0, 0);  my $region_content = ''; -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 visual_subcmd_handler {      my ($data, $server, $item) = @_; | 
