X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fwidechar%2Flib_add_wch.c;h=be1bbb051ad30ad9b761d2e0e31bb104c796da86;hb=HEAD;hp=c780466f72a93c3ea92e374d880aa6ea66d803e5;hpb=88e7914acafc37f84af25b80f403eb4290e423d4;p=ncurses.git diff --git a/ncurses/widechar/lib_add_wch.c b/ncurses/widechar/lib_add_wch.c index c780466f..be1bbb05 100644 --- a/ncurses/widechar/lib_add_wch.c +++ b/ncurses/widechar/lib_add_wch.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2004-2016,2019 Free Software Foundation, Inc. * + * Copyright 2019-2021,2023 Thomas E. Dickey * + * Copyright 2004-2011,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -39,7 +40,7 @@ #include #endif -MODULE_ID("$Id: lib_add_wch.c,v 1.15 2019/05/04 20:31:31 tom Exp $") +MODULE_ID("$Id: lib_add_wch.c,v 1.18 2023/07/15 17:34:12 tom Exp $") /* clone/adapt lib_addch.c */ static const cchar_t blankchar = NewChar(BLANK_TEXT); @@ -132,7 +133,7 @@ newline_forces_scroll(WINDOW *win, NCURSES_SIZE_T *ypos) * wrapped the cursor. We don't do anything with this flag except set it when * wrapping, and clear it whenever we move the cursor. If we try to wrap at * the lower-right corner of a window, we cannot move the cursor (since that - * wouldn't be legal). So we return an error (which is what SVr4 does). + * wouldn't be legal). So we return an error (which is what SVr4 does). * Unlike SVr4, we can successfully add a character to the lower-right corner * (Solaris 2.6 does this also, however). */ @@ -203,10 +204,16 @@ wadd_wch_literal(WINDOW *win, cchar_t ch) if (len == 0) { /* non-spacing */ if ((x > 0 && y >= 0) || (win->_maxx >= 0 && win->_cury >= 1)) { - if (x > 0 && y >= 0) - chars = (win->_line[y].text[x - 1].chars); - else + if (x > 0 && y >= 0) { + for (j = x - 1; j > 0; --j) { + if (!isWidecExt(win->_line[y].text[j])) { + break; + } + } + chars = (win->_line[y].text[j].chars); + } else { chars = (win->_line[y - 1].text[win->_maxx].chars); + } for (i = 0; i < CCHARW_MAX; ++i) { if (chars[i] == 0) { TR(TRACE_VIRTPUT,