--- rxvt-unicode/src/rxvtperl.xs 2012/06/03 15:54:05 1.156 +++ rxvt-unicode/src/rxvtperl.xs 2012/06/05 15:18:24 1.169 @@ -53,7 +53,8 @@ typedef char * octet_string; typedef char * utf8_string; -typedef SV * urxvt_color; + +typedef int render_repeat_mode; typedef GdkPixbuf * urxvt__pixbuf; typedef rxvt_img * urxvt__img; @@ -803,6 +804,17 @@ const_iv (XIMVisibleToForward), const_iv (XIMVisibleToBackword), const_iv (XIMVisibleToCenter), +#if XRENDER + const_iv (PictStandardARGB32), + const_iv (PictStandardRGB24), + const_iv (PictStandardA8), + const_iv (PictStandardA4), + const_iv (PictStandardA1), + const_iv (RepeatNone), + const_iv (RepeatNormal), + const_iv (RepeatPad), + const_iv (RepeatReflect), +#endif # if 0 const_iv (XIMForwardChar), const_iv (XIMBackwardChar), @@ -837,6 +849,22 @@ void _exit (int status) +void +catch_fatal (SV *block) + PROTOTYPE: & + CODE: + try + { + PUSHMARK (SP); + PUTBACK; + call_sv (block, G_VOID | G_DISCARD); + SPAGAIN; + } + catch (const rxvt_failure_exception &e) + { + croak ("rxvt_fatal exception caught, trying to continue."); + } + NV NOW () CODE: @@ -970,7 +998,19 @@ void rxvt_term::set_should_invoke (int htype, int inc) CODE: - THIS->perl.should_invoke [htype] += inc; + uint8_t &count = THIS->perl.should_invoke [htype]; + uint8_t prev = count; + count += inc; + if (!prev != !count) + { + // hook status changed, react + switch (htype) + { + case HOOK_POSITION_CHANGE: + if (count) + THIS->get_window_origin (THIS->parent_x, THIS->parent_y); + } + } int rxvt_term::grab_button (int button, U32 modifiers, Window window = THIS->vt) @@ -1237,10 +1277,17 @@ OUTPUT: RETVAL -Window -rxvt_term::vt () +int +rxvt_term::parent_x () + CODE: + RETVAL = THIS->parent_x; + OUTPUT: + RETVAL + +int +rxvt_term::parent_y () CODE: - RETVAL = THIS->vt; + RETVAL = THIS->parent_y; OUTPUT: RETVAL @@ -1726,6 +1773,9 @@ rxvt_term::scr_bell () void +rxvt_term::scr_recolour (bool refresh = true); + +void rxvt_term::scr_change_screen (int screen) void @@ -1848,7 +1898,7 @@ } Atom -XInternAtom (rxvt_term *term, char *atom_name, int only_if_exists = FALSE) +XInternAtom (rxvt_term *term, octet_string atom_name, int only_if_exists = FALSE) C_ARGS: term->dpy, atom_name, only_if_exists char * @@ -1859,7 +1909,7 @@ void XDeleteProperty (rxvt_term *term, Window window, Atom property) - C_ARGS: term->dpy, window, property + C_ARGS: term->dpy, window, property Window rxvt_term::DefaultRootWindow () @@ -1921,6 +1971,85 @@ } ############################################################################# +# fancy bg bloatstuff (TODO: should be moved up somewhere) + +# TODO: ugly +void +rxvt_term::get_geometry () + 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))); + +#if HAVE_IMG + +rxvt_img * +rxvt_term::new_img (SV *format, int width, int height) + CODE: + XRenderPictFormat *f = SvOK (format) + ? XRenderFindStandardFormat (THIS->dpy, SvIV (format)) + : XRenderFindVisualFormat (THIS->dpy, THIS->visual); + RETVAL = new rxvt_img (THIS, f, width, height); + OUTPUT: + RETVAL + +#if ENABLE_TRANSPARENCY + +#if 0 + +rxvt_img * +rxvt_term::new_img_from_root () + CODE: + RETVAL = rxvt_img::new_from_root (THIS); + OUTPUT: + RETVAL + +#endif + +#endif + +#if HAVE_PIXBUF + +rxvt_img * +rxvt_term::new_img_from_file (octet_string filename) + CODE: + try + { + RETVAL = rxvt_img::new_from_file (THIS, filename); + } + catch (const class rxvt_failure_exception &e) + { + croak ("new_img_from_file failed"); + } + OUTPUT: + RETVAL + +#endif + +#if HAVE_BG_PIXMAP + +void +rxvt_term::set_background (rxvt_img *img) + CODE: + THIS->bg_destroy (); + THIS->bg_pixmap = None; + THIS->bg_flags &= ~rxvt_term::BG_NEEDS_REFRESH; + + if (img) // TODO: cannot be false + { + img->unshare (); + THIS->bg_pixmap = img->steal (); + THIS->bg_flags |= rxvt_term::BG_NEEDS_REFRESH; + THIS->bg_valid_since = ev::now (); // TODO: extra bloat + } + +#endif + +#endif + +############################################################################# # urxvt::overlay ############################################################################# @@ -1958,40 +2087,82 @@ #if HAVE_IMG -# rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height); -# rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height, Pixmap pixmap); +# rxvt_img *new (rxvt_screen *screen, XRenderPictFormat *format, int width, int height) +# rxvt_img *rxvt_img (rxvt_screen *screen, XRenderPictFormat *format, int width, int height, Pixmap pixmap); -void fill (urxvt::img self, SV *c) - CODE: - rxvt_color rc; - parse_color (self->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.) +int +rxvt_img::w () CODE: - self->brightness (r, g, b, a); + RETVAL = THIS->w; + OUTPUT: + RETVAL -void contrast (urxvt::img self, double r, double g, double b, double a = 1.) +int +rxvt_img::h () CODE: - self->contrast (r, g, b, a); + RETVAL = THIS->h; + OUTPUT: + RETVAL -urxvt::img copy (urxvt::img self) +bool +rxvt_img::shared () CODE: - RETVAL = self->copy (); + RETVAL = THIS->shared; OUTPUT: RETVAL -urxvt::img scale (urxvt::img self, int new_width, int new_height) +Pixmap +rxvt_img::pm () CODE: - RETVAL = self->scale (new_width, new_height); + RETVAL = THIS->pm; OUTPUT: RETVAL -# rxvt_img *transform (urxvt::img self, int new_width, int new_height, double matrix[16]); +void +rxvt_img::fill (SV *c) + INIT: + rxvt_color rc; + parse_color (THIS->s, rc, c); + C_ARGS: rc + +void +rxvt_img::DESTROY () + CODE: + delete THIS; + +rxvt_img * +rxvt_img::blur (int rh, int rv) + +void +rxvt_img::brightness (NV r, NV g, NV b, NV a = 1.) + +void +rxvt_img::contrast (NV r, NV g, NV b, NV a = 1.) + +void +rxvt_img::unshare () + +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 * +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) + INIT: + double matrix[9] = { + p11, p12, p13, + p21, p22, p23, + p31, p32, p33 + }; + C_ARGS: new_width, new_height, matrix, repeat + +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) #endif