⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ins_wide.c

📁 ncurses-5.4 需要的就来下把 一定会有用的哦
💻 C
字号:
/* * $Id: ins_wide.c,v 1.3 2003/08/09 22:07:23 tom Exp $ * * Demonstrate the wins_wstr() and wins_wch functions. * Thomas Dickey - 2002/11/23 * * Note: to provide inputs for *ins_wch(), we use setcchar().  A quirk of the * X/Open definition for that function is that the string contains no * characters with negative width.  Any control character (such as tab) falls * into that category.  So it follows that *ins_wch() cannot render a tab * character because there is no legal way to construct a cchar_t containing * one.  X/Open does not document this, and it would be logical to assume that * *ins_wstr() has the same limitation, but it uses a wchar_t string directly, * and does not document how tabs are handled. */#include <test.priv.h>#define TABSIZE 8#if USE_WIDEC_SUPPORTstatic int margin = (2 * TABSIZE) - 1;static voidlegend(WINDOW *win, wchar_t * buffer, int length){    wmove(win, 0, 0);    wprintw(win,	    "The Strings/Chars displays should match.  Enter any characters.\n");    wprintw(win,	    "Use down-arrow or ^N to repeat on the next line, 'q' to exit.\n");    wclrtoeol(win);    wprintw(win, "Inserted %d characters <", length);    waddwstr(win, buffer);    waddstr(win, ">");}static intColOf(wchar_t * buffer, int length){    int n;    int result;    for (n = 0, result = margin + 1; n < length; ++n) {	int ch = buffer[n];	switch (ch) {	case '\n':	    /* actually newline should clear the remainder of the line	     * and move to the next line - but that seems a little awkward	     * in this example.	     */	case '\r':	    result = 0;	    break;	case '\b':	    if (result > 0)		--result;	    break;	case '\t':	    result += (TABSIZE - (result % TABSIZE));	    break;	case '\177':	    result += 2;	    break;	default:	    ++result;	    if (ch < 32)		++result;	    break;	}    }    return result;}intmain(int argc GCC_UNUSED, char *argv[]GCC_UNUSED){    cchar_t tmp_cchar;    wchar_t tmp_wchar[2];    wint_t ch;    int code;    int limit;    int row = 1;    int col;    int length;    wchar_t buffer[BUFSIZ];    WINDOW *work;    WINDOW *show;    putenv("TABSIZE=8");    initscr();    (void) cbreak();		/* take input chars one at a time, no wait for \n */    (void) noecho();		/* don't echo input */    keypad(stdscr, TRUE);    limit = LINES - 5;    work = newwin(limit, COLS, 0, 0);    show = newwin(4, COLS, limit + 1, 0);    keypad(work, TRUE);    for (col = margin + 1; col < COLS; col += TABSIZE)	mvwvline(work, row, col, '.', limit - 2);    box(work, 0, 0);    mvwvline(work, row, margin, ACS_VLINE, limit - 2);    mvwvline(work, row, margin + 1, ACS_VLINE, limit - 2);    limit /= 2;    mvwaddstr(work, 1, 2, "String");    mvwaddstr(work, limit + 1, 2, "Chars");    wnoutrefresh(work);    buffer[length = 0] = '\0';    legend(show, buffer, length);    wnoutrefresh(show);    doupdate();    /*     * Show the characters inserted in color, to distinguish from those that     * are shifted.     */    if (has_colors()) {	start_color();	init_pair(1, COLOR_WHITE, COLOR_BLUE);	wbkgdset(work, COLOR_PAIR(1) | ' ');    }    while ((code = wget_wch(work, &ch)) != ERR) {	switch (code) {	case KEY_CODE_YES:	    switch (ch) {	    case KEY_DOWN:		ch = CTRL('N');		break;	    case KEY_BACKSPACE:		ch = '\b';		break;	    default:		beep();		continue;	    }	    break;	}	if (ch == 'q')	    break;	wmove(work, row, margin + 1);	if (ch == CTRL('N')) {	    if (row < limit) {		++row;		/* put the whole string in, all at once */		mvwins_wstr(work, row, margin + 1, buffer);		/* do the corresponding single-character insertion */		for (col = 0; col < length; ++col) {		    memset(&tmp_cchar, 0, sizeof(tmp_cchar));		    if (setcchar(&tmp_cchar,				 &(buffer[col]),				 A_NORMAL,				 0,				 (void *) 0) != ERR) {			mvwins_wch(work, limit + row, ColOf(buffer, col), &tmp_cchar);		    } else {			beep();	/* even for tabs! */			mvwinsch(work,				 limit + row,				 ColOf(buffer, col), buffer[col]);		    }		}	    } else {		beep();	    }	} else {	    buffer[length++] = ch;	    buffer[length] = '\0';	    /* put the string in, one character at a time */	    mvwins_wstr(work,			row,			ColOf(buffer, length - 1), buffer + length - 1);	    /* do the corresponding single-character insertion */	    tmp_wchar[0] = ch;	    tmp_wchar[1] = 0;	    if (setcchar(&tmp_cchar,			 tmp_wchar,			 A_NORMAL,			 0,			 (void *) 0) != ERR) {		mvwins_wch(work,			   limit + row,			   ColOf(buffer, length - 1), &tmp_cchar);	    } else {		beep();		/* even for tabs! */		mvwinsch(work,			 limit + row,			 ColOf(buffer, length - 1), ch);	    }	    wnoutrefresh(work);	    legend(show, buffer, length);	    wnoutrefresh(show);	    doupdate();	}    }    endwin();    ExitProgram(EXIT_SUCCESS);}#elseintmain(void){    printf("This program requires the wide-ncurses library\n");    ExitProgram(EXIT_FAILURE);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -