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() {
while(!(flags & Flag::Exit)) {
SDL_Event event;
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;
while(!(flags & Flag::Exit)) mainLoop();
return 0;
}
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP: {
MouseEvent e(static_cast<MouseEvent::Button>(event.button.button), {event.button.x, event.button.y});
event.type == SDL_MOUSEBUTTONDOWN ? mousePressEvent(e) : mouseReleaseEvent(e);
void Sdl2Application::mainLoop() {
SDL_Event event;
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_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_MOUSEMOTION: {
MouseMoveEvent e({event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel});
mouseMoveEvent(e);
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:
case SDL_MOUSEBUTTONUP: {
MouseEvent e(static_cast<MouseEvent::Button>(event.button.button), {event.button.x, event.button.y});
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) {
flags &= ~Flag::Redraw;
drawEvent();
} else Corrade::Utility::sleep(5);
case SDL_QUIT: return;
}
}
return 0;
if(flags & Flag::Redraw) {
flags &= ~Flag::Redraw;
drawEvent();
} else Corrade::Utility::sleep(5);
}
void Sdl2Application::setMouseLocked(bool enabled) {

1
src/Platform/Sdl2Application.h

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

Loading…
Cancel
Save