#! perl

#:META:OSC_PERL:overlay:man overlay-osc

=head1 NAME

overlay-osc - implement OSC to manage overlays

=head1 DESCRIPTION

This extension implements some OSC commands to display timed popups on the
screen - useful for status displays from within scripts. You have to read
the sources for more info.

=cut

# allows programs to open popups
# printf "\033]777;overlay;action;args\007"
#
# action "simple;<id>;<timeout>;<x>;<y>;<h|t>;<text>"
#   printf "\033]777;overlay;simple;ov1;5;0;0;t;test\007"
#

# action "timeout;<id>;<seconds>"
#   printf "\033]777;overlay;timeout;ov1;6\007"

# action "destroy;<id>"
#   printf "\033]777;overlay;destroy;ov1\007"

# TODO:
## action "complex;<id>;<timeout>;<x>;<y>;<width>;<height>;<rstyle>;<border>"
## action "set;<id>;<x>;<y>;<h|t>;<hextext>;<rendition...>"

sub on_osc_seq_perl {
   my ($self, $osc, $resp) = @_;

   return unless $osc =~ s/^overlay;//;

   $osc =~ s/^([^;]+)+;//
      or return;

   if ($1 eq "timeout") {
      my ($id, $to) = split /;/, $osc, 2;
      my $ov = $self->{ov}{$id}
         or return;
      if (length $to) {
         $ov->{to}->start (urxvt::NOW + $to);
      } else {
         delete $ov->{to};
      }

   } elsif ($1 eq "simple") {
      my ($id, $to, $x, $y, $t, $txt) = split /;/, $osc, 6;
      if ($t eq "h") {
         $txt = pack "H*", $txt;
         utf8::decode $txt;
      }
      $self->{ov}{$id} = {
         ov => $self->overlay_simple ($x, $y, $txt),
         to => urxvt::timer
            ->new
            ->start (urxvt::NOW + $to)
            ->cb(sub {
               delete $self->{ov}{$id};
            }),
      };

   } elsif ($1 eq "destroy") {
      delete $self->{ov}{$osc};
   }

   1
}


