comparison Resources/Graveyard/Deprecated/Applications/Sdl/SdlEngine.cpp @ 1503:553084468225

moving /Deprecated/ to /Resources/Graveyard/Deprecated/
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 30 Jun 2020 11:38:13 +0200
parents Deprecated/Applications/Sdl/SdlEngine.cpp@ff8d2e46ac63
children
comparison
equal deleted inserted replaced
1502:e5729dab3f67 1503:553084468225
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