GNU ncurses is software API for controlling writing to the console screen under Unix, Linux and other operating systems. You can create text-based user interfaces (TUI) on a Linux or Unix-like system using ncurses library.
Installing the ncurses library in Debian/Ubuntu Linux
See this page and GNU ncurses project home page for more information.
- You need to install the following two packages:
libncurses5-dev : Developer's libraries for ncurses
libncursesw5-dev : Developer's libraries for ncursesw - Open the Terminal application.
- Type the following apt-get command to install ncurses header and libs:
sudo apt-get install libncurses5-dev libncursesw5-dev
Sample outputs:
Installing the ncurses library in CentOS/RHEL/Scientific Linux 6.x/7.x+ and Fedora Linux 21 or older
- You need to install the following package:
ncurses-devel : Developer's libraries for ncurses - Open the Terminal application.
- Type the following yum command to install ncurses header and libs:
sudo yum install ncurses-devel
Sample outputs:
Installing the ncurses library in Fedora Linux 22.x+
- You need to install the following package:
ncurses-devel : Developer's libraries for ncurses - Open the Terminal application.
- Type the following dnf command to install ncurses header and libs:
sudo dnf install ncurses-devel
How do compile C program and use the ncurses library?
Create a test program called hello.c as follows:
#include <ncurses.h> int main(void){ initscr(); // Start curses mode printw("Hello World !!!"); // Print Hello World refresh(); // Print it on to the real screen getch(); // Wait for user input endwin(); // End curses mode return 0; }
First, make sure you install GNU/GCC C compiler on a Linux:
- CentOS / RHEL 7: Install GCC (C and C++ Compiler) and Development Tools
- Debian Linux Install GNU GCC Compiler and Development Environment
To link to the ncurses library pass the -lncurses option to gcc/cc command:
Run it:
Sample outputs:
$ cc -o output input.c -lncurses
$ cc -o hello hello.c -lncurses
Run it:
$ ./hello
Sample outputs:
Hello World !!!
Here is another program:
/* CURWIN1.C ========= (c) Copyright Paul Griffiths 1999 Email: mail@paulgriffiths.net Moving windows with ncurses. */ #include <stdlib.h> #include <stdio.h> #include <curses.h> int main(void) { WINDOW * mainwin, * childwin; int ch; // Set the dimensions and initial position for our child window int width = 23, height = 7; int rows = 25, cols = 80; int x = (cols - width) / 2; int y = (rows - height) / 2; // Initialize ncurses if ((mainwin = initscr()) == NULL) { fprintf(stderr, "Error initialising ncurses.\n"); exit(EXIT_FAILURE); } // Switch of echoing and enable keypad (for arrow keys) noecho(); keypad(mainwin, TRUE); // Make our child window, and add a border and some text to it. childwin = subwin(mainwin, height, width, y, x); box(childwin, 0, 0); mvwaddstr(childwin, 1, 4, "Move the window"); mvwaddstr(childwin, 2, 2, "with the arrow keys"); mvwaddstr(childwin, 3, 6, "or HOME/END"); mvwaddstr(childwin, 5, 3, "Press 'q' to quit"); refresh(); // Loop until user hits 'q' to quit while ((ch = getch()) != 'q') { switch (ch) { case KEY_UP: if (y > 0) --y; break; case KEY_DOWN: if (y < (rows - height)) ++y; break; case KEY_LEFT: if (x > 0) --x; break; case KEY_RIGHT: if (x < (cols - width)) ++x; break; case KEY_HOME: x = 0; y = 0; break; case KEY_END: x = (cols - width); y = (rows - height); break; } mvwin(childwin, y, x); } /* Clean up after ourselves */ delwin(childwin); delwin(mainwin); endwin(); refresh(); return EXIT_SUCCESS; }
Compile and run it as follows:
Sample outputs:
$ cc -o curwin1 curwin1.c -lncurses
$ ./curwin1
Sample outputs:
See this page and GNU ncurses project home page for more information.
Comments: One of the very earliest O’Reilly books was gloriously entitled “Programming with curses”.