--- rxvt-unicode/src/main.C 2007/08/17 22:02:14 1.245 +++ rxvt-unicode/src/main.C 2007/09/12 20:29:24 1.249 @@ -542,14 +542,10 @@ else bgPixmap.set_defaultGeometry (); - bgPixmap.set_file (rs[Rs_backgroundPixmap]); + if (bgPixmap.set_file (rs[Rs_backgroundPixmap])) + if (!bgPixmap.window_position_sensitive ()) + update_background (); } - /* do not want to render Pixmap yet if we are size/position dependant - - * wait for ConfigureNotify at least - * TODO: this does not work for some reason when transparency is disabled !!!! - */ - if (!bgPixmap.window_size_sensitive ()) - update_background (); #endif } #endif @@ -1150,10 +1146,9 @@ window_vt_x, window_vt_y, width, height); -#ifdef XPM_BACKGROUND - /* TODO: replace with update_pixmap() that should unify transparency and bg image handling ! */ +#ifdef HAVE_BG_PIXMAP if (bgPixmap.window_size_sensitive ()) - update_background (); + update_background (); #endif scr_clear (); @@ -1707,4 +1702,63 @@ } #endif /* USE_XIM */ +void +rxvt_term::get_window_origin (int &x, int &y) +{ + Window cr; + XTranslateCoordinates (dpy, parent[0], display->root, 0, 0, &x, &y, &cr); +/* fprintf( stderr, "origin is %+d%+d\n", x, y);*/ +} + +Pixmap +rxvt_term::get_pixmap_property (int prop_id) +{ + if (prop_id > 0 && prop_id < NUM_XA) + if (xa[prop_id]) + { + int aformat; + unsigned long nitems, bytes_after; + Atom atype; + unsigned char *prop = NULL; + int result = XGetWindowProperty (dpy, display->root, xa[prop_id], + 0L, 1L, False, XA_PIXMAP, &atype, &aformat, + &nitems, &bytes_after, &prop); + if (result == Success && prop && atype == XA_PIXMAP) + { + return *(Pixmap *)prop; + } + } + return None; +} + +#ifdef HAVE_BG_PIXMAP +int +rxvt_term::update_background () +{ + bgPixmap.invalidate(); + + /* no chance of real time refresh if we are blurring ! */ + if (bgPixmap.invalid_since + 0.5 < NOW && !(bgPixmap.flags & bgPixmap_t::blurNeeded)) + bgPixmap.render(); + else + { + update_background_ev.stop (); + if (!bgPixmap.need_client_side_rendering()) + update_background_ev.start (NOW + .05); + else if (bgPixmap.flags & bgPixmap_t::blurNeeded) + update_background_ev.start (NOW + .2); /* very slow !!! */ + else + update_background_ev.start (NOW + .07); + } + return 0; +} + +void +rxvt_term::update_background_cb (time_watcher &w) +{ + bgPixmap.render (); +} + +#endif /* HAVE_BG_PIXMAP */ + /*----------------------- end-of-file (C source) -----------------------*/