-/* NetHack 3.6 winmap.c $NHDT-Date: 1447844616 2015/11/18 11:03:36 $ $NHDT-Branch: master $:$NHDT-Revision: 1.25 $ */
+/* NetHack 3.6 winmap.c $NHDT-Date: 1455389908 2016/02/13 18:58:28 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.29 $ */
/* Copyright (c) Dean Luick, 1992 */
/* NetHack may be freely redistributed. See license for details. */
int color, och;
unsigned special;
#ifdef TEXTCOLOR
+ int colordif;
register unsigned char *co_ptr;
#endif
/* map glyph to character and color */
- (void) mapglyph(glyph, &och, &color, &special, x, y);
+ (void) mapglyph(glyph, &och, &color, &special, x, y, 0);
ch = (uchar) och;
if (special != map_info->tile_map.glyphs[y][x].special) {
/* 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) != 0 && iflags.hilite_pet)
+ || ((special & MG_OBJPILE) != 0 && iflags.hilite_pile)
+ || ((special & (MG_DETECT | MG_BW_LAVA)) != 0))
+ ? 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 */
/*ARGSUSED*/
void
X11_cliparound(x, y)
-int x, y;
+int x UNUSED;
+int y UNUSED;
{
+ return;
}
#endif /* CLIPPING */
post_process_tiles()
{
Display *dpy = XtDisplay(toplevel);
-#if 0 /*JP*/
+#ifndef X11LARGETILE
unsigned int width, height;
if (tile_image == 0)
tile_image, 0, 0, 0, 0, /* src, dest top left */
width, height);
+#ifdef MONITOR_HEAP
+ /* if we let XDestroyImage() handle it, our tracking will be off */
+ if (tile_image->data)
+ free((genericptr_t) tile_image->data), tile_image->data = 0;
+#endif
XDestroyImage(tile_image); /* data bytes free'd also */
tile_image = 0;
#else
XpmFreeXpmImage(&tile_image);
}
# endif
-#endif /*JP*/
+#endif
init_annotation(&pet_annotation, appResources.pet_mark_bitmap,
appResources.pet_mark_color);
attributes.valuemask = XpmCloseness;
attributes.closeness = 25000;
-# if 0 /*JP*/
+# ifndef X11LARGETILE
errorcode = XpmReadFileToImage(dpy, appResources.tile_file, &tile_image,
0, &attributes);
# else
NULL);
# endif
-# if 0 /*JP*/
+# ifndef X11LARGETILE
if (errorcode == XpmColorFailed) {
Sprintf(buf, "Insufficient colors available to load %s.",
appResources.tile_file);
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
}
XClearWindow(XtDisplay(wp->w), XtWindow(wp->w));
set_map_size(wp, COLNO, ROWNO);
check_cursor_visibility(wp);
+ highlight_yn(TRUE); /* change fg/bg to match map */
} else if (wp->prevx != wp->cursx || wp->prevy != wp->cursy) {
register unsigned int x = wp->prevx, y = wp->prevy;
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);
}
#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,
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)
* 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.
switch (event->type) {
case ButtonPress:
+ if (!iflags.wc_mouse_support)
+ return;
+
button = (XButtonEvent *) event;
#ifdef VERBOSE_INPUT
printf("button press\n");
/*
* Do the actual work of the putting characters onto our X window. This
* is called from the expose event routine, the display window (flush)
- * routine, and the display cursor routine. The later involves inverting
+ * routine, and the display cursor routine. The last involves inverting
* the foreground and background colors, which are also inverted when the
* position's color is above CLR_MAX.
*
}
#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;
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);
#else
struct rm *lev = &levl[cur_col][row];
int glyph = tile_map->glyphs[row][cur_col].glyph;
struct text_map_info_t *text_map = &map_info->text_map;
#ifdef TEXTCOLOR
- if (iflags.use_color) {
+ {
register char *c_ptr;
char *t_ptr;
int cur_col, color, win_ystart;
}
XDrawImageString(XtDisplay(wp->w), XtWindow(wp->w),
- cur_inv ? text_map->inv_color_gcs[color]
- : text_map->color_gcs[color],
+ iflags.use_color
+ ? (cur_inv
+ ? text_map->inv_color_gcs[color]
+ : text_map->color_gcs[color])
+ : (cur_inv
+ ? text_map->inv_copy_gc
+ : text_map->copy_gc),
text_map->square_lbearing
+ (text_map->square_width * cur_col),
win_ystart, t_ptr, count);
cur_col += count;
} /* col loop */
} /* row loop */
- } else
-#endif /* TEXTCOLOR */
+ }
+#else /* !TEXTCOLOR */
{
int win_row, win_xstart;
count);
}
}
+#endif /* ?TEXTCOLOR */
}
}
}
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);
}
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);
(XtPointer) 0);
else
wp->type = NHW_NONE; /* allow re-use */
+
+ /* when map goes away, presumably we're exiting, so get rid of the
+ cached extended commands menu (if we aren't actually exiting, it
+ will get recreated if needed again) */
+ release_extended_cmds();
}
boolean exit_x_event; /* exit condition for the event loop */