--- rxvt-unicode/src/rxvttoolkit.C 2012/06/03 15:50:22 1.132 +++ rxvt-unicode/src/rxvttoolkit.C 2012/10/14 13:43:25 1.139 @@ -68,7 +68,7 @@ "WM_LOCALE_NAME", "XIM_SERVERS", #endif -#ifdef ENABLE_TRANSPARENCY +#if ENABLE_TRANSPARENCY || ENABLE_PERL "_XROOTPMAP_ID", "ESETROOT_PMAP_ID", #endif @@ -155,7 +155,7 @@ ///////////////////////////////////////////////////////////////////////////// -#ifdef USE_XIM +#if USE_XIM static void #if XIMCB_PROTO_BROKEN @@ -262,22 +262,42 @@ cmap = DefaultColormapOfScreen (screen); } +#if ENABLE_FRILLS + void -rxvt_screen::select_visual (int bitdepth) +rxvt_screen::select_visual (int id) { -#if XFT XVisualInfo vinfo; + vinfo.visualid = id; + int n; - if (XMatchVisualInfo (dpy, display->screen, bitdepth, TrueColor, &vinfo)) + if (XVisualInfo *vi = XGetVisualInfo (dpy, VisualIDMask, &vinfo, &n)) { - depth = bitdepth; - visual = vinfo.visual; - cmap = XCreateColormap (dpy, display->root, visual, AllocNone); + depth = vi->depth; + visual = vi->visual; + + XFree (vi); + + cmap = XCreateColormap (dpy, display->root, visual, AllocNone); } -#endif + else + rxvt_warn ("cannot requested visual id 0x%02x, using default visual.\n", id); } void +rxvt_screen::select_depth (int bitdepth) +{ + XVisualInfo vinfo; + + if (XMatchVisualInfo (dpy, display->screen, bitdepth, TrueColor, &vinfo)) + select_visual (vinfo.visualid); + else + rxvt_warn ("no visual found for requested depth %d, using default visual.\n", bitdepth); +} + +#endif + +void rxvt_screen::clear () { #if XFT @@ -472,22 +492,24 @@ #if XRENDER int major, minor; if (XRenderQueryVersion (dpy, &major, &minor)) - { - flags |= DISPLAY_HAS_RENDER; + if (major > 0 || (major == 0 && minor >= 10)) + { + flags |= DISPLAY_HAS_RENDER; - if (major > 0 || (major == 0 && minor >= 11)) - flags |= DISPLAY_HAS_RENDER_MUL; +#if 0 + if (major > 0 || (major == 0 && minor >= 11)) + flags |= DISPLAY_HAS_RENDER_MUL; +#endif - XFilters *filters = XRenderQueryFilters (dpy, root); - if (filters) - { - for (int i = 0; i < filters->nfilter; i++) - if (!strcmp (filters->filter[i], FilterConvolution)) - flags |= DISPLAY_HAS_RENDER_CONV; + if (XFilters *filters = XRenderQueryFilters (dpy, root)) + { + for (int i = 0; i < filters->nfilter; i++) + if (!strcmp (filters->filter [i], FilterConvolution)) + flags |= DISPLAY_HAS_RENDER_CONV; - XFree (filters); - } - } + XFree (filters); + } + } #endif int fd = XConnectionNumber (dpy); @@ -536,14 +558,14 @@ #endif x_ev.stop (); flush_ev.stop (); -#ifdef USE_XIM +#if USE_XIM xims.clear (); #endif XrmDestroyDatabase (XrmGetDatabase (dpy)); XCloseDisplay (dpy); } -#ifdef USE_XIM +#if USE_XIM void rxvt_display::im_change_cb () { for (im_watcher **i = imw.begin (); i != imw.end (); ++i) @@ -589,7 +611,7 @@ XEvent xev; XNextEvent (dpy, &xev); -#ifdef USE_XIM +#if USE_XIM if (!XFilterEvent (&xev, None)) { if (xev.type == PropertyNotify @@ -607,7 +629,7 @@ else if (xw[i]->window == xev.xany.window) xw[i]->call (xev); } -#ifdef USE_XIM +#if USE_XIM } #endif } @@ -648,7 +670,7 @@ cur_owner = owner; } -#ifdef USE_XIM +#if USE_XIM void rxvt_display::reg (im_watcher *w) { @@ -693,6 +715,28 @@ return XInternAtom (dpy, name, False); } +Pixmap +rxvt_display::get_pixmap_property (Atom property) +{ + Pixmap pixmap = None; + + int aformat; + unsigned long nitems, bytes_after; + Atom atype; + unsigned char *prop; + int result = XGetWindowProperty (dpy, root, property, + 0L, 1L, False, XA_PIXMAP, &atype, &aformat, + &nitems, &bytes_after, &prop); + if (result == Success) + { + if (atype == XA_PIXMAP) + pixmap = *(Pixmap *)prop; + XFree (prop); + } + + return pixmap; +} + ///////////////////////////////////////////////////////////////////////////// template class refcache; @@ -867,7 +911,7 @@ } void -rxvt_color::get (rgba &color) +rxvt_color::get (rgba &color) const { #if XFT color.r = c.color.red; @@ -883,7 +927,7 @@ } void -rxvt_color::get (XColor &color) +rxvt_color::get (XColor &color) const { rgba c; get (c);