]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/widechar/lib_ins_wch.c
ncurses 5.7 - patch 20100123
[ncurses.git] / ncurses / widechar / lib_ins_wch.c
index 7bc7ac8c4eb789d8dc76df517633af53138007cb..e44f091b639f71fecbd565e0e469da2f708f95c7 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2002-2003,2005 Free Software Foundation, Inc.              *
+ * Copyright (c) 2002-2005,2009 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.7 2005/09/17 19:25:13 tom Exp $")
+MODULE_ID("$Id: lib_ins_wch.c,v 1.11 2009/10/24 22:43:14 tom Exp $")
 
 /*
  * Insert the given character, updating the current location to simplify
  * inserting a string.
  */
-static int
+NCURSES_EXPORT(int)
 _nc_insert_wch(WINDOW *win, const cchar_t *wch)
 {
     int cells = wcwidth(CharOf(CHDEREF(wch)));
@@ -81,7 +81,7 @@ wins_wch(WINDOW *win, const cchar_t *wch)
     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;
@@ -104,7 +104,8 @@ wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
     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) {
@@ -112,12 +113,14 @@ wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
            n = 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++) {
                int len = wcwidth(*cp);
 
-               if (len != 1) {
+               if (len != 1 || !is8bits(*cp)) {
                    cchar_t tmp_cchar;
                    wchar_t tmp_wchar = *cp;
                    memset(&tmp_cchar, 0, sizeof(tmp_cchar));
@@ -129,7 +132,7 @@ wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
                    code = _nc_insert_wch(win, &tmp_cchar);
                } else {
                    /* tabs, other ASCII stuff */
-                   code = _nc_insert_ch(win, (chtype) (*cp));
+                   code = _nc_insert_ch(sp, win, (chtype) (*cp));
                }
                if (code != OK)
                    break;