@techee commented on this pull request.
> @@ -40,42 +40,53 @@ void cmd_goto_right(CmdContext *c, CmdParams *p)
SET_POS(p->sci, pos, TRUE);
}
+static gint doc_line_from_visible_delta(CmdParams *p, gint line, gint delta,
gint *previous)
+{
+ gint step = delta < 0 ? -1 : 1;
+ gint new_line = p->line;
Should be `line` instead of `p->line` - we don't always pass `p->line` as the
parameter of this function.
> /* Calling SCI_LINEUP/SCI_LINEDOWN in a loop for num lines leads to
> visible
* slow scrolling. On the other hand, SCI_LINEUP preserves the value of
* SCI_CHOOSECARETX which we cannot read directly from Scintilla and
which
* we want to keep - perform jump to previous/following line and add
* one final SCI_LINEUP/SCI_LINEDOWN which recovers SCI_CHOOSECARETX
for us. */
- one_above = p->line - p->num - 1;
- if (one_above >= 0 && SSM(p->sci, SCI_GETLINEVISIBLE, one_above, 0))
- {
- /* Every case except for the first line - go one line above and
perform
- * SCI_LINEDOWN. This ensures that even with wrapping on, we
get the
- * caret on the first line of the wrapped line */
- pos = SSM(p->sci, SCI_GETLINEENDPOSITION, one_above, 0);
+
+ if (previous > -1) {
+ guint pos = SSM(p->sci, SCI_POSITIONFROMLINE, previous, 0);
I think you didn't understand the purpose of this strange "one above" and then
`SCI_LINEDOWN` dance. While you get to the correct line alright, you lose the
cursor's `x` position on the line this way. Notice how, when moving cursor up
and down, it remembers the maximum `x` coordinate on the line and even after
bing on lines where the maximum `x` is lower *like e.g. an empty line where `x`
is 0), it returns back to the right position on longer lines.
Unfortunately this "maximum x" is not possible to obtain from Scintilla but
Scintilla automatically recovers it when doing `SCI_LINEDOWN` or `SCI_LINEUP`.
So the trick here is to first go to the line above or below, and then perform
`SCI_LINEDOWN` or `SCI_LINEUP` to get us to the right line and get the `x`
position of the cursor. When you remove this code, you'll always end with the
`x` position at the beginning of the line.
> return;
- /* see cmd_goto_up() for explanation */
- one_above = p->line + num - 1;
- one_above = one_above < last_line ? one_above : last_line - 1;
- pos = SSM(p->sci, SCI_GETLINEENDPOSITION, one_above, 0);
- SET_POS_NOX(p->sci, pos, FALSE);
- SSM(p->sci, SCI_LINEDOWN, 0, 0);
+ new_line = doc_line_from_visible_delta(p, p->line, num, &previous);
+
+ if (previous > -1) {
+ guint pos = SSM(p->sci, SCI_GETLINEENDPOSITION, previous, 0);
+ SET_POS_NOX(p->sci, pos, FALSE);
+ }
+
+ if (new_line > p->line) SSM(p->sci, SCI_LINEDOWN, 0, 0);
Is all this code necessary? Maybe I'm missing something but I did just this:
https://github.com/geany/geany-plugins/pull/1338/commits/fa7025ba9d58fb4680fb47e13bd5c05c6f1f1059#diff-15a3a15a958bc6f85e0f1fae419e23c60bbee47bf617ef133f7539fc1f29b277R128
`doc_line_from_visible_delta()` only returns a line from the valid line range
and when you are on the first line, this is already the "line above" for which
you then perform `SCI_LINEDOWN` so it should be OK on this side. On the other
end of the document when you are on the last line, `SCI_LINEDOWN` just won't do
anything so there's no need for some special handling there.
--
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany-plugins/pull/1326#pullrequestreview-2045509286
You are receiving this because you are subscribed to this thread.
Message ID: <geany/geany-plugins/pull/1326/review/[email protected]>