Download raw body.
[rfc] tog horizontal scroll (diff & blame view)
On Thu, Jun 16, 2022 at 10:29:20AM +0200, Stefan Sperling wrote:
> Such issues also exists elsewhere. Try the attached repo which contains
> some text from today's index page of ja.wikipedia.org. There are some
> rendering issues to be observed, probably because substracting view->x
> doesn't do the right thing in Japanese.
>
> I'll try to come up with some fixes, but don't hesitate to take a look
> if you have time :)
This fixes horizontal scrolling of japanese text in the log view.
I noticed that wcswidth() can be used instead of my hand-rolled
loop I added for the blame fix, so a change to reduce this loop
to wcswidth() is included as well.
diff 67461ab571e3ce9157e4a0cc09e2d632cd6f3263 8a5113cff911108d74d44f7fcb49d82920b128ed
blob - 8a28476cd4abc2585e93d816ed8368b82925038b
blob + 6949c6919a312d1d0e9ca87dc38ed6cf1d766d5a
--- tog/tog.c
+++ tog/tog.c
@@ -1514,11 +1514,12 @@ draw_commit(struct tog_view *view, struct got_commit_o
err = format_line(&wlogmsg, &logmsg_width, logmsg, limit, col, 1);
if (err)
goto done;
- if (view->x < logmsg_width - 1)
+ if (view->x < logmsg_width - 1) {
waddwstr(view->window, wlogmsg + view->x);
- else
+ logmsg_width -= wcswidth(wlogmsg, view->x);
+ } else
logmsg_width = 0;
- col += MAX(logmsg_width - view->x, 0);
+ col += MAX(logmsg_width, 0);
while (col < avail) {
waddch(view->window, ' ');
col++;
@@ -1786,8 +1787,8 @@ draw_commits(struct tog_view *view)
ncommits = 0;
view->maxx = 0;
while (entry) {
- char *author, *eol, *msg, *msg0;
- wchar_t *wauthor;
+ char *author, *msg;
+ wchar_t *wauthor, *wmsg, *eol;
int width;
if (ncommits >= limit - 1)
break;
@@ -1802,17 +1803,22 @@ draw_commits(struct tog_view *view)
author_cols = width;
free(wauthor);
free(author);
- err = got_object_commit_get_logmsg(&msg0, entry->commit);
+ err = got_object_commit_get_logmsg(&msg, entry->commit);
if (err)
goto done;
- msg = msg0;
- while (*msg == '\n')
- ++msg;
- if ((eol = strchr(msg, '\n')))
- view->maxx = MAX(view->maxx, eol - msg);
- else
- view->maxx = MAX(view->maxx, strlen(msg));
- free(msg0);
+ err = format_line(&wmsg, &width, msg, COLS,
+ date_display_cols + author_cols, 0);
+ if (err)
+ goto done;
+ while (*wmsg == L'\n')
+ ++wmsg;
+ if ((eol = wcschr(wmsg, L'\n'))) {
+ *eol = L'\0';
+ width = wcswidth(wmsg, width);
+ }
+ view->maxx = MAX(view->maxx, wcswidth(wmsg, wcslen(wmsg)));
+ free(msg);
+ free(wmsg);
ncommits++;
entry = TAILQ_NEXT(entry, entry);
}
@@ -4190,7 +4196,7 @@ draw_blame(struct tog_view *view)
struct tog_blame *blame = &s->blame;
regmatch_t *regmatch = &view->regmatch;
const struct got_error *err;
- int lineno = 0, nprinted = 0, i;
+ int lineno = 0, nprinted = 0;
char *line = NULL;
size_t linesize = 0;
ssize_t linelen;
@@ -4338,8 +4344,7 @@ draw_blame(struct tog_view *view)
}
if (view->x < width) {
waddwstr(view->window, wline + view->x);
- for (i = 0; i < view->x; i++)
- width -= wcwidth(wline[i]);
+ width -= wcswidth(wline, view->x);
}
width += 9;
free(wline);
[rfc] tog horizontal scroll (diff & blame view)