Skip to content

Commit

Permalink
Merge pull request mobile-shell#1104 from mgulick/osc-52-clipboard-types
Browse files Browse the repository at this point in the history
Support additional OSC 52 clipboard types
  • Loading branch information
jdrouhard committed May 20, 2023
2 parents 38c8d24 + e922128 commit 119086e
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/terminal/terminaldisplay.cc
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const
}

/* has clipboard changed? */
if (f.get_clipboard() != frame.last_frame.get_clipboard()) {
frame.append( "\033]52;c;" );
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();
i != clipboard.end();
Expand Down
7 changes: 5 additions & 2 deletions src/terminal/terminalframebuffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand All @@ -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 )
{
}

Expand All @@ -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;
Expand Down Expand Up @@ -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 */
}

Expand Down
11 changes: 9 additions & 2 deletions src/terminal/terminalframebuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
{
Expand Down Expand Up @@ -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; }
Expand All @@ -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 );
}
};
}
Expand Down
11 changes: 7 additions & 4 deletions src/terminal/terminalfunctions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -591,12 +591,15 @@ static Function func_CSI_DECSTR( CSI, "!p", CSI_DECSTR );
/* xterm uses an Operating System Command to set the window title */
void Dispatcher::OSC_dispatch( const Parser::OSC_End *act __attribute((unused)), Framebuffer *fb )
{
/* handle osc copy clipboard sequence 52;c; */
/* Handle OSC copy clipboard sequence 52;c; and variants */
if ( OSC_string.size() >= 5 && OSC_string[ 0 ] == L'5' &&
OSC_string[ 1 ] == L'2' && OSC_string[ 2 ] == L';' &&
OSC_string[ 3 ] == L'c' && OSC_string[ 4 ] == L';') {
OSC_string[ 1 ] == L'2' && OSC_string[ 2 ] == L';') {
/* Capture the options and clipboard contents
e.g. '52;c;bW9zaCBpcyBncmVhdAo='
^^^^^^^^^^^^^^^^^^^^^^^
capture this part */
Terminal::Framebuffer::title_type clipboard(
OSC_string.begin() + 5, OSC_string.end() );
OSC_string.begin() + 3, OSC_string.end() );
fb->set_clipboard( clipboard );
/* handle osc terminal title sequence */
} else if ( OSC_string.size() >= 1 ) {
Expand Down

0 comments on commit 119086e

Please sign in to comment.