1 #include <iostream>
2
3 #include "FOX_OSG.h"
4
5 // Map
6 FXDEFMAP(GraphicsWindowFOX) GraphicsWindowFOX_Map[] = {
7 //________Message_Type_________ ___ID___ ________Message_Handler________
8 FXMAPFUNC(SEL_CONFIGURE, 0, GraphicsWindowFOX::onConfigure),
9 FXMAPFUNC(SEL_KEYPRESS, 0, GraphicsWindowFOX::onKeyPress),
10 FXMAPFUNC(SEL_KEYRELEASE, 0, GraphicsWindowFOX::onKeyRelease),
11 FXMAPFUNC(SEL_LEFTBUTTONPRESS, 0, GraphicsWindowFOX::onLeftBtnPress),
12 FXMAPFUNC(SEL_LEFTBUTTONRELEASE, 0, GraphicsWindowFOX::onLeftBtnRelease),
13 FXMAPFUNC(SEL_MIDDLEBUTTONPRESS, 0, GraphicsWindowFOX::onMiddleBtnPress),
14 FXMAPFUNC(SEL_MIDDLEBUTTONRELEASE, 0, GraphicsWindowFOX::onMiddleBtnRelease),
15 FXMAPFUNC(SEL_RIGHTBUTTONPRESS, 0, GraphicsWindowFOX::onRightBtnPress),
16 FXMAPFUNC(SEL_RIGHTBUTTONRELEASE, 0, GraphicsWindowFOX::onRightBtnRelease),
17 FXMAPFUNC(SEL_MOTION, 0, GraphicsWindowFOX::onMotion)
18 };
19
FXIMPLEMENT(GraphicsWindowFOX,FXGLCanvas,GraphicsWindowFOX_Map,ARRAYNUMBER (GraphicsWindowFOX_Map))20 FXIMPLEMENT(GraphicsWindowFOX, FXGLCanvas, GraphicsWindowFOX_Map, ARRAYNUMBER(GraphicsWindowFOX_Map))
21
22 GraphicsWindowFOX::GraphicsWindowFOX(FXComposite *parent, FXGLVisual *vis,
23 FXObject *tgt, FXSelector sel,
24 FXuint opts, FXint x, FXint y,
25 FXint w, FXint h)
26 : FXGLCanvas(parent, vis, tgt, sel, opts, x, y, w, h)
27 {
28 // default cursor to standard
29 _oldCursor = new FXCursor(parent->getApp(),CURSOR_CROSS);
30
31 _traits = new GraphicsContext::Traits;
32 _traits->x = x;
33 _traits->y = y;
34 _traits->width = w;
35 _traits->height = h;
36 _traits->windowDecoration = false;
37 _traits->doubleBuffer = true;
38 _traits->sharedContext = 0;
39
40 init();
41
42 }
43
init()44 void GraphicsWindowFOX::init()
45 {
46 if (valid())
47 {
48 setState( new osg::State );
49 getState()->setGraphicsContext(this);
50
51 if (_traits.valid() && _traits->sharedContext.valid())
52 {
53 getState()->setContextID( _traits->sharedContext->getState()->getContextID() );
54 incrementContextIDUsageCount( getState()->getContextID() );
55 }
56 else
57 {
58 getState()->setContextID( osg::GraphicsContext::createNewContextID() );
59 }
60 }
61 }
62
~GraphicsWindowFOX()63 GraphicsWindowFOX::~GraphicsWindowFOX()
64 {
65 }
66
grabFocus()67 void GraphicsWindowFOX::grabFocus()
68 {
69 // focus this window
70 setFocus();
71 }
72
grabFocusIfPointerInWindow()73 void GraphicsWindowFOX::grabFocusIfPointerInWindow()
74 {
75 // do nothing
76 }
77
useCursor(bool cursorOn)78 void GraphicsWindowFOX::useCursor(bool cursorOn)
79 {
80 if (cursorOn) {
81 // show the old cursor
82 setDefaultCursor(_oldCursor);
83 }
84 else {
85 setDefaultCursor(NULL);
86 }
87 }
88
makeCurrentImplementation()89 bool GraphicsWindowFOX::makeCurrentImplementation()
90 {
91 FXGLCanvas::makeCurrent();
92 return true;
93 }
94
releaseContext()95 bool GraphicsWindowFOX::releaseContext()
96 {
97 FXGLCanvas::makeNonCurrent();
98 return true;
99 }
100
swapBuffersImplementation()101 void GraphicsWindowFOX::swapBuffersImplementation()
102 {
103 FXGLCanvas::swapBuffers();
104 }
105
106
onConfigure(FXObject * sender,FXSelector sel,void * ptr)107 long GraphicsWindowFOX::onConfigure(FXObject *sender, FXSelector sel, void* ptr)
108 {
109 // set GL viewport (not called by FXGLCanvas::onConfigure on all platforms...)
110 // update the window dimensions, in case the window has been resized.
111 getEventQueue()->windowResize(0, 0, getWidth(), getHeight());
112 resized(0, 0, getWidth(), getHeight());
113
114 return FXGLCanvas::onConfigure(sender, sel, ptr);
115 }
116
onKeyPress(FXObject * sender,FXSelector sel,void * ptr)117 long GraphicsWindowFOX::onKeyPress(FXObject *sender, FXSelector sel, void* ptr)
118 {
119 int key = ((FXEvent*)ptr)->code;
120 getEventQueue()->keyPress(key);
121
122 return FXGLCanvas::onKeyPress(sender, sel, ptr);
123 }
124
onKeyRelease(FXObject * sender,FXSelector sel,void * ptr)125 long GraphicsWindowFOX::onKeyRelease(FXObject *sender, FXSelector sel, void* ptr)
126 {
127 int key = ((FXEvent*)ptr)->code;
128 getEventQueue()->keyRelease(key);
129
130 return FXGLCanvas::onKeyRelease(sender, sel, ptr);
131 }
132
onLeftBtnPress(FXObject * sender,FXSelector sel,void * ptr)133 long GraphicsWindowFOX::onLeftBtnPress(FXObject *sender, FXSelector sel, void* ptr)
134 {
135 handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
136
137 FXEvent* event=(FXEvent*)ptr;
138 getEventQueue()->mouseButtonPress(event->click_x, event->click_y, 1);
139
140 return FXGLCanvas::onLeftBtnPress(sender, sel, ptr);
141 }
142
onLeftBtnRelease(FXObject * sender,FXSelector sel,void * ptr)143 long GraphicsWindowFOX::onLeftBtnRelease(FXObject *sender, FXSelector sel, void* ptr)
144 {
145 FXEvent* event=(FXEvent*)ptr;
146 getEventQueue()->mouseButtonRelease(event->click_x, event->click_y, 1);
147
148 return FXGLCanvas::onLeftBtnRelease(sender, sel, ptr);
149 }
150
onMiddleBtnPress(FXObject * sender,FXSelector sel,void * ptr)151 long GraphicsWindowFOX::onMiddleBtnPress(FXObject *sender, FXSelector sel, void* ptr)
152 {
153 handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
154
155 FXEvent* event=(FXEvent*)ptr;
156 getEventQueue()->mouseButtonPress(event->click_x, event->click_y, 2);
157
158 return FXGLCanvas::onMiddleBtnPress(sender, sel, ptr);
159 }
160
onMiddleBtnRelease(FXObject * sender,FXSelector sel,void * ptr)161 long GraphicsWindowFOX::onMiddleBtnRelease(FXObject *sender, FXSelector sel, void* ptr)
162 {
163 FXEvent* event=(FXEvent*)ptr;
164 getEventQueue()->mouseButtonRelease(event->click_x, event->click_y, 2);
165
166 return FXGLCanvas::onMiddleBtnRelease(sender, sel, ptr);
167 }
168
onRightBtnPress(FXObject * sender,FXSelector sel,void * ptr)169 long GraphicsWindowFOX::onRightBtnPress(FXObject *sender, FXSelector sel, void* ptr)
170 {
171 handle(this,FXSEL(SEL_FOCUS_SELF,0),ptr);
172
173 FXEvent* event=(FXEvent*)ptr;
174 getEventQueue()->mouseButtonPress(event->click_x, event->click_y, 3);
175
176 return FXGLCanvas::onRightBtnPress(sender, sel, ptr);
177 }
178
onRightBtnRelease(FXObject * sender,FXSelector sel,void * ptr)179 long GraphicsWindowFOX::onRightBtnRelease(FXObject *sender, FXSelector sel, void* ptr)
180 {
181 FXEvent* event=(FXEvent*)ptr;
182 getEventQueue()->mouseButtonRelease(event->click_x, event->click_y, 3);
183
184 return FXGLCanvas::onRightBtnRelease(sender, sel, ptr);
185 }
186
onMotion(FXObject * sender,FXSelector sel,void * ptr)187 long GraphicsWindowFOX::onMotion(FXObject *sender, FXSelector sel, void* ptr)
188 {
189 FXEvent* event=(FXEvent*)ptr;
190 getEventQueue()->mouseMotion(event->win_x, event->win_y);
191
192 return FXGLCanvas::onMotion(sender, sel, ptr);
193 }
194