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>
		
			
				
	
	
		
			234 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * $Id: tuidemo.c,v 1.22 2008/07/14 12:35:23 wmcbrine Exp $
 | 
						|
 *
 | 
						|
 * Author : P.J. Kunst <kunst@prl.philips.nl>
 | 
						|
 * Date   : 25-02-93
 | 
						|
 *
 | 
						|
 * Purpose: This program demonstrates the use of the 'curses' library
 | 
						|
 *          for the creation of (simple) menu-operated programs.
 | 
						|
 *          In the PDCurses version, use is made of colors for the
 | 
						|
 *          highlighting of subwindows (title bar, status bar etc).
 | 
						|
 *
 | 
						|
 * Acknowledgement: some ideas were borrowed from Mark Hessling's
 | 
						|
 *                  version of the 'testcurs' program.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <locale.h>
 | 
						|
#include "tui.h"
 | 
						|
 | 
						|
/* change this if source at other location */
 | 
						|
 | 
						|
#ifdef XCURSES
 | 
						|
# define FNAME  "../demos/tui.c"
 | 
						|
#else
 | 
						|
# define FNAME  "..\\demos\\tui.c"
 | 
						|
#endif
 | 
						|
 | 
						|
/**************************** strings entry box ***************************/
 | 
						|
 | 
						|
void address(void)
 | 
						|
{
 | 
						|
    char *fieldname[6] =
 | 
						|
    {
 | 
						|
        "Name", "Street", "City", "State", "Country", (char *)0
 | 
						|
    };
 | 
						|
 | 
						|
    char *fieldbuf[5];
 | 
						|
    WINDOW *wbody = bodywin();
 | 
						|
    int i, field = 50;
 | 
						|
 | 
						|
    for (i = 0; i < 5; i++)
 | 
						|
        fieldbuf[i] = calloc(1, field + 1);
 | 
						|
 | 
						|
    if (getstrings(fieldname, fieldbuf, field) != KEY_ESC)
 | 
						|
    {
 | 
						|
        for (i = 0; fieldname[i]; i++)
 | 
						|
            wprintw(wbody, "%10s : %s\n",
 | 
						|
                fieldname[i], fieldbuf[i]);
 | 
						|
 | 
						|
        wrefresh(wbody);
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < 5; i++)
 | 
						|
        free(fieldbuf[i]);
 | 
						|
}
 | 
						|
 | 
						|
/**************************** string entry box ****************************/
 | 
						|
 | 
						|
char *getfname(char *desc, char *fname, int field)
 | 
						|
{
 | 
						|
    char *fieldname[2];
 | 
						|
    char *fieldbuf[1];
 | 
						|
 | 
						|
    fieldname[0] = desc;
 | 
						|
    fieldname[1] = 0;
 | 
						|
    fieldbuf[0] = fname;
 | 
						|
 | 
						|
    return (getstrings(fieldname, fieldbuf, field) == KEY_ESC) ? NULL : fname;
 | 
						|
}
 | 
						|
 | 
						|
/**************************** a very simple file browser ******************/
 | 
						|
 | 
						|
void showfile(char *fname)
 | 
						|
{
 | 
						|
    int i, bh = bodylen();
 | 
						|
    FILE *fp;
 | 
						|
    char buf[MAXSTRLEN];
 | 
						|
    bool ateof = FALSE;
 | 
						|
 | 
						|
    statusmsg("FileBrowser: Hit key to continue, Q to quit");
 | 
						|
 | 
						|
    if ((fp = fopen(fname, "r")) != NULL)   /* file available? */
 | 
						|
    {
 | 
						|
        while (!ateof)
 | 
						|
        {
 | 
						|
            clsbody();
 | 
						|
 | 
						|
            for (i = 0; i < bh - 1 && !ateof; i++)
 | 
						|
            {
 | 
						|
                buf[0] = '\0';
 | 
						|
                fgets(buf, MAXSTRLEN, fp);
 | 
						|
 | 
						|
                if (strlen(buf))
 | 
						|
                    bodymsg(buf);
 | 
						|
                else
 | 
						|
                    ateof = TRUE;
 | 
						|
            }
 | 
						|
 | 
						|
            switch (waitforkey())
 | 
						|
            {
 | 
						|
            case 'Q':
 | 
						|
            case 'q':
 | 
						|
            case 0x1b:
 | 
						|
                ateof = TRUE;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        fclose(fp);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        sprintf(buf, "ERROR: file '%s' not found", fname);
 | 
						|
        errormsg(buf);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/***************************** forward declarations ***********************/
 | 
						|
 | 
						|
void sub0(void), sub1(void), sub2(void), sub3(void);
 | 
						|
void func1(void), func2(void);
 | 
						|
void subfunc1(void), subfunc2(void);
 | 
						|
void subsub(void);
 | 
						|
 | 
						|
/***************************** menus initialization ***********************/
 | 
						|
 | 
						|
menu MainMenu[] =
 | 
						|
{
 | 
						|
    { "Asub", sub0, "Go inside first submenu" },
 | 
						|
    { "Bsub", sub1, "Go inside second submenu" },
 | 
						|
    { "Csub", sub2, "Go inside third submenu" },
 | 
						|
    { "Dsub", sub3, "Go inside fourth submenu" },
 | 
						|
    { "", (FUNC)0, "" }   /* always add this as the last item! */
 | 
						|
};
 | 
						|
 | 
						|
menu SubMenu0[] =
 | 
						|
{
 | 
						|
    { "Exit", DoExit, "Terminate program" },
 | 
						|
    { "", (FUNC)0, "" }
 | 
						|
};
 | 
						|
 | 
						|
menu SubMenu1[] =
 | 
						|
{
 | 
						|
    { "OneBeep", func1, "Sound one beep" },
 | 
						|
    { "TwoBeeps", func2, "Sound two beeps" },
 | 
						|
    { "", (FUNC)0, "" }
 | 
						|
};
 | 
						|
 | 
						|
menu SubMenu2[] =
 | 
						|
{
 | 
						|
    { "Browse", subfunc1, "Source file lister" },
 | 
						|
    { "Input", subfunc2, "Interactive file lister" },
 | 
						|
    { "Address", address, "Get address data" },
 | 
						|
    { "", (FUNC)0, "" }
 | 
						|
};
 | 
						|
 | 
						|
menu SubMenu3[] =
 | 
						|
{
 | 
						|
    { "SubSub", subsub, "Go inside sub-submenu" },
 | 
						|
    { "", (FUNC)0, "" }
 | 
						|
};
 | 
						|
 | 
						|
/***************************** main menu functions ************************/
 | 
						|
 | 
						|
void sub0(void)
 | 
						|
{
 | 
						|
    domenu(SubMenu0);
 | 
						|
}
 | 
						|
 | 
						|
void sub1(void)
 | 
						|
{
 | 
						|
    domenu(SubMenu1);
 | 
						|
}
 | 
						|
 | 
						|
void sub2(void)
 | 
						|
{
 | 
						|
    domenu(SubMenu2);
 | 
						|
}
 | 
						|
 | 
						|
void sub3(void)
 | 
						|
{
 | 
						|
    domenu(SubMenu3);
 | 
						|
}
 | 
						|
 | 
						|
/***************************** submenu1 functions *************************/
 | 
						|
 | 
						|
void func1(void)
 | 
						|
{
 | 
						|
    beep();
 | 
						|
    bodymsg("One beep! ");
 | 
						|
}
 | 
						|
 | 
						|
void func2(void)
 | 
						|
{
 | 
						|
    beep();
 | 
						|
    bodymsg("Two beeps! ");
 | 
						|
    beep();
 | 
						|
}
 | 
						|
 | 
						|
/***************************** submenu2 functions *************************/
 | 
						|
 | 
						|
void subfunc1(void)
 | 
						|
{
 | 
						|
    showfile(FNAME);
 | 
						|
}
 | 
						|
 | 
						|
void subfunc2(void)
 | 
						|
{
 | 
						|
    char fname[MAXSTRLEN];
 | 
						|
 | 
						|
    strcpy(fname, FNAME);
 | 
						|
    if (getfname ("File to browse:", fname, 50))
 | 
						|
        showfile(fname);
 | 
						|
}
 | 
						|
 | 
						|
/***************************** submenu3 functions *************************/
 | 
						|
 | 
						|
void subsub(void)
 | 
						|
{
 | 
						|
    domenu(SubMenu2);
 | 
						|
}
 | 
						|
 | 
						|
/***************************** start main menu  ***************************/
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
    setlocale(LC_ALL, "");
 | 
						|
 | 
						|
    startmenu(MainMenu, "TUI - 'textual user interface' demonstration program");
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |