diff --git a/html_orig/js/app.js b/html_orig/js/app.js index 6a70cb3..baa1f33 100644 --- a/html_orig/js/app.js +++ b/html_orig/js/app.js @@ -726,11 +726,16 @@ right: 39, down: 40, del: 46, 'delete': 46, home: 36, end: 35, - pageup: 33, pagedown: 34, insert: 45, // added insert + pageup: 33, pagedown: 34, ',': 188, '.': 190, '/': 191, '`': 192, '-': 189, '=': 187, ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220 + '[': 219, ']': 221, '\\': 220, + // added: + insert: 45, + np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101, + np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106, + np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144, }, code = function(x){ return _MAP[x] || x.toUpperCase().charCodeAt(0); @@ -1761,6 +1766,12 @@ var Screen = (function () { cursor.hanging = !!(num & 0x200); // console.log("Attributes word ",num.toString(16)+'h'); + Input.setAlts( + !!(num & 0x400), // cu + !!(num & 0x800), // np + !!(num & 0x1000) // fn + ); + fg = cursor.fg; bg = cursor.bg; attrs = 0; @@ -1821,7 +1832,7 @@ var Screen = (function () { qsa('#buttons button').forEach(function(x, i) { var s = pieces[i+1].trim(); // if empty string, use the "dim" effect and put nbsp instead to stretch the btn vertically - x.innerHTML = s.length >0 ? e(s) : " "; + x.innerHTML = s.length > 0 ? e(s) : " "; x.style.opacity = s.length > 0 ? 1 : 0.2; }); } @@ -1875,6 +1886,7 @@ var Conn = (function() { function doSend(message) { console.log("TX: ", message); + if (!ws) return; // for dry testing if (ws.readyState != 1) { console.error("Socket not ready"); @@ -1913,6 +1925,12 @@ var Conn = (function() { /** User input */ var Input = (function() { + var opts = { + np_alt: false, + cu_alt: false, + fn_alt: false, + }; + function sendStrMsg(str) { Conn.send("STR:"+str); } @@ -1925,73 +1943,110 @@ var Input = (function() { Conn.send("BTN:"+n); } - function _initKeys() { - // This takes care of text characters typed - window.addEventListener('keypress', function(evt) { - var str = ''; - if (evt.key) str = evt.key; - else if (evt.which) str = String.fromCodePoint(evt.which); - if (str.length>0 && str.charCodeAt(0) >= 32) { -// console.log("Typed ", str); - sendStrMsg(str); - } - }); + function fa(alt, normal) { + return opts.fn_alt ? alt : normal; + } + + function ca(alt, normal) { + return opts.cu_alt ? alt : normal; + } + function na(alt, normal) { + return opts.np_alt ? alt : normal; + } + + function _bindFnKeys() { var keymap = { 'tab': '\x09', 'backspace': '\x08', 'enter': '\x0d', 'ctrl+enter': '\x0a', 'esc': '\x1b', - 'up': '\x1b[A', - 'down': '\x1b[B', - 'right': '\x1b[C', - 'left': '\x1b[D', - 'home': '\x1b[1~', + 'up': ca('\x1bOA', '\x1b[A'), + 'down': ca('\x1bOB', '\x1b[B'), + 'right': ca('\x1bOC', '\x1b[C'), + 'left': ca('\x1bOD', '\x1b[D'), + 'home': fa('\x1bOH', '\x1b[1~'), 'insert': '\x1b[2~', 'delete': '\x1b[3~', - 'end': '\x1b[4~', + 'end': fa('\x1bOF', '\x1b[4~'), 'pageup': '\x1b[5~', 'pagedown': '\x1b[6~', - 'f1': '\x1b[11~', - 'f2': '\x1b[12~', - 'f3': '\x1b[13~', - 'f4': '\x1b[14~', - 'f5': '\x1b[15~', // disconnect + 'f1': fa('\x1bOP', '\x1b[11~'), + 'f2': fa('\x1bOQ', '\x1b[12~'), + 'f3': fa('\x1bOR', '\x1b[13~'), + 'f4': fa('\x1bOS', '\x1b[14~'), + 'f5': '\x1b[15~', // note the disconnect 'f6': '\x1b[17~', 'f7': '\x1b[18~', 'f8': '\x1b[19~', 'f9': '\x1b[20~', - 'f10': '\x1b[21~', // disconnect + 'f10': '\x1b[21~', // note the disconnect 'f11': '\x1b[23~', 'f12': '\x1b[24~', - 'shift+f1': '\x1b[25~', - 'shift+f2': '\x1b[26~', // disconnect - 'shift+f3': '\x1b[28~', - 'shift+f4': '\x1b[29~', // disconnect - 'shift+f5': '\x1b[31~', - 'shift+f6': '\x1b[32~', - 'shift+f7': '\x1b[33~', - 'shift+f8': '\x1b[34~', + 'shift+f1': fa('\x1bO1;2P', '\x1b[25~'), + 'shift+f2': fa('\x1bO1;2Q', '\x1b[26~'), // note the disconnect + 'shift+f3': fa('\x1bO1;2R', '\x1b[28~'), + 'shift+f4': fa('\x1bO1;2S', '\x1b[29~'), // note the disconnect + 'shift+f5': fa('\x1b[15;2~', '\x1b[31~'), + 'shift+f6': fa('\x1b[17;2~', '\x1b[32~'), + 'shift+f7': fa('\x1b[18;2~', '\x1b[33~'), + 'shift+f8': fa('\x1b[19;2~', '\x1b[34~'), + 'shift+f9': fa('\x1b[20;2~', '\x1b[35~'), // 35-38 are not standard - but what is? + 'shift+f10': fa('\x1b[21;2~', '\x1b[36~'), + 'shift+f11': fa('\x1b[22;2~', '\x1b[37~'), + 'shift+f12': fa('\x1b[23;2~', '\x1b[38~'), + 'np_0': na('\x1bOp', '0'), + 'np_1': na('\x1bOq', '1'), + 'np_2': na('\x1bOr', '2'), + 'np_3': na('\x1bOs', '3'), + 'np_4': na('\x1bOt', '4'), + 'np_5': na('\x1bOu', '5'), + 'np_6': na('\x1bOv', '6'), + 'np_7': na('\x1bOw', '7'), + 'np_8': na('\x1bOx', '8'), + 'np_9': na('\x1bOy', '9'), + 'np_mul': na('\x1bOR', '*'), + 'np_add': na('\x1bOl', '+'), + 'np_sub': na('\x1bOS', '-'), + 'np_point': na('\x1bOn', '.'), + 'np_div': na('\x1bOQ', '/'), + // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest) }; - function bind(combo, str) { - // mac fix - allow also cmd - if (combo.indexOf('ctrl+') !== -1) { - combo += ',' + combo.replace('ctrl', 'command'); - } - key(combo, function (e) { - e.preventDefault(); -// console.log(combo); - sendStrMsg(str) - }); - } - for (var k in keymap) { if (keymap.hasOwnProperty(k)) { bind(k, keymap[k]); } } + } + + function bind(combo, str) { + // mac fix - allow also cmd + if (combo.indexOf('ctrl+') !== -1) { + combo += ',' + combo.replace('ctrl', 'command'); + } + + // unbind possible old binding + key.unbind(combo); + + key(combo, function (e) { + e.preventDefault(); + sendStrMsg(str) + }); + } + + function _initKeys() { + // This takes care of text characters typed + window.addEventListener('keypress', function(evt) { + var str = ''; + if (evt.key) str = evt.key; + else if (evt.which) str = String.fromCodePoint(evt.which); + if (str.length>0 && str.charCodeAt(0) >= 32) { +// console.log("Typed ", str); + sendStrMsg(str); + } + }); // ctrl-letter codes are sent as simple low ASCII codes for (var i = 1; i<=26;i++) { @@ -2002,6 +2057,8 @@ var Input = (function() { bind('ctrl+[', '\x1d'); bind('ctrl+^', '\x1e'); bind('ctrl+_', '\x1f'); + + _bindFnKeys(); } function init() { @@ -2019,6 +2076,17 @@ var Input = (function() { init: init, onTap: sendPosMsg, sendString: sendStrMsg, + setAlts: function(cu, np, fn) { + console.log("Set alts ", cu, np, fn); + if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { + opts.cu_alt = cu; + opts.np_alt = np; + opts.fn_alt = fn; + + // rebind keys - codes have changed + _bindFnKeys(); + } + }, }; })(); diff --git a/html_orig/jssrc/keymaster.js b/html_orig/jssrc/keymaster.js index f222d3e..254620b 100644 --- a/html_orig/jssrc/keymaster.js +++ b/html_orig/jssrc/keymaster.js @@ -23,11 +23,16 @@ right: 39, down: 40, del: 46, 'delete': 46, home: 36, end: 35, - pageup: 33, pagedown: 34, insert: 45, // added insert + pageup: 33, pagedown: 34, ',': 188, '.': 190, '/': 191, '`': 192, '-': 189, '=': 187, ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220 + '[': 219, ']': 221, '\\': 220, + // added: + insert: 45, + np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101, + np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106, + np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144, }, code = function(x){ return _MAP[x] || x.toUpperCase().charCodeAt(0); diff --git a/html_orig/jssrc/term.js b/html_orig/jssrc/term.js index f52a7a8..8a51b8f 100644 --- a/html_orig/jssrc/term.js +++ b/html_orig/jssrc/term.js @@ -209,6 +209,12 @@ var Screen = (function () { cursor.hanging = !!(num & 0x200); // console.log("Attributes word ",num.toString(16)+'h'); + Input.setAlts( + !!(num & 0x400), // cu + !!(num & 0x800), // np + !!(num & 0x1000) // fn + ); + fg = cursor.fg; bg = cursor.bg; attrs = 0; @@ -269,7 +275,7 @@ var Screen = (function () { qsa('#buttons button').forEach(function(x, i) { var s = pieces[i+1].trim(); // if empty string, use the "dim" effect and put nbsp instead to stretch the btn vertically - x.innerHTML = s.length >0 ? e(s) : " "; + x.innerHTML = s.length > 0 ? e(s) : " "; x.style.opacity = s.length > 0 ? 1 : 0.2; }); } @@ -323,6 +329,7 @@ var Conn = (function() { function doSend(message) { console.log("TX: ", message); + if (!ws) return; // for dry testing if (ws.readyState != 1) { console.error("Socket not ready"); @@ -361,6 +368,12 @@ var Conn = (function() { /** User input */ var Input = (function() { + var opts = { + np_alt: false, + cu_alt: false, + fn_alt: false, + }; + function sendStrMsg(str) { Conn.send("STR:"+str); } @@ -373,73 +386,110 @@ var Input = (function() { Conn.send("BTN:"+n); } - function _initKeys() { - // This takes care of text characters typed - window.addEventListener('keypress', function(evt) { - var str = ''; - if (evt.key) str = evt.key; - else if (evt.which) str = String.fromCodePoint(evt.which); - if (str.length>0 && str.charCodeAt(0) >= 32) { -// console.log("Typed ", str); - sendStrMsg(str); - } - }); + function fa(alt, normal) { + return opts.fn_alt ? alt : normal; + } + + function ca(alt, normal) { + return opts.cu_alt ? alt : normal; + } + function na(alt, normal) { + return opts.np_alt ? alt : normal; + } + + function _bindFnKeys() { var keymap = { 'tab': '\x09', 'backspace': '\x08', 'enter': '\x0d', 'ctrl+enter': '\x0a', 'esc': '\x1b', - 'up': '\x1b[A', - 'down': '\x1b[B', - 'right': '\x1b[C', - 'left': '\x1b[D', - 'home': '\x1b[1~', + 'up': ca('\x1bOA', '\x1b[A'), + 'down': ca('\x1bOB', '\x1b[B'), + 'right': ca('\x1bOC', '\x1b[C'), + 'left': ca('\x1bOD', '\x1b[D'), + 'home': fa('\x1bOH', '\x1b[1~'), 'insert': '\x1b[2~', 'delete': '\x1b[3~', - 'end': '\x1b[4~', + 'end': fa('\x1bOF', '\x1b[4~'), 'pageup': '\x1b[5~', 'pagedown': '\x1b[6~', - 'f1': '\x1b[11~', - 'f2': '\x1b[12~', - 'f3': '\x1b[13~', - 'f4': '\x1b[14~', - 'f5': '\x1b[15~', // disconnect + 'f1': fa('\x1bOP', '\x1b[11~'), + 'f2': fa('\x1bOQ', '\x1b[12~'), + 'f3': fa('\x1bOR', '\x1b[13~'), + 'f4': fa('\x1bOS', '\x1b[14~'), + 'f5': '\x1b[15~', // note the disconnect 'f6': '\x1b[17~', 'f7': '\x1b[18~', 'f8': '\x1b[19~', 'f9': '\x1b[20~', - 'f10': '\x1b[21~', // disconnect + 'f10': '\x1b[21~', // note the disconnect 'f11': '\x1b[23~', 'f12': '\x1b[24~', - 'shift+f1': '\x1b[25~', - 'shift+f2': '\x1b[26~', // disconnect - 'shift+f3': '\x1b[28~', - 'shift+f4': '\x1b[29~', // disconnect - 'shift+f5': '\x1b[31~', - 'shift+f6': '\x1b[32~', - 'shift+f7': '\x1b[33~', - 'shift+f8': '\x1b[34~', + 'shift+f1': fa('\x1bO1;2P', '\x1b[25~'), + 'shift+f2': fa('\x1bO1;2Q', '\x1b[26~'), // note the disconnect + 'shift+f3': fa('\x1bO1;2R', '\x1b[28~'), + 'shift+f4': fa('\x1bO1;2S', '\x1b[29~'), // note the disconnect + 'shift+f5': fa('\x1b[15;2~', '\x1b[31~'), + 'shift+f6': fa('\x1b[17;2~', '\x1b[32~'), + 'shift+f7': fa('\x1b[18;2~', '\x1b[33~'), + 'shift+f8': fa('\x1b[19;2~', '\x1b[34~'), + 'shift+f9': fa('\x1b[20;2~', '\x1b[35~'), // 35-38 are not standard - but what is? + 'shift+f10': fa('\x1b[21;2~', '\x1b[36~'), + 'shift+f11': fa('\x1b[22;2~', '\x1b[37~'), + 'shift+f12': fa('\x1b[23;2~', '\x1b[38~'), + 'np_0': na('\x1bOp', '0'), + 'np_1': na('\x1bOq', '1'), + 'np_2': na('\x1bOr', '2'), + 'np_3': na('\x1bOs', '3'), + 'np_4': na('\x1bOt', '4'), + 'np_5': na('\x1bOu', '5'), + 'np_6': na('\x1bOv', '6'), + 'np_7': na('\x1bOw', '7'), + 'np_8': na('\x1bOx', '8'), + 'np_9': na('\x1bOy', '9'), + 'np_mul': na('\x1bOR', '*'), + 'np_add': na('\x1bOl', '+'), + 'np_sub': na('\x1bOS', '-'), + 'np_point': na('\x1bOn', '.'), + 'np_div': na('\x1bOQ', '/'), + // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest) }; - function bind(combo, str) { - // mac fix - allow also cmd - if (combo.indexOf('ctrl+') !== -1) { - combo += ',' + combo.replace('ctrl', 'command'); - } - key(combo, function (e) { - e.preventDefault(); -// console.log(combo); - sendStrMsg(str) - }); - } - for (var k in keymap) { if (keymap.hasOwnProperty(k)) { bind(k, keymap[k]); } } + } + + function bind(combo, str) { + // mac fix - allow also cmd + if (combo.indexOf('ctrl+') !== -1) { + combo += ',' + combo.replace('ctrl', 'command'); + } + + // unbind possible old binding + key.unbind(combo); + + key(combo, function (e) { + e.preventDefault(); + sendStrMsg(str) + }); + } + + function _initKeys() { + // This takes care of text characters typed + window.addEventListener('keypress', function(evt) { + var str = ''; + if (evt.key) str = evt.key; + else if (evt.which) str = String.fromCodePoint(evt.which); + if (str.length>0 && str.charCodeAt(0) >= 32) { +// console.log("Typed ", str); + sendStrMsg(str); + } + }); // ctrl-letter codes are sent as simple low ASCII codes for (var i = 1; i<=26;i++) { @@ -450,6 +500,8 @@ var Input = (function() { bind('ctrl+[', '\x1d'); bind('ctrl+^', '\x1e'); bind('ctrl+_', '\x1f'); + + _bindFnKeys(); } function init() { @@ -467,6 +519,17 @@ var Input = (function() { init: init, onTap: sendPosMsg, sendString: sendStrMsg, + setAlts: function(cu, np, fn) { + console.log("Set alts ", cu, np, fn); + if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { + opts.cu_alt = cu; + opts.np_alt = np; + opts.fn_alt = fn; + + // rebind keys - codes have changed + _bindFnKeys(); + } + }, }; })(); diff --git a/user/cgi_sockets.c b/user/cgi_sockets.c index b74a532..f505249 100644 --- a/user/cgi_sockets.c +++ b/user/cgi_sockets.c @@ -74,18 +74,19 @@ void ICACHE_FLASH_ATTR screen_notifyChange(ScreenNotifyChangeTopic topic) { // this is not the most ideal/cleanest implementation // PRs are welcome for a nicer update "queue" solution + if (termconf->display_tout_ms == 0) termconf->display_tout_ms = SCR_DEF_DISPLAY_TOUT_MS; if (topic == CHANGE_LABELS) { // separate timer from content change timer, to avoid losing that update os_timer_disarm(¬ifyTim2); os_timer_setfn(¬ifyTim2, notifyLabelsTimCb, NULL); - os_timer_arm(¬ifyTim2, SCREEN_NOTIFY_DELAY_MS, 0); + os_timer_arm(¬ifyTim2, termconf->display_tout_ms, 0); } else if (topic == CHANGE_CONTENT) { // throttle delay os_timer_disarm(¬ifyTim); os_timer_setfn(¬ifyTim, notifyTimCb, NULL); - os_timer_arm(¬ifyTim, SCREEN_NOTIFY_DELAY_MS, 0); + os_timer_arm(¬ifyTim, termconf->display_tout_ms, 0); } } diff --git a/user/cgi_term_cfg.c b/user/cgi_term_cfg.c index 88e8c92..4ddb3c0 100644 --- a/user/cgi_term_cfg.c +++ b/user/cgi_term_cfg.c @@ -20,7 +20,7 @@ cgiTermCfgSetParams(HttpdConnData *connData) { char buff[50]; char redir_url_buf[100]; - int n, w, h; + int32 n, w, h; bool shall_clear_screen = false; @@ -85,13 +85,30 @@ cgiTermCfgSetParams(HttpdConnData *connData) dbg("Parser timeout: %s ms", buff); n = atoi(buff); if (n >= 0) { - termconf->parser_tout_ms = (u8) n; + termconf->parser_tout_ms = n; } else { warn("Bad timeout %s", buff); redir_url += sprintf(redir_url, "parser_tout_ms,"); } } + if (GET_ARG("display_tout_ms")) { + dbg("Display update idle timeout: %s ms", buff); + n = atoi(buff); + if (n >= 0) { + termconf->display_tout_ms = n; + } else { + warn("Bad timeout %s", buff); + redir_url += sprintf(redir_url, "display_tout_ms,"); + } + } + + if (GET_ARG("fn_alt_mode")) { + dbg("FN alt mode: %s", buff); + n = atoi(buff); + termconf->fn_alt_mode = (bool)n; + } + if (GET_ARG("default_fg")) { dbg("Screen default FG: %s", buff); n = atoi(buff); @@ -175,6 +192,12 @@ tplTermCfg(HttpdConnData *connData, char *token, void **arg) else if (streq(token, "parser_tout_ms")) { sprintf(buff, "%d", termconf->parser_tout_ms); } + else if (streq(token, "display_tout_ms")) { + sprintf(buff, "%d", termconf->display_tout_ms); + } + else if (streq(token, "fn_alt_mode")) { + sprintf(buff, "%d", (int)termconf->fn_alt_mode); + } else if (streq(token, "theme")) { sprintf(buff, "%d", termconf->theme); } diff --git a/user/screen.c b/user/screen.c index b01534e..fd849d1 100644 --- a/user/screen.c +++ b/user/screen.c @@ -102,10 +102,12 @@ void terminal_restore_defaults(void) { termconf->default_bg = 0; termconf->default_fg = 7; - termconf->width = 26; - termconf->height = 10; - termconf->parser_tout_ms = 10; - sprintf(termconf->title, "ESPTerm"); + termconf->width = SCR_DEF_WIDTH; + termconf->height = SCR_DEF_HEIGHT; + termconf->parser_tout_ms = SCR_DEF_PARSER_TOUT_MS; + termconf->display_tout_ms = SCR_DEF_DISPLAY_TOUT_MS; + termconf->fn_alt_mode = SCR_DEF_FN_ALT_MODE; + sprintf(termconf->title, SCR_DEF_TITLE); for(int i=1; i <= 5; i++) { sprintf(termconf->btn[i-1], "%d", i); } @@ -123,6 +125,8 @@ void terminal_apply_settings(void) /** this is used when changing terminal settings that do not affect the screen size */ void terminal_apply_settings_noclear(void) { + if (termconf->display_tout_ms == 0) termconf->display_tout_ms = SCR_DEF_DISPLAY_TOUT_MS; + memcpy(&termconf_scratch, termconf, sizeof(TerminalConfigBundle)); if (W*H >= MAX_SCREEN_SIZE) { error("BAD SCREEN SIZE: %d rows x %d cols", H, W); @@ -685,13 +689,17 @@ screen_set_insert_mode(bool insert) void ICACHE_FLASH_ATTR screen_set_numpad_alt_mode(bool alt_mode) { + NOTIFY_LOCK(); scr.numpad_alt_mode = alt_mode; + NOTIFY_DONE(); } void ICACHE_FLASH_ATTR screen_set_cursors_alt_mode(bool alt_mode) { + NOTIFY_LOCK(); scr.cursors_alt_mode = alt_mode; + NOTIFY_DONE(); } //endregion @@ -990,10 +998,11 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) encode2B((u16) ( cursor.fg | (cursor.bg<<4) | - (cursor.visible ? 1<<8 : 0) | - (cursor.hanging ? 1<<9 : 0) | - (scr.cursors_alt_mode ? 1<<10 : 0) | - (scr.numpad_alt_mode ? 1<<11 : 0) + (cursor.visible ? 0x100 : 0) | + (cursor.hanging ? 0x200 : 0) | + (scr.cursors_alt_mode ? 0x400 : 0) | + (scr.numpad_alt_mode ? 0x800 : 0) | + (termconf->fn_alt_mode ? 0x1000 : 0) ) , &w5); diff --git a/user/screen.h b/user/screen.h index 65838bb..6ca731e 100644 --- a/user/screen.h +++ b/user/screen.h @@ -34,7 +34,7 @@ * */ -// Size designed for the wifi config structure +// Size designed for the terminal config structure // Must be constant to avoid corrupting user config after upgrade #define TERMCONF_SIZE 200 @@ -54,7 +54,16 @@ typedef enum { #define ATTR_FRAKTUR (1<<5) #define ATTR_STRIKE (1<<6) -#define SCREEN_NOTIFY_DELAY_MS 20 +#define SCR_DEF_DISPLAY_TOUT_MS 20 +#define SCR_DEF_PARSER_TOUT_MS 10 +#define SCR_DEF_FN_ALT_MODE false +#define SCR_DEF_WIDTH 26 +#define SCR_DEF_HEIGHT 10 +#define SCR_DEF_TITLE "ESPTerm" + +/** Maximum screen size (determines size of the static data array) */ +#define MAX_SCREEN_SIZE (80*30) + typedef struct { u32 width; @@ -65,6 +74,8 @@ typedef struct { char btn[5][TERM_BTN_LEN]; u8 theme; u32 parser_tout_ms; + u32 display_tout_ms; + bool fn_alt_mode; // xterm compatibility mode (alternate codes for some FN keys) } TerminalConfigBundle; // Live config @@ -80,8 +91,6 @@ void terminal_restore_defaults(void); void terminal_apply_settings(void); void terminal_apply_settings_noclear(void); // the same, but with no screen reset / init -/** Maximum screen size (determines size of the static data array) */ -#define MAX_SCREEN_SIZE (80*30) typedef enum { CLEAR_TO_CURSOR=0, CLEAR_FROM_CURSOR=1, CLEAR_ALL=2