summaryrefslogtreecommitdiffstats
path: root/grid-reader.c
diff options
context:
space:
mode:
authornicm <nicm>2021-02-22 06:53:04 +0000
committernicm <nicm>2021-02-22 06:53:04 +0000
commit8986c8dfcd0083e5c767b8a247c119a25e1f8093 (patch)
tree6bc5120e2566796a862cadc8140ba9db2fe97b14 /grid-reader.c
parentb04f8acb7057bda74e30976acedbbd73767e5bdc (diff)
Move jump commands to grid reader, make them UTF-8 aware, and tidy up,
from Anindya Mukherjee.
Diffstat (limited to 'grid-reader.c')
-rw-r--r--grid-reader.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/grid-reader.c b/grid-reader.c
index a1af3aaa..c011ea1d 100644
--- a/grid-reader.c
+++ b/grid-reader.c
@@ -17,6 +17,7 @@
*/
#include "tmux.h"
+#include <string.h>
/* Initialise virtual cursor. */
void
@@ -301,3 +302,64 @@ grid_reader_cursor_previous_word(struct grid_reader *gr, const char *separators,
gr->cx = oldx;
gr->cy = oldy;
}
+
+/* Jump forward to character. */
+int
+grid_reader_cursor_jump(struct grid_reader *gr, const struct utf8_data *jc)
+{
+ struct grid_cell gc;
+ u_int px, py, xx, yy;
+
+ px = gr->cx;
+ yy = gr->gd->hsize + gr->gd->sy - 1;
+
+ for (py = gr->cy; py <= yy; py++) {
+ xx = grid_line_length(gr->gd, py);
+ while (px < xx) {
+ grid_get_cell(gr->gd, px, py, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == jc->size &&
+ memcmp(gc.data.data, jc->data, gc.data.size) == 0) {
+ gr->cx = px;
+ gr->cy = py;
+ return 1;
+ }
+ px++;
+ }
+
+ if (py == yy ||
+ !(grid_get_line(gr->gd, py)->flags & GRID_LINE_WRAPPED))
+ return 0;
+ px = 0;
+ }
+ return 0;
+}
+
+/* Jump back to character. */
+int
+grid_reader_cursor_jump_back(struct grid_reader *gr, const struct utf8_data *jc)
+{
+ struct grid_cell gc;
+ u_int px, py, xx;
+
+ xx = gr->cx + 1;
+
+ for (py = gr->cy + 1; py > 0; py--) {
+ for (px = xx; px > 0; px--) {
+ grid_get_cell(gr->gd, px - 1, py - 1, &gc);
+ if (!(gc.flags & GRID_FLAG_PADDING) &&
+ gc.data.size == jc->size &&
+ memcmp(gc.data.data, jc->data, gc.data.size) == 0) {
+ gr->cx = px - 1;
+ gr->cy = py - 1;
+ return 1;
+ }
+ }
+
+ if (py == 1 ||
+ !(grid_get_line(gr->gd, py - 2)->flags & GRID_LINE_WRAPPED))
+ return 0;
+ xx = grid_line_length(gr->gd, py - 2);
+ }
+ return 0;
+}