in src/terminal/buffer.c [270:345]
static void guac_terminal_buffer_force_break(guac_terminal_buffer* buffer, int row, int edge) {
guac_terminal_buffer_row* buffer_row = guac_terminal_buffer_get_row(buffer, row);
if (buffer_row == NULL)
return;
/* Ensure character to left of edge is unbroken */
if (edge > 0) {
int end_column = edge - 1;
int start_column = end_column;
guac_terminal_char* start_char = &(buffer_row->characters[start_column]);
/* Determine start column */
while (start_column > 0 && start_char->value == GUAC_CHAR_CONTINUATION) {
start_char--;
start_column--;
}
/* Advance to start of broken character if necessary */
if (start_char->value != GUAC_CHAR_CONTINUATION && start_char->width < end_column - start_column + 1) {
start_column += start_char->width;
start_char += start_char->width;
}
/* Clear character if broken */
if (start_char->value == GUAC_CHAR_CONTINUATION || start_char->width != end_column - start_column + 1) {
guac_terminal_char cleared_char;
cleared_char.value = ' ';
cleared_char.attributes = start_char->attributes;
cleared_char.width = 1;
guac_terminal_buffer_set_columns(buffer, row, start_column, end_column, &cleared_char);
}
}
/* Ensure character to right of edge is unbroken */
if (edge >= 0 && edge < buffer_row->length) {
int start_column = edge;
int end_column = start_column;
guac_terminal_char* start_char = &(buffer_row->characters[start_column]);
guac_terminal_char* end_char = &(buffer_row->characters[end_column]);
/* Determine end column */
while (end_column+1 < buffer_row->length && (end_char+1)->value == GUAC_CHAR_CONTINUATION) {
end_char++;
end_column++;
}
/* Advance to start of broken character if necessary */
if (start_char->value != GUAC_CHAR_CONTINUATION && start_char->width < end_column - start_column + 1) {
start_column += start_char->width;
start_char += start_char->width;
}
/* Clear character if broken */
if (start_char->value == GUAC_CHAR_CONTINUATION || start_char->width != end_column - start_column + 1) {
guac_terminal_char cleared_char;
cleared_char.value = ' ';
cleared_char.attributes = start_char->attributes;
cleared_char.width = 1;
guac_terminal_buffer_set_columns(buffer, row, start_column, end_column, &cleared_char);
}
}
}