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*/
20class GlutWindow : public BGLView {
21public:
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 ***********************************************************/
105class GlutBWindow : public BDirectWindow {
106public:
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