void guac_terminal_display_set_columns(guac_terminal_display* display, int row, int start_column, int end_column, guac_terminal_char* character) { int i; guac_terminal_operation* current; /* Do nothing if glyph is empty */ if (character->width == 0) return; /* Ignore operations outside display bounds */ if (row < 0 || row >= display->height) return; /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, display->width - 1); end_column = guac_terminal_fit_to_range(end_column, 0, display->width - 1); current = &(display->operations[row * display->width + start_column]); /* For each column in range */ for (i = start_column; i <= end_column; i += character->width) { /* Set operation */ current->type = GUAC_CHAR_SET; current->character = *character; /* Next character */ current += character->width; } }
void guac_terminal_display_copy_rows(guac_terminal_display* display, int start_row, int end_row, int offset) { int row, col; guac_terminal_operation* src_current_row; guac_terminal_operation* current_row; /* Fit range within bounds */ start_row = guac_terminal_fit_to_range(start_row, 0, display->height - 1); end_row = guac_terminal_fit_to_range(end_row, 0, display->height - 1); start_row = guac_terminal_fit_to_range(start_row + offset, 0, display->height - 1) - offset; end_row = guac_terminal_fit_to_range(end_row + offset, 0, display->height - 1) - offset; src_current_row = &(display->operations[start_row * display->width]); current_row = &(display->operations[(start_row + offset) * display->width]); /* Move data */ memmove(current_row, src_current_row, (end_row - start_row + 1) * sizeof(guac_terminal_operation) * display->width); /* Update operations */ for (row=start_row; row<=end_row; row++) { guac_terminal_operation* current = current_row; for (col=0; col<display->width; col++) { /* If no operation here, set as copy */ if (current->type == GUAC_CHAR_NOP) { current->type = GUAC_CHAR_COPY; current->row = row; current->column = col; } /* Next column */ current++; } /* Next row */ current_row += display->width; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, start_row, 0, end_row, display->width - 1)) __guac_terminal_display_clear_select(display); }
void guac_terminal_display_copy_columns(guac_terminal_display* display, int row, int start_column, int end_column, int offset) { int i; guac_terminal_operation* src_current; guac_terminal_operation* current; /* Ignore operations outside display bounds */ if (row < 0 || row >= display->height) return; /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, display->width - 1); end_column = guac_terminal_fit_to_range(end_column, 0, display->width - 1); start_column = guac_terminal_fit_to_range(start_column + offset, 0, display->width - 1) - offset; end_column = guac_terminal_fit_to_range(end_column + offset, 0, display->width - 1) - offset; src_current = &(display->operations[row * display->width + start_column]); current = &(display->operations[row * display->width + start_column + offset]); /* Move data */ memmove(current, src_current, (end_column - start_column + 1) * sizeof(guac_terminal_operation)); /* Update operations */ for (i=start_column; i<=end_column; i++) { /* If no operation here, set as copy */ if (current->type == GUAC_CHAR_NOP) { current->type = GUAC_CHAR_COPY; current->row = row; current->column = i; } /* Next column */ current++; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, row, start_column, row, end_column)) __guac_terminal_display_clear_select(display); }
void guac_terminal_display_set_columns(guac_terminal_display* display, int row, int start_column, int end_column, guac_terminal_char* character) { int i; guac_terminal_operation* current; /* Do nothing if glyph is empty */ if (character->width == 0) return; /* Ignore operations outside display bounds */ if (row < 0 || row >= display->height) return; /* Fit range within bounds */ start_column = guac_terminal_fit_to_range(start_column, 0, display->width - 1); end_column = guac_terminal_fit_to_range(end_column, 0, display->width - 1); current = &(display->operations[row * display->width + start_column]); /* For each column in range */ for (i = start_column; i <= end_column; i += character->width) { /* Set operation */ current->type = GUAC_CHAR_SET; current->character = *character; /* Next character */ current += character->width; } /* If selection visible and committed, clear if update touches selection */ if (display->text_selected && display->selection_committed && __guac_terminal_display_selected_contains(display, row, start_column, row, end_column)) __guac_terminal_display_clear_select(display); }