Chandra

 view release on metacpan or  search on metacpan

xs/dragdrop.xs  view on Meta::CPAN

    SV *callback
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **h_svp = hv_fetchs(hv, "_handlers", 0);
    HV *handlers = (HV *)SvRV(*h_svp);
    if (!SvROK(callback) || SvTYPE(SvRV(callback)) != SVt_PVCV)
        croak("on_internal_drop() requires a coderef");
    (void)hv_stores(handlers, "internal_drop", newSVsv(callback));
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

 # ---- add_drop_zone($selector, $coderef) ----

SV *
add_drop_zone(self, selector, callback)
    SV *self
    SV *selector
    SV *callback
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **dz_svp = hv_fetchs(hv, "_drop_zones", 0);
    HV *zones = (HV *)SvRV(*dz_svp);
    STRLEN slen;
    const char *sel = SvPV(selector, slen);
    if (!SvROK(callback) || SvTYPE(SvRV(callback)) != SVt_PVCV)
        croak("add_drop_zone() requires a coderef");
    (void)hv_store(zones, sel, (I32)slen, newSVsv(callback), 0);
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

 # ---- remove_drop_zone($selector) ----

SV *
remove_drop_zone(self, selector)
    SV *self
    SV *selector
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **dz_svp = hv_fetchs(hv, "_drop_zones", 0);
    HV *zones = (HV *)SvRV(*dz_svp);
    STRLEN slen;
    const char *sel = SvPV(selector, slen);
    (void)hv_delete(zones, sel, (I32)slen, G_DISCARD);
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

 # ---- drop_zones() - list registered selectors ----

void
drop_zones(self)
    SV *self
PPCODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **dz_svp = hv_fetchs(hv, "_drop_zones", 0);
    HV *zones = (HV *)SvRV(*dz_svp);
    HE *entry;
    hv_iterinit(zones);
    while ((entry = hv_iternext(zones)) != NULL) {
        I32 klen;
        const char *key = hv_iterkey(entry, &klen);
        XPUSHs(sv_2mortal(newSVpvn(key, klen)));
    }
}

 # ---- make_draggable($selector, %opts) ----

SV *
make_draggable(self, selector, ...)
    SV *self
    SV *selector
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **dr_svp = hv_fetchs(hv, "_draggables", 0);
    HV *drags = (HV *)SvRV(*dr_svp);
    STRLEN slen;
    const char *sel = SvPV(selector, slen);
    HV *opts = newHV();
    I32 i;

    for (i = 2; i + 1 < items; i += 2) {
        const char *key = SvPV_nolen(ST(i));
        SV *val = ST(i + 1);
        if (strEQ(key, "data")) {
            (void)hv_stores(opts, "data", newSVsv(val));
        } else if (strEQ(key, "data_from")) {
            (void)hv_stores(opts, "data_from", newSVsv(val));
        }
    }

    (void)hv_store(drags, sel, (I32)slen, newRV_noinc((SV *)opts), 0);
    RETVAL = SvREFCNT_inc(self);
}
OUTPUT:
    RETVAL

 # ---- remove_draggable($selector) ----

SV *
remove_draggable(self, selector)
    SV *self
    SV *selector
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **dr_svp = hv_fetchs(hv, "_draggables", 0);
    HV *drags = (HV *)SvRV(*dr_svp);
    STRLEN slen;
    const char *sel = SvPV(selector, slen);
    (void)hv_delete(drags, sel, (I32)slen, G_DISCARD);
    RETVAL = SvREFCNT_inc(self);



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