Browse Source

Platform: moved Sdl2Application event loop into separate function.

Allowing it to be called perodically from some callback.
pull/278/head
Vladimír Vondruš 13 years ago
parent
commit
6fd8dc86ad
  1. 87
      src/Platform/Sdl2Application.cpp
  2. 1
      src/Platform/Sdl2Application.h

87
src/Platform/Sdl2Application.cpp

@ -127,57 +127,58 @@ Sdl2Application::~Sdl2Application() {
} }
int Sdl2Application::exec() { int Sdl2Application::exec() {
while(!(flags & Flag::Exit)) { while(!(flags & Flag::Exit)) mainLoop();
SDL_Event event; return 0;
}
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_WINDOWEVENT:
switch(event.window.event) {
case SDL_WINDOWEVENT_RESIZED:
viewportEvent({event.window.data1, event.window.data2});
flags |= Flag::Redraw;
break;
case SDL_WINDOWEVENT_EXPOSED:
flags |= Flag::Redraw;
break;
} break;
case SDL_KEYDOWN:
case SDL_KEYUP: {
KeyEvent e(static_cast<KeyEvent::Key>(event.key.keysym.sym), fixedModifiers(event.key.keysym.mod));
event.type == SDL_KEYDOWN ? keyPressEvent(e) : keyReleaseEvent(e);
} break;
case SDL_MOUSEBUTTONDOWN: void Sdl2Application::mainLoop() {
case SDL_MOUSEBUTTONUP: { SDL_Event event;
MouseEvent e(static_cast<MouseEvent::Button>(event.button.button), {event.button.x, event.button.y});
event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e); while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_WINDOWEVENT:
switch(event.window.event) {
case SDL_WINDOWEVENT_RESIZED:
viewportEvent({event.window.data1, event.window.data2});
flags |= Flag::Redraw;
break;
case SDL_WINDOWEVENT_EXPOSED:
flags |= Flag::Redraw;
break;
} break; } break;
case SDL_MOUSEWHEEL: case SDL_KEYDOWN:
if(event.wheel.y != 0) { case SDL_KEYUP: {
MouseEvent e(event.wheel.y < 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y}); KeyEvent e(static_cast<KeyEvent::Key>(event.key.keysym.sym), fixedModifiers(event.key.keysym.mod));
mousePressEvent(e); event.type == SDL_KEYDOWN ? keyPressEvent(e) : keyReleaseEvent(e);
} break; } break;
case SDL_MOUSEMOTION: { case SDL_MOUSEBUTTONDOWN:
MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}); case SDL_MOUSEBUTTONUP: {
mouseMoveEvent(e); MouseEvent e(static_cast<MouseEvent::Button>(event.button.button), {event.button.x, event.button.y});
break; event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e);
} } break;
case SDL_MOUSEWHEEL:
if(event.wheel.y != 0) {
MouseEvent e(event.wheel.y < 0 ? MouseEvent::Button::WheelUp : MouseEvent::Button::WheelDown, {event.wheel.x, event.wheel.y});
mousePressEvent(e);
} break;
case SDL_QUIT: return 0; case SDL_MOUSEMOTION: {
MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel});
mouseMoveEvent(e);
break;
} }
}
if(flags & Flag::Redraw) { case SDL_QUIT: return;
flags &= ~Flag::Redraw; }
drawEvent();
} else Corrade::Utility::sleep(5);
} }
return 0; if(flags & Flag::Redraw) {
flags &= ~Flag::Redraw;
drawEvent();
} else Corrade::Utility::sleep(5);
} }
void Sdl2Application::setMouseLocked(bool enabled) { void Sdl2Application::setMouseLocked(bool enabled) {

1
src/Platform/Sdl2Application.h

@ -174,6 +174,7 @@ class Sdl2Application {
CORRADE_ENUMSET_FRIEND_OPERATORS(Flags) CORRADE_ENUMSET_FRIEND_OPERATORS(Flags)
void initialize(); void initialize();
void mainLoop();
SDL_Window* window; SDL_Window* window;
SDL_GLContext context; SDL_GLContext context;

Loading…
Cancel
Save