#ifndef GLUTWIN_H #define GLUTWIN_H #include #include #include // pick something not in GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, etc #define GLUTWIN_SUBMENU (13) class GlutWin; typedef struct WindowPair_s{ GlutWin *glutwin; int glWindowNum; WindowPair_s *next; } WindowPair; class GlutWin { public: /*private*/ static WindowPair *windowList; // A list of all windows open static GlutWin *containerWindow; // The parent of the next window, // we open, -1 = root public: std::string windowTitle; int glWindowNum; int height, width; GlutWin *parentWindow; // -1 at root, else this is subwindow int leftbuttonstate, middlebuttonstate, rightbuttonstate; int keyModifiers; int menuID[3]; // Left,middle,right menus if present long idleInterval; // interval in milliseconds between idle calls long nextIdleTime; // The time we should get our next call public: GlutWin(); virtual ~GlutWin(); void setIdleInterval(int interval); // In milliseconds // Menu handling routines void activateMenu(int whichMenu); void deactivateMenu(int whichMenu); int getMenuID(int whichMenu); int addSubMenu(char *name); // window management virtual void setWindowTitle(char *name); virtual void idle(); virtual void display(); virtual void reshape(int height, int width); virtual void mouse(int button, int state, int x, int y); virtual void keyboard(unsigned char key, int x, int y); virtual void motion(int x, int y); virtual void menu(int whichMenu, int value); }; // Next window constructed is subwindow of default or given window void glutWinSubWindow(GlutWin * winNum = NULL); // Next window constructed is at root level void glutWinMainWindow(); // Private - stubs that figure how to call the right object void glutWinIdle(); void glutWinTimer(int value); GlutWin *getGlutWin(int glWindowNum); void glutWinDisplay(); void glutWinReshape(int height, int width); void glutWinMouse(int button, int state, int x, int y); void glutWinKeyboard(unsigned char key, int x, int y); void glutWinMotion(int x, int y); void glutWinMenu(int value); #endif