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 )