diff options
author | ridiculousfish <corydoras@ridiculousfish.com> | 2014-05-09 14:37:23 -0700 |
---|---|---|
committer | ridiculousfish <corydoras@ridiculousfish.com> | 2014-05-09 14:37:23 -0700 |
commit | fa68c2619fe844395287c33c9109f6decb322410 (patch) | |
tree | eff672bd30febc2f39319201e7d1db87c3d4f600 | |
parent | 7f2c4cbf8a1c961b06c3801ce00a9233fb78d2d1 (diff) |
Use parm_left_cursor and parm_right_cursor for bulk cursor motions.
Fixes #1448
-rw-r--r-- | output.cpp | 24 | ||||
-rw-r--r-- | output.h | 29 | ||||
-rw-r--r-- | screen.cpp | 20 |
3 files changed, 36 insertions, 37 deletions
@@ -418,13 +418,6 @@ int writeb(tputs_arg_t b) return 0; } -int writembs_internal(char *str) -{ - CHECK(str, 1); - - return tputs(str,1,&writeb)==ERR?1:0; -} - int writech(wint_t ch) { mbstate_t state; @@ -725,3 +718,20 @@ const wchar_t *output_get_term() { return current_term.empty() ? L"<unknown>" : current_term.c_str(); } + +void writembs_check(char *mbs, const char *mbs_name, const char *file, long line) +{ + if (mbs != NULL) + { + tputs(mbs, 1, &writeb); + } + else + { + debug( 0, _(L"Tried to use terminfo string %s on line %ld of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), + mbs_name, + line, + file, + output_get_term(), + PACKAGE_BUGREPORT); + } +} @@ -78,33 +78,8 @@ void set_color(rgb_color_t c, rgb_color_t c2); /** Write specified multibyte string */ -#define writembs( mbs ) \ - { \ - char *tmp = mbs; \ - if( tmp ) \ - { \ - writembs_internal( tmp ); \ - } \ - else \ - { \ - debug( 0, \ - _(L"Tried to use terminfo string %s on line %d of %s, which is undefined in terminal of type \"%ls\". Please report this error to %s"), \ - #mbs, \ - __LINE__, \ - __FILE__, \ - output_get_term(), \ - PACKAGE_BUGREPORT); \ - } \ - } - - -/** - Write a char * narrow string to FD 1, needed for the terminfo - strings. This is usually just a wrapper aound tputs, using writeb - as the sending function. But a weird bug on PPC Linux means that on - this platform, write is instead used directly. -*/ -int writembs_internal(char *str); +void writembs_check(char *mbs, const char *mbs_name, const char *file, long line); +#define writembs(mbs) writembs_check((mbs), #mbs, __FILE__, __LINE__) /** Write a wide character using the output method specified using output_set_writer(). @@ -638,18 +638,32 @@ static void s_move(screen_t *s, data_buffer_t *b, int new_x, int new_y) x_steps = 0; } + char *multi_str = NULL; if (x_steps < 0) { str = cursor_left; + multi_str = parm_left_cursor; } else { str = cursor_right; + multi_str = parm_right_cursor; } - - for (i=0; i<abs(x_steps); i++) + + // Use the bulk ('multi') output for cursor movement if it is supported and it would be shorter + // Note that this is required to avoid some visual glitches in iTerm (#1448) + bool use_multi = (multi_str != NULL && multi_str[0] != '\0' && abs(x_steps) * strlen(str) > strlen(multi_str)); + if (use_multi) { - writembs(str); + char *multi_param = tparm(multi_str, abs(x_steps)); + writembs(multi_param); + } + else + { + for (i=0; i<abs(x_steps); i++) + { + writembs(str); + } } |