Mercurial > sdl-ios-xcode
comparison src/video/bwindow/SDL_BWin.h @ 1662:782fd950bd46 SDL-1.3
Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API.
WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid.
The code is now run through a consistent indent format:
indent -i4 -nut -nsc -br -ce
The headers are being converted to automatically generate doxygen documentation.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 28 May 2006 13:04:16 +0000 |
parents | e49147870aac |
children | 4da1ee79c9af |
comparison
equal
deleted
inserted
replaced
1661:281d3f4870e5 | 1662:782fd950bd46 |
---|---|
36 | 36 |
37 #include "../../main/beos/SDL_BeApp.h" | 37 #include "../../main/beos/SDL_BeApp.h" |
38 #include "SDL_events.h" | 38 #include "SDL_events.h" |
39 #include "SDL_BView.h" | 39 #include "SDL_BView.h" |
40 | 40 |
41 extern "C" { | 41 extern "C" |
42 { | |
42 #include "../../events/SDL_events_c.h" | 43 #include "../../events/SDL_events_c.h" |
43 }; | 44 }; |
44 | 45 |
45 class SDL_BWin : public BDirectWindow | 46 class SDL_BWin:public BDirectWindow |
46 { | 47 { |
47 public: | 48 public: |
48 SDL_BWin(BRect bounds) : | 49 SDL_BWin (BRect bounds):BDirectWindow (bounds, "Untitled", |
49 BDirectWindow(bounds, "Untitled", B_TITLED_WINDOW, 0) { | 50 B_TITLED_WINDOW, 0) |
50 InitKeyboard(); | 51 { |
51 last_buttons = 0; | 52 InitKeyboard (); |
52 | 53 last_buttons = 0; |
53 the_view = NULL; | 54 |
54 #if SDL_VIDEO_OPENGL | 55 the_view = NULL; |
55 SDL_GLView = NULL; | 56 #if SDL_VIDEO_OPENGL |
56 #endif | 57 SDL_GLView = NULL; |
57 SDL_View = NULL; | 58 #endif |
58 Unlock(); | 59 SDL_View = NULL; |
59 shown = false; | 60 Unlock (); |
60 inhibit_resize = false; | 61 shown = false; |
61 } | 62 inhibit_resize = false; |
62 | 63 } |
63 virtual ~SDL_BWin() { | 64 |
64 Lock(); | 65 virtual ~ SDL_BWin () |
65 if ( the_view ) { | 66 { |
66 #if SDL_VIDEO_OPENGL | 67 Lock (); |
67 if ( the_view == SDL_GLView ) { | 68 if (the_view) { |
68 SDL_GLView->UnlockGL(); | 69 #if SDL_VIDEO_OPENGL |
69 } | 70 if (the_view == SDL_GLView) { |
70 #endif | 71 SDL_GLView->UnlockGL (); |
71 RemoveChild(the_view); | 72 } |
72 the_view = NULL; | 73 #endif |
73 } | 74 RemoveChild (the_view); |
74 Unlock(); | 75 the_view = NULL; |
75 #if SDL_VIDEO_OPENGL | 76 } |
76 if ( SDL_GLView ) { | 77 Unlock (); |
77 delete SDL_GLView; | 78 #if SDL_VIDEO_OPENGL |
78 } | 79 if (SDL_GLView) { |
79 #endif | 80 delete SDL_GLView; |
80 if ( SDL_View ) { | 81 } |
81 delete SDL_View; | 82 #endif |
82 } | 83 if (SDL_View) { |
83 } | 84 delete SDL_View; |
84 | 85 } |
85 virtual void InitKeyboard(void) { | 86 } |
86 for ( uint i=0; i<SDL_TABLESIZE(keymap); ++i ) | 87 |
87 keymap[i] = SDLK_UNKNOWN; | 88 virtual void InitKeyboard (void) |
88 | 89 { |
89 keymap[0x01] = SDLK_ESCAPE; | 90 for (uint i = 0; i < SDL_TABLESIZE (keymap); ++i) |
90 keymap[B_F1_KEY] = SDLK_F1; | 91 keymap[i] = SDLK_UNKNOWN; |
91 keymap[B_F2_KEY] = SDLK_F2; | 92 |
92 keymap[B_F3_KEY] = SDLK_F3; | 93 keymap[0x01] = SDLK_ESCAPE; |
93 keymap[B_F4_KEY] = SDLK_F4; | 94 keymap[B_F1_KEY] = SDLK_F1; |
94 keymap[B_F5_KEY] = SDLK_F5; | 95 keymap[B_F2_KEY] = SDLK_F2; |
95 keymap[B_F6_KEY] = SDLK_F6; | 96 keymap[B_F3_KEY] = SDLK_F3; |
96 keymap[B_F7_KEY] = SDLK_F7; | 97 keymap[B_F4_KEY] = SDLK_F4; |
97 keymap[B_F8_KEY] = SDLK_F8; | 98 keymap[B_F5_KEY] = SDLK_F5; |
98 keymap[B_F9_KEY] = SDLK_F9; | 99 keymap[B_F6_KEY] = SDLK_F6; |
99 keymap[B_F10_KEY] = SDLK_F10; | 100 keymap[B_F7_KEY] = SDLK_F7; |
100 keymap[B_F11_KEY] = SDLK_F11; | 101 keymap[B_F8_KEY] = SDLK_F8; |
101 keymap[B_F12_KEY] = SDLK_F12; | 102 keymap[B_F9_KEY] = SDLK_F9; |
102 keymap[B_PRINT_KEY] = SDLK_PRINT; | 103 keymap[B_F10_KEY] = SDLK_F10; |
103 keymap[B_SCROLL_KEY] = SDLK_SCROLLOCK; | 104 keymap[B_F11_KEY] = SDLK_F11; |
104 keymap[B_PAUSE_KEY] = SDLK_PAUSE; | 105 keymap[B_F12_KEY] = SDLK_F12; |
105 keymap[0x11] = SDLK_BACKQUOTE; | 106 keymap[B_PRINT_KEY] = SDLK_PRINT; |
106 keymap[0x12] = SDLK_1; | 107 keymap[B_SCROLL_KEY] = SDLK_SCROLLOCK; |
107 keymap[0x13] = SDLK_2; | 108 keymap[B_PAUSE_KEY] = SDLK_PAUSE; |
108 keymap[0x14] = SDLK_3; | 109 keymap[0x11] = SDLK_BACKQUOTE; |
109 keymap[0x15] = SDLK_4; | 110 keymap[0x12] = SDLK_1; |
110 keymap[0x16] = SDLK_5; | 111 keymap[0x13] = SDLK_2; |
111 keymap[0x17] = SDLK_6; | 112 keymap[0x14] = SDLK_3; |
112 keymap[0x18] = SDLK_7; | 113 keymap[0x15] = SDLK_4; |
113 keymap[0x19] = SDLK_8; | 114 keymap[0x16] = SDLK_5; |
114 keymap[0x1a] = SDLK_9; | 115 keymap[0x17] = SDLK_6; |
115 keymap[0x1b] = SDLK_0; | 116 keymap[0x18] = SDLK_7; |
116 keymap[0x1c] = SDLK_MINUS; | 117 keymap[0x19] = SDLK_8; |
117 keymap[0x1d] = SDLK_EQUALS; | 118 keymap[0x1a] = SDLK_9; |
118 keymap[0x1e] = SDLK_BACKSPACE; | 119 keymap[0x1b] = SDLK_0; |
119 keymap[0x1f] = SDLK_INSERT; | 120 keymap[0x1c] = SDLK_MINUS; |
120 keymap[0x20] = SDLK_HOME; | 121 keymap[0x1d] = SDLK_EQUALS; |
121 keymap[0x21] = SDLK_PAGEUP; | 122 keymap[0x1e] = SDLK_BACKSPACE; |
122 keymap[0x22] = SDLK_NUMLOCK; | 123 keymap[0x1f] = SDLK_INSERT; |
123 keymap[0x23] = SDLK_KP_DIVIDE; | 124 keymap[0x20] = SDLK_HOME; |
124 keymap[0x24] = SDLK_KP_MULTIPLY; | 125 keymap[0x21] = SDLK_PAGEUP; |
125 keymap[0x25] = SDLK_KP_MINUS; | 126 keymap[0x22] = SDLK_NUMLOCK; |
126 keymap[0x26] = SDLK_TAB; | 127 keymap[0x23] = SDLK_KP_DIVIDE; |
127 keymap[0x27] = SDLK_q; | 128 keymap[0x24] = SDLK_KP_MULTIPLY; |
128 keymap[0x28] = SDLK_w; | 129 keymap[0x25] = SDLK_KP_MINUS; |
129 keymap[0x29] = SDLK_e; | 130 keymap[0x26] = SDLK_TAB; |
130 keymap[0x2a] = SDLK_r; | 131 keymap[0x27] = SDLK_q; |
131 keymap[0x2b] = SDLK_t; | 132 keymap[0x28] = SDLK_w; |
132 keymap[0x2c] = SDLK_y; | 133 keymap[0x29] = SDLK_e; |
133 keymap[0x2d] = SDLK_u; | 134 keymap[0x2a] = SDLK_r; |
134 keymap[0x2e] = SDLK_i; | 135 keymap[0x2b] = SDLK_t; |
135 keymap[0x2f] = SDLK_o; | 136 keymap[0x2c] = SDLK_y; |
136 keymap[0x30] = SDLK_p; | 137 keymap[0x2d] = SDLK_u; |
137 keymap[0x31] = SDLK_LEFTBRACKET; | 138 keymap[0x2e] = SDLK_i; |
138 keymap[0x32] = SDLK_RIGHTBRACKET; | 139 keymap[0x2f] = SDLK_o; |
139 keymap[0x33] = SDLK_BACKSLASH; | 140 keymap[0x30] = SDLK_p; |
140 keymap[0x34] = SDLK_DELETE; | 141 keymap[0x31] = SDLK_LEFTBRACKET; |
141 keymap[0x35] = SDLK_END; | 142 keymap[0x32] = SDLK_RIGHTBRACKET; |
142 keymap[0x36] = SDLK_PAGEDOWN; | 143 keymap[0x33] = SDLK_BACKSLASH; |
143 keymap[0x37] = SDLK_KP7; | 144 keymap[0x34] = SDLK_DELETE; |
144 keymap[0x38] = SDLK_KP8; | 145 keymap[0x35] = SDLK_END; |
145 keymap[0x39] = SDLK_KP9; | 146 keymap[0x36] = SDLK_PAGEDOWN; |
146 keymap[0x3a] = SDLK_KP_PLUS; | 147 keymap[0x37] = SDLK_KP7; |
147 keymap[0x3b] = SDLK_CAPSLOCK; | 148 keymap[0x38] = SDLK_KP8; |
148 keymap[0x3c] = SDLK_a; | 149 keymap[0x39] = SDLK_KP9; |
149 keymap[0x3d] = SDLK_s; | 150 keymap[0x3a] = SDLK_KP_PLUS; |
150 keymap[0x3e] = SDLK_d; | 151 keymap[0x3b] = SDLK_CAPSLOCK; |
151 keymap[0x3f] = SDLK_f; | 152 keymap[0x3c] = SDLK_a; |
152 keymap[0x40] = SDLK_g; | 153 keymap[0x3d] = SDLK_s; |
153 keymap[0x41] = SDLK_h; | 154 keymap[0x3e] = SDLK_d; |
154 keymap[0x42] = SDLK_j; | 155 keymap[0x3f] = SDLK_f; |
155 keymap[0x43] = SDLK_k; | 156 keymap[0x40] = SDLK_g; |
156 keymap[0x44] = SDLK_l; | 157 keymap[0x41] = SDLK_h; |
157 keymap[0x45] = SDLK_SEMICOLON; | 158 keymap[0x42] = SDLK_j; |
158 keymap[0x46] = SDLK_QUOTE; | 159 keymap[0x43] = SDLK_k; |
159 keymap[0x47] = SDLK_RETURN; | 160 keymap[0x44] = SDLK_l; |
160 keymap[0x48] = SDLK_KP4; | 161 keymap[0x45] = SDLK_SEMICOLON; |
161 keymap[0x49] = SDLK_KP5; | 162 keymap[0x46] = SDLK_QUOTE; |
162 keymap[0x4a] = SDLK_KP6; | 163 keymap[0x47] = SDLK_RETURN; |
163 keymap[0x4b] = SDLK_LSHIFT; | 164 keymap[0x48] = SDLK_KP4; |
164 keymap[0x4c] = SDLK_z; | 165 keymap[0x49] = SDLK_KP5; |
165 keymap[0x4d] = SDLK_x; | 166 keymap[0x4a] = SDLK_KP6; |
166 keymap[0x4e] = SDLK_c; | 167 keymap[0x4b] = SDLK_LSHIFT; |
167 keymap[0x4f] = SDLK_v; | 168 keymap[0x4c] = SDLK_z; |
168 keymap[0x50] = SDLK_b; | 169 keymap[0x4d] = SDLK_x; |
169 keymap[0x51] = SDLK_n; | 170 keymap[0x4e] = SDLK_c; |
170 keymap[0x52] = SDLK_m; | 171 keymap[0x4f] = SDLK_v; |
171 keymap[0x53] = SDLK_COMMA; | 172 keymap[0x50] = SDLK_b; |
172 keymap[0x54] = SDLK_PERIOD; | 173 keymap[0x51] = SDLK_n; |
173 keymap[0x55] = SDLK_SLASH; | 174 keymap[0x52] = SDLK_m; |
174 keymap[0x56] = SDLK_RSHIFT; | 175 keymap[0x53] = SDLK_COMMA; |
175 keymap[0x57] = SDLK_UP; | 176 keymap[0x54] = SDLK_PERIOD; |
176 keymap[0x58] = SDLK_KP1; | 177 keymap[0x55] = SDLK_SLASH; |
177 keymap[0x59] = SDLK_KP2; | 178 keymap[0x56] = SDLK_RSHIFT; |
178 keymap[0x5a] = SDLK_KP3; | 179 keymap[0x57] = SDLK_UP; |
179 keymap[0x5b] = SDLK_KP_ENTER; | 180 keymap[0x58] = SDLK_KP1; |
180 keymap[0x5c] = SDLK_LCTRL; | 181 keymap[0x59] = SDLK_KP2; |
181 keymap[0x5d] = SDLK_LALT; | 182 keymap[0x5a] = SDLK_KP3; |
182 keymap[0x5e] = SDLK_SPACE; | 183 keymap[0x5b] = SDLK_KP_ENTER; |
183 keymap[0x5f] = SDLK_RALT; | 184 keymap[0x5c] = SDLK_LCTRL; |
184 keymap[0x60] = SDLK_RCTRL; | 185 keymap[0x5d] = SDLK_LALT; |
185 keymap[0x61] = SDLK_LEFT; | 186 keymap[0x5e] = SDLK_SPACE; |
186 keymap[0x62] = SDLK_DOWN; | 187 keymap[0x5f] = SDLK_RALT; |
187 keymap[0x63] = SDLK_RIGHT; | 188 keymap[0x60] = SDLK_RCTRL; |
188 keymap[0x64] = SDLK_KP0; | 189 keymap[0x61] = SDLK_LEFT; |
189 keymap[0x65] = SDLK_KP_PERIOD; | 190 keymap[0x62] = SDLK_DOWN; |
190 keymap[0x66] = SDLK_LMETA; | 191 keymap[0x63] = SDLK_RIGHT; |
191 keymap[0x67] = SDLK_RMETA; | 192 keymap[0x64] = SDLK_KP0; |
192 keymap[0x68] = SDLK_MENU; | 193 keymap[0x65] = SDLK_KP_PERIOD; |
193 keymap[0x69] = SDLK_EURO; | 194 keymap[0x66] = SDLK_LMETA; |
194 keymap[0x6a] = SDLK_KP_EQUALS; | 195 keymap[0x67] = SDLK_RMETA; |
195 keymap[0x6b] = SDLK_POWER; | 196 keymap[0x68] = SDLK_MENU; |
196 } | 197 keymap[0x69] = SDLK_EURO; |
197 | 198 keymap[0x6a] = SDLK_KP_EQUALS; |
198 /* Override the Show() method so we can tell when we've been shown */ | 199 keymap[0x6b] = SDLK_POWER; |
199 virtual void Show(void) { | 200 } |
200 BWindow::Show(); | 201 |
201 shown = true; | 202 /* Override the Show() method so we can tell when we've been shown */ |
202 } | 203 virtual void Show (void) |
203 virtual bool Shown(void) { | 204 { |
204 return (shown); | 205 BWindow::Show (); |
205 } | 206 shown = true; |
206 /* If called, the next resize event will not be forwarded to SDL. */ | 207 } |
207 virtual void InhibitResize(void) { | 208 virtual bool Shown (void) |
208 inhibit_resize=true; | 209 { |
209 } | 210 return (shown); |
210 /* Handle resizing of the window */ | 211 } |
211 virtual void FrameResized(float width, float height) { | 212 /* If called, the next resize event will not be forwarded to SDL. */ |
212 if(inhibit_resize) | 213 virtual void InhibitResize (void) |
213 inhibit_resize = false; | 214 { |
214 else | 215 inhibit_resize = true; |
215 SDL_PrivateResize((int)width, (int)height); | 216 } |
216 } | 217 /* Handle resizing of the window */ |
217 virtual int CreateView(Uint32 flags, Uint32 gl_flags) { | 218 virtual void FrameResized (float width, float height) |
218 int retval; | 219 { |
219 | 220 if (inhibit_resize) |
220 retval = 0; | 221 inhibit_resize = false; |
221 Lock(); | 222 else |
222 if ( flags & SDL_INTERNALOPENGL ) { | 223 SDL_PrivateResize ((int) width, (int) height); |
223 #if SDL_VIDEO_OPENGL | 224 } |
224 if ( SDL_GLView == NULL ) { | 225 virtual int CreateView (Uint32 flags, Uint32 gl_flags) |
225 SDL_GLView = new BGLView(Bounds(), "SDL GLView", | 226 { |
226 B_FOLLOW_ALL_SIDES, (B_WILL_DRAW|B_FRAME_EVENTS), | 227 int retval; |
227 gl_flags); | 228 |
228 } | 229 retval = 0; |
229 if ( the_view != SDL_GLView ) { | 230 Lock (); |
230 if ( the_view ) { | 231 if (flags & SDL_INTERNALOPENGL) { |
231 RemoveChild(the_view); | 232 #if SDL_VIDEO_OPENGL |
232 } | 233 if (SDL_GLView == NULL) { |
233 AddChild(SDL_GLView); | 234 SDL_GLView = new BGLView (Bounds (), "SDL GLView", |
234 SDL_GLView->LockGL(); | 235 B_FOLLOW_ALL_SIDES, |
235 the_view = SDL_GLView; | 236 (B_WILL_DRAW | B_FRAME_EVENTS), |
236 } | 237 gl_flags); |
238 } | |
239 if (the_view != SDL_GLView) { | |
240 if (the_view) { | |
241 RemoveChild (the_view); | |
242 } | |
243 AddChild (SDL_GLView); | |
244 SDL_GLView->LockGL (); | |
245 the_view = SDL_GLView; | |
246 } | |
237 #else | 247 #else |
238 SDL_SetError("OpenGL support not enabled"); | 248 SDL_SetError ("OpenGL support not enabled"); |
239 retval = -1; | 249 retval = -1; |
240 #endif | 250 #endif |
241 } else { | 251 } else { |
242 if ( SDL_View == NULL ) { | 252 if (SDL_View == NULL) { |
243 SDL_View = new SDL_BView(Bounds()); | 253 SDL_View = new SDL_BView (Bounds ()); |
244 } | 254 } |
245 if ( the_view != SDL_View ) { | 255 if (the_view != SDL_View) { |
246 if ( the_view ) { | 256 if (the_view) { |
247 #if SDL_VIDEO_OPENGL | 257 #if SDL_VIDEO_OPENGL |
248 if ( the_view == SDL_GLView ) { | 258 if (the_view == SDL_GLView) { |
249 SDL_GLView->UnlockGL(); | 259 SDL_GLView->UnlockGL (); |
250 } | 260 } |
251 #endif | 261 #endif |
252 RemoveChild(the_view); | 262 RemoveChild (the_view); |
253 } | 263 } |
254 AddChild(SDL_View); | 264 AddChild (SDL_View); |
255 the_view = SDL_View; | 265 the_view = SDL_View; |
256 } | 266 } |
257 } | 267 } |
258 Unlock(); | 268 Unlock (); |
259 return(retval); | 269 return (retval); |
260 } | 270 } |
261 virtual void SetBitmap(BBitmap *bitmap) { | 271 virtual void SetBitmap (BBitmap * bitmap) |
262 SDL_View->SetBitmap(bitmap); | 272 { |
263 } | 273 SDL_View->SetBitmap (bitmap); |
264 virtual void SetXYOffset(int x, int y) { | 274 } |
265 #if SDL_VIDEO_OPENGL | 275 virtual void SetXYOffset (int x, int y) |
266 if ( the_view == SDL_GLView ) { | 276 { |
267 return; | 277 #if SDL_VIDEO_OPENGL |
268 } | 278 if (the_view == SDL_GLView) { |
269 #endif | 279 return; |
270 SDL_View->SetXYOffset(x, y); | 280 } |
271 } | 281 #endif |
272 virtual void GetXYOffset(int &x, int &y) { | 282 SDL_View->SetXYOffset (x, y); |
273 #if SDL_VIDEO_OPENGL | 283 } |
274 if ( the_view == SDL_GLView ) { | 284 virtual void GetXYOffset (int &x, int &y) |
275 x = 0; | 285 { |
276 y = 0; | 286 #if SDL_VIDEO_OPENGL |
277 return; | 287 if (the_view == SDL_GLView) { |
278 } | 288 x = 0; |
279 #endif | 289 y = 0; |
280 SDL_View->GetXYOffset(x, y); | 290 return; |
281 } | 291 } |
282 virtual bool BeginDraw(void) { | 292 #endif |
283 return(Lock()); | 293 SDL_View->GetXYOffset (x, y); |
284 } | 294 } |
285 virtual void DrawAsync(BRect updateRect) { | 295 virtual bool BeginDraw (void) |
286 SDL_View->DrawAsync(updateRect); | 296 { |
287 } | 297 return (Lock ()); |
288 virtual void EndDraw(void) { | 298 } |
289 SDL_View->Sync(); | 299 virtual void DrawAsync (BRect updateRect) |
290 Unlock(); | 300 { |
291 } | 301 SDL_View->DrawAsync (updateRect); |
292 #if SDL_VIDEO_OPENGL | 302 } |
293 virtual void SwapBuffers(void) { | 303 virtual void EndDraw (void) |
294 SDL_GLView->UnlockGL(); | 304 { |
295 SDL_GLView->LockGL(); | 305 SDL_View->Sync (); |
296 SDL_GLView->SwapBuffers(); | 306 Unlock (); |
297 } | 307 } |
298 #endif | 308 #if SDL_VIDEO_OPENGL |
299 virtual BView *View(void) { | 309 virtual void SwapBuffers (void) |
300 return(the_view); | 310 { |
301 } | 311 SDL_GLView->UnlockGL (); |
302 | 312 SDL_GLView->LockGL (); |
303 /* Hook functions -- overridden */ | 313 SDL_GLView->SwapBuffers (); |
304 virtual void Minimize(bool minimize) { | 314 } |
305 /* This is only called when mimimized, not when restored */ | 315 #endif |
306 //SDL_PrivateAppActive(minimize, SDL_APPACTIVE); | 316 virtual BView *View (void) |
307 BWindow::Minimize(minimize); | 317 { |
308 } | 318 return (the_view); |
309 virtual void WindowActivated(bool active) { | 319 } |
310 SDL_PrivateAppActive(active, SDL_APPINPUTFOCUS); | 320 |
311 } | 321 /* Hook functions -- overridden */ |
312 virtual bool QuitRequested(void) { | 322 virtual void Minimize (bool minimize) |
313 if ( SDL_BeAppActive > 0 ) { | 323 { |
314 SDL_PrivateQuit(); | 324 /* This is only called when mimimized, not when restored */ |
315 /* We don't ever actually close the window here because | 325 //SDL_PrivateAppActive(minimize, SDL_APPACTIVE); |
316 the application should respond to the quit request, | 326 BWindow::Minimize (minimize); |
317 or ignore it as desired. | 327 } |
318 */ | 328 virtual void WindowActivated (bool active) |
319 return(false); | 329 { |
320 } | 330 SDL_PrivateAppActive (active, SDL_APPINPUTFOCUS); |
321 return(true); /* Close the app window */ | 331 } |
322 } | 332 virtual bool QuitRequested (void) |
323 virtual void Quit() { | 333 { |
324 if (!IsLocked()) | 334 if (SDL_BeAppActive > 0) { |
325 Lock(); | 335 SDL_PrivateQuit (); |
326 BDirectWindow::Quit(); | 336 /* We don't ever actually close the window here because |
327 } | 337 the application should respond to the quit request, |
328 | 338 or ignore it as desired. |
329 virtual int16 Translate2Unicode(const char *buf) { | 339 */ |
330 int32 state, srclen, dstlen; | 340 return (false); |
331 unsigned char destbuf[2]; | 341 } |
332 Uint16 unicode = 0; | 342 return (true); /* Close the app window */ |
333 | 343 } |
334 if ((uchar)buf[0] > 127) { | 344 virtual void Quit () |
335 state = 0; | 345 { |
336 srclen = SDL_strlen(buf); | 346 if (!IsLocked ()) |
337 dstlen = sizeof(destbuf); | 347 Lock (); |
338 convert_from_utf8(B_UNICODE_CONVERSION, buf, &srclen, (char *)destbuf, &dstlen, &state); | 348 BDirectWindow::Quit (); |
339 unicode = destbuf[0]; | 349 } |
340 unicode <<= 8; | 350 |
341 unicode |= destbuf[1]; | 351 virtual int16 Translate2Unicode (const char *buf) |
342 } else | 352 { |
343 unicode = buf[0]; | 353 int32 state, srclen, dstlen; |
344 | 354 unsigned char destbuf[2]; |
345 /* For some reason function keys map to control characters */ | 355 Uint16 unicode = 0; |
356 | |
357 if ((uchar) buf[0] > 127) { | |
358 state = 0; | |
359 srclen = SDL_strlen (buf); | |
360 dstlen = sizeof (destbuf); | |
361 convert_from_utf8 (B_UNICODE_CONVERSION, buf, &srclen, | |
362 (char *) destbuf, &dstlen, &state); | |
363 unicode = destbuf[0]; | |
364 unicode <<= 8; | |
365 unicode |= destbuf[1]; | |
366 } else | |
367 unicode = buf[0]; | |
368 | |
369 /* For some reason function keys map to control characters */ | |
346 # define CTRL(X) ((X)-'@') | 370 # define CTRL(X) ((X)-'@') |
347 switch (unicode) { | 371 switch (unicode) { |
348 case CTRL('A'): | 372 case CTRL ('A'): |
349 case CTRL('B'): | 373 case CTRL ('B'): |
350 case CTRL('C'): | 374 case CTRL ('C'): |
351 case CTRL('D'): | 375 case CTRL ('D'): |
352 case CTRL('E'): | 376 case CTRL ('E'): |
353 case CTRL('K'): | 377 case CTRL ('K'): |
354 case CTRL('L'): | 378 case CTRL ('L'): |
355 case CTRL('P'): | 379 case CTRL ('P'): |
356 if ( ! (SDL_GetModState() & KMOD_CTRL) ) | 380 if (!(SDL_GetModState () & KMOD_CTRL)) |
357 unicode = 0; | 381 unicode = 0; |
358 break; | 382 break; |
359 /* Keyboard input maps newline to carriage return */ | 383 /* Keyboard input maps newline to carriage return */ |
360 case '\n': | 384 case '\n': |
361 unicode = '\r'; | 385 unicode = '\r'; |
362 break; | 386 break; |
363 default: | 387 default: |
364 break; | 388 break; |
365 } | 389 } |
366 | 390 |
367 return unicode; | 391 return unicode; |
368 } | 392 } |
369 | 393 |
370 virtual void DispatchMessage(BMessage *msg, BHandler *target) { | 394 virtual void DispatchMessage (BMessage * msg, BHandler * target) |
371 switch (msg->what) { | 395 { |
372 case B_MOUSE_MOVED: | 396 switch (msg->what) { |
373 { | 397 case B_MOUSE_MOVED: |
374 BPoint where; | 398 { |
375 int32 transit; | 399 BPoint where; |
376 if (msg->FindPoint("where", &where) == B_OK && msg->FindInt32("be:transit", &transit) == B_OK) { | 400 int32 transit; |
377 if (transit == B_EXITED_VIEW) { | 401 if (msg->FindPoint ("where", &where) == B_OK |
378 if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { | 402 && msg->FindInt32 ("be:transit", &transit) == B_OK) { |
379 SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); | 403 if (transit == B_EXITED_VIEW) { |
380 be_app->SetCursor(B_HAND_CURSOR); | 404 if (SDL_GetAppState () & SDL_APPMOUSEFOCUS) { |
381 } | 405 SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); |
382 } else { | 406 be_app->SetCursor (B_HAND_CURSOR); |
383 int x, y; | 407 } |
384 if ( ! (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { | 408 } else { |
385 SDL_PrivateAppActive(1, SDL_APPMOUSEFOCUS); | 409 int x, y; |
386 SDL_SetCursor(NULL); | 410 if (!(SDL_GetAppState () & SDL_APPMOUSEFOCUS)) { |
387 } | 411 SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); |
388 GetXYOffset(x, y); | 412 SDL_SetCursor (NULL); |
389 x = (int)where.x - x; | 413 } |
390 y = (int)where.y - y; | 414 GetXYOffset (x, y); |
391 SDL_PrivateMouseMotion(0, 0, x, y); | 415 x = (int) where.x - x; |
392 } | 416 y = (int) where.y - y; |
393 } | 417 SDL_PrivateMouseMotion (0, 0, x, y); |
394 break; | 418 } |
395 } | 419 } |
396 | 420 break; |
397 case B_MOUSE_DOWN: | 421 } |
398 { | 422 |
399 /* it looks like mouse down is send only for first clicked | 423 case B_MOUSE_DOWN: |
400 button, each next is not send while last one is holded */ | 424 { |
401 int32 buttons; | 425 /* it looks like mouse down is send only for first clicked |
402 int sdl_buttons = 0; | 426 button, each next is not send while last one is holded */ |
403 if (msg->FindInt32("buttons", &buttons) == B_OK) { | 427 int32 buttons; |
404 /* Add any mouse button events */ | 428 int sdl_buttons = 0; |
405 if (buttons & B_PRIMARY_MOUSE_BUTTON) { | 429 if (msg->FindInt32 ("buttons", &buttons) == B_OK) { |
406 sdl_buttons |= SDL_BUTTON_LEFT; | 430 /* Add any mouse button events */ |
407 } | 431 if (buttons & B_PRIMARY_MOUSE_BUTTON) { |
408 if (buttons & B_SECONDARY_MOUSE_BUTTON) { | 432 sdl_buttons |= SDL_BUTTON_LEFT; |
409 sdl_buttons |= SDL_BUTTON_RIGHT; | 433 } |
410 } | 434 if (buttons & B_SECONDARY_MOUSE_BUTTON) { |
411 if (buttons & B_TERTIARY_MOUSE_BUTTON) { | 435 sdl_buttons |= SDL_BUTTON_RIGHT; |
412 sdl_buttons |= SDL_BUTTON_MIDDLE; | 436 } |
413 } | 437 if (buttons & B_TERTIARY_MOUSE_BUTTON) { |
414 SDL_PrivateMouseButton(SDL_PRESSED, sdl_buttons, 0, 0); | 438 sdl_buttons |= SDL_BUTTON_MIDDLE; |
415 | 439 } |
416 last_buttons = buttons; | 440 SDL_PrivateMouseButton (SDL_PRESSED, sdl_buttons, 0, 0); |
417 } | 441 |
418 break; | 442 last_buttons = buttons; |
419 } | 443 } |
420 | 444 break; |
421 case B_MOUSE_UP: | 445 } |
422 { | 446 |
423 /* mouse up doesn't give which button was released, | 447 case B_MOUSE_UP: |
424 only state of buttons (after release, so it's always = 0), | 448 { |
425 which is not what we need ;] | 449 /* mouse up doesn't give which button was released, |
426 So we need to store button in mouse down, and restore | 450 only state of buttons (after release, so it's always = 0), |
427 in mouse up :( | 451 which is not what we need ;] |
428 mouse up is (similarly to mouse down) send only for | 452 So we need to store button in mouse down, and restore |
429 first button down (ie. it's no send if we click another button | 453 in mouse up :( |
430 without releasing previous one first) - but that's probably | 454 mouse up is (similarly to mouse down) send only for |
431 because of how drivers are written?, not BeOS itself. */ | 455 first button down (ie. it's no send if we click another button |
432 int32 buttons; | 456 without releasing previous one first) - but that's probably |
433 int sdl_buttons = 0; | 457 because of how drivers are written?, not BeOS itself. */ |
434 if (msg->FindInt32("buttons", &buttons) == B_OK) { | 458 int32 buttons; |
435 /* Add any mouse button events */ | 459 int sdl_buttons = 0; |
436 if ((buttons ^ B_PRIMARY_MOUSE_BUTTON) & last_buttons) { | 460 if (msg->FindInt32 ("buttons", &buttons) == B_OK) { |
437 sdl_buttons |= SDL_BUTTON_LEFT; | 461 /* Add any mouse button events */ |
438 } | 462 if ((buttons ^ B_PRIMARY_MOUSE_BUTTON) & last_buttons) { |
439 if ((buttons ^ B_SECONDARY_MOUSE_BUTTON) & last_buttons) { | 463 sdl_buttons |= SDL_BUTTON_LEFT; |
440 sdl_buttons |= SDL_BUTTON_RIGHT; | 464 } |
441 } | 465 if ((buttons ^ B_SECONDARY_MOUSE_BUTTON) & last_buttons) { |
442 if ((buttons ^ B_TERTIARY_MOUSE_BUTTON) & last_buttons) { | 466 sdl_buttons |= SDL_BUTTON_RIGHT; |
443 sdl_buttons |= SDL_BUTTON_MIDDLE; | 467 } |
444 } | 468 if ((buttons ^ B_TERTIARY_MOUSE_BUTTON) & last_buttons) { |
445 SDL_PrivateMouseButton(SDL_RELEASED, sdl_buttons, 0, 0); | 469 sdl_buttons |= SDL_BUTTON_MIDDLE; |
446 | 470 } |
447 last_buttons = buttons; | 471 SDL_PrivateMouseButton (SDL_RELEASED, sdl_buttons, 0, 0); |
448 } | 472 |
449 break; | 473 last_buttons = buttons; |
450 } | 474 } |
451 | 475 break; |
452 case B_MOUSE_WHEEL_CHANGED: | 476 } |
453 { | 477 |
454 float x, y; | 478 case B_MOUSE_WHEEL_CHANGED: |
455 x = y = 0; | 479 { |
456 if (msg->FindFloat("be:wheel_delta_x", &x) == B_OK && msg->FindFloat("be:wheel_delta_y", &y) == B_OK) { | 480 float x, y; |
457 if (x < 0 || y < 0) { | 481 x = y = 0; |
458 SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELDOWN, 0, 0); | 482 if (msg->FindFloat ("be:wheel_delta_x", &x) == B_OK |
459 SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELDOWN, 0, 0); | 483 && msg->FindFloat ("be:wheel_delta_y", &y) == B_OK) { |
460 } else if (x > 0 || y > 0) { | 484 if (x < 0 || y < 0) { |
461 SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_WHEELUP, 0, 0); | 485 SDL_PrivateMouseButton (SDL_PRESSED, |
462 SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_WHEELUP, 0, 0); | 486 SDL_BUTTON_WHEELDOWN, 0, 0); |
463 } | 487 SDL_PrivateMouseButton (SDL_RELEASED, |
464 } | 488 SDL_BUTTON_WHEELDOWN, 0, 0); |
465 break; | 489 } else if (x > 0 || y > 0) { |
466 } | 490 SDL_PrivateMouseButton (SDL_PRESSED, |
467 | 491 SDL_BUTTON_WHEELUP, 0, 0); |
468 case B_KEY_DOWN: | 492 SDL_PrivateMouseButton (SDL_RELEASED, |
469 case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ | 493 SDL_BUTTON_WHEELUP, 0, 0); |
470 { | 494 } |
471 int32 key; | 495 } |
472 int32 modifiers; | 496 break; |
473 int32 key_repeat; | 497 } |
474 /* Workaround for SDL message queue being filled too fast because of BeOS own key-repeat mechanism */ | 498 |
475 if (msg->FindInt32("be:key_repeat", &key_repeat) == B_OK && key_repeat > 0) | 499 case B_KEY_DOWN: |
476 break; | 500 case B_UNMAPPED_KEY_DOWN: /* modifier keys are unmapped */ |
477 | 501 { |
478 if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { | 502 int32 key; |
479 SDL_keysym keysym; | 503 int32 modifiers; |
480 keysym.scancode = key; | 504 int32 key_repeat; |
481 if ((key > 0) && (key < 128)) { | 505 /* Workaround for SDL message queue being filled too fast because of BeOS own key-repeat mechanism */ |
482 keysym.sym = keymap[key]; | 506 if (msg->FindInt32 ("be:key_repeat", &key_repeat) == B_OK |
483 } else { | 507 && key_repeat > 0) |
484 keysym.sym = SDLK_UNKNOWN; | 508 break; |
485 } | 509 |
486 /* FIX THIS? | 510 if (msg->FindInt32 ("key", &key) == B_OK |
487 it seems SDL_PrivateKeyboard() changes mod value | 511 && msg->FindInt32 ("modifiers", &modifiers) == B_OK) { |
488 anyway, and doesn't care about what we setup here */ | 512 SDL_keysym keysym; |
489 keysym.mod = KMOD_NONE; | 513 keysym.scancode = key; |
490 keysym.unicode = 0; | 514 if ((key > 0) && (key < 128)) { |
491 if (SDL_TranslateUNICODE) { | 515 keysym.sym = keymap[key]; |
492 const char *bytes; | 516 } else { |
493 if (msg->FindString("bytes", &bytes) == B_OK) { | 517 keysym.sym = SDLK_UNKNOWN; |
494 /* FIX THIS? | 518 } |
495 this cares only about first "letter", | 519 /* FIX THIS? |
496 so if someone maps some key to print | 520 it seems SDL_PrivateKeyboard() changes mod value |
497 "BeOS rulez!" only "B" will be used. */ | 521 anyway, and doesn't care about what we setup here */ |
498 keysym.unicode = Translate2Unicode(bytes); | 522 keysym.mod = KMOD_NONE; |
499 } | 523 keysym.unicode = 0; |
500 } | 524 if (SDL_TranslateUNICODE) { |
501 SDL_PrivateKeyboard(SDL_PRESSED, &keysym); | 525 const char *bytes; |
502 } | 526 if (msg->FindString ("bytes", &bytes) == B_OK) { |
503 break; | 527 /* FIX THIS? |
504 } | 528 this cares only about first "letter", |
505 | 529 so if someone maps some key to print |
506 case B_KEY_UP: | 530 "BeOS rulez!" only "B" will be used. */ |
507 case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ | 531 keysym.unicode = Translate2Unicode (bytes); |
508 { | 532 } |
509 int32 key; | 533 } |
510 int32 modifiers; | 534 SDL_PrivateKeyboard (SDL_PRESSED, &keysym); |
511 if (msg->FindInt32("key", &key) == B_OK && msg->FindInt32("modifiers", &modifiers) == B_OK) { | 535 } |
512 SDL_keysym keysym; | 536 break; |
513 keysym.scancode = key; | 537 } |
514 if ((key > 0) && (key < 128)) { | 538 |
515 keysym.sym = keymap[key]; | 539 case B_KEY_UP: |
516 } else { | 540 case B_UNMAPPED_KEY_UP: /* modifier keys are unmapped */ |
517 keysym.sym = SDLK_UNKNOWN; | 541 { |
518 } | 542 int32 key; |
519 keysym.mod = KMOD_NONE; /* FIX THIS? */ | 543 int32 modifiers; |
520 keysym.unicode = 0; | 544 if (msg->FindInt32 ("key", &key) == B_OK |
521 if (SDL_TranslateUNICODE) { | 545 && msg->FindInt32 ("modifiers", &modifiers) == B_OK) { |
522 const char *bytes; | 546 SDL_keysym keysym; |
523 if (msg->FindString("bytes", &bytes) == B_OK) { | 547 keysym.scancode = key; |
524 keysym.unicode = Translate2Unicode(bytes); | 548 if ((key > 0) && (key < 128)) { |
525 } | 549 keysym.sym = keymap[key]; |
526 } | 550 } else { |
527 SDL_PrivateKeyboard(SDL_RELEASED, &keysym); | 551 keysym.sym = SDLK_UNKNOWN; |
528 } | 552 } |
529 break; | 553 keysym.mod = KMOD_NONE; /* FIX THIS? */ |
530 } | 554 keysym.unicode = 0; |
531 | 555 if (SDL_TranslateUNICODE) { |
532 default: | 556 const char *bytes; |
533 /* move it after switch{} so it's always handled | 557 if (msg->FindString ("bytes", &bytes) == B_OK) { |
534 that way we keep BeOS feautures like: | 558 keysym.unicode = Translate2Unicode (bytes); |
535 - CTRL+Q to close window (and other shortcuts) | 559 } |
536 - PrintScreen to make screenshot into /boot/home | 560 } |
537 - etc.. */ | 561 SDL_PrivateKeyboard (SDL_RELEASED, &keysym); |
538 //BDirectWindow::DispatchMessage(msg, target); | 562 } |
539 break; | 563 break; |
540 } | 564 } |
541 BDirectWindow::DispatchMessage(msg, target); | 565 |
542 } | 566 default: |
543 | 567 /* move it after switch{} so it's always handled |
544 private: | 568 that way we keep BeOS feautures like: |
545 #if SDL_VIDEO_OPENGL | 569 - CTRL+Q to close window (and other shortcuts) |
546 BGLView *SDL_GLView; | 570 - PrintScreen to make screenshot into /boot/home |
547 #endif | 571 - etc.. */ |
548 SDL_BView *SDL_View; | 572 //BDirectWindow::DispatchMessage(msg, target); |
549 BView *the_view; | 573 break; |
550 | 574 } |
551 bool shown; | 575 BDirectWindow::DispatchMessage (msg, target); |
552 bool inhibit_resize; | 576 } |
553 | 577 |
554 int32 last_buttons; | 578 private: |
555 SDLKey keymap[128]; | 579 #if SDL_VIDEO_OPENGL |
580 BGLView * SDL_GLView; | |
581 #endif | |
582 SDL_BView *SDL_View; | |
583 BView *the_view; | |
584 | |
585 bool shown; | |
586 bool inhibit_resize; | |
587 | |
588 int32 last_buttons; | |
589 SDLKey keymap[128]; | |
556 }; | 590 }; |
557 | 591 |
558 #endif /* _SDL_BWin_h */ | 592 #endif /* _SDL_BWin_h */ |
593 /* vi: set ts=4 sw=4 expandtab: */ |