--- rxvt-unicode/src/rxvtperl.xs 2012/04/11 10:20:00 1.153 +++ rxvt-unicode/src/rxvtperl.xs 2012/06/09 10:21:19 1.187 @@ -51,6 +51,25 @@ ///////////////////////////////////////////////////////////////////////////// +typedef char * octet_string; +typedef char * utf8_string; + +typedef int render_repeat_mode; + +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) { @@ -365,7 +384,7 @@ rxvt_pop_locale (); } - if (perl) + if (perl && !term->perl.self) { // runs outside of perls ENV term->perl.self = (void *)newSVptr ((void *)term, "urxvt::term"); @@ -374,6 +393,55 @@ } } +void +rxvt_perl_interp::usage (rxvt_term *term, int type) +{ + localise_env set_environ (perl_environ); + + ENTER; + 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); + + FREETMPS; + LEAVE; +} + +uint8_t +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); + + ENTER; + SAVETMPS; + + dSP; + PUSHMARK (SP); + EXTEND (SP, 6); + PUSHs (sv_2mortal (newSVterm (term))); + PUSHs (sv_2mortal (newSVpv (name, 0))); + PUSHs (arg ? &PL_sv_yes : &PL_sv_no); + PUSHs (longopt ? &PL_sv_yes : &PL_sv_no); + PUSHs (flag ? &PL_sv_yes : &PL_sv_no); + PUSHs (value ? sv_2mortal (newSVpv (value, 0)) : &PL_sv_undef); + PUTBACK; + call_pv ("urxvt::parse_resource", G_SCALAR); + SPAGAIN; + + uint8_t ret = POPi; + + FREETMPS; + LEAVE; + + return ret; +} + static void ungrab (rxvt_term *THIS) { @@ -414,8 +482,7 @@ bool event_consumed; - if (htype == HOOK_INIT || htype == HOOK_DESTROY // must be called always - || term->perl.should_invoke [htype]) + if (term->perl.should_invoke [htype]) { dSP; va_list ap; @@ -635,6 +702,7 @@ dSP; XPUSHs (sv_2mortal (newSVpvn (data, len))); + PUTBACK; call_sv ((SV *)sel->cb_sv, G_VOID | G_DISCARD | G_EVAL); if (SvTRUE (ERRSV)) @@ -785,6 +853,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), @@ -807,6 +886,11 @@ } void +log (const char *msg) + CODE: + rxvt_log ("%s", msg); + +void warn (const char *msg) CODE: rxvt_warn ("%s", msg); @@ -819,6 +903,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: @@ -952,7 +1052,24 @@ 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); + } + } + +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) @@ -1219,10 +1336,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 @@ -1556,7 +1680,6 @@ THIS->want_refresh = 1; THIS->refresh_check (); break; - #ifdef CURSOR_BLINK case Opt_cursorBlink: THIS->cursor_blink_reset (); @@ -1709,6 +1832,9 @@ rxvt_term::scr_bell () void +rxvt_term::scr_recolour (bool refresh = true); + +void rxvt_term::scr_change_screen (int screen) void @@ -1831,7 +1957,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 * @@ -1842,7 +1968,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 () @@ -1904,6 +2030,103 @@ } ############################################################################# +# fancy bg bloatstuff (TODO: should be moved up somewhere) + +# TODO: ugly +void +rxvt_term::background_geometry (bool border = false) + PPCODE: + EXTEND (SP, 4); + 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 + +#if 0 + +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 + +#endif + +#if ENABLE_TRANSPARENCY + +rxvt_img * +rxvt_term::new_img_from_root () + CODE: + RETVAL = rxvt_img::new_from_root (THIS); + OUTPUT: + RETVAL + +#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, bool border = false) + CODE: + THIS->bg_destroy (); + THIS->bg_pixmap = None; + 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 = 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_pixmap = img->steal (); + THIS->bg_flags |= rxvt_term::BG_NEEDS_REFRESH | rxvt_term::BG_INHIBIT_RENDER; + + if (!border) + THIS->bg_flags |= rxvt_term::BG_IS_TRANSPARENT; + + delete img; + } + +#endif + +#endif + +############################################################################# # urxvt::overlay ############################################################################# @@ -1923,3 +2146,107 @@ INCLUDE: $PERL w; + OUTPUT: + RETVAL + +int +rxvt_img::h () + CODE: + RETVAL = THIS->h; + OUTPUT: + RETVAL + +Pixmap +rxvt_img::pm () + CODE: + RETVAL = THIS->pm; + OUTPUT: + RETVAL + +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; + +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::move (int dx, int dy) + +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.) + +rxvt_img * +rxvt_img::clone () + +rxvt_img * +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) + INIT: + double matrix[9] = { + p11, p12, p13, + p21, p22, p23, + p31, p32, p33 + }; + C_ARGS: new_width, new_height, matrix + +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) + +#endif +