This commit is contained in:
Devon Gardner 2024-09-16 18:18:17 +01:00 committed by GitHub
commit 3021576669
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -92,19 +92,18 @@ static int lookup_colour(const VTermState *state, int palette, const long args[]
{ {
switch(palette) { switch(palette) {
case 2: // RGB mode - 3 args contain colour values directly case 2: // RGB mode - 3 args contain colour values directly
if(argcount < 3) if(argcount < 3) {
return argcount; return argcount;
}
vterm_color_rgb(col, CSI_ARG(args[0]), CSI_ARG(args[1]), CSI_ARG(args[2])); vterm_color_rgb(col, CSI_ARG(args[0]), CSI_ARG(args[1]), CSI_ARG(args[2]));
return 3; return 3;
case 5: // XTerm 256-colour mode case 5: // XTerm 256-colour mode
if (!argcount || CSI_ARG_IS_MISSING(args[0])) { if (argcount && !CSI_ARG_IS_MISSING(args[0])) {
return argcount ? 1 : 0;
}
vterm_color_indexed(col, args[0]); vterm_color_indexed(col, args[0]);
}
return argcount ? 1 : 0; return argcount ? 1 : 0;
@ -125,9 +124,10 @@ static void setpenattr(VTermState *state, VTermAttr attr, VTermValueType type, V
return; return;
} }
#endif #endif
if(state->callbacks && state->callbacks->setpenattr) if(state->callbacks && state->callbacks->setpenattr) {
(*state->callbacks->setpenattr)(attr, val, state->cbdata); (*state->callbacks->setpenattr)(attr, val, state->cbdata);
} }
}
static void setpenattr_bool(VTermState *state, VTermAttr attr, int boolean) static void setpenattr_bool(VTermState *state, VTermAttr attr, int boolean)
{ {
@ -163,9 +163,10 @@ INTERNAL void vterm_state_newpen(VTermState *state)
vterm_color_rgb(&state->default_bg, 0, 0, 0); vterm_color_rgb(&state->default_bg, 0, 0, 0);
vterm_state_set_default_colors(state, &state->default_fg, &state->default_bg); vterm_state_set_default_colors(state, &state->default_fg, &state->default_bg);
for(int col = 0; col < 16; col++) for(int col = 0; col < 16; col++) {
lookup_default_colour_ansi(col, &state->colors[col]); lookup_default_colour_ansi(col, &state->colors[col]);
} }
}
INTERNAL void vterm_state_resetpen(VTermState *state) INTERNAL void vterm_state_resetpen(VTermState *state)
{ {
@ -260,9 +261,10 @@ void vterm_state_set_default_colors(VTermState *state, const VTermColor *default
void vterm_state_set_palette_color(VTermState *state, int index, const VTermColor *col) void vterm_state_set_palette_color(VTermState *state, int index, const VTermColor *col)
{ {
if(index >= 0 && index < 16) if(index >= 0 && index < 16) {
state->colors[index] = *col; state->colors[index] = *col;
} }
}
void vterm_state_convert_color_to_rgb(const VTermState *state, VTermColor *col) void vterm_state_convert_color_to_rgb(const VTermState *state, VTermColor *col)
{ {
@ -300,8 +302,9 @@ INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int argco
const VTermColor *fg = &state->pen.fg; const VTermColor *fg = &state->pen.fg;
state->pen.bold = 1; state->pen.bold = 1;
setpenattr_bool(state, VTERM_ATTR_BOLD, 1); setpenattr_bool(state, VTERM_ATTR_BOLD, 1);
if(!VTERM_COLOR_IS_DEFAULT_FG(fg) && VTERM_COLOR_IS_INDEXED(fg) && fg->indexed.idx < 8 && state->bold_is_highbright) if(!VTERM_COLOR_IS_DEFAULT_FG(fg) && VTERM_COLOR_IS_INDEXED(fg) && fg->indexed.idx < 8 && state->bold_is_highbright) {
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, fg->indexed.idx + (state->pen.bold ? 8 : 0)); set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, fg->indexed.idx + (state->pen.bold ? 8 : 0));
}
break; break;
} }
@ -401,14 +404,16 @@ INTERNAL void vterm_state_setpen(VTermState *state, const long args[], int argco
case 30: case 31: case 32: case 33: case 30: case 31: case 32: case 33:
case 34: case 35: case 36: case 37: // Foreground colour palette case 34: case 35: case 36: case 37: // Foreground colour palette
value = CSI_ARG(args[argi]) - 30; value = CSI_ARG(args[argi]) - 30;
if(state->pen.bold && state->bold_is_highbright) if(state->pen.bold && state->bold_is_highbright) {
value += 8; value += 8;
}
set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value); set_pen_col_ansi(state, VTERM_ATTR_FOREGROUND, value);
break; break;
case 38: // Foreground colour alternative palette case 38: // Foreground colour alternative palette
if(argcount - argi < 1) if(argcount - argi < 1) {
return; return;
}
argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.fg); argi += 1 + lookup_colour(state, CSI_ARG(args[argi+1]), args+argi+2, argcount-argi-2, &state->pen.fg);
setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg); setpenattr_col(state, VTERM_ATTR_FOREGROUND, state->pen.fg);
break; break;
@ -510,45 +515,57 @@ INTERNAL int vterm_state_getpen(VTermState *state, long args[], int argcount)
{ {
int argi = 0; int argi = 0;
if(state->pen.bold) if(state->pen.bold) {
args[argi++] = 1; args[argi++] = 1;
}
if(state->pen.italic) if(state->pen.italic) {
args[argi++] = 3; args[argi++] = 3;
}
if(state->pen.underline == VTERM_UNDERLINE_SINGLE) if(state->pen.underline == VTERM_UNDERLINE_SINGLE) {
args[argi++] = 4; args[argi++] = 4;
if(state->pen.underline == VTERM_UNDERLINE_CURLY) }
if(state->pen.underline == VTERM_UNDERLINE_CURLY) {
args[argi++] = 4 | CSI_ARG_FLAG_MORE, args[argi++] = 3; args[argi++] = 4 | CSI_ARG_FLAG_MORE, args[argi++] = 3;
}
if(state->pen.blink) if(state->pen.blink) {
args[argi++] = 5; args[argi++] = 5;
}
if(state->pen.reverse) if(state->pen.reverse) {
args[argi++] = 7; args[argi++] = 7;
}
if(state->pen.conceal) if(state->pen.conceal) {
args[argi++] = 8; args[argi++] = 8;
}
if(state->pen.strike) if(state->pen.strike) {
args[argi++] = 9; args[argi++] = 9;
}
if(state->pen.font) if(state->pen.font) {
args[argi++] = 10 + state->pen.font; args[argi++] = 10 + state->pen.font;
}
if(state->pen.underline == VTERM_UNDERLINE_DOUBLE) if(state->pen.underline == VTERM_UNDERLINE_DOUBLE) {
args[argi++] = 21; args[argi++] = 21;
}
argi = vterm_state_getpen_color(&state->pen.fg, argi, args, true); argi = vterm_state_getpen_color(&state->pen.fg, argi, args, true);
argi = vterm_state_getpen_color(&state->pen.bg, argi, args, false); argi = vterm_state_getpen_color(&state->pen.bg, argi, args, false);
if(state->pen.small) { if(state->pen.small) {
if(state->pen.baseline == VTERM_BASELINE_RAISE) if(state->pen.baseline == VTERM_BASELINE_RAISE) {
args[argi++] = 73; args[argi++] = 73;
else if(state->pen.baseline == VTERM_BASELINE_LOWER) }
else if(state->pen.baseline == VTERM_BASELINE_LOWER) {
args[argi++] = 74; args[argi++] = 74;
} }
}
return argi; return argi;
} }
@ -671,8 +688,9 @@ int vterm_state_set_penattr(VTermState *state, VTermAttr attr, VTermValueType ty
return 0; return 0;
} }
if(state->callbacks && state->callbacks->setpenattr) if(state->callbacks && state->callbacks->setpenattr) {
(*state->callbacks->setpenattr)(attr, val, state->cbdata); (*state->callbacks->setpenattr)(attr, val, state->cbdata);
}
return 1; return 1;
} }