void ShellAndroid::on_app_cmd(int32_t cmd) { switch (cmd) { case APP_CMD_INIT_WINDOW: create_context(); resize_swapchain(0, 0); break; case APP_CMD_TERM_WINDOW: destroy_context(); break; case APP_CMD_WINDOW_RESIZED: resize_swapchain(0, 0); break; case APP_CMD_STOP: ANativeActivity_finish(app_.activity); break; default: break; } }
void ShellXcb::handle_event(const xcb_generic_event_t *ev) { switch (ev->response_type & 0x7f) { case XCB_CONFIGURE_NOTIFY: { const xcb_configure_notify_event_t *notify = reinterpret_cast<const xcb_configure_notify_event_t *>(ev); resize_swapchain(notify->width, notify->height); } break; case XCB_KEY_PRESS: { const xcb_key_press_event_t *press = reinterpret_cast<const xcb_key_press_event_t *>(ev); Game::Key key; // TODO translate xcb_keycode_t switch (press->detail) { case 9: key = Game::KEY_ESC; break; case 111: key = Game::KEY_UP; break; case 116: key = Game::KEY_DOWN; break; case 65: key = Game::KEY_SPACE; break; default: key = Game::KEY_UNKNOWN; break; } game_.on_key(key); } break; case XCB_CLIENT_MESSAGE: { const xcb_client_message_event_t *msg = reinterpret_cast<const xcb_client_message_event_t *>(ev); if (msg->type == wm_protocols_ && msg->data.data32[0] == wm_delete_window_) game_.on_key(Game::KEY_SHUTDOWN); } break; default: break; } }
LRESULT ShellWin32::handle_message(UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) { case WM_SIZE: { UINT w = LOWORD(lparam); UINT h = HIWORD(lparam); resize_swapchain(w, h); } break; case WM_KEYDOWN: { Game::Key key; switch (wparam) { case VK_ESCAPE: key = Game::KEY_ESC; break; case VK_UP: key = Game::KEY_UP; break; case VK_DOWN: key = Game::KEY_DOWN; break; case VK_SPACE: key = Game::KEY_SPACE; break; default: key = Game::KEY_UNKNOWN; break; } game_.on_key(key); } break; case WM_CLOSE: game_.on_key(Game::KEY_SHUTDOWN); break; case WM_DESTROY: quit(); break; default: return DefWindowProc(hwnd_, msg, wparam, lparam); break; } return 0; }
void ShellWin32::run() { create_window(); create_context(); resize_swapchain(settings_.initial_width, settings_.initial_height); Win32Timer timer; double current_time = timer.get(); while (true) { bool quit = false; assert(settings_.animate); // process all messages MSG msg; while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { quit = true; break; } TranslateMessage(&msg); DispatchMessage(&msg); } if (quit) break; acquire_back_buffer(); double t = timer.get(); add_game_time(static_cast<float>(t - current_time)); present_back_buffer(); current_time = t; } destroy_context(); DestroyWindow(hwnd_); }
void ShellXcb::run() { create_window(); xcb_map_window(c_, win_); xcb_flush(c_); create_context(); resize_swapchain(settings_.initial_width, settings_.initial_height); quit_ = false; if (settings_.animate) loop_poll(); else loop_wait(); destroy_context(); xcb_destroy_window(c_, win_); xcb_flush(c_); }