Skip to content

Commit

Permalink
Merge pull request mobile-shell#1167 from matheusfillipe/master
Browse files Browse the repository at this point in the history
Improve cursor style handling
  • Loading branch information
jdrouhard committed May 20, 2023
2 parents ec788d3 + c7740d4 commit 726ce3e
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/terminal/terminaldisplay.cc
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,12 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const
frame.append( "\033[?25l" );
}

/* is cursor style initialized? */
if ( !initialized ) {
frame.cursor_style = Terminal::CursorStyle::BLINKING_BLOCK;
frame.append( "\033[0 q" );
}

int frame_y = 0;
Framebuffer::row_pointer blank_row;
Framebuffer::rows_type rows( frame.last_frame.get_rows() );
Expand Down Expand Up @@ -286,6 +292,14 @@ std::string Display::new_frame( bool initialized, const Framebuffer &last, const
}
}

/* has cursor style changed? */
if ( (!initialized)
|| (f.ds.cursor_style != frame.cursor_style) ) {
char cursor_style_sequence_buf[6];
snprintf( cursor_style_sequence_buf, sizeof cursor_style_sequence_buf, "\033[%d q", f.ds.cursor_style );
frame.append( cursor_style_sequence_buf );
}

/* have renditions changed? */
frame.update_rendition( f.ds.get_renditions(), !initialized );

Expand Down Expand Up @@ -483,6 +497,7 @@ bool Display::put_row( bool initialized, FrameState &frame, const Framebuffer &f
FrameState::FrameState( const Framebuffer &s_last )
: str(), cursor_x(0), cursor_y(0), current_rendition( 0 ),
cursor_visible( s_last.ds.cursor_visible ),
cursor_style( s_last.ds.cursor_style ),
last_frame( s_last )
{
/* Preallocate for better performance. Make a guess-- doesn't matter for correctness */
Expand Down
1 change: 1 addition & 0 deletions src/terminal/terminaldisplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ namespace Terminal {
int cursor_x, cursor_y;
Renditions current_rendition;
bool cursor_visible;
int cursor_style;

const Framebuffer &last_frame;

Expand Down
2 changes: 2 additions & 0 deletions src/terminal/terminalframebuffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ DrawState::DrawState( int s_width, int s_height )
combining_char_col( 0 ), combining_char_row( 0 ), default_tabs( true ), tabs( s_width ),
scrolling_region_top_row( 0 ), scrolling_region_bottom_row( height - 1 ),
renditions( 0 ), save(),
cursor_style( Terminal::CursorStyle::BLINKING_BLOCK ),
next_print_will_wrap( false ), origin_mode( false ), auto_wrap_mode( true ),
insert_mode( false ), cursor_visible( true ), reverse_video( false ),
bracketed_paste( false ), mouse_reporting_mode( MOUSE_REPORTING_NONE ), mouse_focus_event( false ),
Expand Down Expand Up @@ -395,6 +396,7 @@ void Framebuffer::soft_reset( void )
ds.insert_mode = false;
ds.origin_mode = false;
ds.cursor_visible = true; /* per xterm and gnome-terminal */
ds.cursor_style = Terminal::CursorStyle::BLINKING_BLOCK;
ds.application_mode_cursor_keys = false;
ds.set_scrolling_region( 0, ds.get_height() - 1 );
ds.add_rendition( 0 );
Expand Down
13 changes: 13 additions & 0 deletions src/terminal/terminalframebuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,16 @@ namespace Terminal {
using shared::make_shared;
typedef uint32_t color_type;

enum CursorStyle {
BLINKING_BLOCK = 0,
BLINKING_BLOCK_DEFAULT = 1,
STEADY_BLOCK = 2,
BLINKING_UNDERLINE = 3,
STEADY_UNDERLINE = 4,
BLINKING_BAR = 5,
STEADY_BAR = 6,
};

class Renditions {
public:
typedef enum { bold, faint, italic, underlined, blink, inverse, invisible, strikethrough, SIZE } attribute_type;
Expand Down Expand Up @@ -275,6 +285,8 @@ namespace Terminal {
SavedCursor save;

public:
int cursor_style;

bool next_print_will_wrap;
bool origin_mode;
bool auto_wrap_mode;
Expand Down Expand Up @@ -351,6 +363,7 @@ namespace Terminal {
return ( width == x.width ) && ( height == x.height ) && ( cursor_col == x.cursor_col )
&& ( cursor_row == x.cursor_row ) && ( cursor_visible == x.cursor_visible ) &&
( reverse_video == x.reverse_video ) && ( renditions == x.renditions ) &&
( cursor_style == x.cursor_style ) &&
( bracketed_paste == x.bracketed_paste ) && ( mouse_reporting_mode == x.mouse_reporting_mode ) &&
( mouse_focus_event == x.mouse_focus_event ) && ( mouse_alternate_scroll == x.mouse_alternate_scroll) &&
( mouse_encoding_mode == x.mouse_encoding_mode );
Expand Down
20 changes: 20 additions & 0 deletions src/terminal/terminalfunctions.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,26 @@ static void clearline( Framebuffer *fb, int row, int start, int end )
}
}

/* cursor style */
static void CSI_DECSCUSR( Framebuffer *fb, Dispatcher *dispatch ) {
int style = dispatch->getparam( 0, 0 );
switch ( style ) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
fb->ds.cursor_style = style;
break;
default:
break;
}
}

static Function func_CSI_DECSCUSR( CSI, " q", CSI_DECSCUSR );

/* erase in line */
static void CSI_EL( Framebuffer *fb, Dispatcher *dispatch )
{
Expand Down

0 comments on commit 726ce3e

Please sign in to comment.