summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkdrawable-x11.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2003-04-18 20:21:44 +0000
committerOwen Taylor <otaylor@src.gnome.org>2003-04-18 20:21:44 +0000
commitdcaf1b80e27c636c2f9d0299e602aae7142ca882 (patch)
tree118ffc9f8eaa0aab4ebe8a6cf25b47222251ceca /gdk/x11/gdkdrawable-x11.c
parent5e5dd39adf7963a229557729bc75459aa92dcd7a (diff)
downloadgtk+-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.c57
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