int wbkgrnd(WINDOW *win, const cchar_t *wch) { #ifndef HAVE_WCHAR return ERR; #else /* int y, x, i; */ attr_t battr; /* nschar_t *np, *tnp, *pnp; */ #ifdef DEBUG __CTRACE(__CTRACE_ATTR, "wbkgrnd: (%p), '%s', %x\n", win, (const char *) wunctrl(wch), wch->attributes); #endif /* ignore multi-column characters */ if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 ) return ERR; /* Background attributes (check colour). */ battr = wch->attributes & WA_ATTRIBUTES; if (__using_color && !( battr & __COLOR)) battr |= __default_color; win->battr = battr; wbkgrndset(win, wch); __touchwin(win); return OK; #endif /* HAVE_WCHAR */ }
static NCURSES_INLINE int wadd_wch_nosync(WINDOW *win, cchar_t ch) /* the workhorse function -- add a character to the given window */ { NCURSES_SIZE_T x, y; wchar_t *s; int tabsize = 8; #if USE_REENTRANT SCREEN *sp = _nc_screen_of(win); #endif /* * If we are using the alternate character set, forget about locale. * Otherwise, if the locale claims the code is printable, treat it that * way. */ if ((AttrOf(ch) & A_ALTCHARSET) || iswprint((wint_t) CharOf(ch))) return wadd_wch_literal(win, ch); /* * Handle carriage control and other codes that are not printable, or are * known to expand to more than one character according to unctrl(). */ x = win->_curx; y = win->_cury; switch (CharOf(ch)) { case '\t': #if USE_REENTRANT tabsize = *ptrTabsize(sp); #else tabsize = TABSIZE; #endif x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize))); /* * Space-fill the tab on the bottom line so that we'll get the * "correct" cursor position. */ if ((!win->_scroll && (y == win->_regbottom)) || (x <= win->_maxx)) { cchar_t blank = blankchar; AddAttr(blank, AttrOf(ch)); while (win->_curx < x) { if (wadd_wch_literal(win, blank) == ERR) return (ERR); } break; } else { wclrtoeol(win); win->_flags |= _WRAPPED; if (newline_forces_scroll(win, &y)) { x = win->_maxx; if (win->_scroll) { scroll(win); x = 0; } } else { x = 0; } } break; case '\n': wclrtoeol(win); if (newline_forces_scroll(win, &y)) { if (win->_scroll) scroll(win); else return (ERR); } /* FALLTHRU */ case '\r': x = 0; win->_flags &= ~_WRAPPED; break; case '\b': if (x == 0) return (OK); x--; win->_flags &= ~_WRAPPED; break; default: if ((s = wunctrl(&ch)) != 0) { while (*s) { cchar_t sch; SetChar(sch, *s++, AttrOf(ch)); if_EXT_COLORS(SetPair(sch, GetPair(ch))); if (wadd_wch_literal(win, sch) == ERR) return ERR; } return OK; } return ERR; } win->_curx = x; win->_cury = y; return OK; }
void dlg_trace_win(WINDOW *win) { if (myFP != 0) { int y, x; int j, k; WINDOW *top = wgetparent(win); while (top != 0 && top != stdscr) { win = top; top = wgetparent(win); } if (win != 0) { int rc = getmaxy(win); int cc = getmaxx(win); chtype ch, c2; fprintf(myFP, "window %dx%d at %d,%d\n", rc, cc, getbegy(win), getbegx(win)); getyx(win, y, x); for (j = 0; j < rc; ++j) { fprintf(myFP, "%3d:", j); for (k = 0; k < cc; ++k) { #ifdef USE_WIDE_CURSES char buffer[80]; ch = mvwinch(win, j, k) & (A_CHARTEXT | A_ALTCHARSET); if (ch & A_ALTCHARSET) { c2 = dlg_asciibox(ch); if (c2 != 0) { ch = c2; } buffer[0] = (char) ch; buffer[1] = '\0'; } else { cchar_t cch; wchar_t *uc; if (win_wch(win, &cch) == ERR || (uc = wunctrl((&cch))) == 0 || uc[1] != 0 || wcwidth(uc[0]) <= 0) { buffer[0] = '.'; buffer[1] = '\0'; } else { mbstate_t state; const wchar_t *ucp = uc; memset(&state, 0, sizeof(state)); wcsrtombs(buffer, &ucp, sizeof(buffer), &state); k += wcwidth(uc[0]) - 1; } } fputs(buffer, myFP); #else ch = mvwinch(win, j, k) & (A_CHARTEXT | A_ALTCHARSET); c2 = dlg_asciibox(ch); if (c2 != 0) { ch = c2; } else if (unctrl(ch) == 0 || strlen(unctrl(ch)) > 1) { ch = '.'; } fputc((int) (ch & 0xff), myFP); #endif } fputc('\n', myFP); } wmove(win, y, x); fflush(myFP); } } }
void wbkgrndset(WINDOW *win, const cchar_t *wch) { #ifdef HAVE_WCHAR attr_t battr; nschar_t *np, *tnp; int i; #ifdef DEBUG __CTRACE(__CTRACE_ATTR, "wbkgrndset: (%p), '%s', %x\n", win, (const char *) wunctrl(wch), wch->attributes); #endif /* ignore multi-column characters */ if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 ) return; /* Background character. */ tnp = np = win->bnsp; if ( wcwidth( wch->vals[ 0 ])) win->bch = wch->vals[ 0 ]; else { if ( !np ) { np = malloc(sizeof(nschar_t)); if (!np) return; np->next = NULL; win->bnsp = np; } np->ch = wch->vals[ 0 ]; tnp = np; np = np->next; } /* add non-spacing characters */ if ( wch->elements > 1 ) { for ( i = 1; i < wch->elements; i++ ) { if ( !np ) { np = malloc(sizeof(nschar_t)); if (!np) return; np->next = NULL; if ( tnp ) tnp->next = np; else win->bnsp = np; } np->ch = wch->vals[ i ]; tnp = np; np = np->next; } } /* clear the old non-spacing characters */ while ( np ) { tnp = np->next; free( np ); np = tnp; } /* Background attributes (check colour). */ battr = wch->attributes & WA_ATTRIBUTES; if (__using_color && !( battr & __COLOR)) battr |= __default_color; win->battr = battr; SET_BGWCOL((*win), 1); #endif /* HAVE_WCHAR */ }