static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { /* Try to keep the previous viewport centered */ int w, h; SDL_Rect viewport; SDL_GetWindowSize(window, &w, &h); viewport.x = (w - renderer->viewport.w) / 2; viewport.y = (h - renderer->viewport.h) / 2; viewport.w = renderer->viewport.w; viewport.h = renderer->viewport.h; SDL_RenderSetViewport(renderer, &viewport); } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->minimized = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { renderer->minimized = SDL_FALSE; } } } return 0; }
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_RESIZED) { /* Try to keep the previous viewport centered */ int w, h; SDL_Rect viewport; SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = (w - renderer->viewport_backup.w) / 2; renderer->viewport_backup.y = (h - renderer->viewport_backup.h) / 2; } else { viewport.x = (w - renderer->viewport.w) / 2; viewport.y = (h - renderer->viewport.h) / 2; viewport.w = renderer->viewport.w; viewport.h = renderer->viewport.h; SDL_RenderSetViewport(renderer, &viewport); } renderer->resized = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { int w, h; SDL_Rect viewport; if (!renderer->resized) { /* Window was programmatically resized, reset viewport */ SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = 0; renderer->viewport_backup.y = 0; renderer->viewport_backup.w = w; renderer->viewport_backup.h = h; } else { viewport.x = 0; viewport.y = 0; viewport.w = w; viewport.h = h; SDL_RenderSetViewport(renderer, &viewport); } renderer->resized = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) { renderer->hidden = SDL_FALSE; } } } } return 0; }
static int SDL_RendererEventWatch(void *userdata, SDL_Event *event) { SDL_Renderer *renderer = (SDL_Renderer *)userdata; if (event->type == SDL_WINDOWEVENT) { SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); if (window == renderer->window) { if (renderer->WindowEvent) { renderer->WindowEvent(renderer, &event->window); } if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (renderer->logical_w) { UpdateLogicalSize(renderer); } else { /* Window was resized, reset viewport */ int w, h; SDL_GetWindowSize(window, &w, &h); if (renderer->target) { renderer->viewport_backup.x = 0; renderer->viewport_backup.y = 0; renderer->viewport_backup.w = w; renderer->viewport_backup.h = h; } else { renderer->viewport.x = 0; renderer->viewport.y = 0; renderer->viewport.w = w; renderer->viewport.h = h; renderer->UpdateViewport(renderer); } } } else if (event->window.event == SDL_WINDOWEVENT_HIDDEN) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_SHOWN) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_FALSE; } } else if (event->window.event == SDL_WINDOWEVENT_MINIMIZED) { renderer->hidden = SDL_TRUE; } else if (event->window.event == SDL_WINDOWEVENT_RESTORED) { if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_HIDDEN)) { renderer->hidden = SDL_FALSE; } } } } else if (event->type == SDL_MOUSEMOTION) { if (renderer->logical_w) { event->motion.x -= renderer->viewport.x; event->motion.y -= renderer->viewport.y; event->motion.x = (int)(event->motion.x / renderer->scale.x); event->motion.y = (int)(event->motion.y / renderer->scale.y); } } else if (event->type == SDL_MOUSEBUTTONDOWN || event->type == SDL_MOUSEBUTTONUP) { if (renderer->logical_w) { event->button.x -= renderer->viewport.x; event->button.y -= renderer->viewport.y; event->button.x = (int)(event->button.x / renderer->scale.x); event->button.y = (int)(event->button.y / renderer->scale.y); } } return 0; }