struct overlay {
HV *self;
+ bool visible;
rxvt_term *THIS;
int x, y, w, h;
int border;
};
overlay::overlay (rxvt_term *THIS, int x_, int y_, int w_, int h_, rend_t rstyle, int border)
-: THIS(THIS), x(x_), y(y_), w(w_), h(h_), border(border == 2)
+: THIS(THIS), x(x_), y(y_), w(w_), h(h_), border(border == 2), visible(false)
{
if (border == 2)
{
void
overlay::show ()
{
- char key[33]; sprintf (key, "%32lx", (long)this);
+ if (visible)
+ return;
+
+ visible = true;
- HV *hv = (HV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)THIS->perl.self), "_overlay", 8, 0));
- hv_store (hv, key, 32, newSViv ((long)this), 0);
+ AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)THIS->perl.self), "_overlay", 8, 0));
+ av_push (av, newSViv ((long)this));
}
void
overlay::hide ()
{
- SV **ovs = hv_fetch ((HV *)SvRV ((SV *)THIS->perl.self), "_overlay", 8, 0);
+ if (!visible)
+ return;
- if (ovs)
- {
- char key[33]; sprintf (key, "%32lx", (long)this);
+ visible = false;
- HV *hv = (HV *)SvRV (*ovs);
- hv_delete (hv, key, 32, G_DISCARD);
- }
+ AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)THIS->perl.self), "_overlay", 8, 0));
+
+ int i;
+
+ for (i = AvFILL (av); i >= 0; i--)
+ if (SvIV (*av_fetch (av, i, 1)) == (long)this)
+ {
+ av_delete (av, i, G_DISCARD);
+ break;
+ }
+
+ for (; i < AvFILL (av); i++)
+ av_store (av, i, SvREFCNT_inc (*av_fetch (av, i + 1, 0)));
+
+ av_pop (av);
}
void overlay::swap ()
AV *av = (AV *)SvRV (rend);
- for (int col = min (av_len (av) + 1, w - x - border); col--; )
+ for (int col = min (AvFILL (av) + 1, w - x - border); col--; )
this->rend [y][x + col] = SvIV (*av_fetch (av, col, 1));
}
{
// runs outside of perls ENV
term->perl.self = (void *)newSVptr ((void *)term, "urxvt::term");
- hv_store ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, newRV_noinc ((SV *)newHV ()), 0);
+ hv_store ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, newRV_noinc ((SV *)newAV ()), 0);
}
}
}
}
-static void
-swap_overlays (rxvt_term *term)
-{
- HV *hv = (HV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, 0));
-
- if (HvKEYS (hv))
- {
- hv_iterinit (hv);
-
- while (HE *he = hv_iternext (hv))
- ((overlay *)SvIV (hv_iterval (hv, he)))->swap ();
- }
-}
-
bool
rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...)
{
// pre-handling of some events
if (htype == HOOK_REFRESH_END)
- swap_overlays (term);
+ {
+ AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, 0));
+
+ for (int i = 0; i <= AvFILL (av); i++)
+ ((overlay *)SvIV (*av_fetch (av, i, 0)))->swap ();
+ }
swap (perl_environ, environ);
// post-handling of some events
if (htype == HOOK_REFRESH_BEGIN)
- swap_overlays (term);
+ {
+ AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, 0));
+
+ for (int i = AvFILL (av); i >= 0; i--)
+ ((overlay *)SvIV (*av_fetch (av, i, 0)))->swap ();
+ }
else if (htype == HOOK_DESTROY)
{
clearSVptr ((SV *)term->perl.self);
term->argv->push_back (strdup (SvPVbyte_nolen (ST (i))));
AV *envv = (AV *)SvRV (ST (0));
- for (int i = av_len (envv) + 1; i--; )
+ for (int i = AvFILL (envv) + 1; i--; )
term->envv->push_back (strdup (SvPVbyte_nolen (*av_fetch (envv, i, 1))));
term->envv->push_back (0);
croak ("new_rend must be arrayref");
AV *av = (AV *)SvRV (new_rend);
- int len = min (av_len (av) + 1 - start_ofs, max_len);
+ int len = min (AvFILL (av) + 1 - start_ofs, max_len);
if (!IN_RANGE_INC (start_col, 0, THIS->ncol - len))
croak ("new_rend array extends beyond horizontal margins");