Mercurial > hg > orthanc-stone
comparison Deprecated/Applications/Sdl/SdlEngine.cpp @ 1399:ff8d2e46ac63
moved Applications into Deprecated
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Wed, 29 Apr 2020 20:44:31 +0200 |
parents | Applications/Sdl/SdlEngine.cpp@7ec8fea061b9 |
children |
comparison
equal
deleted
inserted
replaced
1398:c5403d52078c | 1399:ff8d2e46ac63 |
---|---|
1 /** | |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2020 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #include "SdlEngine.h" | |
23 | |
24 #if ORTHANC_ENABLE_SDL == 1 | |
25 | |
26 #include <Core/Logging.h> | |
27 | |
28 #include <SDL.h> | |
29 | |
30 namespace OrthancStone | |
31 { | |
32 void SdlEngine::SetSize(unsigned int width, | |
33 unsigned int height) | |
34 { | |
35 NativeStoneApplicationContext::GlobalMutexLocker locker(context_); | |
36 locker.GetCentralViewport().SetSize(width, height); | |
37 surface_.SetSize(width, height); | |
38 } | |
39 | |
40 | |
41 void SdlEngine::RenderFrame() | |
42 { | |
43 if (viewportChanged_) | |
44 { | |
45 NativeStoneApplicationContext::GlobalMutexLocker locker(context_); | |
46 surface_.Render(locker.GetCentralViewport()); | |
47 | |
48 viewportChanged_ = false; | |
49 } | |
50 } | |
51 | |
52 | |
53 KeyboardModifiers SdlEngine::GetKeyboardModifiers(const uint8_t* keyboardState, | |
54 const int scancodeCount) | |
55 { | |
56 int result = KeyboardModifiers_None; | |
57 | |
58 if (keyboardState != NULL) | |
59 { | |
60 if (SDL_SCANCODE_LSHIFT < scancodeCount && | |
61 keyboardState[SDL_SCANCODE_LSHIFT]) | |
62 { | |
63 result |= KeyboardModifiers_Shift; | |
64 } | |
65 | |
66 if (SDL_SCANCODE_RSHIFT < scancodeCount && | |
67 keyboardState[SDL_SCANCODE_RSHIFT]) | |
68 { | |
69 result |= KeyboardModifiers_Shift; | |
70 } | |
71 | |
72 if (SDL_SCANCODE_LCTRL < scancodeCount && | |
73 keyboardState[SDL_SCANCODE_LCTRL]) | |
74 { | |
75 result |= KeyboardModifiers_Control; | |
76 } | |
77 | |
78 if (SDL_SCANCODE_RCTRL < scancodeCount && | |
79 keyboardState[SDL_SCANCODE_RCTRL]) | |
80 { | |
81 result |= KeyboardModifiers_Control; | |
82 } | |
83 | |
84 if (SDL_SCANCODE_LALT < scancodeCount && | |
85 keyboardState[SDL_SCANCODE_LALT]) | |
86 { | |
87 result |= KeyboardModifiers_Alt; | |
88 } | |
89 | |
90 if (SDL_SCANCODE_RALT < scancodeCount && | |
91 keyboardState[SDL_SCANCODE_RALT]) | |
92 { | |
93 result |= KeyboardModifiers_Alt; | |
94 } | |
95 } | |
96 | |
97 return static_cast<KeyboardModifiers>(result); | |
98 } | |
99 | |
100 | |
101 SdlEngine::SdlEngine(SdlWindow& window, | |
102 NativeStoneApplicationContext& context) : | |
103 window_(window), | |
104 context_(context), | |
105 surface_(window), | |
106 viewportChanged_(true) | |
107 { | |
108 } | |
109 | |
110 | |
111 void SdlEngine::Run() | |
112 { | |
113 int scancodeCount = 0; | |
114 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); | |
115 | |
116 SetSize(window_.GetWidth(), window_.GetHeight()); | |
117 | |
118 { | |
119 NativeStoneApplicationContext::GlobalMutexLocker locker(context_); | |
120 locker.GetCentralViewport().FitContent(); | |
121 } | |
122 | |
123 bool stop = false; | |
124 while (!stop) | |
125 { | |
126 RenderFrame(); | |
127 | |
128 SDL_Event event; | |
129 | |
130 while (!stop && | |
131 SDL_PollEvent(&event)) | |
132 { | |
133 NativeStoneApplicationContext::GlobalMutexLocker locker(context_); | |
134 | |
135 if (event.type == SDL_QUIT) | |
136 { | |
137 stop = true; | |
138 break; | |
139 } | |
140 else if (event.type == SDL_MOUSEBUTTONDOWN) | |
141 { | |
142 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
143 | |
144 switch (event.button.button) | |
145 { | |
146 case SDL_BUTTON_LEFT: | |
147 locker.GetCentralViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers, std::vector<Deprecated::Touch>()); | |
148 break; | |
149 | |
150 case SDL_BUTTON_RIGHT: | |
151 locker.GetCentralViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers, std::vector<Deprecated::Touch>()); | |
152 break; | |
153 | |
154 case SDL_BUTTON_MIDDLE: | |
155 locker.GetCentralViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers, std::vector<Deprecated::Touch>()); | |
156 break; | |
157 | |
158 default: | |
159 break; | |
160 } | |
161 } | |
162 else if (event.type == SDL_MOUSEMOTION) | |
163 { | |
164 locker.GetCentralViewport().MouseMove(event.button.x, event.button.y, std::vector<Deprecated::Touch>()); | |
165 } | |
166 else if (event.type == SDL_MOUSEBUTTONUP) | |
167 { | |
168 locker.GetCentralViewport().MouseUp(); | |
169 } | |
170 else if (event.type == SDL_WINDOWEVENT) | |
171 { | |
172 switch (event.window.event) | |
173 { | |
174 case SDL_WINDOWEVENT_LEAVE: | |
175 locker.GetCentralViewport().MouseLeave(); | |
176 break; | |
177 | |
178 case SDL_WINDOWEVENT_ENTER: | |
179 locker.GetCentralViewport().MouseEnter(); | |
180 break; | |
181 | |
182 case SDL_WINDOWEVENT_SIZE_CHANGED: | |
183 SetSize(event.window.data1, event.window.data2); | |
184 break; | |
185 | |
186 default: | |
187 break; | |
188 } | |
189 } | |
190 else if (event.type == SDL_MOUSEWHEEL) | |
191 { | |
192 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
193 | |
194 int x, y; | |
195 SDL_GetMouseState(&x, &y); | |
196 | |
197 if (event.wheel.y > 0) | |
198 { | |
199 locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); | |
200 } | |
201 else if (event.wheel.y < 0) | |
202 { | |
203 locker.GetCentralViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); | |
204 } | |
205 } | |
206 else if (event.type == SDL_KEYDOWN && | |
207 event.key.repeat == 0 /* Ignore key bounce */) | |
208 { | |
209 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
210 | |
211 switch (event.key.keysym.sym) | |
212 { | |
213 case SDLK_a: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'a', modifiers); break; | |
214 case SDLK_b: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'b', modifiers); break; | |
215 case SDLK_c: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'c', modifiers); break; | |
216 case SDLK_d: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'd', modifiers); break; | |
217 case SDLK_e: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'e', modifiers); break; | |
218 case SDLK_f: window_.ToggleMaximize(); break; | |
219 case SDLK_g: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'g', modifiers); break; | |
220 case SDLK_h: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'h', modifiers); break; | |
221 case SDLK_i: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'i', modifiers); break; | |
222 case SDLK_j: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'j', modifiers); break; | |
223 case SDLK_k: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'k', modifiers); break; | |
224 case SDLK_l: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'l', modifiers); break; | |
225 case SDLK_m: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'm', modifiers); break; | |
226 case SDLK_n: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'n', modifiers); break; | |
227 case SDLK_o: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'o', modifiers); break; | |
228 case SDLK_p: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'p', modifiers); break; | |
229 case SDLK_q: stop = true; break; | |
230 case SDLK_r: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'r', modifiers); break; | |
231 case SDLK_s: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 's', modifiers); break; | |
232 case SDLK_t: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 't', modifiers); break; | |
233 case SDLK_u: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'u', modifiers); break; | |
234 case SDLK_v: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'v', modifiers); break; | |
235 case SDLK_w: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'w', modifiers); break; | |
236 case SDLK_x: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'x', modifiers); break; | |
237 case SDLK_y: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'y', modifiers); break; | |
238 case SDLK_z: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, 'z', modifiers); break; | |
239 case SDLK_KP_0: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '0', modifiers); break; | |
240 case SDLK_KP_1: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '1', modifiers); break; | |
241 case SDLK_KP_2: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '2', modifiers); break; | |
242 case SDLK_KP_3: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '3', modifiers); break; | |
243 case SDLK_KP_4: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '4', modifiers); break; | |
244 case SDLK_KP_5: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '5', modifiers); break; | |
245 case SDLK_KP_6: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '6', modifiers); break; | |
246 case SDLK_KP_7: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '7', modifiers); break; | |
247 case SDLK_KP_8: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '8', modifiers); break; | |
248 case SDLK_KP_9: locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '9', modifiers); break; | |
249 | |
250 case SDLK_PLUS: | |
251 case SDLK_KP_PLUS: | |
252 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '+', modifiers); break; | |
253 | |
254 case SDLK_MINUS: | |
255 case SDLK_KP_MINUS: | |
256 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Generic, '-', modifiers); break; | |
257 | |
258 case SDLK_DELETE: | |
259 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Delete, 0, modifiers); break; | |
260 case SDLK_BACKSPACE: | |
261 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Backspace, 0, modifiers); break; | |
262 case SDLK_RIGHT: | |
263 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Right, 0, modifiers); break; | |
264 case SDLK_LEFT: | |
265 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Left, 0, modifiers); break; | |
266 case SDLK_UP: | |
267 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Up, 0, modifiers); break; | |
268 case SDLK_DOWN: | |
269 locker.GetCentralViewport().KeyPressed(KeyboardKeys_Down, 0, modifiers); break; | |
270 default: | |
271 break; | |
272 } | |
273 } | |
274 } | |
275 | |
276 // Small delay to avoid using 100% of CPU | |
277 SDL_Delay(1); | |
278 } | |
279 } | |
280 } | |
281 | |
282 #endif |