errigour |
10-06-2012 09:13 PM |
Ncurses bug or ncurses program error.
The key down feature in case MENU_DESC doesn't key down the way I want it to. If you compile and run this program tell me if its an error on my behalf or if there's a function of ncurses I need to know about.
Code:
#include <time.h>
#include <curses.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
WINDOW *scrn;
WINDOW *map;
WINDOW *menu;
WINDOW *key;
WINDOW *name_box;
WINDOW *desc_box;
/* Player state */
#define MENU_MAIN 0
#define MENU_NAME 1
#define MENU_DESC 2
#define MENU_SIZE 3
#define MENU_CSIZE 4
#define MENU_CEXPR 5
#define MENU_FLIGHT 6
#define MENU_FBRIGHT 7
#define MENU_BACK 8
#define CREATING 9
const char *menu_main[] =
{
"Create Dungeon Map",
" Exit "
};
const char *menu_name[] =
{
"Enter a map name",
"",
"",
"",
"Exit"
};
const char *menu_desc[] =
{
"Enter a description",
"",
"",
"",
"",
"",
"",
"",
"Go back",
"Done ",
"Exit "
};
const char *desc_key[] =
{
"Numpad explores description",
" ^8 up",
"<4 >6 left and right",
" v2 down"
};
const char *menu_size[] =
{
" Select Map Size ",
" 51x101 ",
" 101x201 ",
" 151x301 ",
" 251x501 ",
" 451x901 ",
" Custom size ",
" Go back "
};
const char *menu_csize[] =
{
"Enter height#",
"Enter width #"
};
const char *menu_cexpr[] =
{
"Would you like to modify",
"Color expressions ex: @r",
" Yes ",
" NO ",
};
const char *menu_flight[] =
{
"Foreground Light",
"Black #",
"Red #",
"Magenta#",
"Cyan #",
"Blue #",
"Green #",
"White #",
"Yellow #"
};
const char *menu_fbright[] =
{
"Foreground Bright",
"Black #",
"Red #",
"Magenta#",
"Cyan #",
"Blue #",
"Green #",
"White #",
"Yellow #"
};
const char *menu_back[] =
{
"Background Light",
"Black #",
"Red #",
"Magenta#",
"Cyan #",
"Blue #",
"Green #",
"White #",
"Yellow #"
};
/* local cunftions */
void create_area(int xin, int yin, const char *path, const char *name, const char *description);
void print_menu(WINDOW *menu_win, const char **menu, int highlight, short int n_choices);
void color_ini();
int main(int argc, char **argv)
{
bool quit = false;
char name[100];
char name_box_disp[20];
char desc[10000];
char area_map[502][1002];
area_map[501][1001] = 'Q';
char color_map[502][1002];
color_map[501][1001] = 'Q';
char bg_map[502][1002];
bg_map[501][1001] = 'Q';
short int y = 0x00, x = 0x00;
short int scrmaxh, scrmaxw;
short int mapmaxh, mapmaxw;
short int menumaxh, menumaxw;
short int state = MENU_MAIN;
short int highlight = 0x00;
short int selection = 0x00;
short int cursory, cursorx;
short int name_pos = 0x00;
short int place = 0x00;
int C = 0x00;
/* initialize your non-curses data structures here */
scrn = initscr(); /* initialize the curses library */
clear(); /* Clears windows on refresh with new values */
noecho(); /* Do not echo input */
cbreak(); /* Line buffering disabled. pass on everything */
keypad(scrn, TRUE); /* setup wgetch and getch functions */
curs_set(0); /* Hide the cursor untill we start editing */
raw();
//nodelay(scrn, TRUE); /* wget and getch don't delay loop */
color_ini();
refresh();
// getyx(win, int, int cursor position in current window.
getmaxyx(scrn, scrmaxh, scrmaxw);
map = newwin(25, 50, 1, 1);
getmaxyx(map, mapmaxh, mapmaxw);
menu = newwin(2, 18, 1, mapmaxw + 2);
getmaxyx(menu, menumaxh, menumaxw);
key = newwin(4, 27, 1, mapmaxw + menumaxw + 3);
name_box = newwin(3, 22, 2, mapmaxw + 2);
box(name_box, 0, 0);
desc_box = newwin( 7, 22, 2, mapmaxw + 2);
box(desc_box, 0, 0);
for( y = 0; y < mapmaxh; y++)
for( x = 0; x < mapmaxw; x++)
if( y == 0)
if(x == 0 || x == (mapmaxw - 1)){
wattron(map, COLOR_PAIR(3));
mvwprintw(map, y, x, "+");
wattroff(map, COLOR_PAIR(3));
} else {
wattron(map, COLOR_PAIR(3));
mvwprintw(map, y, x, "-");
wattroff(map, COLOR_PAIR(3));
}
else if ( y == (mapmaxh - 1))
if(x == 0 || x == (mapmaxw - 1)){
wattron(map, COLOR_PAIR(3));
mvwprintw(map, y, x, "+");
wattroff(map, COLOR_PAIR(3));
} else {
wattron(map, COLOR_PAIR(3));
mvwprintw(map, y, x, "-");
wattroff(map, COLOR_PAIR(3));
}
else if ( x == 0 || x == (mapmaxw - 1)){
wattron(map, COLOR_PAIR(3));
mvwprintw(map, y, x, "|");
wattroff(map, COLOR_PAIR(3));
} else
mvwprintw(map, y, x, "#");
wrefresh(map);
print_menu(menu, menu_main, 0, 2);
while ( quit == false)
{
C = wgetch(scrn);
getyx(scrn, cursory, cursorx);
if ( state == MENU_NAME)
{
if ( cursorx > 72)
{
cursorx--;
wmove(scrn, cursory, cursorx);
}
if ( C == 263 /* Backspace */)
{
if ( name_pos > 0)
name_pos--;
if ( cursorx == 71 && name_pos > 19)
{
cursorx++;
wmove(scrn, cursory, cursorx);
}
place = name_pos;
}
if( C == KEY_LEFT && name_pos > 0)
{
name_pos--;
if ( name_pos < 19)
{
cursorx--;
wmove(scrn, cursory, cursorx);
}
}
if( C == KEY_RIGHT && name_pos < 100 && name_pos < place)
{
name_pos++;
if ( name_pos < 20)
{
cursorx++;
wmove(scrn, cursory, cursorx);
}
}
if ( C > 20 && C < 126 && name_pos < 100)
{
name[name_pos++] = C;
if ( place < name_pos)
place = name_pos;
}
if ( name_pos >= place && name_pos < 100 && place != 100)
name[name_pos] = 0x00;
int x, y;
y = name_pos;
for ( x = 0; x < 20; x++)
{
if ( name_pos >= 20)
{
name_box_disp[x] = name[y - 19];
y++;
}
else
name_box_disp[x] = name[x];
if( name_box_disp[x] == 0x00)
break;
}
mvwprintw(name_box, 1, 1, "%-20s", name_box_disp);
//box(name_box, 0, 0);
wrefresh(name_box);
move(cursory, cursorx);
}
switch ( C )
{
case KEY_UP:
switch(state)
{
case MENU_MAIN:
if (highlight == 0)
break;
else
{
highlight--;
selection = highlight;
print_menu(menu, menu_main, highlight, 2);
}
break;
case MENU_NAME:
if ( highlight == 4 )
{
curs_set(1);
highlight = -1;
selection = -1;
wmove(scrn, cursory, cursorx);
print_menu(menu, menu_name, highlight, 5);
wrefresh(menu);
wrefresh(name_box);
}
break;
case MENU_DESC:
if ( highlight == 8 )
{
curs_set(1);
highlight = -1;
selection = -1;
wmove(scrn, cursory, cursorx);
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
if ( highlight == 9 )
{
highlight = 8;
selection = 8;
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
if ( highlight == 10 )
{
highlight = 9;
selection = 9;
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
break;
case MENU_SIZE:
break;
case MENU_CSIZE:
break;
case MENU_CEXPR:
break;
case MENU_FLIGHT:
break;
case MENU_FBRIGHT:
break;
case MENU_BACK:
break;
case CREATING:
break;
default:
break;
}
break;
case KEY_DOWN:
switch(state)
{
case MENU_MAIN:
if (highlight == 1)
break;
else
{
highlight++;
selection = highlight;
print_menu(menu, menu_main, highlight, 2);
}
break;
case MENU_NAME:
if ( highlight == -1)
{
curs_set(0);
highlight = 4;
selection = 4;
print_menu(menu, menu_name, highlight, 5);
wrefresh(menu);
wrefresh(name_box);
}
break;
case MENU_DESC:
if ( highlight == -1)
{
curs_set(0);
highlight = 8;
selection = 8;
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
if ( highlight == 8)
{
highlight = 9;
selection = 9;
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
if ( highlight == 9)
{
highlight = 10;
selection = 10;
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
wrefresh(desc_box);
}
break;
case MENU_SIZE:
break;
case MENU_CSIZE:
break;
case MENU_CEXPR:
break;
case MENU_FLIGHT:
break;
case MENU_FBRIGHT:
break;
case MENU_BACK:
break;
case CREATING:
break;
default:
break;
}
break;
case KEY_LEFT:
switch(state)
{
case MENU_NAME:
break;
case MENU_DESC:
break;
case MENU_FLIGHT:
break;
case MENU_FBRIGHT:
break;
case MENU_BACK:
break;
case CREATING:
break;
default:
break;
}
break;
case KEY_RIGHT:
switch(state)
{
case MENU_NAME:
break;
case MENU_DESC:
break;
case MENU_FLIGHT:
break;
case MENU_FBRIGHT:
break;
case MENU_BACK:
break;
case CREATING:
break;
default:
break;
}
break;
case 0x0A: //ENTER WAS PRESSEd
switch(state)
{
case MENU_MAIN:
if ( selection == 0)
{
wclear(menu);
wrefresh(menu);
state = MENU_NAME;
wresize(menu, 5, 16);
print_menu(menu, menu_name, highlight = -1, 5);
wrefresh(menu);
curs_set(1);
echo();
move(3, mapmaxw + 3);
wrefresh(name_box);
highlight = -1;
selection = -1;
}
else
quit = true;
break;
case MENU_NAME:
if ( selection == 4)
quit = true;
highlight = -1;
selection = -1;
wclear(menu);
wrefresh(menu);
state = MENU_DESC;
wresize(menu, 11, 19);
print_menu(menu, menu_desc, highlight, 11);
wrefresh(menu);
move(3, mapmaxw + 3);
wrefresh(desc_box);
break;
case MENU_DESC:
if ( selection == 8)
state = MENU_NAME;
if ( selection == 9)
state = MENU_SIZE;
if ( selection == 10)
quit = true;
break;
case MENU_SIZE:
break;
case MENU_CSIZE:
break;
case MENU_CEXPR:
break;
case MENU_FLIGHT:
break;
case MENU_FBRIGHT:
break;
case MENU_BACK:
break;
default:
break;
}
break;
case 3:
quit = true;
break;
default:
break;
}
}
/* do your non-curses wrapup here */
clear();
refresh();
endwin();
if ( name )
printf("Name: %s\r\nNumber[%d]\r\n", name, name_pos);
exit(0);
}
void print_menu(WINDOW *menu_win, const char **menu, int highlight, short int n_choices)
{
short int y, x, i;
y = 0;
x = 0;
for(i = 0; i < n_choices; ++i)
{ if(highlight == i) /* High light the present choice */
{ wattron(menu_win, A_REVERSE);
mvwprintw(menu_win, y, x, "%s", menu[i]);
wattroff(menu_win, A_REVERSE);
}
else
mvwprintw(menu_win, y, x, "%s", menu[i]);
++y;
}
wrefresh(menu_win);
}
void create_area(int yin, int xin, const char *path, const char *name, const char *description)
{
FILE *fp;
int x, y;
if ((fp = fopen(path, "w")) == NULL)
printf("Error opening %s\r\n", path);
fwrite(name, 1, strlen(name), fp); fwrite("\n", 1, 1, fp);
fwrite(description, 1, strlen(description), fp);
fwrite("~\n", 1, 2, fp);
for ( y = 0; y < yin && y <= SHRT_MAX - 1; y++)
{
for ( x = 0; x < xin && x <= SHRT_MAX - 1; x++)
{
if ( y == ( yin - 1) && x == (xin - 1))
fwrite("Q", 1, 1, fp);
else
fwrite(".", 1, 1, fp);
}
if ( y < (yin - 1))
fwrite("\n", 1, 1, fp);
}
fclose(fp);
}
void color_ini()
{
if (has_colors())
{
start_color();
/*
* Simple color assignment, often all we need. Color pair 0 cannot
* be redefined. This example uses the same value for the color
* pair as for the foreground color, though of course that is not
* necessary:
*/
init_pair(0, COLOR_WHITE, COLOR_BLACK);
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
init_pair(3, COLOR_YELLOW, COLOR_BLACK);
init_pair(4, COLOR_BLUE, COLOR_BLACK);
init_pair(5, COLOR_CYAN, COLOR_BLACK);
init_pair(6, COLOR_MAGENTA, COLOR_BLACK);
init_pair(7, COLOR_BLACK, COLOR_BLACK);
init_pair(8, COLOR_WHITE, COLOR_WHITE);
init_pair(9, COLOR_RED, COLOR_WHITE);
init_pair(10, COLOR_GREEN, COLOR_WHITE);
init_pair(11, COLOR_YELLOW, COLOR_WHITE);
init_pair(12, COLOR_BLUE, COLOR_WHITE);
init_pair(13, COLOR_CYAN, COLOR_WHITE);
init_pair(14, COLOR_MAGENTA, COLOR_WHITE);
init_pair(15, COLOR_BLACK, COLOR_WHITE);
init_pair(16, COLOR_WHITE, COLOR_RED);
init_pair(17, COLOR_RED, COLOR_RED);
init_pair(18, COLOR_GREEN, COLOR_RED);
init_pair(19, COLOR_YELLOW, COLOR_RED);
init_pair(20, COLOR_BLUE, COLOR_RED);
init_pair(21, COLOR_CYAN, COLOR_RED);
init_pair(22, COLOR_MAGENTA, COLOR_RED);
init_pair(23, COLOR_BLACK, COLOR_RED);
init_pair(24, COLOR_WHITE, COLOR_GREEN);
init_pair(25, COLOR_RED, COLOR_GREEN);
init_pair(26, COLOR_GREEN, COLOR_GREEN);
init_pair(27, COLOR_YELLOW, COLOR_GREEN);
init_pair(28, COLOR_BLUE, COLOR_GREEN);
init_pair(29, COLOR_CYAN, COLOR_GREEN);
init_pair(30, COLOR_MAGENTA, COLOR_GREEN);
init_pair(31, COLOR_BLACK, COLOR_GREEN);
init_pair(32, COLOR_WHITE, COLOR_YELLOW);
init_pair(33, COLOR_RED, COLOR_YELLOW);
init_pair(34, COLOR_GREEN, COLOR_YELLOW);
init_pair(35, COLOR_YELLOW, COLOR_YELLOW);
init_pair(36, COLOR_BLUE, COLOR_YELLOW);
init_pair(37, COLOR_CYAN, COLOR_YELLOW);
init_pair(38, COLOR_MAGENTA, COLOR_YELLOW);
init_pair(39, COLOR_BLACK, COLOR_YELLOW);
init_pair(40, COLOR_WHITE, COLOR_BLUE);
init_pair(41, COLOR_RED, COLOR_BLUE);
init_pair(42, COLOR_GREEN, COLOR_BLUE);
init_pair(43, COLOR_YELLOW, COLOR_BLUE);
init_pair(44, COLOR_BLUE, COLOR_BLUE);
init_pair(45, COLOR_CYAN, COLOR_BLUE);
init_pair(46, COLOR_MAGENTA, COLOR_BLUE);
init_pair(47, COLOR_BLACK, COLOR_BLUE);
init_pair(48, COLOR_WHITE, COLOR_CYAN);
init_pair(49, COLOR_RED, COLOR_CYAN);
init_pair(50, COLOR_GREEN, COLOR_CYAN);
init_pair(51, COLOR_YELLOW, COLOR_CYAN);
init_pair(52, COLOR_BLUE, COLOR_CYAN);
init_pair(53, COLOR_CYAN, COLOR_CYAN);
init_pair(54, COLOR_MAGENTA, COLOR_CYAN);
init_pair(55, COLOR_BLACK, COLOR_CYAN);
init_pair(56, COLOR_WHITE, COLOR_MAGENTA);
init_pair(57, COLOR_RED, COLOR_MAGENTA);
init_pair(58, COLOR_GREEN, COLOR_MAGENTA);
init_pair(59, COLOR_YELLOW, COLOR_MAGENTA);
init_pair(60, COLOR_BLUE, COLOR_MAGENTA);
init_pair(61, COLOR_CYAN, COLOR_MAGENTA);
init_pair(62, COLOR_MAGENTA, COLOR_MAGENTA);
init_pair(63, COLOR_BLACK, COLOR_MAGENTA);
}
}
|