| 397 | } |
| 398 | |
| 399 | void WindowManager::updateWindowSize(const char* const reason, const ResizeIntent intent) { |
| 400 | if (!window_) { |
| 401 | return; |
| 402 | } |
| 403 | |
| 404 | int winW, winH, fbW, fbH; |
| 405 | SDL_GetWindowSize(window_, &winW, &winH); |
| 406 | SDL_GetWindowSizeInPixels(window_, &fbW, &fbH); |
| 407 | const glm::ivec2 next_window_size(winW, winH); |
| 408 | const glm::ivec2 next_framebuffer_size(fbW, fbH); |
| 409 | const bool window_size_changed = next_window_size != window_size_; |
| 410 | const bool framebuffer_size_changed = next_framebuffer_size != framebuffer_size_; |
| 411 | const bool size_changed = window_size_changed || framebuffer_size_changed; |
| 412 | |
| 413 | const auto flags = SDL_GetWindowFlags(window_); |
| 414 | if (size_changed) { |
| 415 | last_window_size_change_time_ = std::chrono::steady_clock::now(); |
| 416 | LOG_DEBUG("Window size update [{}]: logical {}x{} -> {}x{}, framebuffer {}x{} -> {}x{}, fullscreen={}, flags=0x{:x}", |
| 417 | reason, |
| 418 | window_size_.x, |
| 419 | window_size_.y, |
| 420 | next_window_size.x, |
| 421 | next_window_size.y, |
| 422 | framebuffer_size_.x, |
| 423 | framebuffer_size_.y, |
| 424 | next_framebuffer_size.x, |
| 425 | next_framebuffer_size.y, |
| 426 | is_fullscreen_, |
| 427 | static_cast<unsigned>(flags)); |
| 428 | } else { |
| 429 | LOG_DEBUG("Window size update [{}]: unchanged logical {}x{}, framebuffer {}x{}, fullscreen={}, flags=0x{:x}", |
| 430 | reason, |
| 431 | next_window_size.x, |
| 432 | next_window_size.y, |
| 433 | next_framebuffer_size.x, |
| 434 | next_framebuffer_size.y, |
| 435 | is_fullscreen_, |
| 436 | static_cast<unsigned>(flags)); |
| 437 | } |
| 438 | |
| 439 | window_size_ = next_window_size; |
| 440 | framebuffer_size_ = next_framebuffer_size; |
| 441 | if (vulkan_context_ && framebuffer_size_changed) { |
| 442 | const ResizeIntent effective_intent = |
| 443 | intent == ResizeIntent::Interactive && (is_fullscreen_ || isMaximized()) |
| 444 | ? ResizeIntent::Exact |
| 445 | : intent; |
| 446 | const auto vulkan_resize_intent = |
| 447 | effective_intent == ResizeIntent::Interactive |
| 448 | ? VulkanContext::ResizeIntent::Interactive |
| 449 | : VulkanContext::ResizeIntent::Exact; |
| 450 | vulkan_context_->notifyFramebufferResized(fbW, fbH, vulkan_resize_intent); |
| 451 | } |
| 452 | if (size_changed) { |
| 453 | lfs::core::events::ui::WindowResized{.width = fbW, .height = fbH}.emit(); |
| 454 | } |
| 455 | } |
| 456 |
no test coverage detected