commit ff991362a03e8c97d86863feb04f24f2fd2ff9e0 from: Marcel Rodrigues date: Fri Jun 12 13:38:33 2015 UTC Fix multibyte string positioning. commit - 8507de6dd13067c5de05a6465a39e34a21e2e577 commit + ff991362a03e8c97d86863feb04f24f2fd2ff9e0 blob - 610572a7514b86a5bc71d77e18aae13ad1b735b4 blob + b92527641c3ff35269a7a56617aa3662d69cea83 --- Makefile +++ Makefile @@ -1,5 +1,5 @@ CFLAGS=-D_FILE_OFFSET_BITS=64 -LDLIBS=-lcurses +LDLIBS=-lncursesw PREFIX=/usr/local MANPREFIX=$(PREFIX)/man INSTALL=install -D blob - 45b0d970274f5e20c9ccda778333aec237472db3 blob + d38723107e71c74c6e1129fbecfeccf9f66eef7b --- rover.c +++ rover.c @@ -1,3 +1,5 @@ +#define _XOPEN_SOURCE_EXTENDED + #include #include #include @@ -6,6 +8,7 @@ #include #include /* PATH_MAX */ #include /* setlocale(), LC_ALL */ +#include #include /* chdir(), getcwd(), read(), close(), ... */ #include /* DIR, struct dirent, opendir(), ... */ #include @@ -326,6 +329,7 @@ update_view() int numsize; int ishidden, isdir; int marking; + wchar_t wbuf[PATH_MAX]; mvhline(0, 0, ' ', COLS); attr_on(A_BOLD, NULL); @@ -339,7 +343,8 @@ update_view() } else numsize = -1; color_set(RVC_CWD, NULL); - mvaddnstr(0, 0, CWD, COLS - 4 - numsize); + mbstowcs(wbuf, CWD, PATH_MAX); + mvaddnwstr(0, 0, wbuf, COLS - 4 - numsize); wcolor_set(rover.window, RVC_BORDER, NULL); wborder(rover.window, 0, 0, 0, 0, 0, 0, 0, 0); /* Selection might not be visible, due to cursor wrapping or window @@ -362,20 +367,21 @@ update_view() if (!isdir) { char *suffix, *suffixes = "BKMGTPEZY"; off_t human_size = ESIZE(j) * 10; + int length = mbstowcs(NULL, ENAME(j), 0); for (suffix = suffixes; human_size >= 10240; suffix++) human_size = (human_size + 512) / 1024; if (*suffix == 'B') - snprintf(ROW, ROWSZ, "%s%*d %c", ENAME(j), - (int) (COLS - strlen(ENAME(j)) - 6), + swprintf(wbuf, PATH_MAX, L"%s%*d %c", ENAME(j), + (int) (COLS - length - 6), (int) human_size / 10, *suffix); else - snprintf(ROW, ROWSZ, "%s%*d.%d %c", ENAME(j), - (int) (COLS - strlen(ENAME(j)) - 8), + swprintf(wbuf, PATH_MAX, L"%s%*d.%d %c", ENAME(j), + (int) (COLS - length - 8), (int) human_size / 10, (int) human_size % 10, *suffix); } else - strcpy(ROW, ENAME(j)); + mbstowcs(wbuf, ENAME(j), PATH_MAX); mvwhline(rover.window, i + 1, 1, ' ', COLS - 2); - mvwaddnstr(rover.window, i + 1, 2, ROW, COLS - 4); + mvwaddnwstr(rover.window, i + 1, 2, wbuf, COLS - 4); if (marking && MARKED(j)) { wcolor_set(rover.window, RVC_MARKS, NULL); mvwaddch(rover.window, i + 1, 1, RVS_MARK);