From 1740f1a4fb31656c6e9fc3104eaa41492438056b Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sun, 23 Oct 2016 00:03:42 -0400 Subject: [PATCH] Move pointer on search --- edit.h | 3 +++ mouse.c | 5 +++++ screen.c | 18 ++++++++++++++++++ tests/tests.c | 2 ++ xedit.c | 6 ++++++ 5 files changed, 34 insertions(+) diff --git a/edit.h b/edit.h index 96d399e..f350b62 100644 --- a/edit.h +++ b/edit.h @@ -206,6 +206,9 @@ typedef struct { void screen_update(Buf* buf, unsigned crsr, unsigned* csrx, unsigned* csry); unsigned screen_getoff(Buf* buf, unsigned pos, unsigned row, unsigned col); + +void screen_getcoords(Buf* buf, unsigned pos, unsigned* posx, unsigned* posy); + void screen_setsize(Buf* buf, unsigned nrows, unsigned ncols); void screen_getsize(unsigned* nrows, unsigned* ncols); Row* screen_getrow(unsigned row); diff --git a/mouse.c b/mouse.c index a246c97..37ac161 100644 --- a/mouse.c +++ b/mouse.c @@ -53,6 +53,11 @@ void search(MouseEvent* mevnt) { select(mevnt); } buf_find(&Buffer, &DotBeg, &DotEnd); + + unsigned x, y; + screen_getcoords(&Buffer, DotEnd, &x, &y); + extern void move_pointer(unsigned x, unsigned y); + move_pointer(x, y); } void scrollup(MouseEvent* mevnt) { diff --git a/screen.c b/screen.c index cb084cb..799b2db 100644 --- a/screen.c +++ b/screen.c @@ -162,6 +162,24 @@ static void sync_view(Buf* buf, unsigned csr) { } } +void screen_getcoords(Buf* buf, unsigned pos, unsigned* posx, unsigned* posy) { + for (unsigned y = 0; y < NumRows; y++) { + unsigned start = Rows[y]->off; + unsigned end = Rows[y]->off + Rows[y]->rlen - 1; + if (start <= pos && pos <= end) { + unsigned off = start; + for (unsigned x = 0; x < NumCols;) { + if (off == pos) { + *posy = y, *posx = x; + return; + } + x += runewidth(x, buf_get(buf,off++)); + } + break; + } + } +} + void screen_update(Buf* buf, unsigned csr, unsigned* csrx, unsigned* csry) { /* scroll the view and reflow the screen lines */ sync_view(buf, csr); diff --git a/tests/tests.c b/tests/tests.c index fd409e3..57822ad 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -9,6 +9,8 @@ unsigned DotBeg; unsigned DotEnd; enum ColorScheme ColorBase; +void move_pointer(unsigned x, unsigned y) { } + int main(int argc, char** argv) { atf_init(argc,argv); RUN_EXTERN_TEST_SUITE(BufferTests); diff --git a/xedit.c b/xedit.c index fa523b6..0dda2ed 100644 --- a/xedit.c +++ b/xedit.c @@ -428,3 +428,9 @@ int main(int argc, char** argv) { } return 0; } + +void move_pointer(unsigned x, unsigned y) { + x = (x * Fonts.base.width) + (Fonts.base.width / 2); + y = ((y+1) * Fonts.base.height) + (Fonts.base.height / 2); + XWarpPointer(X.display, X.window, X.window, 0, 0, X.width, X.height, x, y); +} -- 2.49.0