You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
6.7 KiB
187 lines
6.7 KiB
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
|
|
|