]> granicus.if.org Git - nethack/commitdiff
more window port interface adjustments
authornhmall <nhmall@nethack.org>
Tue, 5 Jan 2021 15:09:37 +0000 (10:09 -0500)
committernhmall <nhmall@nethack.org>
Tue, 5 Jan 2021 15:09:37 +0000 (10:09 -0500)
further adjustments to the window port interface to pass a pointer
to a glyph_info struct which describes not just the glyph number
itself, but also the ttychar, the color, the glyphflags, and the
symset index.

This affects two existing window port calls that get passed glyphs
and does the parameter consistently for both of them using the
glyph_info struct pointer:
print_glyph()
add_menu().

The recently added glyphmod parameter is now unnecessary and has been
removed.

63 files changed:
doc/fixes37.0
doc/window.doc
include/decl.h
include/display.h
include/extern.h
include/winX.h
include/wincurs.h
include/wingem.h
include/winprocs.h
include/wintty.h
include/wintype.h
src/apply.c
src/artifact.c
src/botl.c
src/cmd.c
src/decl.c
src/detect.c
src/display.c
src/do.c
src/do_name.c
src/drawing.c
src/dungeon.c
src/insight.c
src/invent.c
src/nhlua.c
src/o_init.c
src/options.c
src/pager.c
src/pickup.c
src/restore.c
src/role.c
src/spell.c
src/teleport.c
src/weapon.c
src/windows.c
win/Qt/qt_bind.cpp
win/Qt/qt_bind.h
win/Qt/qt_map.cpp
win/Qt/qt_map.h
win/Qt/qt_win.cpp
win/Qt/qt_win.h
win/X11/winX.c
win/X11/winmap.c
win/X11/winmenu.c
win/chain/wc_chainin.c
win/chain/wc_chainout.c
win/chain/wc_trace.c
win/curses/cursdial.c
win/curses/cursdial.h
win/curses/cursinit.c
win/curses/cursinvt.c
win/curses/cursmain.c
win/curses/cursmesg.c
win/curses/cursmisc.c
win/curses/curswins.c
win/share/safeproc.c
win/shim/winshim.c
win/tty/wintty.c
win/win32/mhmap.c
win/win32/mhmenu.c
win/win32/mhmsg.h
win/win32/mswproc.c
win/win32/winMS.h

index 5f8fafe5420020c4cc1f196fa76b00d82c5fc484..c2f1a0be9e2dce6a27dd226bba5c95298c373d4c 100644 (file)
@@ -9,7 +9,7 @@ hero polymorphed into a vampire can use #monster to shape-shift rather than
 adjust bones filename buffer sizes to accommodate suffix
 fix internal self-recover to work with recent fields added to checkpoint file
 improvements to pronoun usage when hallucinating
-function calls made from map_glyphmod() based on dungeon level are now called
+function calls made from map_glyphinfo() based on dungeon level are now called
        once per level
 fast hero could have random clairvoyance happen more than once on same turn
 using 'Q' on wielded weapon would offer to split stack; make using 'w' on a
@@ -868,6 +868,7 @@ unify special attack damages from separate you-hit-monster, monster-hits-you,
 unify trap effects for hero and monster stepping on the trap by trap type
 replace the single permonst mname field with male, female, and gender-neutral
        names pmnames[NUM_MGENDERS] fields
-add a new glyphmod parameter to window interface *_print_glyph() to be used
-       to provide additional details to the window port beyond the glyph;
-       window port mapglyph() calls and the function itself were removed
+adjust window port interface to pass a pointer to a glyph_info struct which
+       contains the glyph itself, the ttychar, the color, the glyphflags,
+       and the symset index; this affects two window port calls that get
+       passed glyphs: print_glyph() and add_menu().
index 04070e1e30a58a2c0f6eebde00476a6c0a955233..712db7fc616b7238f45c86a1047b2f0e86c1754b 100644 (file)
@@ -191,19 +191,27 @@ int nh_poskey(int *x, int *y, int *mod)
 
 B.  High-level routines:
 
-print_glyph(window, x, y, glyph, bkglyph, glyphmod[3])
-               -- Print the glyph at (x,y) on the given window.  Glyphs are
-                  integers at the interface, mapped to whatever the window-
+print_glyph(window, x, y, glyphinfo, bkglyphinfo)
+               -- Print a glyph found within the glyphinfo at (x,y) on the
+                   given window. The glyphs within the glyph_info struct are
+                   integers and can be mapped to whatever the window-
                   port wants (symbol, font, color, attributes, ...there's
                   a 1-1 map between glyphs and distinct things on the map).
-               -- bkglyph is a background glyph for potential use by some
-                  graphical or tiled environments to allow the depiction
+               -- bkglyphinfo contains a background glyph for potential use
+                   by some graphical or tiled environments to allow the depiction
                   to fall against a background consistent with the grid 
-                  around x,y. If bkglyph is NO_GLYPH, then the parameter
-                  should be ignored (do nothing with it).
-                -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended
-                   information about the glyph that window ports can use to
-                   enhance the display in various ways.
+                  around x,y. If bkglyphinfo->glyph is NO_GLYPH, then the
+                   parameter should be ignored (do nothing with it).
+                -- glyph_info struct fields:
+                    int glyph;            /* the display entity */
+                    int color;            /* color for window ports not using a tile */
+                    int ttychar;          /* the character mapping for the original tty
+                                             interace. Most or all window ports wanted
+                                             and used this for various things so it is
+                                             provided in 3.7+ */
+                    short int symidx;    /* offset into syms array */
+                    unsigned glyphflags;      /* more detail about the entity */
+
 
 char yn_function(const char *ques, const char *choices, char default)
                -- Print a prompt made up of ques, choices and default.
@@ -312,9 +320,9 @@ start_menu(window, unsigned long mbehavior)
                   be used for menus.
                -- mbehavior allows flags to be passed to alter the appearance
                    and/or behavior of the menu.
-add_menu(windid window, int glyph, const anything identifier,
-                               char accelerator, char groupacc,
-                               int attr, char *str, unsigned itemflags)
+add_menu(windid window, glyphinfo, const anything identifier, char accelerator,
+                                char groupacc, int attr, char *str,
+                                unsigned itemflags)
                -- Add a text line str to the given menu window.  If identifier
                   is 0, then the line cannot be selected (e.g. a title).
                   Otherwise, identifier is the value returned if the line is
@@ -324,10 +332,11 @@ add_menu(windid window, int glyph, const anything identifier,
                   accelerator.  It is up to the window-port to make the
                   accelerator visible to the user (e.g. put "a - " in front
                   of str).  The value attr is the same as in putstr().
-                  Glyph is an optional glyph to accompany the line.  If
-                  window port cannot or does not want to display it, this
-                  is OK.  If there is no glyph applicable, then this
-                  value will be NO_GLYPH.
+               -- glyphinfo (glyph_info type) may optionally contain a glyph
+                   to accompany the line. If a window port cannot
+                   or does not want to display it, this is OK.  If there is no
+                   glyph provided, then the value of glyphinfo->glyph will
+                   be NO_GLYPH.
                -- All accelerators should be in the range [A-Za-z],
                   but there are a few exceptions such as the tty player
                   selection code which uses '*'.
index 59f59986624422532af0e8c2a6a19843ad336a52..42ae0eed6bf6417dda40aa5a67c433bd435697eb 100644 (file)
@@ -524,8 +524,8 @@ struct trapinfo {
 typedef struct {
     xchar gnew; /* perhaps move this bit into the rm structure. */
     int glyph;
-#ifndef UNBUFFERED_GLYPHMOD
-    unsigned glyphmod[NUM_GLYPHMOD];
+#ifndef UNBUFFERED_GLYPHINFO
+    glyph_info glyphinfo;
 #endif
 } gbuf_entry;
 
@@ -1213,6 +1213,8 @@ struct const_globals {
 
 E const struct const_globals cg;
 
+E const glyph_info nul_glyphinfo;
+
 #undef E
 
 #endif /* DECL_H */
index 1c944c27672178cb40e652a28426e21bc9b3dafc..e3fa0d816825787111787f962c83dfd64c8c9eb5 100644 (file)
@@ -475,14 +475,14 @@ enum explosion_types {
 #define glyph_is_unexplored(glyph) ((glyph) == GLYPH_UNEXPLORED)
 #define glyph_is_nothing(glyph) ((glyph) == GLYPH_NOTHING)
 
-/* flags for map_glyphmod */
+/* glyphflags for map_glyphinfo */
 
-/* mgflags for altering map_glyphmod() internal behaviour */
+/* mgflags for altering map_glyphinfo() internal behaviour */
 #define MG_FLAG_NORMAL      0x00
 #define MG_FLAG_NOOVERRIDE  0x01
 #define MG_FLAG_RETURNIDX   0x02
 
-/* Special mapped glyph flags encoded in glyphmod[GM_FLAGS] by map_glyphmod() */
+/* Special mapped glyphflags encoded by map_glyphinfo() */
 #define MG_CORPSE  0x0001
 #define MG_INVIS   0x0002
 #define MG_DETECT  0x0004
index 1c54d92f9c8e5f7ae967ac1e8f7c18abd6dac550..a24ca64f3081d7f8da0940a1c4a6bef5f04e036f 100644 (file)
@@ -376,7 +376,7 @@ E void NDECL(reglyph_darkroom);
 E void NDECL(set_wall_state);
 E void FDECL(unset_seenv, (struct rm *, int, int, int, int));
 E int FDECL(warning_of, (struct monst *));
-E void FDECL(map_glyphmod, (XCHAR_P, XCHAR_P, int, unsigned, unsigned *));
+E void FDECL(map_glyphinfo, (XCHAR_P, XCHAR_P, int, unsigned, glyph_info *));
 
 /* ### do.c ### */
 
@@ -3037,6 +3037,7 @@ E void FDECL(dump_redirect, (BOOLEAN_P));
 E void FDECL(dump_forward_putstr, (winid, int, const char*, int));
 E int FDECL(has_color, (int));
 E int FDECL(glyph2ttychar, (int));
+E int FDECL(glyph2symidx, (int));
 E char *FDECL(encglyph, (int));
 E char *FDECL(decode_mixed, (char *, const char *));
 E void FDECL(genl_putmixed, (winid, int, const char *));
index 3f29dce758500de1fbe07c772769cef194e34dd1..4d7689c04e9b9fff1c8547336b3ac14fbd383e40 100644 (file)
@@ -65,7 +65,7 @@ struct text_map_info_t {
 
 struct tile_glyph_info_t {
     unsigned short glyph;
-    unsigned special;
+    unsigned glyphflags;
 };
 
 struct tile_map_info_t {
@@ -443,7 +443,8 @@ E void FDECL(X11_curs, (winid, int, int));
 E void FDECL(X11_putstr, (winid, int, const char *));
 E void FDECL(X11_display_file, (const char *, BOOLEAN_P));
 E void FDECL(X11_start_menu, (winid, unsigned long));
-E void FDECL(X11_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int,
+E void FDECL(X11_add_menu, (winid, const glyph_info *, const ANY_P *,
+                            CHAR_P, CHAR_P, int,
                             const char *, unsigned int));
 E void FDECL(X11_end_menu, (winid, const char *));
 E int FDECL(X11_select_menu, (winid, int, MENU_ITEM_P **));
@@ -454,7 +455,7 @@ E void NDECL(X11_wait_synch);
 E void FDECL(X11_cliparound, (int, int));
 #endif
 E void FDECL(X11_print_glyph, (winid, XCHAR_P, XCHAR_P,
-                               int, int, unsigned *));
+                               const glyph_info *, const glyph_info *));
 E void FDECL(X11_raw_print, (const char *));
 E void FDECL(X11_raw_print_bold, (const char *));
 E int NDECL(X11_nhgetch);
index 001c813e686659e896d3ee1056ee337425434819..bbdb5caa8a88f8fc3ff537379c0c96976401548a 100644 (file)
@@ -80,7 +80,8 @@ extern void curses_curs(winid wid, int x, int y);
 extern void curses_putstr(winid wid, int attr, const char *text);
 extern void curses_display_file(const char *filename, BOOLEAN_P must_exist);
 extern void curses_start_menu(winid wid, unsigned long);
-extern void curses_add_menu(winid wid, int glyph, const ANY_P * identifier,
+extern void curses_add_menu(winid wid, const glyph_info *,
+                            const ANY_P * identifier,
                             CHAR_P accelerator, CHAR_P group_accel, int attr,
                             const char *str, unsigned int itemflags);
 extern void curses_end_menu(winid wid, const char *prompt);
@@ -90,7 +91,7 @@ extern void curses_mark_synch(void);
 extern void curses_wait_synch(void);
 extern void curses_cliparound(int x, int y);
 extern void curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
-                               int glyph, int bkglyph, unsigned *glyphmod);
+                                const glyph_info *, const glyph_info *);
 extern void curses_raw_print(const char *str);
 extern void curses_raw_print_bold(const char *str);
 extern int curses_nhgetch(void);
@@ -174,7 +175,7 @@ extern int curses_character_input_dialog(const char *prompt,
                                          const char *choices, CHAR_P def);
 extern int curses_ext_cmd(void);
 extern void curses_create_nhmenu(winid wid, unsigned long);
-extern void curses_add_nhmenu_item(winid wid, int glyph,
+extern void curses_add_nhmenu_item(winid wid, const glyph_info *,
                                    const ANY_P *identifier, CHAR_P accelerator,
                                    CHAR_P group_accel, int attr,
                                    const char *str, unsigned itemflags);
@@ -194,7 +195,8 @@ extern void curses_status_update(int, genericptr_t, int, int, int,
 /* cursinvt.c */
 
 extern void curses_update_inv(void);
-extern void curses_add_inv(int, int, CHAR_P, attr_t, const char *);
+extern void curses_add_inv(int, const glyph_info *,
+                           CHAR_P, attr_t, const char *);
 
 /* cursinit.c */
 
index f433e1cc6824f1f3526e20387db119a6d1543f33..fbc30bd16a88f4a5196f5a9fec428b38384cc5a0 100644 (file)
@@ -36,7 +36,7 @@ E char NDECL(mar_ask_class);
 E char *NDECL(mar_ask_name);
 E int FDECL(mar_create_window, (int));
 E void FDECL(mar_destroy_nhwindow, (int));
-E void FDECL(mar_print_glyph, (int, int, int, int, int));
+E void FDECL(mar_print_glyph, (int, int, int, const glyph_info *, const glyph_info *));
 E void FDECL(mar_print_line, (int, int, int, char *));
 E void FDECL(mar_set_message, (char *, char *, char *));
 E Gem_menu_item *NDECL(mar_hol_inv);
@@ -70,7 +70,8 @@ E void FDECL(Gem_curs, (winid, int, int));
 E void FDECL(Gem_putstr, (winid, int, const char *));
 E void FDECL(Gem_display_file, (const char *, BOOLEAN_P));
 E void FDECL(Gem_start_menu, (winid, unsigned long));
-E void FDECL(Gem_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int,
+E void FDECL(Gem_add_menu, (winid, const glyph_info *,
+                            const ANY_P *, CHAR_P, CHAR_P, int,
                             const char *, unsigned int));
 E void FDECL(Gem_end_menu, (winid, const char *));
 E int FDECL(Gem_select_menu, (winid, int, MENU_ITEM_P **));
@@ -85,7 +86,7 @@ E void FDECL(Gem_cliparound, (int, int));
 E void FDECL(Gem_update_positionbar, (char *));
 #endif
 E void FDECL(Gem_print_glyph, (winid, XCHAR_P, XCHAR_P,
-                                int, int, unsigned *));
+                               const glyph_info *, const glyph_info *));
 E void FDECL(Gem_raw_print, (const char *));
 E void FDECL(Gem_raw_print_bold, (const char *));
 E int NDECL(Gem_nhgetch);
index 728e35067ae4f2ac78b8b3c49c7359dfe3177721..e304b8a1ce5dd66c2ae7622aedb8ac42e3cdc52e 100644 (file)
@@ -31,8 +31,9 @@ struct window_procs {
     void FDECL((*win_putmixed), (winid, int, const char *));
     void FDECL((*win_display_file), (const char *, BOOLEAN_P));
     void FDECL((*win_start_menu), (winid, unsigned long));
-    void FDECL((*win_add_menu), (winid, int, const ANY_P *, CHAR_P, CHAR_P,
-                                 int, const char *, unsigned int));
+    void FDECL((*win_add_menu), (winid, const glyph_info *, const ANY_P *,
+                                 CHAR_P, CHAR_P, int,
+                                 const char *, unsigned int));
     void FDECL((*win_end_menu), (winid, const char *));
     int FDECL((*win_select_menu), (winid, int, MENU_ITEM_P **));
     char FDECL((*win_message_menu), (CHAR_P, int, const char *));
@@ -46,7 +47,7 @@ struct window_procs {
     void FDECL((*win_update_positionbar), (char *));
 #endif
     void FDECL((*win_print_glyph), (winid, XCHAR_P, XCHAR_P,
-                                    int, int, unsigned *));
+                                    const glyph_info *, const glyph_info *));
     void FDECL((*win_raw_print), (const char *));
     void FDECL((*win_raw_print_bold), (const char *));
     int NDECL((*win_nhgetch));
@@ -332,8 +333,9 @@ struct chain_procs {
     void FDECL((*win_putmixed), (CARGS, winid, int, const char *));
     void FDECL((*win_display_file), (CARGS, const char *, BOOLEAN_P));
     void FDECL((*win_start_menu), (CARGS, winid, unsigned long));
-    void FDECL((*win_add_menu), (CARGS, winid, int, const ANY_P *, CHAR_P,
-                                 CHAR_P, int, const char *, unsigned int));
+    void FDECL((*win_add_menu), (CARGS, winid, const glyph_info *,
+                                 const ANY_P *, CHAR_P, CHAR_P, int,
+                                 const char *, unsigned int));
     void FDECL((*win_end_menu), (CARGS, winid, const char *));
     int FDECL((*win_select_menu), (CARGS, winid, int, MENU_ITEM_P **));
     char FDECL((*win_message_menu), (CARGS, CHAR_P, int, const char *));
@@ -347,7 +349,8 @@ struct chain_procs {
     void FDECL((*win_update_positionbar), (CARGS, char *));
 #endif
     void FDECL((*win_print_glyph), (CARGS, winid, XCHAR_P, XCHAR_P,
-                                    int, int, unsigned *));
+                                    const glyph_info *,
+                                    const glyph_info *));
     void FDECL((*win_raw_print), (CARGS, const char *));
     void FDECL((*win_raw_print_bold), (CARGS, const char *));
     int FDECL((*win_nhgetch), (CARGS));
@@ -408,8 +411,9 @@ extern void FDECL(safe_putstr, (winid, int, const char *));
 extern void FDECL(safe_putmixed, (winid, int, const char *));
 extern void FDECL(safe_display_file, (const char *, BOOLEAN_P));
 extern void FDECL(safe_start_menu, (winid, unsigned long));
-extern void FDECL(safe_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P,
-                                  int, const char *, unsigned int));
+extern void FDECL(safe_add_menu, (winid, const glyph_info *, const ANY_P *,
+                                  CHAR_P, CHAR_P, int, const char *,
+                                  unsigned int));
 extern void FDECL(safe_end_menu, (winid, const char *));
 extern int FDECL(safe_select_menu, (winid, int, MENU_ITEM_P **));
 extern char FDECL(safe_message_menu, (CHAR_P, int, const char *));
@@ -423,7 +427,7 @@ extern void FDECL(safe_cliparound, (int, int));
 extern void FDECL(safe_update_positionbar, (char *));
 #endif
 extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P,
-                                     int, int, unsigned *));
+                                     const glyph_info *, const glyph_info *));
 extern void FDECL(safe_raw_print, (const char *));
 extern void FDECL(safe_raw_print_bold, (const char *));
 extern int NDECL(safe_nhgetch);
index 5d1d444d06dd3e529046e83b4033ea4aa24032cb..0144475a7a730569bc876a2dc93bab3d11cce506 100644 (file)
@@ -197,8 +197,9 @@ E void FDECL(tty_curs, (winid, int, int));
 E void FDECL(tty_putstr, (winid, int, const char *));
 E void FDECL(tty_display_file, (const char *, BOOLEAN_P));
 E void FDECL(tty_start_menu, (winid, unsigned long));
-E void FDECL(tty_add_menu, (winid, int, const ANY_P *, CHAR_P, CHAR_P, int,
-                            const char *, unsigned int));
+E void FDECL(tty_add_menu, (winid, const glyph_info *, const ANY_P *,
+                            CHAR_P, CHAR_P, int, const char *,
+                            unsigned int));
 E void FDECL(tty_end_menu, (winid, const char *));
 E int FDECL(tty_select_menu, (winid, int, MENU_ITEM_P **));
 E char FDECL(tty_message_menu, (CHAR_P, int, const char *));
@@ -211,7 +212,8 @@ E void FDECL(tty_cliparound, (int, int));
 #ifdef POSITIONBAR
 E void FDECL(tty_update_positionbar, (char *));
 #endif
-E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *));
+E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P,
+                               const glyph_info *, const glyph_info *));
 E void FDECL(tty_raw_print, (const char *));
 E void FDECL(tty_raw_print_bold, (const char *));
 E int NDECL(tty_nhgetch);
index 534421f2ce45ac4f201af56c9b6430b9b9983e2d..95933986f76e38d4eafead1c39962ec41216c62a 100644 (file)
@@ -52,6 +52,19 @@ enum any_types {
     ANY_MASK32       /* 32-bit mask (stored as unsigned long) */
 };
 
+/* glyph plus additional info */
+typedef struct gi {
+    int glyph;            /* the display entity */
+    int color;            /* color for window ports not using a tile */
+    int ttychar;          /* the character mapping for the original tty
+                             interace. Most or all window ports wanted
+                             and used this for various things so it is
+                             provided in 3.7+ */
+    short int symidx;     /* offset into syms array */
+    unsigned glyphflags;  /* more detail about the nature of the entity */
+} glyph_info;
+#define GLYPH_INFO_P struct gi
+
 /* menu return list */
 typedef struct mi {
     anything item;     /* identifier */
index 737836f156f360fb999ab96b02ee05cc1ab7e62d..fdc179e527b2ec8cd193b3b75e3cd485f0a5ecf5 100644 (file)
@@ -3308,14 +3308,14 @@ struct obj *obj;
         start_menu(tmpwin, MENU_BEHAVE_STANDARD);
         any.a_int++;
         Sprintf(buf, "an object on the %s", surface(cc.x, cc.y));
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
         any.a_int++;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "a monster",
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+                 "a monster", MENU_ITEMFLAGS_NONE);
         any.a_int++;
         Sprintf(buf, "the %s", surface(cc.x, cc.y));
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
         end_menu(tmpwin, "Aim for what?");
         tohit = rn2(4);
index 7bb0fc7d0d40575ab2600836c398c63787c22a96..b9bca5126bd94b6bbc19bcf4f022f029e465ab7d 100644 (file)
@@ -1545,8 +1545,8 @@ struct obj *obj;
                 if (!g.dungeons[i].dunlev_ureached)
                     continue;
                 any.a_int = i + 1;
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
-                         g.dungeons[i].dname, MENU_ITEMFLAGS_NONE);
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, g.dungeons[i].dname, MENU_ITEMFLAGS_NONE);
                 num_ok_dungeons++;
                 last_ok_dungeon = i;
             }
index ab225740c45e6889961c7b8f543833b9f49be0e7..b99de1ed0920ed2a33b43468c2eea5d13642b93f 100644 (file)
@@ -1075,19 +1075,19 @@ cond_menu(VOID_ARGS)
         Sprintf(mbuf, "change sort order from \"%s\" to \"%s\"",
                 menutitle[g.condmenu_sortorder],
                 menutitle[1 - g.condmenu_sortorder]);
-        add_menu(tmpwin, NO_GLYPH, &any, 'S', 0, ATR_NONE, mbuf,
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'S', 0, ATR_NONE,
+                 mbuf, MENU_ITEMFLAGS_NONE);
         any = cg.zeroany;
         Sprintf(mbuf, "sorted %s", menutitle[g.condmenu_sortorder]);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, mbuf,
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                 iflags.menu_headings, mbuf, MENU_ITEMFLAGS_NONE);
         for (i = 0; i < SIZE(condtests); i++) {
             idx = sequence[i];
             Sprintf(mbuf, "cond_%-14s", condtests[idx].useroption);
             any = cg.zeroany;
             any.a_int = idx + 2; /* avoid zero and the sort change pick */
             condtests[idx].choice = FALSE;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      mbuf,
                      condtests[idx].enabled
                         ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
@@ -2346,7 +2346,7 @@ int arrmin, arrmax;
     for (i = arrmin; i < arrmax; i++) {
         any = cg.zeroany;
         any.a_int = i + adj;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  arr[i], MENU_ITEMFLAGS_NONE);
     }
 
@@ -2691,7 +2691,7 @@ query_conditions()
     for (i = 0; i < SIZE(conditions); i++) {
         any = cg.zeroany;
         any.a_ulong = conditions[i].mask;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  conditions[i].text[0], MENU_ITEMFLAGS_NONE);
     }
 
@@ -3260,7 +3260,7 @@ status_hilite_menu_choose_field()
 #endif
         any = cg.zeroany;
         any.a_int = (i + 1);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  initblstats[i].fldname, MENU_ITEMFLAGS_NONE);
     }
 
@@ -3299,7 +3299,7 @@ int fld;
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_ALWAYS_HILITE;
         Sprintf(buf, "Always highlight %s", initblstats[fld].fldname);
-        add_menu(tmpwin, NO_GLYPH, &any, 'a', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'a', 0, ATR_NONE,
                  buf, MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3307,7 +3307,7 @@ int fld;
     if (fld == BL_CONDITION) {
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_CONDITION;
-        add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'b', 0, ATR_NONE,
                  "Bitmask of conditions", MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3316,7 +3316,7 @@ int fld;
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_UPDOWN;
         Sprintf(buf, "%s value changes", initblstats[fld].fldname);
-        add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'c', 0, ATR_NONE,
                  buf, MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3325,7 +3325,7 @@ int fld;
         && (at == ANY_INT || at == ANY_LONG)) {
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_VAL_ABSOLUTE;
-        add_menu(tmpwin, NO_GLYPH, &any, 'n', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'n', 0, ATR_NONE,
                  "Number threshold", MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3333,7 +3333,7 @@ int fld;
     if (initblstats[fld].idxmax >= 0) {
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_VAL_PERCENTAGE;
-        add_menu(tmpwin, NO_GLYPH, &any, 'p', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'p', 0, ATR_NONE,
                  "Percentage threshold", MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3343,7 +3343,7 @@ int fld;
         any = cg.zeroany;
         any.a_int = onlybeh = BL_TH_TEXTMATCH;
         Sprintf(buf, "%s text match", initblstats[fld].fldname);
-        add_menu(tmpwin, NO_GLYPH, &any, 't', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 't', 0, ATR_NONE,
                  buf, MENU_ITEMFLAGS_NONE);
         nopts++;
     }
@@ -3390,7 +3390,7 @@ boolean ltok, gtok;
             Sprintf(buf, "Value goes down");
         any = cg.zeroany;
         any.a_int = 10 + LT_VALUE;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  buf, MENU_ITEMFLAGS_NONE);
 
         if (str) {
@@ -3398,7 +3398,7 @@ boolean ltok, gtok;
                     str, (fld == BL_AC) ? "better (lower)" : "less");
             any = cg.zeroany;
             any.a_int = 10 + LE_VALUE;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      buf, MENU_ITEMFLAGS_NONE);
         }
     }
@@ -3409,7 +3409,7 @@ boolean ltok, gtok;
         Sprintf(buf, "Value changes");
     any = cg.zeroany;
     any.a_int = 10 + EQ_VALUE;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              buf, MENU_ITEMFLAGS_NONE);
 
     if (gtok) {
@@ -3418,7 +3418,7 @@ boolean ltok, gtok;
                     str, (fld == BL_AC) ? "worse (higher)" : "more");
             any = cg.zeroany;
             any.a_int = 10 + GE_VALUE;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      buf, MENU_ITEMFLAGS_NONE);
         }
 
@@ -3429,7 +3429,7 @@ boolean ltok, gtok;
             Sprintf(buf, "Value goes up");
         any = cg.zeroany;
         any.a_int = 10 + GT_VALUE;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              buf, MENU_ITEMFLAGS_NONE);
     }
     Sprintf(buf, "Select field %s value:", initblstats[fld].fldname);
@@ -3931,7 +3931,7 @@ int fld;
             if (hlstr->fld == fld) {
                 any = cg.zeroany;
                 any.a_int = hlstr->id;
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                          hlstr->str, MENU_ITEMFLAGS_NONE);
             }
             hlstr = hlstr->next;
@@ -3939,19 +3939,19 @@ int fld;
     } else {
         any = cg.zeroany;
         Sprintf(buf, "No current hilites for %s", initblstats[fld].fldname);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
     }
 
     /* separator line */
     any = cg.zeroany;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "",
              MENU_ITEMFLAGS_NONE);
 
     if (count) {
         any = cg.zeroany;
         any.a_int = -1;
-        add_menu(tmpwin, NO_GLYPH, &any, 'X', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'X', 0, ATR_NONE,
                  "Remove selected hilites",
                  MENU_ITEMFLAGS_NONE);
     }
@@ -3968,7 +3968,7 @@ int fld;
     {
         any = cg.zeroany;
         any.a_int = -2;
-        add_menu(tmpwin, NO_GLYPH, &any, 'Z', 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'Z', 0, ATR_NONE,
                  "Add a new hilite", MENU_ITEMFLAGS_NONE);
     }
 
@@ -4064,12 +4064,12 @@ shlmenu_redo:
     if (countall) {
         any = cg.zeroany;
         any.a_int = -1;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "View all hilites in config format",
                  MENU_ITEMFLAGS_NONE);
 
         any = cg.zeroany;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "",
                  MENU_ITEMFLAGS_NONE);
     }
 
@@ -4090,7 +4090,7 @@ shlmenu_redo:
         Sprintf(buf, "%-18s", initblstats[i].fldname);
         if (count)
             Sprintf(eos(buf), " (%d defined)", count);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  buf, MENU_ITEMFLAGS_NONE);
     }
 
index 7425264f5707af9b048b16c3b7643ec8ea13bd32..6eb890c7a393fe9bdc63135a2549e08cfec42f1c 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -356,11 +356,11 @@ const struct ext_func_tab *efp; /* if Null, add a footnote to the menu */
         char qbuf[QBUFSZ];
         anything any = cg.zeroany;
 
-        add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "[A] Command autocompletes", MENU_ITEMFLAGS_NONE);
         Sprintf(qbuf, "[m] Command accepts '%c' prefix",
                 g.Cmd.spkeys[NHKF_REQMENU]);
-        add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE, qbuf,
+        add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, qbuf,
                  MENU_ITEMFLAGS_NONE);
         return (char *) 0;
     } else {
@@ -405,16 +405,16 @@ doextlist(VOID_ARGS)
         redisplay = FALSE;
         any = cg.zeroany;
         start_menu(menuwin, MENU_BEHAVE_STANDARD);
-        add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "Extended Commands List",
                  MENU_ITEMFLAGS_NONE);
-        add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "", MENU_ITEMFLAGS_NONE);
 
         Sprintf(buf, "Switch to %s commands that don't autocomplete",
                 menumode ? "including" : "excluding");
         any.a_int = 1;
-        add_menu(menuwin, NO_GLYPH, &any, 'a', 0, ATR_NONE, buf,
+        add_menu(menuwin, &nul_glyphinfo, &any, 'a', 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
 
         if (!*searchbuf) {
@@ -424,7 +424,7 @@ doextlist(VOID_ARGS)
                actual list of extended commands shown via separator lines;
                having ':' as an explicit selector overrides the default
                menu behavior for it; we retain 's' as a group accelerator */
-            add_menu(menuwin, NO_GLYPH, &any, ':', 's', ATR_NONE,
+            add_menu(menuwin, &nul_glyphinfo, &any, ':', 's', ATR_NONE,
                      "Search extended commands",
                      MENU_ITEMFLAGS_NONE);
         } else {
@@ -437,18 +437,18 @@ doextlist(VOID_ARGS)
                also want to hide it from general menu use) because it won't
                work for interfaces which support ':' to search; use as a
                general menu command takes precedence over group accelerator */
-            add_menu(menuwin, NO_GLYPH, &any, 's', ':', ATR_NONE,
+            add_menu(menuwin, &nul_glyphinfo, &any, 's', ':', ATR_NONE,
                      buf, MENU_ITEMFLAGS_NONE);
         }
         if (wizard) {
             any.a_int = 4;
-            add_menu(menuwin, NO_GLYPH, &any, 'z', 0, ATR_NONE,
+            add_menu(menuwin, &nul_glyphinfo, &any, 'z', 0, ATR_NONE,
           onelist ? "Switch to showing debugging commands in separate section"
        : "Switch to showing all alphabetically, including debugging commands",
                      MENU_ITEMFLAGS_NONE);
         }
         any = cg.zeroany;
-        add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "", MENU_ITEMFLAGS_NONE);
         menushown[0] = menushown[1] = 0;
         n = 0;
@@ -490,7 +490,7 @@ doextlist(VOID_ARGS)
                    results menu. */
                 if (!menushown[pass]) {
                     Strcpy(buf, headings[pass]);
-                    add_menu(menuwin, NO_GLYPH, &any, 0, 0,
+                    add_menu(menuwin, &nul_glyphinfo, &any, 0, 0,
                              iflags.menu_headings, buf,
                              MENU_ITEMFLAGS_NONE);
                     menushown[pass] = 1;
@@ -499,16 +499,16 @@ doextlist(VOID_ARGS)
                    2nd field will be "    " or " [A]" or " [m]" or "[mA]" */
                 Sprintf(buf, " %-14s %4s %s", efp->ef_txt,
                         doc_extcmd_flagstr(menuwin, efp), efp->ef_desc);
-                add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                          buf, MENU_ITEMFLAGS_NONE);
                 ++n;
             }
             if (n)
-                add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                          "", MENU_ITEMFLAGS_NONE);
         }
         if (*searchbuf && !n)
-            add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(menuwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      "no matches", MENU_ITEMFLAGS_NONE);
         else
             (void) doc_extcmd_flagstr(menuwin, (struct ext_func_tab *) 0);
@@ -647,8 +647,8 @@ extcmd_via_menu()
                     /* flush extended cmds for that letter already in buf */
                     Sprintf(buf, fmtstr, prompt);
                     any.a_char = prevaccelerator;
-                    add_menu(win, NO_GLYPH, &any, any.a_char, 0, ATR_NONE,
-                             buf, MENU_ITEMFLAGS_NONE);
+                    add_menu(win, &nul_glyphinfo, &any, any.a_char,
+                             0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
                     acount = 0;
                     if (!(accelerator != prevaccelerator || one_per_line))
                         wastoolong = TRUE;
@@ -671,8 +671,8 @@ extcmd_via_menu()
             /* flush buf */
             Sprintf(buf, fmtstr, prompt);
             any.a_char = prevaccelerator;
-            add_menu(win, NO_GLYPH, &any, any.a_char, 0, ATR_NONE, buf,
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, any.a_char, 0,
+                     ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
         }
         Sprintf(prompt, "Extended Command: %s", cbuf);
         end_menu(win, prompt);
@@ -1584,8 +1584,8 @@ wiz_intrinsic(VOID_ARGS)
                    ordering, not their numerical PROP values), can only be
                    set to timed values here so show a separator */
                 any.a_int = 0;
-                add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "--",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, "--", MENU_ITEMFLAGS_NONE);
             }
             any.a_int = i + 1; /* +1: avoid 0 */
             oldtimeout = u.uprops[p].intrinsic & TIMEOUT;
@@ -1593,7 +1593,7 @@ wiz_intrinsic(VOID_ARGS)
                 Sprintf(buf, "%-27s [%li]", propname, oldtimeout);
             else
                 Sprintf(buf, "%s", propname);
-            add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+            add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                      MENU_ITEMFLAGS_NONE);
         }
         end_menu(win, "Which intrinsics?");
@@ -1719,29 +1719,29 @@ doterrain(VOID_ARGS)
     start_menu(men, MENU_BEHAVE_STANDARD);
     any = cg.zeroany;
     any.a_int = 1;
-    add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "known map without monsters, objects, and traps",
              MENU_ITEMFLAGS_SELECTED);
     any.a_int = 2;
-    add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "known map without monsters and objects",
              MENU_ITEMFLAGS_NONE);
     any.a_int = 3;
-    add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "known map without monsters",
              MENU_ITEMFLAGS_NONE);
     if (discover || wizard) {
         any.a_int = 4;
-        add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "full map without monsters, objects, and traps",
                  MENU_ITEMFLAGS_NONE);
         if (wizard) {
             any.a_int = 5;
-            add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      "internal levl[][].typ codes in base-36",
                      MENU_ITEMFLAGS_NONE);
             any.a_int = 6;
-            add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(men, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      "legend of base-36 levl[][].typ codes",
                      MENU_ITEMFLAGS_NONE);
         }
@@ -4072,7 +4072,7 @@ const char *text;
     if ((ch = cmd_from_func(func)) != '\0') {
         any = cg.zeroany;
         any.a_nfunc = func;
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, text,
+        add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, text,
                  MENU_ITEMFLAGS_NONE);
     }
 }
index fd96e99fbd1b55b174ea606c2e53126295e1fad1..62906163a691e73e1aab28dad842a3bfa32e4afe 100644 (file)
@@ -700,6 +700,10 @@ const struct const_globals cg = {
     DUMMY, /* zeroany */
 };
 
+/* glyph, color, ttychar, symidx, glyphflags */
+const glyph_info nul_glyphinfo =
+    { NO_GLYPH, NO_COLOR, ' ', 0, MG_UNEXPL };
+
 #define ZERO(x) memset(&x, 0, sizeof(x))
 
 void
index efb56d7b37df3d36b92aceba76e3d4b067745634..4c4419417d3ab508fcf6c13a622d9750c94fb197 100644 (file)
@@ -2006,12 +2006,12 @@ dump_map()
         lastnonblank = -1; /* buf[] index rather than map's x */
         for (x = 1; x < COLNO; x++) {
             int ch;
-            unsigned glyphmod[NUM_GLYPHMOD];
+            glyph_info glyphinfo;
 
             glyph = reveal_terrain_getglyph(x, y, FALSE, u.uswallow,
                                             default_glyph, subset);
-            map_glyphmod(x, y, glyph, 0, glyphmod);
-            ch = (int) glyphmod[GM_TTYCHAR];
+            map_glyphinfo(x, y, glyph, 0, &glyphinfo);
+            ch = glyphinfo.ttychar;
             buf[x - 1] = ch;
             if (ch != ' ') {
                 blankrow = FALSE;
index ea7c4080e463ede05ba73ea1501a6367fac36f84..5ceaf7e1e0399c7f188d655d87f70ba27bae51e6 100644 (file)
@@ -132,8 +132,8 @@ static void FDECL(display_warning, (struct monst *));
 static int FDECL(check_pos, (int, int, int));
 static int FDECL(get_bk_glyph, (XCHAR_P, XCHAR_P));
 static int FDECL(tether_glyph, (int, int));
-#ifdef UNBUFFERED_GLYPHMOD
-static unsigned *FDECL(glyphmod_at, (XCHAR_P, XCHAR_P, int));
+#ifdef UNBUFFERED_GLYPHINFO
+static glyph_info *FDECL(glyphinfo_at, (XCHAR_P, XCHAR_P, int));
 #endif
 
 /*#define WA_VERBOSE*/ /* give (x,y) locations for all "bad" spots */
@@ -1370,16 +1370,16 @@ see_traps()
     }
 }
 
-static unsigned no_gm[NUM_GLYPHMOD] = {
-    MG_BADXY, (unsigned) ' ', (unsigned) NO_COLOR
+static glyph_info no_ginfo = {
+    NO_GLYPH, 0, NO_COLOR, ' ', MG_BADXY
 };
-#ifndef UNBUFFERED_GLYPHMOD
-#define Glyphmod_at(x, y, glyph) \
-    (((x) < 0 || (y) < 0 || (x) >= COLNO || (y) >= ROWNO) ? &no_gm[0]   \
-     : &g.gbuf[(y)][(x)].glyphmod[0])
+#ifndef UNBUFFERED_GLYPHINFO
+#define Glyphinfo_at(x, y, glyph) \
+    (((x) < 0 || (y) < 0 || (x) >= COLNO || (y) >= ROWNO) ? &no_ginfo   \
+     : &g.gbuf[(y)][(x)].glyphinfo)
 #else
-static unsigned gm[NUM_GLYPHMOD];
-#define Glyphmod_at(x, y, glyph) glyphmod_at(x, y, glyph)
+static glyph_info ginfo;
+#define Glyphinfo_at(x, y, glyph) glyphinfo_at(x, y, glyph)
 #endif
 
 /*
@@ -1457,6 +1457,7 @@ void
 redraw_map()
 {
     int x, y, glyph;
+    glyph_info bkglyphinfo = nul_glyphinfo;
 
     /*
      * Not sure whether this is actually necessary; save and restore did
@@ -1477,8 +1478,9 @@ redraw_map()
     for (y = 0; y < ROWNO; ++y)
         for (x = 1; x < COLNO; ++x) {
             glyph = glyph_at(x, y); /* not levl[x][y].glyph */
-            print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y),
-                        Glyphmod_at(x, y, glyph));
+            bkglyphinfo.glyph = get_bk_glyph(x, y);
+            print_glyph(WIN_MAP, x, y,
+                        Glyphinfo_at(x, y, glyph), &bkglyphinfo);
         }
     flush_screen(1);
 }
@@ -1540,8 +1542,8 @@ void
 show_glyph(x, y, glyph)
 int x, y, glyph;
 {
-#ifndef UNBUFFERED_GLYPHMOD
-    unsigned glyphmod[NUM_GLYPHMOD];
+#ifndef UNBUFFERED_GLYPHINFO
+    glyph_info glyphinfo;
 #endif
 
     /*
@@ -1608,26 +1610,27 @@ int x, y, glyph;
                    MAX_GLYPH, x, y);
         return;
     }
-#ifndef UNBUFFERED_GLYPHMOD
-    /* without UNBUFFERED_GLYPHMOD defined the glyphmod values are buffered
+#ifndef UNBUFFERED_GLYPHINFO
+    /* without UNBUFFERED_GLYPHINFO defined the glyphinfo values are buffered
        alongside the glyphs themselves for better performance, increased
        buffer size */
-    map_glyphmod(x, y, glyph, 0, glyphmod);
+    map_glyphinfo(x, y, glyph, 0, &glyphinfo);
 #endif
 
     if (g.gbuf[y][x].glyph != glyph
-#ifndef UNBUFFERED_GLYPHMOD
+#ifndef UNBUFFERED_GLYPHINFO
            /* I don't think we have to test for changes in TTYCHAR or COLOR
               because they typically only change if the glyph changed */
-            || g.gbuf[y][x].glyphmod[GM_FLAGS] != glyphmod[GM_FLAGS]
+            || g.gbuf[y][x].glyphinfo.glyphflags != glyphinfo.glyphflags
 #endif
             || iflags.use_background_glyph ) {
         g.gbuf[y][x].glyph = glyph;
         g.gbuf[y][x].gnew = 1;
-#ifndef UNBUFFERED_GLYPHMOD
-        g.gbuf[y][x].glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS];
-        g.gbuf[y][x].glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR];
-        g.gbuf[y][x].glyphmod[GM_COLOR] = glyphmod[GM_COLOR];
+#ifndef UNBUFFERED_GLYPHINFO
+        g.gbuf[y][x].glyphinfo.glyph = glyphinfo.glyph;
+        g.gbuf[y][x].glyphinfo.glyphflags = glyphinfo.glyphflags;
+        g.gbuf[y][x].glyphinfo.ttychar = glyphinfo.ttychar;
+        g.gbuf[y][x].glyphinfo.color = glyphinfo.color;
 #endif
         if (g.gbuf_start[y] > x)
             g.gbuf_start[y] = x;
@@ -1653,7 +1656,7 @@ int x, y, glyph;
 static gbuf_entry nul_gbuf = {
         0,                      /* gnew */
         GLYPH_UNEXPLORED,       /* glyph */
-#ifndef UNBUFFERED_GLYPHMOD
+#ifndef UNBUFFERED_GLYPHINFO
         {(unsigned) ' ', (unsigned) NO_COLOR, MG_UNEXPL},
 #endif
 };
@@ -1666,22 +1669,22 @@ clear_glyph_buffer()
 {
     register int x, y;
     gbuf_entry *gptr = &g.gbuf[0][0];
-    unsigned *gmptr =
-#ifndef UNBUFFERED_GLYPHMOD
-                        &gptr->glyphmod[0];
+    glyph_info *giptr =
+#ifndef UNBUFFERED_GLYPHINFO
+                        &gptr->glyphinfo;
 #else
-                        &gm[0];
+                        &ginfo;
 
-    map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr);
+    map_glyphinfo(0, 0, GLYPH_UNEXPLORED, 0, giptr);
 #endif
-#ifndef UNBUFFERED_GLYPHMOD
-    nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR]
-                     || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR]
-                     || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS])
+#ifndef UNBUFFERED_GLYPHINFO
+    nul_gbuf.gnew = (giptr->ttychar != nul_gbuf.glyphinfo.ttychar
+                     || giptr->color != nul_gbuf.glyphinfo.color
+                     || giptr->glyphflags != nul_gbuf.glyphinfo.glyphflags)
 #else
-    nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != ' '
-                     || gmptr[GM_COLOR] != NO_COLOR
-                     || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0)
+    nul_gbuf.gnew = (giptr->ttychar != ' '
+                     || giptr->color != NO_COLOR
+                     || (giptr->glyphflags & ~MG_UNEXPL) != 0)
 #endif
                          ? 1 : 0;
     for (y = 0; y < ROWNO; y++) {
@@ -1703,30 +1706,33 @@ int start, stop, y;
     register int x, glyph;
     register boolean force;
     gbuf_entry *gptr = &g.gbuf[0][0];
-    unsigned *gmptr =
-#ifndef UNBUFFERED_GLYPHMOD
-                        &gptr->glyphmod[0];
+    glyph_info bkglyphinfo = nul_glyphinfo;
+    glyph_info *giptr =
+#ifndef UNBUFFERED_GLYPHINFO
+                        &gptr->glyphinfo;
 #else
-                        &gm[0];
+                        &ginfo;
 
-    map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr);
+    map_glyphinfo(0, 0, GLYPH_UNEXPLORED, 0U, giptr);
 #endif
-#ifndef UNBUFFERED_GLYPHMOD
-    force = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR]
-                 || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR]
-                 || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS])
+#ifndef UNBUFFERED_GLYPHINFO
+    force = (giptr->ttychar != nul_gbuf.glyphinfo.ttychar
+                 || giptr->color != nul_gbuf.glyphinfo.color
+                 || giptr->glyphflags != nul_gbuf.glyphinfo.glyphflags)
 #else
-    force = (gmptr[GM_TTYCHAR] != ' '
-                 || gmptr[GM_COLOR] != NO_COLOR
-                 || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0)
+    force = (giptr->ttychar != ' '
+                 || giptr->color != NO_COLOR
+                 || (giptr->glyphflags & ~MG_UNEXPL) != 0)
 #endif
                  ? 1 : 0;
     for (x = start; x <= stop; x++) {
         gptr = &g.gbuf[y][x];
         glyph = gptr->glyph;
-        if (force || glyph != GLYPH_UNEXPLORED)
-            print_glyph(WIN_MAP, x, y, glyph,
-                        get_bk_glyph(x, y), Glyphmod_at(x, y, glyph));
+        if (force || glyph != GLYPH_UNEXPLORED) {
+            bkglyphinfo.glyph = get_bk_glyph(x, y);
+            print_glyph(WIN_MAP, x, y,
+                        Glyphinfo_at(x, y, glyph), &bkglyphinfo);
+       }
     }
 }
 
@@ -1759,6 +1765,7 @@ int cursor_on_u;
     static int flushing = 0;
     static int delay_flushing = 0;
     register int x, y;
+    glyph_info bkglyphinfo = nul_glyphinfo;
 
     /* 3.7: don't update map, status, or perm_invent during save/restore */
     if (g.program_state.saving || g.program_state.restoring)
@@ -1781,8 +1788,9 @@ int cursor_on_u;
 
         for (; x <= g.gbuf_stop[y]; gptr++, x++)
             if (gptr->gnew) {
-                print_glyph(WIN_MAP, x, y, gptr->glyph,
-                            get_bk_glyph(x, y), Glyphmod_at(x, y, gptr->glyph));
+                bkglyphinfo.glyph = get_bk_glyph(x, y);            
+                print_glyph(WIN_MAP, x, y,
+                            Glyphinfo_at(x, y, gptr->glyph), &bkglyphinfo);
                 gptr->gnew = 0;
             }
     }
@@ -2000,14 +2008,14 @@ xchar x, y;
     return g.gbuf[y][x].glyph;
 }
 
-#ifdef UNBUFFERED_GLYPHMOD
-unsigned *
-glyphmod_at(x, y, glyph)
+#ifdef UNBUFFERED_GLYPHINFO
+glyph_info *
+glyphinfo_at(x, y, glyph)
 xchar x, y;
 int glyph;
 {
-    map_glyphmod(x, y, glyph, 0, gm);
-    return &gm[0];
+    map_glyphinfo(x, y, glyph, 0, &ginfo);
+    return &ginfo;
 }
 #endif
 
@@ -2133,10 +2141,11 @@ static const int explcolors[] = {
 #define GMAP_ALTARCOLOR          0x00000004
 
 void
-map_glyphmod(x, y, glyph, mgflags, glyphmod)
+map_glyphinfo(x, y, glyph, mgflags, glyphinfo)
 xchar x, y;
 int glyph;
-unsigned mgflags, *glyphmod;
+unsigned mgflags;
+glyph_info *glyphinfo;
 {
     register int offset, idx;
     int color = NO_COLOR;
@@ -2151,9 +2160,10 @@ unsigned mgflags, *glyphmod;
             do_mon_checks = FALSE;
 
     if (x < 0 || y < 0 || x >= COLNO || y >= ROWNO) {
-        glyphmod[GM_FLAGS] = MG_BADXY;
-        glyphmod[GM_COLOR] = NO_COLOR;
-        glyphmod[GM_TTYCHAR] = ' ';
+        glyphinfo->glyph = NO_GLYPH;
+        glyphinfo->glyphflags = MG_BADXY;
+        glyphinfo->color = NO_COLOR;
+        glyphinfo->ttychar = ' ';
         return;
     }
 
@@ -2426,17 +2436,17 @@ unsigned mgflags, *glyphmod;
         }
     }
 
-    glyphmod[GM_TTYCHAR] = ((mgflags & MG_FLAG_RETURNIDX) != 0) ? idx
-                           : g.showsyms[idx];
-
+    glyphinfo->symidx = idx;
+    glyphinfo->ttychar = g.showsyms[idx];
 #ifdef TEXTCOLOR
     /* Turn off color if no color defined, or rogue level w/o PC graphics. */
     if (!has_color(color)
         || ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL) && !has_rogue_color))
 #endif
         color = NO_COLOR;
-    glyphmod[GM_COLOR] = color;
-    glyphmod[GM_FLAGS] = special;
+    glyphinfo->color = color;
+    glyphinfo->glyphflags = special;
+    glyphinfo->glyph = glyph;
 }
 
 /* ------------------------------------------------------------------------ */
index 73ababd87cc1f49e3f744dd7faba6839d0a59631..241d1d5dfd7961edfded596ef19b91eb142041f7 100644 (file)
--- a/src/do.c
+++ b/src/do.c
@@ -1617,7 +1617,7 @@ boolean at_stairs, falling, portal;
 
     /* Reset the screen. */
     vision_reset(); /* reset the blockages */
-    g.glyphmap_perlevel_flags = 0L; /* force per-level map_glyphmod() changes */
+    g.glyphmap_perlevel_flags = 0L; /* force per-level map_glyphinfo() changes */
     docrt();        /* does a full vision recalc */
     flush_screen(-1);
 
index 8a757fb7eef126b83cf91d9bf172f1de0f836846..4958c600b4cf5c6ce1377ec2358a75a8c5e606a1 100644 (file)
@@ -612,8 +612,8 @@ int gloc;
                               iflags.getpos_coords);
             Sprintf(fullbuf, "%s%s%s", firstmatch,
                     (*tmpbuf ? " " : ""), tmpbuf);
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, fullbuf,
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, fullbuf, MENU_ITEMFLAGS_NONE);
         }
     }
 
@@ -1364,27 +1364,32 @@ docallcmd()
     start_menu(win, MENU_BEHAVE_STANDARD);
     any = cg.zeroany;
     any.a_char = 'm'; /* group accelerator 'C' */
-    add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, 'C', ATR_NONE,
-             "a monster", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, 'C',
+             ATR_NONE, "a monster", MENU_ITEMFLAGS_NONE);
     if (g.invent) {
         /* we use y and n as accelerators so that we can accept user's
            response keyed to old "name an individual object?" prompt */
         any.a_char = 'i'; /* group accelerator 'y' */
-        add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, 'y', ATR_NONE,
-                 "a particular object in inventory", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, 'y',
+                 ATR_NONE, "a particular object in inventory",
+                 MENU_ITEMFLAGS_NONE);
         any.a_char = 'o'; /* group accelerator 'n' */
-        add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, 'n', ATR_NONE,
-                 "the type of an object in inventory", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, 'n',
+                 ATR_NONE, "the type of an object in inventory",
+                 MENU_ITEMFLAGS_NONE);
     }
     any.a_char = 'f'; /* group accelerator ',' (or ':' instead?) */
-    add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, ',', ATR_NONE,
-             "the type of an object upon the floor", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, ',',
+             ATR_NONE, "the type of an object upon the floor",
+             MENU_ITEMFLAGS_NONE);
     any.a_char = 'd'; /* group accelerator '\' */
-    add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, '\\', ATR_NONE,
-             "the type of an object on discoveries list", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, '\\',
+             ATR_NONE, "the type of an object on discoveries list",
+             MENU_ITEMFLAGS_NONE);
     any.a_char = 'a'; /* group accelerator 'l' */
-    add_menu(win, NO_GLYPH, &any, abc ? 0 : any.a_char, 'l', ATR_NONE,
-             "record an annotation for the current level", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, abc ? 0 : any.a_char, 'l',
+             ATR_NONE, "record an annotation for the current level",
+             MENU_ITEMFLAGS_NONE);
     end_menu(win, "What do you want to name?");
     if (select_menu(win, PICK_ONE, &pick_list) > 0) {
         ch = pick_list[0].item.a_char;
index 4bc34196a8221435afe5adfe242d3e9f3faad292..421f466f7b4058b50f1b2f54b986d0fc59970d76 100644 (file)
@@ -152,7 +152,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '.', "floor of a room", C(CLR_GRAY) },      /* room */
 /*20*/ { '.', "dark part of a room", C(CLR_BLACK) }, /* dark room */
        { '#', "corridor", C(CLR_GRAY) },             /* dark corr */
-       { '#', "lit corridor", C(CLR_GRAY) },   /* lit corr, see map_glyphmod() */
+       { '#', "lit corridor", C(CLR_GRAY) },   /* lit corr, see map_glyphinfo() */
        { '<', "staircase up", C(CLR_GRAY) },         /* upstair */
        { '>', "staircase down", C(CLR_GRAY) },       /* dnstair */
        { '<', "ladder up", C(CLR_BROWN) },           /* upladder */
@@ -195,7 +195,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '^', "anti-magic field", C(HI_ZAP) },         /* trap */
        { '^', "polymorph trap", C(CLR_BRIGHT_GREEN) }, /* trap */
        { '~', "vibrating square", C(CLR_MAGENTA) },    /* "trap" */
-       /* zap colors are changed by map_glyphmod() to match type of beam */
+       /* zap colors are changed by map_glyphinfo() to match type of beam */
        { '|', "", C(CLR_GRAY) },                /* vbeam */
        { '-', "", C(CLR_GRAY) },                /* hbeam */
        { '\\', "", C(CLR_GRAY) },               /* lslant */
@@ -210,7 +210,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '*', "", C(HI_ZAP) },
        { '#', "poison cloud", C(CLR_BRIGHT_GREEN) },   /* part of a cloud */
        { '?', "valid position", C(CLR_BRIGHT_GREEN) }, /*  target position */
-       /* swallow colors are changed by map_glyphmod() to match engulfing monst */
+       /* swallow colors are changed by map_glyphinfo() to match engulfing monst */
        { '/', "", C(CLR_GREEN) },         /* swallow top left      */
        { '-', "", C(CLR_GREEN) },         /* swallow top center    */
        { '\\', "", C(CLR_GREEN) },        /* swallow top right     */
@@ -219,7 +219,7 @@ const struct symdef defsyms[MAXPCHARS] = {
        { '\\', "", C(CLR_GREEN) },        /* swallow bottom left   */
        { '-', "", C(CLR_GREEN) },         /* swallow bottom center */
        { '/', "", C(CLR_GREEN) },         /* swallow bottom right  */
-       /* explosion colors are changed by map_glyphmod() to match type of expl. */
+       /* explosion colors are changed by map_glyphinfo() to match type of expl. */
        { '/', "", C(CLR_ORANGE) },        /* explosion top left     */
        { '-', "", C(CLR_ORANGE) },        /* explosion top center   */
        { '\\', "", C(CLR_ORANGE) },       /* explosion top right    */
index f27f0cae231fff674fdc70d395010c33013d03c8..907bf2765e6aa3a28fb0d5a4ece22567cf6be188 100644 (file)
@@ -2183,8 +2183,8 @@ boolean unreachable;
     } else {
         any.a_int = lchoices->idx + 1;
     }
-    add_menu(win, NO_GLYPH, &any, lchoices->menuletter, 0, ATR_NONE, entry,
-             MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, lchoices->menuletter, 0,
+             ATR_NONE, entry, MENU_ITEMFLAGS_NONE);
     /* this assumes there are at most 52 interesting levels */
     if (lchoices->menuletter == 'z')
         lchoices->menuletter = 'A';
@@ -2295,8 +2295,8 @@ xchar *rdgn;
         }
         if (bymenu) {
             any = cg.zeroany;
-            add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                     iflags.menu_headings, buf, MENU_ITEMFLAGS_NONE);
         } else
             putstr(win, 0, buf);
 
index fd5bbfd3efa03ed7a8da4a126bc28676e469b2e4..eaf0f5aa23f1523c961c2363a45bef4f514e68aa 100644 (file)
@@ -63,7 +63,7 @@ const char *buf;
         anything any;
 
         any = cg.zeroany;
-        add_menu(g.en_win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+        add_menu(g.en_win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
     } else
         putstr(g.en_win, 0, buf);
@@ -2307,7 +2307,8 @@ set_vanq_order()
         if (i == VANQ_ALPHA_MIX || i == VANQ_MCLS_HTOL) /* skip these */
             continue;
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, vanqorders[i],
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+                 vanqorders[i],
                  (i == g.vanq_sortmode)
                     ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     }
index 8b1a96287d46add6b5d96ee1d0244e7996464a72..e8d8273cc833e2c41219e7d28a48ce1b51587de8 100644 (file)
@@ -2747,9 +2747,10 @@ long *out_cnt;
             Sprintf(eos(prompt),
                     " -- unidentified or partially identified item%s",
                     plur(unid_cnt));
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, prompt, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, prompt,
+                 MENU_ITEMFLAGS_NONE);
         if (!unid_cnt) {
-            add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      "(all items are permanently identified already)",
                      MENU_ITEMFLAGS_NONE);
             gotsomething = TRUE;
@@ -2765,23 +2766,27 @@ long *out_cnt;
             if (unid_cnt > 1)
                 Sprintf(eos(prompt), " (%s for all)",
                         visctrl(iflags.override_ID));
-            add_menu(win, NO_GLYPH, &any, '_', iflags.override_ID, ATR_NONE,
-                     prompt, MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, '_', iflags.override_ID,
+                     ATR_NONE, prompt, MENU_ITEMFLAGS_NONE);
             gotsomething = TRUE;
         }
    } else if (xtra_choice) {
         /* wizard override ID and xtra_choice are mutually exclusive */
         if (flags.sortpack)
-            add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-                     "Miscellaneous", MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                     iflags.menu_headings,
+                    "Miscellaneous", MENU_ITEMFLAGS_NONE);
         any.a_char = HANDS_SYM; /* '-' */
-        add_menu(win, NO_GLYPH, &any, HANDS_SYM, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, HANDS_SYM, 0, ATR_NONE,
                  xtra_choice, MENU_ITEMFLAGS_NONE);
         gotsomething = TRUE;
     }
  nextclass:
     classcount = 0;
     for (srtinv = sortedinvent; (otmp = srtinv->obj) != 0; ++srtinv) {
+        int tmpglyph;
+       glyph_info tmpglyphinfo = nul_glyphinfo;
+
         if (lets && !index(lets, otmp->invlet))
             continue;
         if (!flags.sortpack || otmp->oclass == *invlet) {
@@ -2790,7 +2795,8 @@ long *out_cnt;
             any = cg.zeroany; /* all bits zero */
             ilet = otmp->invlet;
             if (flags.sortpack && !classcount) {
-                add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+                add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                         iflags.menu_headings,
                          let_to_name(*invlet, FALSE,
                                      (want_reply && iflags.menu_head_objsym)),
                          MENU_ITEMFLAGS_NONE);
@@ -2800,7 +2806,9 @@ long *out_cnt;
                 any.a_obj = otmp;
             else
                 any.a_char = ilet;
-            add_menu(win, obj_to_glyph(otmp, rn2_on_display_rng), &any, ilet,
+            tmpglyph = obj_to_glyph(otmp, rn2_on_display_rng);
+            map_glyphinfo(0, 0, tmpglyph, 0U, &tmpglyphinfo);            
+            add_menu(win, &tmpglyphinfo, &any, ilet,
                      wizid ? def_oc_syms[(int) otmp->oclass].sym : 0,
                      ATR_NONE, doname(otmp), MENU_ITEMFLAGS_NONE);
             gotsomething = TRUE;
@@ -2816,10 +2824,10 @@ long *out_cnt;
     }
     if (iflags.force_invmenu && lets && want_reply) {
         any = cg.zeroany;
-        add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-                 "Special", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                 iflags.menu_headings, "Special", MENU_ITEMFLAGS_NONE);
         any.a_char = '*';
-        add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, '*', 0, ATR_NONE,
                  "(list everything)", MENU_ITEMFLAGS_NONE);
         gotsomething = TRUE;
     }
@@ -2830,7 +2838,7 @@ long *out_cnt;
        into the menu */
     if (iflags.perm_invent && !lets && !gotsomething) {
         any = cg.zeroany;
-        add_menu(win, NO_GLYPH, &any, 0, 0, 0,
+        add_menu(win, &nul_glyphinfo, &any, 0, 0, 0,
                  not_carrying_anything, MENU_ITEMFLAGS_NONE);
         want_reply = FALSE;
     }
@@ -2896,7 +2904,8 @@ char avoidlet;
     struct obj *otmp;
     char ilet, ret = 0;
     char *invlet = flags.inv_order;
-    int n, classcount, invdone = 0;
+    int n, classcount, invdone = 0, tmpglyph;
+    glyph_info tmpglyphinfo = nul_glyphinfo;
     winid win;
     anything any;
     menu_item *selected;
@@ -2914,16 +2923,17 @@ char avoidlet;
                 if (!flags.sortpack || otmp->oclass == *invlet) {
                     if (flags.sortpack && !classcount) {
                         any = cg.zeroany; /* zero */
-                        add_menu(win, NO_GLYPH, &any, 0, 0,
+                        add_menu(win, &nul_glyphinfo, &any, 0, 0,
                                  iflags.menu_headings,
                                  let_to_name(*invlet, FALSE, FALSE),
                                  MENU_ITEMFLAGS_NONE);
                         classcount++;
                     }
                     any.a_char = ilet;
-                    add_menu(win, obj_to_glyph(otmp, rn2_on_display_rng),
-                             &any, ilet, 0, ATR_NONE,
-                             doname(otmp), MENU_ITEMFLAGS_NONE);
+                    tmpglyph = obj_to_glyph(otmp, rn2_on_display_rng);
+                    map_glyphinfo(0, 0, tmpglyph, 0U, &tmpglyphinfo);
+                    add_menu(win, &tmpglyphinfo, &any, ilet, 0,
+                             ATR_NONE, doname(otmp), MENU_ITEMFLAGS_NONE);
                 }
             }
             if (flags.sortpack && *++invlet)
@@ -4383,10 +4393,12 @@ const char *hdr, *txt;
     any = cg.zeroany;
     win = create_nhwindow(NHW_MENU);
     start_menu(win, MENU_BEHAVE_STANDARD);
-    add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, hdr,
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, iflags.menu_headings,
+             hdr, MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+             "", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, txt,
              MENU_ITEMFLAGS_NONE);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, txt, MENU_ITEMFLAGS_NONE);
     end_menu(win, (char *) 0);
     if (select_menu(win, PICK_NONE, &selected) > 0)
         free((genericptr_t) selected);
index b3906592bfbd5a206de02178e85c4368b673c558..f3cea5139b5cc736347a0b59bb6b2a1632835e4d 100644 (file)
@@ -518,7 +518,7 @@ lua_State *L;
         any = cg.zeroany;
         if (*key)
             any.a_char = key[0];
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, str,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, str,
                  (*defval && *key && defval[0] == key[0])
                     ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
 
index 5806e9ee305cbd13ef3a855b55fe3e730cf00d63..b86c749a4290fa6bfd19c502ff9250b3103d7b83 100644 (file)
@@ -541,7 +541,8 @@ int mode; /* 0 => 'O' cmd, 1 => full discoveries; 2 => class discoveries */
     any = cg.zeroany; /* zero out all bits */
     for (i = 0; disco_orders_descr[i]; ++i) {
         any.a_int = disco_order_let[i];
-        add_menu(tmpwin, NO_GLYPH, &any, (char) any.a_int, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, (char) any.a_int,
+                 0, ATR_NONE,
                  disco_orders_descr[i],
                  (disco_order_let[i] == flags.discosort)
                     ? MENU_ITEMFLAGS_SELECTED
@@ -552,15 +553,15 @@ int mode; /* 0 => 'O' cmd, 1 => full discoveries; 2 => class discoveries */
            (only showing one class so can't span all classes) but the
            chosen sort will stick and also apply to '\' usage */
         any = cg.zeroany;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "", MENU_ITEMFLAGS_NONE);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "Note: full alphabetical and alphabetical within class",
                  MENU_ITEMFLAGS_NONE);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "      are equivalent for single class discovery, but",
                  MENU_ITEMFLAGS_NONE);
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "      will matter for future use of total discoveries.",
                  MENU_ITEMFLAGS_NONE);
     }
@@ -756,8 +757,8 @@ doclassdisco()
             Strcat(discosyms, "u");
             if (!traditional) {
                 any.a_int = 'u';
-                add_menu(tmpwin, NO_GLYPH, &any, menulet++, 0, ATR_NONE,
-                         unique_items, MENU_ITEMFLAGS_NONE);
+                add_menu(tmpwin, &nul_glyphinfo, &any, menulet++,
+                         0, ATR_NONE, unique_items, MENU_ITEMFLAGS_NONE);
             }
             break;
         }
@@ -767,8 +768,8 @@ doclassdisco()
         Strcat(discosyms, "a");
         if (!traditional) {
             any.a_int = 'a';
-            add_menu(tmpwin, NO_GLYPH, &any, menulet++, 0, ATR_NONE,
-                     artifact_items, MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, menulet++,
+                     0, ATR_NONE, artifact_items, MENU_ITEMFLAGS_NONE);
         }
     }
 
@@ -788,8 +789,9 @@ doclassdisco()
                     Sprintf(eos(discosyms), "%c", c);
                     if (!traditional) {
                         any.a_int = c;
-                        add_menu(tmpwin, NO_GLYPH, &any, menulet++, c,
-                                 ATR_NONE, oclass_to_name(oclass, buf),
+                        add_menu(tmpwin, &nul_glyphinfo, &any,
+                                 menulet++, c, ATR_NONE,
+                                 oclass_to_name(oclass, buf),
                                  MENU_ITEMFLAGS_NONE);
                     }
                 }
@@ -950,13 +952,15 @@ rename_disco()
 
             if (oclass != prev_class) {
                 any.a_int = 0;
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                         iflags.menu_headings,
                          let_to_name(oclass, FALSE, FALSE),
                          MENU_ITEMFLAGS_NONE);
                 prev_class = oclass;
             }
             any.a_int = dis;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE,
                      obj_typename(dis), MENU_ITEMFLAGS_NONE);
         }
     }
index d58c4e1f0bab8aa858651a11d7b6e8a4eca19ee8..eec4d7e328b72a941fbbbedc227e7fe9b55c8d3d 100644 (file)
@@ -4766,8 +4766,8 @@ handler_menustyle()
         /* note: separate `style_name' variable used
            to avoid an optimizer bug in VAX C V2.3 */
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, *style_name, 0, ATR_NONE,
-                 style_name, MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, *style_name, 0,
+                 ATR_NONE, style_name, MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Select menustyle:");
     if (select_menu(tmpwin, PICK_ONE, &style_pick) > 0) {
@@ -4791,16 +4791,16 @@ int optidx;
     start_menu(tmpwin, MENU_BEHAVE_STANDARD);
     any = cg.zeroany;
     any.a_int = ALIGN_TOP;
-    add_menu(tmpwin, NO_GLYPH, &any, 't', 0, ATR_NONE, "top",
+    add_menu(tmpwin, &nul_glyphinfo, &any, 't', 0, ATR_NONE, "top",
              MENU_ITEMFLAGS_NONE);
     any.a_int = ALIGN_BOTTOM;
-    add_menu(tmpwin, NO_GLYPH, &any, 'b', 0, ATR_NONE, "bottom",
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'b', 0, ATR_NONE, "bottom",
              MENU_ITEMFLAGS_NONE);
     any.a_int = ALIGN_LEFT;
-    add_menu(tmpwin, NO_GLYPH, &any, 'l', 0, ATR_NONE, "left",
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'l', 0, ATR_NONE, "left",
              MENU_ITEMFLAGS_NONE);
     any.a_int = ALIGN_RIGHT;
-    add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "right",
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'r', 0, ATR_NONE, "right",
              MENU_ITEMFLAGS_NONE);
     Sprintf(abuf, "Select %s window placement relative to the map:",
             (optidx == opt_align_message) ? "message" : "status");
@@ -4841,8 +4841,8 @@ handler_disclose(VOID_ARGS)
         Sprintf(buf, "%-12s[%c%c]", disclosure_names[i],
                 flags.end_disclose[i], disclosure_options[i]);
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, disclosure_options[i], 0,
-                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, disclosure_options[i],
+                 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
         disc_cat[i] = 0;
     }
     end_menu(tmpwin, "Change which disclosure options categories:");
@@ -4867,35 +4867,41 @@ handler_disclose(VOID_ARGS)
             any = cg.zeroany;
             /* 'y','n',and '+' work as alternate selectors; '-' doesn't */
             any.a_char = DISCLOSE_NO_WITHOUT_PROMPT;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                     any.a_char, ATR_NONE,
                      "Never disclose, without prompting",
                      (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                        : MENU_ITEMFLAGS_NONE);
             any.a_char = DISCLOSE_YES_WITHOUT_PROMPT;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                     any.a_char, ATR_NONE,
                      "Always disclose, without prompting",
                      (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                        : MENU_ITEMFLAGS_NONE);
             if (*disclosure_names[i] == 'v') {
                 any.a_char = DISCLOSE_SPECIAL_WITHOUT_PROMPT; /* '#' */
-                add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                         any.a_char, ATR_NONE,
                          "Always disclose, pick sort order from menu",
                          (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                            : MENU_ITEMFLAGS_NONE);
             }
             any.a_char = DISCLOSE_PROMPT_DEFAULT_NO;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                     any.a_char, ATR_NONE,
                      "Prompt, with default answer of \"No\"",
                      (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                        : MENU_ITEMFLAGS_NONE);
             any.a_char = DISCLOSE_PROMPT_DEFAULT_YES;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                     any.a_char, ATR_NONE,
                      "Prompt, with default answer of \"Yes\"",
                      (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                        : MENU_ITEMFLAGS_NONE);
             if (*disclosure_names[i] == 'v') {
                 any.a_char = DISCLOSE_PROMPT_DEFAULT_SPECIAL; /* '?' */
-                add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0,
+                         any.a_char, ATR_NONE,
             "Prompt, with default answer of \"Ask\" to request sort menu",
                          (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
                                            : MENU_ITEMFLAGS_NONE);
@@ -4940,18 +4946,18 @@ handler_msg_window(VOID_ARGS)
         any = cg.zeroany;
         if (!WINDOWPORT("curses")) {
             any.a_char = 's';
-            add_menu(tmpwin, NO_GLYPH, &any, 's', 0, ATR_NONE,
-                     "single", MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 's',
+                     0, ATR_NONE, "single", MENU_ITEMFLAGS_NONE);
             any.a_char = 'c';
-            add_menu(tmpwin, NO_GLYPH, &any, 'c', 0, ATR_NONE,
-                     "combination", MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 'c',
+                     0, ATR_NONE, "combination", MENU_ITEMFLAGS_NONE);
         }
         any.a_char = 'f';
-        add_menu(tmpwin, NO_GLYPH, &any, 'f', 0, ATR_NONE, "full",
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'f',
+                 0, ATR_NONE, "full", MENU_ITEMFLAGS_NONE);
         any.a_char = 'r';
-        add_menu(tmpwin, NO_GLYPH, &any, 'r', 0, ATR_NONE, "reversed",
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'r',
+                 0, ATR_NONE, "reversed", MENU_ITEMFLAGS_NONE);
         end_menu(tmpwin, "Select message history display type:");
         if (select_menu(tmpwin, PICK_ONE, &window_pick) > 0) {
             iflags.prevmsg_window = window_pick->item.a_char;
@@ -4984,8 +4990,8 @@ handler_number_pad(VOID_ARGS)
     any = cg.zeroany;
     for (i = 0; i < SIZE(npchoices); i++) {
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, 'a' + i, 0, ATR_NONE,
-                 npchoices[i], MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, 'a' + i,
+                 0, ATR_NONE, npchoices[i], MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Select number_pad mode:");
     if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) {
@@ -5039,8 +5045,8 @@ handler_paranoid_confirmation(VOID_ARGS)
         if (paranoia[i].flagmask == PARANOID_BONES && !wizard)
             continue;
         any.a_int = paranoia[i].flagmask;
-        add_menu(tmpwin, NO_GLYPH, &any, *paranoia[i].argname, 0,
-                 ATR_NONE, paranoia[i].explain,
+        add_menu(tmpwin, &nul_glyphinfo, &any, *paranoia[i].argname,
+                 0, ATR_NONE, paranoia[i].explain,
                  (flags.paranoia_bits & paranoia[i].flagmask)
                      ? MENU_ITEMFLAGS_SELECTED
                      : MENU_ITEMFLAGS_NONE);
@@ -5078,8 +5084,8 @@ handler_pickup_burden(VOID_ARGS)
     for (i = 0; i < SIZE(burdentype); i++) {
         burden_name = burdentype[i];
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, burden_letters[i], 0, ATR_NONE,
-                 burden_name, MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, burden_letters[i],
+                 0, ATR_NONE, burden_name, MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Select encumbrance level:");
     if (select_menu(tmpwin, PICK_ONE, &burden_pick) > 0) {
@@ -5116,8 +5122,8 @@ handler_runmode(VOID_ARGS)
     for (i = 0; i < SIZE(runmodes); i++) {
         mode_name = runmodes[i];
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, *mode_name, 0, ATR_NONE,
-                 mode_name, MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, *mode_name,
+                 0, ATR_NONE, mode_name, MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Select run/travel display mode:");
     if (select_menu(tmpwin, PICK_ONE, &mode_pick) > 0) {
@@ -5143,7 +5149,8 @@ handler_sortloot(VOID_ARGS)
     for (i = 0; i < SIZE(sortltype); i++) {
         sortl_name = sortltype[i];
         any.a_char = *sortl_name;
-        add_menu(tmpwin, NO_GLYPH, &any, *sortl_name, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, *sortl_name,
+                 0, ATR_NONE,
                  sortl_name, (flags.sortloot == *sortl_name)
                                 ? MENU_ITEMFLAGS_SELECTED
                                 : MENU_ITEMFLAGS_NONE);
@@ -5176,38 +5183,42 @@ handler_whatis_coord(VOID_ARGS)
     start_menu(tmpwin, MENU_BEHAVE_STANDARD);
     any = cg.zeroany;
     any.a_char = GPCOORDS_COMPASS;
-    add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMPASS, 0, ATR_NONE,
+    add_menu(tmpwin, &nul_glyphinfo, &any, GPCOORDS_COMPASS,
+             0, ATR_NONE,
              "compass ('east' or '3s' or '2n,4w')",
              (gp == GPCOORDS_COMPASS)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = GPCOORDS_COMFULL;
-    add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, 0, ATR_NONE,
+    add_menu(tmpwin, &nul_glyphinfo, &any, GPCOORDS_COMFULL,
+             0, ATR_NONE,
              "full compass ('east' or '3south' or '2north,4west')",
              (gp == GPCOORDS_COMFULL)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = GPCOORDS_MAP;
-    add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP, 0, ATR_NONE,
-             "map <x,y>",
+    add_menu(tmpwin, &nul_glyphinfo, &any, GPCOORDS_MAP,
+             0, ATR_NONE, "map <x,y>",
              (gp == GPCOORDS_MAP)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = GPCOORDS_SCREEN;
-    add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_SCREEN, 0, ATR_NONE,
-             "screen [row,column]",
+    add_menu(tmpwin, &nul_glyphinfo, &any, GPCOORDS_SCREEN,
+             0, ATR_NONE, "screen [row,column]",
              (gp == GPCOORDS_SCREEN)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = GPCOORDS_NONE;
-    add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_NONE, 0, ATR_NONE,
-             "none (no coordinates displayed)",
+    add_menu(tmpwin, &nul_glyphinfo, &any, GPCOORDS_NONE,
+             0, ATR_NONE, "none (no coordinates displayed)",
              (gp == GPCOORDS_NONE)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_long = 0L;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+             "", MENU_ITEMFLAGS_NONE);
     Sprintf(buf, "map: upper-left: <%d,%d>, lower-right: <%d,%d>%s",
             1, 0, COLNO - 1, ROWNO - 1,
             flags.verbose ? "; column 0 unused, off left edge" : "");
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     if (strcmp(windowprocs.name, "tty")) /* only show for non-tty */
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
    "screen: row is offset to accommodate tty interface's use of top line",
                  MENU_ITEMFLAGS_NONE);
 #if COLNO == 80
@@ -5218,8 +5229,10 @@ handler_whatis_coord(VOID_ARGS)
     Sprintf(buf, "screen: upper-left: [%02d,%02d], lower-right: [%d,%d]%s",
             0 + 2, 1, ROWNO - 1 + 2, COLNO - 1, COL80ARG);
 #undef COL80ARG
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+             buf, MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
+             "", MENU_ITEMFLAGS_NONE);
     end_menu(tmpwin,
         "Select coordinate display when auto-describing a map position:");
     if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &window_pick)) > 0) {
@@ -5247,17 +5260,17 @@ handler_whatis_filter(VOID_ARGS)
     start_menu(tmpwin, MENU_BEHAVE_STANDARD);
     any = cg.zeroany;
     any.a_char = (GFILTER_NONE + 1);
-    add_menu(tmpwin, NO_GLYPH, &any, 'n',
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'n',
              0, ATR_NONE, "no filtering",
              (gf == GFILTER_NONE)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = (GFILTER_VIEW + 1);
-    add_menu(tmpwin, NO_GLYPH, &any, 'v',
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'v',
              0, ATR_NONE, "in view only",
              (gf == GFILTER_VIEW)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     any.a_char = (GFILTER_AREA + 1);
-    add_menu(tmpwin, NO_GLYPH, &any, 'a',
+    add_menu(tmpwin, &nul_glyphinfo, &any, 'a',
              0, ATR_NONE, "in same area",
              (gf == GFILTER_AREA)
                 ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
@@ -5337,7 +5350,7 @@ int optidx;
         any.a_int = 1; /* -1 + 2 [see 'if (sl->name) {' below]*/
         if (!symset_name)
             defindx = any.a_int;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "Default Symbols",
                  (any.a_int == defindx) ? MENU_ITEMFLAGS_SELECTED
                                         : MENU_ITEMFLAGS_NONE);
@@ -5358,7 +5371,8 @@ int optidx;
                 if (symset_name && !strcmpi(sl->name, symset_name))
                     defindx = any.a_int;
                 Sprintf(buf, fmtstr, sl->name, sl->desc ? sl->desc : "");
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, buf,
                          (any.a_int == defindx) ? MENU_ITEMFLAGS_SELECTED
                                                 : MENU_ITEMFLAGS_NONE);
             }
@@ -5494,7 +5508,8 @@ handler_autopickup_exception(VOID_ARGS)
         if (numapes) {
             ape = g.apelist;
             any = cg.zeroany;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     iflags.menu_headings,
                      "Always pickup '<'; never pickup '>'",
                      MENU_ITEMFLAGS_NONE);
             for (i = 0; i < numapes && ape; i++) {
@@ -5503,8 +5518,8 @@ handler_autopickup_exception(VOID_ARGS)
                    less than BUFSZ */
                 Sprintf(apebuf, "\"%c%s\"", ape->grab ? '<' : '>',
                         ape->pattern);
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, apebuf,
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, apebuf, MENU_ITEMFLAGS_NONE);
                 ape = ape->next;
             }
         }
@@ -5602,8 +5617,8 @@ handler_menu_colors(VOID_ARGS)
                 Strcat(mcbuf, tmp->origstr);
             /* combine main string and suffix */
             Strcat(mcbuf, &buf[1]); /* skip buf[]'s initial quote */
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, mcbuf,
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, mcbuf, MENU_ITEMFLAGS_NONE);
             tmp = tmp->next;
         }
         Sprintf(mcbuf, "%s menu colors",
@@ -5672,8 +5687,8 @@ handler_msgtype(VOID_ARGS)
                 Strcat(strncat(mtbuf, tmp->pattern, ln - 3), "...\"");
             else
                 Strcat(strcat(mtbuf, tmp->pattern), "\"");
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, mtbuf,
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, mtbuf, MENU_ITEMFLAGS_NONE);
             tmp = tmp->next;
         }
         Sprintf(mtbuf, "%s message types",
@@ -6679,7 +6694,8 @@ const char *prompt;
         if (!colornames[i].name)
             break;
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, colornames[i].name,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                 ATR_NONE, colornames[i].name,
                  (colornames[i].color == NO_COLOR) ? MENU_ITEMFLAGS_SELECTED
                                                    : MENU_ITEMFLAGS_NONE);
     }
@@ -6730,8 +6746,8 @@ const char *prompt;
         if (!attrnames[i].name)
             break;
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, attrnames[i].attr,
-                 attrnames[i].name,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                 attrnames[i].attr, attrnames[i].name,
                  (attrnames[i].attr == default_attr) ? MENU_ITEMFLAGS_SELECTED
                                                      : MENU_ITEMFLAGS_NONE);
     }
@@ -6828,8 +6844,8 @@ query_msgtype()
     for (i = 0; i < SIZE(msgtype_names); i++)
         if (msgtype_names[i].descr) {
             any.a_int = msgtype_names[i].msgtyp + 1;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
-                 msgtype_names[i].descr, MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, msgtype_names[i].descr, MENU_ITEMFLAGS_NONE);
         }
     end_menu(tmpwin, "How to show the message");
     pick_cnt = select_menu(tmpwin, PICK_ONE, &picks);
@@ -7537,7 +7553,7 @@ doset() /* changing options via menu by Per Liboriussen */
 
     indexoffset = 1;
     any = cg.zeroany;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, iflags.menu_headings,
              "Booleans (selecting will toggle value):", MENU_ITEMFLAGS_NONE);
     any.a_int = 0;
     /* first list any other non-modifiable booleans, then modifiable ones */
@@ -7562,13 +7578,14 @@ doset() /* changing options via menu by Per Liboriussen */
                 else
                     Sprintf(buf, fmtstr_doset_tab,
                             name, *bool_p ? "true" : "false");
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
             }
 
     any = cg.zeroany;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, iflags.menu_headings,
              "Compounds (selecting will prompt for new value):",
              MENU_ITEMFLAGS_NONE);
 
@@ -7599,9 +7616,10 @@ doset() /* changing options via menu by Per Liboriussen */
         }
 
     any = cg.zeroany;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
-             "Other settings:", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             iflags.menu_headings, "Other settings:", MENU_ITEMFLAGS_NONE);
 
     for (i = 0; (name = othropt[i].name) != 0; i++) {
         if ((is_wc_option(name) && !wc_supported(name))
@@ -7613,8 +7631,10 @@ doset() /* changing options via menu by Per Liboriussen */
 
 #ifdef PREFIXES_IN_USE
     any = cg.zeroany;
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             iflags.menu_headings,
              "Variable playground locations:", MENU_ITEMFLAGS_NONE);
     for (i = 0; i < PREFIX_COUNT; i++)
         doset_add_menu(tmpwin, fqn_prefix_names[i], -1, 0);
@@ -7745,7 +7765,8 @@ int indexoffset;    /* value to add to index in allopt[], or zero
                 value);
     else
         Sprintf(buf, fmtstr_doset_tab, option, value);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
 }
 
 static void
@@ -7769,7 +7790,8 @@ int nset;
                 name, buf2);
     else
         Sprintf(buf, fmtstr_doset_tab, name, buf2);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
 }
 
 /* display keys for menu actions; used by cmd.c '?i' and pager.c '?k' */
@@ -7924,8 +7946,9 @@ int numtotal;
             continue;
         Sprintf(tmpbuf, action_titles[i].desc,
                 (i == 1) ? makeplural(optname) : optname);
-        add_menu(tmpwin, NO_GLYPH, &any, action_titles[i].letr, 0, ATR_NONE,
-                 tmpbuf, (i == 3) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo,&any, action_titles[i].letr,
+                 0, ATR_NONE, tmpbuf,
+                 (i == 3) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Do what?");
     if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &pick_list)) > 0) {
@@ -8411,8 +8434,8 @@ char *class_select;
             }
         }
         any.a_int = *class_list;
-        add_menu(win, NO_GLYPH, &any, accelerator, category ? *class_list : 0,
-                 ATR_NONE, buf,
+        add_menu(win, &nul_glyphinfo, &any, accelerator,
+                 category ? *class_list : 0, ATR_NONE, buf,
                  selected ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
         ++class_list;
         if (category > 0) {
@@ -8426,13 +8449,15 @@ char *class_select;
     if (category == 1 && next_accelerator <= 'z') {
         /* for objects, add "A - ' '  all classes", after a separator */
         any = cg.zeroany;
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
         any.a_int = (int) ' ';
         Sprintf(buf, "%c  %s", (char) any.a_int, "all classes of objects");
         /* we won't preselect this even if the incoming list is empty;
            having it selected means that it would have to be explicitly
            de-selected in order to select anything else */
-        add_menu(win, NO_GLYPH, &any, 'A', 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 'A', 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     }
     end_menu(win, prompt);
     n = select_menu(win, way ? PICK_ANY : PICK_ONE, &pick_list);
index 197cd4b3c0751c305bbae0079257caa45e0d768d..1a70f63cc5054d9566a475f8f345a2acd0068810 100644 (file)
@@ -893,16 +893,15 @@ struct permonst **for_supplement;
             hallucinate = (Hallucination && !g.program_state.gameover);
     const char *x_str;
     nhsym tmpsym;
-    unsigned glyphmod[NUM_GLYPHMOD];
+    glyph_info glyphinfo = nul_glyphinfo;
 
     gobbledygook[0] = '\0'; /* no hallucinatory liquid (yet) */
     if (looked) {
         glyph = glyph_at(cc.x, cc.y);
         /* Convert glyph at selected position to a symbol for use below. */
-        map_glyphmod(cc.x, cc.y, glyph, 0, glyphmod);
-        sym = glyphmod[GM_TTYCHAR];
-
-        Sprintf(prefix, "%s        ", encglyph(glyph));
+        map_glyphinfo(cc.x, cc.y, glyph, 0, &glyphinfo);
+        sym = glyphinfo.symidx;
+        Sprintf(prefix, "%s        ", encglyph(glyphinfo.glyph));
     } else
         Sprintf(prefix, "%c        ", sym);
 
@@ -1154,8 +1153,8 @@ struct permonst **for_supplement;
             case SYM_PET_OVERRIDE + SYM_OFF_X:
                 if (looked) {
                     /* convert to symbol without override in effect */
-                    map_glyphmod(cc.x, cc.y, glyph, MG_FLAG_NOOVERRIDE, glyphmod);
-                    sym = (int) glyphmod[GM_TTYCHAR];                
+                    map_glyphinfo(cc.x, cc.y, glyph, 0, &glyphinfo);
+                    sym = glyphinfo.ttychar;
                     goto check_monsters;
                 }
                 break;
@@ -1264,21 +1263,21 @@ coord *click_cc;
             any.a_char = '/';
             /* 'y' and 'n' to keep backwards compatibility with previous
                versions: "Specify unknown object by cursor?" */
-            add_menu(win, NO_GLYPH, &any,
+            add_menu(win, &nul_glyphinfo, &any,
                      flags.lootabc ? 0 : any.a_char, 'y', ATR_NONE,
                      "something on the map", MENU_ITEMFLAGS_NONE);
             any.a_char = 'i';
-            add_menu(win, NO_GLYPH, &any,
+            add_menu(win, &nul_glyphinfo, &any,
                      flags.lootabc ? 0 : any.a_char, 0, ATR_NONE,
                      "something you're carrying", MENU_ITEMFLAGS_NONE);
             any.a_char = '?';
-            add_menu(win, NO_GLYPH, &any,
+            add_menu(win, &nul_glyphinfo, &any,
                      flags.lootabc ? 0 : any.a_char, 'n', ATR_NONE,
                      "something else (by symbol or name)",
                      MENU_ITEMFLAGS_NONE);
             if (!u.uswallow && !Hallucination) {
                 any = cg.zeroany;
-                add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                          "", MENU_ITEMFLAGS_NONE);
                 /* these options work sensibly for the swallowed case,
                    but there's no reason for the player to use them then;
@@ -1286,19 +1285,19 @@ coord *click_cc;
                    symbol/monster class letter doesn't match up with
                    bogus monster type, so suppress when hallucinating */
                 any.a_char = 'm';
-                add_menu(win, NO_GLYPH, &any,
+                add_menu(win, &nul_glyphinfo, &any,
                          flags.lootabc ? 0 : any.a_char, 0, ATR_NONE,
                          "nearby monsters", MENU_ITEMFLAGS_NONE);
                 any.a_char = 'M';
-                add_menu(win, NO_GLYPH, &any,
+                add_menu(win, &nul_glyphinfo, &any,
                          flags.lootabc ? 0 : any.a_char, 0, ATR_NONE,
                          "all monsters shown on map", MENU_ITEMFLAGS_NONE);
                 any.a_char = 'o';
-                add_menu(win, NO_GLYPH, &any,
+                add_menu(win, &nul_glyphinfo, &any,
                          flags.lootabc ? 0 : any.a_char, 0, ATR_NONE,
                          "nearby objects", MENU_ITEMFLAGS_NONE);
                 any.a_char = 'O';
-                add_menu(win, NO_GLYPH, &any,
+                add_menu(win, &nul_glyphinfo, &any,
                          flags.lootabc ? 0 : any.a_char, 0, ATR_NONE,
                          "all objects shown on map", MENU_ITEMFLAGS_NONE);
             }
@@ -2154,7 +2153,7 @@ dohelp()
             Strcpy(helpbuf, help_menu_items[i].text);
         }
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  helpbuf, MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "Select one item:");
index f271d4c17b102684038eddf6732c2538a2168a65..4b5e715cf9ca503a79cb4c0aa848b9a6286bd8ea 100644 (file)
@@ -907,7 +907,7 @@ menu_item **pick_list;            /* return list of items picked */
 int how;                          /* type of query */
 boolean FDECL((*allow), (OBJ_P)); /* allow function */
 {
-    int i, n;
+    int i, n, tmpglyph;
     winid win;
     struct obj *curr, *last, fake_hero_object, *olist = *olist_p;
     char *pack, packbuf[MAXOCLASSES + 1];
@@ -917,6 +917,7 @@ boolean FDECL((*allow), (OBJ_P)); /* allow function */
             engulfer = (qflags & INCLUDE_HERO) != 0,
             engulfer_minvent;
     unsigned sortflags;
+    glyph_info tmpglyphinfo = nul_glyphinfo;
     Loot *sortedolist, *srtoli;
 
     *pick_list = (menu_item *) 0;
@@ -990,7 +991,8 @@ boolean FDECL((*allow), (OBJ_P)); /* allow function */
                 /* if sorting, print type name (once only) */
                 if (sorted && !printed_type_name) {
                     any = cg.zeroany;
-                    add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+                    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                             iflags.menu_headings,
                              let_to_name(*pack, FALSE,
                                          ((how != PICK_NONE)
                                           && iflags.menu_head_objsym)),
@@ -999,7 +1001,9 @@ boolean FDECL((*allow), (OBJ_P)); /* allow function */
                 }
 
                 any.a_obj = curr;
-                add_menu(win, obj_to_glyph(curr, rn2_on_display_rng), &any,
+                tmpglyph = obj_to_glyph(curr, rn2_on_display_rng);
+                map_glyphinfo(0, 0, tmpglyph, 0U, &tmpglyphinfo);
+                add_menu(win, &tmpglyphinfo, &any,
                          (qflags & USE_INVLET) ? curr->invlet
                            : (first && curr->oclass == COIN_CLASS) ? '$' : 0,
                          def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
@@ -1018,13 +1022,15 @@ boolean FDECL((*allow), (OBJ_P)); /* allow function */
         if (sorted && n > 1) {
             Sprintf(buf, "%s Creatures",
                     is_animal(u.ustuck->data) ? "Swallowed" : "Engulfed");
-            add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
+            add_menu(win, &nul_glyphinfo, &any, 0, 0, iflags.menu_headings, buf,
                      MENU_ITEMFLAGS_NONE);
         }
         fake_hero_object = cg.zeroobj;
         fake_hero_object.quan = 1L; /* not strictly necessary... */
         any.a_obj = &fake_hero_object;
-        add_menu(win, mon_to_glyph(&g.youmonst, rn2_on_display_rng), &any,
+        tmpglyph = mon_to_glyph(&g.youmonst, rn2_on_display_rng);
+        map_glyphinfo(0, 0, tmpglyph, 0U, &tmpglyphinfo);
+        add_menu(win, &tmpglyphinfo, &any,
                  /* fake inventory letter, no group accelerator */
                  CONTAINED_SYM, 0, ATR_NONE, an(self_lookat(buf)),
                  MENU_ITEMFLAGS_NONE);
@@ -1166,13 +1172,14 @@ int how;               /* type of query */
         any = cg.zeroany;
         any.a_int = 'A';
         itemflags = MENU_ITEMFLAGS_SKIPINVERT;
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  (qflags & WORN_TYPES) ? "Auto-select every item being worn"
                                        : "Auto-select every item",
                  itemflags);
 
         any = cg.zeroany;
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
     }
 
     if ((qflags & ALL_TYPES) && (ccount > 1)) {
@@ -1180,7 +1187,7 @@ int how;               /* type of query */
         any = cg.zeroany;
         any.a_int = ALL_TYPES_SELECTED;
         itemflags = MENU_ITEMFLAGS_SKIPINVERT;
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  (qflags & WORN_TYPES) ? "All worn types" : "All types",
                  itemflags);
         invlet = 'b';
@@ -1196,7 +1203,7 @@ int how;               /* type of query */
                     any = cg.zeroany;
                     any.a_int = curr->oclass;
                     add_menu(
-                        win, NO_GLYPH, &any, invlet++,
+                        win, &nul_glyphinfo, &any, invlet++,
                         def_oc_syms[(int) objects[curr->otyp].oc_class].sym,
                         ATR_NONE, let_to_name(*pack, FALSE,
                                               (how != PICK_NONE)
@@ -1217,7 +1224,8 @@ int how;               /* type of query */
     if (do_unpaid || (qflags & BILLED_TYPES) || do_blessed || do_cursed
         || do_uncursed || do_buc_unknown) {
         any = cg.zeroany;
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
     }
 
     /* unpaid items if there are any */
@@ -1225,15 +1233,15 @@ int how;               /* type of query */
         invlet = 'u';
         any = cg.zeroany;
         any.a_int = 'u';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE, "Unpaid items",
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0,
+                 ATR_NONE, "Unpaid items", MENU_ITEMFLAGS_NONE);
     }
     /* billed items: checked by caller, so always include if BILLED_TYPES */
     if (qflags & BILLED_TYPES) {
         invlet = 'x';
         any = cg.zeroany;
         any.a_int = 'x';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  "Unpaid items already used up", MENU_ITEMFLAGS_NONE);
     }
 
@@ -1245,28 +1253,28 @@ int how;               /* type of query */
         invlet = 'B';
         any = cg.zeroany;
         any.a_int = 'B';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  "Items known to be Blessed", itemflags);
     }
     if (do_cursed) {
         invlet = 'C';
         any = cg.zeroany;
         any.a_int = 'C';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  "Items known to be Cursed", itemflags);
     }
     if (do_uncursed) {
         invlet = 'U';
         any = cg.zeroany;
         any.a_int = 'U';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  "Items known to be Uncursed", itemflags);
     }
     if (do_buc_unknown) {
         invlet = 'X';
         any = cg.zeroany;
         any.a_int = 'X';
-        add_menu(win, NO_GLYPH, &any, invlet, 0, ATR_NONE,
+        add_menu(win, &nul_glyphinfo, &any, invlet, 0, ATR_NONE,
                  "Items of unknown Bless/Curse status", itemflags);
     }
     end_menu(win, qstr);
@@ -1943,8 +1951,8 @@ doloot()
                  cobj = cobj->nexthere)
                 if (Is_container(cobj)) {
                     any.a_obj = cobj;
-                    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
-                             doname(cobj), MENU_ITEMFLAGS_NONE);
+                    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                             ATR_NONE, doname(cobj), MENU_ITEMFLAGS_NONE);
                 }
             end_menu(win, "Loot which containers?");
             n = select_menu(win, PICK_ANY, &pick_list);
@@ -3055,47 +3063,49 @@ boolean outokay, inokay, alreadyused, more_containers;
 
     any.a_int = 1; /* ':' */
     Sprintf(buf, "Look inside %s", thesimpleoname(obj));
-    add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
-             MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+             ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     if (outokay) {
         any.a_int = 2; /* 'o' */
         Sprintf(buf, "take %s out", something);
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     }
     if (inokay) {
         any.a_int = 3; /* 'i' */
         Sprintf(buf, "put %s in", something);
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     }
     if (outokay) {
         any.a_int = 4; /* 'b' */
         Sprintf(buf, "%stake out, then put in", inokay ? "both; " : "");
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     }
     if (inokay) {
         any.a_int = 5; /* 'r' */
         Sprintf(buf, "%sput in, then take out",
                 outokay ? "both reversed; " : "");
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
         any.a_int = 6; /* 's' */
         Sprintf(buf, "stash one item into %s", thesimpleoname(obj));
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 buf, MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     }
     any.a_int = 0;
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+             ATR_NONE, "", MENU_ITEMFLAGS_NONE);
     if (more_containers) {
         any.a_int = 7; /* 'n' */
-        add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE,
-                 "loot next container", MENU_ITEMFLAGS_SELECTED);
+        add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+                 ATR_NONE, "loot next container", MENU_ITEMFLAGS_SELECTED);
     }
     any.a_int = 8; /* 'q' */
     Strcpy(buf, alreadyused ? "done" : "do nothing");
-    add_menu(win, NO_GLYPH, &any, menuselector[any.a_int], 0, ATR_NONE, buf,
+    add_menu(win, &nul_glyphinfo, &any, menuselector[any.a_int], 0,
+             ATR_NONE, buf,
              more_containers ? MENU_ITEMFLAGS_NONE : MENU_ITEMFLAGS_SELECTED);
 
     end_menu(win, prompt);
@@ -3155,18 +3165,18 @@ dotip()
                     if (Is_container(cobj)) {
                         ++i;
                         any.a_obj = cobj;
-                        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
-                                 doname(cobj), MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                                 ATR_NONE, doname(cobj), MENU_ITEMFLAGS_NONE);
                     }
                 if (g.invent) {
                     any = cg.zeroany;
-                    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                              "", MENU_ITEMFLAGS_NONE);
                     any.a_obj = &dummyobj;
                     /* use 'i' for inventory unless there are so many
                        containers that it's already being used */
                     i = (i <= 'i' - 'a' && !flags.lootabc) ? 'i' : 0;
-                    add_menu(win, NO_GLYPH, &any, i, 0, ATR_NONE,
+                    add_menu(win, &nul_glyphinfo, &any, i, 0, ATR_NONE,
                              "tip something being carried", MENU_ITEMFLAGS_SELECTED);
                 }
                 end_menu(win, "Tip which container?");
index 935c546307ef651ab024f50141997c7ab2e5a390..32657d5a992f11f362537948354aedcb54ba4525 100644 (file)
@@ -1390,25 +1390,25 @@ winid bannerwin; /* if not WIN_ERR, clear window and show copyright in menu */
             clear_nhwindow(bannerwin);
             /* COPYRIGHT_BANNER_[ABCD] */
             for (k = 1; k <= 4; ++k)
-                add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+                add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                          copyright_banner_line(k), MENU_ITEMFLAGS_NONE);
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "",
                      MENU_ITEMFLAGS_NONE);
         }
-        add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                  "Select one of your saved games", MENU_ITEMFLAGS_NONE);
         for (k = 0; saved[k]; ++k) {
             any.a_int = k + 1;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, saved[k],
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, saved[k], MENU_ITEMFLAGS_NONE);
         }
         clet = (k <= 'n' - 'a') ? 'n' : 0; /* new game */
         any.a_int = -1;                    /* not >= 0 */
-        add_menu(tmpwin, NO_GLYPH, &any, clet, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, clet, 0, ATR_NONE,
                  "Start a new character", MENU_ITEMFLAGS_NONE);
         clet = (k + 1 <= 'q' - 'a') ? 'q' : 0; /* quit */
         any.a_int = -2;
-        add_menu(tmpwin, NO_GLYPH, &any, clet, 0, ATR_NONE,
+        add_menu(tmpwin, &nul_glyphinfo, &any, clet, 0, ATR_NONE,
                  "Never mind (quit)", MENU_ITEMFLAGS_SELECTED);
         /* no prompt on end_menu, as we've done our own at the top */
         end_menu(tmpwin, (char *) 0);
index fe30684a14f030cdcd605b7355d765fa4ca03aaf..5072ce7f19c01c83187c7e7be0a853a00b6dcd90 100644 (file)
@@ -1904,28 +1904,30 @@ boolean preselect;
         any.a_int = 0;
         /* use four spaces of padding to fake a grayed out menu choice */
         Sprintf(buf, "%4s%s forces %s", "", constrainer, forcedvalue);
-        add_menu(where, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
+        add_menu(where, &nul_glyphinfo, &any, 0, 0, ATR_NONE, buf,
                  MENU_ITEMFLAGS_NONE);
     } else if (what) {
         any.a_int = RS_menu_arg(which);
         Sprintf(buf, "Pick%s %s first", (f >= 0) ? " another" : "", what);
-        add_menu(where, NO_GLYPH, &any, RS_menu_let[which], 0, ATR_NONE, buf,
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(where, &nul_glyphinfo, &any, RS_menu_let[which], 0,
+                 ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
     } else if (which == RS_filter) {
         char setfiltering[40];
 
         any.a_int = RS_menu_arg(RS_filter);
         Sprintf(setfiltering, "%s role/race/&c filtering",
                 gotrolefilter() ? "Reset" : "Set");
-        add_menu(where, NO_GLYPH, &any, '~', 0, ATR_NONE,
+        add_menu(where, &nul_glyphinfo, &any, '~', 0, ATR_NONE,
                  setfiltering, MENU_ITEMFLAGS_NONE);
     } else if (which == ROLE_RANDOM) {
         any.a_int = ROLE_RANDOM;
-        add_menu(where, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
+        add_menu(where, &nul_glyphinfo, &any, '*', 0,
+                 ATR_NONE, "Random",
                  preselect ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     } else if (which == ROLE_NONE) {
         any.a_int = ROLE_NONE;
-        add_menu(where, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
+        add_menu(where, &nul_glyphinfo, &any, 'q', 0,
+                 ATR_NONE, "Quit",
                  preselect ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     } else {
         impossible("role_menu_extra: bad arg (%d)", which);
index 4c92437cc4ff0b3bd32985df93f53b76931dd4d1..bea26783e6ea4127b59ea04c0aa9a660fade884e 100644 (file)
@@ -1583,13 +1583,14 @@ spellsortmenu()
             let = 'z'; /* assumes fewer than 26 sort choices... */
             /* separate final choice from others with a blank line */
             any.a_int = 0;
-            add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, "", MENU_ITEMFLAGS_NONE);
         } else {
             let = 'a' + i;
         }
         any.a_int = i + 1;
-        add_menu(tmpwin, NO_GLYPH, &any, let, 0, ATR_NONE, spl_sortchoices[i],
+        add_menu(tmpwin, &nul_glyphinfo, &any, let, 0,
+                 ATR_NONE, spl_sortchoices[i],
                  (i == g.spl_sortmode) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     }
     end_menu(tmpwin, "View known spells list sorted");
@@ -1676,8 +1677,8 @@ int *spell_no;
         Sprintf(buf, "Name\tLevel\tCategory\tFail\tRetention");
         fmt = "%s\t%-d\t%s\t%-d%%\t%s";
     }
-    add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, buf,
-             MENU_ITEMFLAGS_NONE);
+    add_menu(tmpwin, &nul_glyphinfo, &any, 0, 0,
+             iflags.menu_headings, buf, MENU_ITEMFLAGS_NONE);
     for (i = 0; i < MAXSPELL && spellid(i) != NO_SPELL; i++) {
         splnum = !g.spl_orderindx ? i : g.spl_orderindx[i];
         Sprintf(buf, fmt, spellname(splnum), spellev(splnum),
@@ -1686,8 +1687,10 @@ int *spell_no;
                 spellretention(splnum, retentionbuf));
 
         any.a_int = splnum + 1; /* must be non-zero */
-        add_menu(tmpwin, NO_GLYPH, &any, spellet(splnum), 0, ATR_NONE, buf,
-                 (splnum == splaction) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
+        add_menu(tmpwin, &nul_glyphinfo, &any, spellet(splnum), 0,
+                 ATR_NONE, buf,
+                 (splnum == splaction)
+                    ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
     }
     how = PICK_ONE;
     if (splaction == SPELLMENU_VIEW) {
@@ -1697,8 +1700,8 @@ int *spell_no;
         } else {
             /* more than 1 spell, add an extra menu entry */
             any.a_int = SPELLMENU_SORT + 1;
-            add_menu(tmpwin, NO_GLYPH, &any, '+', 0, ATR_NONE,
-                     "[sort spells]", MENU_ITEMFLAGS_NONE);
+            add_menu(tmpwin, &nul_glyphinfo, &any, '+', 0,
+                     ATR_NONE, "[sort spells]", MENU_ITEMFLAGS_NONE);
         }
     }
     end_menu(tmpwin, prompt);
index 88bd395f725386c55bdcf599efad8ed82b1c18e8..4f47b1d82189b17fcaaba2f8909603e966e68afa 100644 (file)
@@ -617,8 +617,8 @@ dotelecmd()
         any = cg.zeroany;
         for (i = 0; i < SIZE(tports); ++i) {
             any.a_int = (int) tports[i].menulet;
-            add_menu(win, NO_GLYPH, &any, (char) any.a_int, 0, ATR_NONE,
-                     tports[i].menudesc,
+            add_menu(win, &nul_glyphinfo, &any, (char) any.a_int, 0,
+                     ATR_NONE, tports[i].menudesc,
                      (tports[i].menulet == 'w') ? MENU_ITEMFLAGS_SELECTED
                                                 : MENU_ITEMFLAGS_NONE);
         }
index 0ccefdf8cf82048ebf31edca74f251fe7a6ed7e8..dd2aad43000f6c46c3dd2fc5c80344b800aa82df 100644 (file)
@@ -1220,18 +1220,18 @@ enhance_weapon_skill()
                         (u.ulevel < MAXULEV)
                             ? "when you're more experienced"
                             : "if skill slots become available");
-                add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
             }
             if (maxxed_cnt > 0) {
                 Sprintf(buf,
                  "(Skill%s flagged by \"#\" cannot be enhanced any further.)",
                         plur(maxxed_cnt));
-                add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
             }
-            add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, "", MENU_ITEMFLAGS_NONE);
         }
 
         /* List the skills, making ones that could be advanced
@@ -1244,7 +1244,8 @@ enhance_weapon_skill()
                 /* Print headings for skill types */
                 any = cg.zeroany;
                 if (i == skill_ranges[pass].first)
-                    add_menu(win, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
+                    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                             iflags.menu_headings,
                              skill_ranges[pass].name, MENU_ITEMFLAGS_NONE);
 
                 if (P_RESTRICTED(i))
@@ -1286,8 +1287,8 @@ enhance_weapon_skill()
                                 sklnambuf);
                 }
                 any.a_int = can_advance(i, speedy) ? i + 1 : 0;
-                add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf,
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                         ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
             }
 
         Strcpy(buf, (to_advance > 0) ? "Pick a skill to advance:"
index 73007370512e739031a5f41ec61375edcaba79e1..38f175a9ed9f1d9b781bfcf75d5002c4c3d7186c 100644 (file)
@@ -70,7 +70,7 @@ static void FDECL(dump_clear_nhwindow, (winid));
 static void FDECL(dump_display_nhwindow, (winid, BOOLEAN_P));
 static void FDECL(dump_destroy_nhwindow, (winid));
 static void FDECL(dump_start_menu, (winid, unsigned long));
-static void FDECL(dump_add_menu, (winid, int, const ANY_P *, CHAR_P,
+static void FDECL(dump_add_menu, (winid, const glyph_info *, const ANY_P *, CHAR_P,
                                       CHAR_P, int, const char *, unsigned int));
 static void FDECL(dump_end_menu, (winid, const char *));
 static int FDECL(dump_select_menu, (winid, int, MENU_ITEM_P **));
@@ -516,11 +516,13 @@ static void FDECL(hup_init_nhwindows, (int *, char **));
 static void FDECL(hup_exit_nhwindows, (const char *));
 static winid FDECL(hup_create_nhwindow, (int));
 static int FDECL(hup_select_menu, (winid, int, MENU_ITEM_P **));
-static void FDECL(hup_add_menu, (winid, int, const anything *, CHAR_P, CHAR_P,
-                                 int, const char *, unsigned int));
+static void FDECL(hup_add_menu, (winid, const glyph_info *, const anything *,
+                                 CHAR_P, CHAR_P, int, const char *,
+                                 unsigned int));
 static void FDECL(hup_end_menu, (winid, const char *));
 static void FDECL(hup_putstr, (winid, int, const char *));
-static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *));
+static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P,
+                                    const glyph_info *, const glyph_info *));
 static void FDECL(hup_outrip, (winid, int, time_t));
 static void FDECL(hup_curs, (winid, int, int));
 static void FDECL(hup_display_nhwindow, (winid, BOOLEAN_P));
@@ -704,9 +706,10 @@ struct mi **menu_list UNUSED;
 
 /*ARGSUSED*/
 static void
-hup_add_menu(window, glyph, identifier, sel, grpsel, attr, txt, itemflags)
+hup_add_menu(window, glyphinfo, identifier, sel, grpsel, attr, txt, itemflags)
 winid window UNUSED;
-int glyph UNUSED, attr UNUSED;
+const glyph_info *glyphinfo UNUSED;
+int attr UNUSED;
 const anything *identifier UNUSED;
 char sel UNUSED, grpsel UNUSED;
 const char *txt UNUSED;
@@ -736,12 +739,11 @@ const char *text UNUSED;
 
 /*ARGSUSED*/
 static void
-hup_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
+hup_print_glyph(window, x, y, glyphinfo, bkglyphinfo)
 winid window UNUSED;
 xchar x UNUSED, y UNUSED;
-int glyph UNUSED;
-int bkglyph UNUSED;
-unsigned *glyphmod UNUSED;
+const glyph_info *glyphinfo UNUSED;
+const glyph_info *bkglyphinfo UNUSED;
 {
     return;
 }
@@ -1340,9 +1342,9 @@ unsigned long mbehavior UNUSED;
 
 /*ARGSUSED*/
 static void
-dump_add_menu(win, glyph, identifier, ch, gch, attr, str, itemflags)
+dump_add_menu(win, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 winid win UNUSED;
-int glyph;
+const glyph_info *glyphinfo;
 const anything *identifier UNUSED;
 char ch;
 char gch UNUSED;
@@ -1351,7 +1353,7 @@ const char *str;
 unsigned int itemflags UNUSED;
 {
     if (dumplog_file) {
-        if (glyph == NO_GLYPH)
+        if (glyphinfo->glyph == NO_GLYPH)
             fprintf(dumplog_file, " %s\n", str);
         else
             fprintf(dumplog_file, "  %c - %s\n", ch, str);
@@ -1434,15 +1436,20 @@ int
 glyph2ttychar(glyph)
 int glyph;
 {
-    int so;
-    unsigned glyphmod[NUM_GLYPHMOD];
+    glyph_info glyphinfo;
 
-    map_glyphmod(0, 0, glyph, MG_FLAG_RETURNIDX, glyphmod);
-    so = (int) glyphmod[GM_TTYCHAR];
-    if (so >= 0  && so < SYM_MAX)
-        return (int) g.showsyms[so];
-    else
-        return ' ';
+    map_glyphinfo(0, 0, glyph, 0, &glyphinfo);
+    return glyphinfo.ttychar;
+}
+
+int
+glyph2symidx(glyph)
+int glyph;
+{
+    glyph_info glyphinfo;
+
+    map_glyphinfo(0, 0, glyph, 0, &glyphinfo);
+    return glyphinfo.symidx;
 }
 
 char *
@@ -1462,7 +1469,7 @@ const char *str;
 {
     static const char hex[] = "00112233445566778899aAbBcCdDeEfF";
     char *put = buf;
-    unsigned glyphmod[NUM_GLYPHMOD];
+    glyph_info glyphinfo = nul_glyphinfo;
 
     if (!str)
         return strcpy(buf, "");
@@ -1488,8 +1495,8 @@ const char *str;
                             gv = (gv * 16) + ((int) (dp - hex) / 2);
                         else
                             break;
-                    map_glyphmod(0, 0, gv, MG_FLAG_RETURNIDX, glyphmod);
-                    so = glyphmod[GM_TTYCHAR];
+                    map_glyphinfo(0, 0, gv, 0, &glyphinfo);
+                    so = glyphinfo.symidx;
                     *put++ = g.showsyms[so];
                     /* 'str' is ready for the next loop iteration and '*str'
                        should not be copied at the end of this iteration */
index ba4c215679a5103e13fff9edbbca43196500b2f2..78c5df7ce1a6ecb7dc8642d73238dabb499d8127 100644 (file)
@@ -423,12 +423,12 @@ void NetHackQtBind::qt_start_menu(winid wid, unsigned long mbehavior UNUSED)
     window->StartMenu(wid == WIN_INVEN);
 }
 
-void NetHackQtBind::qt_add_menu(winid wid, int glyph,
+void NetHackQtBind::qt_add_menu(winid wid, const glyph_info *glyphinfo,
     const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr,
     const char *str, unsigned itemflags)
 {
     NetHackQtWindow* window=id_to_window[(int)wid];
-    window->AddMenu(glyph, identifier, ch, gch, attr,
+    window->AddMenu(glyphinfo->glyph, identifier, ch, gch, attr,
             QString::fromLatin1(str),
             itemflags);
 }
@@ -474,12 +474,13 @@ void NetHackQtBind::qt_cliparound_window(winid wid, int x, int y)
     NetHackQtWindow* window=id_to_window[(int)wid];
     window->ClipAround(x,y);
 }
-void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph,
-                                    int bkglyph UNUSED, unsigned *glyphmod)
+void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,
+                                   const glyph_info *glyphinfo,
+                                   const glyph_info *bkglyphinfo UNUSED)
 {
     /* TODO: bkglyph */
     NetHackQtWindow* window=id_to_window[(int)wid];
-    window->PrintGlyph(x,y,glyph,glyphmod);
+    window->PrintGlyph(x,y,glyphinfo);
 }
 //void NetHackQtBind::qt_print_glyph_compose(winid wid,xchar x,xchar y,int glyph1, int glyph2)
 //{
index 73f4d4fa84919cade3ce46bb42cd1465e8a223c3..80652a7ea40a940ffba2036b53f350f48b32845c 100644 (file)
@@ -52,7 +52,7 @@ public:
        static void qt_putstr(winid wid, int attr, const QString& text);
        static void qt_display_file(const char *filename, BOOLEAN_P must_exist);
        static void qt_start_menu(winid wid, unsigned long mbehavior);
-       static void qt_add_menu(winid wid, int glyph,
+       static void qt_add_menu(winid wid, const glyph_info *glyphinfo,
                const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr,
                const char *str, unsigned int itemflags);
        static void qt_end_menu(winid wid, const char *prompt);
@@ -64,7 +64,8 @@ public:
        static void qt_cliparound(int x, int y);
        static void qt_cliparound_window(winid wid, int x, int y);
         static void qt_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
-                                   int glyph, int bkglyph, unsigned int *);
+                                   const glyph_info *glyphingo, 
+                                  const glyph_info *bkglyphinfo);
        static void qt_raw_print(const char *str);
        static void qt_raw_print_bold(const char *str);
        static int qt_nhgetch();
index 880e780d8b828e783740f0732a9b6cbd29ca2428..90320e5eb111080a498c3ec607628ba988fb7ce7 100644 (file)
@@ -536,13 +536,13 @@ void NetHackQtMapViewport::CursorTo(int x,int y)
     Changed(cursor.x(), cursor.y());
 }
 
-void NetHackQtMapViewport::PrintGlyph(int x, int y, int theglyph,
-                                      unsigned *glyphmod)
+void NetHackQtMapViewport::PrintGlyph(int x, int y,
+                                      const glyph_info *glyphinfo)
 {
-    Glyph(x, y) = (unsigned short) theglyph;
-    Glyphttychar(x, y) = (unsigned short) glyphmod[GM_TTYCHAR];
-    Glyphcolor(x, y) = (unsigned short) glyphmod[GM_COLOR];
-    Glyphflags(x, y) = glyphmod[GM_FLAGS];
+    Glyph(x, y) = (unsigned short) glyphinfo->glyph;
+    Glyphttychar(x, y) = (unsigned short) glyphinfo->ttychar;
+    Glyphcolor(x, y) = (unsigned short) glyphinfo->color;
+    Glyphflags(x, y) = glyphinfo->glyphflags;
     Changed(x, y);
 }
 
@@ -647,9 +647,10 @@ void NetHackQtMapWindow2::ClipAround(int x,int y)
     ensureVisible(x,y,width()*0.45,height()*0.45);
 }
 
-void NetHackQtMapWindow2::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod)
+void NetHackQtMapWindow2::PrintGlyph(int x,int y,
+                                     const glyph_info *glyphinfo)
 {
-    m_viewport->PrintGlyph(x, y, glyph, glyphmod);
+    m_viewport->PrintGlyph(x, y, glyphinfo);
 }
 
 #if 0 //RLC
@@ -1004,12 +1005,12 @@ void NetHackQtMapWindow::ClipAround(int x,int y)
     viewport.center(x,y,0.45,0.45);
 }
 
-void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod)
+void NetHackQtMapWindow::PrintGlyph(int x,int y, const glyph_info *glyphinfo)
 {
-    Glyph(x,y)=glyph;
-    Glyphttychar(x,y)=glyphmod[GM_TTYCHAR];
-    Glyphcolor(x,y)=glyphmod[GM_COLOR];
-    Glyphflags(x,y)=glyphmod[GM_FLAGS];
+    Glyph(x,y)=glyphinfo->glyph;
+    Glyphttychar(x,y)=glyphinfo->ttychar;
+    Glyphcolor(x,y)=glyphinfo->color;
+    Glyphflags(x,y)=glyphinfo->glyphflags;
     Changed(x,y);
 }
 
index 82050dc980fe2c934592bbc414a872caf94ca613..0303b0ef95b47724ce34fe89d9d14d9ad381e1c9 100644 (file)
@@ -56,7 +56,7 @@ private:
        void Clear();
        void Display(bool block);
        void CursorTo(int x,int y);
-       void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod);
+       void PrintGlyph(int x,int y, const glyph_info *glyphinfo);
        void Changed(int x, int y);
        void updateTiles();
         void SetupTextmapFont(QPainter &painter);
@@ -79,7 +79,7 @@ public:
        virtual void CursorTo(int x,int y);
        virtual void PutStr(int attr, const QString& text);
        virtual void ClipAround(int x,int y);
-       virtual void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod);
+       virtual void PrintGlyph(int x,int y, const glyph_info *glyphinfo);
 
 signals:
        void resized();
index 670ae8da8b7d09487c37b4230d16296b062b8f89..eafcb59212d75477e999d9ec4f359d82a2c6a0e4 100644 (file)
@@ -109,7 +109,7 @@ void NetHackQtWindow::EndMenu(const QString& prompt UNUSED) { puts("unexpected E
 int NetHackQtWindow::SelectMenu(int how UNUSED, MENU_ITEM_P **menu_list UNUSED)
                                { puts("unexpected SelectMenu"); return 0; }
 void NetHackQtWindow::ClipAround(int x UNUSED,int y UNUSED) { puts("unexpected ClipAround"); }
-void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,int glyph UNUSED, unsigned *glyphmod UNUSED) { puts("unexpected PrintGlyph"); }
+void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,const glyph_info *glyphinfo UNUSED) { puts("unexpected PrintGlyph"); }
 //void NetHackQtWindow::PrintGlyphCompose(int x,int y,int,int) { puts("unexpected PrintGlyphCompose"); }
 void NetHackQtWindow::UseRIP(int how UNUSED, time_t when UNUSED) { puts("unexpected UseRIP"); }
 
index 681b06be1938079d5a47e5c8e4a6f2a2dbfcedc7..15f432268d70963417aa346f44f885bc2e4f5563 100644 (file)
@@ -40,7 +40,7 @@ public:
        virtual void EndMenu(const QString& prompt);
        virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
         virtual void ClipAround(int x, int y);
-        virtual void PrintGlyph(int x, int y, int glyph, unsigned *glyphmod);
+        virtual void PrintGlyph(int x, int y, const glyph_info *glyphinfo);
        virtual void UseRIP(int how, time_t when);
 
        int nhid;
index 8130c5fc62bfc60706b8633bb2d88c3cc349542b..1a7a2297ae81d6e98a1abee1f76146c3a9202497 100644 (file)
@@ -1962,7 +1962,7 @@ boolean complain;
 
     any = cg.zeroany;
     while (dlb_fgets(line, LLEN, fp)) {
-        X11_add_menu(newwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
+        X11_add_menu(newwin, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
                      line, MENU_ITEMFLAGS_NONE);
     }
     (void) dlb_fclose(fp);
index ffab4f649b1841be1f287ce1151dd8cc260d1e67..7bd4e86fc5f43a942ee2af829822f42e013bcaec 100644 (file)
@@ -73,12 +73,11 @@ static void FDECL(display_cursor, (struct xwindow *));
 /* Global functions ======================================================= */
 
 void
-X11_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
+X11_print_glyph(window, x, y, glyphinfo, bkglyphinfo)
 winid window;
 xchar x, y;
-int glyph;
-int bkglyph UNUSED;
-unsigned *glyphmod UNUSED;
+const glyph_info *glyphinfo;
+const glyph_info *bkglyphinfo UNUSED;
 {
     struct map_info_t *map_info;
     boolean update_bbox = FALSE;
@@ -94,8 +93,8 @@ unsigned *glyphmod UNUSED;
     {
         unsigned short *t_ptr = &map_info->tile_map.glyphs[y][x].glyph;
 
-        if (*t_ptr != glyph) {
-            *t_ptr = glyph;
+        if (*t_ptr != glyphinfo->glyph) {
+            *t_ptr = glyphinfo->glyph;
             if (map_info->is_tile)
                 update_bbox = TRUE;
         }
@@ -110,13 +109,13 @@ unsigned *glyphmod UNUSED;
         register unsigned char *co_ptr;
 #endif
 
-        color = glyphmod[GM_COLOR];
-        special = glyphmod[GM_FLAGS];
-        och = glyphmod[GM_TTYCHAR];
+        color = glyphinfo->color;
+        special = glyphinfo->glyphflags;
+        och = glyphinfo->ttychar;
         ch = (uchar) och;
 
-        if (special != map_info->tile_map.glyphs[y][x].special) {
-            map_info->tile_map.glyphs[y][x].special = special;
+        if (special != map_info->tile_map.glyphs[y][x].glyphflags) {
+            map_info->tile_map.glyphs[y][x].glyphflags = special;
             update_bbox = TRUE;
         }
 
@@ -948,7 +947,7 @@ struct map_info_t *map_info;
     for (x = 0; x < COLNO; x++)
         for (y = 0; y < ROWNO; y++) {
             tile_map->glyphs[y][x].glyph = !x ? g_nothg : g_unexp;
-            tile_map->glyphs[y][x].special = 0;
+            tile_map->glyphs[y][x].glyphflags = 0;
 
             text_map->text[y][x] = (uchar) (!x ? mgnothg : mgunexp);
 #ifdef TEXTCOLOR
@@ -1297,7 +1296,7 @@ boolean inverted;
                 int dest_x = (cur_col - COL0_OFFSET) * tile_map->square_width;
                 int dest_y = row * tile_map->square_height;
 
-                if ((tile_map->glyphs[row][cur_col].special & MG_FEMALE))
+                if ((tile_map->glyphs[row][cur_col].glyphflags & MG_FEMALE))
                     tile++; /* advance to the female tile variation */
                 src_x = (tile % TILES_PER_ROW) * tile_width;
                 src_y = (tile / TILES_PER_ROW) * tile_height;
@@ -1306,7 +1305,7 @@ boolean inverted;
                           src_x, src_y, tile_width, tile_height,
                           dest_x, dest_y);
 
-                if (glyph_is_pet(glyph) && iflags.hilite_pet) {
+                if ((tile_map->glyphs[row][cur_col].glyphflags & MG_PET) && iflags.hilite_pet) {
                     /* draw pet annotation (a heart) */
                     XSetForeground(dpy, tile_map->black_gc,
                                    pet_annotation.foreground);
@@ -1321,7 +1320,7 @@ boolean inverted;
                     XSetForeground(dpy, tile_map->black_gc,
                                    BlackPixelOfScreen(screen));
                 }
-                if ((tile_map->glyphs[row][cur_col].special & MG_OBJPILE)) {
+                if ((tile_map->glyphs[row][cur_col].glyphflags & MG_OBJPILE)) {
                     /* draw object pile annotation (a plus sign) */
                     XSetForeground(dpy, tile_map->black_gc,
                                    pile_annotation.foreground);
index 4390efedaa87ec33d6f6b8c66325eb612cbcf24a..c4c9f214259a8b231a05c92d3199210462ea0c5b 100644 (file)
@@ -631,9 +631,9 @@ unsigned long mbehavior UNUSED;
 
 /*ARGSUSED*/
 void
-X11_add_menu(window, glyph, identifier, ch, gch, attr, str, itemflags)
+X11_add_menu(window, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 winid window;
-int glyph; /* unused (for now) */
+const glyph_info *glyphinfo UNUSED;
 const anything *identifier;
 char ch;
 char gch; /* group accelerator (0 = no group) */
@@ -645,8 +645,6 @@ unsigned itemflags;
     struct menu_info_t *menu_info;
     boolean preselected = (itemflags & MENU_ITEMFLAGS_SELECTED) != 0;
 
-    nhUse(glyph);
-
     check_winid(window);
     menu_info = window_list[window].menu_information;
     if (!menu_info->is_menu) {
index fb84ab32ae230c11dce1530d7bae41746c5de777..e1e7f9de1b9d18e7dc75fae557e4158381eb27b2 100644 (file)
@@ -183,9 +183,9 @@ unsigned long mbehavior;
 }
 
 void
-chainin_add_menu(window, glyph, identifier, ch, gch, attr, str, itemflags)
+chainin_add_menu(window, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 winid window;               /* window to use, must be of type NHW_MENU */
-int glyph;                  /* glyph to display with item (unused) */
+const glyph_info *glyphinfo; /* glyph and other glyph info to display with item */
 const anything *identifier; /* what to return if selected */
 char ch;                    /* keyboard accelerator (0 = pick our own) */
 char gch;                   /* group accelerator (0 = no group) */
@@ -194,8 +194,8 @@ const char *str;            /* menu string */
 unsigned int itemflags;     /* flags such as item is marked as selected
                                MENU_ITEMFLAGS_SELECTED */
 {
-    (*cibase->nprocs->win_add_menu)(cibase->ndata, window, glyph, identifier,
-                                    ch, gch, attr, str, itemflags);
+    (*cibase->nprocs->win_add_menu)(cibase->ndata, window, glyphinfo,
+                                    identifier, ch, gch, attr, str, itemflags);
 }
 
 void
@@ -272,13 +272,13 @@ char *posbar;
 
 /* XXX can we decode the glyph in a meaningful way? */
 void
-chainin_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
+chainin_print_glyph(window, x, y, glyphinfo, bkglyphinfo)
 winid window;
 xchar x, y;
-int glyph, bkglyph;
-int glyphmod[NUM_GLYPHMOD];
+const glyph_info *glyphinfo;
+const glyph_info *bkglyphinfo;
 {
-    (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph, glyphmod);
+    (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyphinfo, bkglyphinfo);
 }
 
 void
index 3ad84aa453aaef70299e133c3c569fdaf812c06e..5630a90561afc53d1f0022c4f1a26e95225d60ba 100644 (file)
@@ -224,11 +224,11 @@ unsigned long mbehavior;
 }
 
 void
-chainout_add_menu(vp, window, glyph, identifier, ch, gch, attr, str,
+chainout_add_menu(vp, window, glyphinfo, identifier, ch, gch, attr, str,
                   itemflags)
 void *vp;
 winid window;               /* window to use, must be of type NHW_MENU */
-int glyph;                  /* glyph to display with item (unused) */
+const glyph_info *glyphinfo /* glyph plus glyph info to display with item */
 const anything *identifier; /* what to return if selected */
 char ch;                    /* keyboard accelerator (0 = pick our own) */
 char gch;                   /* group accelerator (0 = no group) */
@@ -238,8 +238,8 @@ unsigned int itemflags;     /* itemflags such as marked as selected */
 {
     struct chainout_data *tdp = vp;
 
-    (*tdp->nprocs->win_add_menu)(window, glyph, identifier, ch, gch, attr,
-                                 str, itemflags);
+    (*tdp->nprocs->win_add_menu)(window, glyphinfo, identifier, ch, gch,
+                                 attr, str, itemflags);
 }
 
 void
@@ -336,16 +336,16 @@ char *posbar;
 #endif
 
 void
-chainout_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod)
+chainout_print_glyph(vp, window, x, y, glyphinfo, bkglyphinfo)
 void *vp;
 winid window;
 xchar x, y;
-int glyph, bkglyph;
-int glyphmod[NUM_GLYPHMOD];
+const glyph_info *glyphinfo;
+const glyph_info *bkglyphinfo;
 {
     struct chainout_data *tdp = vp;
 
-    (*tdp->nprocs->win_print_glyph)(window, x, y, glyph, bkglyph, glyphmod);
+    (*tdp->nprocs->win_print_glyph)(window, x, y, glyphinfo, bkglyphinfo);
 }
 
 void
index 854e6372987f129d45c7f1432a965b6c8deea044..f8604f2e002e509cb598ca1be59d0f0f77004388 100644 (file)
@@ -372,10 +372,10 @@ unsigned long mbehavior;
 }
 
 void
-trace_add_menu(vp, window, glyph, identifier, ch, gch, attr, str, itemflags)
+trace_add_menu(vp, window, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 void *vp;
 winid window;               /* window to use, must be of type NHW_MENU */
-int glyph;                  /* glyph to display with item (unused) */
+const glyph_info *glyphinfo /* glyph plus glyph info to display with item */
 const anything *identifier; /* what to return if selected */
 char ch;                    /* keyboard accelerator (0 = pick our own) */
 char gch;                   /* group accelerator (0 = no group) */
@@ -402,19 +402,19 @@ unsigned int itemflags;     /* itemflags such as marked as selected */
 
     if (str) {
         fprintf(wc_tracelogf,
-                "%sadd_menu(%d, %d, %p, %s, %s, %d, '%s'(%d), %u)\n", INDENT,
-                window, glyph, (void *) identifier, buf_ch, buf_gch, attr,
-                str, (int) strlen(str), itemflags);
+                "%sadd_menu(%d, %d, %u, %p, %s, %s, %d, '%s'(%d), %u)\n", INDENT,
+                window, glyphinfo->glyph, glyphinfo->flags, (void *) identifier,
+                buf_ch, buf_gch, attr, str, (int) strlen(str), itemflags);
     } else {
         fprintf(wc_tracelogf,
-                "%sadd_menu(%d, %d, %p, %s, %s, %d, NULL, %u)\n", INDENT,
-                window, glyph, (void *) identifier, buf_ch, buf_gch, attr,
-                itemflags);
+                "%sadd_menu(%d, %d, %u, %p, %s, %s, %d, NULL, %u)\n", INDENT,
+                window, glyphinfo->glyph, glyphinfo->flags, (void *) identifier,
+                buf_ch, buf_gch, attr, itemflags);
     }
 
     PRE;
-    (*tdp->nprocs->win_add_menu)(tdp->ndata, window, glyph, identifier, ch,
-                                 gch, attr, str, itemflags);
+    (*tdp->nprocs->win_add_menu)(tdp->ndata, window, glyphinfo,
+                                 identifier,ch, gch, attr, str, itemflags);
     POST;
 }
 
@@ -575,23 +575,23 @@ char *posbar;
 }
 #endif
 
-/* XXX can we decode the glyph in a meaningful way? see map_glyphmod()?
+/* XXX can we decode the glyph in a meaningful way? see map_glyphinfo()?
  genl_putmixed?  */
 void
-trace_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod)
+trace_print_glyph(vp, window, x, y, glyphinfo, bkglyphinfo)
 void *vp;
 winid window;
 xchar x, y;
-int glyph, bkglyph;
-int glyphmod[NUM_GLYPHMOD];
+const glyph_info *glyphinfo;
+const glyph_info *bkglyphinfo;
 {
     struct trace_data *tdp = vp;
 
-    fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d, %lu)\n", INDENT, window,
-            x, y, glyph, bkglyph, glyphmod);
+    fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d)\n", INDENT, window,
+            x, y, glyphinfo->glyph, bkglyphinfo->glyph);
 
     PRE;
-    (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph, glyphmod);
+    (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyphinfo, bkglyphinfo);
     POST;
 }
 
index 19996e2794a3ed88be7f9d9a10d5f87af2ef85af..e5a8fc5a06e9d1f60d3e7d0fbad226aef4f2d10a 100644 (file)
@@ -58,7 +58,7 @@ int func(CHAR_P arg) { ... }
 
 typedef struct nhmi {
     winid wid;                  /* NetHack window id */
-    int glyph;                  /* Menu glyphs */
+    glyph_info glyphinfo;       /* holds menu glyph and additional glyph info */
     anything identifier;        /* Value returned if item selected */
     CHAR_P accelerator;         /* Character used to select item from menu */
     CHAR_P group_accel;         /* Group accelerator for menu item, if any */
@@ -582,7 +582,7 @@ curs_new_menu_item(winid wid, const char *str)
     curses_rtrim(new_str);
     new_item = (nhmenu_item *) alloc((unsigned) sizeof (nhmenu_item));
     new_item->wid = wid;
-    new_item->glyph = NO_GLYPH;
+    new_item->glyphinfo = nul_glyphinfo;
     new_item->identifier = cg.zeroany;
     new_item->accelerator = '\0';
     new_item->group_accel = '\0';
@@ -601,8 +601,9 @@ curs_new_menu_item(winid wid, const char *str)
 /* Add a menu item to the given menu window */
 
 void
-curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
-                       CHAR_P accelerator, CHAR_P group_accel, int attr,
+curses_add_nhmenu_item(winid wid, const glyph_info *glyphinfo,
+                       const ANY_P *identifier, CHAR_P accelerator,
+                       CHAR_P group_accel, int attr,
                        const char *str, unsigned itemflags)
 {
     nhmenu_item *new_item, *current_items, *menu_item_ptr;
@@ -620,7 +621,8 @@ curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
     }
 
     new_item = curs_new_menu_item(wid, str);
-    new_item->glyph = glyph;
+    if (glyphinfo)
+        new_item->glyphinfo = *glyphinfo;
     new_item->identifier = *identifier;
     new_item->accelerator = accelerator;
     new_item->group_accel = group_accel;
@@ -1179,12 +1181,8 @@ menu_display_page(nhmenu *menu, WINDOW * win, int page_num, char *selectors)
         }
 #if 0
         /* FIXME: menuglyphs not implemented yet */
-        if (menu_item_ptr->glyph != NO_GLYPH && iflags.use_menu_glyphs) {
-            unsigned glyphmod[NUM_GLYPHMOD];
-
-            map_glyphmod(0, 0, menu_item_ptr->glyph, 0U, glyphmod);
-            color = (int) glyphmod[GM_COLOR];
-
+        if (menu_item_ptr->glyphinfo.glyph != NO_GLYPH && iflags.use_menu_glyphs) {
+            color = (int) menu_item_ptr->glyphinfo.color;
             curses_toggle_color_attr(win, color, NONE, ON);
             mvwaddch(win, menu_item_ptr->line_num + 1, start_col, curletter);
             curses_toggle_color_attr(win, color, NONE, OFF);
index 3bcd7dee2f241f438f507edde85d48eafe609146..e964fd07f775cf714dc4db1e3a0994d65f61aa0a 100644 (file)
@@ -13,8 +13,9 @@ int curses_character_input_dialog(const char *prompt, const char *choices,
                                   CHAR_P def);
 int curses_ext_cmd(void);
 void curses_create_nhmenu(winid wid, unsigned long);
-void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
-                            CHAR_P accelerator, CHAR_P group_accel, int attr,
+void curses_add_nhmenu_item(winid wid, const glyph_info *glyphinfo,
+                            const ANY_P *identifier, CHAR_P accelerator,
+                            CHAR_P group_accel, int attr,
                             const char *str, unsigned itemflags);
 void curs_menu_set_bottom_heavy(winid);
 void curses_finalize_nhmenu(winid wid, const char *prompt);
index 07513a7e1a4c2bf0eb959849bd85f82effa8b4fb..27c6fc9cbe30606773f256f6bf5cd141a3a47b3c 100644 (file)
@@ -742,20 +742,20 @@ curses_character_dialog(const char **choices, const char *prompt)
         }
 
         identifier.a_int = (count + 1); /* Must be non-zero */
-        curses_add_menu(wid, NO_GLYPH, &identifier, curletter, 0,
+        curses_add_menu(wid, &nul_glyphinfo, &identifier, curletter, 0,
                         A_NORMAL, choices[count], MENU_ITEMFLAGS_NONE);
         used_letters[count] = curletter;
     }
 
     /* Random Selection */
     identifier.a_int = ROLE_RANDOM;
-    curses_add_menu(wid, NO_GLYPH, &identifier, '*', 0, A_NORMAL, "Random",
-                    MENU_ITEMFLAGS_NONE);
+    curses_add_menu(wid, &nul_glyphinfo, &identifier, '*', 0,
+                    A_NORMAL, "Random", MENU_ITEMFLAGS_NONE);
 
     /* Quit prompt */
     identifier.a_int = ROLE_NONE;
-    curses_add_menu(wid, NO_GLYPH, &identifier, 'q', 0, A_NORMAL, "Quit",
-                    MENU_ITEMFLAGS_NONE);
+    curses_add_menu(wid, &nul_glyphinfo, &identifier, 'q', 0,
+                    A_NORMAL, "Quit", MENU_ITEMFLAGS_NONE);
     curses_end_menu(wid, prompt);
     ret = curses_select_menu(wid, PICK_ONE, &selected);
     if (ret == 1) {
index 8c77829e8bd9319ae1e1a98d7d93390e2f25aadd..0906763de48cf6d634063e8ab574e98b00a7c0df 100644 (file)
@@ -55,9 +55,8 @@ curses_update_inv(void)
 
 /* Adds an inventory item.  'y' is 1 rather than 0 for the first item. */
 void
-curses_add_inv(int y,
-               int glyph UNUSED,
-               CHAR_P accelerator, attr_t attr, const char *str)
+curses_add_inv(int y, const glyph_info *glyphinfo UNUSED, CHAR_P accelerator,
+               attr_t attr, const char *str)
 {
     WINDOW *win = curses_get_nhwin(INV_WIN);
     int color = NO_COLOR;
@@ -120,13 +119,11 @@ curses_add_inv(int y,
     }
 #if 0 /* FIXME: MENU GLYPHS */
     if (accelerator && glyph != NO_GLYPH && iflags.use_menu_glyphs) {
-        unsigned glyphmod[NUM_GLYPHMOD];
         int symbol;
         attr_t glyphclr;
 
-        map_glyphmod(0, 0, glyph, 0U, glyphmod);
-        symbol = (int) glyphmod[GM_TTYCHAR];
-        color = (int) glyphmod[GM_COLOR];
+        symbol = glyphinfo->ttychar;
+        color = glyphinfo->color;
 
         glyphclr = curses_color_attr(color, 0);
         wattron(win, glyphclr);
index 627147b2818a59d63262748d77dbee84aa32b8a9..dd736d407f598dce47f3f188c18b42fdfc81d6d4 100644 (file)
@@ -524,7 +524,8 @@ curses_start_menu(winid wid, unsigned long mbehavior)
 }
 
 /*
-add_menu(winid wid, int glyph, const anything identifier,
+add_menu(winid wid, const glyph_info *glyphinfo,
+                                const anything identifier,
                                 char accelerator, char groupacc,
                                 int attr, char *str, unsigned int itemflags)
                 -- Add a text line str to the given menu window.  If identifier
@@ -536,7 +537,8 @@ add_menu(winid wid, int glyph, const anything identifier,
                    accelerator.  It is up to the window-port to make the
                    accelerator visible to the user (e.g. put "a - " in front
                    of str).  The value attr is the same as in putstr().
-                   Glyph is an optional glyph to accompany the line.  If
+                -- Glyph is an optional glyph to accompany the line and its
+                   modifiers (if any) can be found in glyphinfo.  If
                    window port cannot or does not want to display it, this
                    is OK.  If there is no glyph applicable, then this
                    value will be NO_GLYPH.
@@ -555,7 +557,8 @@ add_menu(winid wid, int glyph, const anything identifier,
                    menu is displayed, set bit MENU_ITEMFLAGS_SELECTED.
 */
 void
-curses_add_menu(winid wid, int glyph, const ANY_P * identifier,
+curses_add_menu(winid wid, const glyph_info *glyphinfo,
+                const ANY_P * identifier,
                 CHAR_P accelerator, CHAR_P group_accel, int attr,
                 const char *str, unsigned itemflags)
 {
@@ -565,12 +568,12 @@ curses_add_menu(winid wid, int glyph, const ANY_P * identifier,
     curses_attr = curses_convert_attr(attr);
 
     if (inv_update) {
-        curses_add_inv(inv_update, glyph, accelerator, curses_attr, str);
+        curses_add_inv(inv_update, glyphinfo, accelerator, curses_attr, str);
         inv_update++;
         return;
     }
 
-    curses_add_nhmenu_item(wid, glyph, identifier, accelerator, group_accel,
+    curses_add_nhmenu_item(wid, glyphinfo, identifier, accelerator, group_accel,
                            curses_attr, str, itemflags);
 }
 
@@ -686,30 +689,45 @@ curses_cliparound(int x, int y)
 }
 
 /*
-print_glyph(window, x, y, glyph, bkglyph, glyphmod)
-                -- Print the glyph at (x,y) on the given window.  Glyphs are
-                   integers at the interface, mapped to whatever the window-
+print_glyph(window, x, y, glyphinfo, bkglyphinfo)
+                -- Print glyph at (x,y) on the given window.  Glyphs are
+                   integers within the glyph_info struct that is passed
+                   at the interface, mapped to whatever the window-
                    port wants (symbol, font, color, attributes, ...there's
                    a 1-1 map between glyphs and distinct things on the map).
-                   bkglyph is to render the background behind the glyph.
+                   bkglyphinfo is to render the background behind the glyph.
                    It's not used here.
-                -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended
-                   information about the glyph that window ports can use to
-                   enhance the display in various ways.
+               -- bkglyphinfo contains a background glyph for potential use
+                   by some graphical or tiled environments to allow the depiction
+                   to fall against a background consistent with the grid 
+                   around x,y. If bkglyphinfo->glyph is NO_GLYPH, then the
+                   parameter should be ignored (do nothing with it).
+                -- glyph_info struct fields:
+                    int glyph;            the display entity
+                    int color;            color for window ports not using a tile
+                    int ttychar;          the character mapping for the original tty
+                                             interace. Most or all window ports wanted
+                                             and used this for various things so it is
+                                             provided in 3.7+
+                    short int symidx;     offset into syms array
+                    unsigned glyphflags;       more detail about the entity
 
 */
+
 void
-curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph,
-                   int bkglyph UNUSED, unsigned *glyphmod)
+curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
+                   const glyph_info *glyphinfo, const glyph_info *bkglyphinfo UNUSED)
 {
+    int glyph;
     int ch;
     int color;
     unsigned int special;
     int attr = -1;
 
-    special = glyphmod[GM_FLAGS];
-    ch = (int) glyphmod[GM_TTYCHAR];
-    color = (int) glyphmod[GM_COLOR];
+    glyph = glyphinfo->glyph;
+    special = glyphinfo->glyphflags;
+    ch = glyphinfo->ttychar;
+    color = glyphinfo->color;
     if ((special & MG_PET) && iflags.hilite_pet) {
         attr = iflags.wc2_petattr;
     }
@@ -734,7 +752,7 @@ curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph,
         /* water and lava look the same except for color; when color is off,
            render lava in inverse video so that they look different */
         if ((special & (MG_BW_LAVA | MG_BW_ICE)) != 0 && iflags.use_inverse) {
-            attr = A_REVERSE; /* map_glyphmod() only sets this if color is off */
+            attr = A_REVERSE; /* map_glyphinfo() only sets this if color is off */
         }
     }
 
index c789393ecd1ec65e5b0253b6b47053e0867e83c9..256998cf398fed814757c4eb8adfb45f3e88c005 100644 (file)
@@ -373,16 +373,16 @@ curses_prev_mesg()
     for (count = 0; count < num_messages; ++count) {
         mesg = get_msg_line(do_lifo, count);
         if (turn != mesg->turn && count != 0) {
-            curses_add_menu(wid, NO_GLYPH, &Id, 0, 0, A_NORMAL, "---",
-                            MENU_ITEMFLAGS_NONE);
+            curses_add_menu(wid, &nul_glyphinfo, &Id, 0, 0,
+                            A_NORMAL, "---", MENU_ITEMFLAGS_NONE);
         }
-        curses_add_menu(wid, NO_GLYPH, &Id, 0, 0, A_NORMAL, mesg->str,
-                         MENU_ITEMFLAGS_NONE);
+        curses_add_menu(wid, &nul_glyphinfo, &Id, 0, 0,
+                        A_NORMAL, mesg->str, MENU_ITEMFLAGS_NONE);
         turn = mesg->turn;
     }
     if (!count)
-        curses_add_menu(wid, NO_GLYPH, &Id, 0, 0, A_NORMAL,
-                        "[No past messages available.]",
+        curses_add_menu(wid, &nul_glyphinfo, &Id, 0, 0,
+                        A_NORMAL, "[No past messages available.]",
                         MENU_ITEMFLAGS_NONE);
 
     curses_end_menu(wid, "");
index 0914400ea9703372d7b4cff0a8601f0b40c6155b..a8724b2918f43c67bd0b99350ee33c23db840b07 100644 (file)
@@ -675,7 +675,8 @@ curses_view_file(const char *filename, boolean must_exist)
     Id = cg.zeroany;
 
     while (dlb_fgets(buf, BUFSZ, fp) != NULL) {
-        curses_add_menu(wid, NO_GLYPH, &Id, 0, 0, A_NORMAL, buf, FALSE);
+        curses_add_menu(wid, &nul_glyphinfo, &Id, 0, 0,
+                        A_NORMAL, buf, FALSE);
     }
 
     dlb_fclose(fp);
index ee5eb42e823efb8b4c6b7abcb7f982e95ed8ccd6..e1c6f5f8ec1b4759f6bbdddc35ba644d31c08a38 100644 (file)
@@ -509,8 +509,8 @@ curses_puts(winid wid, int attr, const char *text)
             return;
         }
         Id = cg.zeroany;
-        curses_add_nhmenu_item(wid, NO_GLYPH, &Id, 0, 0, attr, text,
-                                MENU_ITEMFLAGS_NONE);
+        curses_add_nhmenu_item(wid, &nul_glyphinfo, &Id, 0, 0,
+                               attr, text, MENU_ITEMFLAGS_NONE);
     } else {
         waddstr(win, text);
         wnoutrefresh(win);
index 6811721e3395f4caf636e79ab94d071d2353d7e9..dab57384841335cced5bfe0c91a0daa621b87d5c 100644 (file)
@@ -248,9 +248,9 @@ unsigned long mbehavior;
  * later.
  */
 void
-safe_add_menu(window, glyph, identifier, ch, gch, attr, str, itemflags)
+safe_add_menu(window, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 winid window;               /* window to use, must be of type NHW_MENU */
-int glyph UNUSED;           /* glyph to display with item (not used) */
+const glyph_info *glyphinfo UNUSED; /* glyph plus glyph info */
 const anything *identifier; /* what to return if selected */
 char ch;                    /* keyboard accelerator (0 = pick our own) */
 char gch;                   /* group accelerator (0 = no group) */
@@ -321,12 +321,11 @@ int x, y;
  *  Print the glyph to the output device.  Don't flush the output device.
  */
 void
-safe_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
-winid window;
-xchar x, y;
-int glyph;
-int bkglyph UNUSED;
-int glyphmod[NUM_GLYPHMOD] UNUSED;
+safe_print_glyph(window, x, y, glyphinfo, bkglyphinfo)
+winid window UNUSED;
+xchar x UNUSED, y UNUSED;
+const glyph_info *glyphinfo UNUSED;
+const glyph_info *bkglyphinfo UNUSED;
 {
     return;
 }
index c6e425d70ea6e1969de2b2adc11cb0c246a77610..adf91f509fa60a3306eed7e69be6aa8c19eebcbe 100644 (file)
@@ -118,9 +118,9 @@ VDECLCB(shim_putstr,(winid w, int attr, const char *str), "viis", A2P w, A2P att
 VDECLCB(shim_display_file,(const char *name, BOOLEAN_P complain), "vsi", P2V name, A2P complain)
 VDECLCB(shim_start_menu,(winid window, unsigned long mbehavior), "vii", A2P window, A2P mbehavior)
 VDECLCB(shim_add_menu,
-    (winid window, int glyph, const ANY_P *identifier, CHAR_P ch, CHAR_P gch, int attr, const char *str, unsigned int itemflags),
+    (winid window, const glyph_info *glyphinfo, const ANY_P *identifier, CHAR_P ch, CHAR_P gch, int attr, const char *str, unsigned int itemflags),
     "viipiiisi",
-    A2P window, A2P glyph, P2V identifier, A2P ch, A2P gch, A2P attr, P2V str, A2P itemflags)
+    A2P window, P2VP glyphinfo, P2V identifier, A2P ch, A2P gch, A2P attr, P2V str, A2P itemflags)
 VDECLCB(shim_end_menu,(winid window, const char *prompt), "vis", A2P window, P2V prompt)
 /* XXX: shim_select_menu menu_list is an output */
 DECLCB(int, shim_select_menu,(winid window, int how, MENU_ITEM_P **menu_list), "iiio", A2P window, A2P how, P2V menu_list)
@@ -129,7 +129,7 @@ VDECLCB(shim_mark_synch,(void), "v")
 VDECLCB(shim_wait_synch,(void), "v")
 VDECLCB(shim_cliparound,(int x, int y), "vii", A2P x, A2P y)
 VDECLCB(shim_update_positionbar,(char *posbar), "vp", P2V posbar)
-VDECLCB(shim_print_glyph,(winid w, int x, int y, int glyph, int bkglyph, int glyphmod[NUM_GLYPHMOD]), "viiiii", A2P w, A2P x, A2P y, A2P glyph, A2P bkglyph, A2P glyphmod)
+VDECLCB(shim_print_glyph,(winid w, int x, int y, const glyph_info *glyph, const glyph_info *bkglyph), "viiiii", A2P w, A2P x, A2P y, V2P glyphinfo, V2P bkglyphinfo)
 VDECLCB(shim_raw_print,(const char *str), "vs", P2V str)
 VDECLCB(shim_raw_print_bold,(const char *str), "vs", P2V str)
 DECLCB(int, shim_nhgetch,(void), "i")
index e68e402722e7b876bbfe7496a1a11197f8abfa23..414e513fd45f690d45cf56eb5801531bbd956557 100644 (file)
@@ -600,8 +600,8 @@ tty_player_selection()
                     /* add miscellaneous menu entries */
                     role_menu_extra(ROLE_RANDOM, win, TRUE);
                     any = cg.zeroany; /* separator, not a choice */
-                    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                             MENU_ITEMFLAGS_NONE);
+                    add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                             ATR_NONE, "", MENU_ITEMFLAGS_NONE);
                     role_menu_extra(RS_RACE, win, FALSE);
                     role_menu_extra(RS_GENDER, win, FALSE);
                     role_menu_extra(RS_ALGNMNT, win, FALSE);
@@ -698,8 +698,8 @@ tty_player_selection()
                         /* add miscellaneous menu entries */
                         role_menu_extra(ROLE_RANDOM, win, TRUE);
                         any.a_int = 0; /* separator, not a choice */
-                        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                                 MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
                         role_menu_extra(RS_ROLE, win, FALSE);
                         role_menu_extra(RS_GENDER, win, FALSE);
                         role_menu_extra(RS_ALGNMNT, win, FALSE);
@@ -790,8 +790,8 @@ tty_player_selection()
                         /* add miscellaneous menu entries */
                         role_menu_extra(ROLE_RANDOM, win, TRUE);
                         any.a_int = 0; /* separator, not a choice */
-                        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                                 MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
                         role_menu_extra(RS_ROLE, win, FALSE);
                         role_menu_extra(RS_RACE, win, FALSE);
                         role_menu_extra(RS_ALGNMNT, win, FALSE);
@@ -878,8 +878,8 @@ tty_player_selection()
                         setup_algnmenu(win, TRUE, ROLE, RACE, GEND);
                         role_menu_extra(ROLE_RANDOM, win, TRUE);
                         any.a_int = 0; /* separator, not a choice */
-                        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                                 MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
                         role_menu_extra(RS_ROLE, win, FALSE);
                         role_menu_extra(RS_RACE, win, FALSE);
                         role_menu_extra(RS_GENDER, win, FALSE);
@@ -965,26 +965,27 @@ tty_player_selection()
                 races[RACE].adj,
                 (GEND == 1 && roles[ROLE].name.f) ? roles[ROLE].name.f
                                                   : roles[ROLE].name.m);
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, pbuf,
+        add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, pbuf,
                  MENU_ITEMFLAGS_NONE);
         /* blank separator */
         any.a_int = 0;
-        add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 0, 0,
+                 ATR_NONE, "", MENU_ITEMFLAGS_NONE);
         /* [ynaq] menu choices */
         any.a_int = 1;
-        add_menu(win, NO_GLYPH, &any, 'y', 0, ATR_NONE, "Yes; start game",
-                 MENU_ITEMFLAGS_SELECTED);
+        add_menu(win, &nul_glyphinfo, &any, 'y', 0,
+                 ATR_NONE, "Yes; start game", MENU_ITEMFLAGS_SELECTED);
         any.a_int = 2;
-        add_menu(win, NO_GLYPH, &any, 'n', 0, ATR_NONE,
-                 "No; choose role again", MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 'n', 0,
+                 ATR_NONE, "No; choose role again", MENU_ITEMFLAGS_NONE);
         if (iflags.renameallowed) {
             any.a_int = 3;
-            add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
+            add_menu(win, &nul_glyphinfo, &any, 'a', 0, ATR_NONE,
                      "Not yet; choose another name", MENU_ITEMFLAGS_NONE);
         }
         any.a_int = -1;
-        add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
-                 MENU_ITEMFLAGS_NONE);
+        add_menu(win, &nul_glyphinfo, &any, 'q', 0,
+                 ATR_NONE, "Quit", MENU_ITEMFLAGS_NONE);
         Sprintf(pbuf, "Is this ok? [yn%sq]", iflags.renameallowed ? "a" : "");
         end_menu(win, pbuf);
         n = select_menu(win, PICK_ONE, &selected);
@@ -1059,22 +1060,22 @@ reset_role_filtering()
     any = cg.zeroany;
 
     /* no extra blank line preceding this entry; end_menu supplies one */
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "Unacceptable roles", MENU_ITEMFLAGS_NONE);
     setup_rolemenu(win, FALSE, ROLE_NONE, ROLE_NONE, ROLE_NONE);
 
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "Unacceptable races", MENU_ITEMFLAGS_NONE);
     setup_racemenu(win, FALSE, ROLE_NONE, ROLE_NONE, ROLE_NONE);
 
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "Unacceptable genders", MENU_ITEMFLAGS_NONE);
     setup_gendmenu(win, FALSE, ROLE_NONE, ROLE_NONE, ROLE_NONE);
 
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
-    add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+    add_menu(win, &nul_glyphinfo, &any, 0, 0, ATR_NONE,
              "Unacceptable alignments", MENU_ITEMFLAGS_NONE);
     setup_algnmenu(win, FALSE, ROLE_NONE, ROLE_NONE, ROLE_NONE);
 
@@ -1143,7 +1144,8 @@ int race, gend, algn; /* all ROLE_NONE for !filtering case */
         }
         /* !filtering implies reset_role_filtering() where we want to
            mark this role as preseleted if current filter excludes it */
-        add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE, an(rolenamebuf),
+        add_menu(win, &nul_glyphinfo, &any, thisch, 0,
+                 ATR_NONE, an(rolenamebuf),
                  (!filtering && !role_ok)
                     ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE);
         lastch = thisch;
@@ -1178,7 +1180,7 @@ int role, gend, algn;
            capital letter as unseen accelerator;
            !filtering: resetting filter rather than picking, choose by
            capital letter since lowercase role letters will be present */
-        add_menu(win, NO_GLYPH, &any,
+        add_menu(win, &nul_glyphinfo, &any,
                  filtering ? this_ch : highc(this_ch),
                  filtering ? highc(this_ch) : 0,
                  ATR_NONE, races[i].noun,
@@ -1213,7 +1215,7 @@ int role, race, algn;
         this_ch = *genders[i].adj;
         /* (see setup_racemenu for explanation of selector letters
            and setup_rolemenu for preselection) */
-        add_menu(win, NO_GLYPH, &any,
+        add_menu(win, &nul_glyphinfo, &any,
                  filtering ? this_ch : highc(this_ch),
                  filtering ? highc(this_ch) : 0,
                  ATR_NONE, genders[i].adj,
@@ -1248,7 +1250,7 @@ int role, race, gend;
         this_ch = *aligns[i].adj;
         /* (see setup_racemenu for explanation of selector letters
            and setup_rolemenu for preselection) */
-        add_menu(win, NO_GLYPH, &any,
+        add_menu(win, &nul_glyphinfo, &any,
                  filtering ? this_ch : highc(this_ch),
                  filtering ? highc(this_ch) : 0,
                  ATR_NONE, aligns[i].adj,
@@ -2950,9 +2952,9 @@ unsigned long mbehavior;
  * later.
  */
 void
-tty_add_menu(window, glyph, identifier, ch, gch, attr, str, itemflags)
+tty_add_menu(window, glyphinfo, identifier, ch, gch, attr, str, itemflags)
 winid window;               /* window to use, must be of type NHW_MENU */
-int glyph UNUSED;           /* glyph to display with item (not used) */
+const glyph_info *glyphinfo UNUSED; /* glyph info w/glyph to display w/item */
 const anything *identifier; /* what to return if selected */
 char ch;                    /* keyboard accelerator (0 = pick our own) */
 char gch;                   /* group accelerator (0 = no group) */
@@ -3050,10 +3052,10 @@ const char *prompt; /* prompt to for menu */
         anything any;
 
         any = cg.zeroany; /* not selectable */
-        tty_add_menu(window, NO_GLYPH, &any, 0, 0, ATR_NONE, "",
-                     MENU_ITEMFLAGS_NONE);
-        tty_add_menu(window, NO_GLYPH, &any, 0, 0, ATR_NONE, prompt,
-                     MENU_ITEMFLAGS_NONE);
+        tty_add_menu(window, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, "", MENU_ITEMFLAGS_NONE);
+        tty_add_menu(window, &nul_glyphinfo, &any, 0, 0,
+                     ATR_NONE, prompt, MENU_ITEMFLAGS_NONE);
     }
 
     /* 52: 'a'..'z' and 'A'..'Z'; avoids selector duplication within a page */
@@ -3415,19 +3417,21 @@ int x, y;
  */
 
 void
-tty_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
+tty_print_glyph(window, x, y, glyphinfo, bkglyphinfo)
 winid window;
 xchar x, y;
-#ifdef TTY_TILES_ESCCODES
-int glyph;
+#if defined(TTY_TILES_ESCCODES) || defined(MSDOS)
+const glyph_info *glyphinfo;
 #else
-int glyph UNUSED;
+const glyph_info *glyphinfo UNUSED;
 #endif
-int bkglyph UNUSED;
-unsigned *glyphmod;     /* don't mark UNUSED as we need to revisit */
+const glyph_info *bkglyphinfo UNUSED;
 {
     boolean inverse_on = FALSE;
     int ch, color;
+#if defined(TTY_TILES_ESCCODES) || defined(MSDOS)
+    int glyph;
+#endif
     unsigned special;
 
     HUPSKIP();
@@ -3438,9 +3442,9 @@ unsigned *glyphmod;     /* don't mark UNUSED as we need to revisit */
     }
 #endif
     /* get glyph ttychar, color, and special flags */
-    ch = (int) glyphmod[GM_TTYCHAR];
-    color = (int) glyphmod[GM_COLOR];
-    special = glyphmod[GM_FLAGS];
+    ch = glyphinfo->ttychar;
+    color = glyphinfo->color;
+    special = glyphinfo->glyphflags;
 
     print_vt_code2(AVTC_SELECT_WINDOW, window);
 
index ab08f2cb2b2fa0bf69093adc93c28afd6ae1175b..67b630d81c8503ccb5734a9fe5c962e19052956a 100644 (file)
@@ -35,9 +35,8 @@ extern short glyph2tile[];
 typedef struct mswin_nethack_map_window {
     HWND hWnd;                  /* window */
 
-    int map[COLNO][ROWNO];      /* glyph map */
-    int bkmap[COLNO][ROWNO];    /* backround glyph map */
-    unsigned glyphmod[COLNO][ROWNO][NUM_GLYPHMOD];
+    glyph_info map[COLNO][ROWNO];
+    glyph_info bkmap[COLNO][ROWNO];
     boolean mapDirty[COLNO][ROWNO]; /* dirty flag for map */
     int mapMode;                /* current map mode */
     boolean bAsciiMode;         /* switch ASCII/tiled mode */
@@ -86,7 +85,8 @@ static void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut);
 static void paint(PNHMapWindow data, int i, int j);
 static void dirtyAll(PNHMapWindow data);
 static void dirty(PNHMapWindow data, int i, int j);
-static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod);
+static void setGlyph(PNHMapWindow data, int i, int j,
+                     const glyph_info *fg, const glyph_info *bg);
 static void clearAll(PNHMapWindow data);
 
 #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2)
@@ -639,7 +639,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
     case MSNH_MSG_PRINT_GLYPH: {
         PMSNHMsgPrintGlyph msg_data = (PMSNHMsgPrintGlyph) lParam;
         setGlyph(data, msg_data->x, msg_data->y, 
-            msg_data->glyph, msg_data->bkglyph, msg_data->glyphmod);
+            &msg_data->glyphinfo, &msg_data->bkglyphinfo);
     } break;
 
     case MSNH_MSG_CLIPAROUND: {
@@ -719,9 +719,9 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
             for (col = 0; col < COLNO; col++) {
                 if (index >= msg_data->max_size)
                     break;
-                if (data->map[col][row] == NO_GLYPH)
+                if (data->map[col][row].glyph == NO_GLYPH)
                     mgch = ' ';
-                msg_data->buffer[index] = data->glyphmod[col][row][GM_TTYCHAR];
+                msg_data->buffer[index] = data->map[col][row].ttychar;
                 index++;
             }
             if (index >= msg_data->max_size - 1)
@@ -788,8 +788,8 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
 //    int mgch;
 #endif
     layer = 0;
-    glyph = data->map[i][j];
-    bkglyph = data->bkmap[i][j];
+    glyph = data->map[i][j].glyph;
+    bkglyph = data->bkmap[i][j].glyph;
 
     if (glyph == NO_GLYPH && bkglyph == NO_GLYPH) {
         HBRUSH blackBrush = CreateSolidBrush(RGB(0, 0, 0));
@@ -812,7 +812,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
     if ((glyph != NO_GLYPH) && (glyph != bkglyph)) {
         /* rely on NetHack core helper routine */
         ntile = glyph2tile[glyph];
-        if (data->glyphmod[i][j][GM_FLAGS] & MG_FEMALE)
+        if (data->map[i][j].glyphflags & MG_FEMALE)
             ntile++;
         t_x = TILEBMP_X(ntile);
         t_y = TILEBMP_Y(ntile);
@@ -834,7 +834,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
     }
 
 #ifdef USE_PILEMARK
-    if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_PET)
+    if ((glyph != NO_GLYPH) && (data->map[i][j].glyphflags & MG_PET)
 #else
     if ((glyph != NO_GLYPH) && glyph_is_pet(glyph)
 #endif
@@ -857,7 +857,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
         DeleteDC(hdcPetMark);
     }
 #ifdef USE_PILEMARK
-    if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_OBJPILE)
+    if ((glyph != NO_GLYPH) && (data->map[i][j].glyphflags & MG_OBJPILE)
         && iflags.hilite_pile) {
         /* apply pilemark transparently over other image */
         HDC hdcPileMark;
@@ -886,7 +886,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
 static void
 paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
 {
-    if (data->map[i][j] >= 0) {
+    if (data->map[i][j].glyph >= 0) {
 
         char ch;
         WCHAR wch;
@@ -906,10 +906,10 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
         nhglyph2charcolor(data->map[i][j], &ch, &color);
         OldFg = SetTextColor(hDC, nhcolor_to_RGB(color));
     #else
-        ch = (char) data->glyphmod[i][j][GM_TTYCHAR];
-        color = (int) data->glyphmod[i][j][GM_COLOR];
-        if (((data->glyphmod[i][j][GM_FLAGS] & MG_PET) && iflags.hilite_pet)
-            || ((data->glyphmod[i][j][GM_FLAGS] & (MG_DETECT | MG_BW_LAVA))
+        ch = (char) data->map[i][j].ttychar;
+        color = (int) data->map[i][j].color;
+        if (((data->map[i][j].glyphflags & MG_PET) && iflags.hilite_pet)
+            || ((data->map[i][j].glyphflags & (MG_DETECT | MG_BW_LAVA))
                 && iflags.use_inverse)) {
             back_brush =
                 CreateSolidBrush(nhcolor_to_RGB(CLR_GRAY));
@@ -968,19 +968,17 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
     }
 }
 
-static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod)
+static void setGlyph(PNHMapWindow data, int i, int j,
+                     const glyph_info *fg, const glyph_info *bg)
 {
-    int gm;
-
-    if ((data->map[i][j] != fg) || (data->bkmap[i][j] != bg)
-        || data->glyphmod[i][j][GM_TTYCHAR] != glyphmod[GM_TTYCHAR]
-        || data->glyphmod[i][j][GM_COLOR] != glyphmod[GM_COLOR]
-        || data->glyphmod[i][j][GM_FLAGS] != glyphmod[GM_FLAGS]) {
-        data->map[i][j] = fg;
-        data->bkmap[i][j] = bg;
+    if ((data->map[i][j].glyph != fg->glyph)
+            || (data->bkmap[i][j].glyph != bg->glyph)
+        || data->map[i][j].ttychar != fg->ttychar
+        || data->map[i][j].color != fg->color
+        || data->map[i][j].glyphflags != fg->glyphflags) {
+        data->map[i][j] = *fg;
+        data->bkmap[i][j] = *bg;
         data->mapDirty[i][j] = TRUE;
-        for (gm = 0; gm < NUM_GLYPHMOD; ++gm)
-            data->glyphmod[i][j][gm] = glyphmod[gm];
         RECT rect;
         nhcoord2display(data, i, j, &rect);
         InvalidateRect(data->hWnd, &rect, FALSE);
@@ -991,11 +989,8 @@ static void clearAll(PNHMapWindow data)
 {
     for (int x = 0; x < COLNO; x++)
         for (int y = 0; y < ROWNO; y++) {
-            data->map[x][y] = NO_GLYPH;
-            data->bkmap[x][y] = NO_GLYPH;
-            data->glyphmod[x][y][GM_TTYCHAR] = ' ';
-            data->glyphmod[x][y][GM_COLOR] = NO_COLOR;
-            data->glyphmod[x][y][GM_FLAGS] = 0U;
+            data->map[x][y] = nul_glyphinfo;
+            data->bkmap[x][y] = nul_glyphinfo;
             data->mapDirty[x][y] = TRUE;
         }
     InvalidateRect(data->hWnd, NULL, FALSE);
index 0e5ba537d665c782432e210c37e30139c6e48562..e034909e12218d1c61fe6f1b81769c7b67467d66 100644 (file)
@@ -27,7 +27,7 @@
 #define CHECK_HEIGHT 16
 
 typedef struct mswin_menu_item {
-    int glyph;
+    glyph_info glyphinfo;
     ANY_P identifier;
     CHAR_P accelerator;
     CHAR_P group_accel;
@@ -78,7 +78,7 @@ static WNDPROC editControlWndProc = NULL;
 
 #define NHMENU_IS_SELECTABLE(item) ((item).identifier.a_obj != NULL)
 #define NHMENU_IS_SELECTED(item) ((item).count != 0)
-#define NHMENU_HAS_GLYPH(item) ((item).glyph != NO_GLYPH)
+#define NHMENU_HAS_GLYPH(item) ((item).glyphinfo.glyph != NO_GLYPH)
 
 INT_PTR CALLBACK MenuWndProc(HWND, UINT, WPARAM, LPARAM);
 LRESULT CALLBACK NHMenuListWndProc(HWND, UINT, WPARAM, LPARAM);
@@ -618,7 +618,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
         new_item = data->menu.size;
         ZeroMemory(&data->menu.items[new_item],
                    sizeof(data->menu.items[new_item]));
-        data->menu.items[new_item].glyph = msg_data->glyph;
+        data->menu.items[new_item].glyphinfo = msg_data->glyphinfo;
         data->menu.items[new_item].identifier = *msg_data->identifier;
         data->menu.items[new_item].accelerator = msg_data->accelerator;
         data->menu.items[new_item].group_accel = msg_data->group_accel;
@@ -1082,7 +1082,7 @@ onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
             double monitorScale = win10_monitor_scale(hWnd);
 
             saveBmp = SelectObject(tileDC, GetNHApp()->bmpMapTiles);
-            ntile = glyph2tile[item->glyph];
+            ntile = glyph2tile[item->glyphinfo.glyph];
             t_x =
                 (ntile % GetNHApp()->mapTilesPerLine) * GetNHApp()->mapTile_X;
             t_y =
@@ -1166,7 +1166,7 @@ onDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
         client_rt.right = min(client_rt.right, lpdis->rcItem.right);
         if (NHMENU_IS_SELECTABLE(*item)
             && data->menu.items[lpdis->itemID].count != 0
-            && item->glyph != NO_GLYPH) {
+            && item->glyphinfo.glyph != NO_GLYPH) {
             if (data->menu.items[lpdis->itemID].count == -1) {
                 _stprintf(wbuf, TEXT("Count: All"));
             } else {
index 431d426ca61719e402e344704b4a3ca0e464d331..7c9f98a9e0e3ccaa0dde4675def0ac4cbd870312 100644 (file)
@@ -36,9 +36,8 @@ typedef struct mswin_nhmsg_putstr {
 typedef struct mswin_nhmsg_print_glyph {
     XCHAR_P x;
     XCHAR_P y;
-    int glyph;
-    int bkglyph;
-    int glyphmod[NUM_GLYPHMOD];
+    glyph_info glyphinfo;
+    glyph_info bkglyphinfo;
 } MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph;
 
 typedef struct mswin_nhmsg_cliparound {
@@ -47,7 +46,7 @@ typedef struct mswin_nhmsg_cliparound {
 } MSNHMsgClipAround, *PMSNHMsgClipAround;
 
 typedef struct mswin_nhmsg_add_menu {
-    int glyph;
+    glyph_info glyphinfo;
     const ANY_P *identifier;
     CHAR_P accelerator;
     CHAR_P group_accel;
index bf3f07495931b08260c03ae760b6818e3e628685..31107659c0d9fcaa5e0d3b09172a488541ab41cc 100644 (file)
@@ -428,8 +428,8 @@ prompt_for_player_selection(void)
                         } else
                             Strcpy(rolenamebuf, roles[i].name.m);
                     }
-                    add_menu(win, NO_GLYPH, &any, thisch, 0, ATR_NONE,
-                             an(rolenamebuf), MENU_ITEMFLAGS_NONE);
+                    add_menu(win, &nul_glyphinfo, &any, thisch, 0,
+                             ATR_NONE, an(rolenamebuf), MENU_ITEMFLAGS_NONE);
                     lastch = thisch;
                 }
             }
@@ -437,11 +437,11 @@ prompt_for_player_selection(void)
                                   flags.initalign, PICK_RANDOM) + 1;
             if (any.a_int == 0) /* must be non-zero */
                 any.a_int = randrole(FALSE) + 1;
-            add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, '*', 0,
+                     ATR_NONE, "Random", MENU_ITEMFLAGS_NONE);
             any.a_int = i + 1; /* must be non-zero */
-            add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
-                     MENU_ITEMFLAGS_NONE);
+            add_menu(win, &nul_glyphinfo, &any, 'q', 0,
+                     ATR_NONE, "Quit", MENU_ITEMFLAGS_NONE);
             Sprintf(pbuf, "Pick a role for your %s", plbuf);
             end_menu(win, pbuf);
             n = select_menu(win, PICK_ONE, &selected);
@@ -503,18 +503,19 @@ prompt_for_player_selection(void)
                     if (ok_race(flags.initrole, i, flags.initgend,
                                 flags.initalign)) {
                         any.a_int = i + 1; /* must be non-zero */
-                        add_menu(win, NO_GLYPH, &any, races[i].noun[0], 0,
-                                 ATR_NONE, races[i].noun, MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any,
+                                 races[i].noun[0], 0, ATR_NONE,
+                                 races[i].noun, MENU_ITEMFLAGS_NONE);
                     }
                 any.a_int = pick_race(flags.initrole, flags.initgend,
                                       flags.initalign, PICK_RANDOM) + 1;
                 if (any.a_int == 0) /* must be non-zero */
                     any.a_int = randrace(flags.initrole) + 1;
-                add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, '*', 0,
+                         ATR_NONE, "Random", MENU_ITEMFLAGS_NONE);
                 any.a_int = i + 1; /* must be non-zero */
-                add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 'q', 0,
+                         ATR_NONE, "Quit", MENU_ITEMFLAGS_NONE);
                 Sprintf(pbuf, "Pick the race of your %s", plbuf);
                 end_menu(win, pbuf);
                 n = select_menu(win, PICK_ONE, &selected);
@@ -577,18 +578,19 @@ prompt_for_player_selection(void)
                     if (ok_gend(flags.initrole, flags.initrace, i,
                                 flags.initalign)) {
                         any.a_int = i + 1;
-                        add_menu(win, NO_GLYPH, &any, genders[i].adj[0], 0,
-                                 ATR_NONE, genders[i].adj, MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any,
+                                 genders[i].adj[0], 0, ATR_NONE,
+                                 genders[i].adj, MENU_ITEMFLAGS_NONE);
                     }
                 any.a_int = pick_gend(flags.initrole, flags.initrace,
                                       flags.initalign, PICK_RANDOM) + 1;
                 if (any.a_int == 0) /* must be non-zero */
                     any.a_int = randgend(flags.initrole, flags.initrace) + 1;
-                add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, '*', 0,
+                         ATR_NONE, "Random", MENU_ITEMFLAGS_NONE);
                 any.a_int = i + 1; /* must be non-zero */
-                add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 'q', 0,
+                         ATR_NONE, "Quit", MENU_ITEMFLAGS_NONE);
                 Sprintf(pbuf, "Pick the gender of your %s", plbuf);
                 end_menu(win, pbuf);
                 n = select_menu(win, PICK_ONE, &selected);
@@ -650,18 +652,19 @@ prompt_for_player_selection(void)
                     if (ok_align(flags.initrole, flags.initrace,
                                  flags.initgend, i)) {
                         any.a_int = i + 1;
-                        add_menu(win, NO_GLYPH, &any, aligns[i].adj[0], 0,
-                                 ATR_NONE, aligns[i].adj, MENU_ITEMFLAGS_NONE);
+                        add_menu(win, &nul_glyphinfo, &any,
+                                 aligns[i].adj[0], 0, ATR_NONE,
+                                 aligns[i].adj, MENU_ITEMFLAGS_NONE);
                     }
                 any.a_int = pick_align(flags.initrole, flags.initrace,
                                        flags.initgend, PICK_RANDOM) + 1;
                 if (any.a_int == 0) /* must be non-zero */
                     any.a_int = randalign(flags.initrole, flags.initrace) + 1;
-                add_menu(win, NO_GLYPH, &any, '*', 0, ATR_NONE, "Random",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, '*', 0,
+                         ATR_NONE, "Random", MENU_ITEMFLAGS_NONE);
                 any.a_int = i + 1; /* must be non-zero */
-                add_menu(win, NO_GLYPH, &any, 'q', 0, ATR_NONE, "Quit",
-                         MENU_ITEMFLAGS_NONE);
+                add_menu(win, &nul_glyphinfo, &any, 'q', 0,
+                         ATR_NONE, "Quit", MENU_ITEMFLAGS_NONE);
                 Sprintf(pbuf, "Pick the alignment of your %s", plbuf);
                 end_menu(win, pbuf);
                 n = select_menu(win, PICK_ONE, &selected);
@@ -1093,12 +1096,12 @@ mswin_start_menu(winid wid, unsigned long mbehavior)
 }
 
 /*
-add_menu(windid window, int glyph, const anything identifier,
+add_menu(windid window, const glyph_info *glyphinfo,
+                                const anything identifier,
                                 char accelerator, char groupacc,
                                 int attr, char *str, unsigned int itemflags)
                 -- Add a text line str to the given menu window.  If
-identifier
-                   is 0, then the line cannot be selected (e.g. a title).
+                   identifier is 0, then the line cannot be selected (e.g. a title).
                    Otherwise, identifier is the value returned if the line is
                    selected.  Accelerator is a keyboard key that can be used
                    to select the line.  If the accelerator of a selectable
@@ -1106,8 +1109,8 @@ identifier
                    accelerator.  It is up to the window-port to make the
                    accelerator visible to the user (e.g. put "a - " in front
                    of str).  The value attr is the same as in putstr().
-                   Glyph is an optional glyph to accompany the line.  If
-                   window port cannot or does not want to display it, this
+                   Glyphinfo->glyph is an optional glyph to accompany the line.
+                   If window port cannot or does not want to display it, this
                    is OK.  If there is no glyph applicable, then this
                    value will be NO_GLYPH.
                 -- All accelerators should be in the range [A-Za-z].
@@ -1125,19 +1128,22 @@ identifier
                    menu is displayed, set preselected to TRUE.
 */
 void
-mswin_add_menu(winid wid, int glyph, const ANY_P *identifier,
+mswin_add_menu(winid wid, const glyph_info *glyphinfo,
+               const ANY_P *identifier,
                CHAR_P accelerator, CHAR_P group_accel, int attr,
                const char *str, unsigned int itemflags)
 {
     boolean presel = ((itemflags & MENU_ITEMFLAGS_SELECTED) != 0);
-    logDebug("mswin_add_menu(%d, %d, %p, %c, %c, %d, %s, %u)\n", wid, glyph,
+    logDebug("mswin_add_menu(%d, %d, %u, %p, %c, %c, %d, %s, %u)\n", wid,
+             glyphinfo->glyph, glyphinfo->glyphflags,
              identifier, (char) accelerator, (char) group_accel, attr, str,
              itemflags);
     if ((wid >= 0) && (wid < MAXWINDOWS)
         && (GetNHApp()->windowlist[wid].win != NULL)) {
         MSNHMsgAddMenu data;
         ZeroMemory(&data, sizeof(data));
-        data.glyph = glyph;
+        if (glyphinfo)
+            data.glyphinfo = *glyphinfo;
         data.identifier = identifier;
         data.accelerator = accelerator;
         data.group_accel = group_accel;
@@ -1281,24 +1287,22 @@ mswin_cliparound(int x, int y)
 }
 
 /*
-print_glyph(window, x, y, glyph, bkglyph, glyphmod)
-                -- Print the glyph at (x,y) on the given window.  Glyphs are
-                   integers at the interface, mapped to whatever the window-
+print_glyph(window, x, y, glyphinfo, bkglyphinfo)
+                -- Print a glyph (glyphinfo->glyph) at (x,y) on the given
+                   window.  Glyphs are integers mapped to whatever the window-
                    port wants (symbol, font, color, attributes, ...there's
                    a 1-1 map between glyphs and distinct things on the map).
-               -- bkglyph is a background glyph for potential use by some
-                  graphical or tiled environments to allow the depiction
+               -- bkglyphinfo contains a background glyph for potential use
+                   by some graphical or tiled environments to allow the depiction
                   to fall against a background consistent with the grid 
                   around x,y.
-                -- glyphmod provides extended information about the glyph
-                   that window ports can use to enhance the display in
-                   various ways.
                    
 */
 void
-mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod)
+mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
+                  const glyph_info *glyphinfo, const glyph_info *bkglyphinfo)
 {
-    logDebug("mswin_print_glyph(%d, %d, %d, %d, %d, %lu)\n", wid, x, y, glyph, bkglyph, glyphmod);
+    logDebug("mswin_print_glyph(%d, %d, %d, %d, %d, %lu)\n", wid, x, y, glyphinfo->glyph, bkglyphinfo->glyph);
 
     if ((wid >= 0) && (wid < MAXWINDOWS)
         && (GetNHApp()->windowlist[wid].win != NULL)) {
@@ -1307,11 +1311,10 @@ mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsig
         ZeroMemory(&data, sizeof(data));
         data.x = x;
         data.y = y;
-        data.glyph = glyph;
-        data.bkglyph = bkglyph;
-        data.glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR];
-        data.glyphmod[GM_COLOR] = glyphmod[GM_COLOR];
-        data.glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS];
+        if (glyphinfo)
+            data.glyphinfo = *glyphinfo;
+        if (bkglyphinfo)
+            data.bkglyphinfo = *bkglyphinfo;
         SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND,
                     (WPARAM) MSNH_MSG_PRINT_GLYPH, (LPARAM) &data);
     }
index 6ec4e9c3b1dd769f4cef2f6514190c99921699d0..4242ce3d1741236130e715ed01a08f7f410b0f4d 100644 (file)
@@ -153,7 +153,8 @@ void mswin_putstr(winid wid, int attr, const char *text);
 void mswin_putstr_ex(winid wid, int attr, const char *text, int);
 void mswin_display_file(const char *filename, BOOLEAN_P must_exist);
 void mswin_start_menu(winid wid, unsigned long mbehavior);
-void mswin_add_menu(winid wid, int glyph, const ANY_P *identifier,
+void mswin_add_menu(winid wid, const glyph_info *glyphinfo,
+                    const ANY_P *identifier,
                     CHAR_P accelerator, CHAR_P group_accel, int attr,
                     const char *str, unsigned int itemflags);
 void mswin_end_menu(winid wid, const char *prompt);
@@ -162,7 +163,8 @@ void mswin_update_inventory(void);
 void mswin_mark_synch(void);
 void mswin_wait_synch(void);
 void mswin_cliparound(int x, int y);
-void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod);
+void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
+                       const glyph_info *glyph, const glyph_info *bkglyph);
 void mswin_raw_print(const char *str);
 void mswin_raw_print_bold(const char *str);
 void mswin_raw_print_flush();