Chandra

 view release on metacpan or  search on metacpan

xs/contextmenu.xs  view on Meta::CPAN

    for (j = 0; j <= len; j++) {
        SV **elem = av_fetch(items_av, j, 0);
        HV *item_hv;
        SV **l_svp;
        if (!elem || !SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVHV)
            continue;
        item_hv = (HV *)SvRV(*elem);
        l_svp = hv_fetchs(item_hv, "label", 0);
        if (!l_svp || !SvOK(*l_svp)) continue;
        if (!strEQ(SvPV_nolen(*l_svp), label)) continue;

        /* Remove action from registry */
        {
            SV **id_svp = hv_fetchs(item_hv, "_id", 0);
            if (id_svp && SvOK(*id_svp)) {
                SV **actions_svp = hv_fetchs(hv, "_actions", 0);
                char id_str[32];
                int id_len = my_snprintf(id_str, sizeof(id_str), "%ld", (long)SvIV(*id_svp));
                (void)hv_delete((HV *)SvRV(*actions_svp), id_str, id_len, G_DISCARD);
            }
        }

        /* Shift items down */
        {
            I32 k;
            for (k = j; k < len; k++) {
                SV **next = av_fetch(items_av, k + 1, 0);
                if (next) av_store(items_av, k, SvREFCNT_inc(*next));
            }
            av_pop(items_av);
        }
        break;
    }
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

 # ---- items() - return items arrayref ----

SV *
get_items(self)
    SV *self
ALIAS:
    items = 1
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **items_svp = hv_fetchs(hv, "_items", 0);
    PERL_UNUSED_VAR(ix);
    RETVAL = SvREFCNT_inc(*items_svp);
}
OUTPUT:
    RETVAL

 # ---- attachments() - return list of attached selectors ----

void
attachments(self)
    SV *self
PPCODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **att_svp = hv_fetchs(hv, "_attachments", 0);
    HV *att_hv = (HV *)SvRV(*att_svp);
    HE *entry;

    hv_iterinit(att_hv);
    while ((entry = hv_iternext(att_hv)) != NULL) {
        I32 klen;
        const char *key = hv_iterkey(entry, &klen);
        XPUSHs(sv_2mortal(newSVpvn(key, klen)));
    }
}

 # ---- enable / disable / is_enabled ----

SV *
enable(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    (void)hv_stores(hv, "_enabled", newSViv(1));
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

SV *
disable(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    (void)hv_stores(hv, "_enabled", newSViv(0));
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

int
is_enabled(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **en_svp = hv_fetchs(hv, "_enabled", 0);
    RETVAL = (en_svp && SvTRUE(*en_svp)) ? 1 : 0;
}
OUTPUT:
    RETVAL

 # ---- js_code() - generate the JS injection code ----

SV *
js_code(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);



( run in 1.319 second using v1.01-cache-2.11-cpan-71847e10f99 )