--- rxvt-unicode/src/rxvtperl.xs 2011/04/07 12:19:41 1.140 +++ rxvt-unicode/src/rxvtperl.xs 2012/06/03 15:54:15 1.157 @@ -25,11 +25,12 @@ #include #include #undef line_t +#undef bool // perl defines it's own bool type, except with g++... what a trap #include "../config.h" -#include -#include +#include +#include #include "unistd.h" @@ -50,6 +51,23 @@ ///////////////////////////////////////////////////////////////////////////// +typedef char * octet_string; +typedef char * utf8_string; + +typedef GdkPixbuf * urxvt__pixbuf; +typedef rxvt_img * urxvt__img; + +///////////////////////////////////////////////////////////////////////////// + +static void +parse_color (rxvt_screen *s, rxvt_color &c, SV *sv) +{ + //TODO: support component stuff + c.set (s, SvPVbyte_nolen (sv)); +} + +///////////////////////////////////////////////////////////////////////////// + static wchar_t * sv2wcs (SV *sv) { @@ -343,7 +361,7 @@ "" "use urxvt;" }; - int argc = ARRAY_LENGTH(args); + int argc = ecb_array_length (args); char **argv = args; PERL_SYS_INIT3 (&argc, &argv, &environ); @@ -369,6 +387,7 @@ // runs outside of perls ENV term->perl.self = (void *)newSVptr ((void *)term, "urxvt::term"); hv_store ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, newRV_noinc ((SV *)newAV ()), 0); + hv_store ((HV *)SvRV ((SV *)term->perl.self), "_selection", 10, newRV_noinc ((SV *)newAV ()), 0); } } @@ -399,6 +418,16 @@ for (int i = 0; i <= AvFILL (av); i++) ((overlay *)SvIV (*av_fetch (av, i, 0)))->swap (); } + else if (htype == HOOK_DESTROY) + { + AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_selection", 10, 0)); + + for (int i = AvFILL (av); i >= 0; i--) + { + rxvt_selection *req = (rxvt_selection *)SvIV (*av_fetch (av, i, 0)); + delete req; + } + } bool event_consumed; @@ -790,8 +819,8 @@ # endif }; - for (civ = const_iv + ARRAY_LENGTH(const_iv); civ-- > const_iv; ) - newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); + for (civ = const_iv + ecb_array_length (const_iv); civ > const_iv; civ--) + newCONSTSUB (stash, (char *)civ[-1].name, newSViv (civ[-1].iv)); } void @@ -878,6 +907,8 @@ CODE: rxvt_selection *req = new rxvt_selection (term->display, selnum, tm, win, prop, term); req->cb_sv = newSVsv (cb); + AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_selection", 10, 0)); + av_push (av, newSViv ((IV)req)); RETVAL = (IV)req; OUTPUT: RETVAL @@ -886,6 +917,18 @@ _delete_selection_request (IV req_) CODE: rxvt_selection *req = (rxvt_selection *)req_; + AV *av = (AV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)req->term->perl.self), "_selection", 10, 0)); + int i; + + for (i = AvFILL (av); i >= 0; i--) + if (SvIV (*av_fetch (av, i, 1)) == req_) + break; + + for (; i < AvFILL (av); i++) + av_store (av, i, SvREFCNT_inc (*av_fetch (av, i + 1, 0))); + + av_pop (av); + delete req; MODULE = urxvt PACKAGE = urxvt::term @@ -897,16 +940,13 @@ rxvt_term *term = new rxvt_term; stringvec *argv = new stringvec; - stringvec *envv = new stringvec; - for (int i = 0; i <= AvFILL (arg); i++) argv->push_back (strdup (SvPVbyte_nolen (*av_fetch (arg, i, 1)))); + stringvec *envv = new stringvec; for (int i = AvFILL (env) + 1; i--; ) envv->push_back (strdup (SvPVbyte_nolen (*av_fetch (env, i, 1)))); - envv->push_back (0); - try { term->init (argv, envv); @@ -956,11 +996,6 @@ CODE: XUngrabKey (THIS->dpy, keycode, modifiers, window); -void -rxvt_term::XUngrabKeyboard (Time eventtime) - CODE: - XUngrabKeyboard (THIS->dpy, eventtime); - bool rxvt_term::grab (Time eventtime, int sync = 0) CODE: @@ -1084,13 +1119,6 @@ OUTPUT: RETVAL -char * -rxvt_term::locale () - CODE: - RETVAL = THIS->locale; - OUTPUT: - RETVAL - #define TERM_OFFSET(sym) offsetof (TermWin_t, sym) #define TERM_OFFSET_width TERM_OFFSET(width) @@ -1243,6 +1271,9 @@ RETVAL void +rxvt_term::set_urgency (bool enable) + +void rxvt_term::focus_in () void @@ -1483,7 +1514,7 @@ # undef reserve }; - rs = rslist + ARRAY_LENGTH(rslist); + rs = rslist + ecb_array_length (rslist); if (*name) { @@ -1532,7 +1563,7 @@ { THIS->set_option (optval, set); - if (THIS->env_colorfgbg [0]) // avoid doing this before START + if (THIS->init_done) // avoid doing this before START switch (optval) { case Opt_skipBuiltinGlyphs: @@ -1542,6 +1573,11 @@ THIS->want_refresh = 1; THIS->refresh_check (); break; +#ifdef CURSOR_BLINK + case Opt_cursorBlink: + THIS->cursor_blink_reset (); + break; +#endif case Opt_cursorUnderline: THIS->want_refresh = 1; @@ -1567,6 +1603,13 @@ RETVAL void +rxvt_term::register_command (int keysym, unsigned int state, SV *str) + CODE: + wchar_t *wstr = sv2wcs (str); + THIS->keyboard->register_user_translation (keysym, state, wstr); + free (wstr); + +void rxvt_term::screen_cur (...) PROTOTYPE: $;$$ ALIAS: @@ -1896,3 +1939,58 @@ INCLUDE: $PERL s, rc, c); + self->fill (rc); + +void blur (urxvt::img self, int rh, int rv) + CODE: + self->blur (rh, rv); + +void brightness (urxvt::img self, double r, double g, double b, double a = 1.) + CODE: + self->brightness (r, g, b, a); + +void contrast (urxvt::img self, double r, double g, double b, double a = 1.) + CODE: + self->contrast (r, g, b, a); + +urxvt::img copy (urxvt::img self) + CODE: + RETVAL = self->copy (); + OUTPUT: + RETVAL + +urxvt::img scale (urxvt::img self, int new_width, int new_height) + CODE: + RETVAL = self->scale (new_width, new_height); + OUTPUT: + RETVAL + +# rxvt_img *transform (urxvt::img self, int new_width, int new_height, double matrix[16]); + +#endif +