Chandra

 view release on metacpan or  search on metacpan

include/chandra/chandra_contextmenu.h  view on Meta::CPAN

#ifndef CHANDRA_CONTEXTMENU_H
#define CHANDRA_CONTEXTMENU_H

/* Static C helper functions for Chandra::ContextMenu */

static IV
_cm_next_id(pTHX_ HV *hv)
{
    SV **id_svp = hv_fetchs(hv, "_next_id", 0);
    IV id = SvIV(*id_svp);
    sv_setiv(*id_svp, id + 1);
    return id;
}

static void _cm_items_to_js(pTHX_ SV *js, AV *items_av);

static void
_cm_register_actions(pTHX_ HV *self_hv, AV *items_av, HV *actions_hv)
{
    I32 len = av_len(items_av);
    I32 i;

    for (i = 0; i <= len; i++) {
        SV **elem = av_fetch(items_av, i, 0);
        HV *item_hv;
        SV **action_svp, **sub_svp;

        if (!elem || !SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVHV)
            continue;
        item_hv = (HV *)SvRV(*elem);

        action_svp = hv_fetchs(item_hv, "action", 0);
        if (action_svp && SvROK(*action_svp) && SvTYPE(SvRV(*action_svp)) == SVt_PVCV) {
            IV id = _cm_next_id(aTHX_ self_hv);
            char id_str[32];
            int id_len = my_snprintf(id_str, sizeof(id_str), "%ld", (long)id);
            (void)hv_stores(item_hv, "_id", newSViv(id));
            (void)hv_store(actions_hv, id_str, id_len, newSVsv(*action_svp), 0);
        }

        sub_svp = hv_fetchs(item_hv, "submenu", 0);
        if (sub_svp && SvROK(*sub_svp) && SvTYPE(SvRV(*sub_svp)) == SVt_PVAV) {
            _cm_register_actions(aTHX_ self_hv, (AV *)SvRV(*sub_svp), actions_hv);
        }
    }
}

static void
_cm_items_to_js(pTHX_ SV *js, AV *items_av)
{
    I32 len = av_len(items_av);
    I32 i;

    sv_catpvs(js, "[");
    for (i = 0; i <= len; i++) {
        SV **elem = av_fetch(items_av, i, 0);
        HV *item_hv;
        SV **sep_svp, **label_svp, **sub_svp;
        SV **disabled_svp, **checkable_svp, **checked_svp;
        SV **icon_svp, **shortcut_svp, **id_svp;

        if (!elem || !SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVHV)
            continue;
        item_hv = (HV *)SvRV(*elem);



( run in 0.598 second using v1.01-cache-2.11-cpan-39bf76dae61 )