/****************************************************************************
- * Copyright (c) 2002,2003 Free Software Foundation, Inc. *
+ * Copyright (c) 2002-2010,2011 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 *
#include <curses.priv.h>
-MODULE_ID("$Id: lib_ins_wch.c,v 1.3 2003/03/29 21:52:29 tom Exp $")
+MODULE_ID("$Id: lib_ins_wch.c,v 1.17 2011/10/22 16:34:50 tom Exp $")
/*
* Insert the given character, updating the current location to simplify
* inserting a string.
*/
-static void
-_nc_insert_wch(WINDOW *win, const cchar_t * wch)
+NCURSES_EXPORT(int)
+_nc_insert_wch(WINDOW *win, const cchar_t *wch)
{
- if (win->_curx <= win->_maxx) {
- struct ldat *line = &(win->_line[win->_cury]);
- NCURSES_CH_T *end = &(line->text[win->_curx]);
- NCURSES_CH_T *temp1 = &(line->text[win->_maxx]);
- NCURSES_CH_T *temp2 = temp1 - 1;
-
- CHANGED_TO_EOL(line, win->_curx, win->_maxx);
- while (temp1 > end)
- *temp1-- = *temp2--;
-
- *temp1 = _nc_render(win, *wch);
+ int cells = wcwidth(CharOf(CHDEREF(wch)));
+ int cell;
+ int code = OK;
+
+ if (cells < 0) {
+ code = winsch(win, (chtype) CharOf(CHDEREF(wch)));
+ } else {
+ if (cells == 0)
+ cells = 1;
+
+ if (win->_curx <= win->_maxx) {
+ struct ldat *line = &(win->_line[win->_cury]);
+ NCURSES_CH_T *end = &(line->text[win->_curx]);
+ NCURSES_CH_T *temp1 = &(line->text[win->_maxx]);
+ NCURSES_CH_T *temp2 = temp1 - cells;
+
+ CHANGED_TO_EOL(line, win->_curx, win->_maxx);
+ while (temp1 > end)
+ *temp1-- = *temp2--;
+
+ *temp1 = _nc_render(win, *wch);
+ for (cell = 1; cell < cells; ++cell) {
+ SetWidecExt(temp1[cell], cell);
+ }
- win->_curx++;
+ win->_curx++;
+ }
}
+ return code;
}
NCURSES_EXPORT(int)
-wins_wch(WINDOW *win, const cchar_t * wch)
+wins_wch(WINDOW *win, const cchar_t *wch)
{
NCURSES_SIZE_T oy;
NCURSES_SIZE_T ox;
int code = ERR;
- T((T_CALLED("wins_wch(%p, %s)"), win, _tracecchar_t(wch)));
+ T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch)));
if (win != 0) {
oy = win->_cury;
ox = win->_curx;
- _nc_insert_wch(win, wch);
+ code = _nc_insert_wch(win, wch);
win->_curx = ox;
win->_cury = oy;
_nc_synchook(win);
- code = OK;
}
returnCode(code);
}
NCURSES_EXPORT(int)
-wins_nwstr(WINDOW *win, const wchar_t * wstr, int n)
+wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
{
int code = ERR;
NCURSES_SIZE_T oy;
NCURSES_SIZE_T ox;
const wchar_t *cp;
- T((T_CALLED("wins_nwstr(%p,%s,%d)"), win, _nc_viswbufn(wstr, n), n));
+ T((T_CALLED("wins_nwstr(%p,%s,%d)"),
+ (void *) win, _nc_viswbufn(wstr, n), n));
if (win != 0
&& wstr != 0) {
if (n < 1)
- n = wcslen(wstr);
+ n = (int) wcslen(wstr);
+ code = OK;
if (n > 0) {
+ SCREEN *sp = _nc_screen_of(win);
+
oy = win->_cury;
ox = win->_curx;
for (cp = wstr; *cp && ((cp - wstr) < n); cp++) {
- if (wcwidth(*cp) > 1) {
+ int len = wcwidth(*cp);
+
+ if ((len >= 0 && len != 1) || !is7bits(*cp)) {
cchar_t tmp_cchar;
wchar_t tmp_wchar = *cp;
memset(&tmp_cchar, 0, sizeof(tmp_cchar));
(void) setcchar(&tmp_cchar,
&tmp_wchar,
WA_NORMAL,
- 0,
+ (short) 0,
(void *) 0);
- _nc_insert_wch(win, &tmp_cchar);
+ code = _nc_insert_wch(win, &tmp_cchar);
} else {
- _nc_insert_ch(win, *cp); /* tabs, other ASCII stuff */
+ /* tabs, other ASCII stuff */
+ code = _nc_insert_ch(sp, win, (chtype) (*cp));
}
+ if (code != OK)
+ break;
}
win->_curx = ox;
win->_cury = oy;
_nc_synchook(win);
}
- code = OK;
}
returnCode(code);
}