terminal: change term caps from linux to screen

Fixes #2743
This commit is contained in:
Norman Feske 2018-04-03 16:46:04 +02:00 committed by Christian Helmuth
parent 92edcb17e5
commit 97317b0c95
26 changed files with 160 additions and 519 deletions

View File

@ -196,7 +196,7 @@ append config {
<dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir> <dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="HOME" value="/home" /> <env name="HOME" value="/home" />
</start> </start>
</config> </config>

View File

@ -58,7 +58,7 @@
</dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="block:$PWD> " /> <env name="PS1" value="block:$PWD> " />
</start> </start>
</config> </config>

View File

@ -43,7 +43,7 @@
<dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir> <dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="noux:$PWD> " /> <env name="PS1" value="noux:$PWD> " />
</start> </start>
</config> </config>

View File

@ -102,7 +102,7 @@
<dir name="report"> <fs label="report"/> </dir> <dir name="report"> <fs label="report"/> </dir>
</fstab> </fstab>
<start name="/bin/tail"> <start name="/bin/tail">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<arg value="-f"/> <arg value="-f"/>
<arg value="/report/log"/> <arg value="/report/log"/>
</start> </start>
@ -156,7 +156,7 @@
<rom name="README"/> <rom name="README"/>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="genode:$PWD> " /> <env name="PS1" value="genode:$PWD> " />
</start> </start>
</config> </config>

View File

@ -63,7 +63,7 @@
<dir name="config"> <fs label="config"/> </dir> <dir name="config"> <fs label="config"/> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="fs:$PWD> " /> <env name="PS1" value="fs:$PWD> " />
<env name="HOME" value="/" /> <env name="HOME" value="/" />
<arg value="--login"/> <arg value="--login"/>

View File

@ -1,25 +0,0 @@
build "core init test/terminal_decoder"
create_boot_directory
install_config {
<config>
<parent-provides>
<service name="ROM"/>
<service name="LOG"/>
<service name="RM"/>
</parent-provides>
<default-route>
<any-service> <any-child/> <parent/> </any-service>
</default-route>
<start name="test-terminal_decoder">
<resource name="RAM" quantum="2M"/>
</start>
</config>
}
build_boot_image "core ld.lib.so init test-terminal_decoder"
run_genode_until "--- finished test ---" 10
puts "Test succeeded"

View File

@ -80,7 +80,7 @@ append config {
<config> <config>
<fstab> <tar name="vim.tar" /> </fstab> <fstab> <tar name="vim.tar" /> </fstab>
<start name="/bin/vim"> <start name="/bin/vim">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<!-- Deactivate the loading of plugins. Otherwise, vim will <!-- Deactivate the loading of plugins. Otherwise, vim will
attempt to use a sub shell for pattern matching --> attempt to use a sub shell for pattern matching -->

View File

@ -1,278 +0,0 @@
/*
* \brief Test for decoding terminal input
* \author Norman Feske
* \date 2011-07-05
*/
/*
* Copyright (C) 2011-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/log.h>
#include <util/misc_math.h>
#include <util/string.h>
/* Terminal includes */
#include <terminal/decoder.h>
class Static_character_screen : public Terminal::Character_screen
{
private:
Terminal::Character_array &_char_array;
Terminal::Boundary _boundary;
Terminal::Position _cursor_pos;
public:
Static_character_screen(Terminal::Character_array &char_array)
: _char_array(char_array), _boundary(_char_array.boundary()) { }
void dump() const;
/********************************
** Character_screen interface **
********************************/
void output(Terminal::Character c)
{
if (c.ascii() > 0x10)
_char_array.set(_cursor_pos, c);
_cursor_pos.x++;
if (_cursor_pos.x >= _boundary.width) {
_cursor_pos.x = 0;
_cursor_pos.y++;
}
if (_cursor_pos.y >= _boundary.height) {
_cursor_pos.y = _boundary.height - 1;
}
}
void civis()
{
}
void cnorm()
{
}
void cvvis()
{
}
void cpr()
{
}
void csr(int, int)
{
}
void cub(int)
{
}
void cuf(int)
{
if (_cursor_pos.x >= _boundary.width)
_cursor_pos.x++;
//
// _cursor_pos = _cursor_pos + Terminal::Offset(1, 0);
}
void cup(int y, int x)
{
using namespace Genode;
x = max(0, min(x, _boundary.width - 1));
y = max(0, min(y, _boundary.height - 1));
_cursor_pos = Terminal::Position(x, y);
}
void cuu1()
{
// if (_cursor_pos.y > 0)
// _cursor_pos.y--;
}
void dch(int)
{
}
void dl(int)
{
}
void ech(int)
{
}
void ed()
{
}
void el()
{
}
void el1()
{
}
void home()
{
_cursor_pos = Terminal::Position(0, 0);
}
void hpa(int x)
{
}
void hts()
{
}
void ich(int)
{
}
void il(int)
{
}
void oc()
{
}
void op()
{
}
void rc()
{
}
void ri()
{
}
void ris()
{
}
void rmam()
{
}
void rmir()
{
}
void setab(int)
{
}
void setaf(int)
{
}
void sgr(int)
{
}
virtual void sgr0()
{
}
void sc()
{
}
void smam()
{
}
void smir()
{
}
void tbc()
{
}
void u6(int, int)
{
}
void u7()
{
}
void u8()
{
}
void u9()
{
}
void vpa(int y)
{
}
};
void Static_character_screen::dump() const
{
using namespace Terminal;
Genode::log("--- screen dump follows ---");
Boundary const boundary = _char_array.boundary();
for (int y = 0; y < boundary.height; y++) {
char line[boundary.width + 1];
for (int x = 0; x < boundary.width; x++) {
Character c = _char_array.get(Position(x, y));
if (c.valid())
line[x] = c.ascii();
else
line[x] = ' ';
}
line[boundary.width] = 0;
Genode::log(Genode::Cstring(line));
}
Genode::log("--- end of screen dump ---");
}
extern "C" char _binary_vim_vt_start;
extern "C" char _binary_vim_vt_end;
int main(int argc, char **argv)
{
using namespace Terminal;
Static_character_array<81, 26> char_array;
Static_character_screen screen(char_array);
Decoder decoder(screen);
for (char *c = &_binary_vim_vt_start; c < &_binary_vim_vt_end; c++) {
decoder.insert(*c);
}
screen.dump();
return 0;
}

View File

@ -1,6 +0,0 @@
TARGET = test-terminal_decoder
SRC_CC = main.cc
SRC_BIN = vim.vt
LIBS = base
CC_CXX_WARN_STRICT =

View File

@ -1 +0,0 @@
[?25h[?8c[?25h[?0c[?25l[?1c~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ [No Name] 0,0-1 AllVIM - Vi IMprovedversion 7.2.330by Bram Moolenaar et al.Vim is open source and freely distributableHelp poor children in Uganda!type :help iccf<Enter> for information type :q<Enter> to exit type :help<Enter> or <F1> for on-line helptype :help version7<Enter> for version info[?25h[?0c[?25l[?1c::[?25h[?0cq[?25l[?1c[?25h[?0c [?25l[?1c[?25h[?0c

View File

@ -1 +1 @@
e08f39cf745a5b9c8ac0cb8f4ffe7f7c74df5a46 4f26912a3db5f084a3b6a2890b654e9fa1671c48

View File

@ -146,7 +146,7 @@ src/lib/ncurses/codes.c:
src/lib/ncurses/fallback.c: $(ncurses_src_dir)/tinfo/MKfallback.sh src/lib/ncurses/fallback.c: $(ncurses_src_dir)/tinfo/MKfallback.sh
@$(MSG_GENERATE)$@ @$(MSG_GENERATE)$@
$(VERBOSE)sh -e $< x src/lib/ncurses/misc/terminfo.src tic linux vt102 > $@ 2> /dev/null $(VERBOSE)sh -e $< x src/lib/ncurses/misc/terminfo.src tic screen vt102 > $@ 2> /dev/null
$(VERBOSE)#sh -e $< /usr/share/terminfo $(ncurses_src_dir)/misc/terminfo.src /usr/bin/tic > $@ $(VERBOSE)#sh -e $< /usr/share/terminfo $(ncurses_src_dir)/misc/terminfo.src /usr/bin/tic > $@
src/lib/ncurses/unctrl.c: src/lib/ncurses/unctrl.c:

View File

@ -114,21 +114,10 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
} }
}; };
public: static void _missing(char const *method_name)
{
Char_cell_array_character_screen(Cell_array<Char_cell> &char_cell_array) Genode::warning(method_name, " not implemented");
: }
_char_cell_array(char_cell_array),
_boundary(_char_cell_array.num_cols(), _char_cell_array.num_lines()),
_color_index(DEFAULT_COLOR_INDEX),
_inverse(false),
_highlight(false),
_cursor_visibility(CURSOR_VISIBLE),
_region_start(0),
_region_end(_boundary.height - 1),
_tab_size(DEFAULT_TAB_SIZE)
{ }
void _line_feed() void _line_feed()
{ {
@ -149,6 +138,21 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_cursor_pos.x = 0; _cursor_pos.x = 0;
} }
public:
Char_cell_array_character_screen(Cell_array<Char_cell> &char_cell_array)
:
_char_cell_array(char_cell_array),
_boundary(_char_cell_array.num_cols(), _char_cell_array.num_lines()),
_color_index(DEFAULT_COLOR_INDEX),
_inverse(false),
_highlight(false),
_cursor_visibility(CURSOR_VISIBLE),
_region_start(0),
_region_end(_boundary.height - 1),
_tab_size(DEFAULT_TAB_SIZE)
{ }
/******************************** /********************************
** Character_screen interface ** ** Character_screen interface **
@ -204,24 +208,24 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
} }
} }
void civis() void cbt() override { _missing(__func__); }
void civis() override
{ {
_cursor_visibility = CURSOR_INVISIBLE; _cursor_visibility = CURSOR_INVISIBLE;
} }
void cnorm() void cnorm() override
{ {
_cursor_visibility = CURSOR_VISIBLE; _cursor_visibility = CURSOR_VISIBLE;
} }
void cvvis() void cvvis() override
{ {
_cursor_visibility = CURSOR_VERY_VISIBLE; _cursor_visibility = CURSOR_VERY_VISIBLE;
} }
void cpr() { Genode::warning(__func__, " not implemented"); } void csr(int start, int end) override
void csr(int start, int end)
{ {
/* the arguments are specified use coordinate origin (1, 1) */ /* the arguments are specified use coordinate origin (1, 1) */
start--; start--;
@ -234,7 +238,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_region_end = Genode::max(_region_end, _region_start); _region_end = Genode::max(_region_end, _region_start);
} }
void cub(int dx) void cub(int dx) override
{ {
Cursor_guard guard(*this); Cursor_guard guard(*this);
@ -242,7 +246,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_cursor_pos.x = Genode::max(0, _cursor_pos.x); _cursor_pos.x = Genode::max(0, _cursor_pos.x);
} }
void cuf(int dx) void cuf(int dx) override
{ {
Cursor_guard guard(*this); Cursor_guard guard(*this);
@ -250,7 +254,7 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_cursor_pos.x = Genode::min(_boundary.width - 1, _cursor_pos.x); _cursor_pos.x = Genode::min(_boundary.width - 1, _cursor_pos.x);
} }
void cup(int y, int x) void cup(int y, int x) override
{ {
Cursor_guard guard(*this); Cursor_guard guard(*this);
@ -265,83 +269,47 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_cursor_pos = Terminal::Position(x, y); _cursor_pos = Terminal::Position(x, y);
} }
void cuu1() { Genode::warning(__func__, " not implemented"); } void cud(int) override { _missing(__func__); }
void dch(int) { Genode::warning(__func__, " not implemented"); } void cuu1() override { _missing(__func__); }
void cuu(int) override { _missing(__func__); }
void dch(int) override { _missing(__func__); }
void dl(int num_lines) void dl(int num_lines) override
{ {
/* delete number of lines */ /* delete number of lines */
for (int i = 0; i < num_lines; i++) for (int i = 0; i < num_lines; i++)
_char_cell_array.scroll_up(_cursor_pos.y, _region_end); _char_cell_array.scroll_up(_cursor_pos.y, _region_end);
} }
void ech(int v) void ed() override
{
/* clear number of characters */
int x = _cursor_pos.x;
int y = _cursor_pos.y;
while (v-- > 0) {
_char_cell_array.set_cell(x, y,
Char_cell(' ', Font_face::REGULAR,
_color_index, _inverse, _highlight));
if (x == (_boundary.width - 1)) {
/* end of line reached */
if (y < (_boundary.height - 1)) {
/* continue at beginning of next line */
x = 0;
y++;
} else {
/* end of screen reached */
return;
}
} else {
x++;
}
}
}
void ed()
{ {
/* clear to end of screen */ /* clear to end of screen */
el(); el();
_char_cell_array.clear(_cursor_pos.y + 1, _boundary.height - 1); _char_cell_array.clear(_cursor_pos.y + 1, _boundary.height - 1);
} }
void el() void el() override
{ {
/* clear to end of line */ /* clear to end of line */
for (int x = _cursor_pos.x; x < _boundary.width; x++) for (int x = _cursor_pos.x; x < _boundary.width; x++)
_char_cell_array.set_cell(x, _cursor_pos.y, Char_cell()); _char_cell_array.set_cell(x, _cursor_pos.y, Char_cell());
} }
void el1() { Genode::warning(__func__, " not implemented"); } void el1() override { _missing(__func__); }
void enacs() override { _missing(__func__); }
void flash() override { _missing(__func__); }
void home() void home() override
{ {
Cursor_guard guard(*this); Cursor_guard guard(*this);
_cursor_pos = Terminal::Position(0, 0); _cursor_pos = Terminal::Position(0, 0);
} }
void hpa(int x) void hts() override { _missing(__func__); }
{ void ich(int) override { _missing(__func__); }
Cursor_guard guard(*this);
/* top-left cursor position is reported as (1, 1) */ void il(int value) override
x--;
using namespace Genode;
_cursor_pos.x = max(0, min(x, _boundary.width - 1));
}
void hts() { Genode::warning(__func__, " not implemented"); }
void ich(int) { Genode::warning(__func__, " not implemented"); }
void il(int value)
{ {
Cursor_guard guard(*this); Cursor_guard guard(*this);
@ -356,32 +324,33 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
_char_cell_array.cursor(_cursor_pos, true); _char_cell_array.cursor(_cursor_pos, true);
} }
void oc() { Genode::warning(__func__, " not implemented"); } void is2() override { _missing(__func__); }
void nel() override { _missing(__func__); }
void op() void op() override
{ {
_color_index = DEFAULT_COLOR_INDEX | (DEFAULT_COLOR_INDEX_BG << 3); _color_index = DEFAULT_COLOR_INDEX | (DEFAULT_COLOR_INDEX_BG << 3);
} }
void rc() { Genode::warning(__func__, " not implemented"); } void rc() override { _missing(__func__); }
void ri() { Genode::warning(__func__, " not implemented"); } void rs2() override { _missing(__func__); }
void ris() { Genode::warning(__func__, " not implemented"); } void rmir() override { _missing(__func__); }
void rmam() { Genode::warning(__func__, " not implemented"); } void rmcup() override { }
void rmir() { Genode::warning(__func__, " not implemented"); } void rmkx() override { }
void setab(int value) void setab(int value) override
{ {
_color_index &= ~0x38; /* clear 111000 */ _color_index &= ~0x38; /* clear 111000 */
_color_index |= (((value == 9) ? DEFAULT_COLOR_INDEX_BG : value) << 3); _color_index |= (((value == 9) ? DEFAULT_COLOR_INDEX_BG : value) << 3);
} }
void setaf(int value) void setaf(int value) override
{ {
_color_index &= ~0x7; /* clear 000111 */ _color_index &= ~0x7; /* clear 000111 */
_color_index |= (value == 9) ? DEFAULT_COLOR_INDEX : value; _color_index |= (value == 9) ? DEFAULT_COLOR_INDEX : value;
} }
void sgr(int value) void sgr(int value) override
{ {
switch (value) { switch (value) {
case 0: case 0:
@ -401,30 +370,13 @@ class Char_cell_array_character_screen : public Terminal::Character_screen
} }
} }
void sgr0() void sgr0() override { sgr(0); }
{
sgr(0);
}
void sc() { Genode::warning(__func__, " not implemented"); } void sc() override { _missing(__func__); }
void smam() { Genode::warning(__func__, " not implemented"); } void smcup() override { }
void smir() { Genode::warning(__func__, " not implemented"); } void smir() override { _missing(__func__); }
void tbc() { Genode::warning(__func__, " not implemented"); } void smkx() override { }
void u6(int, int) { Genode::warning(__func__, " not implemented"); } void tbc() override { _missing(__func__); }
void u7() { Genode::warning(__func__, " not implemented"); }
void u8() { Genode::warning(__func__, " not implemented"); }
void u9() { Genode::warning(__func__, " not implemented"); }
void vpa(int y)
{
Cursor_guard guard(*this);
/* top-left cursor position is reported as (1, 1) */
y--;
using namespace Genode;
_cursor_pos.y = max(0, min(y, _boundary.height - 1));
}
}; };
#endif /* _TERMINAL__CHAR_CELL_ARRAY_CHARACTER_SCREEN_H_ */ #endif /* _TERMINAL__CHAR_CELL_ARRAY_CHARACTER_SCREEN_H_ */

View File

@ -37,6 +37,11 @@ struct Terminal::Character_screen : Genode::Interface
* thorough description of these commands. * thorough description of these commands.
*/ */
/**
* Back tab
*/
virtual void cbt() = 0;
/** /**
* Make cursor invisible * Make cursor invisible
*/ */
@ -52,11 +57,6 @@ struct Terminal::Character_screen : Genode::Interface
*/ */
virtual void cvvis() = 0; virtual void cvvis() = 0;
/**
* Reset string
*/
virtual void cpr() = 0;
/** /**
* Change region to line #1 ... line #2 * Change region to line #1 ... line #2
*/ */
@ -77,11 +77,21 @@ struct Terminal::Character_screen : Genode::Interface
*/ */
virtual void cup(int, int) = 0; virtual void cup(int, int) = 0;
/**
* Down #1 lines
*/
virtual void cud(int) = 0;
/** /**
* Move cursor up one line * Move cursor up one line
*/ */
virtual void cuu1() = 0; virtual void cuu1() = 0;
/**
* Up #1 lines
*/
virtual void cuu(int) = 0;
/** /**
* Delete #1 characters * Delete #1 characters
*/ */
@ -92,11 +102,6 @@ struct Terminal::Character_screen : Genode::Interface
*/ */
virtual void dl(int) = 0; virtual void dl(int) = 0;
/**
* Erase #1 characters
*/
virtual void ech(int) = 0;
/** /**
* Clear to end of screen * Clear to end of screen
*/ */
@ -112,16 +117,21 @@ struct Terminal::Character_screen : Genode::Interface
*/ */
virtual void el1() = 0; virtual void el1() = 0;
/**
* Enable alternative character set
*/
virtual void enacs() = 0;
/**
* Visible bell
*/
virtual void flash() = 0;
/** /**
* Home cursor * Home cursor
*/ */
virtual void home() = 0; virtual void home() = 0;
/**
* Horizontal position #1 absolute
*/
virtual void hpa(int) = 0;
/** /**
* Set a tab in every row, current column * Set a tab in every row, current column
*/ */
@ -138,9 +148,14 @@ struct Terminal::Character_screen : Genode::Interface
virtual void il(int) = 0; virtual void il(int) = 0;
/** /**
* Set all color pairs to the original ones * Initialization string
*/ */
virtual void oc() = 0; virtual void is2() = 0;
/**
* Newline
*/
virtual void nel() = 0;
/** /**
* Set default pair to its original value * Set default pair to its original value
@ -152,26 +167,26 @@ struct Terminal::Character_screen : Genode::Interface
*/ */
virtual void rc() = 0; virtual void rc() = 0;
/**
* Scroll text down
*/
virtual void ri() = 0;
/** /**
* Reset string * Reset string
*/ */
virtual void ris() = 0; virtual void rs2() = 0;
/** /**
* Turn off automatic margins * Leave cup mode
*/ */
virtual void rmam() = 0; virtual void rmcup() = 0;
/** /**
* Exit insert mode * Exit insert mode
*/ */
virtual void rmir() = 0; virtual void rmir() = 0;
/**
* Exit keyboard transmission mode
*/
virtual void rmkx() = 0;
/** /**
* Set background color to #1, using ANSI escape * Set background color to #1, using ANSI escape
*/ */
@ -198,32 +213,24 @@ struct Terminal::Character_screen : Genode::Interface
virtual void sc() = 0; virtual void sc() = 0;
/** /**
* Turn on automatic margins * Enter cup mode
*/ */
virtual void smam() = 0; virtual void smcup() = 0;
/** /**
* Enter insert mode * Enter insert mode
*/ */
virtual void smir() = 0; virtual void smir() = 0;
/**
* Enter keyboard transmission mode
*/
virtual void smkx() = 0;
/** /**
* Clear all tab stops * Clear all tab stops
*/ */
virtual void tbc() = 0; virtual void tbc() = 0;
/**
* User strings
*/
virtual void u6(int, int) = 0;
virtual void u7() = 0;
virtual void u8() = 0;
virtual void u9() = 0;
/**
* Vertical position #1 absolute)
*/
virtual void vpa(int) = 0;
}; };
#endif /* _TERMINAL__CHARACTER_SCREEN_H_ */ #endif /* _TERMINAL__CHARACTER_SCREEN_H_ */

View File

@ -200,9 +200,13 @@ class Terminal::Decoder
{ {
switch (_escape_stack[0].value) { switch (_escape_stack[0].value) {
case '7': return (_screen.sc(), true); case '7': return (_screen.sc(), true);
case 'c': return (_screen.ris(), true); case '8': return (_screen.rc(), true);
case 'E': return (_screen.nel(), true);
case 'H': return (_screen.hts(), true); case 'H': return (_screen.hts(), true);
case 'M': return (_screen.ri(), true); case 'M': return (_screen.cuu1(), true);
case '=': return true; /* follows 'smkx' */
case '>': return true; /* follows 'rmkx' */
case 'c': return true; /* prefixes 'rs2' */
default: return false; default: return false;
} }
} }
@ -214,32 +218,21 @@ class Terminal::Decoder
case '[': case '[':
switch (_escape_stack[1].value) { switch (_escape_stack[1].value) {
case 'A': return (_screen.cuu1(), true);
case 'C': return (_screen.cuf(1), true); case 'C': return (_screen.cuf(1), true);
case 'c': return (_screen.u9(), true);
case 'H': return (_screen.home(), true); case 'H': return (_screen.home(), true);
case 'J': return (_screen.ed(), true); case 'J': return (_screen.ed(), true);
case 'K': return (_screen.el(), true); case 'K': return (_screen.el(), true);
case 'L': return (_screen.il(1), true); case 'L': return (_screen.il(1), true);
case 'M': return (_screen.dl(1), true); case 'M': return (_screen.dl(1), true);
case 'P': return (_screen.dch(1), true); case 'P': return (_screen.dch(1), true);
case '@': return (_screen.ich(1), true); case 'Z': return (_screen.cbt(), true);
case 'R': return (_screen.cpr(), true);
case 'm': return (_screen.sgr0(), true); case 'm': return (_screen.sgr0(), true);
default: return false; default: return false;
} }
break; break;
case ']': case ')':
return (_escape_stack[1].value == 0) && (_screen.is2(), true);
switch (_escape_stack[1].value) {
case 'R': return (_screen.oc(), true);
default : return false;
}
case 8:
return (_escape_stack[1].value == 'A') && (_screen.rc(), true);
default: return false; default: return false;
} }
@ -262,19 +255,19 @@ class Terminal::Decoder
switch (command) { switch (command) {
case 'm': return _sgr(p1); case 'm': return _sgr(p1);
case 'D': return (_screen.cub(p1), true); case 'D': return (_screen.cub(p1), true);
case 'd': return (_screen.vpa(p1), true); case 'A': return (_screen.cuu(p1), true);
case 'B': return (_screen.cud(p1), true);
case 'g': return (p1 == 3) && (_screen.tbc(), true); case 'g': return (p1 == 3) && (_screen.tbc(), true);
case 'G': return (_screen.hpa(p1), true); case 'h': return ((p1 == 4) && (_screen.smir(), true))
case 'h': return (p1 == 4) && (_screen.smir(), true); || ((p1 == 34) && (_screen.cnorm(), true));
case 'K': return ((p1 == 0) && (_screen.el(), true)) case 'K': return ((p1 == 0) && (_screen.el(), true))
|| ((p1 == 1) && (_screen.el1(), true)); || ((p1 == 1) && (_screen.el1(), true));
case 'l': return (p1 == 4) && (_screen.rmir(), true); case 'l': return ((p1 == 4) && (_screen.rmir(), true))
|| ((p1 == 34) && (_screen.cvvis(), true));
case 'L': return (_screen.il(p1), true); case 'L': return (_screen.il(p1), true);
case 'M': return (_screen.dl(p1), true); case 'M': return (_screen.dl(p1), true);
case 'n': return (p1 == 6) && (_screen.u7(), true);
case 'P': return (_screen.dch(p1), true); case 'P': return (_screen.dch(p1), true);
case '@': return (_screen.ich(p1), true); case '@': return (_screen.ich(p1), true);
case 'X': return (_screen.ech(p1), true);
case 'C': return (_screen.cuf(p1), true); case 'C': return (_screen.cuf(p1), true);
default: return false; default: return false;
@ -297,8 +290,10 @@ class Terminal::Decoder
switch (command) { switch (command) {
case 'l': case 'l':
if (p1 == 7) return (_screen.rmam(), true); if (p1 == 1) return (_screen.rmkx(), true);
if (p1 == 25) return (_screen.civis(), true); if (p1 == 25) return (_screen.civis(), true);
if (p1 == 1000) return (_screen.rs2(), true);
if (p1 == 1049) return (_screen.rmcup(), true);
if (p1 == 2004) { if (p1 == 2004) {
/* disable bracketed paste */ /* disable bracketed paste */
Genode::warning("Sequence '[?2004l' is not implemented"); Genode::warning("Sequence '[?2004l' is not implemented");
@ -306,20 +301,15 @@ class Terminal::Decoder
} }
return false; return false;
case 'h': case 'h':
if (p1 == 7) return (_screen.smam(), true); if (p1 == 1) return (_screen.smkx(), true);
if (p1 == 25) return (_screen.cnorm(), true); if (p1 == 25) return (_screen.cnorm(), true);
if (p1 == 1049) return (_screen.smcup(), true);
if (p1 == 2004) { if (p1 == 2004) {
/* enable bracketed paste */ /* enable bracketed paste */
Genode::warning("Sequence '[?2004h' is not implemented"); Genode::warning("Sequence '[?2004h' is not implemented");
return true; return true;
} }
return false; return false;
case 'c':
if (p1 == 0) return true; /* appended to cnorm */
if (p1 == 1) return true; /* appended to civis */
if (p1 == 6) return (_screen.u8(), true);
if (p1 == 8) return (_screen.cvvis(), true);
return false;
default: return false; default: return false;
} }
} }
@ -345,6 +335,9 @@ class Terminal::Decoder
case 'H': return (_screen.cup(p[0], p[1]), true); case 'H': return (_screen.cup(p[0], p[1]), true);
case 'm': case 'm':
if (p[0] == 39 && p[1] == 49)
return (_screen.op(), true);
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
if (!_sgr(p[i])) if (!_sgr(p[i]))
Genode::warning("Number ", p[i], Genode::warning("Number ", p[i],
@ -354,7 +347,6 @@ class Terminal::Decoder
return true; return true;
case 'R': return (_screen.u6(p[0], p[1]), true);
default: return false; default: return false;
} }
} }

View File

@ -154,21 +154,21 @@ class Terminal::Scancode_tracker
/* handle special key to be represented by an escape sequence */ /* handle special key to be represented by an escape sequence */
if (!_last_character) { if (!_last_character) {
switch (keycode) { switch (keycode) {
case Input::KEY_DOWN: _last_sequence = "\E[B"; break; case Input::KEY_DOWN: _last_sequence = "\EOB"; break;
case Input::KEY_UP: _last_sequence = "\E[A"; break; case Input::KEY_UP: _last_sequence = "\EOA"; break;
case Input::KEY_RIGHT: _last_sequence = "\E[C"; break; case Input::KEY_RIGHT: _last_sequence = "\EOC"; break;
case Input::KEY_LEFT: _last_sequence = "\E[D"; break; case Input::KEY_LEFT: _last_sequence = "\EOD"; break;
case Input::KEY_HOME: _last_sequence = "\E[1~"; break; case Input::KEY_HOME: _last_sequence = "\E[1~"; break;
case Input::KEY_INSERT: _last_sequence = "\E[2~"; break; case Input::KEY_INSERT: _last_sequence = "\E[2~"; break;
case Input::KEY_DELETE: _last_sequence = "\E[3~"; break; case Input::KEY_DELETE: _last_sequence = "\E[3~"; break;
case Input::KEY_END: _last_sequence = "\E[4~"; break; case Input::KEY_END: _last_sequence = "\E[4~"; break;
case Input::KEY_PAGEUP: _last_sequence = "\E[5~"; break; case Input::KEY_PAGEUP: _last_sequence = "\E[5~"; break;
case Input::KEY_PAGEDOWN: _last_sequence = "\E[6~"; break; case Input::KEY_PAGEDOWN: _last_sequence = "\E[6~"; break;
case Input::KEY_F1: _last_sequence = "\E[[A"; break; case Input::KEY_F1: _last_sequence = "\EOP"; break;
case Input::KEY_F2: _last_sequence = "\E[[B"; break; case Input::KEY_F2: _last_sequence = "\EOQ"; break;
case Input::KEY_F3: _last_sequence = "\E[[C"; break; case Input::KEY_F3: _last_sequence = "\EOR"; break;
case Input::KEY_F4: _last_sequence = "\E[[D"; break; case Input::KEY_F4: _last_sequence = "\EOS"; break;
case Input::KEY_F5: _last_sequence = "\E[[E"; break; case Input::KEY_F5: _last_sequence = "\E[15~"; break;
case Input::KEY_F6: _last_sequence = "\E[17~"; break; case Input::KEY_F6: _last_sequence = "\E[17~"; break;
case Input::KEY_F7: _last_sequence = "\E[18~"; break; case Input::KEY_F7: _last_sequence = "\E[18~"; break;
case Input::KEY_F8: _last_sequence = "\E[19~"; break; case Input::KEY_F8: _last_sequence = "\E[19~"; break;

View File

@ -42,7 +42,7 @@
<dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir> <dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="noux:$PWD> " /> <env name="PS1" value="noux:$PWD> " />
</start> </start>
</config> </config>

View File

@ -125,7 +125,7 @@ Hello world !!
</dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
</start> </start>
</config> </config>
</start> </start>

View File

@ -98,7 +98,7 @@ append config {
<dir name="rw"> <fs/> </dir> <dir name="rw"> <fs/> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="PS1" value="fs:$PWD> " /> <env name="PS1" value="fs:$PWD> " />
<env name="HOME" value="/" /> <env name="HOME" value="/" />
<arg value="--login"/> <arg value="--login"/>

View File

@ -128,7 +128,7 @@ append config {
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="HOME" value="/home" /> <env name="HOME" value="/home" />
<arg value="--login" /> <arg value="--login" />
</start> </start>

View File

@ -171,7 +171,7 @@ append config {
<dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir> <dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
</start> </start>
</config> </config>
</start> </start>

View File

@ -261,7 +261,7 @@ append config {
</dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="HOME" value="/home" /> <env name="HOME" value="/home" />
<env name="PATH" value="/bin" /> <env name="PATH" value="/bin" />
<arg value="--login" /> <arg value="--login" />

View File

@ -175,7 +175,7 @@ append config {
<dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir> <dir name="share"> <dir name="vim"> <rom name="vimrc"/> </dir> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<env name="HOME" value="/home" /> <env name="HOME" value="/home" />
<arg value="--login" /> <arg value="--login" />
</start> </start>

View File

@ -183,7 +183,7 @@ append config {
<dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir> <dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
</start> </start>
</config> </config>
</start> </start>
@ -205,7 +205,7 @@ append config {
<dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir> <dir name="dev"> <terminal name="terminal" label="terminal_fs" /> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
</start> </start>
</config> </config>
</start> </start>

View File

@ -58,7 +58,7 @@ install_config {
<config> <config>
<fstab> <tar name="vim.tar" /> </fstab> <fstab> <tar name="vim.tar" /> </fstab>
<start name="/bin/vim"> <start name="/bin/vim">
<env name="TERM" value="linux" /> <env name="TERM" value="screen" />
<!-- Deactivate the loading of plugins. Otherwise, vim will <!-- Deactivate the loading of plugins. Otherwise, vim will
attempt to use a sub shell for pattern matching --> attempt to use a sub shell for pattern matching -->

View File

@ -152,7 +152,7 @@ set config_of_app {
<dir name="to"> <fs label="share_to"/> </dir> <dir name="to"> <fs label="share_to"/> </dir>
</fstab> </fstab>
<start name="/bin/bash"> <start name="/bin/bash">
<env name="TERM" value="linux"/> <env name="TERM" value="screen"/>
</start> </start>
</config> </config>
<route> <route>