aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/demo/smgtest.c
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2011-10-14 04:55:05 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2011-10-14 04:55:05 +0200
commit6aa0e0017d7d0cddc006da885946934b06949a91 (patch)
tree66b688ec32e2f91266db760b1762f2a50cc52036 /libslang/demo/smgtest.c
parenta966db5b71328f6adf9dd767e64b322a3bd7ed9c (diff)
downloaderlang-slang-fork-6aa0e0017d7d0cddc006da885946934b06949a91.tar.gz
include libslang-1.4.9 and automatically build it and link erlang-slang against it
few (erlang) people will still have libslang-1.4.9 installed or spend time to get it to link against the driver
Diffstat (limited to 'libslang/demo/smgtest.c')
-rw-r--r--libslang/demo/smgtest.c799
1 files changed, 799 insertions, 0 deletions
diff --git a/libslang/demo/smgtest.c b/libslang/demo/smgtest.c
new file mode 100644
index 0000000..ee0d7fc
--- /dev/null
+++ b/libslang/demo/smgtest.c
@@ -0,0 +1,799 @@
+/* This demo test some of the slsmg features. */
+#include "config.h"
+
+#include <stdio.h>
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#include <string.h>
+#include <slang.h>
+
+#include "demolib.c"
+
+static void menu_loop (void);
+static int select_menu_item (int i);
+static void init_colors (void);
+
+int main (int argc, char **argv)
+{
+ if (-1 == demolib_init_terminal (1, 1))
+ return 1;
+
+ init_colors ();
+
+ (void) SLtt_set_mouse_mode (1, 0);
+
+ if (argc <= 1)
+ menu_loop ();
+
+ do
+ {
+ argc--;
+ argv++;
+
+ if (-1 == select_menu_item (atoi (*argv)))
+ menu_loop ();
+ }
+ while (argc > 1);
+
+ demolib_exit (0);
+ return 1;
+}
+
+static void quit (void)
+{
+ demolib_exit (0);
+}
+
+static void bce_color_test (void);
+static void color_test (void);
+static void color_test1 (void);
+static void alt_char_test (void);
+static void esc_seq_test (void);
+static void ansi_esc_seq_test (void);
+static void line_test (void);
+static void mouse_test (void);
+static void low_level_test (void);
+static void box_test (void);
+static void draw_symbols_test (void);
+static void lr_corner_test (void);
+static void mono_test (void);
+
+typedef struct
+{
+ char *name;
+ void (*funct) (void);
+}
+Menu_Type;
+
+static Menu_Type Root_Menu [] =
+{
+ {"Color Test", color_test},
+ {"Another Color Test", color_test1},
+ {"BCE Color Test", bce_color_test},
+ {"Alt charset test", alt_char_test},
+ {"Drawing Symbols", draw_symbols_test},
+ {"Key Escape Sequence Report", esc_seq_test},
+#ifdef IBMPC_SYSTEM
+ {"ANSI Key Escape Sequence Report", ansi_esc_seq_test},
+#endif
+ {"Line Drawing Test", line_test},
+ {"Test Mouse", mouse_test},
+ {"Box Test", box_test},
+ {"Write to Lower Right Corner Test", lr_corner_test},
+ {"Test Low Level Functions", low_level_test},
+ {"Test monochrome functions", mono_test},
+ {"Quit", quit},
+ {NULL, NULL}
+};
+
+Menu_Type *Current_Menu = Root_Menu;
+
+static void print_menu (void)
+{
+ int i;
+ int row;
+ Menu_Type *menu;
+
+ menu = Current_Menu;
+
+ SLsig_block_signals ();
+
+ SLsmg_cls ();
+
+ row = 2;
+ i = 1;
+ while (menu->name != NULL)
+ {
+ SLsmg_gotorc (row, 3);
+ SLsmg_printf ("%2X. %s", i, menu->name);
+ menu++;
+ row++;
+ i++;
+ }
+
+ row = 0;
+ SLsmg_gotorc (row, 1);
+ SLsmg_write_string ("Choose number:");
+
+ SLsmg_refresh ();
+ SLsig_unblock_signals ();
+}
+
+
+static int select_menu_item (int num)
+{
+ int i = 1;
+ Menu_Type *m = Current_Menu;
+
+ while (m->name != NULL)
+ {
+ if (i == num)
+ {
+ (*m->funct) ();
+ return 0;
+ }
+ i++;
+ m++;
+ }
+
+ return -1;
+}
+
+
+static void menu_loop (void)
+{
+ int ch;
+
+ print_menu ();
+
+ while (1)
+ {
+ ch = SLkp_getkey ();
+
+ if ((ch == 'q') || (ch == 'Q'))
+ quit ();
+
+ if ((ch >= '0')
+ && (ch <= '9'))
+ ch -= '0';
+ else if ((ch >= 'A') && (ch <= 'Z'))
+ ch = 10 + (ch - 'A');
+ else
+ ch = 10 + (ch - 'a');
+
+
+ if (-1 == select_menu_item (ch))
+ {
+ SLtt_beep ();
+ continue;
+ }
+ print_menu ();
+ }
+}
+
+static void write_centered_string (char *s, int row)
+{
+ unsigned int len;
+ int col;
+
+ if (s == NULL)
+ return;
+
+ len = strlen (s);
+
+ /* Want 2 * col + len == SLtt_Screen_Rows */
+ if (len >= (unsigned int) SLtt_Screen_Cols) col = 0;
+ else col = (SLtt_Screen_Cols - (int)len) / 2;
+
+ SLsmg_gotorc (row, col);
+ SLsmg_write_string (s);
+}
+
+static void pre_test (char *title)
+{
+ SLsig_block_signals ();
+ SLsmg_cls ();
+ write_centered_string (title, 0);
+}
+
+static void post_test (void)
+{
+ write_centered_string ("Press any key to return.", SLtt_Screen_Rows - 1);
+ SLsmg_refresh ();
+ SLsig_unblock_signals ();
+ (void) SLkp_getkey ();
+}
+
+/* Various tests */
+
+#define NUM_COLORS 16
+static char *Colors [NUM_COLORS] =
+{
+ "black/default",
+ "red",
+ "green",
+ "brown",
+ "blue",
+ "magenta",
+ "cyan",
+ "lightgray",
+ "gray",
+ "brightred",
+ "brightgreen",
+ "yellow",
+ "brightblue",
+ "brightmagenta",
+ "brightcyan",
+ "white"
+};
+
+static void init_colors (void)
+{
+ int i;
+ char *fg, *bg;
+
+ fg = "black";
+ for (i = 0; i < NUM_COLORS; i++)
+ {
+ bg = Colors[i];
+ SLtt_set_color (i + 1, NULL, fg, bg);
+ }
+}
+
+
+static void box_test (void)
+{
+ char *msg = "This is a box with changing background";
+ int r, c, dr, dc;
+ int color;
+
+ pre_test ("Box Test");
+
+ dr = 8;
+ dc = 4 + strlen (msg);
+ r = SLtt_Screen_Rows / 2 - dr/2;
+ c = SLtt_Screen_Cols / 2 - dc/2;
+
+ SLsmg_set_color (1);
+ SLsmg_set_char_set (1);
+ SLsmg_fill_region (r + 1, c + 1, dr - 2, dc - 2, SLSMG_CKBRD_CHAR);
+ SLsmg_set_char_set (0);
+ SLsmg_set_color (0);
+ SLsmg_gotorc (r + dr/2, c + 2); SLsmg_write_string (msg);
+ SLsmg_draw_box (r, c, dr, dc);
+
+ SLsmg_refresh ();
+
+ color = 2;
+ while (0 == SLang_input_pending (10))
+ {
+ SLsmg_set_color_in_region (color, r, c, dr, dc);
+ SLsmg_refresh ();
+ color++;
+ color = color % NUM_COLORS;
+ }
+ post_test ();
+}
+
+static int check_color_support (void)
+{
+ if (SLtt_Use_Ansi_Colors)
+ return 0;
+
+ pre_test ("Your terminal does not provide color support.");
+ post_test ();
+ return -1;
+}
+
+
+static void bce_color_test (void)
+{
+ int row;
+
+ if (-1 == check_color_support ())
+ return;
+
+ pre_test ("Background Color Erase Test");
+
+ SLtt_set_color (0, NULL, "lightgray", "blue");
+
+ row = SLtt_Screen_Rows/2;
+ SLsmg_set_color (0);
+ SLsmg_gotorc (row, 1);
+ SLsmg_write_string ("The screen background should be blue.");
+
+ row += 2;
+ SLsmg_gotorc (row++, 1);
+ SLsmg_write_string ("****If the screen update is slow, then your terminal");
+ SLsmg_gotorc (row++, 1);
+ SLsmg_write_string (" does not support background-color-erase.");
+ SLsmg_set_color (0);
+ post_test ();
+}
+
+static void lr_corner_test (void)
+{
+ pre_test ("Write to Lower Right Corner Test");
+
+ SLsmg_gotorc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-1);
+ SLsmg_write_string ("X");
+
+ write_centered_string ("An 'X' should be in the lower-right corner.",
+ SLtt_Screen_Rows/2);
+
+ SLsmg_refresh ();
+ SLsig_unblock_signals ();
+ (void) SLkp_getkey ();
+}
+
+static void color_test (void)
+{
+ int color;
+ int row;
+
+ if (-1 == check_color_support ())
+ return;
+
+ pre_test ("Color Test");
+
+ row = 1;
+
+ color = 0;
+ while (row < SLtt_Screen_Rows - 1)
+ {
+ color = color % NUM_COLORS;
+
+ SLsmg_gotorc (row, 0);
+ SLsmg_set_color (0);
+ SLsmg_write_string (Colors[color]);
+ color++;
+ SLsmg_set_color (color);
+ SLsmg_erase_eol ();
+ row++;
+ }
+
+ SLsmg_set_color (0);
+ post_test ();
+}
+
+static void color_test1 (void)
+{
+ int color;
+ int r0, r1;
+ int c0, c1;
+ unsigned int dr0, dr1, dc0, dc1;
+
+ if (-1 == check_color_support ())
+ return;
+
+ pre_test ("Another Color Test");
+
+ r0 = 1;
+ r1 = SLtt_Screen_Rows / 2;
+ dr0 = r1;
+ dr1 = SLtt_Screen_Rows;
+
+ c0 = 0;
+ c1 = SLtt_Screen_Cols / 2;
+ dc0 = c1;
+ dc1 = SLtt_Screen_Cols;
+
+ color = 0;
+ do
+ {
+ SLsmg_gotorc (r1, 0);
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_write_string (" ");
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_write_string ("X");
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_erase_eol ();
+ SLsmg_refresh ();
+ }
+ while (0 == SLang_input_pending (30));
+ SLang_flush_input ();
+
+ color = 0;
+ do
+ {
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_fill_region (r0, c0, dr0, dc0, ' ');
+
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_fill_region (r0, c1, dr0, dc1, ' ');
+
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_fill_region (r1, c0, dr1, dc0, ' ');
+
+ SLsmg_set_color (color); color++; color = color % NUM_COLORS;
+ SLsmg_fill_region (r1, c1, dr1, dc1, ' ');
+
+ SLsmg_refresh ();
+ }
+ while (0 == SLang_input_pending (30));
+
+ SLsmg_set_color (0);
+ post_test ();
+}
+
+static void alt_char_test (void)
+{
+ int row, col;
+ int ch;
+
+ pre_test ("Alternate Charset Test");
+
+ row = SLtt_Screen_Rows / 2 - 2;
+ col = 0;
+ for (ch = 32; ch < 128; ch++)
+ {
+ SLsmg_gotorc (row, col);
+ SLsmg_write_char (ch);
+ SLsmg_gotorc (row + 1, col);
+ SLsmg_set_char_set (1);
+ SLsmg_write_char (ch);
+ SLsmg_set_char_set (0);
+ col++;
+
+ if (col > 40)
+ {
+ col = 0;
+ row += 4;
+ }
+ }
+
+ post_test ();
+}
+
+typedef struct
+{
+ char *name;
+ unsigned char value;
+}
+Draw_Symbols_Type;
+
+static Draw_Symbols_Type Draw_Symbols [] =
+{
+ {"SLSMG_HLINE_CHAR", SLSMG_HLINE_CHAR},
+ {"SLSMG_VLINE_CHAR", SLSMG_VLINE_CHAR},
+ {"SLSMG_ULCORN_CHAR", SLSMG_ULCORN_CHAR},
+ {"SLSMG_URCORN_CHAR", SLSMG_URCORN_CHAR},
+ {"SLSMG_LLCORN_CHAR", SLSMG_LLCORN_CHAR},
+ {"SLSMG_LRCORN_CHAR", SLSMG_LRCORN_CHAR},
+ {"SLSMG_RTEE_CHAR", SLSMG_RTEE_CHAR},
+ {"SLSMG_LTEE_CHAR", SLSMG_LTEE_CHAR},
+ {"SLSMG_UTEE_CHAR", SLSMG_UTEE_CHAR},
+ {"SLSMG_DTEE_CHAR", SLSMG_DTEE_CHAR},
+ {"SLSMG_PLUS_CHAR", SLSMG_PLUS_CHAR},
+ {"SLSMG_CKBRD_CHAR", SLSMG_CKBRD_CHAR},
+ {"SLSMG_DIAMOND_CHAR", SLSMG_DIAMOND_CHAR},
+ {"SLSMG_DEGREE_CHAR", SLSMG_DEGREE_CHAR},
+ {"SLSMG_PLMINUS_CHAR", SLSMG_PLMINUS_CHAR},
+ {"SLSMG_BULLET_CHAR", SLSMG_BULLET_CHAR},
+ {"SLSMG_LARROW_CHAR", SLSMG_LARROW_CHAR},
+ {"SLSMG_RARROW_CHAR", SLSMG_RARROW_CHAR},
+ {"SLSMG_DARROW_CHAR", SLSMG_DARROW_CHAR},
+ {"SLSMG_UARROW_CHAR", SLSMG_UARROW_CHAR},
+ {"SLSMG_BOARD_CHAR", SLSMG_BOARD_CHAR},
+ {"SLSMG_BLOCK_CHAR", SLSMG_BLOCK_CHAR},
+ {NULL}
+};
+
+static void draw_symbols_test (void)
+{
+ int row, col;
+ Draw_Symbols_Type *d;
+
+ pre_test ("Alternate Charset Test");
+
+ row = 3;
+ col = 3;
+ d = Draw_Symbols;
+ while (d->name != NULL)
+ {
+ SLsmg_gotorc (row, col);
+ SLsmg_set_char_set (1);
+ SLsmg_write_char ((char) d->value);
+ SLsmg_set_char_set (0);
+ SLsmg_printf (":%s", d->name);
+ col += 40;
+ if (col >= 80)
+ {
+ col = 3;
+ row++;
+ }
+ d++;
+ }
+ post_test ();
+}
+
+static void line_test (void)
+{
+ int row, col;
+ pre_test ("Line Test");
+
+ row = 4;
+ col = 2;
+ SLsmg_gotorc (row, col);
+ SLsmg_draw_hline (10);
+ SLsmg_write_string ("Result of SLsmg_draw_hline(10)");
+ SLsmg_draw_vline (5);
+ SLsmg_write_string ("Result of SLsmg_draw_vline(5)");
+
+ post_test ();
+}
+
+
+static void do_esc_seq_test (char *testname)
+{
+ int row;
+ unsigned char ch;
+ unsigned char buf[80], *b;
+
+ pre_test (testname);
+
+ while (1)
+ {
+ row = SLtt_Screen_Rows / 2;
+
+ SLsmg_gotorc (row, 0);
+ SLsmg_write_string ("Press key: (RETURN quits)");
+ SLsmg_refresh ();
+
+ ch = SLang_getkey ();
+ SLang_ungetkey (ch);
+ if (ch == '\r')
+ break;
+
+ SLsmg_gotorc (row+1, 0);
+ SLsmg_write_string ("Key returned \"");
+
+ b = buf;
+ do
+ {
+ ch = SLang_getkey ();
+ if (ch < ' ')
+ {
+ *b++ = '^';
+ ch += '@';
+ *b++ = ch;
+ }
+ else if (ch >= 127)
+ {
+ sprintf ((char *) b, "\\x%02X", ch);
+ b += strlen ((char *) b);
+ }
+ else if ((ch == '"') || (ch == '\\'))
+ {
+ *b++ = '\\';
+ *b++ = ch;
+ }
+ else *b++ = ch;
+ }
+ while (SLang_input_pending (3) > 0);
+ *b++ = '"';
+ *b = 0;
+ SLsmg_write_string ((char *) buf);
+ SLsmg_erase_eol ();
+ SLsmg_refresh ();
+ }
+
+ post_test ();
+}
+
+static void esc_seq_test (void)
+{
+#ifdef IBMPC_SYSTEM
+ SLgetkey_map_to_ansi (0);
+#endif
+ do_esc_seq_test ("Escape Sequence Report");
+}
+
+#ifdef IBMPC_SYSTEM
+static void ansi_esc_seq_test (void)
+{
+ SLgetkey_map_to_ansi (1);
+ do_esc_seq_test ("ANSI Escape Sequence Report");
+}
+#endif
+
+static void mouse_test (void)
+{
+ int row;
+ int b, x, y;
+
+ pre_test ("Mouse Test");
+
+ row = SLtt_Screen_Rows / 2;
+
+ SLsmg_gotorc (row, 0);
+ SLsmg_write_string ("Click Mouse: ");
+ SLsmg_refresh ();
+
+ if ((27 != SLang_getkey ())
+ || ('[' != SLang_getkey ())
+ || ('M' != SLang_getkey ()))
+ {
+ SLsmg_gotorc (row, 0);
+ SLsmg_write_string ("That did not appear to be a mouse escape sequence");
+ post_test ();
+ return;
+ }
+
+ b = SLang_getkey () - ' ';
+ x = SLang_getkey () - ' ';
+ y = SLang_getkey () - ' ';
+
+ SLsmg_gotorc (row, 0); SLsmg_printf ("Button: %d ", b);
+ SLsmg_gotorc (row + 1, 0); SLsmg_printf ("Column: %d", x);
+ SLsmg_gotorc (row + 2, 0); SLsmg_printf (" Row: %d", y);
+
+ post_test ();
+}
+
+static void mono_test (void)
+{
+ int row;
+ int c;
+
+ c = SLtt_Use_Ansi_Colors;
+ SLtt_Use_Ansi_Colors = 0;
+ SLsmg_normal_video ();
+ SLsmg_cls ();
+
+ pre_test ("Mono Test");
+
+ row = SLtt_Screen_Rows / 2;
+ SLsmg_set_color(1);
+ SLsmg_gotorc (row, 0);
+
+ /* Make a gap for testing erase_eol in bw mode */
+ SLsmg_write_string ("This line");
+ SLsmg_set_color (2);
+ SLsmg_erase_eol ();
+ SLsmg_gotorc (row, 30);
+ SLsmg_write_string ("should be in reverse video");
+
+ SLsmg_refresh ();
+ (void) SLkp_getkey ();
+ SLsmg_gotorc (row, 20);
+ SLsmg_write_string ("xxxxx");
+ SLsmg_refresh ();
+ post_test ();
+ SLtt_Use_Ansi_Colors = c;
+}
+
+static void low_level_test (void)
+{
+ int mid, bot;
+ int r;
+
+ if (SLtt_Term_Cannot_Scroll)
+ {
+ pre_test ("Sorry! Your terminal lacks scrolling capability.");
+ post_test ();
+ return;
+ }
+
+ if (-1 == SLsmg_suspend_smg ())
+ SLang_exit_error ("SLsmg_suspend_smg failed");
+
+ if (-1 == SLtt_init_video ())
+ SLang_exit_error ("SLang_init_video failed");
+
+ SLtt_get_screen_size ();
+
+ mid = SLtt_Screen_Rows/2;
+ bot = SLtt_Screen_Rows - 1;
+
+ SLtt_cls ();
+ SLtt_goto_rc (0, 0);
+ SLtt_write_string ("The following set of tests are designed to test the display system.");
+ SLtt_goto_rc (1, 0);
+ SLtt_write_string ("There should be a line of text in the middle and one at the bottom.");
+ SLtt_goto_rc (mid, 0);
+ SLtt_write_string ("This line is in the middle.");
+ SLtt_goto_rc (bot, 0);
+ SLtt_write_string ("This line is at the bottom.");
+
+ SLtt_goto_rc (2, 0);
+ SLtt_write_string ("Press return now.");
+ SLtt_flush_output ();
+ SLang_flush_input ();
+ (void) SLang_getkey ();
+
+ SLtt_goto_rc (2, 0);
+ SLtt_write_string ("The middle row should slowly move down next the bottom and then back up.");
+ SLtt_goto_rc (mid - 1, 0);
+ SLtt_write_string ("This line should not move.");
+ SLtt_goto_rc (mid + 1, 0);
+ SLtt_write_string ("This line should vanish at the bottom");
+ SLtt_goto_rc (mid + 1, SLtt_Screen_Cols - 5);
+ SLtt_write_string ("End->");
+ SLtt_flush_output ();
+
+ SLtt_set_scroll_region (mid, bot - 1);
+
+ r = (bot - mid) - 1;
+ while (r > 0)
+ {
+ (void) SLang_input_pending (2); /* 3/10 sec delay */
+ SLtt_goto_rc (0,0); /* relative to scroll region */
+ SLtt_reverse_index (1);
+ SLtt_flush_output ();
+ r--;
+ }
+
+ r = (bot - mid) - 1;
+ while (r > 0)
+ {
+ (void) SLang_input_pending (2); /* 3/10 sec delay */
+ SLtt_goto_rc (0,0); /* relative to scroll region */
+ SLtt_delete_nlines (1);
+ SLtt_flush_output ();
+ r--;
+ }
+
+ SLtt_reset_scroll_region ();
+ SLtt_goto_rc (mid - 1, 0);
+ SLtt_write_string ("Now the bottom will come up and clear the lines below");
+
+ SLtt_set_scroll_region (mid, bot);
+ r = (bot - mid) + 1;
+ while (r > 0)
+ {
+ (void) SLang_input_pending (2); /* 3/10 sec delay */
+ SLtt_goto_rc (0,0); /* relative to scroll region */
+ SLtt_delete_nlines (1);
+ SLtt_flush_output ();
+ r--;
+ }
+
+ SLtt_reset_scroll_region ();
+ SLtt_goto_rc (3,0);
+ SLtt_write_string ("This line will go down and vanish");
+ SLtt_set_scroll_region (3, mid - 2);
+
+ r = ((mid - 2) - 3) + 1;
+ while (r > 0)
+ {
+ (void) SLang_input_pending (3); /* 3/10 sec delay */
+ SLtt_goto_rc (0,0); /* relative to scroll region */
+ SLtt_reverse_index (1);
+ SLtt_flush_output ();
+ r--;
+ }
+
+
+ SLtt_reset_scroll_region ();
+ SLtt_set_scroll_region (1,1); SLtt_goto_rc (0,0);
+ SLtt_delete_nlines (1);
+ SLtt_reset_scroll_region ();
+ SLtt_set_scroll_region (2,2); SLtt_goto_rc (0,0);
+ SLtt_reverse_index (1);
+ SLtt_reset_scroll_region ();
+
+ SLtt_goto_rc (1, 10);
+ SLtt_write_string ("Press Any Key To Continue.");
+ SLtt_flush_output ();
+ r = 15;
+ if (0 == SLtt_Term_Cannot_Insert) while (r)
+ {
+ r--;
+ SLtt_goto_rc (1, 0);
+ SLtt_begin_insert ();
+ SLtt_putchar (' ');
+ SLtt_end_insert ();
+ SLtt_flush_output ();
+ SLang_input_pending (2);
+ }
+
+ SLang_flush_input ();
+ (void) SLang_getkey ();
+
+ SLtt_reset_video ();
+ SLsmg_resume_smg ();
+}
+