Skip to content

Instantly share code, notes, and snippets.

@reagent reagent/.gitignore

Last active May 13, 2020
What would you like to do?
Curses + C Example
#include <ncurses.h>
#include <unistd.h>
#define DELAY 35000
int main(int argc, char *argv[]) {
int x = 0,
y = 0;
int max_x = 0,
max_y = 0;
int next_x = 0;
int direction = 1;
getmaxyx(stdscr, max_y, max_x);
x = max_x / 2;
y = max_y / 2;
while (1) {
getmaxyx(stdscr, max_y, max_x);
y = max_y / 2;
mvprintw(y, x, "o");
next_x = x + direction;
if (next_x >= max_x || next_x < 0) {
direction*= -1;
} else {
x+= direction;
return 0;
all: demo
rm -rf demo

This comment has been minimized.

Copy link

Xaymup commented Sep 25, 2014

demo.c: In function ‘main’:
demo.c:19:10: error: ‘FALSE’ undeclared (first use in this function)
demo.c:19:10: note: each undeclared identifier is reported only once for each function it appears in
demo.c:21:10: error: ‘stdscr’ undeclared (first use in this function)

What's going on here?


This comment has been minimized.

Copy link

ButchDean commented Sep 29, 2014

What does your makefile look like? This works fine for me.

CFLAGS = -g -Wall
LDFLAGS = -lncurses

.PHONY: clean

    gcc $(CFLAGS) demo.c -o demo $(LDFLAGS)

    rm -rf demo

This comment has been minimized.

Copy link

Meliodus commented Dec 17, 2014

Sir what if i want to use KEY_F(1) to exit from this loop ? .. i don't want to use ctrl+c to exit ..


This comment has been minimized.

Copy link

erm3nda commented Feb 14, 2017

Nice example :-)
It looks like 1/3 stage of a pong game :-) based on ncurses.

Thank you for posting a proper makefile.
I think that @Xaymup has added reference to variable without declare it first.

Read more:

char ch; // declare it first
ch = getchar();
printf( "Input Char Is :%c", ch ); // press F1 then look for return, should be int 265
if ( ch == 265 ) {
    printf( "Got it" )

Even easier, using KEY_F(num) to avoid remembering the int value:

ch = getchar()
if ( ch == KEY_F(1) ) {
    printr( "Got %c !", ch )

The problem is that usually F keys are binded to somewhat at the OS and the program will not respond to them unless you add proper binding to the SO at the execute time.

--- About your question:
So, case you wanna exit with single key (ctrl+c will work anyway), you need to ad something like that at the start or end of loop:

if ((ch = getchar()) == 100) { // 100 means a "d"

The problem with that is that the loop freezes (waits) untill getchar() returns something.
To solve that you have to use any kind of keyboard detector. More info about it (kbhits()) at:

I tried the Linux version of kbhits but ended with:

gcc -Wall demo.c -o demo -lncurses
In file included from demo.c:4:0:
kbhit.c: In function ‘_kbhit’:
kbhit.c:16:9: error: unknown type name ‘termios’
... and much more lines...

... that i've pasted to:

So, finally i read a bit more on the ncurses docs and found the timeout() function, being the solution like this:

if ((ch = getch()) == 100) { // 100 means a "d". Note also that i used getch() not getchar()

Code working that stops with d (i can't bind to f1, try on your own) HERE:
Going to sleep :-D


This comment has been minimized.

Copy link

ghost commented Dec 16, 2017



This comment has been minimized.

Copy link

jcsahnwaldt commented Oct 28, 2019

You should replace LDFLAGS by LDLIBS. Here's a quote from the entry for LDFLAGS in the GNU make manual:

Libraries (-lfoo) should be added to the LDLIBS variable instead.

You could then simplify your Makefile to something like this:

CFLAGS = -g -Wall
LDLIBS = -lncurses

.PHONY: clean

all: demo

    rm -rf demo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.