summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2010-05-03 03:20:52 -0400
committerBehdad Esfahbod <behdad@behdad.org>2010-05-03 04:28:46 -0400
commitd80ecde4c350e9922d374f9adb97238e5c041e5c (patch)
tree214eb84504e50bdc0f36abf144c1ff11125f8aec
parent95c30fc52edd2d5de68267fdf3847b9e639d218d (diff)
downloadvte-d80ecde4c350e9922d374f9adb97238e5c041e5c.tar.gz
[search] Implement wrap-around
-rw-r--r--src/vte.c92
1 files changed, 59 insertions, 33 deletions
diff --git a/src/vte.c b/src/vte.c
index 17752e53..cda4ae80 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -14652,13 +14652,52 @@ vte_terminal_search_rows (VteTerminal *terminal,
}
static gboolean
+vte_terminal_search_rows_iter (VteTerminal *terminal,
+ long start_row,
+ long end_row,
+ gboolean backward)
+{
+ const VteRowData *row;
+ long iter_start_row, iter_end_row;
+
+ if (backward) {
+ iter_start_row = end_row;
+ while (iter_start_row > start_row) {
+ iter_end_row = iter_start_row;
+
+ do {
+ iter_start_row--;
+ row = _vte_terminal_find_row_data (terminal, iter_start_row);
+ } while (row && row->attr.soft_wrapped);
+
+ if (vte_terminal_search_rows (terminal, iter_start_row, iter_end_row))
+ return TRUE;
+ }
+ } else {
+ iter_end_row = start_row;
+ while (iter_end_row < end_row) {
+ iter_start_row = iter_end_row;
+
+ do {
+ row = _vte_terminal_find_row_data (terminal, iter_end_row);
+ iter_end_row++;
+ } while (row && row->attr.soft_wrapped);
+
+ if (vte_terminal_search_rows (terminal, iter_start_row, iter_end_row))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
vte_terminal_search_find (VteTerminal *terminal,
gboolean backward)
{
VteTerminalPrivate *pvt;
- const VteRowData *row;
long buffer_start_row, buffer_end_row;
- long current_start_row, current_end_row;
+ long last_start_row, last_end_row;
g_return_val_if_fail(VTE_IS_TERMINAL(terminal), FALSE);
@@ -14666,47 +14705,34 @@ vte_terminal_search_find (VteTerminal *terminal,
if (!pvt->search_regex)
return FALSE;
- /* TODO Currently we only find one result per extended line */
+ /* TODO
+ * Currently We only find one result per extended line, and ignore columns */
buffer_start_row = _vte_ring_delta (terminal->pvt->screen->row_data);
buffer_end_row = _vte_ring_next (terminal->pvt->screen->row_data);
if (pvt->has_selection) {
- current_start_row = pvt->selection_start.row;
- current_end_row = pvt->selection_end.row + 1;
+ last_start_row = pvt->selection_start.row;
+ last_end_row = pvt->selection_end.row + 1;
} else {
- current_start_row = pvt->screen->scroll_delta + terminal->row_count;
- current_end_row = pvt->screen->scroll_delta;
+ last_start_row = pvt->screen->scroll_delta + terminal->row_count;
+ last_end_row = pvt->screen->scroll_delta;
}
- current_start_row = MAX (buffer_start_row, current_start_row);
- current_end_row = MIN (buffer_end_row, current_end_row);
+ last_start_row = MAX (buffer_start_row, last_start_row);
+ last_end_row = MIN (buffer_end_row, last_end_row);
if (backward) {
- while (current_start_row > buffer_start_row) {
- current_end_row = current_start_row;
-
- do {
- current_start_row--;
- row = _vte_terminal_find_row_data (terminal, current_start_row);
- } while (row && row->attr.soft_wrapped);
-
- if (vte_terminal_search_rows (terminal, current_start_row, current_end_row))
- return TRUE;
- }
- /* TODO wrap-around */
+ if (vte_terminal_search_rows_iter (terminal, buffer_start_row, last_start_row, backward))
+ return TRUE;
+ if (pvt->search_wrap_around &&
+ vte_terminal_search_rows_iter (terminal, last_end_row, buffer_end_row, backward))
+ return TRUE;
} else {
- while (current_end_row < buffer_end_row) {
- current_start_row = current_end_row;
-
- do {
- row = _vte_terminal_find_row_data (terminal, current_end_row);
- current_end_row++;
- } while (row && row->attr.soft_wrapped);
-
- if (vte_terminal_search_rows (terminal, current_start_row, current_end_row))
- return TRUE;
- }
- /* TODO wrap-around */
+ if (vte_terminal_search_rows_iter (terminal, last_end_row, buffer_end_row, backward))
+ return TRUE;
+ if (pvt->search_wrap_around &&
+ vte_terminal_search_rows_iter (terminal, buffer_start_row, last_start_row, backward))
+ return TRUE;
}
vte_terminal_deselect_all (terminal);