--- rxvt-unicode/src/rxvtperl.xs 2012/06/05 22:46:50 1.172 +++ rxvt-unicode/src/rxvtperl.xs 2012/06/12 10:45:53 1.192 @@ -56,7 +56,9 @@ typedef int render_repeat_mode; +#if HAVE_PIXBUF typedef GdkPixbuf * urxvt__pixbuf; +#endif typedef rxvt_img * urxvt__img; ///////////////////////////////////////////////////////////////////////////// @@ -64,7 +66,7 @@ static void parse_color (rxvt_screen *s, rxvt_color &c, SV *sv) { - //TODO: support component stuff + //TODO: support component stuff, 0..1 c.set (s, SvPVbyte_nolen (sv)); } @@ -343,7 +345,7 @@ } void -rxvt_perl_interp::init (rxvt_term *term) +rxvt_perl_interp::init () { if (!perl) { @@ -383,8 +385,14 @@ rxvt_pop_locale (); } +} - if (perl) +void +rxvt_perl_interp::init (rxvt_term *term) +{ + init (); + + if (perl && !term->perl.self) { // runs outside of perls ENV term->perl.self = (void *)newSVptr ((void *)term, "urxvt::term"); @@ -394,6 +402,12 @@ } void +rxvt_perl_interp::eval (const char *str) +{ + eval_pv (str, 1); +} + +void rxvt_perl_interp::usage (rxvt_term *term, int type) { localise_env set_environ (perl_environ); @@ -402,18 +416,19 @@ SAVETMPS; dSP; + PUSHMARK (SP); EXTEND (SP, 2); PUSHs (sv_2mortal (newSVterm (term))); PUSHs (sv_2mortal (newSViv (type))); PUTBACK; - call_pv ("urxvt::usage", G_VOID | G_DISCARD | G_EVAL); + call_pv ("urxvt::usage", G_VOID | G_DISCARD); FREETMPS; LEAVE; } uint8_t -rxvt_perl_interp::resource (rxvt_term *term, const char *name, bool arg, bool longopt, bool flag, const char *value) +rxvt_perl_interp::parse_resource (rxvt_term *term, const char *name, bool arg, bool longopt, bool flag, const char *value) { localise_env set_environ (perl_environ); @@ -421,6 +436,7 @@ SAVETMPS; dSP; + PUSHMARK (SP); EXTEND (SP, 6); PUSHs (sv_2mortal (newSVterm (term))); PUSHs (sv_2mortal (newSVpv (name, 0))); @@ -429,7 +445,8 @@ PUSHs (flag ? &PL_sv_yes : &PL_sv_no); PUSHs (value ? sv_2mortal (newSVpv (value, 0)) : &PL_sv_undef); PUTBACK; - call_pv ("urxvt::resource", G_SCALAR | G_EVAL); + call_pv ("urxvt::parse_resource", G_SCALAR); + SPAGAIN; uint8_t ret = POPi; @@ -1063,6 +1080,11 @@ } } +void +rxvt_term::put_option_db (octet_string specifier, octet_string value) + CODE: + XrmPutStringResource (&THIS->option_db, specifier, value); + int rxvt_term::grab_button (int button, U32 modifiers, Window window = THIS->vt) CODE: @@ -2024,25 +2046,32 @@ ############################################################################# # fancy bg bloatstuff (TODO: should be moved up somewhere) -# TODO: ugly +bool +rxvt_term::has_render () + CODE: + RETVAL = THIS->display->flags & DISPLAY_HAS_RENDER; + OUTPUT: + RETVAL + void -rxvt_term::get_geometry () +rxvt_term::background_geometry (bool border = false) PPCODE: EXTEND (SP, 4); - PUSHs (sv_2mortal (newSViv (THIS->parent_x))); - PUSHs (sv_2mortal (newSViv (THIS->parent_y))); - PUSHs (sv_2mortal (newSViv (THIS->szHint.width))); - PUSHs (sv_2mortal (newSViv (THIS->szHint.height))); + PUSHs (sv_2mortal (newSViv (THIS->parent_x + (border ? THIS->window_vt_x : 0)))); + PUSHs (sv_2mortal (newSViv (THIS->parent_y + (border ? THIS->window_vt_y : 0)))); + PUSHs (sv_2mortal (newSViv (border ? THIS->vt_width : THIS->szHint.width ))); + PUSHs (sv_2mortal (newSViv (border ? THIS->vt_height : THIS->szHint.height))); #if HAVE_IMG rxvt_img * -rxvt_term::new_img (SV *format, int width, int height) +rxvt_term::new_img (SV *format, int width = 1, int height = 1) CODE: XRenderPictFormat *f = SvOK (format) ? XRenderFindStandardFormat (THIS->dpy, SvIV (format)) : XRenderFindVisualFormat (THIS->dpy, THIS->visual); - RETVAL = new rxvt_img (THIS, f, width, height); + RETVAL = new rxvt_img (THIS, f, 0, 0, width, height); + RETVAL->alloc (); OUTPUT: RETVAL @@ -2078,19 +2107,33 @@ #if HAVE_BG_PIXMAP void -rxvt_term::set_background (rxvt_img *img) +rxvt_term::set_background (rxvt_img *img, bool border = false) CODE: THIS->bg_destroy (); - THIS->bg_pixmap = None; - THIS->bg_flags &= ~rxvt_term::BG_NEEDS_REFRESH; + THIS->bg_flags &= ~(rxvt_term::BG_NEEDS_REFRESH | rxvt_term::BG_INHIBIT_RENDER | rxvt_term::BG_IS_TRANSPARENT); if (img) // TODO: cannot be false { - img->unshare (); - //TODO: convetr to visual, possibly precompose with colour - THIS->bg_pixmap = img->steal (); - THIS->bg_flags |= rxvt_term::BG_NEEDS_REFRESH; - THIS->bg_valid_since = ev::now (); // TODO: extra bloat + img = img->clone (); // own the img + + if (img->repeat != RepeatNormal) // X11 only supports RepeatNormal as bg pixmap + img->sub_rect (0, 0, + border ? THIS->vt_width : THIS->szHint.width, + border ? THIS->vt_height : THIS->szHint.height) + ->replace (img); + + // just in case, should usually be a nop + img->reify () + ->replace (img); + + img->convert_format (XRenderFindVisualFormat (THIS->dpy, THIS->visual), THIS->pix_colors [Color_bg]) + ->replace (img); + + THIS->bg_img = img; + THIS->bg_flags |= rxvt_term::BG_NEEDS_REFRESH | rxvt_term::BG_INHIBIT_RENDER; + + if (!border) + THIS->bg_flags |= rxvt_term::BG_IS_TRANSPARENT; } #endif @@ -2152,13 +2195,6 @@ OUTPUT: RETVAL -bool -rxvt_img::shared () - CODE: - RETVAL = THIS->shared; - OUTPUT: - RETVAL - Pixmap rxvt_img::pm () CODE: @@ -2178,39 +2214,53 @@ CODE: delete THIS; -rxvt_img * -rxvt_img::blur (int rh, int rv) +void +rxvt_img::unshare () + +int +rxvt_img::repeat_mode (render_repeat_mode repeat = 0) + CODE: + if (items >= 2) + THIS->repeat_mode (repeat); + if (GIMME_V != G_VOID) + XPUSHs (sv_2mortal (newSViv (THIS->repeat))); void -rxvt_img::brightness (NV r, NV g, NV b, NV a = 1.) +rxvt_img::move (int dx, int dy) void -rxvt_img::contrast (NV r, NV g, NV b, NV a = 1.) +rxvt_img::brightness (NV r, NV g, NV b, NV a = 1.) void -rxvt_img::unshare () +rxvt_img::contrast (NV r, NV g, NV b, NV a = 1.) rxvt_img * rxvt_img::clone () rxvt_img * -rxvt_img::sub_rect (int x, int y, int width, int height, render_repeat_mode repeat = RepeatNormal) +rxvt_img::reify () + +rxvt_img * +rxvt_img::sub_rect (int x, int y, int width, int height) + +rxvt_img * +rxvt_img::blur (int rh, int rv) rxvt_img * -rxvt_img::transform (int new_width, int new_height, NV p11, NV p12, NV p13, NV p21, NV p22, NV p23, NV p31, NV p32, NV p33, render_repeat_mode repeat = RepeatNormal) +rxvt_img::transform (NV p11, NV p12, NV p13, NV p21, NV p22, NV p23, NV p31, NV p32, NV p33, int new_width = 0, int new_height = 0) INIT: double matrix[9] = { p11, p12, p13, p21, p22, p23, p31, p32, p33 }; - C_ARGS: new_width, new_height, matrix, repeat + C_ARGS: matrix, new_width, new_height rxvt_img * rxvt_img::scale (int new_width, int new_height) rxvt_img * -rxvt_img::rotate (int new_width, int new_height, int x, int y, NV phi, render_repeat_mode repeat = RepeatNormal) +rxvt_img::rotate (int x, int y, NV phi, int new_width = 0, int new_height = 0) #endif