diff --git a/ChangeLog b/ChangeLog index 125a9a621de3c44d5800dc28507298ca9e7f3c34..09cd2cf2a02de1f544129039a6c89a385364ba70 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ 2009-11-13 Chris Allegretta <chrisa@asty.org> * winio.c: Add new static maxsize to be able to easier calculation with softwrap. + * nano.c (do_mouse): Fix mouse support not working with soft wrapping. Fixes + Savannah bug 27549 reported by Hannes Schueller. 2009-11-11 Chris Allegretta <chrisa@asty.org> * winio.c: Large tweaking of cursor and text display based on COLS not COLS - 1, diff --git a/src/nano.c b/src/nano.c index 880c73603f90f88778e4ce982eb4bbd959fc6e29..416d9e32a13d3d0045a1ae9d62aa6d29131ab8a5 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1667,17 +1667,53 @@ int do_mouse(void) sameline = (mouse_y == openfile->current_y); - /* Move to where the click occurred. */ - for (; openfile->current_y < mouse_y && openfile->current != - openfile->filebot; openfile->current_y++) - openfile->current = openfile->current->next; - for (; openfile->current_y > mouse_y && openfile->current != - openfile->fileage; openfile->current_y--) - openfile->current = openfile->current->prev; - - openfile->current_x = actual_x(openfile->current->data, +#ifdef DEBUG + fprintf(stderr, "mouse_y = %d, current_y = %d\n", mouse_y, openfile->current_y); +#endif + + if (ISSET(SOFTWRAP)) { + int i = 0; + for (openfile->current = openfile->edittop; + openfile->current->next && i < mouse_y; + openfile->current = openfile->current->next, i++) { + openfile->current_y = i; + i += strlenpt(openfile->current->data) / COLS; + } + +#ifdef DEBUG + fprintf(stderr, "do_mouse(): moving to current_y = %d, i %d\n", openfile->current_y, i); + fprintf(stderr, " openfile->current->data = \"%s\"\n", openfile->current->data); +#endif + + if (i > mouse_y) { + openfile->current = openfile->current->prev; + openfile->current_x = actual_x(openfile->current->data, mouse_x + (mouse_y - openfile->current_y) * COLS); +#ifdef DEBUG + fprintf(stderr, "do_mouse(): i > mouse_y, mouse_x = %d, current_x to = %d\n", mouse_x, openfile->current_x); +#endif + } else { + openfile->current_x = actual_x(openfile->current->data, mouse_x); +#ifdef DEBUG + fprintf(stderr, "do_mouse(): i <= mouse_y, mouse_x = %d, setting current_x to = %d\n", mouse_x, openfile->current_x); +#endif + } + + openfile->placewewant = xplustabs(); + + } else { + /* Move to where the click occurred. */ + for (; openfile->current_y < mouse_y && openfile->current != + openfile->filebot; openfile->current_y++) + openfile->current = openfile->current->next; + for (; openfile->current_y > mouse_y && openfile->current != + openfile->fileage; openfile->current_y--) + openfile->current = openfile->current->prev; + + openfile->current_x = actual_x(openfile->current->data, get_page_start(xplustabs()) + mouse_x); - openfile->placewewant = xplustabs(); + + openfile->placewewant = xplustabs(); + } #ifndef NANO_TINY /* Clicking where the cursor is toggles the mark, as does