diff --git a/src/terminal/terminaldisplay.cc b/src/terminal/terminaldisplay.cc index 7f508efd7..6cb2fd039 100644 --- a/src/terminal/terminaldisplay.cc +++ b/src/terminal/terminaldisplay.cc @@ -111,7 +111,7 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const } /* has clipboard changed? */ - if (f.get_clipboard() != frame.last_frame.get_clipboard()) { + if (f.get_clipboard_seqnum() != frame.last_frame.get_clipboard_seqnum()) { frame.append( "\033]52;" ); const title_type &clipboard( f.get_clipboard() ); for ( title_type::const_iterator i = clipboard.begin(); diff --git a/src/terminal/terminalframebuffer.cc b/src/terminal/terminalframebuffer.cc index 2751f3b7d..1b7406d62 100644 --- a/src/terminal/terminalframebuffer.cc +++ b/src/terminal/terminalframebuffer.cc @@ -78,7 +78,8 @@ DrawState::DrawState( int s_width, int s_height ) } Framebuffer::Framebuffer( int s_width, int s_height ) - : rows(), icon_name(), window_title(), clipboard(), bell_count( 0 ), title_initialized( false ), ds( s_width, s_height ) + : rows(), icon_name(), window_title(), clipboard(), bell_count( 0 ), + title_initialized( false ), clipboard_seqnum( 0 ), ds( s_width, s_height ) { assert( s_height > 0 ); assert( s_width > 0 ); @@ -90,7 +91,7 @@ Framebuffer::Framebuffer( int s_width, int s_height ) Framebuffer::Framebuffer( const Framebuffer &other ) : rows( other.rows ), icon_name( other.icon_name ), window_title( other.window_title ), clipboard( other.clipboard ), bell_count( other.bell_count ), - title_initialized( other.title_initialized ), ds( other.ds ) + title_initialized( other.title_initialized ), clipboard_seqnum( other.clipboard_seqnum ), ds( other.ds ) { } @@ -103,6 +104,7 @@ Framebuffer & Framebuffer::operator=( const Framebuffer &other ) clipboard = other.clipboard; bell_count = other.bell_count; title_initialized = other.title_initialized; + clipboard_seqnum = other.clipboard_seqnum; ds = other.ds; } return *this; @@ -384,6 +386,7 @@ void Framebuffer::reset( void ) rows = rows_type( height, newrow() ); window_title.clear(); clipboard.clear(); + clipboard_seqnum = 0; /* do not reset bell_count */ } diff --git a/src/terminal/terminalframebuffer.h b/src/terminal/terminalframebuffer.h index de9386977..91d88e709 100644 --- a/src/terminal/terminalframebuffer.h +++ b/src/terminal/terminalframebuffer.h @@ -382,6 +382,7 @@ namespace Terminal { title_type clipboard; unsigned int bell_count; bool title_initialized; /* true if the window title has been set via an OSC */ + uint8_t clipboard_seqnum; row_pointer newrow( void ) { @@ -452,7 +453,13 @@ namespace Terminal { bool is_title_initialized( void ) const { return title_initialized; } void set_icon_name( const title_type &s ) { icon_name = s; } void set_window_title( const title_type &s ) { window_title = s; } - void set_clipboard( const title_type &s ) { clipboard = s; } + void set_clipboard( const title_type &s ) + { + clipboard = s; + // Rolling over 255 -> 0 is okay + clipboard_seqnum++; + } + uint8_t get_clipboard_seqnum ( void ) const { return clipboard_seqnum; } const title_type & get_icon_name( void ) const { return icon_name; } const title_type & get_window_title( void ) const { return window_title; } const title_type & get_clipboard( void ) const { return clipboard; } @@ -469,7 +476,7 @@ namespace Terminal { bool operator==( const Framebuffer &x ) const { - return ( rows == x.rows ) && ( window_title == x.window_title ) && ( clipboard == x.clipboard ) && ( bell_count == x.bell_count ) && ( ds == x.ds ); + return ( rows == x.rows ) && ( window_title == x.window_title ) && ( clipboard == x.clipboard ) && ( clipboard_seqnum == x.clipboard_seqnum ) && ( bell_count == x.bell_count ) && ( ds == x.ds ); } }; }