Track icon name and window title separately. Implement MOSH_TITLE_NOPREFIX
This commit is contained in:
+10
@@ -114,6 +114,16 @@ server. Otherwise, \fBmosh\fP will choose a port between 60000 and
|
|||||||
The escape sequence to shut down the connection is \fBCtrl-^ .\fP
|
The escape sequence to shut down the connection is \fBCtrl-^ .\fP
|
||||||
(typically typed with Ctrl-Shift-6, then a period).
|
(typically typed with Ctrl-Shift-6, then a period).
|
||||||
|
|
||||||
|
.SH ENVIRONMENT VARIABLES
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B MOSH_PREDICTION_DISPLAY
|
||||||
|
Controls local echo as described above.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B MOSH_TITLE_NOPREFIX
|
||||||
|
When set, inhibits prepending "[mosh]" to window title.
|
||||||
|
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR mosh-client (1),
|
.BR mosh-client (1),
|
||||||
.BR mosh-server (1).
|
.BR mosh-server (1).
|
||||||
|
|||||||
@@ -79,7 +79,9 @@ void STMClient::init( void )
|
|||||||
swrite( STDOUT_FILENO, Terminal::Emulator::open().c_str() );
|
swrite( STDOUT_FILENO, Terminal::Emulator::open().c_str() );
|
||||||
|
|
||||||
/* Add our name to window title */
|
/* Add our name to window title */
|
||||||
|
if ( !getenv( "MOSH_TITLE_NOPREFIX" ) ) {
|
||||||
overlays.set_title_prefix( wstring( L"[mosh] " ) );
|
overlays.set_title_prefix( wstring( L"[mosh] " ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void STMClient::shutdown( void )
|
void STMClient::shutdown( void )
|
||||||
|
|||||||
@@ -42,10 +42,13 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const
|
|||||||
frame.append( "\x07" );
|
frame.append( "\x07" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* has window title changed? */
|
/* has icon name or window title changed? */
|
||||||
if ( (!initialized)
|
if ( (!initialized)
|
||||||
|
|| (f.get_icon_name() != frame.last_frame.get_icon_name())
|
||||||
|| (f.get_window_title() != frame.last_frame.get_window_title()) ) {
|
|| (f.get_window_title() != frame.last_frame.get_window_title()) ) {
|
||||||
/* set window title */
|
/* set icon name and window title */
|
||||||
|
if ( f.get_icon_name() == f.get_window_title() ) {
|
||||||
|
/* write combined Icon Name and Window Title */
|
||||||
frame.append( "\033]0;" );
|
frame.append( "\033]0;" );
|
||||||
const std::deque<wchar_t> &window_title( f.get_window_title() );
|
const std::deque<wchar_t> &window_title( f.get_window_title() );
|
||||||
for ( BOOST_AUTO( i, window_title.begin() );
|
for ( BOOST_AUTO( i, window_title.begin() );
|
||||||
@@ -55,6 +58,29 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const
|
|||||||
frame.append( tmp );
|
frame.append( tmp );
|
||||||
}
|
}
|
||||||
frame.append( "\033\\" );
|
frame.append( "\033\\" );
|
||||||
|
} else {
|
||||||
|
/* write Icon Name */
|
||||||
|
frame.append( "\033]1;" );
|
||||||
|
const std::deque<wchar_t> &icon_name( f.get_icon_name() );
|
||||||
|
for ( BOOST_AUTO( i, icon_name.begin() );
|
||||||
|
i != icon_name.end();
|
||||||
|
i++ ) {
|
||||||
|
snprintf( tmp, 64, "%lc", *i );
|
||||||
|
frame.append( tmp );
|
||||||
|
}
|
||||||
|
frame.append( "\033\\" );
|
||||||
|
|
||||||
|
frame.append( "\033]2;" );
|
||||||
|
const std::deque<wchar_t> &window_title( f.get_window_title() );
|
||||||
|
for ( BOOST_AUTO( i, window_title.begin() );
|
||||||
|
i != window_title.end();
|
||||||
|
i++ ) {
|
||||||
|
snprintf( tmp, 64, "%lc", *i );
|
||||||
|
frame.append( tmp );
|
||||||
|
}
|
||||||
|
frame.append( "\033\\" );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* has reverse video state changed? */
|
/* has reverse video state changed? */
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ DrawState::DrawState( int s_width, int s_height )
|
|||||||
}
|
}
|
||||||
|
|
||||||
Framebuffer::Framebuffer( int s_width, int s_height )
|
Framebuffer::Framebuffer( int s_width, int s_height )
|
||||||
: rows( s_height, Row( s_width, 0 ) ), window_title(), bell_count( 0 ), ds( s_width, s_height )
|
: rows( s_height, Row( s_width, 0 ) ), icon_name(), window_title(), bell_count( 0 ), ds( s_width, s_height )
|
||||||
{
|
{
|
||||||
assert( s_height > 0 );
|
assert( s_height > 0 );
|
||||||
assert( s_width > 0 );
|
assert( s_width > 0 );
|
||||||
|
|||||||
@@ -218,6 +218,7 @@ namespace Terminal {
|
|||||||
class Framebuffer {
|
class Framebuffer {
|
||||||
private:
|
private:
|
||||||
std::deque<Row> rows;
|
std::deque<Row> rows;
|
||||||
|
std::deque<wchar_t> icon_name;
|
||||||
std::deque<wchar_t> window_title;
|
std::deque<wchar_t> window_title;
|
||||||
unsigned int bell_count;
|
unsigned int bell_count;
|
||||||
|
|
||||||
@@ -283,7 +284,9 @@ namespace Terminal {
|
|||||||
void reset( void );
|
void reset( void );
|
||||||
void soft_reset( void );
|
void soft_reset( void );
|
||||||
|
|
||||||
|
void set_icon_name( const std::deque<wchar_t> &s ) { icon_name = s; }
|
||||||
void set_window_title( const std::deque<wchar_t> &s ) { window_title = s; }
|
void set_window_title( const std::deque<wchar_t> &s ) { window_title = s; }
|
||||||
|
const std::deque<wchar_t> & get_icon_name( void ) const { return icon_name; }
|
||||||
const std::deque<wchar_t> & get_window_title( void ) const { return window_title; }
|
const std::deque<wchar_t> & get_window_title( void ) const { return window_title; }
|
||||||
|
|
||||||
void prefix_window_title( const std::deque<wchar_t> &s );
|
void prefix_window_title( const std::deque<wchar_t> &s );
|
||||||
|
|||||||
@@ -506,12 +506,29 @@ static Function func_CSI_DECSTR( CSI, "!p", CSI_DECSTR );
|
|||||||
void Dispatcher::OSC_dispatch( const Parser::OSC_End *act, Framebuffer *fb )
|
void Dispatcher::OSC_dispatch( const Parser::OSC_End *act, Framebuffer *fb )
|
||||||
{
|
{
|
||||||
if ( OSC_string.size() >= 2 ) {
|
if ( OSC_string.size() >= 2 ) {
|
||||||
if ( (OSC_string[ 0 ] == L'0')
|
if ( ( (OSC_string[ 0 ] == L'0')
|
||||||
|
|| (OSC_string[ 0 ] == L'1')
|
||||||
|
|| (OSC_string[ 0 ] == L'2') )
|
||||||
&& (OSC_string[ 1 ] == L';') ) {
|
&& (OSC_string[ 1 ] == L';') ) {
|
||||||
std::deque<wchar_t> newtitle( OSC_string.begin(), OSC_string.end() );
|
std::deque<wchar_t> newtitle( OSC_string.begin(), OSC_string.end() );
|
||||||
newtitle.erase( newtitle.begin() );
|
newtitle.erase( newtitle.begin() );
|
||||||
newtitle.erase( newtitle.begin() );
|
newtitle.erase( newtitle.begin() );
|
||||||
|
|
||||||
|
switch ( OSC_string[ 0 ] ) {
|
||||||
|
case L'0':
|
||||||
|
fb->set_icon_name( newtitle );
|
||||||
fb->set_window_title( newtitle );
|
fb->set_window_title( newtitle );
|
||||||
|
break;
|
||||||
|
case L'1':
|
||||||
|
fb->set_icon_name( newtitle );
|
||||||
|
break;
|
||||||
|
case L'2':
|
||||||
|
fb->set_window_title( newtitle );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
act->handled = true;
|
act->handled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user