P
Hallo,
Ich habe vor eine ncurses Applikation für mein Handy(Openmoko NeoFreerunner, kennt vlt der ein oder andere) zu schreiben, und zwar um SMS über meine laptop zu schrieben, aber ich habe noch nie zuvor was groeßeres programmiert und auch noch nie GUI/TUI.
Hab dann mal munter mit ncurses angefangen und ein wenig rumprobiert, und mehr und mehr entwickelte sich das rumspielen zu dem gewuenschten Programm. Doch ich bin mir nicht sicher ob ich das Programm so richtig aufbaue(wie gesagt, noch nie wirklich GUI programmiert) und daher würde ich gerne von erfahrenen Leute ein wenig Feedback bekommen. Hier mal der Code, ich hoffe er ist verständlich, obwohl er eig aus Spielerei hervorging:
#include<ncurses.h>
using namespace std;
// Funktionen um das obere Menue und die untere Infobar zu erstellen
void print_menu(short choice);
void print_info(short bar);
// Funktionen um die Fenster zu erstellen, und in ihren Event-Loop zu gelangen
void win_inbox();
void win_outbox();
void win_options();
void win_msg_del();
// Die Fenster
WINDOW *mainwin;
WINDOW *menu;
WINDOW *info;
WINDOW *msg_del;
int main()
{
initscr();
start_color();
short row,col;
getmaxyx(stdscr,row,col);
//Fenster Posistion und Groesse mittels max-X und max-Y bestimmen
mainwin=newwin(row-2,col,1,0);
wrefresh(mainwin);
menu=newwin(1,col,0,0);
info=newwin(row,col,row-1,0);
msg_del=newwin(6,30,row/2-5,col/2-20);
box(msg_del,0,0);
noecho();
keypad(mainwin,true);
curs_set(0);
win_inbox(); //Kontrolle an win_inbox(das erste Fenster)
endwin();
return 0;
}
void win_inbox()
{
print_menu(0); //Menue fuer inbox erstellen
print_info(0); //Infobar fuer inbox erstellen
wclear(mainwin);
//mit text fuellen
for(short i=1; i<11; i++)
mvwprintw(mainwin,i,1,"<contact>\t<message>\t<time>");
wrefresh(mainwin);
//Event Loop fuer inbox
int c=-1;
while(c!=KEY_RIGHT && c!=113) // falls ein anderes Fenster ausgewaehlt wird oder "q" gedrueckt wird, beenden
{
c=wgetch(mainwin);
switch(c)
{
case KEY_RIGHT:
break;
case 107:
case KEY_UP:
//up
break;
case 106:
case KEY_DOWN:
//down
break;
case 113:
//quit
break;
//case KEY ...
}
//falls rechts gedrueckt wurde, zum naechsten fenster, sonst beenden
if(c==KEY_RIGHT)
win_outbox();
}
void win_outbox()
{
//aehnlich wie win_inbox()
}
void win_options()
{
// aehnlich wie win_inbox()
}
void win_msg_del()
{
mvwprintw(msg_del,2,5,"Delete this Message?");
mvwprintw(msg_del,4,5,"[y]es\t[n]o");
wrefresh(msg_del);
}
void print_menu(short choice) //menue ausgeben und gegebenes element markieren
{
init_pair(1,COLOR_WHITE,COLOR_BLUE);
init_pair(2,COLOR_YELLOW,COLOR_BLUE);
if(choice==0)
{
wattron(menu,COLOR_PAIR(2)|A_BOLD);
mvwprintw(menu,0,0," INBOX ");
wattroff(menu,COLOR_PAIR(2)|A_BOLD);
wattron(menu,COLOR_PAIR(1));
mvwprintw(menu,0,10," OUTBOX ");
wattroff(menu,COLOR_PAIR(1));
wattron(menu,COLOR_PAIR(1));
mvwprintw(menu,0,21," OPTIONS ");
wattroff(menu,COLOR_PAIR(1));
}
else if(choice==1)
//...
wrefresh(menu);
}
void print_info(short bar) //infobar fuer uebergebenes fenster erstellen
{
char *infos[4]={ "[a]nswer; [d]elete; [r]ead; [f]orward; [n]ew; next [u]nread; [q]uit;",
"[r]ead; [f]orward; [d]elete; [q]uit;",
"[s]ave; [c]ancel; [q]uit;"
""}; //inbox //outbox //options //leer
wclear(info);
mvwprintw(info,0,0,infos[bar]);
wrefresh(info);
}
Ich weiß zb nicht ob es klug war, für jedes der Fenster(Inbox, Outbox und Options) einen eigenen Event-loop zu erstellen. Ob man das highlighten im oberen Menü noch leichter machen könnte, sei dahingestellt
Danke schonmal für eure Hilfe
mfg peel