diff --git a/doc/settings.md b/doc/settings.md index c42fdf6367..aacf51c53d 100644 --- a/doc/settings.md +++ b/doc/settings.md @@ -996,8 +996,7 @@ Notes - - + diff --git a/src/netxs/desktopio/application.hpp b/src/netxs/desktopio/application.hpp index 962d56aa74..c0838fe347 100644 --- a/src/netxs/desktopio/application.hpp +++ b/src/netxs/desktopio/application.hpp @@ -22,7 +22,7 @@ namespace netxs::app namespace netxs::app::shared { - static const auto version = "v2026.03.04"; + static const auto version = "v2026.03.05"; static const auto repository = "https://github.com/directvt/vtm"; static const auto usr_config = "~/.config/vtm/settings.xml"s; static const auto sys_config = "/etc/vtm/settings.xml"s; diff --git a/src/netxs/desktopio/canvas.hpp b/src/netxs/desktopio/canvas.hpp index 1317da4208..e2558f8f61 100644 --- a/src/netxs/desktopio/canvas.hpp +++ b/src/netxs/desktopio/canvas.hpp @@ -759,11 +759,18 @@ namespace netxs }); friend auto& operator << (std::ostream& s, argb c) { - return s << "{" << (si32)c.chan.r - << "," << (si32)c.chan.g - << "," << (si32)c.chan.b - << "," << (si32)c.chan.a - << "}"; + if (auto index = argb::is_indexed_color(c)) + { + return s << "Color" << index - 1; + } + else + { + return s << "{" << (si32)c.chan.r + << "," << (si32)c.chan.g + << "," << (si32)c.chan.b + << "," << (si32)c.chan.a + << "}"; + } } static auto set_vtm16_palette(auto proc) { diff --git a/src/netxs/desktopio/consrv.hpp b/src/netxs/desktopio/consrv.hpp index 9b969ddb32..160b92a604 100644 --- a/src/netxs/desktopio/consrv.hpp +++ b/src/netxs/desktopio/consrv.hpp @@ -2905,7 +2905,7 @@ struct impl : consrv if constexpr (RawRead) { log("\tread mode: raw ReadFile emulation"); - packet.input = { .EOFon = 1 }; + packet.input = { .EOFon = inpmod & nt::console::inmode::preprocess }; // Disabling input preprocessing in cooked mode enables line buffering, allowing the application to intercept (ReadFile) and process Ctrl+Z as raw data. } auto namesize = (ui32)(packet.input.execb * sizeof(wchr)); if (!size_check(packet.echosz, packet.input.affix) diff --git a/src/netxs/desktopio/terminal.hpp b/src/netxs/desktopio/terminal.hpp index 153f54f86c..f75e4f0201 100644 --- a/src/netxs/desktopio/terminal.hpp +++ b/src/netxs/desktopio/terminal.hpp @@ -242,7 +242,6 @@ namespace netxs::ui cell def_curclr; argb def_fcolor; argb def_bcolor; - argb def_filler; si32 def_selmod; si32 def_cursor; bool def_selalt; @@ -253,6 +252,7 @@ namespace netxs::ui bool allow_logs; span def_period; pals def_colors; + pals bkp_colors; cell def_safe_c; cell def_ansi_c; @@ -327,7 +327,6 @@ namespace netxs::ui def_atexit = config.settings::take("/config/terminal/atexit", commands::atexit::smart, atexit_options); def_fcolor = config.settings::take("/config/terminal/colors/default/fgc", argb{ whitelt }); def_bcolor = config.settings::take("/config/terminal/colors/default/bgc", argb{ blackdk }); - def_filler = config.settings::take("/config/terminal/colors/bground", argb{ argb::default_color }); def_safe_c = config.settings::take("/config/terminal/colors/selection/protected", cell{}.bgc(bluelt) .fgc(whitelt)); def_ansi_c = config.settings::take("/config/terminal/colors/selection/ansi", cell{}.bgc(bluelt) .fgc(whitelt)); @@ -359,8 +358,9 @@ namespace netxs::ui std::copy(std::begin(argb::vt256), std::end(argb::vt256), std::begin(def_colors)); for (auto i = 0; i < 16; i++) { - def_colors[i] = config.settings::take("/config/terminal/colors/color" + std::to_string(i), def_colors[i]); + def_colors[i] = netxs::letoh(config.settings::take("/config/terminal/colors/color" + std::to_string(i), argb{ def_colors[i] }).token); // Store colors as integers. } + bkp_colors = def_colors; } }; @@ -866,8 +866,15 @@ namespace netxs::ui utf::trim_front_if(data, [](char c){ return c >= '0' && c <= '9'; }); if (auto v = utf::to_int(data)) { - auto n = std::clamp(v.value(), 0, 255); - color[n] = argb::vt256[n]; + auto n = v.value(); + if (n < 0 || n > 255) + { + log("%%Unsupported 256-color palette index %%", prompt::term, n); + } + else + { + color[n] = owner.defcfg.bkp_colors[n]; // Restore color from settings. + } empty = faux; } } @@ -883,9 +890,13 @@ namespace netxs::ui if (data.empty()) break; if (auto v = utf::to_int(data)) { - auto n = std::clamp(v.value(), 0, 255); + auto n = v.value(); auto [t, r] = record(data); - if (t == type::request) + if (n < 0 || n > 255) + { + log("%%Unsupported 256-color palette index %%", prompt::term, n); + } + else if (t == type::request) { auto c = argb{ color[n] }; reply.osc(ansi::osc_set_palette, utf::fprint("%n%;rgb:%r%/%g%/%b%", n, utf::to_hex(c.chan.r), @@ -920,7 +931,7 @@ namespace netxs::ui auto [t, r] = record(data); if (t == type::request) { - auto c = owner.target->brush.sfg(); + auto c = owner.defclr.fgc(); reply.osc(ansi::osc_set_fgcolor, utf::fprint("rgb:%r%/%g%/%b%", utf::to_hex(c.chan.r), utf::to_hex(c.chan.g), utf::to_hex(c.chan.b))); @@ -939,7 +950,7 @@ namespace netxs::ui auto [t, r] = record(data); if (t == type::request) { - auto c = owner.target->brush.sbg(); + auto c = owner.defclr.bgc(); reply.osc(ansi::osc_set_bgcolor, utf::fprint("rgb:%r%/%g%/%b%", utf::to_hex(c.chan.r), utf::to_hex(c.chan.g), utf::to_hex(c.chan.b))); @@ -975,11 +986,15 @@ namespace netxs::ui }; procs[ansi::osc_reset_fgclr] = [&](view /*data*/) { - owner.defclr.fgc(owner.defcfg.def_fcolor); + auto new_fgc = owner.defclr; + new_fgc.fgc(owner.defcfg.def_fcolor); + owner.set_color(new_fgc); }; procs[ansi::osc_reset_bgclr] = [&](view /*data*/ ) { - owner.defclr.bgc(owner.defcfg.def_bcolor); + auto new_bgc = owner.defclr; + new_bgc.bgc(owner.defcfg.def_bcolor); + owner.set_color(new_bgc); }; } @@ -9076,9 +9091,7 @@ namespace netxs::ui auto full = parent_canvas.full(); auto original_cursor = console.get_coord(origin); // base::coor() and origin are the same. - auto brush = defclr; - if (defcfg.def_filler != argb::default_color) brush.bgc(defcfg.def_filler); // Unsync with SGR default background. - parent_canvas.fill(cell::shaders::fusefull(brush)); + parent_canvas.fill(cell::shaders::fusefull(defclr)); if (ime_on) // Draw IME composition overlay. { @@ -9106,7 +9119,7 @@ namespace netxs::ui viewport_square.coor -= origin; if (auto context2D = parent_canvas.change_basis(viewport_square)) { - parent_canvas.output(imebox, viewport_cursor, cell::shaders::mimic(brush)); + parent_canvas.output(imebox, viewport_cursor, cell::shaders::mimic(defclr)); } composit_cursor -= origin; // Convert to original (scrollback based) basis. caret.coor(composit_cursor); @@ -9121,7 +9134,7 @@ namespace netxs::ui else { caret.coor(original_cursor); - if (brush.bga() != 0xFF) parent_canvas.fill(rect{ caret.coor(), dot_11 }, [&](cell& c){ c.fgc(console.brush.fgc()); }); // Prefill the cursor cell placeholder in the case of transparent background. + if (defclr.bga() != 0xFF) parent_canvas.fill(rect{ caret.coor(), dot_11 }, [&](cell& c){ c.fgc(console.brush.fgc()); }); // Prefill the cursor cell placeholder in the case of transparent background. console.output(parent_canvas); } if (invert) parent_canvas.fill(cell::shaders::invbit); diff --git a/src/vtm.xml b/src/vtm.xml index fccc615074..1e7113d6f4 100644 --- a/src/vtm.xml +++ b/src/vtm.xml @@ -179,8 +179,7 @@ R"==( - - +