Implement pause on focus lost for SDL frontend

This commit is contained in:
Alexandre LittleWhite Laurent 2016-08-16 19:00:28 +02:00
parent 40d59f085f
commit 4e097e05d2
3 changed files with 41 additions and 0 deletions

View File

@ -150,6 +150,10 @@ int main(int argc, char **argv) {
while (emu_window->IsOpen()) {
Core::RunLoop();
// Pause on focus lost
if (!emu_window->HasFocus())
emu_window->WaitForFocus();
}
return 0;

View File

@ -50,6 +50,10 @@ bool EmuWindow_SDL2::IsOpen() const {
return is_open;
}
bool EmuWindow_SDL2::HasFocus() const {
return has_focus;
}
void EmuWindow_SDL2::OnResize() {
int width, height;
@ -58,6 +62,24 @@ void EmuWindow_SDL2::OnResize() {
NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
}
void EmuWindow_SDL2::WaitForFocus() {
while(!has_focus) {
SDL_Event event;
SDL_WaitEvent(&event);
if(event.type == SDL_WINDOWEVENT) {
switch (event.window.event) {
case SDL_WINDOWEVENT_FOCUS_GAINED:
has_focus=true;
break;
case SDL_WINDOWEVENT_CLOSE:
has_focus=true;
is_open = false;
break;
}
}
}
}
EmuWindow_SDL2::EmuWindow_SDL2() {
keyboard_id = KeyMap::NewDeviceId();
@ -136,6 +158,12 @@ void EmuWindow_SDL2::PollEvents() {
case SDL_WINDOWEVENT_MINIMIZED:
OnResize();
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
has_focus = true;
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
has_focus = false;
break;
case SDL_WINDOWEVENT_CLOSE:
is_open = false;
break;

View File

@ -30,6 +30,12 @@ public:
/// Whether the window is still open, and a close request hasn't yet been sent
bool IsOpen() const;
/// Whether the window has focus
bool HasFocus() const;
/// Wait for the window to gain focus
void WaitForFocus();
/// Load keymap from configuration
void ReloadSetKeymaps() override;
@ -52,6 +58,9 @@ private:
/// Is the window still open?
bool is_open = true;
/// Is the window has focus
bool has_focus = true;
/// Internal SDL2 render window
SDL_Window* render_window;