From 5af90cc1ace1f01d4b36ee71c650441d0d97cdb4 Mon Sep 17 00:00:00 2001 From: sqweek Date: Fri, 18 Jan 2013 21:50:43 +0800 Subject: [PATCH] Don't touch window title before an OSC is received. Fixes the "window title being clobbered" issue raised in issue 137. Signed-off-by: sqweek Closes #380. Closes #137. --- src/terminal/terminaldisplay.cc | 2 +- src/terminal/terminalframebuffer.cc | 2 +- src/terminal/terminalframebuffer.h | 3 +++ src/terminal/terminalfunctions.cc | 1 + 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/terminal/terminaldisplay.cc b/src/terminal/terminaldisplay.cc index 3b79959..a7c258b 100644 --- a/src/terminal/terminaldisplay.cc +++ b/src/terminal/terminaldisplay.cc @@ -56,7 +56,7 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const } /* has icon name or window title changed? */ - if ( has_title && + if ( has_title && f.is_title_initialized() && ( (!initialized) || (f.get_icon_name() != frame.last_frame.get_icon_name()) || (f.get_window_title() != frame.last_frame.get_window_title()) ) ) { diff --git a/src/terminal/terminalframebuffer.cc b/src/terminal/terminalframebuffer.cc index 6eaa5db..7eacb9c 100644 --- a/src/terminal/terminalframebuffer.cc +++ b/src/terminal/terminalframebuffer.cc @@ -68,7 +68,7 @@ DrawState::DrawState( int s_width, int s_height ) } Framebuffer::Framebuffer( int s_width, int s_height ) - : rows( s_height, Row( s_width, 0 ) ), icon_name(), window_title(), bell_count( 0 ), ds( s_width, s_height ) + : rows( s_height, Row( s_width, 0 ) ), icon_name(), window_title(), bell_count( 0 ), title_initialized( false ), ds( s_width, s_height ) { assert( s_height > 0 ); assert( s_width > 0 ); diff --git a/src/terminal/terminalframebuffer.h b/src/terminal/terminalframebuffer.h index ff3ab0d..f0a395c 100644 --- a/src/terminal/terminalframebuffer.h +++ b/src/terminal/terminalframebuffer.h @@ -248,6 +248,7 @@ namespace Terminal { std::deque icon_name; std::deque window_title; unsigned int bell_count; + bool title_initialized; /* true if the window title has been set via an OSC */ Row newrow( void ) { return Row( ds.get_width(), ds.get_background_rendition() ); } @@ -311,6 +312,8 @@ namespace Terminal { void reset( void ); void soft_reset( void ); + void set_title_initialized( void ) { title_initialized = true; } + bool is_title_initialized( void ) const { return title_initialized; } void set_icon_name( const std::deque &s ) { icon_name = s; } void set_window_title( const std::deque &s ) { window_title = s; } const std::deque & get_icon_name( void ) const { return icon_name; } diff --git a/src/terminal/terminalfunctions.cc b/src/terminal/terminalfunctions.cc index 22897c0..b509cbe 100644 --- a/src/terminal/terminalfunctions.cc +++ b/src/terminal/terminalfunctions.cc @@ -544,6 +544,7 @@ void Dispatcher::OSC_dispatch( const Parser::OSC_End *act, Framebuffer *fb ) bool set_icon = (cmd_num == 0 || cmd_num == 1); bool set_title = (cmd_num == 0 || cmd_num == 2); if ( set_icon || set_title ) { + fb->set_title_initialized(); std::deque newtitle( OSC_string.begin() + offset, OSC_string.end() ); if ( set_icon ) { fb->set_icon_name( newtitle ); } if ( set_title ) { fb->set_window_title( newtitle ); }