commit:     69f0831c1243d1b889f38a2d5261420664ee59c9
Author:     Luis Ressel <aranea <AT> aixah <DOT> de>
AuthorDate: Fri Feb 12 14:50:47 2016 +0000
Commit:     Ian Delaney <idella4 <AT> gentoo <DOT> org>
CommitDate: Fri Feb 12 14:50:47 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=69f0831c

games-roguelike/nethack: Fix map colors in x11 interface

Gentoo-Bug: 573598
X-Upstream-Commit: a41382d

 .../nethack/files/nethack-3.6.0-x11-color.patch    | 186 +++++++++++++++++++++
 games-roguelike/nethack/nethack-3.6.0-r3.ebuild    | 144 ++++++++++++++++
 2 files changed, 330 insertions(+)

diff --git a/games-roguelike/nethack/files/nethack-3.6.0-x11-color.patch 
b/games-roguelike/nethack/files/nethack-3.6.0-x11-color.patch
new file mode 100644
index 0000000..d34ca02
--- /dev/null
+++ b/games-roguelike/nethack/files/nethack-3.6.0-x11-color.patch
@@ -0,0 +1,186 @@
+From f92bf2b495450d323e157eb41130c79a3d369239 Mon Sep 17 00:00:00 2001
+From: PatR <ran...@nethack.org>
+Date: Mon, 8 Feb 2016 19:01:26 -0800
+Subject: [PATCH] fix #H4237 - color ignored for X11 text map
+
+Color was only being tracked for locations that had the pile of
+objects flag set.  And hilite_pile made a monster on a pile take
+on the color of the top object of the pile.
+
+This restores the tracking of color for the whole map, and makes
+highlighted piles be drawn in inverse like highligted pets.  The
+drawing routine doesn't know the difference (but could tell, if
+necessary, by testing whether the glyph is an object or a monster).
+
+Also, variables 'inbuf', 'inptr', and 'incount' were global; limit
+their scope to winmap.c.
+---
+ win/X11/winmap.c | 68 +++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 33 insertions(+), 35 deletions(-)
+
+diff --git a/win/X11/winmap.c b/win/X11/winmap.c
+index 93f5dd6..523e13d 100644
+--- a/win/X11/winmap.c
++++ b/win/X11/winmap.c
+@@ -102,6 +102,7 @@ int bkglyph UNUSED;
+         int color, och;
+         unsigned special;
+ #ifdef TEXTCOLOR
++        int colordif;
+         register unsigned char *co_ptr;
+ #endif
+ 
+@@ -116,24 +117,22 @@ int bkglyph UNUSED;
+ 
+         /* Only update if we need to. */
+         ch_ptr = &map_info->text_map.text[y][x];
+-
+-#ifdef TEXTCOLOR
+-        co_ptr = &map_info->text_map.colors[y][x];
+-        if (*ch_ptr != ch || *co_ptr != color)
+-#else
+-        if (*ch_ptr != ch)
+-#endif
+-        {
++        if (*ch_ptr != ch) {
+             *ch_ptr = ch;
++            if (!map_info->is_tile)
++                update_bbox = TRUE;
++        }
+ #ifdef TEXTCOLOR
+-            if ((special & MG_PET) && iflags.hilite_pet)
+-                color += CLR_MAX;
+-            if ((special & MG_OBJPILE) && iflags.hilite_pile)
+-            *co_ptr = color;
+-#endif
++        co_ptr = &map_info->text_map.colors[y][x];
++        colordif = (((special & MG_PET) && iflags.hilite_pet)
++                    || ((special & MG_OBJPILE) && iflags.hilite_pile))
++                      ? CLR_MAX : 0;
++        if (*co_ptr != (uchar) (color + colordif)) {
++            *co_ptr = (uchar) (color + colordif);
+             if (!map_info->is_tile)
+                 update_bbox = TRUE;
+         }
++#endif
+     }
+ 
+     if (update_bbox) { /* update row bbox */
+@@ -844,7 +843,8 @@ Font font;
+     set_color_gc(CLR_BRIGHT_CYAN, XtNbright_cyan);
+     set_color_gc(CLR_WHITE, XtNwhite);
+ #else
+-    set_gc(wp->w, font, XtNforeground, bgpixel, &map_info->text_map.copy_gc,
++    set_gc(wp->w, font, XtNforeground, bgpixel,
++           &map_info->text_map.copy_gc,
+            &map_info->text_map.inv_copy_gc);
+ #endif
+ }
+@@ -943,17 +943,17 @@ struct xwindow *wp;
+ 
+     map_all_stone(map_info);
+     (void) memset((genericptr_t) map_info->text_map.text, ' ',
+-                  sizeof(map_info->text_map.text));
++                  sizeof map_info->text_map.text);
+ #ifdef TEXTCOLOR
+     (void) memset((genericptr_t) map_info->text_map.colors, NO_COLOR,
+-                  sizeof(map_info->text_map.colors));
++                  sizeof map_info->text_map.colors);
+ #endif
+ 
+     /* force a full update */
+     (void) memset((genericptr_t) map_info->t_start, (char) 0,
+-                  sizeof(map_info->t_start));
++                  sizeof map_info->t_start);
+     (void) memset((genericptr_t) map_info->t_stop, (char) COLNO - 1,
+-                  sizeof(map_info->t_stop));
++                  sizeof map_info->t_stop);
+     display_map_window(wp);
+ }
+ 
+@@ -978,8 +978,8 @@ struct xwindow *wp;
+ #ifdef VERBOSE
+     printf("Font information:\n");
+     printf("fid = %ld, direction = %d\n", fs->fid, fs->direction);
+-    printf("first = %d, last = %d\n", fs->min_char_or_byte2,
+-           fs->max_char_or_byte2);
++    printf("first = %d, last = %d\n",
++           fs->min_char_or_byte2, fs->max_char_or_byte2);
+     printf("all chars exist? %s\n", fs->all_chars_exist ? "yes" : "no");
+     printf("min_bounds:lb=%d rb=%d width=%d asc=%d des=%d attr=%d\n",
+            fs->min_bounds.lbearing, fs->min_bounds.rbearing,
+@@ -990,8 +990,8 @@ struct xwindow *wp;
+            fs->max_bounds.width, fs->max_bounds.ascent,
+            fs->max_bounds.descent, fs->max_bounds.attributes);
+     printf("per_char = 0x%lx\n", (unsigned long) fs->per_char);
+-    printf("Text: (max) width = %d, height = %d\n", text_map->square_width,
+-           text_map->square_height);
++    printf("Text: (max) width = %d, height = %d\n",
++           text_map->square_width, text_map->square_height);
+ #endif
+ 
+     if (fs->min_bounds.width != fs->max_bounds.width)
+@@ -1002,9 +1002,9 @@ struct xwindow *wp;
+  * keyhit buffer
+  */
+ #define INBUF_SIZE 64
+-int inbuf[INBUF_SIZE];
+-int incount = 0;
+-int inptr = 0; /* points to valid data */
++static int inbuf[INBUF_SIZE];
++static int incount = 0;
++static int inptr = 0; /* points to valid data */
+ 
+ /*
+  * Keyboard and button event handler for map window.
+@@ -1249,8 +1249,8 @@ boolean inverted;
+     }
+ 
+ #ifdef VERBOSE_UPDATE
+-    printf("update: [0x%x] %d %d %d %d\n", (int) wp->w, start_row, stop_row,
+-           start_col, stop_col);
++    printf("update: [0x%x] %d %d %d %d\n",
++           (int) wp->w, start_row, stop_row, start_col, stop_col);
+ #endif
+     win_start_row = start_row;
+     win_start_col = start_col;
+@@ -1273,8 +1273,8 @@ boolean inverted;
+                 src_y = (tile / TILES_PER_ROW) * tile_height;
+                 XCopyArea(dpy, tile_pixmap, XtWindow(wp->w),
+                           tile_map->black_gc, /* no grapics_expose */
+-                          src_x, src_y, tile_width, tile_height, dest_x,
+-                          dest_y);
++                          src_x, src_y, tile_width, tile_height,
++                          dest_x, dest_y);
+ 
+                 if (glyph_is_pet(glyph) && iflags.hilite_pet) {
+                     /* draw pet annotation (a heart) */
+@@ -1412,10 +1412,8 @@ Dimension cols, rows;
+     }
+ 
+     num_args = 0;
+-    XtSetArg(args[num_args], XtNwidth, wp->pixel_width);
+-    num_args++;
+-    XtSetArg(args[num_args], XtNheight, wp->pixel_height);
+-    num_args++;
++    XtSetArg(args[num_args], XtNwidth, wp->pixel_width); num_args++;
++    XtSetArg(args[num_args], XtNheight, wp->pixel_height); num_args++;
+     XtSetValues(wp->w, args, num_args);
+ }
+ 
+@@ -1426,10 +1424,10 @@ struct xwindow *wp;
+     struct map_info_t *map_info = wp->map_information;
+     struct text_map_info_t *text_map = &map_info->text_map;
+ 
+-    (void) memset((genericptr_t) text_map->text, ' ', sizeof(text_map->text));
++    (void) memset((genericptr_t) text_map->text, ' ', sizeof text_map->text);
+ #ifdef TEXTCOLOR
+     (void) memset((genericptr_t) text_map->colors, NO_COLOR,
+-                  sizeof(text_map->colors));
++                  sizeof text_map->colors);
+ #endif
+ 
+     get_char_info(wp);
+-- 
+2.7.1
+

diff --git a/games-roguelike/nethack/nethack-3.6.0-r3.ebuild 
b/games-roguelike/nethack/nethack-3.6.0-r3.ebuild
new file mode 100644
index 0000000..eb84203
--- /dev/null
+++ b/games-roguelike/nethack/nethack-3.6.0-r3.ebuild
@@ -0,0 +1,144 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+inherit eutils toolchain-funcs flag-o-matic user
+
+MY_PV=${PV//.}
+DESCRIPTION="The ultimate old-school single player dungeon exploration game"
+HOMEPAGE="http://www.nethack.org/";
+SRC_URI="mirror://sourceforge/nethack/${PN}-${MY_PV}-src.tgz"
+
+LICENSE="nethack"
+SLOT="0"
+KEYWORDS="~amd64 ~hppa ~ppc ~sparc ~x86 ~x86-fbsd"
+IUSE="experimental X"
+
+RDEPEND="sys-libs/ncurses:0=
+       X? (
+               x11-libs/libXaw
+               x11-libs/libXpm
+               x11-libs/libXt
+       )"
+DEPEND="${RDEPEND}
+       virtual/pkgconfig
+       X? (
+               x11-proto/xproto
+               x11-apps/bdftopcf
+               x11-apps/mkfontdir
+       )"
+
+BINDIR="/usr/bin"
+STATEDIR="/var/games/${PN}"
+
+NETHACK_GROUP="gamestat"
+
+pkg_setup() {
+       HACKDIR="/usr/$(get_libdir)/${PN}"
+
+       enewgroup gamestat 36
+}
+
+src_prepare() {
+       eapply "${FILESDIR}/${P}-recover.patch"
+       eapply "${FILESDIR}/${P}-x11-color.patch"
+       eapply_user
+
+       cp "${FILESDIR}/${P}-hint-$(usex X x11 tty)" hint || die "Failed to 
copy hint file"
+       sys/unix/setup.sh hint || die "Failed to run setup.sh"
+}
+
+src_compile() {
+       append-cflags -I../include -DDLB -DSECURE -DLINUX -DTIMED_DELAY 
-DVISION_TABLES
+       append-cflags '-DCOMPRESS=\"/bin/gzip\"' '-DCOMPRESS_EXTENSION=\".gz\"'
+       append-cflags "-DHACKDIR=\\\"${HACKDIR}\\\"" 
"-DVAR_PLAYGROUND=\\\"${STATEDIR}\\\""
+       append-cflags "-DDEF_PAGER=\\\"${PAGER}\\\""
+       append-cflags -DSYSCF "-DSYSCF_FILE=\\\"/etc/nethack.sysconf\\\""
+
+       use X && append-cflags -DX11_GRAPHICS -DUSE_XPM
+       use experimental &&
+               append-cflags -DSTATUS_VIA_WINDOWPORT -DSTATUS_HILITES 
-DSCORE_ON_BOTL
+
+       makeopts=(
+               CC="$(tc-getCC)" CFLAGS="${CFLAGS}" LFLAGS="${LDFLAGS}"
+               WINTTYLIB="$($(tc-getPKG_CONFIG) --libs ncurses)"
+               HACKDIR="${HACKDIR}" INSTDIR="${D}/${HACKDIR}"
+               SHELLDIR="${D}/${BINDIR}" VARDIR="${D}/${STATEDIR}"
+               )
+
+       emake "${makeopts[@]}" nethack recover Guidebook spec_levs
+
+       # Upstream still has some parallel compilation bugs
+       emake -j1 "${makeopts[@]}" all
+}
+
+src_install() {
+       emake "${makeopts[@]}" install
+
+       exeinto "${BINDIR}"
+       newexe util/recover recover-nethack
+       rm "${D}/${HACKDIR}/recover" || die "Failed to remove HACKDIR/recover"
+
+       doman doc/nethack.6
+       newman doc/recover.6 recover-nethack.6
+       dodoc doc/Guidebook.txt
+
+       insinto /etc
+       newins sys/unix/sysconf nethack.sysconf
+
+       insinto /etc/skel
+       newins "${FILESDIR}/${P}-nethackrc" .nethackrc
+
+       if use X ; then
+               cd "${S}/win/X11" || die "Failed to enter win/X11 directory"
+
+               # copy nethack x application defaults
+               insinto /etc/X11/app-defaults
+               newins NetHack.ad NetHack
+               rm "${D}/${HACKDIR}/NetHack.ad" || die "Failed to remove 
NetHack.ad"
+
+               newicon nh_icon.xpm nethack.xpm
+               make_desktop_entry ${PN} Nethack
+
+               # install nethack fonts
+               bdftopcf -o nh10.pcf nh10.bdf || die "Converting fonts failed"
+               bdftopcf -o ibm.pcf ibm.bdf || die "Converting fonts failed"
+               insinto "${HACKDIR}/fonts"
+               doins *.pcf
+               cd "${D}/${HACKDIR}/fonts" || die "Failed to enter fonts 
directory"
+               mkfontdir || die "The action mkfontdir ${HACKDIR}/fonts failed"
+       fi
+
+       rm -r "${D}/${STATEDIR}" || die "Failed to clean STATEDIR"
+       keepdir "${STATEDIR}/save"
+
+       fowners -R "root:${NETHACK_GROUP}" "${STATEDIR}"
+       fperms 770 "${STATEDIR}" "${STATEDIR}/save"
+
+       fowners "root:${NETHACK_GROUP}" "${HACKDIR}/nethack"
+       fperms g+s "${HACKDIR}/nethack"
+}
+
+pkg_postinst() {
+       cd "${ROOT}/${STATEDIR}" || die "Failed to enter ${STATEDIR} directory"
+
+       touch logfile perm record xlogfile || die "Failed to create log files"
+
+       chown -R root:"${NETHACK_GROUP}" . &&
+       chmod -R 660 . &&
+       chmod 770 . save ||
+       die "Adjustment of file permissions in ${ROOT}/${STATEDIR} failed"
+
+       touch -c bones* save/*  # non-critical
+
+       elog "A minimal default .nethackrc has been placed in /etc/skel/"
+       elog "The sysconf file is at /etc/nethack.sysconf"
+
+       if has_version "<${CATEGORY}/${PN}-3.6.0" ; then
+               elog
+               elog "Nethack 3.6 includes many new features."
+               elog "You might want to review your options and local patchset."
+               elog "Have a look at http://www.nethack.org/v360/release.html";
+       fi
+}

Reply via email to