diff options
author | Owen Taylor <otaylor@redhat.com> | 2003-04-18 20:21:44 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2003-04-18 20:21:44 +0000 |
commit | dcaf1b80e27c636c2f9d0299e602aae7142ca882 (patch) | |
tree | 118ffc9f8eaa0aab4ebe8a6cf25b47222251ceca /gdk/x11/gdkdrawable-x11.c | |
parent | 5e5dd39adf7963a229557729bc75459aa92dcd7a (diff) | |
download | gtk+-dcaf1b80e27c636c2f9d0299e602aae7142ca882.tar.gz |
Patch from Morten Welinder to catch Sun servers with a broken
Fri Apr 18 15:56:46 2003 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkdisplay-x11.[ch] gdk/x11/gdkdrawable-x11.[ch]:
Patch from Morten Welinder to catch Sun servers with a
broken implementation of the RENDER extension. (#108309)
Diffstat (limited to 'gdk/x11/gdkdrawable-x11.c')
-rw-r--r-- | gdk/x11/gdkdrawable-x11.c | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index 7aed12ee9b..6367d755bc 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -227,13 +227,58 @@ gdk_drawable_impl_x11_finalize (GObject *object) gboolean _gdk_x11_have_render (GdkDisplay *display) { - /* This check is cheap, but if we have to do version checks, we will - * need to cache the result since version checks are round-trip - */ - int event_base, error_base; + Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); + GdkDisplayX11 *x11display = GDK_DISPLAY_X11 (display); + + if (x11display->have_render == GDK_UNKNOWN) + { + int event_base, error_base; + x11display->have_render = + XRenderQueryExtension (xdisplay, &event_base, &error_base) + ? GDK_YES : GDK_NO; + + if (x11display->have_render == GDK_YES) + { + /* + * Sun advertises RENDER, but fails to support 32-bit pixmaps. + * That is just no good. Therefore, we check all screens + * for proper support. + */ + + int screen; + for (screen = 0; screen < ScreenCount (xdisplay); screen++) + { + int count; + int *depths = XListDepths (xdisplay, screen, &count); + gboolean has_8 = FALSE, has_32 = FALSE; + + if (depths) + { + int i; + + for (i = 0; i < count; i++) + { + if (depths[i] == 8) + has_8 = TRUE; + else if (depths[i] == 32) + has_32 = TRUE; + } + XFree (depths); + } + + if (!(has_8 && has_32)) + { + g_warning ("The X server advertises that RENDER support is present,\n" + "but fails to supply the necessary pixmap support. In\n" + "other words, it is buggy."); + x11display->have_render = GDK_NO; + break; + } + } + } + } - return XRenderQueryExtension (GDK_DISPLAY_XDISPLAY (display), - &event_base, &error_base); + return x11display->have_render == GDK_YES; } #ifdef HAVE_XFT2 |