- 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!!!
src/urxvt.pm
src/typemap
+src/iom_perl.h
+src/iom_perl.xs
src/rxvtperl.h
src/rxvtperl.xs
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 $<
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+
+#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);
+ }
+};
+
--- /dev/null
+#############################################################################
+# 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 ()
+
+
/////////////////////////////////////////////////////////////////////////////
-#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 {
THIS->want_refresh = 1;
}
+/////////////////////////////////////////////////////////////////////////////
+
+#define IOM_CLASS "urxvt"
+#include <iom_perl.h>
/////////////////////////////////////////////////////////////////////////////
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 <iom_perl.xs -pe s/IOM_MODULE/urxvt/g,s/IOM_CLASS/urxvt/g |