summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/.gitignore3
-rw-r--r--test/CMakeLists.txt3
-rw-r--r--test/Makefile8
-rw-r--r--test/browser.cxx6
-rw-r--r--test/contrast.cxx8
-rw-r--r--test/demo.cxx12
-rw-r--r--test/file_chooser.cxx7
-rw-r--r--test/input.cxx6
-rw-r--r--test/input_choice.cxx6
-rw-r--r--test/makedepend77
-rw-r--r--test/menubar.cxx6
-rw-r--r--test/native-filechooser.cxx6
-rw-r--r--test/table.cxx6
-rw-r--r--test/terminal.fl1972
-rw-r--r--test/tree.fl4
-rw-r--r--test/unittest_core.cxx7
-rw-r--r--test/unittest_simple_terminal.cxx121
-rw-r--r--test/unittest_terminal.cxx98
-rw-r--r--test/unittests.cxx4
-rw-r--r--test/unittests.h4
-rw-r--r--test/valuators.fl10
21 files changed, 2164 insertions, 210 deletions
diff --git a/test/.gitignore b/test/.gitignore
index cd29e2fca..316e790b1 100644
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -103,6 +103,7 @@ sudoku
symbols
table
tabs
+terminal
threads
tile
tiled_image
@@ -141,6 +142,8 @@ resize.cxx
resize.h
tabs.cxx
tabs.h
+terminal.cxx
+terminal.h
tree.cxx
tree.h
valuators.cxx
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 3338d3df6..d9a061a2f 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -157,6 +157,7 @@ CREATE_EXAMPLE (sudoku "sudoku.cxx;sudoku.plist;sudoku.icns;sudoku.rc" "fltk_ima
CREATE_EXAMPLE (symbols symbols.cxx fltk)
CREATE_EXAMPLE (tabs tabs.fl fltk)
CREATE_EXAMPLE (table table.cxx fltk)
+CREATE_EXAMPLE (terminal terminal.fl fltk)
CREATE_EXAMPLE (threads threads.cxx fltk)
CREATE_EXAMPLE (tile tile.cxx fltk)
CREATE_EXAMPLE (tiled_image tiled_image.cxx fltk)
@@ -185,7 +186,7 @@ SET (UNITTEST_SRCS
unittest_viewport.cxx
unittest_scrollbarsize.cxx
unittest_schemes.cxx
- unittest_simple_terminal.cxx
+ unittest_terminal.cxx
)
CREATE_EXAMPLE (unittests "${UNITTEST_SRCS}" "${GLDEMO_LIBS}")
diff --git a/test/Makefile b/test/Makefile
index e69b8a9fd..fd6fddf93 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -30,7 +30,7 @@ CPPUNITTEST = \
unittest_viewport.cxx \
unittest_scrollbarsize.cxx \
unittest_schemes.cxx \
- unittest_simple_terminal.cxx \
+ unittest_terminal.cxx \
unittest_core.cxx
OBJUNITTEST = \
@@ -125,6 +125,7 @@ CPPFILES =\
symbols.cxx \
table.cxx \
tabs.cxx \
+ terminal.cxx \
threads.cxx \
tile.cxx \
tiled_image.cxx \
@@ -206,6 +207,7 @@ ALL = \
sudoku$(EXEEXT) \
symbols$(EXEEXT) \
table$(EXEEXT) \
+ terminal$(EXEEXT) \
$(THREADS) \
tile$(EXEEXT) \
tiled_image$(EXEEXT) \
@@ -268,6 +270,7 @@ clean:
$(RM) radio.cxx radio.h
$(RM) resize.cxx resize.h
$(RM) tabs.cxx tabs.h
+ $(RM) terminal.cxx terminal.h
$(RM) tree.cxx tree.h
$(RM) valuators.cxx valuators.h
@@ -618,6 +621,9 @@ table$(EXEEXT): table.o
tabs$(EXEEXT): tabs.o
tabs.cxx: tabs.fl ../fluid/fluid$(EXEEXT)
+terminal$(EXEEXT): terminal.o
+terminal.cxx: terminal.fl ../fluid/fluid$(EXEEXT)
+
threads$(EXEEXT): threads.o
# This ensures that we have this dependency even if threads are not
# enabled in the current tree...
diff --git a/test/browser.cxx b/test/browser.cxx
index d269f0d57..0df67433b 100644
--- a/test/browser.cxx
+++ b/test/browser.cxx
@@ -64,7 +64,7 @@ That was a blank line above this.
#include <FL/Fl_Button.H>
#include <FL/Fl_Int_Input.H>
#include <FL/Fl_Choice.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <FL/fl_ask.H>
#include <stdio.h>
#include <string.h>
@@ -81,7 +81,7 @@ Fl_Button *top,
Fl_Choice *btype;
Fl_Choice *wtype;
Fl_Int_Input *field;
-Fl_Simple_Terminal *tty = 0;
+Fl_Terminal *tty = 0;
typedef struct {
const char *name;
@@ -219,7 +219,7 @@ int main(int argc, char **argv) {
wtype->value(4); // FL_WHEN_RELEASE_ALWAYS is Fl_Browser's default
// Small terminal window for callback messages
- tty = new Fl_Simple_Terminal(0,400,720,120);
+ tty = new Fl_Terminal(0,400,720,120);
tty->history_lines(50);
tty->ansi(true);
diff --git a/test/contrast.cxx b/test/contrast.cxx
index 5619635c4..cdc131a82 100644
--- a/test/contrast.cxx
+++ b/test/contrast.cxx
@@ -26,7 +26,7 @@
#include <FL/Fl_Color_Chooser.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Hor_Value_Slider.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <FL/fl_draw.H>
#include <math.h>
@@ -93,7 +93,7 @@ public:
// global variables
-Fl_Simple_Terminal *term = 0;
+Fl_Terminal *term = 0;
double g_lfg; // perceived lightness of foreground color
double g_lbg; // perceived lightness of background color
@@ -428,9 +428,9 @@ int main(int argc, char **argv) {
int ttw = window.w() - 20;
int tth = window.h() - tty - 10;
- term = new Fl_Simple_Terminal(ttx, tty, ttw, tth);
+ term = new Fl_Terminal(ttx, tty, ttw, tth);
term->color(FL_WHITE);
- term->textcolor(FL_BLACK);
+ term->textfgcolor(FL_BLACK);
term->textsize(13);
term->printf("FLTK fl_contrast() test program with different contrast algorithms, version %s\n", version);
diff --git a/test/demo.cxx b/test/demo.cxx
index d24fd92a2..ce9e8fd21 100644
--- a/test/demo.cxx
+++ b/test/demo.cxx
@@ -75,7 +75,7 @@
#include <FL/Fl_Button.H>
#include <FL/Fl_Menu_Button.H> // right click popup menu
#include <FL/Fl_Scheme_Choice.H>
-#include <FL/Fl_Simple_Terminal.H> // tty
+#include <FL/Fl_Terminal.H> // tty
#include <FL/filename.H>
#include <FL/platform.H>
#include <FL/fl_ask.H> // fl_alert()
@@ -102,7 +102,7 @@ void dobut(Fl_Widget *, long);
Fl_Double_Window *form = 0;
Fl_Group *demogrp = 0;
-Fl_Simple_Terminal *tty = 0;
+Fl_Terminal *tty = 0;
Fl_Scheme_Choice *scheme_choice = 0;
Fl_Button *but[9];
Fl_Button *exit_button;
@@ -231,11 +231,15 @@ void create_the_forms() {
demogrp->end();
// Small debug terminal window parented to window, not demogrp
- tty = new Fl_Simple_Terminal(10, FORM_H - 1, FORM_W - 20, 1);
+ // To show/hide debug terminal, use demo's right-click menu
+ //
+ tty = new Fl_Terminal(10, FORM_H - 1, FORM_W - 20, 1);
tty->history_lines(50);
+ tty->display_rows(2); // make display at least 2 rows high, even if not seen
+ tty->display_columns(100); // make display at least 100 cols wide, even if not seen
tty->ansi(true);
tty->hide();
- tty->textsize(10);
+ tty->textsize(12);
// End window
form->end();
diff --git a/test/file_chooser.cxx b/test/file_chooser.cxx
index a79ef2023..46e76d84c 100644
--- a/test/file_chooser.cxx
+++ b/test/file_chooser.cxx
@@ -36,7 +36,7 @@
#include <FL/Fl_PNM_Image.H>
#include <FL/Fl_Light_Button.H>
#include <FL/Fl_Double_Window.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <stdio.h>
#include <string.h>
@@ -55,7 +55,7 @@ Fl_Input *filter;
Fl_File_Browser *files;
Fl_File_Chooser *fc;
Fl_Shared_Image *image = 0;
-Fl_Simple_Terminal *tty = 0;
+Fl_Terminal *tty = 0;
// for choosing extra groups
Fl_Choice *ch_extra;
@@ -109,8 +109,9 @@ main(int argc, // I - Number of command-line arguments
// Make the main window...
window = new Fl_Double_Window(400, 215+TERMINAL_HEIGHT, "File Chooser Test");
- tty = new Fl_Simple_Terminal(0,215,window->w(),TERMINAL_HEIGHT);
+ tty = new Fl_Terminal(0,215,window->w(),TERMINAL_HEIGHT);
tty->ansi(true);
+ tty->display_columns(100); // at least 100 cols wide, even tho actual window smaller
// Group: limit resizing to filter input (not browse button)
grp = new Fl_Group(0,10,400,25);
diff --git a/test/input.cxx b/test/input.cxx
index 70c47c852..685bd6a2f 100644
--- a/test/input.cxx
+++ b/test/input.cxx
@@ -26,12 +26,12 @@
#include <FL/Fl_Toggle_Button.H>
#include <FL/Fl_Light_Button.H>
#include <FL/Fl_Color_Chooser.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#define TERMINAL_HEIGHT 120
// Globals
-Fl_Simple_Terminal *G_tty = 0;
+Fl_Terminal *G_tty = 0;
void cb(Fl_Widget *ob) {
G_tty->printf("Callback for %s '%s'\n",ob->label(),((Fl_Input*)ob)->value());
@@ -91,7 +91,7 @@ int main(int argc, char **argv) {
Fl::args(argc, argv);
Fl::get_system_colors();
Fl_Window *window = new Fl_Window(400,420+TERMINAL_HEIGHT);
- G_tty = new Fl_Simple_Terminal(0,420,window->w(),TERMINAL_HEIGHT);
+ G_tty = new Fl_Terminal(0,420,window->w(),TERMINAL_HEIGHT);
int y = 10;
input[0] = new Fl_Input(70,y,300,30,"Normal:"); y += 35;
diff --git a/test/input_choice.cxx b/test/input_choice.cxx
index b9598d52c..853c79c3a 100644
--- a/test/input_choice.cxx
+++ b/test/input_choice.cxx
@@ -18,12 +18,12 @@
#include <FL/Fl_Button.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Input_Choice.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#define TERMINAL_HEIGHT 120
// Globals
-Fl_Simple_Terminal *G_tty = 0;
+Fl_Terminal *G_tty = 0;
void buttcb(Fl_Widget*,void*data) {
Fl_Input_Choice *in=(Fl_Input_Choice *)data;
@@ -44,7 +44,7 @@ void input_choice_cb(Fl_Widget*,void*data) {
int main(int argc, char **argv) {
Fl_Double_Window win(300, 200+TERMINAL_HEIGHT);
- G_tty = new Fl_Simple_Terminal(0,200,win.w(),TERMINAL_HEIGHT);
+ G_tty = new Fl_Terminal(0,200,win.w(),TERMINAL_HEIGHT);
Fl_Input_Choice in(40,40,100,28,"Test");
in.callback(input_choice_cb, (void*)&in);
diff --git a/test/makedepend b/test/makedepend
index 24ad1c171..a152cfa0e 100644
--- a/test/makedepend
+++ b/test/makedepend
@@ -222,7 +222,7 @@ browser.o: ../FL/Fl_Rect.H
browser.o: ../FL/Fl_RGB_Image.H
browser.o: ../FL/Fl_Scrollbar.H
browser.o: ../FL/Fl_Select_Browser.H
-browser.o: ../FL/Fl_Simple_Terminal.H
+browser.o: ../FL/Fl_Terminal.H
browser.o: ../FL/Fl_Slider.H
browser.o: ../FL/Fl_Text_Buffer.H
browser.o: ../FL/Fl_Text_Display.H
@@ -507,7 +507,7 @@ contrast.o: ../FL/Fl_Return_Button.H
contrast.o: ../FL/Fl_RGB_Image.H
contrast.o: ../FL/Fl_Round_Button.H
contrast.o: ../FL/Fl_Scrollbar.H
-contrast.o: ../FL/Fl_Simple_Terminal.H
+contrast.o: ../FL/Fl_Terminal.H
contrast.o: ../FL/Fl_Slider.H
contrast.o: ../FL/Fl_Text_Buffer.H
contrast.o: ../FL/Fl_Text_Display.H
@@ -693,7 +693,7 @@ demo.o: ../FL/Fl_RGB_Image.H
demo.o: ../FL/Fl_Scheme.H
demo.o: ../FL/Fl_Scheme_Choice.H
demo.o: ../FL/Fl_Scrollbar.H
-demo.o: ../FL/Fl_Simple_Terminal.H
+demo.o: ../FL/Fl_Terminal.H
demo.o: ../FL/Fl_Slider.H
demo.o: ../FL/Fl_Text_Buffer.H
demo.o: ../FL/Fl_Text_Display.H
@@ -911,7 +911,7 @@ file_chooser.o: ../FL/Fl_Return_Button.H
file_chooser.o: ../FL/Fl_RGB_Image.H
file_chooser.o: ../FL/Fl_Scrollbar.H
file_chooser.o: ../FL/Fl_Shared_Image.H
-file_chooser.o: ../FL/Fl_Simple_Terminal.H
+file_chooser.o: ../FL/Fl_Terminal.H
file_chooser.o: ../FL/Fl_Slider.H
file_chooser.o: ../FL/Fl_Text_Buffer.H
file_chooser.o: ../FL/Fl_Text_Display.H
@@ -1409,7 +1409,7 @@ input.o: ../FL/Fl_Return_Button.H
input.o: ../FL/Fl_RGB_Image.H
input.o: ../FL/Fl_Scrollbar.H
input.o: ../FL/Fl_Secret_Input.H
-input.o: ../FL/Fl_Simple_Terminal.H
+input.o: ../FL/Fl_Terminal.H
input.o: ../FL/Fl_Slider.H
input.o: ../FL/Fl_Text_Buffer.H
input.o: ../FL/Fl_Text_Display.H
@@ -1448,7 +1448,7 @@ input_choice.o: ../FL/Fl_Preferences.H
input_choice.o: ../FL/Fl_Rect.H
input_choice.o: ../FL/Fl_RGB_Image.H
input_choice.o: ../FL/Fl_Scrollbar.H
-input_choice.o: ../FL/Fl_Simple_Terminal.H
+input_choice.o: ../FL/Fl_Terminal.H
input_choice.o: ../FL/Fl_Slider.H
input_choice.o: ../FL/Fl_Text_Buffer.H
input_choice.o: ../FL/Fl_Text_Display.H
@@ -1626,7 +1626,7 @@ menubar.o: ../FL/Fl_RGB_Image.H
menubar.o: ../FL/Fl_Scheme.H
menubar.o: ../FL/Fl_Scheme_Choice.H
menubar.o: ../FL/Fl_Scrollbar.H
-menubar.o: ../FL/Fl_Simple_Terminal.H
+menubar.o: ../FL/Fl_Terminal.H
menubar.o: ../FL/Fl_Slider.H
menubar.o: ../FL/fl_string_functions.h
menubar.o: ../FL/Fl_Sys_Menu_Bar.H
@@ -1719,7 +1719,7 @@ native-filechooser.o: ../FL/Fl_Rect.H
native-filechooser.o: ../FL/Fl_Return_Button.H
native-filechooser.o: ../FL/Fl_RGB_Image.H
native-filechooser.o: ../FL/Fl_Scrollbar.H
-native-filechooser.o: ../FL/Fl_Simple_Terminal.H
+native-filechooser.o: ../FL/Fl_Terminal.H
native-filechooser.o: ../FL/Fl_Slider.H
native-filechooser.o: ../FL/Fl_Text_Buffer.H
native-filechooser.o: ../FL/Fl_Text_Display.H
@@ -2446,7 +2446,7 @@ table.o: ../FL/Fl_Rect.H
table.o: ../FL/Fl_RGB_Image.H
table.o: ../FL/Fl_Scroll.H
table.o: ../FL/Fl_Scrollbar.H
-table.o: ../FL/Fl_Simple_Terminal.H
+table.o: ../FL/Fl_Terminal.H
table.o: ../FL/Fl_Slider.H
table.o: ../FL/Fl_Table.H
table.o: ../FL/Fl_Table_Row.H
@@ -2595,7 +2595,7 @@ tree.o: ../FL/Fl_Rect.H
tree.o: ../FL/Fl_Return_Button.H
tree.o: ../FL/Fl_RGB_Image.H
tree.o: ../FL/Fl_Scrollbar.H
-tree.o: ../FL/Fl_Simple_Terminal.H
+tree.o: ../FL/Fl_Terminal.H
tree.o: ../FL/Fl_Slider.H
tree.o: ../FL/Fl_Text_Buffer.H
tree.o: ../FL/Fl_Text_Display.H
@@ -2660,7 +2660,7 @@ unittests.o: ../FL/Fl_Preferences.H
unittests.o: ../FL/Fl_Rect.H
unittests.o: ../FL/Fl_RGB_Image.H
unittests.o: ../FL/Fl_Scrollbar.H
-unittests.o: ../FL/Fl_Simple_Terminal.H
+unittests.o: ../FL/Fl_Terminal.H
unittests.o: ../FL/Fl_Slider.H
unittests.o: ../FL/fl_string_functions.h
unittests.o: ../FL/Fl_Text_Buffer.H
@@ -2788,7 +2788,7 @@ unittest_core.o: ../FL/Fl_Preferences.H
unittest_core.o: ../FL/Fl_Rect.H
unittest_core.o: ../FL/Fl_RGB_Image.H
unittest_core.o: ../FL/Fl_Scrollbar.H
-unittest_core.o: ../FL/Fl_Simple_Terminal.H
+unittest_core.o: ../FL/Fl_Terminal.H
unittest_core.o: ../FL/Fl_Slider.H
unittest_core.o: ../FL/Fl_Text_Buffer.H
unittest_core.o: ../FL/Fl_Text_Display.H
@@ -2980,37 +2980,26 @@ unittest_scrollbarsize.o: ../FL/Fl_Widget.H
unittest_scrollbarsize.o: ../FL/Fl_Window.H
unittest_scrollbarsize.o: ../FL/platform_types.h
unittest_scrollbarsize.o: unittests.h
-unittest_simple_terminal.o: ../FL/Enumerations.H
-unittest_simple_terminal.o: ../FL/Fl.H
-unittest_simple_terminal.o: ../FL/fl_attr.h
-unittest_simple_terminal.o: ../FL/Fl_Bitmap.H
-unittest_simple_terminal.o: ../FL/Fl_Cairo.H
-unittest_simple_terminal.o: ../FL/fl_casts.H
-unittest_simple_terminal.o: ../FL/fl_config.h
-unittest_simple_terminal.o: ../FL/Fl_Device.H
-unittest_simple_terminal.o: ../FL/Fl_Double_Window.H
-unittest_simple_terminal.o: ../FL/fl_draw.H
-unittest_simple_terminal.o: ../FL/Fl_Export.H
-unittest_simple_terminal.o: ../FL/Fl_Graphics_Driver.H
-unittest_simple_terminal.o: ../FL/Fl_Group.H
-unittest_simple_terminal.o: ../FL/Fl_Image.H
-unittest_simple_terminal.o: ../FL/Fl_Pixmap.H
-unittest_simple_terminal.o: ../FL/Fl_Plugin.H
-unittest_simple_terminal.o: ../FL/Fl_Preferences.H
-unittest_simple_terminal.o: ../FL/Fl_Rect.H
-unittest_simple_terminal.o: ../FL/Fl_RGB_Image.H
-unittest_simple_terminal.o: ../FL/Fl_Scrollbar.H
-unittest_simple_terminal.o: ../FL/Fl_Simple_Terminal.H
-unittest_simple_terminal.o: ../FL/Fl_Slider.H
-unittest_simple_terminal.o: ../FL/Fl_Text_Buffer.H
-unittest_simple_terminal.o: ../FL/Fl_Text_Display.H
-unittest_simple_terminal.o: ../FL/fl_types.h
-unittest_simple_terminal.o: ../FL/fl_utf8.h
-unittest_simple_terminal.o: ../FL/Fl_Valuator.H
-unittest_simple_terminal.o: ../FL/Fl_Widget.H
-unittest_simple_terminal.o: ../FL/Fl_Window.H
-unittest_simple_terminal.o: ../FL/platform_types.h
-unittest_simple_terminal.o: unittests.h
+unittest_terminal.o: ../FL/Enumerations.H
+unittest_terminal.o: ../FL/Fl.H
+unittest_terminal.o: ../FL/fl_attr.h
+unittest_terminal.o: ../FL/Fl_Bitmap.H
+unittest_terminal.o: ../FL/Fl_Cairo.H
+unittest_terminal.o: ../FL/fl_casts.H
+unittest_terminal.o: ../FL/fl_config.h
+unittest_terminal.o: ../FL/Fl_Double_Window.H
+unittest_terminal.o: ../FL/Fl_Export.H
+unittest_terminal.o: ../FL/Fl_Group.H
+unittest_terminal.o: ../FL/Fl_Image.H
+unittest_terminal.o: ../FL/Fl_Rect.H
+unittest_terminal.o: ../FL/Fl_Scrollbar.H
+unittest_terminal.o: ../FL/Fl_Terminal.H
+unittest_terminal.o: ../FL/fl_types.h
+unittest_terminal.o: ../FL/fl_utf8.h
+unittest_terminal.o: ../FL/Fl_Widget.H
+unittest_terminal.o: ../FL/Fl_Window.H
+unittest_terminal.o: ../FL/platform_types.h
+unittest_terminal.o: unittests.h
unittest_symbol.o: ../FL/Enumerations.H
unittest_symbol.o: ../FL/Fl.H
unittest_symbol.o: ../FL/fl_attr.h
@@ -3203,7 +3192,7 @@ valuators.o: ../FL/Fl_Repeat_Button.H
valuators.o: ../FL/Fl_RGB_Image.H
valuators.o: ../FL/Fl_Roller.H
valuators.o: ../FL/Fl_Scrollbar.H
-valuators.o: ../FL/Fl_Simple_Terminal.H
+valuators.o: ../FL/Fl_Terminal.H
valuators.o: ../FL/Fl_Slider.H
valuators.o: ../FL/Fl_Spinner.H
valuators.o: ../FL/Fl_Text_Buffer.H
diff --git a/test/menubar.cxx b/test/menubar.cxx
index 034e716e9..e46a60be0 100644
--- a/test/menubar.cxx
+++ b/test/menubar.cxx
@@ -31,14 +31,14 @@
#include <stdio.h>
#include <stdlib.h>
#include <FL/fl_draw.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <FL/fl_ask.H>
#include <FL/fl_string_functions.h>
#define TERMINAL_HEIGHT 120
// Globals
-Fl_Simple_Terminal *G_tty = 0;
+Fl_Terminal *G_tty = 0;
void window_cb(Fl_Widget* w, void*) {
puts("window callback called"); // end of program, so stdout instead of G_tty
@@ -235,7 +235,7 @@ int main(int argc, char **argv) {
Fl_Scheme_Choice scheme_choice(300, 50, 100, 25, "&scheme");
- G_tty = new Fl_Simple_Terminal(0,400,WIDTH,TERMINAL_HEIGHT);
+ G_tty = new Fl_Terminal(0,400,WIDTH,TERMINAL_HEIGHT);
window.callback(window_cb);
Fl_Menu_Bar menubar(0,0,WIDTH,30); menubar.menu(menutable);
diff --git a/test/native-filechooser.cxx b/test/native-filechooser.cxx
index df2433021..10194f2ca 100644
--- a/test/native-filechooser.cxx
+++ b/test/native-filechooser.cxx
@@ -25,14 +25,14 @@
#include <FL/Fl_Box.H>
#include <FL/Fl_Native_File_Chooser.H>
#include <FL/Fl_Help_View.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#define TERMINAL_HEIGHT 120
// GLOBALS
Fl_Input *G_filename = NULL;
Fl_Multiline_Input *G_filter = NULL;
-Fl_Simple_Terminal *G_tty = NULL;
+Fl_Terminal *G_tty = NULL;
void PickFile_CB(Fl_Widget*, void*) {
// Create native chooser
@@ -106,7 +106,7 @@ int main(int argc, char **argv) {
win->size_range(win->w(), win->h(), 0, 0);
win->begin();
{
- G_tty = new Fl_Simple_Terminal(0,400,win->w(),TERMINAL_HEIGHT);
+ G_tty = new Fl_Terminal(0,400,win->w(),TERMINAL_HEIGHT);
int x = 80, y = 10;
G_filename = new Fl_Input(x, y, win->w()-80-10, 25, "Filename");
diff --git a/test/table.cxx b/test/table.cxx
index 06df9bf86..95b9742f7 100644
--- a/test/table.cxx
+++ b/test/table.cxx
@@ -10,7 +10,7 @@
#include <FL/fl_draw.H>
#include <FL/fl_ask.H>
#include <FL/Fl_Table_Row.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <stdio.h>
#include <string.h>
@@ -19,7 +19,7 @@
#define TERMINAL_HEIGHT 120
// Globals
-Fl_Simple_Terminal *G_tty = 0;
+Fl_Terminal *G_tty = 0;
// Simple demonstration class to derive from Fl_Table_Row
class DemoTable : public Fl_Table_Row
@@ -349,7 +349,7 @@ int main(int argc, char **argv)
{
Fl_Window win(900, 730+TERMINAL_HEIGHT);
- G_tty = new Fl_Simple_Terminal(0,730,win.w(),TERMINAL_HEIGHT);
+ G_tty = new Fl_Terminal(0,730,win.w(),TERMINAL_HEIGHT);
G_table = new DemoTable(20, 20, 860, 460, "Demo");
G_table->selection_color(FL_YELLOW);
diff --git a/test/terminal.fl b/test/terminal.fl
new file mode 100644
index 000000000..920bfc0b3
--- /dev/null
+++ b/test/terminal.fl
@@ -0,0 +1,1972 @@
+# data file for the Fltk User Interface Designer (fluid)
+version 1.0400
+utf8_in_src
+header_name {.h}
+code_name {.cxx}
+comment {DEVELOPER README
+
+APPLICATION
+-----------
+The Application class encompasses the entire application,
+and has the widget hierarchy declared by main_window().
+
+SELF TESTS
+----------
+The "self tests" are all named test_xxx(), and are static
+functions because they were designed that way originally
+(testterm.cxx), so they remain static.
+
+They only need access to the global G_tty to access the
+terminal for printing, and handle their own state
+information.
+
+To add /new/ tests:
+1. Create the test function similar to existing test_xxx().
+2. Add the function's name to the NextEscapeTest() function's
+This makes the new test become part of the self tests.
+
+NextEscapeTest() keeps track of the last test shown as
+a static value internally, and the integer argument
+tells it how to advance to the next test, either fwd or back.
+
+The tests themselves may keep state information, so that
+a single test might have several pages. The return value
+determines whether to recall the test again, or if it's
+on the last page.
+
+} {in_source not_in_header
+}
+
+decl {\#include <stdio.h>} {public global
+}
+
+decl {\#include <stdlib.h> // rand()} {private global
+}
+
+decl {\#include <errno.h>} {public global
+}
+
+decl {\#include <FL/Fl_Window.H>} {public global
+}
+
+decl {\#include <FL/Fl_Terminal.H>} {public global
+}
+
+decl {\#include <FL/Fl_Scheme_Choice.H>} {public global
+}
+
+decl {\#include <FL/fl_ask.H>} {public global
+}
+
+decl {\#include <fcntl.h>} {public global
+}
+
+decl {\#ifdef _WIN32} {public global
+}
+
+decl {\#include <io.h> // _read()} {public global
+}
+
+decl {\#else} {public global
+}
+
+decl {\#include <unistd.h> // read()} {public global
+}
+
+decl {\#endif} {public global
+}
+
+decl {MyTerminal *G_tty;} {
+ comment {Global access to tty} private global
+}
+
+decl {Application *G_app;} {
+ comment {Global access to application} private global
+}
+
+decl {////// TERMINAL RING BUFFER DEBUG CLASS //////} {private local
+}
+
+class MyTerminal {
+ comment {Fl_Terminal derived class that can access ring buffer internals for debugging} open : {public Fl_Terminal}
+} {
+ decl {Fl_Double_Window *ring_debug_win;} {private local
+ }
+ decl {Fl_Terminal *debug_tty;} {private local
+ }
+ decl {bool interactivecursor;} {private local
+ }
+ Function {MyTerminal(int X,int Y,int W,int H, const char *L=0):Fl_Terminal(X,Y,W,H,L)} {
+ comment CTOR open
+ } {
+ code {ring_debug_win = 0;
+debug_tty = 0;
+interactivecursor = false;} {}
+ }
+ Function {show_ring_debug_window()} {open return_type void
+ } {
+ code {// Show the internal ring debug window
+if (!ring_debug_win) {
+ ring_debug_win = new Fl_Double_Window(1250,800,"Fl_Terminal Ring Buffer");
+ ring_debug_win->resizable(ring_debug_win);
+ ring_debug_win->callback(debug_winquit_callback, (void*)this);
+ debug_tty = new Fl_Terminal(0,0,ring_debug_win->w(),ring_debug_win->h());
+ debug_tty->textsize(7);
+ debug_tty->redraw_style(NO_REDRAW);
+ debug_tty->display_columns(400);
+ ring_debug_win->end();
+}
+ring_debug_win->show();
+// Start timer to update ring debug updates
+Fl::add_timeout(.5, ring_debug_timer_callback, (void*)this);} {}
+ }
+ Function {interactive_cursor(bool val)} {
+ comment {Enable/disable interactive cursor movement in test app} open return_type void
+ } {
+ code {interactivecursor = val;} {}
+ }
+ Function {debug_winquit_callback2()} {return_type void
+ } {
+ code {// Hide debug window, disable its update timer
+ring_debug_win->hide();
+Fl::remove_timeout(ring_debug_timer_callback, (void*)this);} {}
+ }
+ Function {debug_winquit_callback(Fl_Widget*,void *userdata)} {return_type {static void}
+ } {
+ code {MyTerminal *o = (MyTerminal*)userdata;
+o->debug_winquit_callback2();} {}
+ }
+ Function {horiz_bracket(int w)} {
+ comment {Print a graphic horizontally oriented bracket of width w} return_type void
+ } {
+ code {debug_tty->append("┏");
+for (int t=0; t<w-2; t++) { debug_tty->print_char("━"); }
+debug_tty->append("┓");} {}
+ }
+ Function {update_ring()} {open return_type void
+ } {
+ code {// Handle updating the ring debug window's contents
+int m1,m2,m3,m4;
+get_selection(m1,m2,m3,m4);
+
+// These reference the Fl_Terminal base class protected members
+int x = 5;
+debug_tty->append("\\033c"); // reset terminal (clear screen, history, home)
+debug_tty->append("\\033[s"); // save cursor
+debug_tty->printf("\\033[%dC \\033[7m Ring Index \\033[0m\\n", x);
+debug_tty->printf("\\033[%dC ring_rows(): %-3d Mouse Selection (srow,scol,erow,ecol)\\n", x, ring_rows());
+debug_tty->printf("\\033[%dC ring_cols(): %-3d \\033[7m(%d,%d,%d,%d)\\033[0m\\n", x, ring_cols(), m1,m2,m3,m4);
+debug_tty->printf("\\033[%dC offset(): %-3d\\n", x, offset());
+debug_tty->printf("\\033[%dC ", x);
+horiz_bracket(disp_cols());
+debug_tty->printf("\\033[u"); // recall cursor
+
+x += disp_cols() + 11;
+debug_tty->printf("\\033[%dC \\033[7m History Index \\033[0m\\n", x);
+debug_tty->printf("\\033[%dC hist_rows(): %d hist_srow()=%d\\n", x, hist_rows(), hist_srow());
+debug_tty->printf("\\033[%dC hist_cols(): %d hist_erow()=%d\\n", x, hist_cols(), hist_erow());
+debug_tty->printf("\\033[%dC hist_use(): %d\\n", x, hist_use());
+debug_tty->printf("\\033[%dC ", x);
+horiz_bracket(disp_cols());
+debug_tty->append("\\033[u"); // recall cursor
+
+x += disp_cols() + 11;
+debug_tty->printf("\\033[%dC \\033[7m Display Index \\033[0m\\n", x);
+debug_tty->printf("\\033[%dC disp_rows(): %d disp_srow()=%d\\n", x, disp_rows(), disp_srow());
+debug_tty->printf("\\033[%dC disp_cols(): %d disp_erow()=%d\\n", x, disp_cols(), disp_erow());
+debug_tty->append("\\n");
+debug_tty->printf("\\033[%dC ", x);
+horiz_bracket(disp_cols());
+debug_tty->append("\\n");
+
+{
+ for ( int row=0; row<ring_rows(); row++ ) {
+ // SHOW RING
+ Utf8Char *u8c = u8c_ring_row(row);
+ debug_tty->printf("%3d R[", row);
+ for ( int col=0; col<ring_cols(); col++,u8c++ ) {
+ // Get Utf8Char's attrib,fg,bg and make that 'current' to draw the char in that style
+ debug_tty->textattrib(u8c->attrib());
+ debug_tty->textfgcolor(u8c->fgcolor());
+ debug_tty->textbgcolor(u8c->bgcolor());
+ debug_tty->print_char(u8c->text_utf8()); // print the char in current style
+ }
+ debug_tty->append("\\033[0m"); // restore default fg/bg/attrib
+ debug_tty->append("] ");
+ // SHOW HISTORY
+ if ( row < hist_rows() ) {
+ u8c = u8c_ring_row(hist_srow() + row);
+ debug_tty->printf("%3d H[", row);
+ for ( int col=0; col<hist_cols(); col++,u8c++ ) {
+ // Get Utf8Char's attrib,fg,bg and make that 'current' to draw the char in that style
+ debug_tty->textattrib(u8c->attrib());
+ debug_tty->textfgcolor(u8c->fgcolor());
+ debug_tty->textbgcolor(u8c->bgcolor());
+ debug_tty->print_char(u8c->text_utf8()); // print the char in current style
+ }
+ debug_tty->append("\\033[0m"); // restore default fg/bg/attrib
+ debug_tty->printf("] ");
+ } else {
+ debug_tty->append(" ");
+ for ( int col=0; col<hist_cols(); col++ ) { debug_tty->append(" "); }
+ debug_tty->append(" ");
+ }
+ // SHOW DISPLAY
+ if ( row < disp_rows() ) {
+ u8c = u8c_ring_row(disp_srow() + row);
+ debug_tty->printf("%3d D[", row);
+ for ( int col=0; col<disp_cols(); col++,u8c++ ) {
+ // Get Utf8Char's attrib,fg,bg and make that 'current' to draw the char in that style
+ debug_tty->textattrib(u8c->attrib());
+ debug_tty->textfgcolor(u8c->fgcolor());
+ debug_tty->textbgcolor(u8c->bgcolor());
+ debug_tty->print_char(u8c->text_utf8()); // print the char in current style
+ }
+ debug_tty->append("\\033[0m"); // restore default fg/bg/attrib
+ debug_tty->append("]\\033[K\\n");
+ } else {
+ debug_tty->append("\\033[K\\n");
+ }
+ }
+}
+debug_tty->printf("--- END\\033[0J\\n"); // clear eos} {}
+ }
+ Function {ring_debug_timer_callback2()} {open return_type void
+ } {
+ code {// Update the ring debug window
+update_ring();
+
+// Redraw after all changes have been made
+ring_debug_win->redraw();
+Fl::repeat_timeout(.10, ring_debug_timer_callback, (void*)this);} {}
+ }
+ Function {ring_debug_timer_callback(void* userdata)} {return_type {static void}
+ } {
+ code {MyTerminal *o = (MyTerminal*)userdata;
+o->ring_debug_timer_callback2();} {}
+ }
+ Function {handle(int e)} {
+ comment {Event handler} return_type int
+ } {
+ code {switch (e) {
+ case FL_KEYBOARD: {
+ if (interactivecursor) {
+ switch (Fl::event_key()) {
+ case FL_Up: cursor_up(1,true); redraw(); return 1;
+ case FL_Down: cursor_down(1,true); redraw(); return 1;
+ case FL_Left: cursor_left(); redraw(); return 1;
+ case FL_Right: cursor_right(); redraw(); return 1;
+ }
+ }
+ break;
+ }
+}
+return Fl_Terminal::handle(e);} {}
+ }
+}
+
+decl {////// APPLICATION CLASS //////} {private local
+}
+
+class Application {open
+} {
+ decl {int G_lines;} {
+ comment {Line counter for +50 line test
+} private local
+ }
+ Function {Application()} {
+ comment {// Ctor}
+ } {
+ code {// CTOR
+G_lines = 1;
+make_window();
+
+// Do widget init in make_window()'s extra 'Code' section, not here.} {}
+ }
+ Function {show(int argc=0, char **argv=0)} {
+ comment {Show the app window
+} return_type void
+ } {
+ code {if (argv) win->show(argc,argv);
+else win->show();} {}
+ }
+ Function {AppendTty(const char *s)} {
+ comment {Append text to Fl_Terminal (and stdout if radio button set)
+} return_type void
+ } {
+ code {// Append to Fl_Terminal
+G_tty->append(s);
+
+// Send to stdout too?
+if (G_app->stdout_radio->value()) {
+ printf("%s", s);
+ fflush(stdout);
+}} {}
+ }
+ decl {////// ESC SELF TESTS //////} {private local
+ }
+ Function {NextEscapeTest(int dir)} {
+ comment {Advance/Reverse thru escape code tests} open return_type {static void}
+ } {
+ code {// *** ADD NEW TESTS HERE ***
+typedef int (TestFunc)(bool);
+static int testret = 1; // last test return value
+static int testnum = 0;
+static TestFunc *tests[] = {
+ test_firstpage,
+ test_esc_attr,
+ test_esc_rgbcolors,
+ test_esc_fgbg_colors,
+ test_esc_curpos,
+ test_esc_tabstops,
+ test_esc_insert_char,
+ test_esc_clear_test,
+ test_esc_delete_row,
+ test_esc_insert_row,
+ test_esc_scrolling
+ // ^^^ INSERT NEW TEST FUNCS ABOVE THIS LINE ^^^
+};
+
+int numtests = sizeof(tests) / sizeof(TestFunc*);
+testnum += (dir * testret); // advance testnum only if last test isn't recall
+if (testnum >= numtests) testnum = 0;
+if (testnum < 0) testnum = numtests-1;
+if (dir == 10000) { // 1000: special case to reset all tests, run first test
+ testnum = 0; // run first test
+ for ( int i=0; i<numtests; i++ ) tests[i](true); // reset all tests
+}
+
+/*** NO: THIS SCREWS UP DELETE CURRENT LINE TESTS
+// If cursor floating, do a crlf first
+if (G_tty->cursor_col()!=0) G_tty->append("\\n");
+****/
+
+// Run test, save return value
+testret = tests[testnum](false);
+G_tty->redraw();} {}
+ }
+ Function {show_test(const char **test, int &index)} {
+ comment {Show test in test[] starting at 'index', returns 0 or 1
+} return_type {static int}
+ } {
+ code {// Show test in test[] starting at 'index'.
+// 'index' is adjusted to point to next test.
+// Returns number to add to parent test index:
+// 0 - test shown, call here again for next page in this test
+// 1 - test shown, move on to next test for next time
+//
+while (test[index]) {
+ G_app->AppendTty(test[index++]);
+ if (strncmp(test[index-1], "--->", 4) == 0 ) {
+ if (test[index] == NULL) { index = 0; return 1; } // rewind, tell parent to move to next test
+ else { return 0; } // tell parent to call us again for next test
+ }
+}
+index = 0;
+return 1; // hit end of test, reset} {}
+ }
+ Function {test_firstpage(bool reset)} {
+ comment {--- 0000: Test unicode alignment} return_type {static int}
+ } {
+ code {G_app->AppendTty(
+ "\\033[0m\\033[H\\033[2J\\033[3J" // color/attr reset, home, cls, clear history
+ "hello.\\nLine one\\nLine two\\n"
+ "\\033[0;0;2m Dim text:\\033[31m red\\033[32m grn\\033[33m yel"
+ "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n"
+ "\\033[0;0;0m Normal text:\\033[31m red\\033[32m grn\\033[33m yel"
+ "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n"
+ "\\033[0;0;1m Bold text:\\033[31m red\\033[32m grn\\033[33m yel"
+ "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n"
+ "\\033[0;1;3m Bold Italic text:\\033[31m red\\033[32m grn\\033[33m yel"
+ "\\033[34m blu\\033[35m mag\\033[36m cyn\\033[37m wht\\n"
+ "\\033[0m\\n"
+ // Language Language
+ // Alignment Alignment
+ // <-----> <---->
+ "Here's some utf8: ||| AAA || AAA\\n"
+ "╳╳ ██ ▏▏┌─┬┐ ┏━┳┓ ╔═╦╗ ██████ ||| AAA Hell Yeah Jim - English || AAA\\n"
+ "╳╳ ██ ▏▏│ ││ ┃ ┃┃ ║ ║║ ██ ██ ||| AAA Первый рабочий - Russian || AAA\\n"
+ "╳╳ ██ ▏▏├─┼┤ ┣━╋┫ ╠═╬╣ ██ ██ ||| AAA テキスト処理法 - Japanese || AAA\\n"
+ "╳╳ ██ ▏▏└─┴┘ ┗━┻┛ ╚═╩╝ ██████ ||| AAA 香港增补字符集 - Chinese || AAA\\n"
+ " ||| AAA || AAA\\n"
+ "underbar: ______ ||| AAA || AAA\\n"
+ " overbar: ‾‾‾‾‾‾ ||| AAA || AAA\\n"
+ "\\n"
+ "\\033[23X >> KEYBOARD KEYS: Arrow keys move cursor <<\\n"
+ "\\033[23X >> 's'=speed test 'c'=colorbars <<\\n"
+ "\\033[23X >> 'e'=next esc test 'E'=prev esc test <<\\n"
+ "\\033[23X >> 'q'=quit <<\\n"
+ "\\033[23X >> <<\\n"
+ "\\033[23X >> <<\\n"
+ "\\n"
+ "Some floating text. >X<\\b\\033[D"); // put cursor between > < using BS and cursor_left
+return 1; // tell parent to move to next test} {}
+ }
+ Function {test_esc_attr(bool reset)} {
+ comment {--- 0010: Test attributes} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 10
+ "\\033[H\\033[2J" "ESC TEST 0010: Attributes\\n",
+ " \\033[0;2m Some Dim text \\033[0m \\033[0m Normal text \\033[0m \\033[0;1m Some Bold text \\033[0m\\n"
+ " \\033[2;3m Dim italic text \\033[0m \\033[3m Normal italic \\033[0m \\033[1;3m Bold italic text \\033[0m\\n"
+ " \\033[2;4m Dim underline \\033[0m \\033[4m Normal underline \\033[0m \\033[1;4m Bold underline \\033[0m\\n"
+ " \\033[2;5m Dim blinking \\033[0m \\033[5m Normal blinking \\033[0m \\033[1;5m Bold blinking \\033[0m\\n"
+ " \\033[2;7m Dim inverse [█] \\033[0m \\033[7m Normal inverse [█] \\033[0m \\033[1;7m Bold inverse [█] \\033[0m\\n"
+ " \\033[2;9m Dim strikeout \\033[0m \\033[9m Normal strikeout \\033[0m \\033[1;9m Bold strikeout \\033[0m\\n"
+ "\\n",
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_rgbcolors(bool reset)} {
+ comment {--- 0020: Test RGB Colors} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 20
+ "\\033[2J\\033[H" "ESC TEST 0020: RGB Colors\\n",
+ "\\033[0m\\n", // NORMAL
+ "\\tNormal Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX",
+ "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX",
+ "\\033[38;2;255;0;0m\\n", // change to Red for next row
+ "\\tNormal RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX",
+ "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX",
+ "\\033[38;2;0;255;0m\\n", // change to Grn for next row
+ "\\tNormal GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX",
+ "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX",
+ "\\033[38;2;0;0;255m\\n", // change to Blu for next row
+ "\\tNormal BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX",
+ "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX",
+ "\\n",
+ "\\033[0;3m\\n", // ITALIC
+ "\\tItalic Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX",
+ "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX",
+ "\\033[38;2;255;0;0m\\n", // change to Red for next row
+ "\\tItalic RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX",
+ "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX",
+ "\\033[38;2;0;255;0m\\n", // change to Grn for next row
+ "\\tItalic GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX",
+ "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX",
+ "\\033[38;2;0;0;255m\\n", // change to Blu for next row
+ "\\tItalic BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX",
+ "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX",
+ "\\n",
+ "\\033[0;4m\\n", // UNDERLINE
+ "\\tUnderl Grayscale: \\033[38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX",
+ "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX",
+ "\\033[38;2;255;0;0m\\n", // change to Red for next row
+ "\\tUnderl RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX",
+ "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX",
+ "\\033[38;2;0;255;0m\\n", // change to Grn for next row
+ "\\tUnderl GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX",
+ "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX",
+ "\\033[38;2;0;0;255m\\n", // change to Blu for next row
+ "\\tUnderl BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX",
+ "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX",
+ "\\n",
+ "\\033[0;7m\\n", // INVERSE
+ "\\tInvers Grayscale: \\033[7;38;2;32;32;32mXXX" "\\033[38;2;64;64;64mXXX" "\\033[38;2;96;96;96mXXX" "\\033[38;2;128;128;128mXXX",
+ "\\033[38;2;160;160;160mXXX" "\\033[38;2;192;192;192mXXX" "\\033[38;2;224;224;224mXXX" "\\033[38;2;255;255;255mXXX",
+ "\\033[38;2;255;0;0m\\n", // change to Red for next row
+ "\\tInvers RedScale: \\033[38;2;32;0;0mXXX" "\\033[38;2;64;0;0mXXX" "\\033[38;2;96;0;0mXXX" "\\033[38;2;128;0;0mXXX",
+ "\\033[38;2;160;0;0mXXX" "\\033[38;2;192;0;0mXXX" "\\033[38;2;224;0;0mXXX" "\\033[38;2;255;0;0mXXX",
+ "\\033[38;2;0;255;0m\\n", // change to Grn for next row
+ "\\tInvers GrnScale: \\033[38;2;0;32;0mXXX" "\\033[38;2;0;64;0mXXX" "\\033[38;2;0;96;0mXXX" "\\033[38;2;0;128;0mXXX",
+ "\\033[38;2;0;160;0mXXX" "\\033[38;2;0;192;0mXXX" "\\033[38;2;0;224;0mXXX" "\\033[38;2;0;255;0mXXX",
+ "\\033[38;2;0;0;255m\\n", // change to Blu for next row
+ "\\tInvers BluScale: \\033[38;2;0;0;32mXXX" "\\033[38;2;0;0;64mXXX" "\\033[38;2;0;0;96mXXX" "\\033[38;2;0;0;128mXXX",
+ "\\033[38;2;0;0;160mXXX" "\\033[38;2;0;0;192mXXX" "\\033[38;2;0;0;224mXXX" "\\033[38;2;0;0;255mXXX",
+ "\\033[0m\\n\\n",
+ "---> Hit 'e' for next test: ",
+ // Screen 21
+ "\\033[2J\\033[H" "ESC TEST 0021: RGB Color Ramps\\n",
+ "\\n",
+ "Red: ",
+ "\\033[48;2;0;0;0m.\\033[48;2;1;0;0m.\\033[48;2;2;0;0m.\\033[48;2;3;0;0m.\\033[48;2;4;0;0m.\\033[48;2;5;0;0m.\\033[48;2;6;0;0m.\\033[48;2;7;0;0m.",
+ "\\033[48;2;8;0;0m.\\033[48;2;9;0;0m.\\033[48;2;10;0;0m.\\033[48;2;11;0;0m.\\033[48;2;12;0;0m.\\033[48;2;13;0;0m.\\033[48;2;14;0;0m.\\033[48;2;15;0;0m.",
+ "\\033[48;2;16;0;0m.\\033[48;2;17;0;0m.\\033[48;2;18;0;0m.\\033[48;2;19;0;0m.\\033[48;2;20;0;0m.\\033[48;2;21;0;0m.\\033[48;2;22;0;0m.\\033[48;2;23;0;0m.",
+ "\\033[48;2;24;0;0m.\\033[48;2;25;0;0m.\\033[48;2;26;0;0m.\\033[48;2;27;0;0m.\\033[48;2;28;0;0m.\\033[48;2;29;0;0m.\\033[48;2;30;0;0m.\\033[48;2;31;0;0m.",
+ "\\033[48;2;32;0;0m.\\033[48;2;33;0;0m.\\033[48;2;34;0;0m.\\033[48;2;35;0;0m.\\033[48;2;36;0;0m.\\033[48;2;37;0;0m.\\033[48;2;38;0;0m.\\033[48;2;39;0;0m.",
+ "\\033[48;2;40;0;0m.\\033[48;2;41;0;0m.\\033[48;2;42;0;0m.\\033[48;2;43;0;0m.\\033[48;2;44;0;0m.\\033[48;2;45;0;0m.\\033[48;2;46;0;0m.\\033[48;2;47;0;0m.",
+ "\\033[48;2;48;0;0m.\\033[48;2;49;0;0m.\\033[48;2;50;0;0m.\\033[48;2;51;0;0m.\\033[48;2;52;0;0m.\\033[48;2;53;0;0m.\\033[48;2;54;0;0m.\\033[48;2;55;0;0m.",
+ "\\033[48;2;56;0;0m.\\033[48;2;57;0;0m.\\033[48;2;58;0;0m.\\033[48;2;59;0;0m.\\033[48;2;60;0;0m.\\033[48;2;61;0;0m.\\033[48;2;62;0;0m.\\033[48;2;63;0;0m.",
+ "\\033[48;2;64;0;0m.\\033[48;2;65;0;0m.\\033[48;2;66;0;0m.\\033[48;2;67;0;0m.\\033[48;2;68;0;0m.\\033[48;2;69;0;0m.\\033[48;2;70;0;0m.\\033[48;2;71;0;0m.",
+ "\\033[48;2;72;0;0m.\\033[48;2;73;0;0m.\\033[48;2;74;0;0m.\\033[48;2;75;0;0m.\\033[48;2;76;0;0m.\\033[48;2;77;0;0m.\\033[48;2;78;0;0m.\\033[48;2;79;0;0m.",
+ "\\033[48;2;80;0;0m.\\033[48;2;81;0;0m.\\033[48;2;82;0;0m.\\033[48;2;83;0;0m.\\033[48;2;84;0;0m.\\033[48;2;85;0;0m.\\033[48;2;86;0;0m.\\033[48;2;87;0;0m.",
+ "\\033[48;2;88;0;0m.\\033[48;2;89;0;0m.\\033[48;2;90;0;0m.\\033[48;2;91;0;0m.\\033[48;2;92;0;0m.\\033[48;2;93;0;0m.\\033[48;2;94;0;0m.\\033[48;2;95;0;0m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;96;0;0m.\\033[48;2;97;0;0m.\\033[48;2;98;0;0m.\\033[48;2;99;0;0m.\\033[48;2;100;0;0m.\\033[48;2;101;0;0m.\\033[48;2;102;0;0m.\\033[48;2;103;0;0m.",
+ "\\033[48;2;104;0;0m.\\033[48;2;105;0;0m.\\033[48;2;106;0;0m.\\033[48;2;107;0;0m.\\033[48;2;108;0;0m.\\033[48;2;109;0;0m.\\033[48;2;110;0;0m.\\033[48;2;111;0;0m.",
+ "\\033[48;2;112;0;0m.\\033[48;2;113;0;0m.\\033[48;2;114;0;0m.\\033[48;2;115;0;0m.\\033[48;2;116;0;0m.\\033[48;2;117;0;0m.\\033[48;2;118;0;0m.\\033[48;2;119;0;0m.",
+ "\\033[48;2;120;0;0m.\\033[48;2;121;0;0m.\\033[48;2;122;0;0m.\\033[48;2;123;0;0m.\\033[48;2;124;0;0m.\\033[48;2;125;0;0m.\\033[48;2;126;0;0m.\\033[48;2;127;0;0m.",
+ "\\033[48;2;128;0;0m.\\033[48;2;129;0;0m.\\033[48;2;130;0;0m.\\033[48;2;131;0;0m.\\033[48;2;132;0;0m.\\033[48;2;133;0;0m.\\033[48;2;134;0;0m.\\033[48;2;135;0;0m.",
+ "\\033[48;2;136;0;0m.\\033[48;2;137;0;0m.\\033[48;2;138;0;0m.\\033[48;2;139;0;0m.\\033[48;2;140;0;0m.\\033[48;2;141;0;0m.\\033[48;2;142;0;0m.\\033[48;2;143;0;0m.",
+ "\\033[48;2;144;0;0m.\\033[48;2;145;0;0m.\\033[48;2;146;0;0m.\\033[48;2;147;0;0m.\\033[48;2;148;0;0m.\\033[48;2;149;0;0m.\\033[48;2;150;0;0m.\\033[48;2;151;0;0m.",
+ "\\033[48;2;152;0;0m.\\033[48;2;153;0;0m.\\033[48;2;154;0;0m.\\033[48;2;155;0;0m.\\033[48;2;156;0;0m.\\033[48;2;157;0;0m.\\033[48;2;158;0;0m.\\033[48;2;159;0;0m.",
+ "\\033[48;2;160;0;0m.\\033[48;2;161;0;0m.\\033[48;2;162;0;0m.\\033[48;2;163;0;0m.\\033[48;2;164;0;0m.\\033[48;2;165;0;0m.\\033[48;2;166;0;0m.\\033[48;2;167;0;0m.",
+ "\\033[48;2;168;0;0m.\\033[48;2;169;0;0m.\\033[48;2;170;0;0m.\\033[48;2;171;0;0m.\\033[48;2;172;0;0m.\\033[48;2;173;0;0m.\\033[48;2;174;0;0m.\\033[48;2;175;0;0m.",
+ "\\033[48;2;176;0;0m.\\033[48;2;177;0;0m.\\033[48;2;178;0;0m.\\033[48;2;179;0;0m.\\033[48;2;180;0;0m.\\033[48;2;181;0;0m.\\033[48;2;182;0;0m.\\033[48;2;183;0;0m.",
+ "\\033[48;2;184;0;0m.\\033[48;2;185;0;0m.\\033[48;2;186;0;0m.\\033[48;2;187;0;0m.\\033[48;2;188;0;0m.\\033[48;2;189;0;0m.\\033[48;2;190;0;0m.\\033[48;2;191;0;0m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;192;0;0m.\\033[48;2;193;0;0m.\\033[48;2;194;0;0m.\\033[48;2;195;0;0m.\\033[48;2;196;0;0m.\\033[48;2;197;0;0m.\\033[48;2;198;0;0m.\\033[48;2;199;0;0m.",
+ "\\033[48;2;200;0;0m.\\033[48;2;201;0;0m.\\033[48;2;202;0;0m.\\033[48;2;203;0;0m.\\033[48;2;204;0;0m.\\033[48;2;205;0;0m.\\033[48;2;206;0;0m.\\033[48;2;207;0;0m.",
+ "\\033[48;2;208;0;0m.\\033[48;2;209;0;0m.\\033[48;2;210;0;0m.\\033[48;2;211;0;0m.\\033[48;2;212;0;0m.\\033[48;2;213;0;0m.\\033[48;2;214;0;0m.\\033[48;2;215;0;0m.",
+ "\\033[48;2;216;0;0m.\\033[48;2;217;0;0m.\\033[48;2;218;0;0m.\\033[48;2;219;0;0m.\\033[48;2;220;0;0m.\\033[48;2;221;0;0m.\\033[48;2;222;0;0m.\\033[48;2;223;0;0m.",
+ "\\033[48;2;224;0;0m.\\033[48;2;225;0;0m.\\033[48;2;226;0;0m.\\033[48;2;227;0;0m.\\033[48;2;228;0;0m.\\033[48;2;229;0;0m.\\033[48;2;230;0;0m.\\033[48;2;231;0;0m.",
+ "\\033[48;2;232;0;0m.\\033[48;2;233;0;0m.\\033[48;2;234;0;0m.\\033[48;2;235;0;0m.\\033[48;2;236;0;0m.\\033[48;2;237;0;0m.\\033[48;2;238;0;0m.\\033[48;2;239;0;0m.",
+ "\\033[48;2;240;0;0m.\\033[48;2;241;0;0m.\\033[48;2;242;0;0m.\\033[48;2;243;0;0m.\\033[48;2;244;0;0m.\\033[48;2;245;0;0m.\\033[48;2;246;0;0m.\\033[48;2;247;0;0m.",
+ "\\033[48;2;248;0;0m.\\033[48;2;249;0;0m.\\033[48;2;250;0;0m.\\033[48;2;251;0;0m.\\033[48;2;252;0;0m.\\033[48;2;253;0;0m.\\033[48;2;254;0;0m.\\033[48;2;255;0;0m.",
+ "\\033[0m\\n",
+ "\\n",
+ "Grn: ",
+ "\\033[48;2;0;0;0m.\\033[48;2;0;1;0m.\\033[48;2;0;2;0m.\\033[48;2;0;3;0m.\\033[48;2;0;4;0m.\\033[48;2;0;5;0m.\\033[48;2;0;6;0m.\\033[48;2;0;7;0m.",
+ "\\033[48;2;0;8;0m.\\033[48;2;0;9;0m.\\033[48;2;0;10;0m.\\033[48;2;0;11;0m.\\033[48;2;0;12;0m.\\033[48;2;0;13;0m.\\033[48;2;0;14;0m.\\033[48;2;0;15;0m.",
+ "\\033[48;2;0;16;0m.\\033[48;2;0;17;0m.\\033[48;2;0;18;0m.\\033[48;2;0;19;0m.\\033[48;2;0;20;0m.\\033[48;2;0;21;0m.\\033[48;2;0;22;0m.\\033[48;2;0;23;0m.",
+ "\\033[48;2;0;24;0m.\\033[48;2;0;25;0m.\\033[48;2;0;26;0m.\\033[48;2;0;27;0m.\\033[48;2;0;28;0m.\\033[48;2;0;29;0m.\\033[48;2;0;30;0m.\\033[48;2;0;31;0m.",
+ "\\033[48;2;0;32;0m.\\033[48;2;0;33;0m.\\033[48;2;0;34;0m.\\033[48;2;0;35;0m.\\033[48;2;0;36;0m.\\033[48;2;0;37;0m.\\033[48;2;0;38;0m.\\033[48;2;0;39;0m.",
+ "\\033[48;2;0;40;0m.\\033[48;2;0;41;0m.\\033[48;2;0;42;0m.\\033[48;2;0;43;0m.\\033[48;2;0;44;0m.\\033[48;2;0;45;0m.\\033[48;2;0;46;0m.\\033[48;2;0;47;0m.",
+ "\\033[48;2;0;48;0m.\\033[48;2;0;49;0m.\\033[48;2;0;50;0m.\\033[48;2;0;51;0m.\\033[48;2;0;52;0m.\\033[48;2;0;53;0m.\\033[48;2;0;54;0m.\\033[48;2;0;55;0m.",
+ "\\033[48;2;0;56;0m.\\033[48;2;0;57;0m.\\033[48;2;0;58;0m.\\033[48;2;0;59;0m.\\033[48;2;0;60;0m.\\033[48;2;0;61;0m.\\033[48;2;0;62;0m.\\033[48;2;0;63;0m.",
+ "\\033[48;2;0;64;0m.\\033[48;2;0;65;0m.\\033[48;2;0;66;0m.\\033[48;2;0;67;0m.\\033[48;2;0;68;0m.\\033[48;2;0;69;0m.\\033[48;2;0;70;0m.\\033[48;2;0;71;0m.",
+ "\\033[48;2;0;72;0m.\\033[48;2;0;73;0m.\\033[48;2;0;74;0m.\\033[48;2;0;75;0m.\\033[48;2;0;76;0m.\\033[48;2;0;77;0m.\\033[48;2;0;78;0m.\\033[48;2;0;79;0m.",
+ "\\033[48;2;0;80;0m.\\033[48;2;0;81;0m.\\033[48;2;0;82;0m.\\033[48;2;0;83;0m.\\033[48;2;0;84;0m.\\033[48;2;0;85;0m.\\033[48;2;0;86;0m.\\033[48;2;0;87;0m.",
+ "\\033[48;2;0;88;0m.\\033[48;2;0;89;0m.\\033[48;2;0;90;0m.\\033[48;2;0;91;0m.\\033[48;2;0;92;0m.\\033[48;2;0;93;0m.\\033[48;2;0;94;0m.\\033[48;2;0;95;0m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;0;96;0m.\\033[48;2;0;97;0m.\\033[48;2;0;98;0m.\\033[48;2;0;99;0m.\\033[48;2;0;100;0m.\\033[48;2;0;101;0m.\\033[48;2;0;102;0m.\\033[48;2;0;103;0m.",
+ "\\033[48;2;0;104;0m.\\033[48;2;0;105;0m.\\033[48;2;0;106;0m.\\033[48;2;0;107;0m.\\033[48;2;0;108;0m.\\033[48;2;0;109;0m.\\033[48;2;0;110;0m.\\033[48;2;0;111;0m.",
+ "\\033[48;2;0;112;0m.\\033[48;2;0;113;0m.\\033[48;2;0;114;0m.\\033[48;2;0;115;0m.\\033[48;2;0;116;0m.\\033[48;2;0;117;0m.\\033[48;2;0;118;0m.\\033[48;2;0;119;0m.",
+ "\\033[48;2;0;120;0m.\\033[48;2;0;121;0m.\\033[48;2;0;122;0m.\\033[48;2;0;123;0m.\\033[48;2;0;124;0m.\\033[48;2;0;125;0m.\\033[48;2;0;126;0m.\\033[48;2;0;127;0m.",
+ "\\033[48;2;0;128;0m.\\033[48;2;0;129;0m.\\033[48;2;0;130;0m.\\033[48;2;0;131;0m.\\033[48;2;0;132;0m.\\033[48;2;0;133;0m.\\033[48;2;0;134;0m.\\033[48;2;0;135;0m.",
+ "\\033[48;2;0;136;0m.\\033[48;2;0;137;0m.\\033[48;2;0;138;0m.\\033[48;2;0;139;0m.\\033[48;2;0;140;0m.\\033[48;2;0;141;0m.\\033[48;2;0;142;0m.\\033[48;2;0;143;0m.",
+ "\\033[48;2;0;144;0m.\\033[48;2;0;145;0m.\\033[48;2;0;146;0m.\\033[48;2;0;147;0m.\\033[48;2;0;148;0m.\\033[48;2;0;149;0m.\\033[48;2;0;150;0m.\\033[48;2;0;151;0m.",
+ "\\033[48;2;0;152;0m.\\033[48;2;0;153;0m.\\033[48;2;0;154;0m.\\033[48;2;0;155;0m.\\033[48;2;0;156;0m.\\033[48;2;0;157;0m.\\033[48;2;0;158;0m.\\033[48;2;0;159;0m.",
+ "\\033[48;2;0;160;0m.\\033[48;2;0;161;0m.\\033[48;2;0;162;0m.\\033[48;2;0;163;0m.\\033[48;2;0;164;0m.\\033[48;2;0;165;0m.\\033[48;2;0;166;0m.\\033[48;2;0;167;0m.",
+ "\\033[48;2;0;168;0m.\\033[48;2;0;169;0m.\\033[48;2;0;170;0m.\\033[48;2;0;171;0m.\\033[48;2;0;172;0m.\\033[48;2;0;173;0m.\\033[48;2;0;174;0m.\\033[48;2;0;175;0m.",
+ "\\033[48;2;0;176;0m.\\033[48;2;0;177;0m.\\033[48;2;0;178;0m.\\033[48;2;0;179;0m.\\033[48;2;0;180;0m.\\033[48;2;0;181;0m.\\033[48;2;0;182;0m.\\033[48;2;0;183;0m.",
+ "\\033[48;2;0;184;0m.\\033[48;2;0;185;0m.\\033[48;2;0;186;0m.\\033[48;2;0;187;0m.\\033[48;2;0;188;0m.\\033[48;2;0;189;0m.\\033[48;2;0;190;0m.\\033[48;2;0;191;0m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;0;192;0m.\\033[48;2;0;193;0m.\\033[48;2;0;194;0m.\\033[48;2;0;195;0m.\\033[48;2;0;196;0m.\\033[48;2;0;197;0m.\\033[48;2;0;198;0m.\\033[48;2;0;199;0m.",
+ "\\033[48;2;0;200;0m.\\033[48;2;0;201;0m.\\033[48;2;0;202;0m.\\033[48;2;0;203;0m.\\033[48;2;0;204;0m.\\033[48;2;0;205;0m.\\033[48;2;0;206;0m.\\033[48;2;0;207;0m.",
+ "\\033[48;2;0;208;0m.\\033[48;2;0;209;0m.\\033[48;2;0;210;0m.\\033[48;2;0;211;0m.\\033[48;2;0;212;0m.\\033[48;2;0;213;0m.\\033[48;2;0;214;0m.\\033[48;2;0;215;0m.",
+ "\\033[48;2;0;216;0m.\\033[48;2;0;217;0m.\\033[48;2;0;218;0m.\\033[48;2;0;219;0m.\\033[48;2;0;220;0m.\\033[48;2;0;221;0m.\\033[48;2;0;222;0m.\\033[48;2;0;223;0m.",
+ "\\033[48;2;0;224;0m.\\033[48;2;0;225;0m.\\033[48;2;0;226;0m.\\033[48;2;0;227;0m.\\033[48;2;0;228;0m.\\033[48;2;0;229;0m.\\033[48;2;0;230;0m.\\033[48;2;0;231;0m.",
+ "\\033[48;2;0;232;0m.\\033[48;2;0;233;0m.\\033[48;2;0;234;0m.\\033[48;2;0;235;0m.\\033[48;2;0;236;0m.\\033[48;2;0;237;0m.\\033[48;2;0;238;0m.\\033[48;2;0;239;0m.",
+ "\\033[48;2;0;240;0m.\\033[48;2;0;241;0m.\\033[48;2;0;242;0m.\\033[48;2;0;243;0m.\\033[48;2;0;244;0m.\\033[48;2;0;245;0m.\\033[48;2;0;246;0m.\\033[48;2;0;247;0m.",
+ "\\033[48;2;0;248;0m.\\033[48;2;0;249;0m.\\033[48;2;0;250;0m.\\033[48;2;0;251;0m.\\033[48;2;0;252;0m.\\033[48;2;0;253;0m.\\033[48;2;0;254;0m.\\033[48;2;0;255;0m.",
+ "\\033[0m\\n",
+ "\\n",
+ "Blu: ",
+ "\\033[48;2;0;0;0m.\\033[48;2;0;0;1m.\\033[48;2;0;0;2m.\\033[48;2;0;0;3m.\\033[48;2;0;0;4m.\\033[48;2;0;0;5m.\\033[48;2;0;0;6m.\\033[48;2;0;0;7m.",
+ "\\033[48;2;0;0;8m.\\033[48;2;0;0;9m.\\033[48;2;0;0;10m.\\033[48;2;0;0;11m.\\033[48;2;0;0;12m.\\033[48;2;0;0;13m.\\033[48;2;0;0;14m.\\033[48;2;0;0;15m.",
+ "\\033[48;2;0;0;16m.\\033[48;2;0;0;17m.\\033[48;2;0;0;18m.\\033[48;2;0;0;19m.\\033[48;2;0;0;20m.\\033[48;2;0;0;21m.\\033[48;2;0;0;22m.\\033[48;2;0;0;23m.",
+ "\\033[48;2;0;0;24m.\\033[48;2;0;0;25m.\\033[48;2;0;0;26m.\\033[48;2;0;0;27m.\\033[48;2;0;0;28m.\\033[48;2;0;0;29m.\\033[48;2;0;0;30m.\\033[48;2;0;0;31m.",
+ "\\033[48;2;0;0;32m.\\033[48;2;0;0;33m.\\033[48;2;0;0;34m.\\033[48;2;0;0;35m.\\033[48;2;0;0;36m.\\033[48;2;0;0;37m.\\033[48;2;0;0;38m.\\033[48;2;0;0;39m.",
+ "\\033[48;2;0;0;40m.\\033[48;2;0;0;41m.\\033[48;2;0;0;42m.\\033[48;2;0;0;43m.\\033[48;2;0;0;44m.\\033[48;2;0;0;45m.\\033[48;2;0;0;46m.\\033[48;2;0;0;47m.",
+ "\\033[48;2;0;0;48m.\\033[48;2;0;0;49m.\\033[48;2;0;0;50m.\\033[48;2;0;0;51m.\\033[48;2;0;0;52m.\\033[48;2;0;0;53m.\\033[48;2;0;0;54m.\\033[48;2;0;0;55m.",
+ "\\033[48;2;0;0;56m.\\033[48;2;0;0;57m.\\033[48;2;0;0;58m.\\033[48;2;0;0;59m.\\033[48;2;0;0;60m.\\033[48;2;0;0;61m.\\033[48;2;0;0;62m.\\033[48;2;0;0;63m.",
+ "\\033[48;2;0;0;64m.\\033[48;2;0;0;65m.\\033[48;2;0;0;66m.\\033[48;2;0;0;67m.\\033[48;2;0;0;68m.\\033[48;2;0;0;69m.\\033[48;2;0;0;70m.\\033[48;2;0;0;71m.",
+ "\\033[48;2;0;0;72m.\\033[48;2;0;0;73m.\\033[48;2;0;0;74m.\\033[48;2;0;0;75m.\\033[48;2;0;0;76m.\\033[48;2;0;0;77m.\\033[48;2;0;0;78m.\\033[48;2;0;0;79m.",
+ "\\033[48;2;0;0;80m.\\033[48;2;0;0;81m.\\033[48;2;0;0;82m.\\033[48;2;0;0;83m.\\033[48;2;0;0;84m.\\033[48;2;0;0;85m.\\033[48;2;0;0;86m.\\033[48;2;0;0;87m.",
+ "\\033[48;2;0;0;88m.\\033[48;2;0;0;89m.\\033[48;2;0;0;90m.\\033[48;2;0;0;91m.\\033[48;2;0;0;92m.\\033[48;2;0;0;93m.\\033[48;2;0;0;94m.\\033[48;2;0;0;95m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;0;0;96m.\\033[48;2;0;0;97m.\\033[48;2;0;0;98m.\\033[48;2;0;0;99m.\\033[48;2;0;0;100m.\\033[48;2;0;0;101m.\\033[48;2;0;0;102m.\\033[48;2;0;0;103m.",
+ "\\033[48;2;0;0;104m.\\033[48;2;0;0;105m.\\033[48;2;0;0;106m.\\033[48;2;0;0;107m.\\033[48;2;0;0;108m.\\033[48;2;0;0;109m.\\033[48;2;0;0;110m.\\033[48;2;0;0;111m.",
+ "\\033[48;2;0;0;112m.\\033[48;2;0;0;113m.\\033[48;2;0;0;114m.\\033[48;2;0;0;115m.\\033[48;2;0;0;116m.\\033[48;2;0;0;117m.\\033[48;2;0;0;118m.\\033[48;2;0;0;119m.",
+ "\\033[48;2;0;0;120m.\\033[48;2;0;0;121m.\\033[48;2;0;0;122m.\\033[48;2;0;0;123m.\\033[48;2;0;0;124m.\\033[48;2;0;0;125m.\\033[48;2;0;0;126m.\\033[48;2;0;0;127m.",
+ "\\033[48;2;0;0;128m.\\033[48;2;0;0;129m.\\033[48;2;0;0;130m.\\033[48;2;0;0;131m.\\033[48;2;0;0;132m.\\033[48;2;0;0;133m.\\033[48;2;0;0;134m.\\033[48;2;0;0;135m.",
+ "\\033[48;2;0;0;136m.\\033[48;2;0;0;137m.\\033[48;2;0;0;138m.\\033[48;2;0;0;139m.\\033[48;2;0;0;140m.\\033[48;2;0;0;141m.\\033[48;2;0;0;142m.\\033[48;2;0;0;143m.",
+ "\\033[48;2;0;0;144m.\\033[48;2;0;0;145m.\\033[48;2;0;0;146m.\\033[48;2;0;0;147m.\\033[48;2;0;0;148m.\\033[48;2;0;0;149m.\\033[48;2;0;0;150m.\\033[48;2;0;0;151m.",
+ "\\033[48;2;0;0;152m.\\033[48;2;0;0;153m.\\033[48;2;0;0;154m.\\033[48;2;0;0;155m.\\033[48;2;0;0;156m.\\033[48;2;0;0;157m.\\033[48;2;0;0;158m.\\033[48;2;0;0;159m.",
+ "\\033[48;2;0;0;160m.\\033[48;2;0;0;161m.\\033[48;2;0;0;162m.\\033[48;2;0;0;163m.\\033[48;2;0;0;164m.\\033[48;2;0;0;165m.\\033[48;2;0;0;166m.\\033[48;2;0;0;167m.",
+ "\\033[48;2;0;0;168m.\\033[48;2;0;0;169m.\\033[48;2;0;0;170m.\\033[48;2;0;0;171m.\\033[48;2;0;0;172m.\\033[48;2;0;0;173m.\\033[48;2;0;0;174m.\\033[48;2;0;0;175m.",
+ "\\033[48;2;0;0;176m.\\033[48;2;0;0;177m.\\033[48;2;0;0;178m.\\033[48;2;0;0;179m.\\033[48;2;0;0;180m.\\033[48;2;0;0;181m.\\033[48;2;0;0;182m.\\033[48;2;0;0;183m.",
+ "\\033[48;2;0;0;184m.\\033[48;2;0;0;185m.\\033[48;2;0;0;186m.\\033[48;2;0;0;187m.\\033[48;2;0;0;188m.\\033[48;2;0;0;189m.\\033[48;2;0;0;190m.\\033[48;2;0;0;191m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;0;0;192m.\\033[48;2;0;0;193m.\\033[48;2;0;0;194m.\\033[48;2;0;0;195m.\\033[48;2;0;0;196m.\\033[48;2;0;0;197m.\\033[48;2;0;0;198m.\\033[48;2;0;0;199m.",
+ "\\033[48;2;0;0;200m.\\033[48;2;0;0;201m.\\033[48;2;0;0;202m.\\033[48;2;0;0;203m.\\033[48;2;0;0;204m.\\033[48;2;0;0;205m.\\033[48;2;0;0;206m.\\033[48;2;0;0;207m.",
+ "\\033[48;2;0;0;208m.\\033[48;2;0;0;209m.\\033[48;2;0;0;210m.\\033[48;2;0;0;211m.\\033[48;2;0;0;212m.\\033[48;2;0;0;213m.\\033[48;2;0;0;214m.\\033[48;2;0;0;215m.",
+ "\\033[48;2;0;0;216m.\\033[48;2;0;0;217m.\\033[48;2;0;0;218m.\\033[48;2;0;0;219m.\\033[48;2;0;0;220m.\\033[48;2;0;0;221m.\\033[48;2;0;0;222m.\\033[48;2;0;0;223m.",
+ "\\033[48;2;0;0;224m.\\033[48;2;0;0;225m.\\033[48;2;0;0;226m.\\033[48;2;0;0;227m.\\033[48;2;0;0;228m.\\033[48;2;0;0;229m.\\033[48;2;0;0;230m.\\033[48;2;0;0;231m.",
+ "\\033[48;2;0;0;232m.\\033[48;2;0;0;233m.\\033[48;2;0;0;234m.\\033[48;2;0;0;235m.\\033[48;2;0;0;236m.\\033[48;2;0;0;237m.\\033[48;2;0;0;238m.\\033[48;2;0;0;239m.",
+ "\\033[48;2;0;0;240m.\\033[48;2;0;0;241m.\\033[48;2;0;0;242m.\\033[48;2;0;0;243m.\\033[48;2;0;0;244m.\\033[48;2;0;0;245m.\\033[48;2;0;0;246m.\\033[48;2;0;0;247m.",
+ "\\033[48;2;0;0;248m.\\033[48;2;0;0;249m.\\033[48;2;0;0;250m.\\033[48;2;0;0;251m.\\033[48;2;0;0;252m.\\033[48;2;0;0;253m.\\033[48;2;0;0;254m.\\033[48;2;0;0;255m.",
+ "\\033[0m\\n ",
+ "\\n",
+ /**
+ For generating an HSV hue ramp, see:
+ https://en.wikipedia.org/wiki/HSL_and_HSV\#/media/File:HSV-RGB-comparison.svg
+ Basically:
+
+ 255 : RRRRRRR RRRRRRRR
+ : R R
+ : R R
+ : R RED R
+ : R R
+ : R R
+ : R R
+ 0 : RRRRRRRRRRRRRRRR
+ :..|......|......|......|......|......|......|
+ 0 60 120 180 240 300 360
+
+
+
+ 255 : GGGGGGGGGGGGGG
+ : G G
+ : G G
+ : G G
+ : G GREEN G
+ : G G
+ : G G
+ 0 : G GGGGGGGGGGGGGGGG
+ :..|......|......|......|......|......|......|
+ 0 60 120 180 240 300 360
+
+
+ 255 : BBBBBBBBBBBBBBB
+ : B B
+ : B B
+ : B BLUE B
+ : B B
+ : B B
+ : B B
+ 0 : GBBBBBBBBBBBBBB B
+ :..|......|......|......|......|......|......|
+ 0 60 120 180 240 300 360
+ Here's some perl code that generates the Hue ramp:
+ $count = 0;
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255,$t,0); if ((++$count % 8) == 0) { printf("\\n"); } }
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255-$t,255,0); if ((++$count % 8) == 0) { printf("\\n"); } }
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",0,255,$t); if ((++$count % 8) == 0) { printf("\\n"); } }
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",0,255-$t,255); if ((++$count % 8) == 0) { printf("\\n"); } }
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",$t,0,255); if ((++$count % 8) == 0) { printf("\\n"); } }
+ for ($t=0; $t<256;$t+=2) { printf("\\\\033[48;2;%03d;%03d;%03dm ",255,0,255-$t); if ((++$count % 8) == 0) { printf("\\n"); } }
+**/
+ "Hue: ",
+ "\\033[48;2;255;000;000m.\\033[48;2;255;001;000m.\\033[48;2;255;002;000m.\\033[48;2;255;003;000m.\\033[48;2;255;004;000m.\\033[48;2;255;005;000m.\\033[48;2;255;006;000m.\\033[48;2;255;007;000m.",
+ "\\033[48;2;255;008;000m.\\033[48;2;255;009;000m.\\033[48;2;255;010;000m.\\033[48;2;255;011;000m.\\033[48;2;255;012;000m.\\033[48;2;255;013;000m.\\033[48;2;255;014;000m.\\033[48;2;255;015;000m.",
+ "\\033[48;2;255;016;000m.\\033[48;2;255;017;000m.\\033[48;2;255;018;000m.\\033[48;2;255;019;000m.\\033[48;2;255;020;000m.\\033[48;2;255;021;000m.\\033[48;2;255;022;000m.\\033[48;2;255;023;000m.",
+ "\\033[48;2;255;024;000m.\\033[48;2;255;025;000m.\\033[48;2;255;026;000m.\\033[48;2;255;027;000m.\\033[48;2;255;028;000m.\\033[48;2;255;029;000m.\\033[48;2;255;030;000m.\\033[48;2;255;031;000m.",
+ "\\033[48;2;255;032;000m.\\033[48;2;255;033;000m.\\033[48;2;255;034;000m.\\033[48;2;255;035;000m.\\033[48;2;255;036;000m.\\033[48;2;255;037;000m.\\033[48;2;255;038;000m.\\033[48;2;255;039;000m.",
+ "\\033[48;2;255;040;000m.\\033[48;2;255;041;000m.\\033[48;2;255;042;000m.\\033[48;2;255;043;000m.\\033[48;2;255;044;000m.\\033[48;2;255;045;000m.\\033[48;2;255;046;000m.\\033[48;2;255;047;000m.",
+ "\\033[48;2;255;048;000m.\\033[48;2;255;049;000m.\\033[48;2;255;050;000m.\\033[48;2;255;051;000m.\\033[48;2;255;052;000m.\\033[48;2;255;053;000m.\\033[48;2;255;054;000m.\\033[48;2;255;055;000m.",
+ "\\033[48;2;255;056;000m.\\033[48;2;255;057;000m.\\033[48;2;255;058;000m.\\033[48;2;255;059;000m.\\033[48;2;255;060;000m.\\033[48;2;255;061;000m.\\033[48;2;255;062;000m.\\033[48;2;255;063;000m.",
+ "\\033[48;2;255;064;000m.\\033[48;2;255;065;000m.\\033[48;2;255;066;000m.\\033[48;2;255;067;000m.\\033[48;2;255;068;000m.\\033[48;2;255;069;000m.\\033[48;2;255;070;000m.\\033[48;2;255;071;000m.",
+ "\\033[48;2;255;072;000m.\\033[48;2;255;073;000m.\\033[48;2;255;074;000m.\\033[48;2;255;075;000m.\\033[48;2;255;076;000m.\\033[48;2;255;077;000m.\\033[48;2;255;078;000m.\\033[48;2;255;079;000m.",
+ "\\033[48;2;255;080;000m.\\033[48;2;255;081;000m.\\033[48;2;255;082;000m.\\033[48;2;255;083;000m.\\033[48;2;255;084;000m.\\033[48;2;255;085;000m.\\033[48;2;255;086;000m.\\033[48;2;255;087;000m.",
+ "\\033[48;2;255;088;000m.\\033[48;2;255;089;000m.\\033[48;2;255;090;000m.\\033[48;2;255;091;000m.\\033[48;2;255;092;000m.\\033[48;2;255;093;000m.\\033[48;2;255;094;000m.\\033[48;2;255;095;000m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;255;096;000m.\\033[48;2;255;097;000m.\\033[48;2;255;098;000m.\\033[48;2;255;099;000m.\\033[48;2;255;100;000m.\\033[48;2;255;101;000m.\\033[48;2;255;102;000m.\\033[48;2;255;103;000m.",
+ "\\033[48;2;255;104;000m.\\033[48;2;255;105;000m.\\033[48;2;255;106;000m.\\033[48;2;255;107;000m.\\033[48;2;255;108;000m.\\033[48;2;255;109;000m.\\033[48;2;255;110;000m.\\033[48;2;255;111;000m.",
+ "\\033[48;2;255;112;000m.\\033[48;2;255;113;000m.\\033[48;2;255;114;000m.\\033[48;2;255;115;000m.\\033[48;2;255;116;000m.\\033[48;2;255;117;000m.\\033[48;2;255;118;000m.\\033[48;2;255;119;000m.",
+ "\\033[48;2;255;120;000m.\\033[48;2;255;121;000m.\\033[48;2;255;122;000m.\\033[48;2;255;123;000m.\\033[48;2;255;124;000m.\\033[48;2;255;125;000m.\\033[48;2;255;126;000m.\\033[48;2;255;127;000m.",
+ "\\033[48;2;255;128;000m.\\033[48;2;255;129;000m.\\033[48;2;255;130;000m.\\033[48;2;255;131;000m.\\033[48;2;255;132;000m.\\033[48;2;255;133;000m.\\033[48;2;255;134;000m.\\033[48;2;255;135;000m.",
+ "\\033[48;2;255;136;000m.\\033[48;2;255;137;000m.\\033[48;2;255;138;000m.\\033[48;2;255;139;000m.\\033[48;2;255;140;000m.\\033[48;2;255;141;000m.\\033[48;2;255;142;000m.\\033[48;2;255;143;000m.",
+ "\\033[48;2;255;144;000m.\\033[48;2;255;145;000m.\\033[48;2;255;146;000m.\\033[48;2;255;147;000m.\\033[48;2;255;148;000m.\\033[48;2;255;149;000m.\\033[48;2;255;150;000m.\\033[48;2;255;151;000m.",
+ "\\033[48;2;255;152;000m.\\033[48;2;255;153;000m.\\033[48;2;255;154;000m.\\033[48;2;255;155;000m.\\033[48;2;255;156;000m.\\033[48;2;255;157;000m.\\033[48;2;255;158;000m.\\033[48;2;255;159;000m.",
+ "\\033[48;2;255;160;000m.\\033[48;2;255;161;000m.\\033[48;2;255;162;000m.\\033[48;2;255;163;000m.\\033[48;2;255;164;000m.\\033[48;2;255;165;000m.\\033[48;2;255;166;000m.\\033[48;2;255;167;000m.",
+ "\\033[48;2;255;168;000m.\\033[48;2;255;169;000m.\\033[48;2;255;170;000m.\\033[48;2;255;171;000m.\\033[48;2;255;172;000m.\\033[48;2;255;173;000m.\\033[48;2;255;174;000m.\\033[48;2;255;175;000m.",
+ "\\033[48;2;255;176;000m.\\033[48;2;255;177;000m.\\033[48;2;255;178;000m.\\033[48;2;255;179;000m.\\033[48;2;255;180;000m.\\033[48;2;255;181;000m.\\033[48;2;255;182;000m.\\033[48;2;255;183;000m.",
+ "\\033[48;2;255;184;000m.\\033[48;2;255;185;000m.\\033[48;2;255;186;000m.\\033[48;2;255;187;000m.\\033[48;2;255;188;000m.\\033[48;2;255;189;000m.\\033[48;2;255;190;000m.\\033[48;2;255;191;000m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;255;192;000m.\\033[48;2;255;193;000m.\\033[48;2;255;194;000m.\\033[48;2;255;195;000m.\\033[48;2;255;196;000m.\\033[48;2;255;197;000m.\\033[48;2;255;198;000m.\\033[48;2;255;199;000m.",
+ "\\033[48;2;255;200;000m.\\033[48;2;255;201;000m.\\033[48;2;255;202;000m.\\033[48;2;255;203;000m.\\033[48;2;255;204;000m.\\033[48;2;255;205;000m.\\033[48;2;255;206;000m.\\033[48;2;255;207;000m.",
+ "\\033[48;2;255;208;000m.\\033[48;2;255;209;000m.\\033[48;2;255;210;000m.\\033[48;2;255;211;000m.\\033[48;2;255;212;000m.\\033[48;2;255;213;000m.\\033[48;2;255;214;000m.\\033[48;2;255;215;000m.",
+ "\\033[48;2;255;216;000m.\\033[48;2;255;217;000m.\\033[48;2;255;218;000m.\\033[48;2;255;219;000m.\\033[48;2;255;220;000m.\\033[48;2;255;221;000m.\\033[48;2;255;222;000m.\\033[48;2;255;223;000m.",
+ "\\033[48;2;255;224;000m.\\033[48;2;255;225;000m.\\033[48;2;255;226;000m.\\033[48;2;255;227;000m.\\033[48;2;255;228;000m.\\033[48;2;255;229;000m.\\033[48;2;255;230;000m.\\033[48;2;255;231;000m.",
+ "\\033[48;2;255;232;000m.\\033[48;2;255;233;000m.\\033[48;2;255;234;000m.\\033[48;2;255;235;000m.\\033[48;2;255;236;000m.\\033[48;2;255;237;000m.\\033[48;2;255;238;000m.\\033[48;2;255;239;000m.",
+ "\\033[48;2;255;240;000m.\\033[48;2;255;241;000m.\\033[48;2;255;242;000m.\\033[48;2;255;243;000m.\\033[48;2;255;244;000m.\\033[48;2;255;245;000m.\\033[48;2;255;246;000m.\\033[48;2;255;247;000m.",
+ "\\033[48;2;255;248;000m.\\033[48;2;255;249;000m.\\033[48;2;255;250;000m.\\033[48;2;255;251;000m.\\033[48;2;255;252;000m.\\033[48;2;255;253;000m.\\033[48;2;255;254;000m.\\033[48;2;255;255;000m.",
+ "\\033[48;2;255;255;000m.\\033[48;2;254;255;000m.\\033[48;2;253;255;000m.\\033[48;2;252;255;000m.\\033[48;2;251;255;000m.\\033[48;2;250;255;000m.\\033[48;2;249;255;000m.\\033[48;2;248;255;000m.",
+ "\\033[48;2;247;255;000m.\\033[48;2;246;255;000m.\\033[48;2;245;255;000m.\\033[48;2;244;255;000m.\\033[48;2;243;255;000m.\\033[48;2;242;255;000m.\\033[48;2;241;255;000m.\\033[48;2;240;255;000m.",
+ "\\033[48;2;239;255;000m.\\033[48;2;238;255;000m.\\033[48;2;237;255;000m.\\033[48;2;236;255;000m.\\033[48;2;235;255;000m.\\033[48;2;234;255;000m.\\033[48;2;233;255;000m.\\033[48;2;232;255;000m.",
+ "\\033[48;2;231;255;000m.\\033[48;2;230;255;000m.\\033[48;2;229;255;000m.\\033[48;2;228;255;000m.\\033[48;2;227;255;000m.\\033[48;2;226;255;000m.\\033[48;2;225;255;000m.\\033[48;2;224;255;000m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;223;255;000m.\\033[48;2;222;255;000m.\\033[48;2;221;255;000m.\\033[48;2;220;255;000m.\\033[48;2;219;255;000m.\\033[48;2;218;255;000m.\\033[48;2;217;255;000m.\\033[48;2;216;255;000m.",
+ "\\033[48;2;215;255;000m.\\033[48;2;214;255;000m.\\033[48;2;213;255;000m.\\033[48;2;212;255;000m.\\033[48;2;211;255;000m.\\033[48;2;210;255;000m.\\033[48;2;209;255;000m.\\033[48;2;208;255;000m.",
+ "\\033[48;2;207;255;000m.\\033[48;2;206;255;000m.\\033[48;2;205;255;000m.\\033[48;2;204;255;000m.\\033[48;2;203;255;000m.\\033[48;2;202;255;000m.\\033[48;2;201;255;000m.\\033[48;2;200;255;000m.",
+ "\\033[48;2;199;255;000m.\\033[48;2;198;255;000m.\\033[48;2;197;255;000m.\\033[48;2;196;255;000m.\\033[48;2;195;255;000m.\\033[48;2;194;255;000m.\\033[48;2;193;255;000m.\\033[48;2;192;255;000m.",
+ "\\033[48;2;191;255;000m.\\033[48;2;190;255;000m.\\033[48;2;189;255;000m.\\033[48;2;188;255;000m.\\033[48;2;187;255;000m.\\033[48;2;186;255;000m.\\033[48;2;185;255;000m.\\033[48;2;184;255;000m.",
+ "\\033[48;2;183;255;000m.\\033[48;2;182;255;000m.\\033[48;2;181;255;000m.\\033[48;2;180;255;000m.\\033[48;2;179;255;000m.\\033[48;2;178;255;000m.\\033[48;2;177;255;000m.\\033[48;2;176;255;000m.",
+ "\\033[48;2;175;255;000m.\\033[48;2;174;255;000m.\\033[48;2;173;255;000m.\\033[48;2;172;255;000m.\\033[48;2;171;255;000m.\\033[48;2;170;255;000m.\\033[48;2;169;255;000m.\\033[48;2;168;255;000m.",
+ "\\033[48;2;167;255;000m.\\033[48;2;166;255;000m.\\033[48;2;165;255;000m.\\033[48;2;164;255;000m.\\033[48;2;163;255;000m.\\033[48;2;162;255;000m.\\033[48;2;161;255;000m.\\033[48;2;160;255;000m.",
+ "\\033[48;2;159;255;000m.\\033[48;2;158;255;000m.\\033[48;2;157;255;000m.\\033[48;2;156;255;000m.\\033[48;2;155;255;000m.\\033[48;2;154;255;000m.\\033[48;2;153;255;000m.\\033[48;2;152;255;000m.",
+ "\\033[48;2;151;255;000m.\\033[48;2;150;255;000m.\\033[48;2;149;255;000m.\\033[48;2;148;255;000m.\\033[48;2;147;255;000m.\\033[48;2;146;255;000m.\\033[48;2;145;255;000m.\\033[48;2;144;255;000m.",
+ "\\033[48;2;143;255;000m.\\033[48;2;142;255;000m.\\033[48;2;141;255;000m.\\033[48;2;140;255;000m.\\033[48;2;139;255;000m.\\033[48;2;138;255;000m.\\033[48;2;137;255;000m.\\033[48;2;136;255;000m.",
+ "\\033[48;2;135;255;000m.\\033[48;2;134;255;000m.\\033[48;2;133;255;000m.\\033[48;2;132;255;000m.\\033[48;2;131;255;000m.\\033[48;2;130;255;000m.\\033[48;2;129;255;000m.\\033[48;2;128;255;000m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;127;255;000m.\\033[48;2;126;255;000m.\\033[48;2;125;255;000m.\\033[48;2;124;255;000m.\\033[48;2;123;255;000m.\\033[48;2;122;255;000m.\\033[48;2;121;255;000m.\\033[48;2;120;255;000m.",
+ "\\033[48;2;119;255;000m.\\033[48;2;118;255;000m.\\033[48;2;117;255;000m.\\033[48;2;116;255;000m.\\033[48;2;115;255;000m.\\033[48;2;114;255;000m.\\033[48;2;113;255;000m.\\033[48;2;112;255;000m.",
+ "\\033[48;2;111;255;000m.\\033[48;2;110;255;000m.\\033[48;2;109;255;000m.\\033[48;2;108;255;000m.\\033[48;2;107;255;000m.\\033[48;2;106;255;000m.\\033[48;2;105;255;000m.\\033[48;2;104;255;000m.",
+ "\\033[48;2;103;255;000m.\\033[48;2;102;255;000m.\\033[48;2;101;255;000m.\\033[48;2;100;255;000m.\\033[48;2;099;255;000m.\\033[48;2;098;255;000m.\\033[48;2;097;255;000m.\\033[48;2;096;255;000m.",
+ "\\033[48;2;095;255;000m.\\033[48;2;094;255;000m.\\033[48;2;093;255;000m.\\033[48;2;092;255;000m.\\033[48;2;091;255;000m.\\033[48;2;090;255;000m.\\033[48;2;089;255;000m.\\033[48;2;088;255;000m.",
+ "\\033[48;2;087;255;000m.\\033[48;2;086;255;000m.\\033[48;2;085;255;000m.\\033[48;2;084;255;000m.\\033[48;2;083;255;000m.\\033[48;2;082;255;000m.\\033[48;2;081;255;000m.\\033[48;2;080;255;000m.",
+ "\\033[48;2;079;255;000m.\\033[48;2;078;255;000m.\\033[48;2;077;255;000m.\\033[48;2;076;255;000m.\\033[48;2;075;255;000m.\\033[48;2;074;255;000m.\\033[48;2;073;255;000m.\\033[48;2;072;255;000m.",
+ "\\033[48;2;071;255;000m.\\033[48;2;070;255;000m.\\033[48;2;069;255;000m.\\033[48;2;068;255;000m.\\033[48;2;067;255;000m.\\033[48;2;066;255;000m.\\033[48;2;065;255;000m.\\033[48;2;064;255;000m.",
+ "\\033[48;2;063;255;000m.\\033[48;2;062;255;000m.\\033[48;2;061;255;000m.\\033[48;2;060;255;000m.\\033[48;2;059;255;000m.\\033[48;2;058;255;000m.\\033[48;2;057;255;000m.\\033[48;2;056;255;000m.",
+ "\\033[48;2;055;255;000m.\\033[48;2;054;255;000m.\\033[48;2;053;255;000m.\\033[48;2;052;255;000m.\\033[48;2;051;255;000m.\\033[48;2;050;255;000m.\\033[48;2;049;255;000m.\\033[48;2;048;255;000m.",
+ "\\033[48;2;047;255;000m.\\033[48;2;046;255;000m.\\033[48;2;045;255;000m.\\033[48;2;044;255;000m.\\033[48;2;043;255;000m.\\033[48;2;042;255;000m.\\033[48;2;041;255;000m.\\033[48;2;040;255;000m.",
+ "\\033[48;2;039;255;000m.\\033[48;2;038;255;000m.\\033[48;2;037;255;000m.\\033[48;2;036;255;000m.\\033[48;2;035;255;000m.\\033[48;2;034;255;000m.\\033[48;2;033;255;000m.\\033[48;2;032;255;000m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;031;255;000m.\\033[48;2;030;255;000m.\\033[48;2;029;255;000m.\\033[48;2;028;255;000m.\\033[48;2;027;255;000m.\\033[48;2;026;255;000m.\\033[48;2;025;255;000m.\\033[48;2;024;255;000m.",
+ "\\033[48;2;023;255;000m.\\033[48;2;022;255;000m.\\033[48;2;021;255;000m.\\033[48;2;020;255;000m.\\033[48;2;019;255;000m.\\033[48;2;018;255;000m.\\033[48;2;017;255;000m.\\033[48;2;016;255;000m.",
+ "\\033[48;2;015;255;000m.\\033[48;2;014;255;000m.\\033[48;2;013;255;000m.\\033[48;2;012;255;000m.\\033[48;2;011;255;000m.\\033[48;2;010;255;000m.\\033[48;2;009;255;000m.\\033[48;2;008;255;000m.",
+ "\\033[48;2;007;255;000m.\\033[48;2;006;255;000m.\\033[48;2;005;255;000m.\\033[48;2;004;255;000m.\\033[48;2;003;255;000m.\\033[48;2;002;255;000m.\\033[48;2;001;255;000m.\\033[48;2;000;255;000m.",
+ "\\033[48;2;000;255;000m.\\033[48;2;000;255;001m.\\033[48;2;000;255;002m.\\033[48;2;000;255;003m.\\033[48;2;000;255;004m.\\033[48;2;000;255;005m.\\033[48;2;000;255;006m.\\033[48;2;000;255;007m.",
+ "\\033[48;2;000;255;008m.\\033[48;2;000;255;009m.\\033[48;2;000;255;010m.\\033[48;2;000;255;011m.\\033[48;2;000;255;012m.\\033[48;2;000;255;013m.\\033[48;2;000;255;014m.\\033[48;2;000;255;015m.",
+ "\\033[48;2;000;255;016m.\\033[48;2;000;255;017m.\\033[48;2;000;255;018m.\\033[48;2;000;255;019m.\\033[48;2;000;255;020m.\\033[48;2;000;255;021m.\\033[48;2;000;255;022m.\\033[48;2;000;255;023m.",
+ "\\033[48;2;000;255;024m.\\033[48;2;000;255;025m.\\033[48;2;000;255;026m.\\033[48;2;000;255;027m.\\033[48;2;000;255;028m.\\033[48;2;000;255;029m.\\033[48;2;000;255;030m.\\033[48;2;000;255;031m.",
+ "\\033[48;2;000;255;032m.\\033[48;2;000;255;033m.\\033[48;2;000;255;034m.\\033[48;2;000;255;035m.\\033[48;2;000;255;036m.\\033[48;2;000;255;037m.\\033[48;2;000;255;038m.\\033[48;2;000;255;039m.",
+ "\\033[48;2;000;255;040m.\\033[48;2;000;255;041m.\\033[48;2;000;255;042m.\\033[48;2;000;255;043m.\\033[48;2;000;255;044m.\\033[48;2;000;255;045m.\\033[48;2;000;255;046m.\\033[48;2;000;255;047m.",
+ "\\033[48;2;000;255;048m.\\033[48;2;000;255;049m.\\033[48;2;000;255;050m.\\033[48;2;000;255;051m.\\033[48;2;000;255;052m.\\033[48;2;000;255;053m.\\033[48;2;000;255;054m.\\033[48;2;000;255;055m.",
+ "\\033[48;2;000;255;056m.\\033[48;2;000;255;057m.\\033[48;2;000;255;058m.\\033[48;2;000;255;059m.\\033[48;2;000;255;060m.\\033[48;2;000;255;061m.\\033[48;2;000;255;062m.\\033[48;2;000;255;063m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;000;255;064m.\\033[48;2;000;255;065m.\\033[48;2;000;255;066m.\\033[48;2;000;255;067m.\\033[48;2;000;255;068m.\\033[48;2;000;255;069m.\\033[48;2;000;255;070m.\\033[48;2;000;255;071m.",
+ "\\033[48;2;000;255;072m.\\033[48;2;000;255;073m.\\033[48;2;000;255;074m.\\033[48;2;000;255;075m.\\033[48;2;000;255;076m.\\033[48;2;000;255;077m.\\033[48;2;000;255;078m.\\033[48;2;000;255;079m.",
+ "\\033[48;2;000;255;080m.\\033[48;2;000;255;081m.\\033[48;2;000;255;082m.\\033[48;2;000;255;083m.\\033[48;2;000;255;084m.\\033[48;2;000;255;085m.\\033[48;2;000;255;086m.\\033[48;2;000;255;087m.",
+ "\\033[48;2;000;255;088m.\\033[48;2;000;255;089m.\\033[48;2;000;255;090m.\\033[48;2;000;255;091m.\\033[48;2;000;255;092m.\\033[48;2;000;255;093m.\\033[48;2;000;255;094m.\\033[48;2;000;255;095m.",
+ "\\033[48;2;000;255;096m.\\033[48;2;000;255;097m.\\033[48;2;000;255;098m.\\033[48;2;000;255;099m.\\033[48;2;000;255;100m.\\033[48;2;000;255;101m.\\033[48;2;000;255;102m.\\033[48;2;000;255;103m.",
+ "\\033[48;2;000;255;104m.\\033[48;2;000;255;105m.\\033[48;2;000;255;106m.\\033[48;2;000;255;107m.\\033[48;2;000;255;108m.\\033[48;2;000;255;109m.\\033[48;2;000;255;110m.\\033[48;2;000;255;111m.",
+ "\\033[48;2;000;255;112m.\\033[48;2;000;255;113m.\\033[48;2;000;255;114m.\\033[48;2;000;255;115m.\\033[48;2;000;255;116m.\\033[48;2;000;255;117m.\\033[48;2;000;255;118m.\\033[48;2;000;255;119m.",
+ "\\033[48;2;000;255;120m.\\033[48;2;000;255;121m.\\033[48;2;000;255;122m.\\033[48;2;000;255;123m.\\033[48;2;000;255;124m.\\033[48;2;000;255;125m.\\033[48;2;000;255;126m.\\033[48;2;000;255;127m.",
+ "\\033[48;2;000;255;128m.\\033[48;2;000;255;129m.\\033[48;2;000;255;130m.\\033[48;2;000;255;131m.\\033[48;2;000;255;132m.\\033[48;2;000;255;133m.\\033[48;2;000;255;134m.\\033[48;2;000;255;135m.",
+ "\\033[48;2;000;255;136m.\\033[48;2;000;255;137m.\\033[48;2;000;255;138m.\\033[48;2;000;255;139m.\\033[48;2;000;255;140m.\\033[48;2;000;255;141m.\\033[48;2;000;255;142m.\\033[48;2;000;255;143m.",
+ "\\033[48;2;000;255;144m.\\033[48;2;000;255;145m.\\033[48;2;000;255;146m.\\033[48;2;000;255;147m.\\033[48;2;000;255;148m.\\033[48;2;000;255;149m.\\033[48;2;000;255;150m.\\033[48;2;000;255;151m.",
+ "\\033[48;2;000;255;152m.\\033[48;2;000;255;153m.\\033[48;2;000;255;154m.\\033[48;2;000;255;155m.\\033[48;2;000;255;156m.\\033[48;2;000;255;157m.\\033[48;2;000;255;158m.\\033[48;2;000;255;159m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;000;255;160m.\\033[48;2;000;255;161m.\\033[48;2;000;255;162m.\\033[48;2;000;255;163m.\\033[48;2;000;255;164m.\\033[48;2;000;255;165m.\\033[48;2;000;255;166m.\\033[48;2;000;255;167m.",
+ "\\033[48;2;000;255;168m.\\033[48;2;000;255;169m.\\033[48;2;000;255;170m.\\033[48;2;000;255;171m.\\033[48;2;000;255;172m.\\033[48;2;000;255;173m.\\033[48;2;000;255;174m.\\033[48;2;000;255;175m.",
+ "\\033[48;2;000;255;176m.\\033[48;2;000;255;177m.\\033[48;2;000;255;178m.\\033[48;2;000;255;179m.\\033[48;2;000;255;180m.\\033[48;2;000;255;181m.\\033[48;2;000;255;182m.\\033[48;2;000;255;183m.",
+ "\\033[48;2;000;255;184m.\\033[48;2;000;255;185m.\\033[48;2;000;255;186m.\\033[48;2;000;255;187m.\\033[48;2;000;255;188m.\\033[48;2;000;255;189m.\\033[48;2;000;255;190m.\\033[48;2;000;255;191m.",
+ "\\033[48;2;000;255;192m.\\033[48;2;000;255;193m.\\033[48;2;000;255;194m.\\033[48;2;000;255;195m.\\033[48;2;000;255;196m.\\033[48;2;000;255;197m.\\033[48;2;000;255;198m.\\033[48;2;000;255;199m.",
+ "\\033[48;2;000;255;200m.\\033[48;2;000;255;201m.\\033[48;2;000;255;202m.\\033[48;2;000;255;203m.\\033[48;2;000;255;204m.\\033[48;2;000;255;205m.\\033[48;2;000;255;206m.\\033[48;2;000;255;207m.",
+ "\\033[48;2;000;255;208m.\\033[48;2;000;255;209m.\\033[48;2;000;255;210m.\\033[48;2;000;255;211m.\\033[48;2;000;255;212m.\\033[48;2;000;255;213m.\\033[48;2;000;255;214m.\\033[48;2;000;255;215m.",
+ "\\033[48;2;000;255;216m.\\033[48;2;000;255;217m.\\033[48;2;000;255;218m.\\033[48;2;000;255;219m.\\033[48;2;000;255;220m.\\033[48;2;000;255;221m.\\033[48;2;000;255;222m.\\033[48;2;000;255;223m.",
+ "\\033[48;2;000;255;224m.\\033[48;2;000;255;225m.\\033[48;2;000;255;226m.\\033[48;2;000;255;227m.\\033[48;2;000;255;228m.\\033[48;2;000;255;229m.\\033[48;2;000;255;230m.\\033[48;2;000;255;231m.",
+ "\\033[48;2;000;255;232m.\\033[48;2;000;255;233m.\\033[48;2;000;255;234m.\\033[48;2;000;255;235m.\\033[48;2;000;255;236m.\\033[48;2;000;255;237m.\\033[48;2;000;255;238m.\\033[48;2;000;255;239m.",
+ "\\033[48;2;000;255;240m.\\033[48;2;000;255;241m.\\033[48;2;000;255;242m.\\033[48;2;000;255;243m.\\033[48;2;000;255;244m.\\033[48;2;000;255;245m.\\033[48;2;000;255;246m.\\033[48;2;000;255;247m.",
+ "\\033[48;2;000;255;248m.\\033[48;2;000;255;249m.\\033[48;2;000;255;250m.\\033[48;2;000;255;251m.\\033[48;2;000;255;252m.\\033[48;2;000;255;253m.\\033[48;2;000;255;254m.\\033[48;2;000;255;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;000;255;255m.\\033[48;2;000;254;255m.\\033[48;2;000;253;255m.\\033[48;2;000;252;255m.\\033[48;2;000;251;255m.\\033[48;2;000;250;255m.\\033[48;2;000;249;255m.\\033[48;2;000;248;255m.",
+ "\\033[48;2;000;247;255m.\\033[48;2;000;246;255m.\\033[48;2;000;245;255m.\\033[48;2;000;244;255m.\\033[48;2;000;243;255m.\\033[48;2;000;242;255m.\\033[48;2;000;241;255m.\\033[48;2;000;240;255m.",
+ "\\033[48;2;000;239;255m.\\033[48;2;000;238;255m.\\033[48;2;000;237;255m.\\033[48;2;000;236;255m.\\033[48;2;000;235;255m.\\033[48;2;000;234;255m.\\033[48;2;000;233;255m.\\033[48;2;000;232;255m.",
+ "\\033[48;2;000;231;255m.\\033[48;2;000;230;255m.\\033[48;2;000;229;255m.\\033[48;2;000;228;255m.\\033[48;2;000;227;255m.\\033[48;2;000;226;255m.\\033[48;2;000;225;255m.\\033[48;2;000;224;255m.",
+ "\\033[48;2;000;223;255m.\\033[48;2;000;222;255m.\\033[48;2;000;221;255m.\\033[48;2;000;220;255m.\\033[48;2;000;219;255m.\\033[48;2;000;218;255m.\\033[48;2;000;217;255m.\\033[48;2;000;216;255m.",
+ "\\033[48;2;000;215;255m.\\033[48;2;000;214;255m.\\033[48;2;000;213;255m.\\033[48;2;000;212;255m.\\033[48;2;000;211;255m.\\033[48;2;000;210;255m.\\033[48;2;000;209;255m.\\033[48;2;000;208;255m.",
+ "\\033[48;2;000;207;255m.\\033[48;2;000;206;255m.\\033[48;2;000;205;255m.\\033[48;2;000;204;255m.\\033[48;2;000;203;255m.\\033[48;2;000;202;255m.\\033[48;2;000;201;255m.\\033[48;2;000;200;255m.",
+ "\\033[48;2;000;199;255m.\\033[48;2;000;198;255m.\\033[48;2;000;197;255m.\\033[48;2;000;196;255m.\\033[48;2;000;195;255m.\\033[48;2;000;194;255m.\\033[48;2;000;193;255m.\\033[48;2;000;192;255m.",
+ "\\033[48;2;000;191;255m.\\033[48;2;000;190;255m.\\033[48;2;000;189;255m.\\033[48;2;000;188;255m.\\033[48;2;000;187;255m.\\033[48;2;000;186;255m.\\033[48;2;000;185;255m.\\033[48;2;000;184;255m.",
+ "\\033[48;2;000;183;255m.\\033[48;2;000;182;255m.\\033[48;2;000;181;255m.\\033[48;2;000;180;255m.\\033[48;2;000;179;255m.\\033[48;2;000;178;255m.\\033[48;2;000;177;255m.\\033[48;2;000;176;255m.",
+ "\\033[48;2;000;175;255m.\\033[48;2;000;174;255m.\\033[48;2;000;173;255m.\\033[48;2;000;172;255m.\\033[48;2;000;171;255m.\\033[48;2;000;170;255m.\\033[48;2;000;169;255m.\\033[48;2;000;168;255m.",
+ "\\033[48;2;000;167;255m.\\033[48;2;000;166;255m.\\033[48;2;000;165;255m.\\033[48;2;000;164;255m.\\033[48;2;000;163;255m.\\033[48;2;000;162;255m.\\033[48;2;000;161;255m.\\033[48;2;000;160;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;000;159;255m.\\033[48;2;000;158;255m.\\033[48;2;000;157;255m.\\033[48;2;000;156;255m.\\033[48;2;000;155;255m.\\033[48;2;000;154;255m.\\033[48;2;000;153;255m.\\033[48;2;000;152;255m.",
+ "\\033[48;2;000;151;255m.\\033[48;2;000;150;255m.\\033[48;2;000;149;255m.\\033[48;2;000;148;255m.\\033[48;2;000;147;255m.\\033[48;2;000;146;255m.\\033[48;2;000;145;255m.\\033[48;2;000;144;255m.",
+ "\\033[48;2;000;143;255m.\\033[48;2;000;142;255m.\\033[48;2;000;141;255m.\\033[48;2;000;140;255m.\\033[48;2;000;139;255m.\\033[48;2;000;138;255m.\\033[48;2;000;137;255m.\\033[48;2;000;136;255m.",
+ "\\033[48;2;000;135;255m.\\033[48;2;000;134;255m.\\033[48;2;000;133;255m.\\033[48;2;000;132;255m.\\033[48;2;000;131;255m.\\033[48;2;000;130;255m.\\033[48;2;000;129;255m.\\033[48;2;000;128;255m.",
+ "\\033[48;2;000;127;255m.\\033[48;2;000;126;255m.\\033[48;2;000;125;255m.\\033[48;2;000;124;255m.\\033[48;2;000;123;255m.\\033[48;2;000;122;255m.\\033[48;2;000;121;255m.\\033[48;2;000;120;255m.",
+ "\\033[48;2;000;119;255m.\\033[48;2;000;118;255m.\\033[48;2;000;117;255m.\\033[48;2;000;116;255m.\\033[48;2;000;115;255m.\\033[48;2;000;114;255m.\\033[48;2;000;113;255m.\\033[48;2;000;112;255m.",
+ "\\033[48;2;000;111;255m.\\033[48;2;000;110;255m.\\033[48;2;000;109;255m.\\033[48;2;000;108;255m.\\033[48;2;000;107;255m.\\033[48;2;000;106;255m.\\033[48;2;000;105;255m.\\033[48;2;000;104;255m.",
+ "\\033[48;2;000;103;255m.\\033[48;2;000;102;255m.\\033[48;2;000;101;255m.\\033[48;2;000;100;255m.\\033[48;2;000;099;255m.\\033[48;2;000;098;255m.\\033[48;2;000;097;255m.\\033[48;2;000;096;255m.",
+ "\\033[48;2;000;095;255m.\\033[48;2;000;094;255m.\\033[48;2;000;093;255m.\\033[48;2;000;092;255m.\\033[48;2;000;091;255m.\\033[48;2;000;090;255m.\\033[48;2;000;089;255m.\\033[48;2;000;088;255m.",
+ "\\033[48;2;000;087;255m.\\033[48;2;000;086;255m.\\033[48;2;000;085;255m.\\033[48;2;000;084;255m.\\033[48;2;000;083;255m.\\033[48;2;000;082;255m.\\033[48;2;000;081;255m.\\033[48;2;000;080;255m.",
+ "\\033[48;2;000;079;255m.\\033[48;2;000;078;255m.\\033[48;2;000;077;255m.\\033[48;2;000;076;255m.\\033[48;2;000;075;255m.\\033[48;2;000;074;255m.\\033[48;2;000;073;255m.\\033[48;2;000;072;255m.",
+ "\\033[48;2;000;071;255m.\\033[48;2;000;070;255m.\\033[48;2;000;069;255m.\\033[48;2;000;068;255m.\\033[48;2;000;067;255m.\\033[48;2;000;066;255m.\\033[48;2;000;065;255m.\\033[48;2;000;064;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;000;063;255m.\\033[48;2;000;062;255m.\\033[48;2;000;061;255m.\\033[48;2;000;060;255m.\\033[48;2;000;059;255m.\\033[48;2;000;058;255m.\\033[48;2;000;057;255m.\\033[48;2;000;056;255m.",
+ "\\033[48;2;000;055;255m.\\033[48;2;000;054;255m.\\033[48;2;000;053;255m.\\033[48;2;000;052;255m.\\033[48;2;000;051;255m.\\033[48;2;000;050;255m.\\033[48;2;000;049;255m.\\033[48;2;000;048;255m.",
+ "\\033[48;2;000;047;255m.\\033[48;2;000;046;255m.\\033[48;2;000;045;255m.\\033[48;2;000;044;255m.\\033[48;2;000;043;255m.\\033[48;2;000;042;255m.\\033[48;2;000;041;255m.\\033[48;2;000;040;255m.",
+ "\\033[48;2;000;039;255m.\\033[48;2;000;038;255m.\\033[48;2;000;037;255m.\\033[48;2;000;036;255m.\\033[48;2;000;035;255m.\\033[48;2;000;034;255m.\\033[48;2;000;033;255m.\\033[48;2;000;032;255m.",
+ "\\033[48;2;000;031;255m.\\033[48;2;000;030;255m.\\033[48;2;000;029;255m.\\033[48;2;000;028;255m.\\033[48;2;000;027;255m.\\033[48;2;000;026;255m.\\033[48;2;000;025;255m.\\033[48;2;000;024;255m.",
+ "\\033[48;2;000;023;255m.\\033[48;2;000;022;255m.\\033[48;2;000;021;255m.\\033[48;2;000;020;255m.\\033[48;2;000;019;255m.\\033[48;2;000;018;255m.\\033[48;2;000;017;255m.\\033[48;2;000;016;255m.",
+ "\\033[48;2;000;015;255m.\\033[48;2;000;014;255m.\\033[48;2;000;013;255m.\\033[48;2;000;012;255m.\\033[48;2;000;011;255m.\\033[48;2;000;010;255m.\\033[48;2;000;009;255m.\\033[48;2;000;008;255m.",
+ "\\033[48;2;000;007;255m.\\033[48;2;000;006;255m.\\033[48;2;000;005;255m.\\033[48;2;000;004;255m.\\033[48;2;000;003;255m.\\033[48;2;000;002;255m.\\033[48;2;000;001;255m.\\033[48;2;000;000;255m.",
+ "\\033[48;2;000;000;255m.\\033[48;2;001;000;255m.\\033[48;2;002;000;255m.\\033[48;2;003;000;255m.\\033[48;2;004;000;255m.\\033[48;2;005;000;255m.\\033[48;2;006;000;255m.\\033[48;2;007;000;255m.",
+ "\\033[48;2;008;000;255m.\\033[48;2;009;000;255m.\\033[48;2;010;000;255m.\\033[48;2;011;000;255m.\\033[48;2;012;000;255m.\\033[48;2;013;000;255m.\\033[48;2;014;000;255m.\\033[48;2;015;000;255m.",
+ "\\033[48;2;016;000;255m.\\033[48;2;017;000;255m.\\033[48;2;018;000;255m.\\033[48;2;019;000;255m.\\033[48;2;020;000;255m.\\033[48;2;021;000;255m.\\033[48;2;022;000;255m.\\033[48;2;023;000;255m.",
+ "\\033[48;2;024;000;255m.\\033[48;2;025;000;255m.\\033[48;2;026;000;255m.\\033[48;2;027;000;255m.\\033[48;2;028;000;255m.\\033[48;2;029;000;255m.\\033[48;2;030;000;255m.\\033[48;2;031;000;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;032;000;255m.\\033[48;2;033;000;255m.\\033[48;2;034;000;255m.\\033[48;2;035;000;255m.\\033[48;2;036;000;255m.\\033[48;2;037;000;255m.\\033[48;2;038;000;255m.\\033[48;2;039;000;255m.",
+ "\\033[48;2;040;000;255m.\\033[48;2;041;000;255m.\\033[48;2;042;000;255m.\\033[48;2;043;000;255m.\\033[48;2;044;000;255m.\\033[48;2;045;000;255m.\\033[48;2;046;000;255m.\\033[48;2;047;000;255m.",
+ "\\033[48;2;048;000;255m.\\033[48;2;049;000;255m.\\033[48;2;050;000;255m.\\033[48;2;051;000;255m.\\033[48;2;052;000;255m.\\033[48;2;053;000;255m.\\033[48;2;054;000;255m.\\033[48;2;055;000;255m.",
+ "\\033[48;2;056;000;255m.\\033[48;2;057;000;255m.\\033[48;2;058;000;255m.\\033[48;2;059;000;255m.\\033[48;2;060;000;255m.\\033[48;2;061;000;255m.\\033[48;2;062;000;255m.\\033[48;2;063;000;255m.",
+ "\\033[48;2;064;000;255m.\\033[48;2;065;000;255m.\\033[48;2;066;000;255m.\\033[48;2;067;000;255m.\\033[48;2;068;000;255m.\\033[48;2;069;000;255m.\\033[48;2;070;000;255m.\\033[48;2;071;000;255m.",
+ "\\033[48;2;072;000;255m.\\033[48;2;073;000;255m.\\033[48;2;074;000;255m.\\033[48;2;075;000;255m.\\033[48;2;076;000;255m.\\033[48;2;077;000;255m.\\033[48;2;078;000;255m.\\033[48;2;079;000;255m.",
+ "\\033[48;2;080;000;255m.\\033[48;2;081;000;255m.\\033[48;2;082;000;255m.\\033[48;2;083;000;255m.\\033[48;2;084;000;255m.\\033[48;2;085;000;255m.\\033[48;2;086;000;255m.\\033[48;2;087;000;255m.",
+ "\\033[48;2;088;000;255m.\\033[48;2;089;000;255m.\\033[48;2;090;000;255m.\\033[48;2;091;000;255m.\\033[48;2;092;000;255m.\\033[48;2;093;000;255m.\\033[48;2;094;000;255m.\\033[48;2;095;000;255m.",
+ "\\033[48;2;096;000;255m.\\033[48;2;097;000;255m.\\033[48;2;098;000;255m.\\033[48;2;099;000;255m.\\033[48;2;100;000;255m.\\033[48;2;101;000;255m.\\033[48;2;102;000;255m.\\033[48;2;103;000;255m.",
+ "\\033[48;2;104;000;255m.\\033[48;2;105;000;255m.\\033[48;2;106;000;255m.\\033[48;2;107;000;255m.\\033[48;2;108;000;255m.\\033[48;2;109;000;255m.\\033[48;2;110;000;255m.\\033[48;2;111;000;255m.",
+ "\\033[48;2;112;000;255m.\\033[48;2;113;000;255m.\\033[48;2;114;000;255m.\\033[48;2;115;000;255m.\\033[48;2;116;000;255m.\\033[48;2;117;000;255m.\\033[48;2;118;000;255m.\\033[48;2;119;000;255m.",
+ "\\033[48;2;120;000;255m.\\033[48;2;121;000;255m.\\033[48;2;122;000;255m.\\033[48;2;123;000;255m.\\033[48;2;124;000;255m.\\033[48;2;125;000;255m.\\033[48;2;126;000;255m.\\033[48;2;127;000;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;128;000;255m.\\033[48;2;129;000;255m.\\033[48;2;130;000;255m.\\033[48;2;131;000;255m.\\033[48;2;132;000;255m.\\033[48;2;133;000;255m.\\033[48;2;134;000;255m.\\033[48;2;135;000;255m.",
+ "\\033[48;2;136;000;255m.\\033[48;2;137;000;255m.\\033[48;2;138;000;255m.\\033[48;2;139;000;255m.\\033[48;2;140;000;255m.\\033[48;2;141;000;255m.\\033[48;2;142;000;255m.\\033[48;2;143;000;255m.",
+ "\\033[48;2;144;000;255m.\\033[48;2;145;000;255m.\\033[48;2;146;000;255m.\\033[48;2;147;000;255m.\\033[48;2;148;000;255m.\\033[48;2;149;000;255m.\\033[48;2;150;000;255m.\\033[48;2;151;000;255m.",
+ "\\033[48;2;152;000;255m.\\033[48;2;153;000;255m.\\033[48;2;154;000;255m.\\033[48;2;155;000;255m.\\033[48;2;156;000;255m.\\033[48;2;157;000;255m.\\033[48;2;158;000;255m.\\033[48;2;159;000;255m.",
+ "\\033[48;2;160;000;255m.\\033[48;2;161;000;255m.\\033[48;2;162;000;255m.\\033[48;2;163;000;255m.\\033[48;2;164;000;255m.\\033[48;2;165;000;255m.\\033[48;2;166;000;255m.\\033[48;2;167;000;255m.",
+ "\\033[48;2;168;000;255m.\\033[48;2;169;000;255m.\\033[48;2;170;000;255m.\\033[48;2;171;000;255m.\\033[48;2;172;000;255m.\\033[48;2;173;000;255m.\\033[48;2;174;000;255m.\\033[48;2;175;000;255m.",
+ "\\033[48;2;176;000;255m.\\033[48;2;177;000;255m.\\033[48;2;178;000;255m.\\033[48;2;179;000;255m.\\033[48;2;180;000;255m.\\033[48;2;181;000;255m.\\033[48;2;182;000;255m.\\033[48;2;183;000;255m.",
+ "\\033[48;2;184;000;255m.\\033[48;2;185;000;255m.\\033[48;2;186;000;255m.\\033[48;2;187;000;255m.\\033[48;2;188;000;255m.\\033[48;2;189;000;255m.\\033[48;2;190;000;255m.\\033[48;2;191;000;255m.",
+ "\\033[48;2;192;000;255m.\\033[48;2;193;000;255m.\\033[48;2;194;000;255m.\\033[48;2;195;000;255m.\\033[48;2;196;000;255m.\\033[48;2;197;000;255m.\\033[48;2;198;000;255m.\\033[48;2;199;000;255m.",
+ "\\033[48;2;200;000;255m.\\033[48;2;201;000;255m.\\033[48;2;202;000;255m.\\033[48;2;203;000;255m.\\033[48;2;204;000;255m.\\033[48;2;205;000;255m.\\033[48;2;206;000;255m.\\033[48;2;207;000;255m.",
+ "\\033[48;2;208;000;255m.\\033[48;2;209;000;255m.\\033[48;2;210;000;255m.\\033[48;2;211;000;255m.\\033[48;2;212;000;255m.\\033[48;2;213;000;255m.\\033[48;2;214;000;255m.\\033[48;2;215;000;255m.",
+ "\\033[48;2;216;000;255m.\\033[48;2;217;000;255m.\\033[48;2;218;000;255m.\\033[48;2;219;000;255m.\\033[48;2;220;000;255m.\\033[48;2;221;000;255m.\\033[48;2;222;000;255m.\\033[48;2;223;000;255m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;224;000;255m.\\033[48;2;225;000;255m.\\033[48;2;226;000;255m.\\033[48;2;227;000;255m.\\033[48;2;228;000;255m.\\033[48;2;229;000;255m.\\033[48;2;230;000;255m.\\033[48;2;231;000;255m.",
+ "\\033[48;2;232;000;255m.\\033[48;2;233;000;255m.\\033[48;2;234;000;255m.\\033[48;2;235;000;255m.\\033[48;2;236;000;255m.\\033[48;2;237;000;255m.\\033[48;2;238;000;255m.\\033[48;2;239;000;255m.",
+ "\\033[48;2;240;000;255m.\\033[48;2;241;000;255m.\\033[48;2;242;000;255m.\\033[48;2;243;000;255m.\\033[48;2;244;000;255m.\\033[48;2;245;000;255m.\\033[48;2;246;000;255m.\\033[48;2;247;000;255m.",
+ "\\033[48;2;248;000;255m.\\033[48;2;249;000;255m.\\033[48;2;250;000;255m.\\033[48;2;251;000;255m.\\033[48;2;252;000;255m.\\033[48;2;253;000;255m.\\033[48;2;254;000;255m.\\033[48;2;255;000;255m.",
+ "\\033[48;2;255;000;255m.\\033[48;2;255;000;254m.\\033[48;2;255;000;253m.\\033[48;2;255;000;252m.\\033[48;2;255;000;251m.\\033[48;2;255;000;250m.\\033[48;2;255;000;249m.\\033[48;2;255;000;248m.",
+ "\\033[48;2;255;000;247m.\\033[48;2;255;000;246m.\\033[48;2;255;000;245m.\\033[48;2;255;000;244m.\\033[48;2;255;000;243m.\\033[48;2;255;000;242m.\\033[48;2;255;000;241m.\\033[48;2;255;000;240m.",
+ "\\033[48;2;255;000;239m.\\033[48;2;255;000;238m.\\033[48;2;255;000;237m.\\033[48;2;255;000;236m.\\033[48;2;255;000;235m.\\033[48;2;255;000;234m.\\033[48;2;255;000;233m.\\033[48;2;255;000;232m.",
+ "\\033[48;2;255;000;231m.\\033[48;2;255;000;230m.\\033[48;2;255;000;229m.\\033[48;2;255;000;228m.\\033[48;2;255;000;227m.\\033[48;2;255;000;226m.\\033[48;2;255;000;225m.\\033[48;2;255;000;224m.",
+ "\\033[48;2;255;000;223m.\\033[48;2;255;000;222m.\\033[48;2;255;000;221m.\\033[48;2;255;000;220m.\\033[48;2;255;000;219m.\\033[48;2;255;000;218m.\\033[48;2;255;000;217m.\\033[48;2;255;000;216m.",
+ "\\033[48;2;255;000;215m.\\033[48;2;255;000;214m.\\033[48;2;255;000;213m.\\033[48;2;255;000;212m.\\033[48;2;255;000;211m.\\033[48;2;255;000;210m.\\033[48;2;255;000;209m.\\033[48;2;255;000;208m.",
+ "\\033[48;2;255;000;207m.\\033[48;2;255;000;206m.\\033[48;2;255;000;205m.\\033[48;2;255;000;204m.\\033[48;2;255;000;203m.\\033[48;2;255;000;202m.\\033[48;2;255;000;201m.\\033[48;2;255;000;200m.",
+ "\\033[48;2;255;000;199m.\\033[48;2;255;000;198m.\\033[48;2;255;000;197m.\\033[48;2;255;000;196m.\\033[48;2;255;000;195m.\\033[48;2;255;000;194m.\\033[48;2;255;000;193m.\\033[48;2;255;000;192m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;255;000;191m.\\033[48;2;255;000;190m.\\033[48;2;255;000;189m.\\033[48;2;255;000;188m.\\033[48;2;255;000;187m.\\033[48;2;255;000;186m.\\033[48;2;255;000;185m.\\033[48;2;255;000;184m.",
+ "\\033[48;2;255;000;183m.\\033[48;2;255;000;182m.\\033[48;2;255;000;181m.\\033[48;2;255;000;180m.\\033[48;2;255;000;179m.\\033[48;2;255;000;178m.\\033[48;2;255;000;177m.\\033[48;2;255;000;176m.",
+ "\\033[48;2;255;000;175m.\\033[48;2;255;000;174m.\\033[48;2;255;000;173m.\\033[48;2;255;000;172m.\\033[48;2;255;000;171m.\\033[48;2;255;000;170m.\\033[48;2;255;000;169m.\\033[48;2;255;000;168m.",
+ "\\033[48;2;255;000;167m.\\033[48;2;255;000;166m.\\033[48;2;255;000;165m.\\033[48;2;255;000;164m.\\033[48;2;255;000;163m.\\033[48;2;255;000;162m.\\033[48;2;255;000;161m.\\033[48;2;255;000;160m.",
+ "\\033[48;2;255;000;159m.\\033[48;2;255;000;158m.\\033[48;2;255;000;157m.\\033[48;2;255;000;156m.\\033[48;2;255;000;155m.\\033[48;2;255;000;154m.\\033[48;2;255;000;153m.\\033[48;2;255;000;152m.",
+ "\\033[48;2;255;000;151m.\\033[48;2;255;000;150m.\\033[48;2;255;000;149m.\\033[48;2;255;000;148m.\\033[48;2;255;000;147m.\\033[48;2;255;000;146m.\\033[48;2;255;000;145m.\\033[48;2;255;000;144m.",
+ "\\033[48;2;255;000;143m.\\033[48;2;255;000;142m.\\033[48;2;255;000;141m.\\033[48;2;255;000;140m.\\033[48;2;255;000;139m.\\033[48;2;255;000;138m.\\033[48;2;255;000;137m.\\033[48;2;255;000;136m.",
+ "\\033[48;2;255;000;135m.\\033[48;2;255;000;134m.\\033[48;2;255;000;133m.\\033[48;2;255;000;132m.\\033[48;2;255;000;131m.\\033[48;2;255;000;130m.\\033[48;2;255;000;129m.\\033[48;2;255;000;128m.",
+ "\\033[48;2;255;000;127m.\\033[48;2;255;000;126m.\\033[48;2;255;000;125m.\\033[48;2;255;000;124m.\\033[48;2;255;000;123m.\\033[48;2;255;000;122m.\\033[48;2;255;000;121m.\\033[48;2;255;000;120m.",
+ "\\033[48;2;255;000;119m.\\033[48;2;255;000;118m.\\033[48;2;255;000;117m.\\033[48;2;255;000;116m.\\033[48;2;255;000;115m.\\033[48;2;255;000;114m.\\033[48;2;255;000;113m.\\033[48;2;255;000;112m.",
+ "\\033[48;2;255;000;111m.\\033[48;2;255;000;110m.\\033[48;2;255;000;109m.\\033[48;2;255;000;108m.\\033[48;2;255;000;107m.\\033[48;2;255;000;106m.\\033[48;2;255;000;105m.\\033[48;2;255;000;104m.",
+ "\\033[48;2;255;000;103m.\\033[48;2;255;000;102m.\\033[48;2;255;000;101m.\\033[48;2;255;000;100m.\\033[48;2;255;000;099m.\\033[48;2;255;000;098m.\\033[48;2;255;000;097m.\\033[48;2;255;000;096m.",
+ "\\033[0m\\n ",
+ "\\033[48;2;255;000;095m.\\033[48;2;255;000;094m.\\033[48;2;255;000;093m.\\033[48;2;255;000;092m.\\033[48;2;255;000;091m.\\033[48;2;255;000;090m.\\033[48;2;255;000;089m.\\033[48;2;255;000;088m.",
+ "\\033[48;2;255;000;087m.\\033[48;2;255;000;086m.\\033[48;2;255;000;085m.\\033[48;2;255;000;084m.\\033[48;2;255;000;083m.\\033[48;2;255;000;082m.\\033[48;2;255;000;081m.\\033[48;2;255;000;080m.",
+ "\\033[48;2;255;000;079m.\\033[48;2;255;000;078m.\\033[48;2;255;000;077m.\\033[48;2;255;000;076m.\\033[48;2;255;000;075m.\\033[48;2;255;000;074m.\\033[48;2;255;000;073m.\\033[48;2;255;000;072m.",
+ "\\033[48;2;255;000;071m.\\033[48;2;255;000;070m.\\033[48;2;255;000;069m.\\033[48;2;255;000;068m.\\033[48;2;255;000;067m.\\033[48;2;255;000;066m.\\033[48;2;255;000;065m.\\033[48;2;255;000;064m.",
+ "\\033[48;2;255;000;063m.\\033[48;2;255;000;062m.\\033[48;2;255;000;061m.\\033[48;2;255;000;060m.\\033[48;2;255;000;059m.\\033[48;2;255;000;058m.\\033[48;2;255;000;057m.\\033[48;2;255;000;056m.",
+ "\\033[48;2;255;000;055m.\\033[48;2;255;000;054m.\\033[48;2;255;000;053m.\\033[48;2;255;000;052m.\\033[48;2;255;000;051m.\\033[48;2;255;000;050m.\\033[48;2;255;000;049m.\\033[48;2;255;000;048m.",
+ "\\033[48;2;255;000;047m.\\033[48;2;255;000;046m.\\033[48;2;255;000;045m.\\033[48;2;255;000;044m.\\033[48;2;255;000;043m.\\033[48;2;255;000;042m.\\033[48;2;255;000;041m.\\033[48;2;255;000;040m.",
+ "\\033[48;2;255;000;039m.\\033[48;2;255;000;038m.\\033[48;2;255;000;037m.\\033[48;2;255;000;036m.\\033[48;2;255;000;035m.\\033[48;2;255;000;034m.\\033[48;2;255;000;033m.\\033[48;2;255;000;032m.",
+ "\\033[48;2;255;000;031m.\\033[48;2;255;000;030m.\\033[48;2;255;000;029m.\\033[48;2;255;000;028m.\\033[48;2;255;000;027m.\\033[48;2;255;000;026m.\\033[48;2;255;000;025m.\\033[48;2;255;000;024m.",
+ "\\033[48;2;255;000;023m.\\033[48;2;255;000;022m.\\033[48;2;255;000;021m.\\033[48;2;255;000;020m.\\033[48;2;255;000;019m.\\033[48;2;255;000;018m.\\033[48;2;255;000;017m.\\033[48;2;255;000;016m.",
+ "\\033[48;2;255;000;015m.\\033[48;2;255;000;014m.\\033[48;2;255;000;013m.\\033[48;2;255;000;012m.\\033[48;2;255;000;011m.\\033[48;2;255;000;010m.\\033[48;2;255;000;009m.\\033[48;2;255;000;008m.",
+ "\\033[48;2;255;000;007m.\\033[48;2;255;000;006m.\\033[48;2;255;000;005m.\\033[48;2;255;000;004m.\\033[48;2;255;000;003m.\\033[48;2;255;000;002m.\\033[48;2;255;000;001m.\\033[48;2;255;000;000m.",
+
+ "\\033[0m\\n",
+ "\\n",
+ "---> Hit 'e' for next test: ",
+ "\\033[2J\\033[H" "ESC TEST 0023: FG/BG Specific Reset\\n",
+ "\\n",
+ "Test fg reset: \\033[31mThis is red on norm bg\\033[39m, This is ESC[39m reset (norm fg on norm bg).\\033[m\\n",
+ "Test bg reset: \\033[41mThis is norm fg on red bg\\033[49m, This is ESC[49m reset (norm fg on norm bg).\\033[m\\n",
+ "\\n",
+ "Test fg/bg with fg reset: \\033[32;44mThis is grn on blu\\033[39m, This is ESC[39m reset (norm fg on blu).\\033[m\\n",
+ "Test fg/bg with bg reset: \\033[32;44mThis is grn on blu\\033[49m, This is ESC[49m reset (grn on norm bg).\\033[m\\n",
+ "\\n",
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_fgbg_colors(bool reset)} {
+ comment {--- 0030: Test FG/BG Colors} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 30
+ "\\033[2J\\033[H" "ESC TEST 0030: FG/BG Colors\\n",
+ "\\n",
+ " Foreground Colors:\\n",
+ " \\033[2;31m" " Dim Red text \\033[0m \\033[0;32m" " Dim Grn text \\033[0m \\033[2;33m" " Dim Yel text \\033[0m\\n",
+ " \\033[2;34m" " Dim Blu text \\033[0m \\033[0;35m" " Dim Mag text \\033[0m \\033[2;36m" " Dim Cyn text \\033[0m"
+ " \\033[2;37m" " Dim Wht text \\033[0m\\n",
+ " \\033[0;31m" " Nor Red text \\033[0m \\033[0;32m" " Nor Grn text \\033[0m \\033[2;33m" " Nor Yel text \\033[0m\\n",
+ " \\033[0;34m" " Nor Blu text \\033[0m \\033[0;35m" " Nor Mag text \\033[0m \\033[0;36m" " Nor Cyn text \\033[0m"
+ " \\033[0;37m" " Nor Wht text \\033[0m\\n",
+ " \\033[1;31m" " Bold Red text \\033[0m \\033[1;32m" " Bold Grn text \\033[0m \\033[1;33m" " Bold Yel text \\033[0m\\n",
+ " \\033[1;34m" " Bold Blu text \\033[0m \\033[1;35m" " Bold Mag \\033[0m \\033[1;36m" " Bold Cyn text \\033[0m"
+ " \\033[1;37m" " Bold Wht text \\033[0m\\n",
+ "\\n",
+ " Background Colors:\\n",
+ " \\033[2;37;41m"" Dim Red bg \\033[0m \\033[2;37;42m"" Dim Grn bg \\033[0m \\033[2;37;43m"" Dim Yel bg \\033[0m\\n",
+ " \\033[2;37;44m"" Dim Blu bg \\033[0m \\033[2;37;45m"" Dim Mag bg \\033[0m \\033[2;37;46m"" Dim Cyn bg \\033[0m"
+ " \\033[2;37;47m"" Dim Wht bg \\033[0m\\n",
+ " \\033[0;37;41m"" Nor Red bg \\033[0m \\033[0;37;42m"" Nor Grn bg \\033[0m \\033[0;37;43m"" Nor Yel bg \\033[0m\\n",
+ " \\033[0;37;44m"" Nor Blu bg \\033[0m \\033[0;37;45m"" Nor Mag bg \\033[0m \\033[0;37;46m"" Nor Cyn bg \\033[0m"
+ " \\033[0;37;47m"" Nor Wht bg \\033[0m\\n",
+ " \\033[1;37;41m"" Bold Red bg \\033[0m \\033[1;37;42m"" Bold Grn bg \\033[0m \\033[1;37;43m"" Bold Yel bg \\033[0m\\n",
+ " \\033[1;37;44m"" Bold Blu bg \\033[0m \\033[1;37;45m"" Bold Mag bg \\033[0m \\033[1;37;46m"" Bold Cyn bg \\033[0m"
+ " \\033[1;37;47m"" Bold Wht bg \\033[0m\\n",
+ "\\n",
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_curpos(bool reset)} {
+ comment {--- 0040: Test Cursor Positioning} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 40
+ "\\033[2J\\033[H" "ESC TEST 0040: Cursor Positioning\\n",
+ "2:\\n",
+ "3: 10 15 20 25 30 35 40 45 50 55 60 65 70\\n",
+ "4: |----:----|----:----|----:----|----:----|----:----|----:----|\\n",
+ "5:\\n",
+ "6:\\n",
+ "7:\\n",
+ "\\033[5;10H" "X", "\\033[5;15H" "X", "\\033[5;20H" "X",
+ "\\033[5;40H" "X", "\\033[5;45H" "X", "\\033[5;50H" "X",
+ "\\033[6;10H" "|", "\\033[6;15H" "|", "\\033[6;20H" "|",
+ "\\033[6;40H" "|", "\\033[6;45H" "|", "\\033[6;50H" "|",
+ "\\033[7;10H" "10,5", "\\033[7;15H" "15,5", "\\033[7;20H" "20,5",
+ "\\033[7;40H" "40,5", "\\033[7;45H" "45,5", "\\033[7;50H" "50,5",
+ "\\033[8H\\n",
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_tabstops(bool reset)} {
+ comment {--- 0050: Tabstops: Default Tabstops} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 50
+ // We use <ESC>c to reset the terminal to default tabstops.
+ "\\033c" "ESC TEST 0050: Tabs: Default Tabstops\\n",
+ " A B C D E F G H I\\n",
+ " | | | | | | | | |\\n",
+ "\\tA\\tB\\tC\\tD-\\tE--\\tF-----\\tG------\\tH-------I\\n",
+ "\\t\\tB\\t\\tD\\t\\tF\\t\\tH-------I\\n",
+ "---> Hit 'e' for next test: ",
+ // We use <ESC>c to reset the terminal to default tabstops.
+ // Should also clear screen and home cursor..
+ "\\033c" "ESC TEST 0051: Tabs: Change Tabstops\\n",
+ "\\n",
+ " 8 16 24 32 40 48 56 64 72\\n",
+ "--------|-------|-------|-------|-------|-------|-------|-------|-------|\\n",
+ "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n",
+ "\\n",
+ "Setting new tabstops..\\033[3g\\n",
+ ".\\033HT..\\033HT...\\033HT....\\033HT.....\\033HT......\\033HT.......\\033HT........\\033HT.........\\033HT\\n",
+ "-|--|---|----|-----|------|-------|--------|---------|\\n",
+ "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n",
+ "---> Hit 'e' for next test: ",
+ "\\033c" "ESC TEST 0052: Tabs: Default Tabstops Again\\n",
+ "\\n",
+ "Back to normal tabstops:\\n",
+ " 8 16 24 32 40 48 56 64 72\\n",
+ "--------|-------|-------|-------|-------|-------|-------|-------|-------|\\n",
+ "\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\tX\\n",
+ "\\n",
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_insert_char(bool reset)} {
+ comment {--- 0060: Insert Char} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 60
+ "\\033[2J\\033[HESC TEST 0060: Insert Char (ESC[@)\\n",
+ "\\n",
+ " 10> 20> 30> 40> 50> 60> 70> 80>\\n",
+ "4:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "5:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "6:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "\\033[s\\033[5;29H\\033[1;31m>\\033[0m\\033[u", // save curs, movcur, bold/red, '>', norm, recall curs
+ "\\n",
+ "---> Hit 'e' to test INSERT 1 char at row/col 5/30 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[@\\033[8H",
+ "---> Hit 'e' to test INSERT 1 char at row/col 5/30 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[@\\033[8H",
+ "---> Hit 'e' to test INSERT 4 chars at row/col 5/30 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[4@\\033[8H",
+ "---> Hit 'e' to test INSERT 4 chars at row/col 5/30 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[4@\\033[8H",
+ "---> Hit 'e' to test DELETE 1 chars at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[P\\033[8H",
+ "---> Hit 'e' to test DELETE 1 chars at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[P\\033[8H",
+ "---> Hit 'e' to test DELETE 2 chars at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[2P\\033[8H",
+ "---> Hit 'e' to test DELETE 4 chars at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[4P\\033[8H",
+ "---> Hit 'e' to test DELETE 1 char at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[P\\033[8H",
+ "---> Hit 'e' to test DELETE 1 char at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[P\\033[8H",
+ "---> Hit 'e' to test DELETE 1 *EXTRA* char at row/col 5/20 (right of '>'): \\033[K",
+ "\\033[5;30H\\033[P\\033[8H",
+ "---> Hit 'e' for next test: \\033[K",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_clear_test(bool reset)} {
+ comment {--- 0070: Clear Test ESC[K / ESC[K} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 70
+ "\\033[2J\\033[H" "ESC TEST 0070: Clear Test (ESC[K / ESC[J)\\n",
+ "2: 10> 20> 30> 40> 50> 60> 70> 80>\\n",
+ "3:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "4:3456789012345678901234 ERASE EOL->XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n",
+ "5:YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY<-ERASE SOL 012345678901234567890123456789\\n",
+ "6:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "7:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\\n",
+ "8:34567890123456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "9:3456789012345678901234 ERASE EOD->ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "0:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "1:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "2:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "3:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "4:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "5:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "6:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "7:ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\\n",
+ "\\n",
+ "---> Hit 'e' to test ERASE EOL (should make X's disappear): ",
+ "\\033[4;37H\\033[K\\n", // ERASE EOL
+ "\\033[19H",
+ "---> Hit 'e' to test ERASE SOL (should make Y's disappear): ",
+ "\\033[5;37H\\033[1K\\n", // ERASE SOL
+ "\\033[19H",
+ "---> Hit 'e' to test ERASE LINE (should make F's disappear): ",
+ "\\033[7;37H\\033[2K\\n", // ERASE LINE
+ "\\033[19H",
+ "---> Hit 'e' to test ERASE EOD (should make Z's disappear): ",
+ "\\033[9;37H\\033[0J\\n", // ERASE EOD
+ "\\033[19H",
+ "---> Hit 'e' for next test: ",
+ // Screen 71
+ "\\033[2J\\033[H" "ESC TEST 0071: Clear Test (ESC[K / ESC[J)\\n",
+ "2: | | | | | |\\n",
+ "3:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n",
+ "4:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n",
+ "5:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\\n",
+ "6:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX<-- ERASE SOD 567890123456789\\n",
+ "7:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "8:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "9:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "\\033[19H",
+ "---> Hit 'e' to test ERASE SOD (should make X's disappear): ",
+ "\\033[6;40H\\033[1J\\n", // ERASE SOD
+ "\\033[19H",
+ "---> Hit 'e' for next test: \\033[K",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_delete_row(bool reset)} {
+ comment {--- 0080: Delete Row - ESC[M} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 80
+ "\\033[2J\\033[H" "ESC TEST 0080: Delete Row (ESC[M)\\n",
+ "02:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "03:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "04:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "05:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "06:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "07:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "08:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "09:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "10:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "\\n",
+ "24:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "25:456789012345678901234567890123456789012345678901234567890123456789",
+ "\\033[12H", // to prompt row
+ "---> Hit 'e' to test [1/4] DELETE LINE 3 with ESC[M: \\033[K",
+ "\\033[2K", // clear prompt
+ "\\033[3H", // move to line 3
+ "\\033[M", // delete line 3
+ "\\033[12H", // back to line 12H for prompt
+ //"\\033[2K\\033[3H\\033[M", // clear prompt, to row 3, delete row
+ //"\\033[12H", // to prompt row
+ "---> Hit 'e' to test [2/4] DELETE 3 MORE LINES with ESC[3M: \\033[K",
+ "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows
+ "\\033[12H", // to prompt row
+ "---> Hit 'e' to test [3/4] DELETE 3 MORE LINES with ESC[3M: \\033[K",
+ "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows
+ "\\033[12H", // to prompt row
+ "---> Hit 'e' to test [4/4] DELETE 3 MORE LINES with ESC[3M: \\033[K",
+ "\\033[2K\\033[3H\\033[3M", // clear prompt, to row 3, delete 3 rows
+ "\\033[12H", // to prompt row
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_insert_row(bool reset)} {
+ comment {--- 0085: Insert Row - ESC[L} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 71
+ "\\033[2J\\033[H" "ESC TEST 0085: Insert Row (ESC[L)\\n",
+ "2:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "3:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "4:3456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "\\033[24H",
+ "24:456789012345678901234567890123456789012345678901234567890123456789\\n",
+ "25:456789012345678901234567890123456789012345678901234567890123456789",
+ "\\033[12H",
+ "---> Hit 'e' to test [1/3] INSERT 1 ROW AT LINE 3 with ESC[L: \\033[K",
+ "\\033[2K\\033[3H\\033[L", // clear prompt, to row 3, insert row
+ "\\033[12H", // to prompt row 17
+ "---> Hit 'e' to test [2/3] INSERT 3 ROWS AT LINE 3 with ESC[3L: \\033[K",
+ "\\033[2K\\033[3H\\033[3L", // clear prompt, to row 3, insert 3 rows
+ "\\033[12H", // to prompt row 17
+ "---> Hit 'e' for next test: ",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ Function {test_esc_scrolling(bool reset)} {
+ comment {--- 0090: Scrolling Up/Down - <ESC>[S / <ESC>M} return_type {static int}
+ } {
+ code {static int index = 0;
+const char *test[] = {
+ // Screen 90
+ "\\033[2J\\033[H" "ESC TEST 0090: Scrolling up/down\\n",
+ "Line 2 🡅\\n",
+ "Line 3 [A]\\n",
+ "Line 4 🡅\\n",
+ "Line 5 [B]\\n",
+ "Line 6\\n",
+ "Line 7\\n",
+ "Line 8\\n",
+ "Line 9\\n",
+ "Line 10\\n",
+ "Line 11\\n",
+ "Line 12\\n",
+ // Do this weird thing so the lines still appear in order in our code
+ "\\033[200H\\033[10ABottom Line -10",
+ "\\033[200H\\033[9ABottom Line -9",
+ "\\033[200H\\033[8ABottom Line -8",
+ "\\033[200H\\033[7ABottom Line -7",
+ "\\033[200H\\033[6ABottom Line -6",
+ "\\033[200H\\033[5ABottom Line -5 [D]",
+ "\\033[200H\\033[4ABottom Line -4 🡇",
+ "\\033[200H\\033[3ABottom Line -3",
+ "\\033[200H\\033[2ABottom Line -2 [C]",
+ "\\033[200H\\033[1ABottom Line -1 🡇",
+ "\\033[200H" "Bottom Line 0",
+ "\\033[15H", // Line 15
+ "---> Hit 'e' to SCROLL UP 1 with <ESC>[S so top line at position [A]: \\033[K",
+ "\\033[H\\033[S\\033[14H", // Line 14 because up one line
+ "---> Hit 'e' to SCROLL UP 2 with <ESC>[2S so top line at position [B]: \\033[K",
+ "\\033[H\\033[2S\\033[12H", // Line 12 because up two more lines
+ "---> Hit 'e' to SCROLL DOWN 1 with <ESC>M at screen top: \\033[K",
+ "\\033[H\\033M\\033[13H", // Line 13 because down 1 line
+ "---> Hit 'e' to SCROLL DOWN 2 with 2x<ESC>M: \\033[K",
+ "\\033[H\\033M\\033M\\033[15H", // Line 15 because down 2 lines
+ "---> Hit 'e' to SCROLL DOWN 1 with <ESC>M for bottom line at posn [C]: \\033[K",
+ "\\033[H\\033M\\033[16H", // Line 16 because down 1 lines
+ "---> Hit 'e' to SCROLL DOWN 3 with 3x<ESC>M for bottom line at posn [D]: \\033[K",
+ "\\033[H\\033M\\033M\\033M\\033[19H", // Line 18 because down 3 lines
+ //TODO Other ESC commands to scroll up/down?
+ "---> Hit 'e' for next test: \\033[K",
+ // Screen 100
+ "\\033[2J\\033[HESC TEST 0091: Cursor Save/Restore Test\\n",
+ "\\n",
+ " Cursor positon at 'A' was saved with ESC[s.\\n",
+ "\\033[12;39H>\\033[1;31m\\033[s""A""\\033[0m<\\033[20H",
+ "---> Hit 'e' to recall cursor position and change 'A' to 'B': \\033[K",
+ "\\033[u\\033[1;32m""B\\033[0m\\033[20H",
+ "---> Hit 'e' for next test: \\033[K",
+ NULL
+};
+if (reset) { index = 0; return 0; }
+return show_test(test, index);} {}
+ }
+ decl {////// OTHER SELF TESTS //////} {private local
+ }
+ Function {show_file(const char *filename)} {
+ comment {Show the specified file in the terminal
+} return_type void
+ } {
+ code {// If cursor floating, do a crlf first
+if (G_tty->cursor_col()!=0) G_tty->append("\\n");
+
+char s[1024];
+FILE *fp = fopen(filename, "r");
+if ( fp == NULL ) {
+ snprintf(s, sizeof(s), "\\033[1;31m%s: %s\\033[0m\\n", filename, strerror(errno));
+ s[1023] = 0;
+ G_tty->append_utf8(s);
+ return;
+}
+while ( fgets(s, sizeof(s)-1, fp) ) {
+ s[1023] = 0;
+ G_tty->append(s); // append line to display
+}
+// Last line in file? Done
+fclose(fp);
+fp = NULL;} {}
+ }
+ Function {speed_test()} {
+ comment {Run full screen random character update} return_type void
+ } {
+ code {// 50 iters of WxH random chars (no scrolling)
+
+// First, switch redraw style to none, so we can handle redraws()
+G_tty->redraw_style(Fl_Terminal::NO_REDRAW);
+
+// Clear screen, do 50 iterations of random chars
+G_tty->append("\\033[H"); // home
+int rows = G_tty->display_rows();
+int cols = G_tty->display_columns();
+for (int i=0; i<50; i++ ) {
+ for ( int row=0; row<rows; row++ ) {
+ for ( int col=0; col<cols; col++ ) {
+ char c = ' ' + (rand() % 0x50); // random ASCII characters
+ G_tty->textfgcolor_xterm(rand() % 8); // random fg uchar color for each char
+ G_tty->putchar(c, row, col);
+ }
+ }
+ G_tty->redraw();
+ Fl::wait(0.005);
+}
+// leave test with white on black
+G_tty->textfgcolor(0xd0d0d000);
+G_tty->textbgcolor(0xffffffff); // special see thru color
+// back to rate limited
+G_tty->redraw_style(Fl_Terminal::RATE_LIMITED);
+// Show the Unicode alignment page
+test_firstpage(false);} {}
+ }
+ Function {show_colorbars()} {
+ comment {Show colorbars in terminal
+} return_type void
+ } {
+ code {// If cursor floating, do a crlf first
+if (G_tty->cursor_col()!=0) G_tty->append("\\n");
+
+Fl_Color fgsave = G_tty->textfgcolor();
+Fl_Color bgsave = G_tty->textbgcolor();
+// ECR-1-1978
+// grey yellow cyan green magenta red blue
+Fl_Color bars1[] = { 0xc0c0c000, 0xbfc03700, 0x2ac0bf00, 0x25c03300, 0xbe00bb00, 0xbd051800, 0x1600ba00 };
+Fl_Color bars2[] = { 0x1600ba00, 0x11111100, 0xbe00bb00, 0x11111100, 0x2ac0bf00, 0x11111100, 0xc0c0c000 };
+Fl_Color boxes[] = { 0x05214a00, 0xffffff00, 0x32006700, 0x11111100, 0x03030300, 0x11111100, 0x1d1d1d00, 0x11111100 };
+// -I 100% wht Q+ superblack black 4% black
+// \\________________________________/
+// pluge
+const char *bar = "███████████";
+const char *box1= "██████████████";
+const char *box2= "█████████████";
+const char *pluge = "███";
+G_tty->append("\\033[2J\\033[H");
+// Print 75% bars: bars1[]
+{
+ for ( int y=0; y<16; y++ ) {
+ for ( int i=0; i<7; i++ ) {
+ G_tty->textfgcolor(bars1[i]);
+ G_tty->append(bar);
+ }
+ G_tty->append("\\n");
+ }
+}
+// Print strip: bars2[]
+{
+ for ( int y=0; y<2; y++ ) {
+ for ( int i=0; i<7; i++ ) {
+ G_tty->textfgcolor(bars2[i]);
+ G_tty->append(bar);
+ }
+ G_tty->append("\\n");
+ }
+}
+// Bottom boxes
+{
+ for ( int y=0; y<7; y++ ) {
+ for ( int i=0; i<8; i++ ) {
+ G_tty->textfgcolor(boxes[i]);
+ if ( i < 3 ) G_tty->append(box1);
+ else if ( i < 4 ) G_tty->append(box2);
+ else if ( i < 7 ) G_tty->append(pluge);
+ else G_tty->append(box2);
+ }
+ if ( y < 6 ) G_tty->append("\\n");
+ }
+}
+// Restore fg/bg colors
+G_tty->textfgcolor(fgsave );
+G_tty->textbgcolor(bgsave );} {}
+ }
+ Function {unicode_alignment()} {
+ comment {Show unicode alignment test
+} return_type void
+ } {
+ code {test_firstpage(true);} {}
+ }
+ Function {add_lines(int count)} {
+ comment {Add specified number of test lines to tty} return_type void
+ } {
+ code {// If cursor floating, do a crlf first
+if (G_tty->cursor_col()!=0) G_tty->append("\\n");
+for ( int t=0; t<count; t++ )
+ G_tty->printf("Line %04d -- AAA BBB CCC DDD\\n", G_lines++);} {}
+ }
+ Function {do_command(const char *cmd)} {
+ comment {Run the command, output appends to terminal
+} return_type void
+ } {
+ code {// Run command in pipe, return output to tty
+// TODO: This should probably be reimplemented as a thread.
+// Also, I doubt this will work well on Windows.
+// If it's a real problem, open a file and 'tail' it ourselves instead.
+//
+\#ifdef _WIN32
+\#define POPEN(a,b) _popen(a,b) // effin windows
+\#define PCLOSE(a) _pclose(a)
+\#define READ(a,b,c) _read(a,b,c)
+\#define FILENO(a) _fileno(a)
+\#define SSIZE_T int
+\#else
+\#define POPEN(a,b) popen(a,b)
+\#define PCLOSE(a) pclose(a)
+\#define READ(a,b,c) read(a,b,c)
+\#define FILENO(a) fileno(a)
+\#define SSIZE_T ssize_t
+\#endif
+
+// If cursor floating, do a crlf first
+if (G_tty->cursor_col()!=0) G_tty->append("\\n");
+
+FILE *fp = POPEN(cmd, "r");
+char s[4096];
+if ( fp == NULL ) {
+ sprintf(s, "\\033[0;31mCan't execute '%.200s': %s\\033[0m\\n", cmd, strerror(errno));
+ G_tty->append_utf8(s);
+ return;
+}
+
+int fd = FILENO(fp);
+\#ifndef _WIN32
+// Non-blocking IO keeps interface "alive" during slow commands.
+// Too bad Microsoft's implementation of the C library read() call
+// is so poor it doesn't properly support non-blocking IO or fcntl().
+//
+fcntl(fd, F_SETFL, O_NONBLOCK);
+\#endif
+
+// Read in byte blocks
+G_tty->append(NULL); // (clears utf8 cache)
+while (1) {
+ Fl::wait(0.05);
+ SSIZE_T bytes = READ(fd, s, sizeof(s)); // shout in uppercase so windows can hear us
+ if (bytes == -1 && errno == EAGAIN) continue; // no data yet
+ else if (bytes > 0) G_tty->append(s, bytes); // write block to terminal, handles utf8
+ else break; // pipe closed
+}
+
+PCLOSE(fp);
+G_tty->append_ascii("\\033[33;2m<<END_OF_OUTPUT>>\\033[0m\\n");
+G_tty->redraw();} {}
+ }
+ decl {////// GUI LAYOUT //////} {private local
+ }
+ Function {update_inputs()} {
+ comment {Resync the inputs with widget's values} return_type void
+ } {
+ code {// Scroll History
+scrollhistory_input->value( G_tty->history_rows() );
+
+// Redraw rate
+redraw_rate_spinner->value( G_tty->redraw_rate() );
+
+// Font Size
+fontsize_input->value( G_tty->textsize() );
+
+// Scrollbar Size
+scrollbarsize_input->range(0, 80);
+scrollbarsize_input->step(1);
+scrollbarsize_input->value( G_tty->scrollbar_size() );
+
+// show_unknown() enable/disable
+showunknown_radio->value( G_tty->show_unknown() ? 1 : 0 );
+
+// ansi() enable/disable
+ansi_radio->value(tty ->ansi() ? 1 : 0 );
+
+// box() choice
+switch ( G_tty->box() ) {
+ case FL_UP_FRAME: box_choice->value(0); break;
+ case FL_DOWN_FRAME: box_choice->value(1); break;
+ case FL_THIN_UP_FRAME: box_choice->value(2); break;
+ case FL_THIN_DOWN_FRAME: box_choice->value(3); break;
+ case FL_ENGRAVED_FRAME: box_choice->value(4); break;
+ case FL_EMBOSSED_FRAME: box_choice->value(5); break;
+ case FL_BORDER_FRAME: box_choice->value(6); break;
+ // ---
+ case FL_UP_BOX: box_choice->value(7); break;
+ case FL_DOWN_BOX: box_choice->value(8); break;
+ case FL_FLAT_BOX: box_choice->value(9); break;
+ case FL_THIN_UP_BOX: box_choice->value(10); break;
+ case FL_THIN_DOWN_BOX: box_choice->value(11); break;
+ case FL_BORDER_BOX: box_choice->value(12); break;
+ case FL_NO_BOX: box_choice->value(13); break;
+ default: box_choice->value(1); break;
+}
+
+// color()
+{
+ char s[80];
+ sprintf(s, "\#%08x", G_tty->color());
+ color_input->value(s);
+}
+
+// textfg/bgcolor()
+{
+ char s[80];
+ sprintf(s, "\#%08x", G_tty->textfgcolor());
+ textfgcolor_input->value(s);
+ sprintf(s, "\#%08x", G_tty->textbgcolor());
+ textbgcolor_input->value(s);
+}
+
+// cursorfg/bg color
+{
+ char s[80];
+ sprintf(s, "\#%08x", G_tty->cursorfgcolor()); cursorfgcolor_input->value(s);
+ sprintf(s, "\#%08x", G_tty->cursorbgcolor()); cursorbgcolor_input->value(s);
+}
+
+// Margins
+{
+ int lt = G_tty->margin_left();
+ int rt = G_tty->margin_right();
+ int top = G_tty->margin_top();
+ int bot = G_tty->margin_bottom();
+ char s[100];
+ sprintf(s, "%d, %d, %d, %d", lt,rt,top,bot);
+ margins_input->value(s);
+}
+
+// selectionfg/bgcolor()
+{
+ char s[80];
+ sprintf(s, "\#%08x", G_tty->selectionfgcolor());
+ selectionfgcolor_input->value(s);
+ sprintf(s, "\#%08x", G_tty->selectionbgcolor());
+ selectionbgcolor_input->value(s);
+}} {}
+ }
+ Function {make_window()} {open
+ } {
+ Fl_Window win {
+ label {Fl_Terminal Test}
+ callback {exit(0);} open selected
+ xywh {0 0 772 863} type Double visible
+ } {
+ Fl_Spinner scrollhistory_input {
+ label {Scroll History}
+ callback {int val = int(scrollhistory_input->value() + .5);
+G_tty->history_rows(val);}
+ tooltip {Scrollback history size.
+10,000 max.} xywh {115 10 115 20} labelsize 12 minimum 0 maximum 10000 textsize 12
+ }
+ Fl_Spinner fontsize_input {
+ label {Font Size}
+ callback {int val = int(fontsize_input->value() + .5);
+G_tty->textsize(val);}
+ xywh {115 38 115 20} labelsize 12 textsize 12
+ }
+ Fl_Spinner scrollbarsize_input {
+ label {Scrollbar Size}
+ callback {int val = int(scrollbarsize_input->value() + .5);
+G_tty->scrollbar_size(val); G_tty->redraw();}
+ tooltip {Size of scrollbar width in pixels} xywh {115 67 115 20} labelsize 12 textsize 12
+ }
+ Fl_Spinner redraw_rate_spinner {
+ label {Min Redraw Time}
+ callback {float rate = float(redraw_rate_spinner->value());
+//printf("Setting redraw rate to %.2f\\n", rate);
+G_tty->redraw_rate(rate);}
+ tooltip {Minimum time between redraws
+Default is 0.10 secs.} xywh {115 94 115 20} type Float labelsize 12 minimum 0.05 maximum 5 step 0.1 textsize 12
+ }
+ Fl_Choice scheme_widget {
+ label scheme open
+ tooltip Scheme xywh {115 120 115 23} down_box BORDER_BOX labelsize 12 textsize 12
+ class Fl_Scheme_Choice
+ } {}
+ Fl_Choice box_choice {
+ label {box()} open
+ tooltip {The border box for the Fl_Terminal} xywh {115 147 115 23} down_box BORDER_BOX labelsize 12 textsize 12
+ } {
+ MenuItem {} {
+ label FL_UP_FRAME
+ user_data FL_UP_FRAME user_data_type long
+ callback {G_tty->box(FL_UP_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_DOWN_FRAME
+ user_data FL_DOWN_FRAME user_data_type long
+ callback {G_tty->box(FL_DOWN_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_THIN_UP_FRAME
+ user_data FL_THIN_UP_FRAME user_data_type long
+ callback {G_tty->box(FL_THIN_UP_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_THIN_DOWN_FRAME
+ user_data FL_THIN_DOWN_FRAME user_data_type long
+ callback {G_tty->box(FL_THIN_DOWN_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_ENGRAVED_FRAME
+ user_data FL_ENGRAVED_FRAME user_data_type long
+ callback {G_tty->box(FL_ENGRAVED_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_EMBOSSED_FRAME
+ user_data FL_EMBOSSED_FRAME user_data_type long
+ callback {G_tty->box(FL_EMBOSSED_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_BORDER_FRAME
+ user_data FL_BORDER_FRAME user_data_type long
+ callback {G_tty->box(FL_BORDER_FRAME); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8 divider
+ }
+ MenuItem {} {
+ label FL_UP_BOX
+ user_data FL_UP_BOX user_data_type long
+ callback {G_tty->box(FL_UP_BOX); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_DOWN_BOX
+ callback {G_tty->box(FL_DOWN_BOX); G_tty->redraw();}
+ xywh {20 20 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_FLAT_BOX
+ callback {G_tty->box(FL_FLAT_BOX);
+G_tty->redraw();}
+ xywh {30 30 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_THIN_UP_BOX
+ callback {G_tty->box(FL_THIN_UP_BOX); G_tty->redraw();}
+ xywh {40 40 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_THIN_DOWN_BOX
+ callback {G_tty->box(FL_THIN_DOWN_BOX); G_tty->redraw();}
+ xywh {50 50 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_BORDER_BOX
+ callback {G_tty->box(FL_BORDER_BOX); G_tty->redraw();}
+ xywh {0 0 100 20} labelsize 8
+ }
+ MenuItem {} {
+ label FL_NO_BOX
+ callback {G_tty->box(FL_NO_BOX); G_tty->redraw();}
+ xywh {10 10 100 20} labelsize 8
+ }
+ }
+ Fl_Input selectionfgcolor_input {
+ label {selectionfgcolor()}
+ callback {ulong ival;
+const char *val_str = selectionfgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->selectionfgcolor(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {The mouse selection foreground color.
+Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {115 185 115 20} labelsize 10 when 28 textfont 4 textsize 12
+ }
+ Fl_Input selectionbgcolor_input {
+ label {selectionbgcolor()}
+ callback {ulong ival;
+const char *val_str = selectionbgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->selectionbgcolor(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {The mouse selection background color.
+Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {115 210 115 20} labelsize 10 when 28 textfont 4 textsize 12
+ }
+ Fl_Check_Button showunknown_radio {
+ label {show_unknown()}
+ callback {G_tty->show_unknown(showunknown_radio->value() ? true : false);
+G_tty->redraw();}
+ tooltip {Shows unknown escape sequences/unprintable chars as "¿" character} xywh {255 9 105 22} down_box DOWN_BOX labelsize 10
+ }
+ Fl_Check_Button interactivecursor_radio {
+ label {Interactive Cursor}
+ callback {bool val = interactivecursor_radio->value() ? true : false;
+G_tty->interactive_cursor(val);}
+ tooltip {Allow Up/Dn/Lt/Rt keys to move cursor
+when terminal has focus} xywh {365 9 125 22} down_box DOWN_BOX labelsize 10
+ }
+ Fl_Check_Button ansi_radio {
+ label {ansi()}
+ callback {G_tty->ansi(ansi_radio->value() ? true : false);}
+ tooltip {Handle ANSI/xterm escape sequences} xywh {255 30 95 20} down_box DOWN_BOX labelsize 10
+ }
+ Fl_Check_Button stdout_radio {
+ label {Echo tests to stdout}
+ tooltip {Also send test output to stdout} xywh {365 28 121 20} down_box DOWN_BOX labelsize 10
+ }
+ Fl_Box {} {
+ label {Lt, Rt, Top, Bot}
+ xywh {345 50 145 20} labelsize 10
+ }
+ Fl_Input margins_input {
+ label Margins
+ callback {int lt,rt,top,bot;
+const char *val = margins_input->value();
+if (sscanf(val, "%d,%d,%d,%d",&lt,&rt,&top,&bot)!=4) {
+ fl_alert("Margins: expected four comma separated integers");
+ return;
+}
+G_tty->margin_left(lt);
+G_tty->margin_right(rt);
+G_tty->margin_top(top);
+G_tty->margin_bottom(bot);
+G_tty->redraw();}
+ xywh {345 70 145 20} labelsize 12 when 28 textsize 12
+ }
+ Fl_Input color_input {
+ label {color()}
+ callback {ulong ival;
+const char *val_str = color_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->color(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {The widget's background color()
+Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 95 145 20} labelsize 12 when 28 textfont 4 textsize 12
+ }
+ Fl_Input textfgcolor_input {
+ label {textfgcolor()}
+ callback {ulong ival;
+const char *val_str = textfgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->textfgcolor(Fl_Color(ival));
+G_tty->textfgcolor_default(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {The text foreground color.
+Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 120 145 20} labelsize 12 when 28 textfont 4 textsize 12
+ }
+ Fl_Input textbgcolor_input {
+ label {textbgcolor()}
+ callback {ulong ival;
+const char *val_str = textbgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->textbgcolor(Fl_Color(ival));
+G_tty->textbgcolor_default(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {The text background color.
+Can be decimal (e.g. 12) or hex (e.g. \#0c, \#0000000c, etc)} xywh {345 145 145 20} labelsize 12 when 28 textfont 4 textsize 12
+ }
+ Fl_Input cursorfgcolor_input {
+ label {cursorfgcolor()}
+ callback {ulong ival;
+const char *val_str = cursorfgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->cursorfgcolor(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {Foreground color for text under the cursor.} xywh {345 170 145 20} labelsize 12 when 28 textfont 4 textsize 12
+ }
+ Fl_Input cursorbgcolor_input {
+ label {cursorbgcolor()}
+ callback {ulong ival;
+const char *val_str = cursorbgcolor_input->value();
+if (sscanf(val_str, "\#%lx", &ival) != 1)
+ if (sscanf(val_str, "%ld", &ival) != 1) {
+ fl_alert("Illegal color value (can be e.g. '12' or '\#0c', etc)");
+ update_inputs();
+ return;
+}
+G_tty->cursorbgcolor(Fl_Color(ival));
+//DEBUG ::printf("IVAL is %08lx\\n",ival);
+G_tty->redraw();}
+ tooltip {Background color for the cursor.
+This is the cursor block's color} xywh {345 195 145 20} labelsize 12 when 28 textfont 4 textsize 12
+ }
+ Fl_Choice {} {
+ label {Terminal Color}
+ xywh {345 220 145 20} down_box BORDER_BOX labelsize 12 textsize 12
+ } {
+ MenuItem {} {
+ label {White on DarkAmber}
+ callback {G_tty->color(0x30200000);
+G_tty->textfgcolor(0xd0d0d000);
+G_tty->textbgcolor(0xffffffff); // "see through" color
+update_inputs();
+add_lines(50);}
+ xywh {10 10 100 20} labelsize 9
+ }
+ MenuItem {} {
+ label {White on Black}
+ callback {G_tty->textfgcolor(0xd0d0d000);
+G_tty->textbgcolor(0xffffffff);
+G_tty->color(0x00000000);
+update_inputs();
+add_lines(50);}
+ xywh {20 20 100 20} labelsize 9
+ }
+ MenuItem {} {
+ label {Black on White}
+ callback {G_tty->textfgcolor(0x00000000);
+G_tty->textbgcolor(0xd0d0d000);
+G_tty->color(0xd0d0d000);
+update_inputs();
+add_lines(50);}
+ xywh {20 20 100 20} labelsize 9
+ }
+ MenuItem {} {
+ label {Green on Dark Green}
+ callback {G_tty->textfgcolor(0x00d04000);
+G_tty->textbgcolor(0x00200800);
+G_tty->color(0x00200800);
+update_inputs();
+add_lines(50);}
+ xywh {30 30 100 20} labelsize 9
+ }
+ MenuItem {} {
+ label {Orange on Dark Orange}
+ callback {G_tty->textfgcolor(0xd0704000);
+G_tty->textbgcolor(0x20100000);
+G_tty->color(0x20100000);
+update_inputs();
+add_lines(50);}
+ xywh {40 40 100 20} labelsize 9
+ }
+ }
+ Fl_Group {} {
+ label {Terminal Ops}
+ xywh {505 15 120 210} box ENGRAVED_FRAME labelsize 11
+ } {
+ Fl_Button {} {
+ label {Clear Screen}
+ callback {G_tty->append("\\033[H\\033[2J"); // home, cls
+G_tty->redraw();
+// Reset the 'Add +50' line counter to 1
+G_lines = 1;}
+ tooltip {Clear terminal screen.
+Moves what was on the screen to the scroll history.} xywh {520 31 90 25} labelsize 11
+ }
+ Fl_Button {} {
+ label {Clear History}
+ callback {G_tty->append("\\033[3J"); // clr history
+G_tty->redraw();}
+ tooltip {Clear scrollback history.} xywh {520 62 90 25} labelsize 11
+ }
+ Fl_Button {} {
+ label {Reset Terminal}
+ callback {G_tty->append("\\033c"); // reset terminal
+G_tty->redraw();}
+ tooltip {Reset terminal.
+Clears: screen, history, sets default tabstops, etc.} xywh {520 93 90 25} labelsize 11
+ }
+ Fl_Button {} {
+ label {Home Cursor}
+ callback {G_tty->append("\\033[H");}
+ tooltip {Moves cursor to home position (top/left) using ESC[H} xywh {520 124 90 25} labelsize 11
+ }
+ Fl_Button {} {
+ label {Speed Test}
+ callback {speed_test();}
+ tooltip {Runs a full screen random chars/colors
+Shortcut: S} xywh {520 155 90 25} shortcut 0x73 labelsize 11
+ }
+ Fl_Button {} {
+ label {Ring Debug}
+ callback {// Force scroll history to be small so we can see entire ring w/out scrolling
+if (scrollhistory_input->value() > 35) {
+ scrollhistory_input->value(35);
+ scrollhistory_input->do_callback();
+}
+
+// Show debug window
+G_tty->show_ring_debug_window();}
+ tooltip {Show the Fl_Terminal raw ring buffer contents.
+(Warning: This slows the UI and uses continuous cpu until closed)} xywh {520 187 90 25} labelsize 11
+ }
+ }
+ Fl_Group {} {
+ label {Terminal Tests}
+ xywh {640 15 120 210} box ENGRAVED_FRAME labelsize 11
+ } {
+ Fl_Button {} {
+ label {Unicode
+Alignment}
+ callback {unicode_alignment();}
+ tooltip {Show a Unicode screen alignment test
+Checks that troublesome Unicode chars don't cause misalignment} xywh {655 25 90 30} labelsize 9
+ }
+ Fl_Button {} {
+ label {+50 Lines}
+ callback {add_lines(50);}
+ tooltip {Add 50 lines of text to terminal.
+Tests screen history, scrollup} xywh {655 60 90 30} labelsize 9
+ }
+ Fl_Button {} {
+ label {Color Bars}
+ callback {show_colorbars();}
+ tooltip {Show colorbar test
+Tests API for setting colors
+Does *NOT* use ESC codes} xywh {655 95 90 30} labelsize 11
+ }
+ Fl_Box {} {
+ label {Self Tests}
+ xywh {655 167 90 15} labelsize 10
+ }
+ Fl_Button {} {
+ label {@<<}
+ callback {NextEscapeTest(-1);}
+ comment {Move to previous test}
+ tooltip {Reverse through the ESC code self tests
+Shortcut: SHIFT+E} xywh {655 185 40 30} shortcut 0x10065 labelsize 11
+ }
+ Fl_Button {} {
+ label {@>>}
+ callback {NextEscapeTest(1);}
+ comment {Move to next test}
+ tooltip {Advance through the ESC code self tests
+Shortcut: 'e'} xywh {705 185 40 30} shortcut 0x65 labelsize 11
+ }
+ }
+ Fl_Input showfile_input {
+ label {Show File}
+ callback {showfile_input->deactivate(); // causes focus loss?
+command_input->deactivate();
+win->redraw();
+Fl::wait(.01);
+show_file(showfile_input->value());
+showfile_input->activate();
+command_input->activate();
+Fl::focus(showfile_input); // return focus
+win->redraw();}
+ tooltip {Type in the pathname of a file to cat to the screen} xywh {109 250 650 25} labelsize 12 when 10 textfont 4
+ }
+ Fl_Input command_input {
+ label Command
+ callback {showfile_input->deactivate();
+command_input->deactivate(); // causes focus loss?
+win->redraw();
+Fl::wait(.01);
+do_command(command_input->value());
+showfile_input->activate();
+command_input->activate();
+Fl::focus(command_input); // return focus
+win->redraw();}
+ tooltip {Command to run.
+Hit ENTER to run command.
+The command's stdout will appear in terminal.} xywh {109 285 650 25} labelsize 12 when 12 textfont 4
+ }
+ Fl_Group tty {open
+ xywh {10 320 750 530} box DOWN_FRAME color 0
+ class MyTerminal
+ } {}
+ }
+ code {// CTOR
+G_tty = tty; // global access
+G_tty->color(0x30200000); // dark orange (makes true black easy to see)
+G_tty->textsize(12); // smaller text (RGB demo needs this)
+win->resizable(tty);
+command_input->when(FL_WHEN_ENTER_KEY_ALWAYS);
+command_input->take_focus(); // ensure command prompt has keyboard focus on startup
+
+\#ifdef _WIN32
+showfile_input->value("c:\\\\Windows\\\\system.ini");
+command_input->value("dir c:\\\\windows");
+\#else
+showfile_input->value("/etc/login.defs");
+command_input->value("ls -la --color && ping google.com -c 5");
+\#endif
+
+// Sync input vals with widget's current values
+update_inputs();} {}
+ }
+}
+
+decl {////// MAIN //////} {private local
+}
+
+Function {} {open
+} {
+ code {G_tty = NULL;
+Application app; // sets G_tty
+G_app = &app;
+app.show(argc, argv);
+// Run the "firstpage" test
+app.test_firstpage(false);} {}
+}
diff --git a/test/tree.fl b/test/tree.fl
index cb2c8803e..573641535 100644
--- a/test/tree.fl
+++ b/test/tree.fl
@@ -38,7 +38,7 @@ decl {\#include <FL/Fl_Color_Chooser.H>} {public global
decl {\#include <FL/Fl_Text_Display.H>} {public global
}
-decl {\#include <FL/Fl_Simple_Terminal.H>} {public global
+decl {\#include <FL/Fl_Terminal.H>} {public global
}
decl {int G_cb_counter = 0;} {
@@ -1749,7 +1749,7 @@ helpwin->show();}
Fl_Box tty {
label label
xywh {16 571 1014 149} box DOWN_BOX color 0
- class Fl_Simple_Terminal
+ class Fl_Terminal
}
}
code {// Initialize Tree
diff --git a/test/unittest_core.cxx b/test/unittest_core.cxx
index 2d109680f..23e7ab953 100644
--- a/test/unittest_core.cxx
+++ b/test/unittest_core.cxx
@@ -18,8 +18,9 @@
#include <FL/Fl_Group.H>
#include <FL/Fl_Button.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include "../src/Fl_String.H"
+#include <FL/Fl_Preferences.H>
#include <FL/fl_callback_macros.H>
#include <FL/filename.H>
#include <FL/fl_utf8.h>
@@ -374,7 +375,7 @@ TEST(Fl_Callback_Macros, FL_INLINE_CALLBACK) {
*/
class Ut_Core_Test : public Fl_Group {
- Fl_Simple_Terminal *tty;
+ Fl_Terminal *tty;
bool suite_ran_;
public:
@@ -390,7 +391,7 @@ public:
tty(NULL),
suite_ran_(false)
{
- tty = new Fl_Simple_Terminal(x+4, y+4, w-8, h-8, "Unittest Log");
+ tty = new Fl_Terminal(x+4, y+4, w-8, h-8, "Unittest Log");
tty->ansi(true);
end();
Ut_Suite::tty = tty;
diff --git a/test/unittest_simple_terminal.cxx b/test/unittest_simple_terminal.cxx
deleted file mode 100644
index 9e8324926..000000000
--- a/test/unittest_simple_terminal.cxx
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-// Unit tests for the Fast Light Tool Kit (FLTK).
-//
-// Copyright 1998-2022 by Bill Spitzak and others.
-//
-// This library is free software. Distribution and use rights are outlined in
-// the file "COPYING" which should have been included with this file. If this
-// file is missing or damaged, see the license at:
-//
-// https://www.fltk.org/COPYING.php
-//
-// Please see the following page on how to report bugs and issues:
-//
-// https://www.fltk.org/bugs.php
-//
-
-#include "unittests.h"
-
-#include <time.h>
-#include <FL/Fl_Group.H>
-#include <FL/Fl_Simple_Terminal.H>
-
-//
-//------- test the Fl_Simple_Terminal drawing capabilities ----------
-//
-class Ut_Simple_Terminal_Test : public Fl_Group {
- Fl_Simple_Terminal *tty1;
- Fl_Simple_Terminal *tty2;
- Fl_Simple_Terminal *tty3;
- void ansi_test_pattern(Fl_Simple_Terminal *tty) {
- tty->append("\033[30mBlack Courier 14\033[0m Normal text\n"
- "\033[31mRed Courier 14\033[0m Normal text\n"
- "\033[32mGreen Courier 14\033[0m Normal text\n"
- "\033[33mYellow Courier 14\033[0m Normal text\n"
- "\033[34mBlue Courier 14\033[0m Normal text\n"
- "\033[35mMagenta Courier 14\033[0m Normal text\n"
- "\033[36mCyan Courier 14\033[0m Normal text\n"
- "\033[37mWhite Courier 14\033[0m Normal text\n"
- "\033[40mBright Black Courier 14\033[0m Normal text\n"
- "\033[41mBright Red Courier 14\033[0m Normal text\n"
- "\033[42mBright Green Courier 14\033[0m Normal text\n"
- "\033[43mBright Yellow Courier 14\033[0m Normal text\n"
- "\033[44mBright Blue Courier 14\033[0m Normal text\n"
- "\033[45mBright Magenta Courier 14\033[0m Normal text\n"
- "\033[46mBright Cyan Courier 14\033[0m Normal text\n"
- "\033[47mBright White Courier 14\033[0m Normal text\n"
- "\n"
- "\033[31mRed\033[32mGreen\033[33mYellow\033[34mBlue\033[35mMagenta\033[36mCyan\033[37mWhite\033[0m - "
- "\033[31mX\033[32mX\033[33mX\033[34mX\033[35mX\033[36mX\033[37mX\033[0m\n"
- "\033[41mRed\033[42mGreen\033[43mYellow\033[44mBlue\033[45mMagenta\033[46mCyan\033[47mWhite\033[0m - "
- "\033[41mX\033[42mX\033[43mX\033[44mX\033[45mX\033[46mX\033[47mX\033[0m\n");
- }
- void gray_test_pattern(Fl_Simple_Terminal *tty) {
- tty->append("Grayscale Test Pattern\n"
- "--------------------------\n"
- "\033[0m 100% white Courier 14\n"
- "\033[1m 90% white Courier 14\n"
- "\033[2m 80% white Courier 14\n"
- "\033[3m 70% white Courier 14\n"
- "\033[4m 60% white Courier 14\n"
- "\033[5m 50% white Courier 14\n"
- "\033[6m 40% white Courier 14\n"
- "\033[7m 30% white Courier 14\n"
- "\033[8m 20% white Courier 14\n"
- "\033[9m 10% white Courier 14\n"
- "\033[0m");
- }
- static void date_timer_cb(void *data) {
- Fl_Simple_Terminal *tty = (Fl_Simple_Terminal*)data;
- time_t lt = time(NULL);
- tty->printf("The time and date is now: %s", ctime(&lt));
- Fl::repeat_timeout(3.0, date_timer_cb, data);
- }
-public:
- static Fl_Widget *create() {
- return new Ut_Simple_Terminal_Test(UT_TESTAREA_X, UT_TESTAREA_Y, UT_TESTAREA_W, UT_TESTAREA_H);
- }
- Ut_Simple_Terminal_Test(int x, int y, int w, int h)
- : Fl_Group(x, y, w, h) {
- static Fl_Text_Display::Style_Table_Entry my_stable[] = { // 10 entry grayscale
- // Font Color Font Face Font Size ANSI Sequence
- // ---------- ---------------- --------- -------------
- { 0xffffff00, FL_COURIER_BOLD, 14 }, // "\033[0m" 0 white 100%
- { 0xe6e6e600, FL_COURIER_BOLD, 14 }, // "\033[1m" 1 white 90%
- { 0xcccccc00, FL_COURIER_BOLD, 14 }, // "\033[2m" 2 white 80%
- { 0xb3b3b300, FL_COURIER_BOLD, 14 }, // "\033[3m" 3 white 70%
- { 0x99999900, FL_COURIER_BOLD, 14 }, // "\033[4m" 4 white 60%
- { 0x80808000, FL_COURIER_BOLD, 14 }, // "\033[5m" 5 white 50% "\033[0m"
- { 0x66666600, FL_COURIER_BOLD, 14 }, // "\033[6m" 6 white 40%
- { 0x4d4d4d00, FL_COURIER_BOLD, 14 }, // "\033[7m" 7 white 30%
- { 0x33333300, FL_COURIER_BOLD, 14 }, // "\033[8m" 8 white 20%
- { 0x1a1a1a00, FL_COURIER_BOLD, 14 }, // "\033[9m" 9 white 10%
- };
- int tty_h = (int)(h/3.5);
- int tty_y1 = y+(tty_h*0)+20;
- int tty_y2 = y+(tty_h*1)+40;
- int tty_y3 = y+(tty_h*2)+60;
-
- // TTY1
- tty1 = new Fl_Simple_Terminal(x, tty_y1, w, tty_h,"Tty 1: ANSI off");
- tty1->ansi(false);
- Fl::add_timeout(0.5, date_timer_cb, (void*)tty1);
-
- // TTY2
- tty2 = new Fl_Simple_Terminal(x, tty_y2, w, tty_h,"Tty 2: ANSI on");
- tty2->ansi(true);
- ansi_test_pattern(tty2);
- Fl::add_timeout(0.5, date_timer_cb, (void*)tty2);
-
- // TTY3
- tty3 = new Fl_Simple_Terminal(x, tty_y3, w, tty_h, "Tty 3: Grayscale Style Table");
- tty3->style_table(my_stable, sizeof(my_stable), 0);
- tty3->ansi(true);
- gray_test_pattern(tty3);
- Fl::add_timeout(0.5, date_timer_cb, (void*)tty3);
-
- end();
- }
-};
-
-UnitTest simple_terminal(UT_TEST_SIMPLE_TERMINAL, "Simple Terminal", Ut_Simple_Terminal_Test::create);
diff --git a/test/unittest_terminal.cxx b/test/unittest_terminal.cxx
new file mode 100644
index 000000000..0c6aa338b
--- /dev/null
+++ b/test/unittest_terminal.cxx
@@ -0,0 +1,98 @@
+//
+// Unit tests for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2022 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// https://www.fltk.org/COPYING.php
+//
+// Please see the following page on how to report bugs and issues:
+//
+// https://www.fltk.org/bugs.php
+//
+
+#include "unittests.h"
+
+#include <time.h>
+#include <FL/Fl_Group.H>
+#include <FL/Fl_Terminal.H>
+
+//
+//------- test the Fl_Terminal drawing capabilities ----------
+//
+class Ut_Terminal_Test : public Fl_Group {
+ Fl_Terminal *tty1;
+ Fl_Terminal *tty2;
+ void ansi_test_pattern(Fl_Terminal *tty) {
+ tty->append("\033[30mBlack Courier 14\033[0m Normal text\n"
+ "\033[31mRed Courier 14\033[0m Normal text\n"
+ "\033[32mGreen Courier 14\033[0m Normal text\n"
+ "\033[33mYellow Courier 14\033[0m Normal text\n"
+ "\033[34mBlue Courier 14\033[0m Normal text\n"
+ "\033[35mMagenta Courier 14\033[0m Normal text\n"
+ "\033[36mCyan Courier 14\033[0m Normal text\n"
+ "\033[37mWhite Courier 14\033[0m Normal text\n"
+ "\033[1;30mBright Black Courier 14\033[0m Normal text\n"
+ "\033[1;31mBright Red Courier 14\033[0m Normal text\n"
+ "\033[1;32mBright Green Courier 14\033[0m Normal text\n"
+ "\033[1;33mBright Yellow Courier 14\033[0m Normal text\n"
+ "\033[1;34mBright Blue Courier 14\033[0m Normal text\n"
+ "\033[1;35mBright Magenta Courier 14\033[0m Normal text\n"
+ "\033[1;36mBright Cyan Courier 14\033[0m Normal text\n"
+ "\033[1;37mBright White Courier 14\033[0m Normal text\n"
+ "\n"
+ "\033[31mRed\033[32mGreen\033[33mYellow\033[34mBlue\033[35mMagenta\033[36mCyan\033[37mWhite\033[0m - "
+ "\033[31mX\033[32mX\033[33mX\033[34mX\033[35mX\033[36mX\033[37mX\033[0m\n"
+ "\033[1;31mRed\033[1;32mGreen\033[1;33mYellow\033[34mBlue\033[35mMagenta\033[36mCyan\033[1;37mWhite\033[1;0m - "
+ "\033[1;31mX\033[1;32mX\033[1;33mX\033[1;34mX\033[1;35mX\033[1;36mX\033[1;37mX\033[0m\n");
+ }
+ void gray_test_pattern(Fl_Terminal *tty) {
+ tty->append("Grayscale Test Pattern\n"
+ "--------------------------\n"
+ "\033[38;2;255;255;255m 100% white Courier 14\n" // ESC xterm codes for setting r;g;b colors
+ "\033[38;2;230;230;230m 90% white Courier 14\n"
+ "\033[38;2;205;205;205m 80% white Courier 14\n"
+ "\033[38;2;179;179;179m 70% white Courier 14\n"
+ "\033[38;2;154;154;154m 60% white Courier 14\n"
+ "\033[38;2;128;128;128m 50% white Courier 14\n"
+ "\033[38;2;102;102;102m 40% white Courier 14\n"
+ "\033[38;2;77;77;77m" " 30% white Courier 14\n"
+ "\033[38;2;51;51;51m" " 20% white Courier 14\n"
+ "\033[38;2;26;26;26m" " 10% white Courier 14\n"
+ "\033[38;2;0;0;0m" " 0% white Courier 14\n"
+ "\033[0m");
+ }
+ static void date_timer_cb(void *data) {
+ Fl_Terminal *tty = (Fl_Terminal*)data;
+ time_t lt = time(NULL);
+ tty->printf("The time and date is now: %s", ctime(&lt));
+ Fl::repeat_timeout(3.0, date_timer_cb, data);
+ }
+public:
+ static Fl_Widget *create() {
+ return new Ut_Terminal_Test(UT_TESTAREA_X, UT_TESTAREA_Y, UT_TESTAREA_W, UT_TESTAREA_H);
+ }
+ Ut_Terminal_Test(int x, int y, int w, int h)
+ : Fl_Group(x, y, w, h) {
+ int tty_h = (int)(h/2.25+.5);
+ int tty_y1 = y+(tty_h*0)+20;
+ int tty_y2 = y+(tty_h*1)+40;
+
+ // TTY1
+ tty1 = new Fl_Terminal(x, tty_y1, w, tty_h,"Tty 1: Colors");
+ ansi_test_pattern(tty1);
+ Fl::add_timeout(0.5, date_timer_cb, (void*)tty1);
+
+ // TTY2
+ tty2 = new Fl_Terminal(x, tty_y2, w, tty_h,"Tty 2: Grayscale");
+ gray_test_pattern(tty2);
+ Fl::add_timeout(0.5, date_timer_cb, (void*)tty2);
+
+ end();
+ }
+};
+
+UnitTest simple_terminal(UT_TEST_SIMPLE_TERMINAL, "Terminal", Ut_Terminal_Test::create);
diff --git a/test/unittests.cxx b/test/unittests.cxx
index b9103feb5..4783c223e 100644
--- a/test/unittests.cxx
+++ b/test/unittests.cxx
@@ -29,7 +29,7 @@
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Hold_Browser.H>
#include <FL/Fl_Help_View.H>
-#include <FL/Fl_Simple_Terminal.H>
+#include <FL/Fl_Terminal.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H> // fl_text_extents()
@@ -181,7 +181,7 @@ int Ut_Suite::num_failed_ = 0;
const char *Ut_Suite::red = "\033[31m";
const char *Ut_Suite::green = "\033[32m";
const char *Ut_Suite::normal = "\033[0m";
-Fl_Simple_Terminal *Ut_Suite::tty = NULL;
+Fl_Terminal *Ut_Suite::tty = NULL;
/** Switch the user of color escape sequnces in the log text. */
void Ut_Suite::color(int v) {
diff --git a/test/unittests.h b/test/unittests.h
index babecde64..ab55c48af 100644
--- a/test/unittests.h
+++ b/test/unittests.h
@@ -22,7 +22,7 @@
#include <stdarg.h>
-class Fl_Simple_Terminal;
+class Fl_Terminal;
// WINDOW/WIDGET SIZES
const int UT_MAINWIN_W = 700; // main window w()
@@ -153,7 +153,7 @@ public:
static const char *red;
static const char *green;
static const char *normal;
- static Fl_Simple_Terminal *tty;
+ static Fl_Terminal *tty;
};
#define UT_CONCAT_(prefix, suffix) prefix##suffix
diff --git a/test/valuators.fl b/test/valuators.fl
index a8dcff87f..8b40eaef1 100644
--- a/test/valuators.fl
+++ b/test/valuators.fl
@@ -2,7 +2,7 @@
version 1.0400
header_name {.h}
code_name {.cxx}
-decl {\#include <FL/Fl_Simple_Terminal.H>} {public global
+decl {\#include <FL/Fl_Terminal.H>} {public global
}
Function {} {open
@@ -232,9 +232,9 @@ Function {} {open
xywh {460 385 110 115} box BORDER_FRAME color 0 selection_color 0 labelsize 11 align 128
}
Fl_Box tty {selected
- xywh {10 513 560 117} color 0
+ xywh {10 513 560 117} box DOWN_BOX color 0
code0 {o->ansi(true);}
- class Fl_Simple_Terminal
+ class Fl_Terminal
}
}
}
@@ -242,7 +242,7 @@ Function {} {open
Function {callback(Fl_Widget* o, void*)} {open return_type void
} {
code {const char *name = (const char*)(o->user_data() ? o->user_data() : "???");
-tty->printf("callback(): %s value() = \\033[2m%g\\033[0m\\n",
+tty->printf("callback(): %s value() = \\033[1m%g\\033[0m\\n",
name, ((Fl_Valuator*)o)->value());} {}
}
@@ -250,6 +250,6 @@ Function {callback_spinner(Fl_Widget* o, void*)} {
comment {Spinner doesn't derive from Fl_Valuator..} open return_type void
} {
code {const char *name = (const char*)(o->user_data() ? o->user_data() : "???");
-tty->printf("callback(): %s value() = \\033[2m%g\\033[0m\\n",
+tty->printf("callback(): %s value() = \\033[1m%g\\033[0m\\n",
name, ((Fl_Spinner*)o)->value());} {}
}