1 /*********************************************************** 2 * Copyright (C) 1997, Be Inc. Copyright (C) 1999, Jake Hamby. 3 * 4 * This program is freely distributable without licensing fees 5 * and is provided without guarantee or warrantee expressed or 6 * implied. This program is -not- in the public domain. 7 * 8 * DESCRIPTION: the GlutWindow class saves all events for 9 * handling by main thread 10 ***********************************************************/ 11 12 #include <GL/glut.h> 13 #include <Window.h> 14 #include <GLView.h> 15 16 17 /*! All information needed for windows and 18 subwindows (handled as similarly as possible). 19 */ 20 class GlutWindow : public BGLView { 21 public: 22 GlutWindow(GlutWindow *nparent, const char *name, int x, int y, int width, 23 int height, ulong options); 24 25 virtual void MessageReceived(BMessage *message); 26 void KeyDown(const char *bytes, int32 numBytes); 27 void KeyUp(const char *bytes, int32 numBytes); 28 void MouseDown(BPoint point); 29 void MouseMoved(BPoint point, uint32 transit, const BMessage *message); 30 void FrameResized(float width, float height); 31 void Draw(BRect updateRect); 32 void Pulse(); // needed since MouseUp() is broken 33 void MouseCheck(); // check for button state changes 34 void ErrorCallback(unsigned long errorCode); 35 36 static status_t MenuThread(void *menu); 37 38 int num; // window number returned to user 39 int cursor; // my cursor 40 #define GLUT_MAX_MENUS 3 41 int menu[GLUT_MAX_MENUS]; // my popup menus 42 int m_width, m_height; // the last width and height reported to GLUT 43 uint32 m_buttons; // the last mouse button state 44 45 /* Window relationship state. */ 46 GlutWindow *parent; /* parent window */ 47 GlutWindow *children; /* first child window */ 48 GlutWindow *siblings; /* next sibling */ 49 50 // leave out buttons and dials callbacks that we don't support 51 GLUTdisplayCB display; /* redraw */ 52 GLUTreshapeCB reshape; /* resize (width,height) */ 53 GLUTmouseCB mouse; /* mouse (button,state,x,y) */ 54 GLUTmotionCB motion; /* motion (x,y) */ 55 GLUTpassiveCB passive; /* passive motion (x,y) */ 56 GLUTentryCB entry; /* window entry/exit (state) */ 57 GLUTkeyboardCB keyboard; /* keyboard (ASCII,x,y) */ 58 GLUTkeyboardCB keyboardUp; /* keyboard up (ASCII,x,y) */ 59 GLUTvisibilityCB visibility; /* visibility */ 60 GLUTspecialCB special; /* special key */ 61 GLUTspecialCB specialUp; /* special key up */ 62 GLUTwindowStatusCB windowStatus; /* window status */ 63 64 bool anyevents; // were any events received? 65 bool displayEvent; // call display 66 bool reshapeEvent; // call reshape 67 bool mouseEvent; // call mouse 68 bool motionEvent; // call motion 69 bool passiveEvent; // call passive 70 bool entryEvent; // call entry 71 bool keybEvent; // call keyboard 72 bool keybUpEvent; // call keyboard 73 bool windowStatusEvent; // call visibility 74 bool specialEvent; // call special 75 bool specialUpEvent; // call special 76 bool statusEvent; // menu status changed 77 bool menuEvent; // menu selected 78 79 int button, mouseState; // for mouse callback 80 int mouseX, mouseY; // for mouse callback 81 int motionX, motionY; // for motion callback 82 int passiveX, passiveY; // for passive callback 83 int entryState; // for entry callback 84 unsigned char key; // for keyboard callback 85 int keyX, keyY; // for keyboard callback 86 int visState; // for visibility callback 87 int specialKey; // for special key callback 88 int specialX, specialY; // for special callback 89 int modifierKeys; // modifier key state 90 int menuStatus; // for status callback 91 int statusX, statusY; // for status callback 92 int menuNumber; // for menu and status callbacks 93 int menuValue; // for menu callback 94 bool visible; // for visibility callback 95 bool ignoreKeyRepeat; 96 }; 97 98 /*********************************************************** 99 * CLASS: GlutBWindow 100 * 101 * INHERITS FROM: BDirectWindow 102 * 103 * DESCRIPTION: basically a BWindow that won't quit 104 ***********************************************************/ 105 class GlutBWindow : public BDirectWindow { 106 public: 107 GlutBWindow(BRect frame, const char *name); 108 ~GlutBWindow(); 109 110 void DirectConnected(direct_buffer_info *info); 111 bool QuitRequested(); // exits app 112 void Minimize(bool minimized); // minimized windows are not visible 113 void Hide(); 114 void Show(); 115 GlutWindow *bgl; 116 bool fConnectionDisabled; 117 }; 118