OSC sequence support for GNU Screen and tmux
This commit is contained in:
parent
ffff3aa5ca
commit
4dca45036e
|
@ -1,3 +1,7 @@
|
||||||
|
2016-02-04 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* KDE Konsole detection improved
|
||||||
|
* OSC sequence support for GNU Screen and tmux
|
||||||
|
|
||||||
2016-01-31 Markus Gans <guru.mail@muenster.de>
|
2016-01-31 Markus Gans <guru.mail@muenster.de>
|
||||||
* Better escape sequences readability through
|
* Better escape sequences readability through
|
||||||
symbolic names like ESC, CSI or OSC
|
symbolic names like ESC, CSI or OSC
|
||||||
|
|
6
doc/TODO
6
doc/TODO
|
@ -4,11 +4,7 @@ Bugs
|
||||||
|
|
||||||
Improvements
|
Improvements
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
- Every OSC sequence ("\033]") should have been a special prefix and
|
-
|
||||||
postfix sequence for screen and tmux:
|
|
||||||
|
|
||||||
screen = "\033P" + OSC + control sequence + "\a\033\\"
|
|
||||||
tmux = "\033Ptmux:\033" + OSC + control sequence + "\033\\"
|
|
||||||
|
|
||||||
Missing Features
|
Missing Features
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
232
src/fterm.cpp
232
src/fterm.cpp
|
@ -495,7 +495,7 @@ int FTerm::parseKeyString ( char* buffer
|
||||||
const long key_timeout = 100000; // 100 ms
|
const long key_timeout = 100000; // 100 ms
|
||||||
int key, len, n;
|
int key, len, n;
|
||||||
|
|
||||||
if ( firstchar == 0x1b )
|
if ( firstchar == ESC[0] )
|
||||||
{
|
{
|
||||||
// x11 mouse tracking
|
// x11 mouse tracking
|
||||||
if ( buf_len >= 6 && buffer[1] == '[' && buffer[2] == 'M' )
|
if ( buf_len >= 6 && buffer[1] == '[' && buffer[2] == 'M' )
|
||||||
|
@ -766,8 +766,6 @@ char* FTerm::init_256colorTerminal()
|
||||||
|
|
||||||
if ( (s5 && strlen(s5) > 0) || (s6 && strlen(s6) > 0) )
|
if ( (s5 && strlen(s5) > 0) || (s6 && strlen(s6) > 0) )
|
||||||
kde_konsole = true;
|
kde_konsole = true;
|
||||||
else
|
|
||||||
kde_konsole = false;
|
|
||||||
|
|
||||||
if ( (s1 && strncmp(s1, "gnome-terminal", 14) == 0) || s2 )
|
if ( (s1 && strncmp(s1, "gnome-terminal", 14) == 0) || s2 )
|
||||||
{
|
{
|
||||||
|
@ -777,8 +775,6 @@ char* FTerm::init_256colorTerminal()
|
||||||
new_termtype = const_cast<char*>("gnome");
|
new_termtype = const_cast<char*>("gnome");
|
||||||
gnome_terminal = true;
|
gnome_terminal = true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
gnome_terminal = false;
|
|
||||||
|
|
||||||
return new_termtype;
|
return new_termtype;
|
||||||
}
|
}
|
||||||
|
@ -803,7 +799,7 @@ char* FTerm::parseAnswerbackMsg (char*& current_termtype)
|
||||||
putty_terminal = false;
|
putty_terminal = false;
|
||||||
|
|
||||||
if ( cygwin_terminal )
|
if ( cygwin_terminal )
|
||||||
putchar(0x8); // cygwin needs a backspace to delete the '♣' char
|
putchar (BS[0]); // cygwin needs a backspace to delete the '♣' char
|
||||||
|
|
||||||
return new_termtype;
|
return new_termtype;
|
||||||
}
|
}
|
||||||
|
@ -872,23 +868,13 @@ char* FTerm::parseSecDA (char*& current_termtype)
|
||||||
switch ( terminal_id_type )
|
switch ( terminal_id_type )
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if ( terminal_id_version == 136 )
|
if ( terminal_id_version == 115 )
|
||||||
|
kde_konsole = true;
|
||||||
|
else if ( terminal_id_version == 136 )
|
||||||
putty_terminal = true; // PuTTY
|
putty_terminal = true; // PuTTY
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
// Read the terminal (firmware) version
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if ( Sec_DA_components[1] )
|
|
||||||
terminal_id_version = Sec_DA_components[1].toInt();
|
|
||||||
else
|
|
||||||
terminal_id_version = -1;
|
|
||||||
}
|
|
||||||
catch (const std::exception&)
|
|
||||||
{
|
|
||||||
terminal_id_version = -1;
|
|
||||||
}
|
|
||||||
if ( ! sec_da_supported )
|
if ( ! sec_da_supported )
|
||||||
{
|
{
|
||||||
if ( terminal_id_version == 2 ) // also used by apple terminal
|
if ( terminal_id_version == 2 ) // also used by apple terminal
|
||||||
|
@ -950,6 +936,31 @@ char* FTerm::parseSecDA (char*& current_termtype)
|
||||||
return new_termtype;
|
return new_termtype;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::oscPrefix()
|
||||||
|
{
|
||||||
|
if ( tmux_terminal )
|
||||||
|
{
|
||||||
|
// tmux device control string
|
||||||
|
putstring (ESC "Ptmux;" ESC);
|
||||||
|
}
|
||||||
|
else if ( screen_terminal )
|
||||||
|
{
|
||||||
|
// GNU Screen device control string
|
||||||
|
putstring (ESC "P");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FTerm::oscPostfix()
|
||||||
|
{
|
||||||
|
if ( screen_terminal || tmux_terminal )
|
||||||
|
{
|
||||||
|
// GNU Screen/tmux string terminator
|
||||||
|
putstring (ESC "\\");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTerm::init_alt_charset()
|
void FTerm::init_alt_charset()
|
||||||
{
|
{
|
||||||
|
@ -1081,7 +1092,7 @@ void FTerm::init_termcaps()
|
||||||
ansi_default_color = tgetflag(const_cast<char*>("AX"));
|
ansi_default_color = tgetflag(const_cast<char*>("AX"));
|
||||||
|
|
||||||
// terminal supports operating system commands (OSC)
|
// terminal supports operating system commands (OSC)
|
||||||
// OSC = Esc + ]
|
// OSC = Esc + ']'
|
||||||
osc_support = tgetflag(const_cast<char*>("XT"));
|
osc_support = tgetflag(const_cast<char*>("XT"));
|
||||||
|
|
||||||
if ( isTeraTerm() )
|
if ( isTeraTerm() )
|
||||||
|
@ -1195,11 +1206,35 @@ void FTerm::init_termcaps()
|
||||||
|
|
||||||
// fallback if "Ic" is not found
|
// fallback if "Ic" is not found
|
||||||
if ( ! tcap[t_initialize_color].string )
|
if ( ! tcap[t_initialize_color].string )
|
||||||
tcap[t_initialize_color].string = \
|
{
|
||||||
const_cast<char*>(OSC "P%p1%x"
|
if ( screen_terminal )
|
||||||
"%p2%{255}%*%{1000}%/%02x"
|
{
|
||||||
"%p3%{255}%*%{1000}%/%02x"
|
if ( tmux_terminal )
|
||||||
"%p4%{255}%*%{1000}%/%02x");
|
{
|
||||||
|
tcap[t_initialize_color].string = \
|
||||||
|
const_cast<char*>(ESC "Ptmux;" ESC OSC "4;%p1%d;rgb:"
|
||||||
|
"%p2%{255}%*%{1000}%/%2.2X/"
|
||||||
|
"%p3%{255}%*%{1000}%/%2.2X/"
|
||||||
|
"%p4%{255}%*%{1000}%/%2.2X" BEL ESC "\\");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tcap[t_initialize_color].string = \
|
||||||
|
const_cast<char*>(ESC "P" OSC "4;%p1%d;rgb:"
|
||||||
|
"%p2%{255}%*%{1000}%/%2.2X/"
|
||||||
|
"%p3%{255}%*%{1000}%/%2.2X/"
|
||||||
|
"%p4%{255}%*%{1000}%/%2.2X" BEL ESC "\\");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tcap[t_initialize_color].string = \
|
||||||
|
const_cast<char*>(OSC "P%p1%x"
|
||||||
|
"%p2%{255}%*%{1000}%/%02x"
|
||||||
|
"%p3%{255}%*%{1000}%/%02x"
|
||||||
|
"%p4%{255}%*%{1000}%/%02x");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// fallback if "ti" is not found
|
// fallback if "ti" is not found
|
||||||
if ( ! tcap[t_enter_ca_mode].string )
|
if ( ! tcap[t_enter_ca_mode].string )
|
||||||
|
@ -1483,6 +1518,8 @@ void FTerm::init()
|
||||||
force_vt100 = \
|
force_vt100 = \
|
||||||
tera_terminal = \
|
tera_terminal = \
|
||||||
kterm_terminal = \
|
kterm_terminal = \
|
||||||
|
gnome_terminal = \
|
||||||
|
kde_konsole = \
|
||||||
rxvt_terminal = \
|
rxvt_terminal = \
|
||||||
urxvt_terminal = \
|
urxvt_terminal = \
|
||||||
mlterm_terminal = \
|
mlterm_terminal = \
|
||||||
|
@ -1707,7 +1744,7 @@ void FTerm::init()
|
||||||
setXTermMouseForeground ("rgb:0000/0000/0000");
|
setXTermMouseForeground ("rgb:0000/0000/0000");
|
||||||
if ( ! gnome_terminal )
|
if ( ! gnome_terminal )
|
||||||
setXTermCursorColor("rgb:ffff/ffff/ffff");
|
setXTermCursorColor("rgb:ffff/ffff/ffff");
|
||||||
if ( ! mintty_terminal && ! rxvt_terminal )
|
if ( ! mintty_terminal && ! rxvt_terminal && ! screen_terminal )
|
||||||
{
|
{
|
||||||
// mintty and rxvt can't reset these settings
|
// mintty and rxvt can't reset these settings
|
||||||
setXTermBackground("rgb:8080/a4a4/ecec");
|
setXTermBackground("rgb:8080/a4a4/ecec");
|
||||||
|
@ -2564,10 +2601,12 @@ bool FTerm::setVGAFont()
|
||||||
|
|
||||||
VGAFont = true;
|
VGAFont = true;
|
||||||
|
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
// Set font in xterm to vga
|
// Set font in xterm to vga
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "50;vga" BEL);
|
putstring (OSC "50;vga" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
NewFont = false;
|
NewFont = false;
|
||||||
pc_charset_console = true;
|
pc_charset_console = true;
|
||||||
|
@ -2618,11 +2657,13 @@ bool FTerm::setNewFont()
|
||||||
if ( NewFont )
|
if ( NewFont )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ( xterm || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal || urxvt_terminal || osc_support )
|
||||||
{
|
{
|
||||||
NewFont = true;
|
NewFont = true;
|
||||||
// Set font in xterm to 8x16graph
|
// Set font in xterm to 8x16graph
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "50;8x16graph" BEL);
|
putstring (OSC "50;8x16graph" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
pc_charset_console = true;
|
pc_charset_console = true;
|
||||||
Encoding = fc::PC;
|
Encoding = fc::PC;
|
||||||
|
@ -2677,14 +2718,22 @@ bool FTerm::setOldFont()
|
||||||
NewFont = \
|
NewFont = \
|
||||||
VGAFont = false;
|
VGAFont = false;
|
||||||
|
|
||||||
if ( xterm || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal || urxvt_terminal || osc_support )
|
||||||
{
|
{
|
||||||
if ( xterm_font && xterm_font->getLength() > 2 )
|
if ( xterm_font && xterm_font->getLength() > 2 )
|
||||||
|
{
|
||||||
// restore saved xterm font
|
// restore saved xterm font
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "50;%s" BEL, xterm_font->c_str() );
|
putstringf (OSC "50;%s" BEL, xterm_font->c_str() );
|
||||||
|
oscPostfix();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
// Set font in xterm to vga
|
// Set font in xterm to vga
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "50;vga" BEL);
|
putstring (OSC "50;vga" BEL);
|
||||||
|
oscPostfix();
|
||||||
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
retval = true;
|
retval = true;
|
||||||
}
|
}
|
||||||
|
@ -2961,9 +3010,11 @@ void FTerm::updateTerminal()
|
||||||
void FTerm::setKDECursor (fc::kde_konsole_CursorShape style)
|
void FTerm::setKDECursor (fc::kde_konsole_CursorShape style)
|
||||||
{
|
{
|
||||||
// Set cursor style in KDE konsole
|
// Set cursor style in KDE konsole
|
||||||
if ( kde_konsole || osc_support )
|
if ( kde_konsole )
|
||||||
{
|
{
|
||||||
putstringf (OSC "50;CursorShape=%d\007", style);
|
oscPrefix();
|
||||||
|
putstringf (OSC "50;CursorShape=%d" BEL, style);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2972,23 +3023,27 @@ void FTerm::setKDECursor (fc::kde_konsole_CursorShape style)
|
||||||
FString FTerm::getXTermFont()
|
FString FTerm::getXTermFont()
|
||||||
{
|
{
|
||||||
FString font("");
|
FString font("");
|
||||||
|
if ( xterm || screen_terminal || osc_support )
|
||||||
if ( raw_mode && non_blocking_stdin && osc_support )
|
|
||||||
{
|
{
|
||||||
int n;
|
if ( raw_mode && non_blocking_stdin )
|
||||||
char temp[150] = {};
|
|
||||||
putstring (OSC "50;?" BEL); // get font
|
|
||||||
fflush(stdout);
|
|
||||||
usleep(150000); // wait 150 ms
|
|
||||||
|
|
||||||
// read the terminal answer
|
|
||||||
n = int(read(fileno(stdin), &temp, sizeof(temp)-1));
|
|
||||||
|
|
||||||
// BEL + '\0' = string terminator
|
|
||||||
if ( n >= 6 && temp[n-1] == '\07' && temp[n] == '\0' )
|
|
||||||
{
|
{
|
||||||
temp[n-1] = '\0';
|
int n;
|
||||||
font = static_cast<char*>(temp + 5);
|
char temp[150] = {};
|
||||||
|
oscPrefix();
|
||||||
|
putstring (OSC "50;?" BEL); // get font
|
||||||
|
oscPostfix();
|
||||||
|
fflush(stdout);
|
||||||
|
usleep(150000); // wait 150 ms
|
||||||
|
|
||||||
|
// read the terminal answer
|
||||||
|
n = int(read(fileno(stdin), &temp, sizeof(temp)-1));
|
||||||
|
|
||||||
|
// BEL + '\0' = string terminator
|
||||||
|
if ( n >= 6 && temp[n-1] == BEL[0] && temp[n] == '\0' )
|
||||||
|
{
|
||||||
|
temp[n-1] = '\0';
|
||||||
|
font = static_cast<char*>(temp + 5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return font;
|
return font;
|
||||||
|
@ -3014,7 +3069,7 @@ FString FTerm::getXTermTitle()
|
||||||
n = int(read(fileno(stdin), &temp, sizeof(temp)-1));
|
n = int(read(fileno(stdin), &temp, sizeof(temp)-1));
|
||||||
|
|
||||||
// Esc + \ = OSC string terminator
|
// Esc + \ = OSC string terminator
|
||||||
if ( n >= 5 && temp[n-1] == '\\' && temp[n-2] == 0x1b )
|
if ( n >= 5 && temp[n-1] == '\\' && temp[n-2] == ESC[0] )
|
||||||
{
|
{
|
||||||
temp[n-2] = '\0';
|
temp[n-2] = '\0';
|
||||||
title = static_cast<char*>(temp + 3);
|
title = static_cast<char*>(temp + 3);
|
||||||
|
@ -3024,7 +3079,7 @@ FString FTerm::getXTermTitle()
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FTerm::setXTermCursorStyle(fc::xterm_cursor_style style)
|
void FTerm::setXTermCursorStyle (fc::xterm_cursor_style style)
|
||||||
{
|
{
|
||||||
// Set the xterm cursor style
|
// Set the xterm cursor style
|
||||||
if ( (xterm || mintty_terminal) && ! gnome_terminal && ! kde_konsole )
|
if ( (xterm || mintty_terminal) && ! gnome_terminal && ! kde_konsole )
|
||||||
|
@ -3038,9 +3093,13 @@ void FTerm::setXTermCursorStyle(fc::xterm_cursor_style style)
|
||||||
void FTerm::setXTermTitle (const FString& title)
|
void FTerm::setXTermTitle (const FString& title)
|
||||||
{
|
{
|
||||||
// Set the xterm title
|
// Set the xterm title
|
||||||
if ( xterm || mintty_terminal || putty_terminal || osc_support )
|
if ( xterm || screen_terminal
|
||||||
|
|| mintty_terminal || putty_terminal
|
||||||
|
|| osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "0;%s" BEL, title.c_str());
|
putstringf (OSC "0;%s" BEL, title.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3049,9 +3108,13 @@ void FTerm::setXTermTitle (const FString& title)
|
||||||
void FTerm::setXTermForeground (const FString& fg)
|
void FTerm::setXTermForeground (const FString& fg)
|
||||||
{
|
{
|
||||||
// Set the VT100 text foreground color
|
// Set the VT100 text foreground color
|
||||||
if ( xterm || mintty_terminal || mlterm_terminal || osc_support )
|
if ( xterm || screen_terminal
|
||||||
|
|| mintty_terminal || mlterm_terminal
|
||||||
|
|| osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "10;%s" BEL, fg.c_str());
|
putstringf (OSC "10;%s" BEL, fg.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3060,9 +3123,13 @@ void FTerm::setXTermForeground (const FString& fg)
|
||||||
void FTerm::setXTermBackground (const FString& bg)
|
void FTerm::setXTermBackground (const FString& bg)
|
||||||
{
|
{
|
||||||
// Set the VT100 text background color
|
// Set the VT100 text background color
|
||||||
if ( xterm || mintty_terminal || mlterm_terminal || osc_support )
|
if ( xterm || screen_terminal
|
||||||
|
|| mintty_terminal || mlterm_terminal
|
||||||
|
|| osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "11;%s" BEL, bg.c_str());
|
putstringf (OSC "11;%s" BEL, bg.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3071,9 +3138,13 @@ void FTerm::setXTermBackground (const FString& bg)
|
||||||
void FTerm::setXTermCursorColor (const FString& cc)
|
void FTerm::setXTermCursorColor (const FString& cc)
|
||||||
{
|
{
|
||||||
// Set the text cursor color
|
// Set the text cursor color
|
||||||
if ( xterm || mintty_terminal || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal
|
||||||
|
|| mintty_terminal || urxvt_terminal
|
||||||
|
|| osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "12;%s" BEL, cc.c_str());
|
putstringf (OSC "12;%s" BEL, cc.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3082,9 +3153,11 @@ void FTerm::setXTermCursorColor (const FString& cc)
|
||||||
void FTerm::setXTermMouseForeground (const FString& mfg)
|
void FTerm::setXTermMouseForeground (const FString& mfg)
|
||||||
{
|
{
|
||||||
// Set the mouse foreground color
|
// Set the mouse foreground color
|
||||||
if ( xterm || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal || urxvt_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "13;%s" BEL, mfg.c_str());
|
putstringf (OSC "13;%s" BEL, mfg.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3093,9 +3166,11 @@ void FTerm::setXTermMouseForeground (const FString& mfg)
|
||||||
void FTerm::setXTermMouseBackground (const FString& mbg)
|
void FTerm::setXTermMouseBackground (const FString& mbg)
|
||||||
{
|
{
|
||||||
// Set the mouse background color
|
// Set the mouse background color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "14;%s" BEL, mbg.c_str());
|
putstringf (OSC "14;%s" BEL, mbg.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3104,9 +3179,11 @@ void FTerm::setXTermMouseBackground (const FString& mbg)
|
||||||
void FTerm::setXTermHighlightBackground (const FString& hbg)
|
void FTerm::setXTermHighlightBackground (const FString& hbg)
|
||||||
{
|
{
|
||||||
// Set the highlight background color
|
// Set the highlight background color
|
||||||
if ( xterm || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal || urxvt_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "17;%s" BEL, hbg.c_str());
|
putstringf (OSC "17;%s" BEL, hbg.c_str());
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3115,9 +3192,11 @@ void FTerm::setXTermHighlightBackground (const FString& hbg)
|
||||||
void FTerm::resetXTermColors()
|
void FTerm::resetXTermColors()
|
||||||
{
|
{
|
||||||
// Reset the entire color table
|
// Reset the entire color table
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "104" BEL);
|
putstringf (OSC "104" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3126,9 +3205,11 @@ void FTerm::resetXTermColors()
|
||||||
void FTerm::resetXTermForeground()
|
void FTerm::resetXTermForeground()
|
||||||
{
|
{
|
||||||
// Reset the VT100 text foreground color
|
// Reset the VT100 text foreground color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "110" BEL);
|
putstring (OSC "110" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3137,9 +3218,11 @@ void FTerm::resetXTermForeground()
|
||||||
void FTerm::resetXTermBackground()
|
void FTerm::resetXTermBackground()
|
||||||
{
|
{
|
||||||
// Reset the VT100 text background color
|
// Reset the VT100 text background color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "111" BEL);
|
putstring (OSC "111" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3148,9 +3231,11 @@ void FTerm::resetXTermBackground()
|
||||||
void FTerm::resetXTermCursorColor()
|
void FTerm::resetXTermCursorColor()
|
||||||
{
|
{
|
||||||
// Reset the text cursor color
|
// Reset the text cursor color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "112" BEL);
|
putstring (OSC "112" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3159,9 +3244,11 @@ void FTerm::resetXTermCursorColor()
|
||||||
void FTerm::resetXTermMouseForeground()
|
void FTerm::resetXTermMouseForeground()
|
||||||
{
|
{
|
||||||
// Reset the mouse foreground color
|
// Reset the mouse foreground color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "113" BEL);
|
putstring (OSC "113" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3170,9 +3257,11 @@ void FTerm::resetXTermMouseForeground()
|
||||||
void FTerm::resetXTermMouseBackground()
|
void FTerm::resetXTermMouseBackground()
|
||||||
{
|
{
|
||||||
// Reset the mouse background color
|
// Reset the mouse background color
|
||||||
if ( xterm || osc_support )
|
if ( xterm || screen_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstring (OSC "114" BEL);
|
putstring (OSC "114" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3181,9 +3270,11 @@ void FTerm::resetXTermMouseBackground()
|
||||||
void FTerm::resetXTermHighlightBackground()
|
void FTerm::resetXTermHighlightBackground()
|
||||||
{
|
{
|
||||||
// Reset the highlight background color
|
// Reset the highlight background color
|
||||||
if ( xterm || urxvt_terminal || osc_support )
|
if ( xterm || screen_terminal || urxvt_terminal || osc_support )
|
||||||
{
|
{
|
||||||
|
oscPrefix();
|
||||||
putstringf (OSC "117" BEL);
|
putstringf (OSC "117" BEL);
|
||||||
|
oscPostfix();
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3249,7 +3340,6 @@ void FTerm::setPalette (short index, int r, int g, int b)
|
||||||
color_str = tparm(Ic, index, rr, gg, bb, 0, 0, 0, 0, 0);
|
color_str = tparm(Ic, index, rr, gg, bb, 0, 0, 0, 0, 0);
|
||||||
else if ( Ip )
|
else if ( Ip )
|
||||||
color_str = tparm(Ip, index, 0, 0, 0, rr, gg, bb, 0, 0);
|
color_str = tparm(Ip, index, 0, 0, 0, rr, gg, bb, 0, 0);
|
||||||
|
|
||||||
putstring (color_str);
|
putstring (color_str);
|
||||||
}
|
}
|
||||||
else if ( linux_terminal )
|
else if ( linux_terminal )
|
||||||
|
@ -3430,10 +3520,10 @@ bool FTerm::hideCursor (bool on)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( vs )
|
if ( ve )
|
||||||
appendOutputBuffer (vs);
|
|
||||||
else if ( ve )
|
|
||||||
appendOutputBuffer (ve);
|
appendOutputBuffer (ve);
|
||||||
|
else if ( vs )
|
||||||
|
appendOutputBuffer (vs);
|
||||||
hiddenCursor = false;
|
hiddenCursor = false;
|
||||||
}
|
}
|
||||||
flush_out();
|
flush_out();
|
||||||
|
@ -3619,7 +3709,7 @@ FString FTerm::getAnswerbackMsg()
|
||||||
tv.tv_sec = 0;
|
tv.tv_sec = 0;
|
||||||
tv.tv_usec = 150000; // 150 ms
|
tv.tv_usec = 150000; // 150 ms
|
||||||
|
|
||||||
putchar(0x05); // send enquiry character
|
putchar (ENQ[0]); // send enquiry character
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
// read the answerback message
|
// read the answerback message
|
||||||
|
@ -3655,10 +3745,10 @@ FString FTerm::getSecDA()
|
||||||
tv.tv_usec = 550000; // 150 ms
|
tv.tv_usec = 550000; // 150 ms
|
||||||
|
|
||||||
// get the secondary device attributes
|
// get the secondary device attributes
|
||||||
putchar(0x1b); // ESC
|
putchar (SECDA[0]);
|
||||||
putchar(0x5b); // [
|
putchar (SECDA[1]);
|
||||||
putchar(0x3e); // >
|
putchar (SECDA[2]);
|
||||||
putchar(0x63); // c
|
putchar (SECDA[3]);
|
||||||
|
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
usleep(150000); // min. wait time 150 ms (need for mintty)
|
usleep(150000); // min. wait time 150 ms (need for mintty)
|
||||||
|
|
15
src/fterm.h
15
src/fterm.h
|
@ -70,10 +70,13 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ascii sequences
|
// ascii sequences
|
||||||
#define BEL "\07" // Bell (ctrl‐g)
|
#define ENQ "\005" // Enquiry
|
||||||
#define SO "\016" // Shift out (alternative character set)
|
#define BEL "\007" // Bell (ctrl‐g)
|
||||||
#define SI "\017" // Shift in (regular character set)
|
#define BS "\010" // Backspace
|
||||||
#define OSC ESC "]" // Operating system command (7-bit)
|
#define SO "\016" // Shift out (alternative character set)
|
||||||
|
#define SI "\017" // Shift in (regular character set)
|
||||||
|
#define OSC ESC "]" // Operating system command (7-bit)
|
||||||
|
#define SECDA ESC "[>c" // Secondary Device Attributes
|
||||||
|
|
||||||
// VGA I/O-ports
|
// VGA I/O-ports
|
||||||
#define VideoIOBase ( (inb(0x3CC) & 0x01) ? 0x3D0 : 0x3B0 )
|
#define VideoIOBase ( (inb(0x3CC) & 0x01) ? 0x3D0 : 0x3B0 )
|
||||||
|
@ -240,9 +243,11 @@ class FTerm
|
||||||
static char* init_256colorTerminal();
|
static char* init_256colorTerminal();
|
||||||
static char* parseAnswerbackMsg (char*&);
|
static char* parseAnswerbackMsg (char*&);
|
||||||
static char* parseSecDA (char*&);
|
static char* parseSecDA (char*&);
|
||||||
static void init_termcaps();
|
static void oscPrefix();
|
||||||
|
static void oscPostfix();
|
||||||
static void init_alt_charset();
|
static void init_alt_charset();
|
||||||
static void init_pc_charset();
|
static void init_pc_charset();
|
||||||
|
static void init_termcaps();
|
||||||
static void init_encoding();
|
static void init_encoding();
|
||||||
void init();
|
void init();
|
||||||
void finish();
|
void finish();
|
||||||
|
|
|
@ -573,10 +573,14 @@ void MyDialog::cb_about (FWidget*, void*)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void MyDialog::cb_terminfo (FWidget*, void*)
|
void MyDialog::cb_terminfo (FWidget*, void*)
|
||||||
{
|
{
|
||||||
|
int x = getColumnNumber();
|
||||||
|
int y = getLineNumber();
|
||||||
FMessageBox info1 ( "Environment"
|
FMessageBox info1 ( "Environment"
|
||||||
, " Type: " + FString(getTermType()) + "\n"
|
, " Type: " + FString(getTermType()) + "\n"
|
||||||
" Name: " + FString(getTermName()) + "\n"
|
" Name: " + FString(getTermName()) + "\n"
|
||||||
" Mode: " + FString(getEncoding()) + "\n"
|
" Mode: " + FString(getEncoding()) + "\n"
|
||||||
|
" Size: " + FString().setNumber(x) + fc::Times
|
||||||
|
+ FString().setNumber(y) + "\n"
|
||||||
"Colors: " + FString().setNumber(getMaxColor())
|
"Colors: " + FString().setNumber(getMaxColor())
|
||||||
, FMessageBox::Ok, 0, 0, this );
|
, FMessageBox::Ok, 0, 0, this );
|
||||||
info1.setHeadline("Terminal:");
|
info1.setHeadline("Terminal:");
|
||||||
|
|
Loading…
Reference in New Issue