Chandra
view release on metacpan or search on metacpan
xs/window.xs view on Meta::CPAN
int
is_visible(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "visible", 7, 0);
RETVAL = (svp && SvTRUE(*svp)) ? 1 : 0;
OUTPUT:
RETVAL
int
is_modal(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "modal", 5, 0);
RETVAL = (svp && SvTRUE(*svp)) ? 1 : 0;
OUTPUT:
RETVAL
int
is_closed(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
int wid;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "wid", 3, 0);
wid = (svp && SvIOK(*svp)) ? SvIV(*svp) : -1;
/* Check if in registry and native window exists */
if (wid < 0 || !GET_WINDOW(wid)) {
RETVAL = 1;
} else {
RETVAL = !cwin_exists(wid);
}
OUTPUT:
RETVAL
void
get_size(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
int width = 0, height = 0;
PPCODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "width", 5, 0);
if (svp && SvIOK(*svp)) width = SvIV(*svp);
svp = hv_fetch(hv, "height", 6, 0);
if (svp && SvIOK(*svp)) height = SvIV(*svp);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(width)));
PUSHs(sv_2mortal(newSViv(height)));
void
get_position(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
int x = 0, y = 0;
PPCODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "x", 1, 0);
if (svp && SvIOK(*svp)) x = SvIV(*svp);
svp = hv_fetch(hv, "y", 1, 0);
if (svp && SvIOK(*svp)) y = SvIV(*svp);
EXTEND(SP, 2);
PUSHs(sv_2mortal(newSViv(x)));
PUSHs(sv_2mortal(newSViv(y)));
SV *
set_modal(self, ...)
SV *self
PREINIT:
HV *hv;
SV **svp;
int wid;
int parent_wid = 0;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
/* Check if already modal */
svp = hv_fetch(hv, "modal", 5, 0);
if (svp && SvTRUE(*svp)) {
RETVAL = SvREFCNT_inc(self);
goto done;
}
svp = hv_fetch(hv, "wid", 3, 0);
wid = (svp && SvIOK(*svp)) ? SvIV(*svp) : -1;
if (wid < 0) {
RETVAL = SvREFCNT_inc(self);
goto done;
}
hv_store(hv, "modal", 5, newSViv(1), 0);
if (items > 1 && SvOK(ST(1)) && SvROK(ST(1))) {
HV *parent_hv = (HV*)SvRV(ST(1));
SV **parent_svp = hv_fetch(parent_hv, "wid", 3, 0);
if (parent_svp && SvIOK(*parent_svp)) {
parent_wid = SvIV(*parent_svp);
hv_store(hv, "parent", 6, SvREFCNT_inc(ST(1)), 0);
}
}
cwin_set_modal(wid, parent_wid);
RETVAL = SvREFCNT_inc(self);
done:
OUTPUT:
RETVAL
SV *
end_modal(self)
SV *self
PREINIT:
HV *hv;
xs/window.xs view on Meta::CPAN
handlers = newAV();
hv_store(events, event, strlen(event), newRV_noinc((SV*)handlers), 0);
} else {
handlers = (AV*)SvRV(*svp);
}
av_push(handlers, SvREFCNT_inc(coderef));
RETVAL = SvREFCNT_inc(self);
OUTPUT:
RETVAL
SV *
emit(self, event, ...)
SV *self
const char *event
PREINIT:
HV *hv;
SV **svp;
HV *events;
AV *handlers;
int i, len;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "_events", 7, 0);
if (svp && SvROK(*svp)) {
events = (HV*)SvRV(*svp);
svp = hv_fetch(events, event, strlen(event), 0);
if (svp && SvROK(*svp)) {
handlers = (AV*)SvRV(*svp);
len = av_len(handlers) + 1;
for (i = 0; i < len; i++) {
SV **cbp = av_fetch(handlers, i, 0);
if (cbp && SvOK(*cbp)) {
dSP;
int j;
ENTER; SAVETMPS;
PUSHMARK(SP);
for (j = 2; j < items; j++) {
XPUSHs(ST(j));
}
PUTBACK;
call_sv(*cbp, G_DISCARD);
FREETMPS; LEAVE;
}
}
}
}
RETVAL = SvREFCNT_inc(self);
OUTPUT:
RETVAL
void
windows(class)
const char *class
PREINIT:
HE *entry;
PPCODE:
PERL_UNUSED_VAR(class);
ENSURE_REGISTRY();
hv_iterinit(_window_registry);
while ((entry = hv_iternext(_window_registry))) {
SV *val = hv_iterval(_window_registry, entry);
if (val && SvOK(val)) {
XPUSHs(sv_2mortal(SvREFCNT_inc(val)));
}
}
SV *
window_by_id(class, target_id)
const char *class
const char *target_id
PREINIT:
HE *entry;
CODE:
PERL_UNUSED_VAR(class);
RETVAL = &PL_sv_undef;
ENSURE_REGISTRY();
hv_iterinit(_window_registry);
while ((entry = hv_iternext(_window_registry))) {
SV *val = hv_iterval(_window_registry, entry);
if (val && SvROK(val)) {
HV *win_hv = (HV*)SvRV(val);
SV **id_svp = hv_fetch(win_hv, "id", 2, 0);
if (id_svp && SvOK(*id_svp)) {
const char *win_id = SvPV_nolen(*id_svp);
if (strcmp(win_id, target_id) == 0) {
RETVAL = SvREFCNT_inc(val);
break;
}
}
}
}
OUTPUT:
RETVAL
SV *
window_by_wid(class, wid)
const char *class
int wid
PREINIT:
SV *win;
CODE:
PERL_UNUSED_VAR(class);
win = GET_WINDOW(wid);
RETVAL = win ? SvREFCNT_inc(win) : &PL_sv_undef;
OUTPUT:
RETVAL
int
window_count(class)
const char *class
CODE:
PERL_UNUSED_VAR(class);
RETVAL = GET_WINDOW_COUNT();
OUTPUT:
RETVAL
SV *
parent(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "parent", 6, 0);
RETVAL = (svp && SvOK(*svp)) ? SvREFCNT_inc(*svp) : &PL_sv_undef;
OUTPUT:
RETVAL
void
children(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
AV *children_av;
int i, len;
PPCODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "_children", 9, 0);
if (svp && SvROK(*svp)) {
children_av = (AV*)SvRV(*svp);
len = av_len(children_av) + 1;
EXTEND(SP, len);
for (i = 0; i < len; i++) {
SV **child = av_fetch(children_av, i, 0);
if (child && SvOK(*child)) {
PUSHs(sv_2mortal(SvREFCNT_inc(*child)));
}
}
}
SV *
_add_child(self, child)
SV *self
SV *child
PREINIT:
HV *hv;
SV **svp;
AV *children_av;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
croak("Not a Chandra::Window object");
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "_children", 9, 0);
if (!svp || !SvROK(*svp)) {
children_av = newAV();
hv_store(hv, "_children", 9, newRV_noinc((SV*)children_av), 0);
} else {
children_av = (AV*)SvRV(*svp);
}
av_push(children_av, SvREFCNT_inc(child));
RETVAL = SvREFCNT_inc(self);
OUTPUT:
RETVAL
void
DESTROY(self)
SV *self
PREINIT:
HV *hv;
SV **svp;
int wid;
CODE:
if (!SvROK(self) || SvTYPE(SvRV(self)) != SVt_PVHV)
return;
hv = (HV*)SvRV(self);
svp = hv_fetch(hv, "wid", 3, 0);
wid = (svp && SvIOK(*svp)) ? SvIV(*svp) : -1;
if (wid >= 0 && GET_WINDOW(wid)) {
/* End modal if active */
svp = hv_fetch(hv, "modal", 5, 0);
( run in 0.805 second using v1.01-cache-2.11-cpan-71847e10f99 )