Inspired by Simon Ford's "Terminal" library, this is a clean-room reimplementation that supports a larger set of the ANSI escape sequences and includes a few handy drawing routines. Useful for making console UIs for your projects. The box-drawing stuff requires your terminal to be set to codepage 850.
Fork of ANSITerm by
ANSITerm.h@1:e3403c93f864, 2012-09-23 (annotated)
- Committer:
- dansummers
- Date:
- Sun Sep 23 23:28:27 2012 +0000
- Revision:
- 1:e3403c93f864
- Parent:
- 0:863811463610
Added symbols to name each glyph in a boxdraw style.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dansummers | 0:863811463610 | 1 | /** |
dansummers | 0:863811463610 | 2 | * @file ANSITerm.h |
dansummers | 0:863811463610 | 3 | * @author Dan Summers [ https://mbed.org/users/dansummers ] |
dansummers | 0:863811463610 | 4 | * @date 20120918 |
dansummers | 0:863811463610 | 5 | */ |
dansummers | 0:863811463610 | 6 | /* |
dansummers | 0:863811463610 | 7 | Copyright (c) 2012 dansummers |
dansummers | 0:863811463610 | 8 | |
dansummers | 0:863811463610 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of |
dansummers | 0:863811463610 | 10 | this software and associated documentation files (the "Software"), to deal in |
dansummers | 0:863811463610 | 11 | the Software without restriction, including without limitation the rights to |
dansummers | 0:863811463610 | 12 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
dansummers | 0:863811463610 | 13 | of the Software, and to permit persons to whom the Software is furnished to do |
dansummers | 0:863811463610 | 14 | so, subject to the following conditions: |
dansummers | 0:863811463610 | 15 | |
dansummers | 0:863811463610 | 16 | The above copyright notice and this permission notice shall be included in all |
dansummers | 0:863811463610 | 17 | copies or substantial portions of the Software. |
dansummers | 0:863811463610 | 18 | |
dansummers | 0:863811463610 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
dansummers | 0:863811463610 | 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
dansummers | 0:863811463610 | 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
dansummers | 0:863811463610 | 22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
dansummers | 0:863811463610 | 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
dansummers | 0:863811463610 | 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
dansummers | 0:863811463610 | 25 | SOFTWARE. |
dansummers | 0:863811463610 | 26 | */ |
dansummers | 0:863811463610 | 27 | |
dansummers | 0:863811463610 | 28 | #ifndef _ANSITERM_ |
dansummers | 0:863811463610 | 29 | #define _ANSITERM_ |
dansummers | 0:863811463610 | 30 | |
dansummers | 0:863811463610 | 31 | #define _ANSITERM_CP850_ /* Use CodePage 850 for box-drawing. */ |
dansummers | 0:863811463610 | 32 | |
dansummers | 0:863811463610 | 33 | #include "mbed.h" |
dansummers | 0:863811463610 | 34 | |
dansummers | 0:863811463610 | 35 | /** ANSI Terminal control library, inheriting from Serial. |
dansummers | 0:863811463610 | 36 | * |
dansummers | 0:863811463610 | 37 | * ANSITerm encapsulates a large portion of the ANSI escape sequence set, |
dansummers | 0:863811463610 | 38 | * so that a user unfamiliar with the escape sequences can manipulate the |
dansummers | 0:863811463610 | 39 | * terminal. It also provides a tidy point of abstraction, should it be |
dansummers | 0:863811463610 | 40 | * necessary to support multiple different escape sets in the future. |
dansummers | 0:863811463610 | 41 | * |
dansummers | 0:863811463610 | 42 | * ANSITerm assumes that the terminal being manipulated implements the |
dansummers | 0:863811463610 | 43 | * ANSI-standard escapes. The terminal is divided into cells, each one |
dansummers | 0:863811463610 | 44 | * the size of a character (a typical "default" terminal will have 25 rows of |
dansummers | 0:863811463610 | 45 | * cells, each with 80 character cells in it, but this will change if the |
dansummers | 0:863811463610 | 46 | * terminal is resized.) |
dansummers | 0:863811463610 | 47 | * |
dansummers | 0:863811463610 | 48 | * The box-drawing functions currently assume that the terminal is using |
dansummers | 0:863811463610 | 49 | * CodePage 850 to interpret received characters. It is untested under |
dansummers | 0:863811463610 | 50 | * UNIX and MacOS (fixing this is on the TODO list). |
dansummers | 0:863811463610 | 51 | * |
dansummers | 0:863811463610 | 52 | * Example: |
dansummers | 0:863811463610 | 53 | * @code |
dansummers | 0:863811463610 | 54 | * terminal.clear_screen(); |
dansummers | 0:863811463610 | 55 | * terminal.hide_cursor(); |
dansummers | 0:863811463610 | 56 | * terminal.set_display_style(ANSITerm::SGR_NONE); |
dansummers | 0:863811463610 | 57 | * terminal.set_text_colour(ANSITerm::SGR_RED); |
dansummers | 0:863811463610 | 58 | * terminal.draw_box(3,3,19,5,ANSITerm::simple,false); |
dansummers | 0:863811463610 | 59 | * terminal.set_text_colour(ANSITerm::SGR_WHITE); |
dansummers | 0:863811463610 | 60 | * terminal.set_display_style(ANSITerm::SGR_BOLD); |
dansummers | 0:863811463610 | 61 | * terminal.set_cursor_position(5,4); |
dansummers | 0:863811463610 | 62 | * terminal.printf("ANSI Terminal"); |
dansummers | 0:863811463610 | 63 | * @endcode |
dansummers | 0:863811463610 | 64 | */ |
dansummers | 0:863811463610 | 65 | class ANSITerm : public Serial |
dansummers | 0:863811463610 | 66 | { |
dansummers | 0:863811463610 | 67 | public: |
dansummers | 0:863811463610 | 68 | /* Internal buffer for the SGR style flagset currently in use. */ |
dansummers | 0:863811463610 | 69 | char current_style; |
dansummers | 0:863811463610 | 70 | |
dansummers | 0:863811463610 | 71 | /** SGR "flag" indicating the default text style. */ |
dansummers | 0:863811463610 | 72 | const static char SGR_NONE = 0; |
dansummers | 0:863811463610 | 73 | |
dansummers | 0:863811463610 | 74 | /** SGR flag to request bold text. */ |
dansummers | 0:863811463610 | 75 | const static char SGR_BOLD = 1; |
dansummers | 0:863811463610 | 76 | |
dansummers | 0:863811463610 | 77 | /** SGR flag to request faint text. */ |
dansummers | 0:863811463610 | 78 | const static char SGR_FAINT = 2; |
dansummers | 0:863811463610 | 79 | |
dansummers | 0:863811463610 | 80 | /** SGR flag to request italic text. */ |
dansummers | 0:863811463610 | 81 | const static char SGR_ITALIC = 4; |
dansummers | 0:863811463610 | 82 | |
dansummers | 0:863811463610 | 83 | /** SGR flag to request underlined text. */ |
dansummers | 0:863811463610 | 84 | const static char SGR_UNDERLINE = 8; |
dansummers | 0:863811463610 | 85 | |
dansummers | 0:863811463610 | 86 | /** SGR flag to request slow-blinking text (not always supported). */ |
dansummers | 0:863811463610 | 87 | const static char SGR_BLINK_SLOW = 16; |
dansummers | 0:863811463610 | 88 | |
dansummers | 0:863811463610 | 89 | /** SGR flag to request fast-flashing text (not always supported). */ |
dansummers | 0:863811463610 | 90 | const static char SGR_BLINK_RAPID = 32; |
dansummers | 0:863811463610 | 91 | |
dansummers | 0:863811463610 | 92 | /** SGR flag to request inverse-video. */ |
dansummers | 0:863811463610 | 93 | const static char SGR_IMAGE_NEGATIVE = 64; /* Switch on inverse video */ |
dansummers | 0:863811463610 | 94 | |
dansummers | 0:863811463610 | 95 | /** SGR flag to request struck-through text (not commonly supported).*/ |
dansummers | 0:863811463610 | 96 | const static char SGR_CROSSED_OUT = 128; |
dansummers | 0:863811463610 | 97 | |
dansummers | 0:863811463610 | 98 | /* SGR colours */ |
dansummers | 0:863811463610 | 99 | /** SGR colour indicator for ANSI Black.*/ |
dansummers | 0:863811463610 | 100 | const static char SGR_BLACK = 1; //30 |
dansummers | 0:863811463610 | 101 | |
dansummers | 0:863811463610 | 102 | /** SGR colour indicator for ANSI Red.*/ |
dansummers | 0:863811463610 | 103 | const static char SGR_RED = 2; //31 |
dansummers | 0:863811463610 | 104 | |
dansummers | 0:863811463610 | 105 | /** SGR colour indicator for ANSI Green.*/ |
dansummers | 0:863811463610 | 106 | const static char SGR_GREEN = 4; //32 |
dansummers | 0:863811463610 | 107 | |
dansummers | 0:863811463610 | 108 | /** SGR colour indicator for ANSI Yellow.*/ |
dansummers | 0:863811463610 | 109 | const static char SGR_YELLOW = 8; //33 |
dansummers | 0:863811463610 | 110 | |
dansummers | 0:863811463610 | 111 | /** SGR colour indicator for ANSI Blue.*/ |
dansummers | 0:863811463610 | 112 | const static char SGR_BLUE = 16; //34 |
dansummers | 0:863811463610 | 113 | |
dansummers | 0:863811463610 | 114 | /** SGR colour indicator for ANSI Magenta.*/ |
dansummers | 0:863811463610 | 115 | const static char SGR_MAGENTA = 32; //35 |
dansummers | 0:863811463610 | 116 | |
dansummers | 0:863811463610 | 117 | /** SGR colour indicator for ANSI Cyan.*/ |
dansummers | 0:863811463610 | 118 | const static char SGR_CYAN = 64; //36 |
dansummers | 0:863811463610 | 119 | |
dansummers | 0:863811463610 | 120 | /** SGR colour indicator for ANSI White.*/ |
dansummers | 0:863811463610 | 121 | const static char SGR_WHITE = 128; //37 |
dansummers | 0:863811463610 | 122 | |
dansummers | 0:863811463610 | 123 | /* Box styles */ |
dansummers | 1:e3403c93f864 | 124 | const static char BOXDRAW_TOPLEFT = 0; |
dansummers | 1:e3403c93f864 | 125 | const static char BOXDRAW_TOPRIGHT = 1; |
dansummers | 1:e3403c93f864 | 126 | const static char BOXDRAW_BOTTOMLEFT = 2; |
dansummers | 1:e3403c93f864 | 127 | const static char BOXDRAW_BOTTOMRIGHT = 3; |
dansummers | 1:e3403c93f864 | 128 | const static char BOXDRAW_HORIZONTAL = 4; |
dansummers | 1:e3403c93f864 | 129 | const static char BOXDRAW_VERTICAL = 5; |
dansummers | 1:e3403c93f864 | 130 | const static char BOXDRAW_UPTEE = 6; |
dansummers | 1:e3403c93f864 | 131 | const static char BOXDRAW_DOWNTEE = 7; |
dansummers | 1:e3403c93f864 | 132 | const static char BOXDRAW_LEFTTEE = 8; |
dansummers | 1:e3403c93f864 | 133 | const static char BOXDRAW_RIGHTTEE = 9; |
dansummers | 1:e3403c93f864 | 134 | const static char BOXDRAW_CROSS = 10; |
dansummers | 0:863811463610 | 135 | #ifdef _ANSITERM_CP850_ |
dansummers | 1:e3403c93f864 | 136 | /** Box-drawing style using pluses, minuses and pipes (low-ASCII, should work anywhere).*/ |
dansummers | 1:e3403c93f864 | 137 | static const char simple[11]; |
dansummers | 1:e3403c93f864 | 138 | |
dansummers | 0:863811463610 | 139 | /** Box-drawing style using ASCII two-line box-drawing characters. */ |
dansummers | 0:863811463610 | 140 | static const char two_lines[11]; |
dansummers | 0:863811463610 | 141 | |
dansummers | 0:863811463610 | 142 | /** Box-drawing style using ASCII one-line box-drawing characters. */ |
dansummers | 0:863811463610 | 143 | static const char one_line[11]; |
dansummers | 0:863811463610 | 144 | #endif |
dansummers | 0:863811463610 | 145 | |
dansummers | 0:863811463610 | 146 | ANSITerm(PinName tx, PinName rx); |
dansummers | 0:863811463610 | 147 | |
dansummers | 0:863811463610 | 148 | /* Emit a Control Sequence Initiator (which is the header for an ANSI escape sequence). */ |
dansummers | 0:863811463610 | 149 | inline void ansi_csi() { this->putc(0x1B); this->putc('['); } |
dansummers | 0:863811463610 | 150 | /* Cursor Up by n rows. */ |
dansummers | 0:863811463610 | 151 | inline void ansi_cuu(int n) { this->printf("%dA", n); } |
dansummers | 0:863811463610 | 152 | /* Cursor Down by n rows. */ |
dansummers | 0:863811463610 | 153 | inline void ansi_cud(int n) { this->printf("%dB", n); } |
dansummers | 0:863811463610 | 154 | /* Cursor Forward by n columns. */ |
dansummers | 0:863811463610 | 155 | inline void ansi_cuf(int n) { this->printf("%dC", n); } |
dansummers | 0:863811463610 | 156 | /* Cursor Back by n columns. */ |
dansummers | 0:863811463610 | 157 | inline void ansi_cub(int n) { this->printf("%dD", n); } |
dansummers | 0:863811463610 | 158 | /* Cursor Next Line (moves the cursor to the start of the line n lines down). */ |
dansummers | 0:863811463610 | 159 | inline void ansi_cnl(int n) { this->printf("%dE", n); } |
dansummers | 0:863811463610 | 160 | /* Cursor Previous Line (moves the cursor to the start of the line n lines up). */ |
dansummers | 0:863811463610 | 161 | inline void ansi_cpl(int n) { this->printf("%dF", n); } |
dansummers | 0:863811463610 | 162 | /* Cursor Horizontal Absolute (moves the cursor to column n). */ |
dansummers | 0:863811463610 | 163 | inline void ansi_cha(int n) { this->printf("%dG", n); } |
dansummers | 0:863811463610 | 164 | /* Cursor Position (positions the cursor at column x, row y, on a 1-based grid starting top-left). */ |
dansummers | 0:863811463610 | 165 | inline void ansi_cup(int x, int y) { this->printf("%d;%dH", y, x); } |
dansummers | 0:863811463610 | 166 | /* Erase Data (0 = from cursor to end of screen, 1 = from cursor to beginning of screen, 2 = entire screen) */ |
dansummers | 0:863811463610 | 167 | inline void ansi_ed(int n) { this->printf("%dJ", n); } |
dansummers | 0:863811463610 | 168 | /* Erase in Line (0 = from cursor to end of screen, 1 = from cursor to beginning of screen, 2 = entire screen) */ |
dansummers | 0:863811463610 | 169 | inline void ansi_el(int n) { this->printf("%dK", n); } |
dansummers | 0:863811463610 | 170 | /* Scroll Up by n lines. */ |
dansummers | 0:863811463610 | 171 | inline void ansi_su(int n) { this->printf("%dS", n); } |
dansummers | 0:863811463610 | 172 | /* Scroll Down by n lines. */ |
dansummers | 0:863811463610 | 173 | inline void ansi_sd(int n) { this->printf("%dT", n); } |
dansummers | 0:863811463610 | 174 | /* Horizontal and Vertical Position (positions the cursor at column x, row y, on a 1-based grid starting top-left). */ |
dansummers | 0:863811463610 | 175 | inline void ansi_hvp(int y, int x) { this->printf("%d;%dH", y, x); } |
dansummers | 0:863811463610 | 176 | /* Save Cursor Position */ |
dansummers | 0:863811463610 | 177 | inline void ansi_scp() { this->putc('s'); } |
dansummers | 0:863811463610 | 178 | /* Restore Cursor Position */ |
dansummers | 0:863811463610 | 179 | inline void ansi_rcp() { this->putc('u'); } |
dansummers | 0:863811463610 | 180 | /*DEC Terminal Cursor Enable Mode - hide cursor */ |
dansummers | 0:863811463610 | 181 | inline void ansi_dectcem_hide() { this->printf("?25l"); } |
dansummers | 0:863811463610 | 182 | /*DEC Terminal Cursor Enable Mode - show cursor */ |
dansummers | 0:863811463610 | 183 | inline void ansi_dectcem_show() { this->printf("?25h"); } |
dansummers | 0:863811463610 | 184 | |
dansummers | 0:863811463610 | 185 | /* Select Graphic Rendition - Make the output bold, underlined, coloured... all manner of things.*/ |
dansummers | 0:863811463610 | 186 | /* |
dansummers | 0:863811463610 | 187 | reset = 1 to reset to defaults. 0 to read and apply the rest of the inputs. |
dansummers | 0:863811463610 | 188 | text_style is an OR of SGR_{BOLD,FAINT,ITALIC,UNDERLINE,BLINK_SLOW,BLINK_RAPID,IMAGE_NEGATIVE,CROSSED_OUT} |
dansummers | 0:863811463610 | 189 | text_colour is one of SGR_{BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE} |
dansummers | 0:863811463610 | 190 | background_colour is one of SGR_{BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHITE} |
dansummers | 0:863811463610 | 191 | */ |
dansummers | 0:863811463610 | 192 | void ansi_sgr(bool reset, char text_style, char text_colour, char background_colour); |
dansummers | 0:863811463610 | 193 | |
dansummers | 0:863811463610 | 194 | /* Device Status Report (Returns CSIn;mR, where n,m is the coordinates of the cursor). */ |
dansummers | 0:863811463610 | 195 | void ansi_dsr(int* x_coord, int* y_coord); |
dansummers | 0:863811463610 | 196 | |
dansummers | 0:863811463610 | 197 | /** Position the cursor at the requested coordinates, relative to the terminal frame. |
dansummers | 0:863811463610 | 198 | * Coordinates are calculated from the top left of the frame, using character |
dansummers | 0:863811463610 | 199 | * cells as the unit, and start at an origin of (1,1). |
dansummers | 0:863811463610 | 200 | * @param x_coord the x-coordinate (column number) in which to place the cursor, starting at 1. |
dansummers | 0:863811463610 | 201 | * @param y_coord the y coordinate (row number) in which to place the cursor, starting at 1. |
dansummers | 0:863811463610 | 202 | */ |
dansummers | 0:863811463610 | 203 | inline void set_cursor_position(int x_coord, int y_coord) |
dansummers | 0:863811463610 | 204 | { |
dansummers | 0:863811463610 | 205 | this->ansi_csi(); |
dansummers | 0:863811463610 | 206 | this->ansi_cup(x_coord, y_coord); |
dansummers | 0:863811463610 | 207 | } |
dansummers | 0:863811463610 | 208 | |
dansummers | 0:863811463610 | 209 | /** Get the current position of the cursor, relative to the terminal frame. |
dansummers | 0:863811463610 | 210 | * Coordinates are calculated from the top left of the frame, using character |
dansummers | 0:863811463610 | 211 | * cells as the unit, and start at an origin of (1,1). |
dansummers | 0:863811463610 | 212 | * @param x_coord A pointer into which the current x-coordinate of the cursor should be written. |
dansummers | 0:863811463610 | 213 | * @param y_coord A pointer into which the current y-coordinate of the cursor should be written. |
dansummers | 0:863811463610 | 214 | */ |
dansummers | 0:863811463610 | 215 | inline void get_cursor_position(int* x_coord, int* y_coord) |
dansummers | 0:863811463610 | 216 | { |
dansummers | 0:863811463610 | 217 | this->ansi_csi(); |
dansummers | 0:863811463610 | 218 | this->ansi_dsr(x_coord, y_coord); |
dansummers | 0:863811463610 | 219 | } |
dansummers | 0:863811463610 | 220 | |
dansummers | 0:863811463610 | 221 | /** Blank all cells on the screen. |
dansummers | 0:863811463610 | 222 | */ |
dansummers | 0:863811463610 | 223 | inline void clear_screen() |
dansummers | 0:863811463610 | 224 | { |
dansummers | 0:863811463610 | 225 | this->ansi_csi(); |
dansummers | 0:863811463610 | 226 | this->ansi_ed(2); |
dansummers | 0:863811463610 | 227 | } |
dansummers | 0:863811463610 | 228 | |
dansummers | 0:863811463610 | 229 | /** Draw a box with these top-left and bottom-right points. Various styling options exist. |
dansummers | 0:863811463610 | 230 | * @param x1 The x-coordinate of the top-left point. |
dansummers | 0:863811463610 | 231 | * @param y1 The y-coordinate of the top-left point. |
dansummers | 0:863811463610 | 232 | * @param x2 The x-coordinate of the bottom-right point. |
dansummers | 0:863811463610 | 233 | * @param style The style of box-drawing to use (an 11-cell array of glyphs to use: three sets are defined above). |
dansummers | 0:863811463610 | 234 | * The styles are stored as arrays of eleven glyphs, with the following descriptive names: |
dansummers | 0:863811463610 | 235 | * [0]top-left corner, [1]top-right corner, [2]bottom-left corner, [3]bottom-right corner, |
dansummers | 0:863811463610 | 236 | * [4]horizontal bar, [5]vertical bar, |
dansummers | 0:863811463610 | 237 | * [6]upward-pointing tee, [7]downward-pointing tee, [8]left-pointing tee, [9]right-pointing tee, |
dansummers | 0:863811463610 | 238 | * [10]cross |
dansummers | 0:863811463610 | 239 | * @param clear_inner If true, the space contained within the box will be overwritten with space characters. If not, it will be unmodified. |
dansummers | 0:863811463610 | 240 | */ |
dansummers | 0:863811463610 | 241 | void draw_box(int x1, int y1, int x2, int y2, const char* style, bool clear_inner); |
dansummers | 0:863811463610 | 242 | |
dansummers | 0:863811463610 | 243 | /** Draw a box containing these top-left and bottom-right points. Various styling options exist. |
dansummers | 0:863811463610 | 244 | * @param x1 The x-coordinate of the top-left point. |
dansummers | 0:863811463610 | 245 | * @param y1 The y-coordinate of the top-left point. |
dansummers | 0:863811463610 | 246 | * @param x2 The x-coordinate of the bottom-right point. |
dansummers | 0:863811463610 | 247 | * @param style The style of box-drawing to use (an 11-cell array of glyphs to use: three sets are defined above). |
dansummers | 0:863811463610 | 248 | * The styles are stored as arrays of eleven glyphs, with the following descriptive names: |
dansummers | 0:863811463610 | 249 | * [0]top-left corner, [1]top-right corner, [2]bottom-left corner, [3]bottom-right corner, |
dansummers | 0:863811463610 | 250 | * [4]horizontal bar, [5]vertical bar, |
dansummers | 0:863811463610 | 251 | * [6]upward-pointing tee, [7]downward-pointing tee, [8]left-pointing tee, [9]right-pointing tee, |
dansummers | 0:863811463610 | 252 | * [10]cross |
dansummers | 0:863811463610 | 253 | * @param clear_inner If true, the space contained within the box will be overwritten with space characters. If not, it will be unmodified. |
dansummers | 0:863811463610 | 254 | * |
dansummers | 0:863811463610 | 255 | * draw_enclosing_box differs from draw_box because it draws around a space |
dansummers | 0:863811463610 | 256 | * rather than inscribing it. If draw_box and draw_enclosing_box are given |
dansummers | 0:863811463610 | 257 | * the same parameters, they will draw concentric boxes and the box from |
dansummers | 0:863811463610 | 258 | * draw_box will be two cells smaller in both dimensions. |
dansummers | 0:863811463610 | 259 | */ |
dansummers | 0:863811463610 | 260 | inline void draw_enclosing_box(int x1, int y1, int x2, int y2, const char* style, bool clear_inner) |
dansummers | 0:863811463610 | 261 | { |
dansummers | 0:863811463610 | 262 | draw_box((x1-1), (y1-1), (x2+1), (y2+1), style, clear_inner); |
dansummers | 0:863811463610 | 263 | } |
dansummers | 0:863811463610 | 264 | |
dansummers | 0:863811463610 | 265 | /** Set the SGR display style for subsequent characters. |
dansummers | 0:863811463610 | 266 | * @param style A flagset ORred together from the SGR parameters above. |
dansummers | 0:863811463610 | 267 | * Flags that are set in the flagset will be turned on, |
dansummers | 0:863811463610 | 268 | * flags that are clear will be turned off. |
dansummers | 0:863811463610 | 269 | * |
dansummers | 0:863811463610 | 270 | * Example: |
dansummers | 0:863811463610 | 271 | * @code |
dansummers | 0:863811463610 | 272 | * terminal.printf("Some text."); |
dansummers | 0:863811463610 | 273 | * terminal.set_display_style(SGR_BOLD|SGR_UNDERLINE); |
dansummers | 0:863811463610 | 274 | * terminal.printf("Some very important text!"); |
dansummers | 0:863811463610 | 275 | * terminal.set_display_style(SGR_NONE); |
dansummers | 0:863811463610 | 276 | * terminal.printf("Some more normal text."); |
dansummers | 0:863811463610 | 277 | * @endcode |
dansummers | 0:863811463610 | 278 | */ |
dansummers | 0:863811463610 | 279 | inline void set_display_style(char style) |
dansummers | 0:863811463610 | 280 | { |
dansummers | 0:863811463610 | 281 | this->current_style = style; |
dansummers | 0:863811463610 | 282 | this->ansi_csi(); |
dansummers | 0:863811463610 | 283 | this->ansi_sgr(false, style, 0, 0); |
dansummers | 0:863811463610 | 284 | } |
dansummers | 0:863811463610 | 285 | |
dansummers | 0:863811463610 | 286 | /** Set the colour of subsequent characters. |
dansummers | 0:863811463610 | 287 | * @param sgr_colour One of the SGR Colours defined above (Black, Red, Green, Yellow, Blue, Magenta, Cyan, White). |
dansummers | 0:863811463610 | 288 | * |
dansummers | 0:863811463610 | 289 | * Example: |
dansummers | 0:863811463610 | 290 | * @code |
dansummers | 0:863811463610 | 291 | * terminal.printf("Some text in the default terminal colour."); |
dansummers | 0:863811463610 | 292 | * terminal.set_display_text_colour(SGR_RED); |
dansummers | 0:863811463610 | 293 | * terminal.printf("Some text in red.); |
dansummers | 0:863811463610 | 294 | * @endcode |
dansummers | 0:863811463610 | 295 | */ |
dansummers | 0:863811463610 | 296 | inline void set_text_colour(char sgr_colour) |
dansummers | 0:863811463610 | 297 | { |
dansummers | 0:863811463610 | 298 | this->ansi_csi(); |
dansummers | 0:863811463610 | 299 | this->ansi_sgr(false, this->current_style, sgr_colour, 0); |
dansummers | 0:863811463610 | 300 | } |
dansummers | 0:863811463610 | 301 | |
dansummers | 0:863811463610 | 302 | /** Set the background colour for subsequent characters. |
dansummers | 0:863811463610 | 303 | * @param sgr_colour One of the SGR Colours defined above (Black, Red, Green, Yellow, Blue, Magenta, Cyan, White). |
dansummers | 0:863811463610 | 304 | * |
dansummers | 0:863811463610 | 305 | * Example: |
dansummers | 0:863811463610 | 306 | * @code |
dansummers | 0:863811463610 | 307 | * terminal.printf("Some text in the default terminal colour."); |
dansummers | 0:863811463610 | 308 | * terminal.set_display_background_colour(SGR_RED); |
dansummers | 0:863811463610 | 309 | * terminal.printf("Some text on a red background.); |
dansummers | 0:863811463610 | 310 | * @endcode |
dansummers | 0:863811463610 | 311 | */ |
dansummers | 0:863811463610 | 312 | inline void set_background_colour(char sgr_colour) |
dansummers | 0:863811463610 | 313 | { |
dansummers | 0:863811463610 | 314 | this->ansi_csi(); |
dansummers | 0:863811463610 | 315 | this->ansi_sgr(false, this->current_style, 0, sgr_colour); |
dansummers | 0:863811463610 | 316 | } |
dansummers | 0:863811463610 | 317 | |
dansummers | 0:863811463610 | 318 | /** Tell the terminal not to display the cursor. |
dansummers | 0:863811463610 | 319 | */ |
dansummers | 0:863811463610 | 320 | inline void hide_cursor() |
dansummers | 0:863811463610 | 321 | { |
dansummers | 0:863811463610 | 322 | this->ansi_csi(); |
dansummers | 0:863811463610 | 323 | this->ansi_dectcem_hide(); |
dansummers | 0:863811463610 | 324 | } |
dansummers | 0:863811463610 | 325 | |
dansummers | 0:863811463610 | 326 | /** Tell the terminal to display the cursor. |
dansummers | 0:863811463610 | 327 | */ |
dansummers | 0:863811463610 | 328 | inline void show_cursor() |
dansummers | 0:863811463610 | 329 | { |
dansummers | 0:863811463610 | 330 | this->ansi_csi(); |
dansummers | 0:863811463610 | 331 | this->ansi_dectcem_show(); |
dansummers | 0:863811463610 | 332 | } |
dansummers | 0:863811463610 | 333 | |
dansummers | 0:863811463610 | 334 | /** Reset the display to its default parameters (clearing all text styling and colour settings). |
dansummers | 0:863811463610 | 335 | */ |
dansummers | 0:863811463610 | 336 | inline void set_display_to_defaults() |
dansummers | 0:863811463610 | 337 | { |
dansummers | 0:863811463610 | 338 | this->ansi_csi(); |
dansummers | 0:863811463610 | 339 | this->ansi_sgr(true, 0, 0, 0); |
dansummers | 0:863811463610 | 340 | } |
dansummers | 0:863811463610 | 341 | |
dansummers | 0:863811463610 | 342 | }; |
dansummers | 0:863811463610 | 343 | |
dansummers | 0:863811463610 | 344 | |
dansummers | 0:863811463610 | 345 | #endif |