Change-Id: Iffed3602456f5306711c65f06c873c58d4086e11 Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/363 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
		
			
				
	
	
		
			426 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			426 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  newdemo.c   -   A demo program using PDCurses. The program
 | |
|  *          illustrates the use of colors for text output.
 | |
|  *
 | |
|  *  Hacks by jbuhler@cs.washington.edu on 12/29/96
 | |
|  *
 | |
|  *  $Id: newdemo.c,v 1.39 2008/07/13 16:08:17 wmcbrine Exp $
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <signal.h>
 | |
| #include <string.h>
 | |
| #include <curses.h>
 | |
| #include <stdlib.h>
 | |
| #include <time.h>
 | |
| 
 | |
| int WaitForUser(void);
 | |
| int SubWinTest(WINDOW *);
 | |
| int BouncingBalls(WINDOW *);
 | |
| void trap(int);
 | |
| 
 | |
| /* An ASCII map of Australia */
 | |
| 
 | |
| char *AusMap[17] =
 | |
| {
 | |
|     "                       A ",
 | |
|     "           AA         AA ",
 | |
|     "    N.T. AAAAA       AAAA ",
 | |
|     "     AAAAAAAAAAA  AAAAAAAA ",
 | |
|     "   AAAAAAAAAAAAAAAAAAAAAAAAA Qld.",
 | |
|     " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
 | |
|     " AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
 | |
|     " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ",
 | |
|     "   AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.",
 | |
|     "W.A. AAAAAAAAA      AAAAAA Vic.",
 | |
|     "       AAA   S.A.     AA",
 | |
|     "                       A  Tas.",
 | |
|     ""
 | |
| };
 | |
| 
 | |
| /* Funny messages for the scroller */
 | |
| 
 | |
| char *messages[] =
 | |
| {
 | |
|     "Hello from the Land Down Under",
 | |
|     "The Land of crocs, and a big Red Rock",
 | |
|     "Where the sunflower runs along the highways",
 | |
|     "The dusty red roads lead one to loneliness",
 | |
|     "Blue sky in the morning and",
 | |
|     "Freezing nights and twinkling stars",
 | |
|     NULL
 | |
| };
 | |
| 
 | |
| int WaitForUser(void)
 | |
| {
 | |
|     chtype ch;
 | |
| 
 | |
|     nodelay(stdscr, TRUE);
 | |
|     halfdelay(50);
 | |
| 
 | |
|     ch = getch();
 | |
| 
 | |
|     nodelay(stdscr, FALSE);
 | |
|     nocbreak();     /* Reset the halfdelay() value */
 | |
|     cbreak();
 | |
| 
 | |
|     return (ch == '\033') ? ch : 0;
 | |
| }
 | |
| 
 | |
| int SubWinTest(WINDOW *win)
 | |
| {
 | |
|     WINDOW *swin1, *swin2, *swin3;
 | |
|     int w, h, sw, sh, bx, by;
 | |
| 
 | |
|     wattrset(win, 0);
 | |
|     getmaxyx(win, h, w);
 | |
|     getbegyx(win, by, bx);
 | |
| 
 | |
|     sw = w / 3;
 | |
|     sh = h / 3;
 | |
| 
 | |
|     if ((swin1 = derwin(win, sh, sw, 3, 5)) == NULL)
 | |
|         return 1;
 | |
|     if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL)
 | |
|         return 1;
 | |
|     if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL)
 | |
|         return 1;
 | |
| 
 | |
|     init_pair(8, COLOR_RED, COLOR_BLUE);
 | |
|     wbkgd(swin1, COLOR_PAIR(8));
 | |
|     werase(swin1);
 | |
|     mvwaddstr(swin1, 0, 3, "Sub-window 1");
 | |
|     wrefresh(swin1);
 | |
| 
 | |
|     init_pair(9, COLOR_CYAN, COLOR_MAGENTA);
 | |
|     wbkgd(swin2, COLOR_PAIR(9));
 | |
|     werase(swin2);
 | |
|     mvwaddstr(swin2, 0, 3, "Sub-window 2");
 | |
|     wrefresh(swin2);
 | |
| 
 | |
|     init_pair(10, COLOR_YELLOW, COLOR_GREEN);
 | |
|     wbkgd(swin3, COLOR_PAIR(10));
 | |
|     werase(swin3);
 | |
|     mvwaddstr(swin3, 0, 3, "Sub-window 3");
 | |
|     wrefresh(swin3);
 | |
| 
 | |
|     delwin(swin1);
 | |
|     delwin(swin2);
 | |
|     delwin(swin3);
 | |
|     WaitForUser();
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| int BouncingBalls(WINDOW *win)
 | |
| {
 | |
|     chtype c1, c2, c3, ball1, ball2, ball3;
 | |
|     int w, h, x1, y1, xd1, yd1, x2, y2, xd2, yd2, x3, y3, xd3, yd3, c;
 | |
| 
 | |
|     curs_set(0);
 | |
| 
 | |
|     wbkgd(win, COLOR_PAIR(1));
 | |
|     wrefresh(win);
 | |
|     wattrset(win, 0);
 | |
| 
 | |
|     init_pair(11, COLOR_RED, COLOR_GREEN);
 | |
|     init_pair(12, COLOR_BLUE, COLOR_RED);
 | |
|     init_pair(13, COLOR_YELLOW, COLOR_WHITE);
 | |
| 
 | |
|     ball1 = 'O' | COLOR_PAIR(11);
 | |
|     ball2 = '*' | COLOR_PAIR(12);
 | |
|     ball3 = '@' | COLOR_PAIR(13);
 | |
| 
 | |
|     getmaxyx(win, h, w);
 | |
| 
 | |
|     x1 = 2 + rand() % (w - 4);
 | |
|     y1 = 2 + rand() % (h - 4);
 | |
|     x2 = 2 + rand() % (w - 4);
 | |
|     y2 = 2 + rand() % (h - 4);
 | |
|     x3 = 2 + rand() % (w - 4);
 | |
|     y3 = 2 + rand() % (h - 4);
 | |
| 
 | |
|     xd1 = 1;
 | |
|     yd1 = 1;
 | |
|     xd2 = 1;
 | |
|     yd2 = -1;
 | |
|     xd3 = -1;
 | |
|     yd3 = 1;
 | |
| 
 | |
|     nodelay(stdscr, TRUE);
 | |
| 
 | |
|     while ((c = getch()) == ERR)
 | |
|     {
 | |
|         x1 += xd1;
 | |
|         if (x1 <= 1 || x1 >= w - 2)
 | |
|             xd1 *= -1;
 | |
| 
 | |
|         y1 += yd1;
 | |
|         if (y1 <= 1 || y1 >= h - 2)
 | |
|             yd1 *= -1;
 | |
| 
 | |
|         x2 += xd2;
 | |
|         if (x2 <= 1 || x2 >= w - 2)
 | |
|             xd2 *= -1;
 | |
| 
 | |
|         y2 += yd2;
 | |
|         if (y2 <= 1 || y2 >= h - 2)
 | |
|             yd2 *= -1;
 | |
| 
 | |
|         x3 += xd3;
 | |
|         if (x3 <= 1 || x3 >= w - 2)
 | |
|             xd3 *= -1;
 | |
| 
 | |
|         y3 += yd3;
 | |
|         if (y3 <= 1 || y3 >= h - 2)
 | |
|             yd3 *= -1;
 | |
| 
 | |
|         c1 = mvwinch(win, y1, x1);
 | |
|         c2 = mvwinch(win, y2, x2);
 | |
|         c3 = mvwinch(win, y3, x3);
 | |
| 
 | |
|         mvwaddch(win, y1, x1, ball1);
 | |
|         mvwaddch(win, y2, x2, ball2);
 | |
|         mvwaddch(win, y3, x3, ball3);
 | |
| 
 | |
|         wmove(win, 0, 0);
 | |
|         wrefresh(win);
 | |
| 
 | |
|         mvwaddch(win, y1, x1, c1);
 | |
|         mvwaddch(win, y2, x2, c2);
 | |
|         mvwaddch(win, y3, x3, c3);
 | |
| 
 | |
|         napms(150);
 | |
|     }
 | |
| 
 | |
|     nodelay(stdscr, FALSE);
 | |
|     ungetch(c);
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| /* Trap interrupt */
 | |
| 
 | |
| void trap(int sig)
 | |
| {
 | |
|     if (sig == SIGINT)
 | |
|     {
 | |
|         endwin();
 | |
| 
 | |
|         exit(0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|     WINDOW *win;
 | |
|     chtype save[80], ch;
 | |
|     int width, height, w, x, y, i, j, seed;
 | |
| 
 | |
| #ifdef XCURSES
 | |
|     Xinitscr(argc, argv);
 | |
| #else
 | |
|     initscr();
 | |
| #endif
 | |
|     seed = time((time_t *)0);
 | |
|         srand(seed);
 | |
| 
 | |
|     start_color();
 | |
| # if defined(NCURSES_VERSION) || (defined(PDC_BUILD) && PDC_BUILD > 3000)
 | |
|     use_default_colors();
 | |
| # endif
 | |
|     cbreak();
 | |
|     noecho();
 | |
| 
 | |
|     curs_set(0);
 | |
| 
 | |
| #if !defined(__TURBOC__) && !defined(OS2)
 | |
|     signal(SIGINT, trap);
 | |
| #endif
 | |
|     noecho();
 | |
| 
 | |
|     /* refresh stdscr so that reading from it will not cause it to
 | |
|        overwrite the other windows that are being created */
 | |
| 
 | |
|     refresh();
 | |
| 
 | |
|     /* Create a drawing window */
 | |
| 
 | |
|     width  = 48;
 | |
|     height = 15;
 | |
| 
 | |
|     win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2);
 | |
| 
 | |
|     if (win == NULL)
 | |
|     {
 | |
|         endwin();
 | |
| 
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     for (;;)
 | |
|     {
 | |
|         init_pair(1, COLOR_WHITE, COLOR_BLUE);
 | |
|         wbkgd(win, COLOR_PAIR(1));
 | |
|         werase(win);
 | |
| 
 | |
|         init_pair(2, COLOR_RED, COLOR_RED);
 | |
|         wattrset(win, COLOR_PAIR(2));
 | |
|         box(win, ' ', ' ');
 | |
|         wrefresh(win);
 | |
| 
 | |
|         wattrset(win, 0);
 | |
| 
 | |
|         /* Do random output of a character */
 | |
| 
 | |
|         ch = 'a';
 | |
| 
 | |
|         nodelay(stdscr, TRUE);
 | |
| 
 | |
|         for (i = 0; i < 5000; ++i)
 | |
|         {
 | |
|             x = rand() % (width - 2) + 1;
 | |
|             y = rand() % (height - 2) + 1;
 | |
| 
 | |
|             mvwaddch(win, y, x, ch);
 | |
|             wrefresh(win);
 | |
| 
 | |
|             if (getch() != ERR)
 | |
|                 break;
 | |
| 
 | |
|             if (i == 2000)
 | |
|             {
 | |
|                 ch = 'b';
 | |
|                 init_pair(3, COLOR_CYAN, COLOR_YELLOW);
 | |
|                 wattrset(win, COLOR_PAIR(3));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         nodelay(stdscr, FALSE);
 | |
| 
 | |
|         SubWinTest(win);
 | |
| 
 | |
|         /* Erase and draw green window */
 | |
| 
 | |
|         init_pair(4, COLOR_YELLOW, COLOR_GREEN);
 | |
|         wbkgd(win, COLOR_PAIR(4));
 | |
|         wattrset(win, A_BOLD);
 | |
|         werase(win);
 | |
|         wrefresh(win);
 | |
| 
 | |
|         /* Draw RED bounding box */
 | |
| 
 | |
|         wattrset(win, COLOR_PAIR(2));
 | |
|         box(win, ' ', ' ');
 | |
|         wrefresh(win);
 | |
| 
 | |
|         /* Display Australia map */
 | |
| 
 | |
|         wattrset(win, A_BOLD);
 | |
|         i = 0;
 | |
| 
 | |
|         while (*AusMap[i])
 | |
|         {
 | |
|             mvwaddstr(win, i + 1, 8, AusMap[i]);
 | |
|             wrefresh(win);
 | |
|             napms(100);
 | |
|             ++i;
 | |
|         }
 | |
| 
 | |
|         init_pair(5, COLOR_BLUE, COLOR_WHITE);
 | |
|         wattrset(win, COLOR_PAIR(5) | A_BLINK);
 | |
|         mvwaddstr(win, height - 2, 3,
 | |
|             " PDCurses 3.4 - DOS, OS/2, Win32, X11, SDL");
 | |
|         wrefresh(win);
 | |
| 
 | |
|         /* Draw running messages */
 | |
| 
 | |
|         init_pair(6, COLOR_BLACK, COLOR_WHITE);
 | |
|         wattrset(win, COLOR_PAIR(6));
 | |
|         w = width - 2;
 | |
|         nodelay(win, TRUE);
 | |
| 
 | |
|         /* jbuhler's re-hacked scrolling messages */
 | |
| 
 | |
|         for (j = 0; messages[j] != NULL; j++)
 | |
|         {
 | |
|             char *message = messages[j];
 | |
|             int msg_len = strlen(message);
 | |
|             int scroll_len = w + 2 * msg_len;
 | |
|             char *scrollbuf = malloc(scroll_len);
 | |
|             char *visbuf = scrollbuf + msg_len;
 | |
|             int stop = 0;
 | |
|             int i;
 | |
| 
 | |
|             for (i = w + msg_len; i > 0; i--)
 | |
|             {
 | |
|                 memset(visbuf, ' ', w);
 | |
|                 strncpy(scrollbuf + i, message, msg_len);
 | |
|                 mvwaddnstr(win, height / 2, 1, visbuf, w);
 | |
|                 wrefresh(win);
 | |
| 
 | |
|                 if (wgetch(win) != ERR)
 | |
|                 {
 | |
|                     flushinp();
 | |
|                     stop = 1;
 | |
|                     break;
 | |
|                 }
 | |
| 
 | |
|                 napms(100);
 | |
|             }
 | |
| 
 | |
|             free(scrollbuf);
 | |
| 
 | |
|             if (stop)
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         j = 0;
 | |
| 
 | |
|         /*  Draw running 'A's across in RED */
 | |
| 
 | |
|         init_pair(7, COLOR_RED, COLOR_GREEN);
 | |
|         wattron(win, COLOR_PAIR(7));
 | |
| 
 | |
|         for (i = 2; i < width - 4; ++i)
 | |
|         {
 | |
|             ch = mvwinch(win, 5, i);
 | |
|             save[j++] = ch;
 | |
|             ch = ch & 0x7f;
 | |
|             mvwaddch(win, 5, i, ch);
 | |
|         }
 | |
| 
 | |
|         wrefresh(win);
 | |
| 
 | |
|         /* Put a message up; wait for a key */
 | |
| 
 | |
|         i = height - 2;
 | |
|         wattrset(win, COLOR_PAIR(5));
 | |
|         mvwaddstr(win, i, 3,
 | |
|             "   Type a key to continue or ESC to quit  ");
 | |
|         wrefresh(win);
 | |
| 
 | |
|         if (WaitForUser() == '\033')
 | |
|             break;
 | |
| 
 | |
|         /* Restore the old line */
 | |
| 
 | |
|         wattrset(win, 0);
 | |
| 
 | |
|         for (i = 2, j = 0; i < width - 4; ++i)
 | |
|             mvwaddch(win, 5, i, save[j++]);
 | |
| 
 | |
|         wrefresh(win);
 | |
| 
 | |
|         BouncingBalls(win);
 | |
| 
 | |
|         /* BouncingBalls() leaves a keystroke in the queue */
 | |
| 
 | |
|         if (WaitForUser() == '\033')
 | |
|             break;
 | |
|     }
 | |
| 
 | |
|     endwin();
 | |
| 
 | |
|     return 0;
 | |
| }
 |