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