From baaff66e190ab765a7013c0f75567464c5765f61 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 14 Dec 2006 15:19:30 +0000 Subject: [PATCH] *** empty log message *** --- Changes | 1 + MANIFEST | 2 + src/Makefile.in | 4 +- src/iom_perl.h | 124 +++++++++++++++++++ src/iom_perl.xs | 185 ++++++++++++++++++++++++++++ src/rxvtperl.xs | 313 +----------------------------------------------- 6 files changed, 319 insertions(+), 310 deletions(-) create mode 100644 src/iom_perl.h create mode 100644 src/iom_perl.xs diff --git a/Changes b/Changes index 44818d78..2f83c30d 100644 --- a/Changes +++ b/Changes @@ -25,6 +25,7 @@ TODO: fix rounding of colors when !xft (#aaaaaa => #a9a900) (do not use correct, - fix make depend in src/, reported by exg. - fixed typo in urxvt::GET_CUSTOM, causing the result to be wrong. (patch by Sergey Vlasov). + - unbundled iom perl interface somewhat. 8.1 Thu Dec 7 22:27:25 CET 2006 - ケリスマスプレゼント - zomg!!1, it's too early!!! diff --git a/MANIFEST b/MANIFEST index 34a5f131..bf5d2670 100644 --- a/MANIFEST +++ b/MANIFEST @@ -155,6 +155,8 @@ src/table/jis0213_2.h src/urxvt.pm src/typemap +src/iom_perl.h +src/iom_perl.xs src/rxvtperl.h src/rxvtperl.xs diff --git a/src/Makefile.in b/src/Makefile.in index 67821a77..eee28c14 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -136,9 +136,9 @@ install: allbin alldoc install-perl perlxsi.c: Makefile $(PERL) -MExtUtils::Embed -e xsinit -- -std urxvt -rxvtperl.C: rxvtperl.xs typemap +rxvtperl.C: rxvtperl.xs iom_perl.h iom_perl.xs typemap #$(PERL) @PERLPRIVLIBEXP@/ExtUtils/xsubpp -csuffix .C -C++ -typemap @PERLPRIVLIBEXP@/ExtUtils/typemap -typemap typemap -prototypes rxvtperl.xs >$@ - $(PERL) @PERLPRIVLIBEXP@/ExtUtils/xsubpp -C++ -typemap @PERLPRIVLIBEXP@/ExtUtils/typemap -typemap typemap -prototypes $(srcdir)/rxvtperl.xs >$@ + PERL="$(PERL)" $(PERL) @PERLPRIVLIBEXP@/ExtUtils/xsubpp -C++ -typemap @PERLPRIVLIBEXP@/ExtUtils/typemap -typemap typemap -prototypes $(srcdir)/rxvtperl.xs >$@ rxvtperl.o: rxvtperl.C perlxsi.c $(COMPILE) @PERLFLAGS@ -DLIBDIR="\"$(libdir)/urxvt\"" -c $< diff --git a/src/iom_perl.h b/src/iom_perl.h new file mode 100644 index 00000000..a6c82784 --- /dev/null +++ b/src/iom_perl.h @@ -0,0 +1,124 @@ +///////////////////////////////////////////////////////////////////////////// + +#define SvWATCHER(sv) (perl_watcher *)SvPTR (sv, IOM_CLASS "::watcher") + +struct perl_watcher +{ + SV *cbsv; + HV *self; + + perl_watcher () + : cbsv (0) + { + } + + ~perl_watcher () + { + SvREFCNT_dec (cbsv); + } + + void cb (SV *cb) + { + SvREFCNT_dec (cbsv); + cbsv = newSVsv (cb); + } + + void invoke (const char *type, SV *self, int arg = -1); +}; + +void +perl_watcher::invoke (const char *type, SV *self, int arg) +{ + dSP; + + ENTER; + SAVETMPS; + + PUSHMARK (SP); + + XPUSHs (sv_2mortal (self)); + + if (arg >= 0) + XPUSHs (sv_2mortal (newSViv (arg))); + + PUTBACK; + call_sv (cbsv, G_VOID | G_EVAL | G_DISCARD); + SPAGAIN; + + PUTBACK; + FREETMPS; + LEAVE; + + if (SvTRUE (ERRSV)) + rxvt_warn ("%s callback evaluation error: %s", type, SvPV_nolen (ERRSV)); +} + +#define newSVtimer(timer) new_ref ((timer)->self, IOM_CLASS "::timer") +#define SvTIMER(sv) (timer *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::timer") + +struct timer : perl_watcher, time_watcher +{ + tstamp interval; + + timer () + : time_watcher (this, &timer::execute) + { + } + + void execute (time_watcher &w) + { + if (interval) + start (at + interval); + + invoke (IOM_CLASS "::timer", newSVtimer (this)); + } +}; + +#define newSViow(iow) new_ref ((iow)->self, IOM_CLASS "::iow") +#define SvIOW(sv) (iow *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::iow") + +struct iow : perl_watcher, io_watcher +{ + iow () + : io_watcher (this, &iow::execute) + { + } + + void execute (io_watcher &w, short revents) + { + invoke (IOM_CLASS "::iow", newSViow (this), revents); + } +}; + +#define newSViw(iw) new_ref ((iw)->self, IOM_CLASS "::iw") +#define SvIW(sv) (iw *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::iw") + +struct iw : perl_watcher, idle_watcher +{ + iw () + : idle_watcher (this, &iw::execute) + { + } + + void execute (idle_watcher &w) + { + invoke (IOM_CLASS "::iw", newSViw (this)); + } +}; + +#define newSVpw(pw) new_ref ((pw)->self, IOM_CLASS "::pw") +#define SvPW(sv) (pw *)(perl_watcher *)SvPTR ((sv), IOM_CLASS "::pw") + +struct pw : perl_watcher, child_watcher +{ + pw () + : child_watcher (this, &pw::execute) + { + } + + void execute (child_watcher &w, int status) + { + invoke (IOM_CLASS "::pw", newSVpw (this), status); + } +}; + diff --git a/src/iom_perl.xs b/src/iom_perl.xs new file mode 100644 index 00000000..7522007f --- /dev/null +++ b/src/iom_perl.xs @@ -0,0 +1,185 @@ +############################################################################# +# IOM_CLASS::watcher +############################################################################# + +MODULE = IOM_MODULE PACKAGE = IOM_CLASS::watcher + +CHAINED +perl_watcher::cb (SV *cb) + CODE: + THIS->cb (cb); + OUTPUT: + RETVAL + +############################################################################# +# IOM_CLASS::timer +############################################################################# + +MODULE = IOM_MODULE PACKAGE = IOM_CLASS::timer + +SV * +timer::new () + CODE: + timer *w = new timer; + w->start (NOW); + RETVAL = newSVptr ((void *)(perl_watcher *)w, "IOM_CLASS::timer"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +NV +timer::at () + CODE: + RETVAL = THIS->at; + OUTPUT: + RETVAL + +CHAINED +timer::interval (NV interval) + CODE: + THIS->interval = interval; + OUTPUT: + RETVAL + +CHAINED +timer::set (NV tstamp) + CODE: + THIS->set (tstamp); + OUTPUT: + RETVAL + +CHAINED +timer::start (NV tstamp = THIS->at) + CODE: + THIS->start (tstamp); + OUTPUT: + RETVAL + +CHAINED +timer::after (NV delay) + CODE: + THIS->start (NOW + delay); + OUTPUT: + RETVAL + +CHAINED +timer::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +timer::DESTROY () + +############################################################################# +# IOM_CLASS::iow +############################################################################# + +MODULE = IOM_MODULE PACKAGE = IOM_CLASS::iow + +SV * +iow::new () + CODE: + iow *w = new iow; + RETVAL = newSVptr ((void *)(perl_watcher *)w, "IOM_CLASS::iow"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +CHAINED +iow::fd (int fd) + CODE: + THIS->fd = fd; + OUTPUT: + RETVAL + +CHAINED +iow::events (short events) + CODE: + THIS->events = events; + OUTPUT: + RETVAL + +CHAINED +iow::start () + CODE: + THIS->start (); + OUTPUT: + RETVAL + +CHAINED +iow::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +iow::DESTROY () + +############################################################################# +# IOM_CLASS::iw +############################################################################# + +MODULE = IOM_MODULE PACKAGE = IOM_CLASS::iw + +SV * +iw::new () + CODE: + iw *w = new iw; + RETVAL = newSVptr ((void *)(perl_watcher *)w, "IOM_CLASS::iw"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +CHAINED +iw::start () + CODE: + THIS->start (); + OUTPUT: + RETVAL + +CHAINED +iw::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +iw::DESTROY () + +############################################################################# +# IOM_CLASS::pw +############################################################################# + +MODULE = IOM_MODULE PACKAGE = IOM_CLASS::pw + +SV * +pw::new () + CODE: + pw *w = new pw; + RETVAL = newSVptr ((void *)(perl_watcher *)w, "IOM_CLASS::pw"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +CHAINED +pw::start (int pid) + CODE: + THIS->start (pid); + OUTPUT: + RETVAL + +CHAINED +pw::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +pw::DESTROY () + + diff --git a/src/rxvtperl.xs b/src/rxvtperl.xs index 8d651b43..0595ed54 100644 --- a/src/rxvtperl.xs +++ b/src/rxvtperl.xs @@ -119,130 +119,6 @@ SvPTR (SV *sv, const char *klass) ///////////////////////////////////////////////////////////////////////////// -#define SvWATCHER(sv) (perl_watcher *)SvPTR (sv, "urxvt::watcher") - -struct perl_watcher -{ - SV *cbsv; - HV *self; - - perl_watcher () - : cbsv (0) - { - } - - ~perl_watcher () - { - SvREFCNT_dec (cbsv); - } - - void cb (SV *cb) - { - SvREFCNT_dec (cbsv); - cbsv = newSVsv (cb); - } - - void invoke (const char *type, SV *self, int arg = -1); -}; - -void -perl_watcher::invoke (const char *type, SV *self, int arg) -{ - dSP; - - ENTER; - SAVETMPS; - - PUSHMARK (SP); - - XPUSHs (sv_2mortal (self)); - - if (arg >= 0) - XPUSHs (sv_2mortal (newSViv (arg))); - - PUTBACK; - call_sv (cbsv, G_VOID | G_EVAL | G_DISCARD); - SPAGAIN; - - PUTBACK; - FREETMPS; - LEAVE; - - if (SvTRUE (ERRSV)) - rxvt_warn ("%s callback evaluation error: %s", type, SvPV_nolen (ERRSV)); -} - -#define newSVtimer(timer) new_ref ((timer)->self, "urxvt::timer") -#define SvTIMER(sv) (timer *)(perl_watcher *)SvPTR ((sv), "urxvt::timer") - -struct timer : perl_watcher, time_watcher -{ - tstamp interval; - - timer () - : time_watcher (this, &timer::execute) - { - } - - void execute (time_watcher &w) - { - if (interval) - start (at + interval); - - invoke ("urxvt::timer", newSVtimer (this)); - } -}; - -#define newSViow(iow) new_ref ((iow)->self, "urxvt::iow") -#define SvIOW(sv) (iow *)(perl_watcher *)SvPTR ((sv), "urxvt::iow") - -struct iow : perl_watcher, io_watcher -{ - iow () - : io_watcher (this, &iow::execute) - { - } - - void execute (io_watcher &w, short revents) - { - invoke ("urxvt::iow", newSViow (this), revents); - } -}; - -#define newSViw(iw) new_ref ((iw)->self, "urxvt::iw") -#define SvIW(sv) (iw *)(perl_watcher *)SvPTR ((sv), "urxvt::iw") - -struct iw : perl_watcher, idle_watcher -{ - iw () - : idle_watcher (this, &iw::execute) - { - } - - void execute (idle_watcher &w) - { - invoke ("urxvt::iw", newSViw (this)); - } -}; - -#define newSVpw(pw) new_ref ((pw)->self, "urxvt::pw") -#define SvPW(sv) (pw *)(perl_watcher *)SvPTR ((sv), "urxvt::pw") - -struct pw : perl_watcher, child_watcher -{ - pw () - : child_watcher (this, &pw::execute) - { - } - - void execute (child_watcher &w, int status) - { - invoke ("urxvt::pw", newSVpw (this), status); - } -}; - -///////////////////////////////////////////////////////////////////////////// - #define SvOVERLAY(sv) (overlay *)SvPTR (sv, "urxvt::overlay") class overlay { @@ -427,6 +303,10 @@ void overlay::set (int x, int y, SV *text, SV *rend) THIS->want_refresh = 1; } +///////////////////////////////////////////////////////////////////////////// + +#define IOM_CLASS "urxvt" +#include ///////////////////////////////////////////////////////////////////////////// @@ -1948,188 +1828,5 @@ overlay::hide () void overlay::DESTROY () -############################################################################# -# urxvt::watcher -############################################################################# - -MODULE = urxvt PACKAGE = urxvt::watcher - -CHAINED -perl_watcher::cb (SV *cb) - CODE: - THIS->cb (cb); - OUTPUT: - RETVAL - -############################################################################# -# urxvt::timer -############################################################################# - -MODULE = urxvt PACKAGE = urxvt::timer - -SV * -timer::new () - CODE: - timer *w = new timer; - w->start (NOW); - RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::timer"); - w->self = (HV *)SvRV (RETVAL); - OUTPUT: - RETVAL - -NV -timer::at () - CODE: - RETVAL = THIS->at; - OUTPUT: - RETVAL - -CHAINED -timer::interval (NV interval) - CODE: - THIS->interval = interval; - OUTPUT: - RETVAL - -CHAINED -timer::set (NV tstamp) - CODE: - THIS->set (tstamp); - OUTPUT: - RETVAL - -CHAINED -timer::start (NV tstamp = THIS->at) - CODE: - THIS->start (tstamp); - OUTPUT: - RETVAL - -CHAINED -timer::after (NV delay) - CODE: - THIS->start (NOW + delay); - OUTPUT: - RETVAL - -CHAINED -timer::stop () - CODE: - THIS->stop (); - OUTPUT: - RETVAL - -void -timer::DESTROY () - -############################################################################# -# urxvt::iow -############################################################################# - -MODULE = urxvt PACKAGE = urxvt::iow - -SV * -iow::new () - CODE: - iow *w = new iow; - RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::iow"); - w->self = (HV *)SvRV (RETVAL); - OUTPUT: - RETVAL - -CHAINED -iow::fd (int fd) - CODE: - THIS->fd = fd; - OUTPUT: - RETVAL - -CHAINED -iow::events (short events) - CODE: - THIS->events = events; - OUTPUT: - RETVAL - -CHAINED -iow::start () - CODE: - THIS->start (); - OUTPUT: - RETVAL - -CHAINED -iow::stop () - CODE: - THIS->stop (); - OUTPUT: - RETVAL - -void -iow::DESTROY () - -############################################################################# -# urxvt::iw -############################################################################# - -MODULE = urxvt PACKAGE = urxvt::iw - -SV * -iw::new () - CODE: - iw *w = new iw; - RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::iw"); - w->self = (HV *)SvRV (RETVAL); - OUTPUT: - RETVAL - -CHAINED -iw::start () - CODE: - THIS->start (); - OUTPUT: - RETVAL - -CHAINED -iw::stop () - CODE: - THIS->stop (); - OUTPUT: - RETVAL - -void -iw::DESTROY () - -############################################################################# -# urxvt::pw -############################################################################# - -MODULE = urxvt PACKAGE = urxvt::pw - -SV * -pw::new () - CODE: - pw *w = new pw; - RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::pw"); - w->self = (HV *)SvRV (RETVAL); - OUTPUT: - RETVAL - -CHAINED -pw::start (int pid) - CODE: - THIS->start (pid); - OUTPUT: - RETVAL - -CHAINED -pw::stop () - CODE: - THIS->stop (); - OUTPUT: - RETVAL - -void -pw::DESTROY () - +INCLUDE: $PERL