diff options
author | Luis Ressel <aranea@aixah.de> | 2016-02-12 15:50:47 +0100 |
---|---|---|
committer | Luis Ressel <aranea@aixah.de> | 2016-02-12 15:50:47 +0100 |
commit | 69f0831c1243d1b889f38a2d5261420664ee59c9 (patch) | |
tree | a16a4109e093671a9ac2a3cc15adf3e792716e8b /games-roguelike/nethack | |
parent | app-forensics/afflib: Bump #573586 (diff) | |
download | gentoo-69f0831c1243d1b889f38a2d5261420664ee59c9.tar.gz gentoo-69f0831c1243d1b889f38a2d5261420664ee59c9.tar.bz2 gentoo-69f0831c1243d1b889f38a2d5261420664ee59c9.zip |
games-roguelike/nethack: Fix map colors in x11 interface
Gentoo-Bug: 573598
X-Upstream-Commit: a41382d
Diffstat (limited to 'games-roguelike/nethack')
-rw-r--r-- | games-roguelike/nethack/files/nethack-3.6.0-x11-color.patch | 186 | ||||
-rw-r--r-- | games-roguelike/nethack/nethack-3.6.0-r3.ebuild | 144 |
2 files changed, 330 insertions, 0 deletions
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 000000000000..d34ca029d51a --- /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 <rankin@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 000000000000..eb842037a43b --- /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 +} |