* bugs left here.
*/
+/* TTY_TILES_ESCCODES: Enable output of special console escape codes
+ * which act as hints for external programs such as EbonHack.
+ *
+ * Only for TTY_GRAPHICS.
+ *
+ * All of the escape codes are in the format ESC [ N z, where N can be
+ * one or more positive integer values, separated by semicolons.
+ * For example ESC [ 1 ; 0 ; 120 z
+ *
+ * Possible codes are:
+ * ESC [ 1 ; 0 ; n ; m z Start a glyph (aka a tile) number n, with flags m
+ * ESC [ 1 ; 1 z End a glyph.
+ * ESC [ 1 ; 2 ; n z Select a window n to output to.
+ * ESC [ 1 ; 3 z End of data. NetHack has finished sending data,
+ * and is waiting for input.
+ *
+ * Whenever NetHack outputs anything, it will first output the "select window"
+ * code. Whenever NetHack outputs a tile, it will first output the "start
+ * glyph" code, then the escape codes for color and the glyph character
+ * itself, and then the "end glyph" code.
+ *
+ * To compile NetHack with this, add tile.c to WINSRC and tile.o to WINOBJ
+ * in the hints file or Makefile.
+ * Set boolean option vt_tiledata in your config file to turn this on.
+ * Note that gnome-terminal at least doesn't work with this. */
+/* #define TTY_TILES_ESCCODES */
+
/* #define STATUS_VIA_WINDOWPORT */ /* re-work of the status line
updating process */
/* #define STATUS_HILITES */ /* support hilites of status fields */
/* End of Section 4 */
+#ifdef TTY_TILES_ESCCODES
+# ifndef USE_TILES
+# define USE_TILES
+# endif
+#endif
+
#include "global.h" /* Define everything else according to choices above */
#endif /* CONFIG_H */
{ "use_inverse", &iflags.wc_inverse, FALSE, SET_IN_GAME }, /*WC*/
#endif
{ "verbose", &flags.verbose, TRUE, SET_IN_GAME },
+#ifdef TTY_TILES_ESCCODES
+ { "vt_tiledata", &iflags.vt_tiledata, FALSE, SET_IN_FILE },
+#else
+ { "vt_tiledata", (boolean *) 0, FALSE, SET_IN_FILE },
+#endif
{ "wizweight", &iflags.wizweight, FALSE, SET_IN_WIZGAME },
{ "wraptext", &iflags.wc2_wraptext, FALSE, SET_IN_GAME },
#ifdef ZEROCOMP
#endif
#endif
+#ifdef TTY_TILES_ESCCODES
+extern short glyph2tile[];
+#define TILE_ANSI_COMMAND 'z'
+#define AVTC_GLYPH_START 0
+#define AVTC_GLYPH_END 1
+#define AVTC_SELECT_WINDOW 2
+#define AVTC_INLINE_SYNC 3
+#endif
+
extern char mapped_menu_cmds[]; /* from options.c */
/* this is only needed until tty_status_* routines are written */
MENU_INVERT_PAGE, MENU_SEARCH, 0 /* null terminator */
};
+#ifdef TTY_TILES_ESCCODES
+static int vt_tile_current_window = -2;
+
+void
+print_vt_code(i, c, d)
+int i, c, d;
+{
+ if (iflags.vt_tiledata) {
+ if (c >= 0) {
+ if (i == AVTC_SELECT_WINDOW) {
+ if (c == vt_tile_current_window) return;
+ vt_tile_current_window = c;
+ }
+ if (d >= 0)
+ printf("\033[1;%d;%d;%d%c", i, c, d, TILE_ANSI_COMMAND);
+ else
+ printf("\033[1;%d;%d%c", i, c, TILE_ANSI_COMMAND);
+ } else {
+ printf("\033[1;%d%c", i, TILE_ANSI_COMMAND);
+ }
+ }
+}
+#else
+# define print_vt_code(i, c, d) ;
+#endif /* !TTY_TILES_ESCCODES */
+#define print_vt_code1(i) print_vt_code((i), -1, -1)
+#define print_vt_code2(i,c) print_vt_code((i), (c), -1)
+#define print_vt_code3(i,c,d) print_vt_code((i), (c), (d))
+
+
/* clean up and quit */
STATIC_OVL void
bail(mesg)
panic(winpanicstr, window);
ttyDisplay->lastwin = window;
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
switch (cw->type) {
case NHW_MESSAGE:
if (ttyDisplay->toplin) {
ttyDisplay->lastwin = window;
ttyDisplay->rawprint = 0;
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
switch (cw->type) {
case NHW_MESSAGE:
if (ttyDisplay->toplin == 1) {
if (window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0)
panic(winpanicstr, window);
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
switch (cw->type) {
case NHW_MESSAGE:
if (ttyDisplay->toplin)
panic(winpanicstr, window);
ttyDisplay->lastwin = window;
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
#if defined(USE_TILES) && defined(MSDOS)
adjust_cursor_flags(cw);
#endif
if (window == WIN_ERR || (cw = wins[window]) == (struct WinDesc *) 0)
panic(winpanicstr, window);
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
switch (cw->type) {
case NHW_STATUS:
case NHW_MAP:
ttyDisplay->lastwin = window;
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
switch (cw->type) {
case NHW_MESSAGE:
/* really do this later */
/* map glyph to character and color */
(void) mapglyph(glyph, &ch, &color, &special, x, y);
+ print_vt_code2(AVTC_SELECT_WINDOW, window);
+
/* Move the cursor. */
tty_curs(window, x, y);
+ print_vt_code3(AVTC_GLYPH_START, glyph2tile[glyph], special);
+
#ifndef NO_TERMS
if (ul_hack && ch == '_') { /* non-destructive underscore */
(void) putchar((char) ' ');
#endif
}
+ print_vt_code1(AVTC_GLYPH_END);
+
wins[window]->curx++; /* one character over */
ttyDisplay->curx++; /* the real cursor moved too */
}
{
if (ttyDisplay)
ttyDisplay->rawprint++;
+ print_vt_code2(AVTC_SELECT_WINDOW, NHW_BASE);
#if defined(MICRO) || defined(WIN32CON)
msmsg("%s\n", str);
#else
{
if (ttyDisplay)
ttyDisplay->rawprint++;
+ print_vt_code2(AVTC_SELECT_WINDOW, NHW_BASE);
term_start_raw_bold();
#if defined(MICRO) || defined(WIN32CON)
msmsg("%s", str);
int
tty_nhgetch()
{
- int i;
+ int i, tmp;
#ifdef UNIX
/* kludge alert: Some Unix variants return funny values if getc()
* is called, interrupted, and then called again. There
char nestbuf;
#endif
+ print_vt_code1(AVTC_INLINE_SYNC);
(void) fflush(stdout);
/* Note: if raw_print() and wait_synch() get called to report terminal
* initialization problems, then wins[] and ttyDisplay might not be
i = '\033'; /* same for EOF */
if (ttyDisplay && ttyDisplay->toplin == 1)
ttyDisplay->toplin = 2;
+#ifdef TTY_TILES_ESCCODES
+ /* hack to force output of the window select code */
+ tmp = vt_tile_current_window;
+ vt_tile_current_window++;
+ print_vt_code2(AVTC_SELECT_WINDOW, tmp);
+#endif /* TTY_TILES_ESCCODES */
return i;
}