-
-
Save reagent/9743630 to your computer and use it in GitHub Desktop.
| demo | |
| *.swp |
| #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; | |
| initscr(); | |
| noecho(); | |
| curs_set(FALSE); | |
| 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; | |
| clear(); | |
| mvprintw(y, x, "o"); | |
| refresh(); | |
| usleep(DELAY); | |
| next_x = x + direction; | |
| if (next_x >= max_x || next_x < 0) { | |
| direction*= -1; | |
| } else { | |
| x+= direction; | |
| } | |
| } | |
| endwin(); | |
| return 0; | |
| } |
| CFLAGS=-Wall | |
| LDFLAGS=-lncurses | |
| all: demo | |
| clean: | |
| rm -rf demo |
haha!
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
clean:
rm -rf demo
@meliodus @erm3nda I found a better way to exit the program. If you state that the getch() should be non-blocking, it instantly is.
Just call this in the main:
nodelay(stdscr, TRUE)
then do the other stuff:
int ch;
if ((ch = getch()) == KEY_F(1)) {//F1 will make you escape here
break();
}
should do the trick.
See for more details:
https://www.gnu.org/software/guile-ncurses/manual/html_node/Getting-characters-from-the-keyboard.html
http://www.cs.ukzn.ac.za/~hughm/os/notes/ncurses.html#using
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 ..
change it
@reagent
Nice example :-)
It looks like 1/3 stage of a pong game :-) based on ncurses.
@ButchDean
Thank you for posting a proper makefile.
I think that @xaymup has added reference to variable without declare it first.
@meliodus
Read: http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html
Read more: https://www.mkssoftware.com/docs/man3/curs_getch.3.asp
Even easier, using KEY_F(num) to avoid remembering the int value:
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:
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: http://stackoverflow.com/questions/13547471/c-programming-check-if-key-pressed-without-stopping-program
I tried the Linux version of kbhits but ended with:
... that i've pasted to: http://pastebin.com/1VRdFdPQ.
So, finally i read a bit more on the ncurses docs and found the
timeout()function, being the solution like this:Code working that stops with d (i can't bind to f1, try on your own) HERE: http://pastebin.com/xyfm7LNa
Going to sleep :-D