df14c8a
diff -ur xchat-2.8.4/src/fe-gtk/xtext.c xchat-2.8.4-shm-pixmaps/src/fe-gtk/xtext.c
df14c8a
--- xchat-2.8.4/src/fe-gtk/xtext.c	2007-06-08 11:57:07.000000000 +0200
df14c8a
+++ xchat-2.8.4-shm-pixmaps/src/fe-gtk/xtext.c	2008-05-23 00:56:52.000000000 +0200
df14c8a
@@ -1347,6 +1347,22 @@
df14c8a
 	}
df14c8a
 }
7ba2d04
 
7ba2d04
+#ifdef USE_SHM
7ba2d04
+static int
7ba2d04
+have_shm_pixmaps(Display *dpy)
7ba2d04
+{
7ba2d04
+    static int checked = 0, major, minor;
4942546
+    static Bool have = FALSE;
7ba2d04
+
7ba2d04
+    if (!checked) {
7ba2d04
+	XShmQueryVersion(dpy, &major, &minor, &have);
7ba2d04
+	checked = 1;
7ba2d04
+    }
7ba2d04
+
7ba2d04
+    return have;
7ba2d04
+}
7ba2d04
+#endif
7ba2d04
+
df14c8a
 static void
df14c8a
 gtk_xtext_paint (GtkWidget *widget, GdkRectangle *area)
7ba2d04
 {
df14c8a
@@ -1363,8 +1379,12 @@
df14c8a
 		{
df14c8a
 			xtext->last_win_x = x;
df14c8a
 			xtext->last_win_y = y;
df14c8a
-#if !defined(USE_SHM) && !defined(WIN32)
df14c8a
+#ifndef WIN32
df14c8a
+#ifdef USE_SHM
df14c8a
+			if (xtext->shaded && !have_shm_pixmaps(GDK_WINDOW_XDISPLAY (xtext->draw_buf)))
df14c8a
+#else
df14c8a
 			if (xtext->shaded)
df14c8a
+#endif
df14c8a
 			{
df14c8a
 				xtext->recycle = TRUE;
df14c8a
 				gtk_xtext_load_trans (xtext);
df14c8a
@@ -3549,6 +3569,11 @@
7ba2d04
 	GC tgc;
7ba2d04
 	Display *xdisplay = GDK_WINDOW_XDISPLAY (xtext->draw_buf);
7ba2d04
 
7ba2d04
+#ifdef USE_SHM
7ba2d04
+	int shm_pixmaps;
7ba2d04
+	shm_pixmaps = have_shm_pixmaps(xdisplay);
7ba2d04
+#endif
7ba2d04
+
7ba2d04
 	XGetGeometry (xdisplay, p, &root, &dummy, &dummy, &width, &height,
7ba2d04
 					  &dummy, &depth);
7ba2d04
 
df14c8a
@@ -3566,18 +3591,20 @@
df14c8a
 		XFreeGC (xdisplay, tgc);
df14c8a
 
df14c8a
 #ifdef USE_SHM
df14c8a
-		ximg = get_image (xtext, xdisplay, &xtext->shminfo, 0, 0, w, h, depth, tmp);
df14c8a
-#else
df14c8a
-		ximg = XGetImage (xdisplay, tmp, 0, 0, w, h, -1, ZPixmap);
df14c8a
+		if (shm_pixmaps)
df14c8a
+			ximg = get_image (xtext, xdisplay, &xtext->shminfo, 0, 0, w, h, depth, tmp);
df14c8a
+		else
df14c8a
 #endif
df14c8a
+			ximg = XGetImage (xdisplay, tmp, 0, 0, w, h, -1, ZPixmap);
df14c8a
 		XFreePixmap (xdisplay, tmp);
df14c8a
 	} else
df14c8a
 	{
df14c8a
 #ifdef USE_SHM
df14c8a
-		ximg = get_image (xtext, xdisplay, &xtext->shminfo, x, y, w, h, depth, p);
df14c8a
-#else
df14c8a
-		ximg = XGetImage (xdisplay, p, x, y, w, h, -1, ZPixmap);
df14c8a
+		if (shm_pixmaps)
df14c8a
+			ximg = get_image (xtext, xdisplay, &xtext->shminfo, x, y, w, h, depth, p);
df14c8a
+		else
df14c8a
 #endif
df14c8a
+			ximg = XGetImage (xdisplay, p, x, y, w, h, -1, ZPixmap);
df14c8a
 	}
df14c8a
 
df14c8a
 	if (!ximg)
df14c8a
@@ -3602,7 +3629,7 @@
7ba2d04
 	else
7ba2d04
 	{
7ba2d04
 #ifdef USE_SHM
7ba2d04
-		if (xtext->shm)
7ba2d04
+		if (xtext->shm && shm_pixmaps)
7ba2d04
 		{
7ba2d04
 #if (GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION == 0)
7ba2d04
 			shaded_pix = gdk_pixmap_foreign_new (
df14c8a
@@ -3620,7 +3647,7 @@
7ba2d04
 	}
7ba2d04
 
7ba2d04
 #ifdef USE_SHM
7ba2d04
-	if (!xtext->shm)
7ba2d04
+	if (!xtext->shm || !shm_pixmaps)
7ba2d04
 #endif
7ba2d04
 		XPutImage (xdisplay, GDK_WINDOW_XWINDOW (shaded_pix),
7ba2d04
 					  GDK_GC_XGC (xtext->fgc), ximg, 0, 0, 0, 0, w, h);
df14c8a
@@ -3640,7 +3667,7 @@
df14c8a
 	if (xtext->pixmap)
df14c8a
 	{
df14c8a
 #ifdef USE_SHM
df14c8a
-		if (xtext->shm)
df14c8a
+		if (xtext->shm && have_shm_pixmaps(GDK_WINDOW_XDISPLAY (xtext->draw_buf)))
df14c8a
 		{
df14c8a
 			XFreePixmap (GDK_WINDOW_XDISPLAY (xtext->pixmap),
df14c8a
 							 GDK_WINDOW_XWINDOW (xtext->pixmap));