summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'games-roguelike/nethack/files')
-rw-r--r--games-roguelike/nethack/files/nethack-3.6.0-x11-color.patch186
1 files changed, 186 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
+