static long line_start (WEdit *edit, long line) { long p, l; l = edit->curs_line; p = edit->curs1; if (line < l) p = edit_move_backward (edit, p, l - line); else if (line > l) p = edit_move_forward (edit, p, line - l, 0); p = edit_bol (edit, p); while (strchr ("\t ", edit_get_byte (edit, p))) p++; return p; }
/* * Find the start of the current paragraph for the purpose of formatting. * Return position in the file. */ static long begin_paragraph (WEdit *edit, int force) { int i; for (i = edit->curs_line - 1; i >= 0; i--) { if (line_is_blank (edit, i)) { i++; break; } if (force) { if (bad_line_start (edit, line_start (edit, i))) { i++; break; } } } return edit_move_backward (edit, edit_bol (edit, edit->curs1), edit->curs_line - i); }
static inline void render_edit_text (WEdit * edit, long start_row, long start_column, long end_row, long end_column) { static long prev_curs_row = 0; static long prev_curs = 0; Widget *w = (Widget *) edit; Dlg_head *h = w->owner; long row = 0, curs_row; int force = edit->force; long b; int y1, x1, y2, x2; int last_line; int last_column; /* draw only visible region */ last_line = h->y + h->lines - 1; y1 = w->y; if (y1 > last_line - 1 /* buttonbar */ ) return; last_column = h->x + h->cols - 1; x1 = w->x; if (x1 > last_column) return; y2 = w->y + w->lines - 1; if (y2 < h->y + 1 /* menubar */ ) return; x2 = w->x + w->cols - 1; if (x2 < h->x) return; if ((force & REDRAW_IN_BOUNDS) == 0) { /* !REDRAW_IN_BOUNDS means to ignore bounds and redraw whole rows */ /* draw only visible region */ if (y2 <= last_line - 1 /* buttonbar */ ) end_row = w->lines - 1; else if (y1 >= h->y + 1 /* menubar */ ) end_row = h->lines - 1 - y1 - 1; else end_row = start_row + h->lines - 1 - 1; if (x2 <= last_column) end_column = w->cols - 1; else if (x1 >= h->x) end_column = h->cols - 1 - x1; else end_column = start_column + h->cols - 1; } /* * If the position of the page has not moved then we can draw the cursor * character only. This will prevent line flicker when using arrow keys. */ if ((force & REDRAW_CHAR_ONLY) == 0 || (force & REDRAW_PAGE) != 0) { if ((force & REDRAW_PAGE) != 0) { row = start_row; b = edit_move_forward (edit, edit->start_display, start_row, 0); while (row <= end_row) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); row++; } } else { curs_row = edit->curs_row; if ((force & REDRAW_BEFORE_CURSOR) != 0 && start_row < curs_row) { long upto = curs_row - 1 <= end_row ? curs_row - 1 : end_row; row = start_row; b = edit->start_display; while (row <= upto) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); } } /* if (force & REDRAW_LINE) ---> default */ b = edit_bol (edit, edit->curs1); if (curs_row >= start_row && curs_row <= end_row) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, curs_row, start_column, end_column); } if ((force & REDRAW_AFTER_CURSOR) != 0 && end_row > curs_row) { row = curs_row + 1 < start_row ? start_row : curs_row + 1; b = edit_move_forward (edit, b, 1, 0); while (row <= end_row) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); row++; } } if ((force & REDRAW_LINE_ABOVE) != 0 && curs_row >= 1) { row = curs_row - 1; b = edit_move_backward (edit, edit_bol (edit, edit->curs1), 1); if (row >= start_row && row <= end_row) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, row, start_column, end_column); } } if ((force & REDRAW_LINE_BELOW) != 0 && row < edit->widget.lines - 1) { row = curs_row + 1; b = edit_bol (edit, edit->curs1); b = edit_move_forward (edit, b, 1, 0); if (row >= start_row && row <= end_row) { if (key_pending (edit)) return; edit_draw_this_line (edit, b, row, start_column, end_column); } } } } else if (prev_curs_row < edit->curs_row) { /* with the new text highlighting, we must draw from the top down */ edit_draw_this_char (edit, prev_curs, prev_curs_row, start_column, end_column); edit_draw_this_char (edit, edit->curs1, edit->curs_row, start_column, end_column); } else { edit_draw_this_char (edit, edit->curs1, edit->curs_row, start_column, end_column); edit_draw_this_char (edit, prev_curs, prev_curs_row, start_column, end_column); } edit->force = 0; prev_curs_row = edit->curs_row; prev_curs = edit->curs1; }
/* cursor must be in screen for other than REDRAW_PAGE passed in force */ static void render_edit_text (WEdit * edit, long start_row, long start_column, long end_row, long end_column) { long row = 0, curs_row; static int prev_curs_row = 0; static long prev_curs = 0; int force = edit->force; long b; /* * If the position of the page has not moved then we can draw the cursor * character only. This will prevent line flicker when using arrow keys. */ if ((!(force & REDRAW_CHAR_ONLY)) || (force & REDRAW_PAGE)) { if (!(force & REDRAW_IN_BOUNDS)) { /* !REDRAW_IN_BOUNDS means to ignore bounds and redraw whole rows */ start_row = 0; end_row = edit->num_widget_lines - 1; start_column = 0; end_column = edit->num_widget_columns - 1; } if (force & REDRAW_PAGE) { row = start_row; b = edit_move_forward (edit, edit->start_display, start_row, 0); while (row <= end_row) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); row++; } } else { curs_row = edit->curs_row; if (force & REDRAW_BEFORE_CURSOR) { if (start_row < curs_row) { long upto = curs_row - 1 <= end_row ? curs_row - 1 : end_row; row = start_row; b = edit->start_display; while (row <= upto) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); } } } /* if (force & REDRAW_LINE) ---> default */ b = edit_bol (edit, edit->curs1); if (curs_row >= start_row && curs_row <= end_row) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, curs_row, start_column, end_column); } if (force & REDRAW_AFTER_CURSOR) { if (end_row > curs_row) { row = curs_row + 1 < start_row ? start_row : curs_row + 1; b = edit_move_forward (edit, b, 1, 0); while (row <= end_row) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, row, start_column, end_column); b = edit_move_forward (edit, b, 1, 0); row++; } } } if (force & REDRAW_LINE_ABOVE && curs_row >= 1) { row = curs_row - 1; b = edit_move_backward (edit, edit_bol (edit, edit->curs1), 1); if (row >= start_row && row <= end_row) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, row, start_column, end_column); } } if (force & REDRAW_LINE_BELOW && row < edit->num_widget_lines - 1) { row = curs_row + 1; b = edit_bol (edit, edit->curs1); b = edit_move_forward (edit, b, 1, 0); if (row >= start_row && row <= end_row) { if (key_pending (edit)) goto exit_render; edit_draw_this_line (edit, b, row, start_column, end_column); } } } } else { if (prev_curs_row < edit->curs_row) { /* with the new text highlighting, we must draw from the top down */ edit_draw_this_char (edit, prev_curs, prev_curs_row); edit_draw_this_char (edit, edit->curs1, edit->curs_row); } else { edit_draw_this_char (edit, edit->curs1, edit->curs_row); edit_draw_this_char (edit, prev_curs, prev_curs_row); } } edit->force = 0; prev_curs_row = edit->curs_row; prev_curs = edit->curs1; exit_render: edit->screen_modified = 0; return; }