Switch from int cursor[2] to struct cursor { int x; int y; }

This commit is contained in:
ridiculousfish 2012-08-04 13:54:20 -07:00
parent 54ceb4211e
commit 5880cd88c8
2 changed files with 34 additions and 32 deletions

View file

@ -400,10 +400,10 @@ static void s_check_status( screen_t *s)
earlier value. earlier value.
*/ */
int prev_line = s->actual.cursor[1]; int prev_line = s->actual.cursor.y;
write_loop( 1, "\r", 1 ); write_loop( 1, "\r", 1 );
s_reset( s, false ); s_reset( s, false );
s->actual.cursor[1] = prev_line; s->actual.cursor.y = prev_line;
} }
} }
@ -418,7 +418,7 @@ static void s_desired_append_char( screen_t *s,
int indent, int indent,
size_t prompt_width ) size_t prompt_width )
{ {
int line_no = s->desired.cursor[1]; int line_no = s->desired.cursor.y;
switch( b ) switch( b )
{ {
@ -426,8 +426,8 @@ static void s_desired_append_char( screen_t *s,
{ {
int i; int i;
s->desired.create_line(s->desired.line_count()); s->desired.create_line(s->desired.line_count());
s->desired.cursor[1]++; s->desired.cursor.y++;
s->desired.cursor[0]=0; s->desired.cursor.x=0;
for( i=0; i < prompt_width+indent*INDENT_STEP; i++ ) for( i=0; i < prompt_width+indent*INDENT_STEP; i++ )
{ {
s_desired_append_char( s, L' ', 0, indent, prompt_width ); s_desired_append_char( s, L' ', 0, indent, prompt_width );
@ -439,7 +439,7 @@ static void s_desired_append_char( screen_t *s,
{ {
line_t &current = s->desired.line(line_no); line_t &current = s->desired.line(line_no);
current.clear(); current.clear();
s->desired.cursor[0] = 0; s->desired.cursor.x = 0;
break; break;
} }
@ -456,14 +456,14 @@ static void s_desired_append_char( screen_t *s,
Check if we are at the end of the line. If so, print an Check if we are at the end of the line. If so, print an
ellipsis character and continue on the next line. ellipsis character and continue on the next line.
*/ */
if( s->desired.cursor[0] + cw + ew > screen_width ) if( s->desired.cursor.x + cw + ew > screen_width )
{ {
s->desired.line(line_no).append(ellipsis_char, HIGHLIGHT_COMMENT); s->desired.line(line_no).append(ellipsis_char, HIGHLIGHT_COMMENT);
line_no = (int)s->desired.line_count(); line_no = (int)s->desired.line_count();
s->desired.add_line(); s->desired.add_line();
s->desired.cursor[1]++; s->desired.cursor.y++;
s->desired.cursor[0]=0; s->desired.cursor.x=0;
for( i=0; i < (prompt_width-ew); i++ ) for( i=0; i < (prompt_width-ew); i++ )
{ {
s_desired_append_char( s, L' ', 0, indent, prompt_width ); s_desired_append_char( s, L' ', 0, indent, prompt_width );
@ -473,7 +473,7 @@ static void s_desired_append_char( screen_t *s,
line_t &line = s->desired.line(line_no); line_t &line = s->desired.line(line_no);
line.append(b, c); line.append(b, c);
s->desired.cursor[0]+= cw; s->desired.cursor.x+= cw;
break; break;
} }
} }
@ -512,7 +512,7 @@ static void s_move( screen_t *s, data_buffer_t *b, int new_x, int new_y )
*/ */
scoped_buffer_t scoped_buffer(b); scoped_buffer_t scoped_buffer(b);
y_steps = new_y - s->actual.cursor[1]; y_steps = new_y - s->actual.cursor.y;
if( y_steps > 0 && (strcmp( cursor_down, "\n")==0)) if( y_steps > 0 && (strcmp( cursor_down, "\n")==0))
{ {
@ -523,7 +523,7 @@ static void s_move( screen_t *s, data_buffer_t *b, int new_x, int new_y )
as moving it down one step. The cursor_up does not have this as moving it down one step. The cursor_up does not have this
behaviour... behaviour...
*/ */
s->actual.cursor[0]=0; s->actual.cursor.x=0;
} }
if( y_steps < 0 ) if( y_steps < 0 )
@ -542,7 +542,7 @@ static void s_move( screen_t *s, data_buffer_t *b, int new_x, int new_y )
} }
x_steps = new_x - s->actual.cursor[0]; x_steps = new_x - s->actual.cursor.x;
if( x_steps && new_x == 0 ) if( x_steps && new_x == 0 )
{ {
@ -565,8 +565,8 @@ static void s_move( screen_t *s, data_buffer_t *b, int new_x, int new_y )
} }
s->actual.cursor[0] = new_x; s->actual.cursor.x = new_x;
s->actual.cursor[1] = new_y; s->actual.cursor.y = new_y;
} }
/** /**
@ -588,7 +588,7 @@ static void s_set_color( screen_t *s, data_buffer_t *b, int c )
static void s_write_char( screen_t *s, data_buffer_t *b, wchar_t c ) static void s_write_char( screen_t *s, data_buffer_t *b, wchar_t c )
{ {
scoped_buffer_t scoped_buffer(b); scoped_buffer_t scoped_buffer(b);
s->actual.cursor[0]+=fish_wcwidth( c ); s->actual.cursor.x+=fish_wcwidth( c );
writech( c ); writech( c );
} }
@ -601,7 +601,7 @@ static int s_write_string( screen_t *s, data_buffer_t *b, const wcstring &str )
scoped_buffer_t scoped_buffer(b); scoped_buffer_t scoped_buffer(b);
int width = fish_wcswidth(str.c_str(), str.size()); int width = fish_wcswidth(str.c_str(), str.size());
writestr(str.c_str()); writestr(str.c_str());
s->actual.cursor[0] += width; s->actual.cursor.x += width;
return width; return width;
} }
@ -673,7 +673,7 @@ static void s_update( screen_t *scr, const wchar_t *prompt )
s_move( scr, &output, 0, 0 ); s_move( scr, &output, 0, 0 );
s_write_str( &output, prompt ); s_write_str( &output, prompt );
scr->actual_prompt = prompt; scr->actual_prompt = prompt;
scr->actual.cursor[0] = (int)prompt_width; scr->actual.cursor.x = (int)prompt_width;
} }
for (size_t i=0; i < scr->desired.line_count(); i++) for (size_t i=0; i < scr->desired.line_count(); i++)
@ -746,7 +746,7 @@ static void s_update( screen_t *scr, const wchar_t *prompt )
s_write_mbs( &output, clr_eol); s_write_mbs( &output, clr_eol);
} }
s_move( scr, &output, scr->desired.cursor[0], scr->desired.cursor[1] ); s_move( scr, &output, scr->desired.cursor.x, scr->desired.cursor.y );
s_set_color( scr, &output, 0xffffffff); s_set_color( scr, &output, 0xffffffff);
if( ! output.empty() ) if( ! output.empty() )
@ -776,7 +776,7 @@ void s_write( screen_t *s,
const int *indent, const int *indent,
size_t cursor_pos ) size_t cursor_pos )
{ {
int cursor_arr[2]; screen_data_t::cursor_t cursor_arr;
size_t prompt_width; size_t prompt_width;
size_t screen_width; size_t screen_width;
@ -863,7 +863,7 @@ void s_write( screen_t *s,
max_line_width = current_line_width; max_line_width = current_line_width;
s->desired.resize(0); s->desired.resize(0);
s->desired.cursor[0] = s->desired.cursor[1] = 0; s->desired.cursor.x = s->desired.cursor.y = 0;
/* If we cannot fit with the autosuggestion, but we can fit without it, truncate the autosuggestion. We limit this check to just one line to avoid confusion; not sure how well this would work with multiple lines */ /* If we cannot fit with the autosuggestion, but we can fit without it, truncate the autosuggestion. We limit this check to just one line to avoid confusion; not sure how well this would work with multiple lines */
wcstring truncated_autosuggestion_line; wcstring truncated_autosuggestion_line;
@ -901,13 +901,12 @@ void s_write( screen_t *s,
if( i == cursor_pos ) if( i == cursor_pos )
{ {
cursor_arr[0] = s->desired.cursor[0]; cursor_arr = s->desired.cursor;
cursor_arr[1] = s->desired.cursor[1];
} }
s_desired_append_char( s, commandline[i], col, indent[i], prompt_width ); s_desired_append_char( s, commandline[i], col, indent[i], prompt_width );
if( i== cursor_pos && s->desired.cursor[1] != cursor_arr[1] && commandline[i] != L'\n' ) if( i== cursor_pos && s->desired.cursor.y != cursor_arr.y && commandline[i] != L'\n' )
{ {
/* /*
Ugh. We are placed exactly at the wrapping point of a Ugh. We are placed exactly at the wrapping point of a
@ -915,16 +914,16 @@ void s_write( screen_t *s,
cursor won't be on the ellipsis which looks cursor won't be on the ellipsis which looks
unintuitive. unintuitive.
*/ */
cursor_arr[0] = s->desired.cursor[0] - fish_wcwidth(commandline[i]); cursor_arr.x = s->desired.cursor.x - fish_wcwidth(commandline[i]);
cursor_arr[1] = s->desired.cursor[1]; cursor_arr.y = s->desired.cursor.y;
} }
} }
if( i == cursor_pos ) if( i == cursor_pos )
{ {
memcpy(cursor_arr, s->desired.cursor, sizeof(int)*2); cursor_arr = s->desired.cursor;
} }
memcpy( s->desired.cursor, cursor_arr, sizeof(int)*2 ); s->desired.cursor = cursor_arr;
s_update( s, prompt ); s_update( s, prompt );
s_save_status( s ); s_save_status( s );
} }
@ -933,9 +932,9 @@ void s_reset( screen_t *s, bool reset_cursor )
{ {
CHECK( s, ); CHECK( s, );
int prev_line = s->actual.cursor[1]; int prev_line = s->actual.cursor.y;
s->actual.resize(0); s->actual.resize(0);
s->actual.cursor[0] = s->actual.cursor[1] = 0; s->actual.cursor.x = s->actual.cursor.y = 0;
s->actual_prompt = L""; s->actual_prompt = L"";
s->need_clear=1; s->need_clear=1;
@ -946,7 +945,7 @@ void s_reset( screen_t *s, bool reset_cursor )
next repaint. next repaint.
*/ */
write_loop( 1, "\r", 1 ); write_loop( 1, "\r", 1 );
s->actual.cursor[1] = prev_line; s->actual.cursor.y = prev_line;
} }
fstat( 1, &s->prev_buff_1 ); fstat( 1, &s->prev_buff_1 );
fstat( 2, &s->prev_buff_2 ); fstat( 2, &s->prev_buff_2 );

View file

@ -60,7 +60,10 @@ class screen_data_t
public: public:
int cursor[2]; struct cursor_t {
int x;
int y;
} cursor;
line_t &add_line(void) { line_t &add_line(void) {
line_datas.resize(line_datas.size() + 1); line_datas.resize(line_datas.size() + 1);