summaryrefslogtreecommitdiff
path: root/src/main-sla.c
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2010-01-08 20:28:34 +0100
committerBardur Arantsson <bardur@scientician.net>2010-01-08 23:46:06 +0100
commit6aa48afdd57d03314fdf4be6c9da911c32277c84 (patch)
tree2dc401f9aae2dc6736d2fc3811c8f8099d3eabe6 /src/main-sla.c
Import tome-2.3.5.
Diffstat (limited to 'src/main-sla.c')
-rw-r--r--src/main-sla.c455
1 files changed, 455 insertions, 0 deletions
diff --git a/src/main-sla.c b/src/main-sla.c
new file mode 100644
index 00000000..c38f019c
--- /dev/null
+++ b/src/main-sla.c
@@ -0,0 +1,455 @@
+/* File: main-sla.c */
+
+/* Purpose: Actual Unix "slang" support for Angband */
+
+/*
+ * Author: hans@grumbeer.pfalz.de (Hans-Joachim Baader)
+ *
+ * Most of this code is adapted directly from "main-gcu.c"
+ */
+
+#include "angband.h"
+
+
+#ifdef USE_SLA
+
+
+
+#include <slang.h>
+
+
+/*
+ * Are we "active"?
+ */
+static int slang_on = FALSE;
+
+
+/*
+ * Can we use "color"?
+ */
+static bool can_use_color = FALSE;
+
+
+/*
+ * Angband to SLang color conversion table
+ */
+static int colortable[16];
+
+
+/*
+ * Currently, only a single "term" is supported here
+ */
+static term term_screen_body;
+
+
+
+
+
+/*
+ * Hack -- see below
+ */
+void init_pair (int index, char *foreground, char *background)
+{
+ SLtt_set_color (index, "", foreground, background);
+}
+
+
+
+
+
+#define A_NORMAL 0
+#define A_BOLD 8
+#define A_REVERSE 0
+#define REVERSE 8
+
+#define COLOR_BLACK "black"
+#define COLOR_BLUE "blue"
+#define COLOR_GREEN "green"
+#define COLOR_CYAN "cyan"
+#define COLOR_RED "red"
+#define COLOR_MAGENTA "magenta"
+#define COLOR_YELLOW "brown"
+#define COLOR_WHITE "lightgray"
+#define COLOR_BBLACK "gray"
+#define COLOR_BBLUE "brightblue"
+#define COLOR_BGREEN "brightgreen"
+#define COLOR_BCYAN "brightcyan"
+#define COLOR_BRED "brightred"
+#define COLOR_BMAGENTA "brightmagenta"
+#define COLOR_BYELLOW "yellow"
+#define COLOR_BWHITE "white"
+
+
+
+
+
+static char *color_terminals [] =
+{
+#ifdef linux
+ "console",
+#endif
+ "linux",
+ "xterm-color",
+ "color-xterm",
+ "xtermc",
+ "ansi",
+ 0
+};
+
+
+
+
+
+/*
+ * Stolen from the Midnight Commander
+ */
+int has_colors(void)
+{
+ int i;
+
+ char *terminal;
+
+
+ /* Access the terminal type */
+ terminal = getenv("TERM");
+
+ /* Check for colors */
+ SLtt_Use_Ansi_Colors = 0;
+ if (NULL != getenv ("COLORTERM"))
+ {
+ SLtt_Use_Ansi_Colors = 1;
+ }
+
+ /* We want to allow overriding */
+ for (i = 0; color_terminals [i]; i++)
+ {
+ if (strcmp (color_terminals [i], terminal) == 0)
+ {
+ SLtt_Use_Ansi_Colors = 1;
+ }
+ }
+
+ /* Setup emulated colors */
+ if (SLtt_Use_Ansi_Colors)
+ {
+ /*init_pair (REVERSE, "black", "white");*/
+ }
+
+ /* Setup bizarre colors */
+ else
+ {
+ SLtt_set_mono (A_BOLD, NULL, SLTT_BOLD_MASK);
+ SLtt_set_mono (A_REVERSE, NULL, SLTT_REV_MASK);
+ SLtt_set_mono (A_BOLD | A_REVERSE, NULL, SLTT_BOLD_MASK | SLTT_REV_MASK);
+ }
+
+ return SLtt_Use_Ansi_Colors;
+}
+
+
+
+
+
+/*
+ * Nuke SLang
+ */
+static void Term_nuke_sla(term *t)
+{
+ if (!slang_on) return;
+
+ /* Show the cursor */
+ /* curs_set(1); */
+
+ /* Clear the screen */
+ (void)SLsmg_cls();
+
+ /* Refresh */
+ SLsmg_refresh();
+
+ /* We are now off */
+ slang_on = FALSE;
+
+ /* Shut down */
+ SLsmg_reset_smg();
+ SLang_reset_tty();
+}
+
+
+/*
+ * Init SLang
+ */
+static void Term_init_sla(term *t)
+{
+ /* Note that we are on */
+ slang_on = TRUE;
+}
+
+
+/*
+ * Process an event, wait if requested
+ */
+static errr Term_xtra_sla_event(int v)
+{
+ /* Do not wait unless requested */
+ if (!v && (SLang_input_pending (0) == 0)) return (1);
+
+ /* Get and enqueue the key */
+ Term_keypress(SLang_getkey ());
+
+ /* Success */
+ return 0;
+}
+
+
+
+/*
+ * Suspend / Resume
+ */
+static errr Term_xtra_sla_alive(int v)
+{
+ /* Suspend */
+ if (!v)
+ {
+ /* Oops */
+ if (!slang_on) return (1);
+
+ /* We are now off */
+ slang_on = FALSE;
+
+ /* Shut down (temporarily) */
+ SLsmg_reset_smg();
+ SLang_reset_tty();
+ }
+
+ /* Resume */
+ else
+ {
+ /* Oops */
+ if (slang_on) return (1);
+
+ /* Fix the screen */
+ SLsmg_refresh();
+
+ /* Note that we are on */
+ slang_on = TRUE;
+ }
+
+ /* Success */
+ return (0);
+}
+
+
+/*
+ * Handle a "special request"
+ */
+static errr Term_xtra_sla(int n, int v)
+{
+ /* Analyze the request */
+ switch (n)
+ {
+ /* Make a noise */
+ case TERM_XTRA_NOISE:
+ (void)SLsmg_write_char('\007');
+ return (0);
+
+ /* Flush the ncurses buffer */
+ case TERM_XTRA_FRESH:
+ (void)SLsmg_refresh();
+ return (0);
+
+ /* Make the cursor invisible or visible */
+ case TERM_XTRA_SHAPE:
+ /* curs_set(v); */
+ return (0);
+
+ /* Handle events */
+ case TERM_XTRA_EVENT:
+ return (Term_xtra_sla_event(v));
+
+ /* Handle events */
+ case TERM_XTRA_FLUSH:
+ while (!Term_xtra_sla_event(FALSE));
+ return (0);
+
+ /* Suspend/Resume */
+ case TERM_XTRA_ALIVE:
+ return (Term_xtra_sla_alive(v));
+
+ /* Clear the screen */
+ case TERM_XTRA_CLEAR:
+ (void)SLsmg_cls();
+ SLsmg_gotorc(0, 0);
+ return (0);
+
+ /* Delay */
+ case TERM_XTRA_DELAY:
+ usleep(1000 * v);
+ return (0);
+ }
+
+ /* Oops */
+ return (1);
+}
+
+
+
+
+/*
+ * Actually MOVE the hardware cursor
+ */
+static errr Term_curs_sla(int x, int y, int z)
+{
+ /* Literally move the cursor */
+ SLsmg_gotorc (y, x);
+
+ /* Success */
+ return 0;
+}
+
+
+/*
+ * Erase some characters
+ */
+static errr Term_wipe_sla(int x, int y, int n)
+{
+ int i;
+
+ /* Place the cursor */
+ SLsmg_gotorc(y, x);
+
+ /* Dump spaces */
+ for (i = 0; i < n; i++) SLsmg_write_char(' ');
+
+ /* Success */
+ return 0;
+}
+
+
+/*
+ * Place some text on the screen using an attribute
+ */
+static errr Term_text_sla(int x, int y, int n, byte a, cptr s)
+{
+ /* Move the cursor */
+ SLsmg_gotorc(y, x);
+
+ /* Set the color */
+ if (can_use_color) SLsmg_set_color(colortable[a&0x0F]);
+
+ /* Dump the string */
+ SLsmg_write_nchars(s, n);
+
+ /* Success */
+ return 0;
+}
+
+
+/*
+ * Prepare "SLang" for use by the file "term.c"
+ * Installs the "hook" functions defined above
+ */
+errr init_sla(void)
+{
+ int i, err;
+
+ term *t = &term_screen_body;
+
+
+ /* Initialize, check for errors */
+ err = (SLang_init_tty( -1, TRUE, 0) == -1);
+
+ /* Quit on error */
+ if (err) quit("SLang initialization failed");
+
+ /* Get terminal info */
+ SLtt_get_terminfo ();
+
+ /* Initialize some more */
+ if (SLsmg_init_smg() == 0)
+ {
+ quit("Could not get virtual display memory");
+ }
+
+ /* Check we have enough screen. */
+ err = ((SLtt_Screen_Rows < 24) || (SLtt_Screen_Cols < 80));
+
+ /* Quit with message */
+ if (err) quit("SLang screen must be at least 80x24");
+
+ /* Now let's go for a little bit of color! */
+ err = !has_colors();
+
+ /* Do we have color available? */
+ can_use_color = !err;
+
+ /* Init the Color-pairs and set up a translation table */
+ /* If the terminal has enough colors */
+ /* Color-pair 0 is *always* WHITE on BLACK */
+
+ /* XXX XXX XXX See "main-gcu.c" for proper method */
+
+ /* Only do this on color machines */
+ if (can_use_color)
+ {
+ /* Prepare the color pairs */
+ init_pair(1, COLOR_RED, COLOR_BLACK);
+ init_pair(2, COLOR_GREEN, COLOR_BLACK);
+ init_pair(3, COLOR_YELLOW, COLOR_BLACK);
+ init_pair(4, COLOR_BLUE, COLOR_BLACK);
+ init_pair(5, COLOR_MAGENTA, COLOR_BLACK);
+ init_pair(6, COLOR_CYAN, COLOR_BLACK);
+ init_pair(7, COLOR_BLACK, COLOR_BLACK);
+ init_pair(9, COLOR_BRED, COLOR_BLACK);
+ init_pair(10, COLOR_BGREEN, COLOR_BLACK);
+ init_pair(11, COLOR_BYELLOW, COLOR_BLACK);
+ init_pair(12, COLOR_BBLUE, COLOR_BLACK);
+ init_pair(13, COLOR_BMAGENTA, COLOR_BLACK);
+ init_pair(14, COLOR_BCYAN, COLOR_BLACK);
+ init_pair(15, COLOR_BBLACK, COLOR_BLACK);
+
+ /* Prepare the color table */
+ colortable[0] = 7; /* Black */
+ colortable[1] = 0; /* White */
+ colortable[2] = 6; /* Grey XXX */
+ colortable[3] = 11; /* Orange XXX */
+ colortable[4] = 1; /* Red */
+ colortable[5] = 2; /* Green */
+ colortable[6] = 4; /* Blue */
+ colortable[7] = 3; /* Brown */
+ colortable[8] = 15; /* Dark-grey XXX */
+ colortable[9] = 14; /* Light-grey XXX */
+ colortable[10] = 5; /* Purple */
+ colortable[11] = 11; /* Yellow */
+ colortable[12] = 9; /* Light Red */
+ colortable[13] = 10; /* Light Green */
+ colortable[14] = 12; /* Light Blue */
+ colortable[15] = 3; /* Light Brown XXX */
+ }
+
+
+ /* Initialize the term */
+ term_init(t, 80, 24, 64);
+
+ /* Stick in some hooks */
+ t->nuke_hook = Term_nuke_sla;
+ t->init_hook = Term_init_sla;
+
+ /* Stick in some more hooks */
+ t->xtra_hook = Term_xtra_sla;
+ t->curs_hook = Term_curs_sla;
+ t->wipe_hook = Term_wipe_sla;
+ t->text_hook = Term_text_sla;
+
+ /* Save the term */
+ term_screen = t;
+
+ /* Activate it */
+ Term_activate(t);
+
+
+ /* Success */
+ return 0;
+}
+
+#endif /* USE_SLA */
+