Remove overlap logic in Cell -- pointers invalidated by vector ops
This commit is contained in:
+9
-6
@@ -79,7 +79,12 @@ void Emulator::print( Parser::Print *act )
|
|||||||
this_cell->width = chwidth;
|
this_cell->width = chwidth;
|
||||||
fb.apply_renditions_to_current_cell();
|
fb.apply_renditions_to_current_cell();
|
||||||
|
|
||||||
fb.claim_overlap( fb.ds.get_cursor_row(), fb.ds.get_cursor_col() );
|
if ( chwidth == 2 ) { /* erase overlapped cell */
|
||||||
|
Cell *next = fb.get_cell( fb.ds.get_cursor_row(), fb.ds.get_cursor_col() + 1 );
|
||||||
|
if ( next ) {
|
||||||
|
next->reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fb.ds.move_col( chwidth, true, true );
|
fb.ds.move_col( chwidth, true, true );
|
||||||
|
|
||||||
@@ -134,15 +139,11 @@ void Emulator::debug_printout( int fd )
|
|||||||
screen.append( "\033[H" );
|
screen.append( "\033[H" );
|
||||||
|
|
||||||
for ( int y = 0; y < fb.ds.get_height(); y++ ) {
|
for ( int y = 0; y < fb.ds.get_height(); y++ ) {
|
||||||
for ( int x = 0; x < fb.ds.get_width(); x++ ) {
|
for ( int x = 0; x < fb.ds.get_width(); /* let charwidth handle advance */ ) {
|
||||||
char curmove[ 32 ];
|
char curmove[ 32 ];
|
||||||
snprintf( curmove, 32, "\033[%d;%dH\033[X", y + 1, x + 1 );
|
snprintf( curmove, 32, "\033[%d;%dH\033[X", y + 1, x + 1 );
|
||||||
screen.append( curmove );
|
screen.append( curmove );
|
||||||
Cell *cell = fb.get_cell( y, x );
|
Cell *cell = fb.get_cell( y, x );
|
||||||
if ( cell->overlapping_cell ) continue;
|
|
||||||
|
|
||||||
assert( (cell->overlapped_cells.size() + 1 == (size_t)cell->width)
|
|
||||||
|| (x == fb.ds.get_width() - 1) );
|
|
||||||
|
|
||||||
/* print renditions */
|
/* print renditions */
|
||||||
screen.append( "\033[0" );
|
screen.append( "\033[0" );
|
||||||
@@ -171,6 +172,8 @@ void Emulator::debug_printout( int fd )
|
|||||||
snprintf( utf8, 8, "%lc", *i );
|
snprintf( utf8, 8, "%lc", *i );
|
||||||
screen.append( utf8 );
|
screen.append( utf8 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
x += cell->width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-34
@@ -5,18 +5,14 @@
|
|||||||
using namespace Terminal;
|
using namespace Terminal;
|
||||||
|
|
||||||
Cell::Cell()
|
Cell::Cell()
|
||||||
: overlapping_cell( NULL ),
|
: contents(),
|
||||||
contents(),
|
|
||||||
overlapped_cells(),
|
|
||||||
fallback( false ),
|
fallback( false ),
|
||||||
width( 1 ),
|
width( 1 ),
|
||||||
renditions()
|
renditions()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Cell::Cell( const Cell &x )
|
Cell::Cell( const Cell &x )
|
||||||
: overlapping_cell( x.overlapping_cell ),
|
: contents( x.contents ),
|
||||||
contents( x.contents ),
|
|
||||||
overlapped_cells( x.overlapped_cells ),
|
|
||||||
fallback( x.fallback ),
|
fallback( x.fallback ),
|
||||||
width( x.width ),
|
width( x.width ),
|
||||||
renditions( x.renditions )
|
renditions( x.renditions )
|
||||||
@@ -24,9 +20,7 @@ Cell::Cell( const Cell &x )
|
|||||||
|
|
||||||
Cell & Cell::operator=( const Cell &x )
|
Cell & Cell::operator=( const Cell &x )
|
||||||
{
|
{
|
||||||
overlapping_cell = x.overlapping_cell;
|
|
||||||
contents = x.contents;
|
contents = x.contents;
|
||||||
overlapped_cells = x.overlapped_cells;
|
|
||||||
fallback = x.fallback;
|
fallback = x.fallback;
|
||||||
width = x.width;
|
width = x.width;
|
||||||
renditions = x.renditions;
|
renditions = x.renditions;
|
||||||
@@ -44,18 +38,6 @@ void Cell::reset( void )
|
|||||||
fallback = false;
|
fallback = false;
|
||||||
width = 1;
|
width = 1;
|
||||||
renditions.clear();
|
renditions.clear();
|
||||||
|
|
||||||
if ( overlapping_cell ) {
|
|
||||||
assert( overlapped_cells.size() == 0 );
|
|
||||||
} else {
|
|
||||||
for ( std::vector<Cell *>::iterator i = overlapped_cells.begin();
|
|
||||||
i != overlapped_cells.end();
|
|
||||||
i++ ) {
|
|
||||||
(*i)->overlapping_cell = NULL;
|
|
||||||
(*i)->reset();
|
|
||||||
}
|
|
||||||
overlapped_cells.clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawState::DrawState( int s_width, int s_height )
|
DrawState::DrawState( int s_width, int s_height )
|
||||||
@@ -183,20 +165,6 @@ Cell *Framebuffer::get_combining_cell( void )
|
|||||||
return &rows[ ds.get_combining_char_row() ].cells[ ds.get_combining_char_col() ];
|
return &rows[ ds.get_combining_char_row() ].cells[ ds.get_combining_char_col() ];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Framebuffer::claim_overlap( int row, int col )
|
|
||||||
{
|
|
||||||
Cell *the_cell = &rows[ row ].cells[ col ];
|
|
||||||
|
|
||||||
for ( int i = col + 1; i < col + the_cell->width; i++ ) {
|
|
||||||
if ( i < ds.get_width() ) {
|
|
||||||
Cell *next_cell = get_cell( row, i );
|
|
||||||
next_cell->reset();
|
|
||||||
the_cell->overlapped_cells.push_back( next_cell );
|
|
||||||
next_cell->overlapping_cell = the_cell;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawState::set_tab( void )
|
void DrawState::set_tab( void )
|
||||||
{
|
{
|
||||||
tabs[ cursor_col ] = true;
|
tabs[ cursor_col ] = true;
|
||||||
@@ -319,3 +287,8 @@ void Framebuffer::delete_line( int row )
|
|||||||
rows.erase( rows.begin() + row );
|
rows.erase( rows.begin() + row );
|
||||||
rows.insert( rows.begin() + ds.get_scrolling_region_bottom_row(), Row( ds.get_width() ) );
|
rows.insert( rows.begin() + ds.get_scrolling_region_bottom_row(), Row( ds.get_width() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Row::insert_cell( int col )
|
||||||
|
{
|
||||||
|
cells.insert( cells.begin() + col, Cell() );
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
namespace Terminal {
|
namespace Terminal {
|
||||||
class Cell {
|
class Cell {
|
||||||
public:
|
public:
|
||||||
Cell *overlapping_cell;
|
|
||||||
std::vector<wchar_t> contents;
|
std::vector<wchar_t> contents;
|
||||||
std::vector<Cell *> overlapped_cells;
|
|
||||||
char fallback; /* first character is combining character */
|
char fallback; /* first character is combining character */
|
||||||
int width;
|
int width;
|
||||||
std::vector<int> renditions; /* e.g., bold, blinking, etc. */
|
std::vector<int> renditions; /* e.g., bold, blinking, etc. */
|
||||||
@@ -29,6 +27,9 @@ namespace Terminal {
|
|||||||
std::vector<Cell> cells;
|
std::vector<Cell> cells;
|
||||||
|
|
||||||
Row( size_t s_width );
|
Row( size_t s_width );
|
||||||
|
|
||||||
|
void insert_cell( int col );
|
||||||
|
void delete_cell( int col );
|
||||||
};
|
};
|
||||||
|
|
||||||
class SavedCursor {
|
class SavedCursor {
|
||||||
@@ -119,7 +120,7 @@ namespace Terminal {
|
|||||||
Cell *get_combining_cell( void );
|
Cell *get_combining_cell( void );
|
||||||
|
|
||||||
void apply_renditions_to_current_cell( void );
|
void apply_renditions_to_current_cell( void );
|
||||||
void claim_overlap( int row, int col );
|
|
||||||
void insert_line( int before_row );
|
void insert_line( int before_row );
|
||||||
void delete_line( int row );
|
void delete_line( int row );
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user