Copy style from wrapping point
This fixes a bug when wrapping on a word with style changes inside it, where the copied style would be different depending on the width of the terminal.weechat-hashes
parent
ef59e235eb
commit
b2de129e3f
29
buffer.c
29
buffer.c
|
@ -111,6 +111,7 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) {
|
||||||
int align = 0;
|
int align = 0;
|
||||||
char *wrap = NULL;
|
char *wrap = NULL;
|
||||||
struct Style style = StyleDefault;
|
struct Style style = StyleDefault;
|
||||||
|
struct Style wrapStyle = StyleDefault;
|
||||||
for (char *str = line->str; *str;) {
|
for (char *str = line->str; *str;) {
|
||||||
size_t len = styleParse(&style, (const char **)&str);
|
size_t len = styleParse(&style, (const char **)&str);
|
||||||
if (!len) continue;
|
if (!len) continue;
|
||||||
|
@ -138,15 +139,26 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) {
|
||||||
width += wcwidth(wc);
|
width += wcwidth(wc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tab && width < cols) align = width;
|
if (tab && width < cols) {
|
||||||
if (iswspace(wc) && !tab) wrap = str;
|
align = width;
|
||||||
if (width <= cols) {
|
}
|
||||||
if (wc == L'-') wrap = &str[n];
|
if (iswspace(wc) && !tab) {
|
||||||
str += n;
|
wrap = str;
|
||||||
continue;
|
wrapStyle = style;
|
||||||
|
}
|
||||||
|
if (wc == L'-' && width <= cols) {
|
||||||
|
wrap = &str[n];
|
||||||
|
wrapStyle = style;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width <= cols) {
|
||||||
|
str += n;
|
||||||
|
continue;
|
||||||
|
} else if (!wrap) {
|
||||||
|
wrap = str;
|
||||||
|
wrapStyle = style;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wrap) wrap = str;
|
|
||||||
n = mbtowc(&wc, wrap, strlen(wrap));
|
n = mbtowc(&wc, wrap, strlen(wrap));
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
n = 1;
|
n = 1;
|
||||||
|
@ -165,8 +177,9 @@ static int flow(struct Lines *hard, int cols, const struct Line *soft) {
|
||||||
|
|
||||||
struct Cat cat = { line->str, cap, 0 };
|
struct Cat cat = { line->str, cap, 0 };
|
||||||
catf(&cat, "%*s%n", align, "", &width);
|
catf(&cat, "%*s%n", align, "", &width);
|
||||||
styleCat(&cat, style);
|
styleCat(&cat, wrapStyle);
|
||||||
str = &line->str[cat.len];
|
str = &line->str[cat.len];
|
||||||
|
style = wrapStyle;
|
||||||
catf(&cat, "%s", &wrap[n]);
|
catf(&cat, "%s", &wrap[n]);
|
||||||
|
|
||||||
*wrap = '\0';
|
*wrap = '\0';
|
||||||
|
|
Loading…
Reference in New Issue