/* This demo test some of the slsmg features. */ #include "config.h" #include #ifdef HAVE_STDLIB_H # include #endif #include #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 (); 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 color_test (void); static void alt_char_test (void); static void esc_seq_test (void); static void line_test (void); typedef struct { char *name; void (*funct) (void); } Menu_Type; static Menu_Type Root_Menu [] = { {"Color Test", color_test}, {"Alt charset test", alt_char_test}, {"Key Escape Sequence Report", esc_seq_test}, {"Line Drawing Test", line_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 ("%2d. %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 () - '0'; 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 */ static char *Colors [] = { "black", "red", "green", "brown", "blue", "magenta", "cyan", "lightgray", "gray", "brightred", "brightgreen", "yellow", "brightblue", "brightmagenta", "brightcyan", "white", NULL }; static void init_colors (void) { int i; char *fg, *bg; fg = "black"; i = 0; while ((bg = Colors[i]) != NULL) { i++; SLtt_set_color (i, NULL, fg, bg); } } static void color_test (void) { int color; int row; pre_test ("Color Test"); row = 1; while (row < SLtt_Screen_Rows - 1) { color = 1 + (color % 16); SLsmg_gotorc (row, 0); SLsmg_set_color (color); SLsmg_erase_eol (); row++; } 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 (); } 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 esc_seq_test (void) { int row; unsigned char ch; unsigned char buf[80], *b; pre_test ("Escape Sequence Report"); row = SLtt_Screen_Rows / 2; SLsmg_gotorc (row, 0); SLsmg_write_string ("Press key: "); SLsmg_refresh (); SLsmg_gotorc (row, 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, "\\d%d", 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); post_test (); }