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 )