CSDLManager::CSDLManager() { SDL_Init(SDL_INIT_EVERYTHING); CEventManager::instance()->subscribe(this); sdlWindow = 0; windowResize(800, 600); std::clog << "[INFO] <CSDLManager>: Instance created." << std::endl; }
void CSDLManager::sdlEventHandle() { CEventManager *eventManager = CEventManager::instance(); SDL_Event sdle; int key = 0; int width, height; int x, y, xrel, yrel; int button; while (SDL_PollEvent(&sdle)) { switch (sdle.type) { case SDL_QUIT: eventManager->post(&CSDLManagerEVENTQuit()); break; case SDL_KEYDOWN: key = sdle.key.keysym.sym; eventManager->post(&CSDLManagerEVENTKeyDown(key)); break; case SDL_KEYUP: key = sdle.key.keysym.sym; eventManager->post(&CSDLManagerEVENTKeyUp(key)); break; case SDL_MOUSEMOTION: x = sdle.motion.x; y = sdle.motion.y; xrel = sdle.motion.xrel; yrel = sdle.motion.yrel; eventManager->post(&CSDLManagerEVENTMouseMotion(x, y, xrel, yrel)); break; case SDL_MOUSEBUTTONDOWN: button = sdle.button.button; eventManager->post(&CSDLManagerEVENTMouseButtonDown(button)); break; case SDL_MOUSEBUTTONUP: button = sdle.button.button; eventManager->post(&CSDLManagerEVENTMouseButtonUp(button)); break; case SDL_WINDOWEVENT: switch (sdle.window.event) { case SDL_WINDOWEVENT_RESIZED: displayWidth = sdle.window.data1; displayHeight = sdle.window.data2; // This will post the resize event. windowResize(displayWidth, displayHeight); break; default: break; } break; default: break; } } }
int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QMainWindow::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: attachSexyAPI(); break; case 1: { QStringList _r = exec((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< const QString(*)>(_a[2]))); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; case 2: { QStringList _r = exec((*reinterpret_cast< const QString(*)>(_a[1]))); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; case 3: alert((*reinterpret_cast< const QString(*)>(_a[1]))); break; case 4: quit(); break; case 5: windowMinimize(); break; case 6: windowMaximize(); break; case 7: windowResize((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; case 8: { int _r = windowWidth(); if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; case 9: { int _r = windowHeight(); if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; case 10: { QStringList _r = getOpenFileName((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< const QString(*)>(_a[2]))); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; case 11: { QStringList _r = getOpenFileName((*reinterpret_cast< const QString(*)>(_a[1]))); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; case 12: { QStringList _r = getOpenFileName(); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; case 13: { QString _r = getSaveFileName((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< const QString(*)>(_a[2]))); if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; case 14: { QString _r = getSaveFileName((*reinterpret_cast< const QString(*)>(_a[1]))); if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; case 15: { QString _r = getSaveFileName(); if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; case 16: { QString _r = getDirectory((*reinterpret_cast< const QString(*)>(_a[1]))); if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; case 17: { QString _r = getDirectory(); if (_a[0]) *reinterpret_cast< QString*>(_a[0]) = _r; } break; case 18: { QStringList _r = getArgs(); if (_a[0]) *reinterpret_cast< QStringList*>(_a[0]) = _r; } break; default: ; } _id -= 19; } return _id; }
void VulkanExampleBase::handleMessages(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: prepared = false; DestroyWindow(hWnd); PostQuitMessage(0); break; case WM_PAINT: ValidateRect(window, NULL); break; case WM_KEYDOWN: switch (wParam) { case 0x50: paused = !paused; break; case VK_ESCAPE: exit(0); break; } keyPressed((uint32_t)wParam); break; case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: mousePos.x = (float)LOWORD(lParam); mousePos.y = (float)HIWORD(lParam); break; case WM_MOUSEWHEEL: { short wheelDelta = GET_WHEEL_DELTA_WPARAM(wParam); zoom += (float)wheelDelta * 0.005f * zoomSpeed; viewChanged(); break; } case WM_MOUSEMOVE: if (wParam & MK_RBUTTON) { int32_t posx = LOWORD(lParam); int32_t posy = HIWORD(lParam); zoom += (mousePos.y - (float)posy) * .005f * zoomSpeed; mousePos = glm::vec2((float)posx, (float)posy); viewChanged(); } if (wParam & MK_LBUTTON) { int32_t posx = LOWORD(lParam); int32_t posy = HIWORD(lParam); rotation.x += (mousePos.y - (float)posy) * 1.25f * rotationSpeed; rotation.y -= (mousePos.x - (float)posx) * 1.25f * rotationSpeed; mousePos = glm::vec2((float)posx, (float)posy); viewChanged(); } if (wParam & MK_MBUTTON) { int32_t posx = LOWORD(lParam); int32_t posy = HIWORD(lParam); cameraPos.x -= (mousePos.x - (float)posx) * 0.01f; cameraPos.y -= (mousePos.y - (float)posy) * 0.01f; viewChanged(); mousePos.x = (float)posx; mousePos.y = (float)posy; } break; case WM_SIZE: if ((prepared) && (wParam != SIZE_MINIMIZED)) { destWidth = LOWORD(lParam); destHeight = HIWORD(lParam); if ((wParam == SIZE_MAXIMIZED) || (wParam == SIZE_RESTORED)) { windowResize(); } } break; case WM_EXITSIZEMOVE: if ((prepared) && ((destWidth != width) || (destHeight != height))) { windowResize(); } break; } }
void VulkanExampleBase::handleEvent(const xcb_generic_event_t *event) { switch (event->response_type & 0x7f) { case XCB_CLIENT_MESSAGE: if ((*(xcb_client_message_event_t*)event).data.data32[0] == (*atom_wm_delete_window).atom) { quit = true; } break; case XCB_MOTION_NOTIFY: { xcb_motion_notify_event_t *motion = (xcb_motion_notify_event_t *)event; if (mouseButtons.left) { rotation.x += (mousePos.y - (float)motion->event_y) * 1.25f; rotation.y -= (mousePos.x - (float)motion->event_x) * 1.25f; viewChanged(); } if (mouseButtons.right) { zoom += (mousePos.y - (float)motion->event_y) * .005f; viewChanged(); } if (mouseButtons.middle) { cameraPos.x -= (mousePos.x - (float)motion->event_x) * 0.01f; cameraPos.y -= (mousePos.y - (float)motion->event_y) * 0.01f; viewChanged(); mousePos.x = (float)motion->event_x; mousePos.y = (float)motion->event_y; } mousePos = glm::vec2((float)motion->event_x, (float)motion->event_y); } break; case XCB_BUTTON_PRESS: { xcb_button_press_event_t *press = (xcb_button_press_event_t *)event; if (press->detail == XCB_BUTTON_INDEX_1) mouseButtons.left = true; if (press->detail == XCB_BUTTON_INDEX_2) mouseButtons.middle = true; if (press->detail == XCB_BUTTON_INDEX_3) mouseButtons.right = true; } break; case XCB_BUTTON_RELEASE: { xcb_button_press_event_t *press = (xcb_button_press_event_t *)event; if (press->detail == XCB_BUTTON_INDEX_1) mouseButtons.left = false; if (press->detail == XCB_BUTTON_INDEX_2) mouseButtons.middle = false; if (press->detail == XCB_BUTTON_INDEX_3) mouseButtons.right = false; } break; case XCB_KEY_RELEASE: { const xcb_key_release_event_t *keyEvent = (const xcb_key_release_event_t *)event; if (keyEvent->detail == 0x9) quit = true; keyPressed(keyEvent->detail); } break; case XCB_DESTROY_NOTIFY: quit = true; break; case XCB_CONFIGURE_NOTIFY: { const xcb_configure_notify_event_t *cfgEvent = (const xcb_configure_notify_event_t *)event; if ((prepared) && ((cfgEvent->width != width) || (cfgEvent->height != height))) { destWidth = cfgEvent->width; destHeight = cfgEvent->height; if ((destWidth > 0) && (destHeight > 0)) { windowResize(); } } } break; default: break; } }
int SDLHardwareRenderDevice::createContext() { bool settings_changed = (fullscreen != FULLSCREEN || hwsurface != HWSURFACE || vsync != VSYNC || texture_filter != TEXTURE_FILTER); Uint32 w_flags = 0; Uint32 r_flags = 0; int window_w = SCREEN_W; int window_h = SCREEN_H; if (FULLSCREEN) { w_flags = w_flags | SDL_WINDOW_FULLSCREEN_DESKTOP; // make the window the same size as the desktop resolution SDL_DisplayMode desktop; if (SDL_GetDesktopDisplayMode(0, &desktop) == 0) { window_w = desktop.w; window_h = desktop.h; } } else if (fullscreen && is_initialized) { // if the game was previously in fullscreen, resize the window when returning to windowed mode window_w = MIN_SCREEN_W; window_h = MIN_SCREEN_H; w_flags = w_flags | SDL_WINDOW_SHOWN; } else { w_flags = w_flags | SDL_WINDOW_SHOWN; } w_flags = w_flags | SDL_WINDOW_RESIZABLE; if (HWSURFACE) { r_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; } else { r_flags = SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE; VSYNC = false; // can't have software mode & vsync at the same time } if (VSYNC) r_flags = r_flags | SDL_RENDERER_PRESENTVSYNC; if (settings_changed || !is_initialized) { if (is_initialized) { destroyContext(); } window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, window_w, window_h, w_flags); if (window) { renderer = SDL_CreateRenderer(window, -1, r_flags); if (renderer) { if (TEXTURE_FILTER && !IGNORE_TEXTURE_FILTER) SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"); else SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); windowResize(); } SDL_SetWindowMinimumSize(window, MIN_SCREEN_W, MIN_SCREEN_H); // setting minimum size might move the window, so set position again SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); } bool window_created = window != NULL && renderer != NULL; if (!window_created) { // try previous setting first FULLSCREEN = fullscreen; HWSURFACE = hwsurface; VSYNC = vsync; TEXTURE_FILTER = texture_filter; if (createContext() == -1) { // last resort, try turning everything off FULLSCREEN = false; HWSURFACE = false; VSYNC = false; TEXTURE_FILTER = false; int last_resort = createContext(); if (last_resort == -1 && !is_initialized) { // If this is the first attempt and it failed we are not // getting anywhere. logError("SDLHardwareRenderDevice: createContext() failed: %s", SDL_GetError()); Exit(1); } return last_resort; } else { return 0; } } else { fullscreen = FULLSCREEN; hwsurface = HWSURFACE; vsync = VSYNC; texture_filter = TEXTURE_FILTER; is_initialized = true; } } if (is_initialized) { // update minimum window size if it has changed if (min_screen.x != MIN_SCREEN_W || min_screen.y != MIN_SCREEN_H) { min_screen.x = MIN_SCREEN_W; min_screen.y = MIN_SCREEN_H; SDL_SetWindowMinimumSize(window, MIN_SCREEN_W, MIN_SCREEN_H); SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); } windowResize(); // update title bar text and icon updateTitleBar(); // load persistent resources SharedResources::loadIcons(); delete curs; curs = new CursorManager(); } return (is_initialized ? 0 : -1); }
int SDLHardwareRenderDevice::createContextInternal() { bool settings_changed = (fullscreen != settings->fullscreen || hwsurface != settings->hwsurface || vsync != settings->vsync || texture_filter != settings->texture_filter || ignore_texture_filter != eset->resolutions.ignore_texture_filter); Uint32 w_flags = 0; Uint32 r_flags = 0; int window_w = settings->screen_w; int window_h = settings->screen_h; if (settings->fullscreen) { w_flags = w_flags | SDL_WINDOW_FULLSCREEN_DESKTOP; // make the window the same size as the desktop resolution SDL_DisplayMode desktop; if (SDL_GetDesktopDisplayMode(0, &desktop) == 0) { window_w = desktop.w; window_h = desktop.h; } } else if (fullscreen && is_initialized) { // if the game was previously in fullscreen, resize the window when returning to windowed mode window_w = eset->resolutions.min_screen_w; window_h = eset->resolutions.min_screen_h; w_flags = w_flags | SDL_WINDOW_SHOWN; } else { w_flags = w_flags | SDL_WINDOW_SHOWN; } w_flags = w_flags | SDL_WINDOW_RESIZABLE; if (settings->hwsurface) { r_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE; } else { r_flags = SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE; settings->vsync = false; // can't have software mode & vsync at the same time } if (settings->vsync) r_flags = r_flags | SDL_RENDERER_PRESENTVSYNC; if (settings_changed || !is_initialized) { destroyContext(); window = SDL_CreateWindow(NULL, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, window_w, window_h, w_flags); if (window) { renderer = SDL_CreateRenderer(window, -1, r_flags); if (renderer) { if (settings->texture_filter && !eset->resolutions.ignore_texture_filter) SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"); else SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); windowResize(); } SDL_SetWindowMinimumSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); // setting minimum size might move the window, so set position again SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); } if (window && renderer) { if (!is_initialized) { // save the system gamma levels if we just created the window SDL_GetWindowGammaRamp(window, gamma_r, gamma_g, gamma_b); Utils::logInfo("RenderDevice: Window size is %dx%d", settings->screen_w, settings->screen_h); } fullscreen = settings->fullscreen; hwsurface = settings->hwsurface; vsync = settings->vsync; texture_filter = settings->texture_filter; ignore_texture_filter = eset->resolutions.ignore_texture_filter; is_initialized = true; Utils::logInfo("RenderDevice: Fullscreen=%d, Hardware surfaces=%d, Vsync=%d, Texture Filter=%d", fullscreen, hwsurface, vsync, texture_filter); #if SDL_VERSION_ATLEAST(2, 0, 4) SDL_GetDisplayDPI(0, &ddpi, 0, 0); Utils::logInfo("RenderDevice: Display DPI is %f", ddpi); #else Utils::logError("RenderDevice: The SDL version used to compile Flare does not support SDL_GetDisplayDPI(). The virtual_dpi setting will be ignored."); #endif } } if (is_initialized) { // update minimum window size if it has changed if (min_screen.x != eset->resolutions.min_screen_w || min_screen.y != eset->resolutions.min_screen_h) { min_screen.x = eset->resolutions.min_screen_w; min_screen.y = eset->resolutions.min_screen_h; SDL_SetWindowMinimumSize(window, eset->resolutions.min_screen_w, eset->resolutions.min_screen_h); SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); } windowResize(); // update title bar text and icon updateTitleBar(); // load persistent resources delete icons; icons = new IconManager(); delete curs; curs = new CursorManager(); if (settings->change_gamma) setGamma(settings->gamma); else { resetGamma(); settings->change_gamma = false; settings->gamma = 1.0; } } return (is_initialized ? 0 : -1); }