aboutsummaryrefslogtreecommitdiffhomepage
path: root/screen.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-04-13 14:40:16 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2012-04-13 14:40:16 -0700
commita34565ca0f5b65457cb5fd138865d5743f449dfb (patch)
tree7f23713a9978e75f42cdbbebabf4af09057ae48d /screen.cpp
parent49ece586d56977e99eee6804ffa8a991b28da334 (diff)
Make screen.cpp properly compute the length of term256 escape codes
Diffstat (limited to 'screen.cpp')
-rw-r--r--screen.cpp46
1 files changed, 39 insertions, 7 deletions
diff --git a/screen.cpp b/screen.cpp
index 2cadf790..2596c42a 100644
--- a/screen.cpp
+++ b/screen.cpp
@@ -124,6 +124,28 @@ static int next_tab_stop( int in )
return ( (in/init_tabs)+1 )*init_tabs;
}
+// PCA for term256 support, let's just detect the escape codes directly
+static int is_term256_escape(const wchar_t *str) {
+ // An escape code looks like this: \x1b[38;5;<num>m
+ // or like this: \x1b[48;5;<num>m
+
+ // parse out the required prefix
+ int len = try_sequence("\x1b[38;5;", str);
+ if (! len) len = try_sequence("\x1b[48;5;", str);
+ if (! len) return 0;
+
+ // now try parsing out a string of digits
+ // we need at least one
+ if (! iswdigit(str[len])) return 0;
+ while (iswdigit(str[len])) len++;
+
+ // look for the terminating m
+ if (str[len++] != L'm') return 0;
+
+ // success
+ return len;
+}
+
/**
Calculate the width of the specified prompt. Does some clever magic
to detect common escape sequences that may be embeded in a prompt,
@@ -143,13 +165,13 @@ static int calc_prompt_width( const wchar_t *prompt )
*/
size_t p;
int len=0;
- int found = 0;
+ bool found = false;
/*
Detect these terminfo color escapes with parameter
value 0..7, all of which don't move the cursor
*/
- char * esc[] =
+ char * const esc[] =
{
set_a_foreground,
set_a_background,
@@ -162,7 +184,7 @@ static int calc_prompt_width( const wchar_t *prompt )
Detect these semi-common terminfo escapes without any
parameter values, all of which don't move the cursor
*/
- char *esc2[] =
+ char * const esc2[] =
{
enter_bold_mode,
exit_attribute_mode,
@@ -187,7 +209,7 @@ static int calc_prompt_width( const wchar_t *prompt )
}
;
- for( p=0; p < (sizeof(esc)/sizeof(char *)) && !found; p++ )
+ for( p=0; p < sizeof esc / sizeof *esc && !found; p++ )
{
if( !esc[p] )
continue;
@@ -198,11 +220,21 @@ static int calc_prompt_width( const wchar_t *prompt )
if( len )
{
j += (len-1);
- found = 1;
+ found = true;
break;
}
}
}
+
+ // PCA for term256 support, let's just detect the escape codes directly
+ if (! found) {
+ len = is_term256_escape(&prompt[j]);
+ if (len) {
+ j += (len - 1);
+ found = true;
+ }
+ }
+
for( p=0; p < (sizeof(esc2)/sizeof(char *)) && !found; p++ )
{
@@ -219,7 +251,7 @@ static int calc_prompt_width( const wchar_t *prompt )
if( len )
{
j += (len-1);
- found = 1;
+ found = true;
}
}
@@ -232,7 +264,7 @@ static int calc_prompt_width( const wchar_t *prompt )
{
const wchar_t *end;
j+=2;
- found = 1;
+ found = true;
end = wcsstr( &prompt[j], L"\x1b\\" );
if( end )
{