// // "$Id: demo.cxx,v 1.4 1998/12/02 15:52:41 mike Exp $" // // Main demo program for the Fast Light Tool Kit (FLTK). // // Copyright 1998 by Bill Spitzak and others. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 // USA. // // Please report all bugs and problems to "fltk-bugs@easysw.com". // #include #include #include #if defined(WIN32) && !defined(CYGNUS) # include //# define chdir _chdir #else # include #endif #include #include #include #include #include /* The form description */ void doexit(Fl_Widget *, void *); void doback(Fl_Widget *, void *); void dobut(Fl_Widget *, long); Fl_Window *form; Fl_Button *but[9]; void create_the_forms() { Fl_Widget *obj; form = new Fl_Window(370, 450); obj = new Fl_Box(FL_FRAME_BOX,20,390,330,40,"Fltk Demonstration"); obj->color(FL_GRAY-4); obj->labelsize(24); obj->labelfont(FL_BOLD); obj->labeltype(FL_ENGRAVED_LABEL); obj = new Fl_Box(FL_FRAME_BOX,20,50,330,330,0); obj->color(FL_GRAY-8); obj = new Fl_Button(130,10,110,30,"Exit"); obj->callback(doexit); obj = new Fl_Button(20,50,330,380); obj->type(FL_HIDDEN_BUTTON); obj->callback(doback); obj = but[0] = new Fl_Button(40,270,90,90); obj = but[1] = new Fl_Button(140,270,90,90); obj = but[2] = new Fl_Button(240,270,90,90); obj = but[5] = new Fl_Button(240,170,90,90); obj = but[4] = new Fl_Button(140,170,90,90); obj = but[3] = new Fl_Button(40,170,90,90); obj = but[6] = new Fl_Button(40,70,90,90); obj = but[7] = new Fl_Button(140,70,90,90); obj = but[8] = new Fl_Button(240,70,90,90); for (int i=0; i<9; i++) { but[i]->align(FL_ALIGN_WRAP); but[i]->callback(dobut, i); } form->forms_end(); } /* Maintaining and building up the menus. */ typedef struct { char name[64]; int numb; char iname[9][64]; char icommand[9][64]; } MENU; #define MAXMENU 32 MENU menus[MAXMENU]; int mennumb = 0; int find_menu(char nnn[]) /* Returns the number of a given menu name. */ { int i; for (i=0; ihide(); for (i=0; ishow(); but[bn]->label(menus[men].iname[i]); // if (menus[men].icommand[i][0] == '@') // but[bn]->color(FL_GRAY-8); // else // but[bn]->color(FL_GRAY); } strcpy(stack[stsize],nnn); stsize++; } void pop_menu() /* Pops a menu */ { if (stsize<=1) return; stsize -= 2; push_menu(stack[stsize]); } /* The callback Routines */ void dobut(Fl_Widget *, long arg) /* handles a button push */ { int men = find_menu(stack[stsize-1]); int n = menus[men].numb; int bn = but2numb( (int) arg, n-1); if (menus[men].icommand[bn][0] == '@') push_menu(menus[men].icommand[bn]); else system(menus[men].icommand[bn]); } void doback(Fl_Widget *, void *) {pop_menu();} void doexit(Fl_Widget *, void *) {exit(0);} int load_the_menu(const char fname[]) /* Loads the menu file. Returns whether successful. */ { FILE *fin; char line[256], mname[64],iname[64],cname[64]; int i,j; fin = fopen(fname,"r"); if (fin == NULL) { // fl_show_message("ERROR","","Cannot read the menu description file."); return 0; } for (;;) { if (fgets(line,256,fin) == NULL) break; j = 0; i = 0; while (line[i] == ' ' || line[i] == '\t') i++; if (line[i] == '\n') continue; if (line[i] == '#') continue; while (line[i] != ':' && line[i] != '\n') mname[j++] = line[i++]; mname[j] = '\0'; if (line[i] == ':') i++; j = 0; while (line[i] != ':' && line[i] != '\n') { if (line[i] == '\\') { i++; if (line[i] == 'n') iname[j++] = '\n'; else iname[j++] = line[i]; i++; } else iname[j++] = line[i++]; } iname[j] = '\0'; if (line[i] == ':') i++; j = 0; while (line[i] != ':' && line[i] != '\n') cname[j++] = line[i++]; cname[j] = '\0'; addto_menu(mname,iname,cname); } fclose(fin); return 1; } int main(int argc, char **argv) { create_the_forms(); char buf[256]; strcpy(buf, argv[0]); filename_setext(buf,".menu"); const char *fname = buf; int i = 0; if (!Fl::args(argc,argv,i) || i < argc-1) Fl::fatal("Usage: %s \n%s",Fl::help); if (i < argc) fname = argv[i]; if (!load_the_menu(fname)) Fl::fatal("Can't open %s",fname); strcpy(buf,fname); const char *c = filename_name(buf); if (c > buf) {buf[c-buf] = 0; chdir(buf);} push_menu("@main"); form->show(argc,argv); Fl::run(); return 0; } // // End of "$Id: demo.cxx,v 1.4 1998/12/02 15:52:41 mike Exp $". //