To: vim_dev@googlegroups.com Subject: Patch 8.2.2893 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2893 Problem: Multi-byte text in popup title shows up wrong. Solution: Use the character width instead of the byte length. (Ralf Schandl, closes #8267, closes #8264) Files: src/popupwin.c, src/message_test.c, src/testdir/test_popupwin.vim, src/testdir/dumps/Test_popupwin_multibytetitle.dump *** ../vim-8.2.2892/src/popupwin.c 2021-02-21 23:12:14.130105982 +0100 --- src/popupwin.c 2021-05-28 14:08:37.270345237 +0200 *************** *** 3822,3838 **** title_wincol = wp->w_wincol + 1; if (wp->w_popup_title != NULL) { ! char_u *title_text; ! title_len = (int)STRLEN(wp->w_popup_title); ! title_text = alloc(title_len + 1); ! trunc_string(wp->w_popup_title, title_text, ! total_width - 2, title_len + 1); ! screen_puts(title_text, wp->w_winrow, title_wincol, ! wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr); ! vim_free(title_text); if (title_len > total_width - 2) title_len = total_width - 2; } wincol = wp->w_wincol - wp->w_popup_leftoff; --- 3822,3850 ---- title_wincol = wp->w_wincol + 1; if (wp->w_popup_title != NULL) { ! title_len = (int)MB_CHARLEN(wp->w_popup_title); ! // truncate the title if too long if (title_len > total_width - 2) + { + int title_byte_len = (int)STRLEN(wp->w_popup_title); + char_u *title_text = alloc(title_byte_len + 1); + + if (title_text != NULL) + { + trunc_string(wp->w_popup_title, title_text, + total_width - 2, title_byte_len + 1); + screen_puts(title_text, wp->w_winrow, title_wincol, + wp->w_popup_border[0] > 0 + ? border_attr[0] : popup_attr); + vim_free(title_text); + } + title_len = total_width - 2; + } + else + screen_puts(wp->w_popup_title, wp->w_winrow, title_wincol, + wp->w_popup_border[0] > 0 ? border_attr[0] : popup_attr); } wincol = wp->w_wincol - wp->w_popup_leftoff; *** ../vim-8.2.2892/src/message_test.c 2021-02-14 15:37:26.957614290 +0100 --- src/message_test.c 2021-05-28 14:05:41.670815822 +0200 *************** *** 121,126 **** --- 121,157 ---- } /* + * Test trunc_string() with mbyte chars. + */ + static void + test_trunc_string_mbyte(void) + { + char_u *buf; // allocated every time to find uninit errors + char_u *s; + + buf = alloc(40); + s = vim_strsave((char_u *)"Ä text tha just fits"); + trunc_string(s, buf, 20, 40); + assert(STRCMP(buf, "Ä text tha just fits") == 0); + vim_free(buf); + vim_free(s); + + buf = alloc(40); + s = vim_strsave((char_u *)"a text ÄÖÜä nott fits"); + trunc_string(s, buf, 20, 40); + assert(STRCMP(buf, "a text Ä...nott fits") == 0); + vim_free(buf); + vim_free(s); + + buf = alloc(40); + s = vim_strsave((char_u *)"a text that not fitsÄ"); + trunc_string(s, buf, 20, 40); + assert(STRCMP(buf, "a text t...not fitsÄ") == 0); + vim_free(buf); + vim_free(s); + } + + /* * Test vim_snprintf() with a focus on checking that truncation is * correct when buffer is small, since it cannot be tested from * vim scrip tests. Check that: *************** *** 286,291 **** --- 317,323 ---- set_option_value((char_u *)"encoding", 0, (char_u *)"utf-8", 0); init_chartab(); test_trunc_string(); + test_trunc_string_mbyte(); test_vim_snprintf(); set_option_value((char_u *)"encoding", 0, (char_u *)"latin1", 0); *** ../vim-8.2.2892/src/testdir/test_popupwin.vim 2021-03-04 21:35:02.279692562 +0100 --- src/testdir/test_popupwin.vim 2021-05-28 14:02:10.859372091 +0200 *************** *** 1799,1804 **** --- 1799,1809 ---- call term_sendkeys(buf, ":\") call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {}) + call term_sendkeys(buf, ":call popup_clear()\") + call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶ÄÖÜ◀', })\") + call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {}) + call term_sendkeys(buf, "x") + " clean up call StopVimInTerminal(buf) call delete('XtestPopupTitle') *** ../vim-8.2.2892/src/testdir/dumps/Test_popupwin_multibytetitle.dump 2021-05-28 14:11:44.397838701 +0200 --- src/testdir/dumps/Test_popupwin_multibytetitle.dump 2021-05-28 14:02:10.859372091 +0200 *************** *** 0 **** --- 1,10 ---- + >1+0&#ffffff0| @73 + |2| @73 + |3| @73 + |4| @25|╔+0#0000001#ffd7ff255|▶|Ä|Ö|Ü|◀|═@12|╗| +0#0000000#ffffff0@27 + |5| @25|║+0#0000001#ffd7ff255| |T+0&#e0e0e08|h|i|s| |i|s| |a| |l|i|n|e| @1| +0&#ffd7ff255|║| +0#0000000#ffffff0@27 + |6| @25|║+0#0000001#ffd7ff255| |a|n|d| |a|n|o|t|h|e|r| |l|i|n|e| |║| +0#0000000#ffffff0@27 + |7| @25|╚+0#0000001#ffd7ff255|═@17|╝| +0#0000000#ffffff0@27 + |8| @73 + |9| @73 + @57|1|,|1| @10|T|o|p| *** ../vim-8.2.2892/src/version.c 2021-05-28 13:50:13.821107364 +0200 --- src/version.c 2021-05-28 14:04:48.970955918 +0200 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2893, /**/ -- CONCORDE: Quickly, sir, come this way! LAUNCELOT: No! It's not right for my idiom. I must escape more ... more ... CONCORDE: Dramatically, sir? LAUNCELOT: Dramatically. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///