You may skip my ramblings to find the actual fix, to imlib, in the
bottom. I'm just including some of the stuff I wrote for completeness
sake, and since I spent many hours debugging before finding the actual
problem.

I compiled nethack with DEB_BUILD_OPTIONS="nostrip noopt"
dpkg-buildpackage -rfakeroot. Since I consistently got into problems
running nethack-gnome with gdb several times in a row I put together
this Bad script to be able to do multiple gdb runs after code changes:

---cut---
#!/bin/sh
rm -rf /var/games/nethack/ # clean up locks etc.
dpkg -i nethack-common*.deb nethack-gnome*.deb
chmod -R ugo+w /var/games/nethack/ # nethack-gnome complains about
permissions when run under gdb without this
sed 's/exec/gdb/' < /usr/lib/games/nethack/nethack-gnome.sh > /tmp/tmp.sh
chmod +x /tmp/tmp.sh
mv /tmp/tmp.sh /usr/lib/games/nethack/nethack-gnome.sh
---cut---

Using breakpoint at _XError I got either:

#0  _XError (dpy=0x8b2e00, rep=0x7fffbed3ff80) at ../../src/XlibInt.c:2855
#1  0x00002b0deda20dbb in _XReply (dpy=0x8b2e00, rep=0x7fffbed3ff80,
extra=0,
    discard=1) at ../../src/XlibInt.c:1817
#2  0x00002b0deda18a09 in XSync (dpy=0x8b2e00, discard=0)
    at ../../src/Sync.c:48
#3  0x00002b0dec6e165f in gdk_imlib_render () from
/usr/lib/libgdk_imlib.so.2
#4  0x00000000005ca3a1 in ghack_image_from_glyph (glyph=2347, force=0)
    at ../win/gnome/gnglyph.c:220
#5  0x00000000005c951d in gnome_print_glyph (wid=3, x=25, y=11, glyph=2347)
    at ../win/gnome/gnbind.c:867
#6  0x0000000000455fd1 in flush_screen (cursor_on_u=1) at display.c:1360
#7  0x0000000000421ba2 in newgame () at allmain.c:531
#8  0x00000000005bdeaa in main (argc=1, argv=0x7fffbed40388)
    at ../sys/unix/unixmain.c:286

or a bit different trace with ghack_menu_window_display as the last
interesting function before gdk_imlib_render. In the former case, the
glyph seemed to be always 2347. I tried to continue with various parts
of the code commented out or changed, but the crash always just moved
elsewhere. Eg. if I changed the line 218 in win/gnome/gnglyph.c from:
if (ghack_tiles[tile] && (!ghack_tiles[tile]->pixmap || force))
to:
if (ghack_tiles[tile] && (!ghack_tiles[tile]->pixmap || force) && glyph
!= 2347)

I always got to the latter trace, bypassing the glyph problem.

But the common factor was that no matter what is skipped,
gdk_imlib_render is at the top of the list. I also recompiled imlib and
gnome libs with nostrip, but the longer backtraces didn't give any
additional interesting information I did then some more googling, and
found some hints related to color depths. So I tried running X with 8
bit color depth -> voila! Nethack-gnome works now.

--- the problem itself ---

Finally, I found out that imlib doesn't handle 32-bit visuals properly,
so 24-bit should be fine. So a workaround is this:

export XLIB_SKIP_ARGB_VISUALS=1
nethack-gnome

And the true fix is to add a max24bpp.patch, attached, to imlib sources.
It's from https://bugs.launchpad.net/ubuntu/+source/imlib/+bug/70367,
but rediffed against the 1.19.15-5 in Debian. It applies cleanly and
fixes the problem for me even without the workaround mentioned.
--- gdk_imlib/misc.c.orig	2008-01-03 17:32:02.000000000 +0200
+++ gdk_imlib/misc.c	2008-01-03 17:32:26.000000000 +0200
@@ -455,6 +455,8 @@
 	      if (xvir[i].depth > max)
 		max = xvir[i].depth;
 	    }
+	  if (max > 24)
+	    max = 24;
 	  if (max > 8)
 	    {
 	      id->x.depth = max;
@@ -1005,6 +1007,8 @@
 	      if (xvir[i].depth > max)
 		max = xvir[i].depth;
 	    }
+	  if (max > 24)
+	    max = 24;
 	  if (max > 8)
 	    {
 	      id->x.depth = max;
--- Imlib/misc.c.orig	2008-01-03 17:32:02.000000000 +0200
+++ Imlib/misc.c	2008-01-03 17:32:26.000000000 +0200
@@ -423,6 +423,8 @@
 	      if (xvir[i].depth > max)
 		max = xvir[i].depth;
 	    }
+	  if (max > 24)
+	    max = 24;
 	  if (max > 8)
 	    {
 	      id->x.depth = max;
@@ -1027,6 +1029,8 @@
 	      if (xvir[i].depth > max)
 		max = xvir[i].depth;
 	    }
+	  if (max > 24)
+	    max = 24;
 	  if (max > 8)
 	    {
 	      id->x.depth = max;

Reply via email to