Chandra
view release on metacpan or search on metacpan
xs/dragdrop.xs view on Meta::CPAN
"if(text){\n"
"window.chandra.invoke('__chandra_dragdrop',[JSON.stringify({\n"
"type:'text_drop',text:text,target:tgt\n"
"})]);\n"
"}\n"
"},true);\n"
/* Setup draggable elements */
"draggables.forEach(function(cfg){\n"
"var els=document.querySelectorAll(cfg.sel);\n"
"els.forEach(function(el){\n"
"el.setAttribute('draggable','true');\n"
"el.addEventListener('dragstart',function(e){\n"
"var data=cfg.data||null;\n"
"if(cfg.dataFrom){\n"
"var attr=el.getAttribute(cfg.dataFrom);\n"
"try{data=JSON.parse(attr);}catch(_){data=attr;}\n"
"}\n"
"_dragData={data:data,source:elemInfo(el),sourceEl:el};\n"
"e.dataTransfer.effectAllowed='move';\n"
"});\n"
"});\n"
"});\n"
"window.__chandraDragDrop={zones:zones,draggables:draggables};\n"
"})();\n"
);
RETVAL = js;
}
OUTPUT:
RETVAL
# ---- inject() - inject JS via app->eval ----
SV *
inject(self)
SV *self
CODE:
{
HV *hv = (HV *)SvRV(self);
SV **injected_svp;
injected_svp = hv_fetchs(hv, "_injected", 0);
if (injected_svp && SvTRUE(*injected_svp)) {
RETVAL = SvREFCNT_inc(self);
} else {
SV *js;
(void)hv_stores(hv, "_injected", newSViv(1));
/* Bind __chandra_dragdrop dispatch if not already done */
{
SV **db_svp = hv_fetchs(hv, "_dispatch_bound", 0);
if (!db_svp || !SvTRUE(*db_svp)) {
SV **app_svp = hv_fetchs(hv, "app", 0);
if (app_svp && SvOK(*app_svp)) {
SV *dd_self_ref = newSVsv(self);
CV *wrapper_cv;
sv_rvweaken(dd_self_ref);
wrapper_cv = newXS(NULL, XS_Chandra__DragDrop__dispatch_trampoline, __FILE__);
CvXSUBANY(wrapper_cv).any_ptr = (void *)dd_self_ref;
{
dSP;
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(*app_svp);
XPUSHs(sv_2mortal(newSVpvs("__chandra_dragdrop")));
XPUSHs(sv_2mortal(newRV_noinc((SV *)wrapper_cv)));
PUTBACK;
call_method("bind", G_DISCARD);
FREETMPS; LEAVE;
}
(void)hv_stores(hv, "_dispatch_bound", newSViv(1));
}
}
}
/* Get JS code */
{
dSP;
int count;
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(self);
PUTBACK;
count = call_method("js_code", G_SCALAR);
SPAGAIN;
js = (count > 0) ? newSVsv(POPs) : newSVpvs("");
PUTBACK;
FREETMPS; LEAVE;
}
/* Call $self->{app}->eval($js) */
{
SV **app_svp = hv_fetchs(hv, "app", 0);
if (app_svp && SvOK(*app_svp)) {
dSP;
ENTER; SAVETMPS;
PUSHMARK(SP);
XPUSHs(*app_svp);
XPUSHs(sv_2mortal(js));
PUTBACK;
call_method("eval", G_DISCARD);
FREETMPS; LEAVE;
} else {
SvREFCNT_dec(js);
}
}
RETVAL = SvREFCNT_inc(self);
}
}
OUTPUT:
RETVAL
( run in 2.669 seconds using v1.01-cache-2.11-cpan-364913b4093 )