Tag: curses

为什么getch()没有读取输入的最后一个字符?

我正在使用ncurses库在C中编写一个蛇游戏,其中屏幕每秒更新一次。 当玩游戏的人知道,如果用户输入各种键或长按键,则不应存储“缓冲”按键。 换句话说,如果我按住w (向上键)并且stdin接收到20 w s的序列,然后输入d (右键),我希望蛇立即向右移动,并忽略缓冲w s。 我试图使用ncurses函数getch()实现这一点,但由于某种原因,我实现了我刚才描述的不良效果; 即在考虑最后一个按键之前,首先存储和处理任何长按键,因为这个MWE将说明: #include #include #include int main(){ char c = ‘a’; initscr(); cbreak(); noecho(); for(;;){ fflush(stdin); timeout(500); c = getch(); sleep(1); printw(“%c”, c); } return 0; } 有没有什么办法可以修改这段代码,以便getch()忽略任何缓冲的文本? 之前的fflush()似乎没有帮助。

在循环中执行initscr()会导致错误初始化

我正在尝试制作一个简单的ncurses程序来显示带有消息的框。 我遵循这个链接 ,它运作良好。 我遇到的问题是,如果我将整个代码放在一个函数中并在循环中调用它,那么初始化就会出错。 据我所知,如果我在函数末尾调用endwin() ,那么再次调用initscr()应该没有任何问题。 我是否缺少一个能够再次调用initscr()的函数? 这是代码: #include #include #include #include int call() { WINDOW *mainwin, *childwin; int ch; if ((mainwin = initscr()) == NULL) { fprintf(stderr, “Error initialising ncurses.\n”); exit(EXIT_FAILURE); } noecho(); curs_set(FALSE); keypad(mainwin, TRUE); mvaddstr(childwin, 1, 6, “Warning! Press q to exit”); mvaddstr(childwin, 2, 15, “{ OK }”); refresh(); while( (ch = […]

使用curses.h从键盘获取char

我正在尝试使用curses.h从键盘获取一个字符。 这是我的源码(get_char_example.c): #include #include int main(void) { char ch; printf(“Enter a character: “); ch = getch(); printf(“\nIts ASCII code is %d\n”, ch); return 0; } 我使用以下命令编译: gcc get_char_example.c -o get_char_example 我收到以下错误: /tmp/ccjaXwRU.o:在函数`main’中: get_char_example.c:(.text+0x1c): undefined reference to `stdscr’ get_char_example.c:(.text+0x24): undefined reference to `wgetch’ collect2: error: ld returned 1 exit status 使用:gcc(GCC)7.2.0 Arch Linux 4.13.9-1-ARCH 提前致谢!

通过fifo将curses输入发送到C中的另一个终端

我的C程序在终端中运行多个线程,异步打印消息。 我想要一个显示curses输出的线程,但由于它是异步的,它必须在另一个终端中。 我的想法是将curses输出写入fifo并使用cat fifo打开终端。 但是我如何才能恢复输出诅咒并将其输出到文件中? 谢谢。

如何使用terminfo以终端无关的方式正确打印特殊键序列?

我试图模仿用户,按下 , , 等特殊键。 我听说curses / terminfo可能有助于以终端无关的方式做到这一点,但是当我尝试(使用以下代码)打印第一个字符串“text”然后发出key_left序列时,我没有得到(带有’|’作为光标) “tex|t” ,而是”textD|” 。 为什么? 怎么做得好? #include #include static void putf(const char *name) { putp(name); fflush(stdout); } int main(int argc, char **argv) { setupterm((char*)0, 1, (int*)0); printf(“text”); fflush(stdout); putf(key_left); // hang up until user input fgetc(stdin); return 0; } 请注意,虽然我可以使用curses,但在我的用例中,ncurses是不可接受的。 另外,请注意我不想使用像initscr()这样的东西,用空白替换当前的终端屏幕,这不是一个理想的行为。

如何在ncurses中获得明亮的白色?

如何使用浅灰色背景和亮白色的foregraound初始化颜色对? init_pair(number,COLOR_WHITE,COLOR_WHITE)创建一个浅灰色前景和背景的颜色对,但我需要前景非常白。 我尝试将COLOR_WHITE与A_BLINK(通过按位OR)组合,但这不起作用。 Ncurses howto的/ examples / documentaion也无法帮助我。

shell在ncurses窗口?

我目前正在尝试使用ncurses编写一个最小的终端多路复用器。 但是,当我尝试执行shell时,它不会打印到窗口,而是启动一个新的子execv来控制窗口(即忽略ncurses)。 我怎样才能防止这种情况并让ncurses控制它? 有没有办法获得tty并控制它? 编辑 感谢Ross Ridge的评论,我现在知道我需要创建一个伪终端,然后我将其读入一个ncurses窗口。 但是,我无法弄清楚如何在ncurses窗口中打印stdout。 是否有读取文件描述符的ncurses函数? 或者我必须以某种方式使用printw() ?

诅咒得到箭头键

在尝试通过curses(ncurses)从箭头键获取输入时,它不会捕获KEY_UP等。我使用带有true参数的键盘函数但getch仍然返回一个转义序列。 如何筛选getch()返回的值并专门抓取箭头键?

如何禁用“curses.h”头文件(Xcode 6.3 OSX Yosemite中的“stdio.h”的一部分)以避免冲突的函数声明

我正在尝试在Xcode中构建一个项目,但是我得到了错误Implicit declaration of function ‘clear’ is invalid in C99 Conflicting types for ‘clear’ Implicit declaration of function ‘clear’ is invalid in C99 。 这是代码: //main.c #include #include “tree.h” int main(){ clear(); // Implicit declaration of function ‘clear’ is invalid in C99 return 0; } //tree.c #include #include “tree.h” void clear(){ ///Conflicting types for ‘clear’ printf(“Command […]

如何从stdin获取角色而无需等待用户放置它?

我正在编写一个C程序,使用ncurses在终端上打印一些东西。 用户按’s’时应该停止打印,按’s’再次继续打印。 如何在不等待用户按键的情况下从输入中读取密钥? 我尝试了getch()和getchar()但是他们等到按下一个键… 编辑 这是我的代码: int main(void) { initscr(); /* Start curses mode */ refresh(); /* Print it on to the real screen */ int i = 0, j = 0; int state = 0; while (1) { cbreak(); int c = getch(); /* Wait for user input */ switch (c) { case ‘q’: […]