# 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); # } # }