forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nethack-3.6.0-x11-color.patch
186 lines (167 loc) · 6.67 KB
/
nethack-3.6.0-x11-color.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
From f92bf2b495450d323e157eb41130c79a3d369239 Mon Sep 17 00:00:00 2001
From: PatR <[email protected]>
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