#pragma once /// @file Window.hpp /// For complete documentation, see src/video/Window.cpp #include #include #include namespace hdk::sdl { class Renderer; namespace evt { class EventConduit; } class Window : public hdk::grid::SharedPtrWrapper { public: friend class Renderer; friend class evt::EventConduit; friend std::pair CreateWindowAndRenderer(const char* title, int width, int height, SDL_WindowFlags window_flags); using hdk::grid::SharedPtrWrapper::SharedPtrWrapper; using hdk::grid::SharedPtrWrapper::get_or_cache; using hdk::grid::SharedPtrWrapper::get_or_view; static Window Create(const char* title, int w, int h, SDL_WindowFlags flags) { return Window(get_or_cache(SDL_CreateWindow(title, w, h, flags), SDL_DestroyWindow)); } static Window CreateWithProperties( SDL_PropertiesID propertiesID) { return Window( get_or_cache(SDL_CreateWindowWithProperties(propertiesID), SDL_DestroyWindow)); } static Window GetFromID(SDL_WindowID id) { /** Because it is possible windows were created by other means, we use get_or_view to wrap the SDL_Window * without taking ownership */ return Window(get_or_view(SDL_GetWindowFromID(id))); } static Window GetGrabbed() { /** Because it is possible windows were created by other means, we use get_or_view to wrap the SDL_Window * without taking ownership */ return Window(get_or_view(SDL_GetGrabbedWindow())); } public: // Instance Properties bool GetAspectRatio(float* min_aspect_ratio, float* max_aspect_ratio) const { return SDL_GetWindowAspectRatio(*this, min_aspect_ratio, max_aspect_ratio); } bool GetBordersSize(int* top, int* left, int* bottom, int* right) const { return SDL_GetWindowBordersSize(*this, top, left, bottom, right); } float GetDisplayScale() const { return SDL_GetWindowDisplayScale(*this); } SDL_WindowFlags GetFlags() const { return SDL_GetWindowFlags(*this); } const SDL_DisplayMode* GetFullscreenMode() const { return SDL_GetWindowFullscreenMode(*this); } SDL_WindowID GetID() const { return SDL_GetWindowID(*this); } bool GetKeyboardGrab() const { return SDL_GetWindowKeyboardGrab(*this); } bool SetKeyboardGrab(bool grabbed) const { return SDL_SetWindowKeyboardGrab(*this, grabbed); } bool GetMouseGrab() const { return SDL_GetWindowMouseGrab(*this); } bool SetMouseGrab(bool grabbed) const { return SDL_SetWindowMouseGrab(*this, grabbed); } const SDL_Rect* GetMouseRect() const { return SDL_GetWindowMouseRect(*this); } bool SetMouseRect(const SDL_Rect* rect) const { return SDL_SetWindowMouseRect(*this, rect); } bool GetMaximumSize(int* w, int* h) const { return SDL_GetWindowMaximumSize(*this, w, h); } bool SetMaximumSize(int w, int h) const { return SDL_SetWindowMaximumSize(*this, w, h); } bool GetMinimumSize(int* w, int* h) const { return SDL_GetWindowMinimumSize(*this, w, h); } bool SetMinimumSize(int w, int h) const { return SDL_SetWindowMinimumSize(*this, w, h); } bool SetSize(int w, int h) const { return SDL_SetWindowSize(*this, w, h); } bool GetSize(int* w, int* h) const { return SDL_GetWindowSize(*this, w, h); } bool GetSafeArea(SDL_Rect* rect) const { return SDL_GetWindowSafeArea(*this, rect); } float GetOpacity() const { return SDL_GetWindowOpacity(*this); } /** @see SDL_SetWindowOpacity * https://wiki.libsdl.org/SDL3/SDL_SetWindowOpacity * @brief Set the opacity of the window. * @param opacity The opacity of the window, between 0.0f and 1.0f. If the window is invalid, this function will * return false. * @return bool True if the opacity was successfully set, false otherwise. */ bool SetOpacity(float opacity) const { return SDL_SetWindowOpacity(*this, opacity); } /** @see SDL_GetWindowParent * https://wiki.libsdl.org/SDL3/SDL_GetWindowParent * @brief Get the parent of the window. * @return Window The parent of the window. If the window has no parent or is invalid, returns a Window that * evaluates to false (i.e., it will be null). */ Window GetParent() const { /** Because it is possible windows were created by other means, we use get_or_view to wrap the SDL_Window * without taking ownership */ return Window(get_or_view(SDL_GetWindowParent(*this))); } /** @see SDL_SetWindowParent * https://wiki.libsdl.org/SDL3/SDL_SetWindowParent * @brief Set the parent of the window. * @param parent The parent window. If the window is invalid, this function will return false. * @return bool True if the parent was successfully set, false otherwise. */ bool SetParent(SDL_Window* parent) const { return SDL_SetWindowParent(*this, parent); } /** @see SDL_GetWindowPixelDensity * https://wiki.libsdl.org/SDL3/SDL_GetWindowPixelDensity * @brief Get the pixel density of the window. * @return float The pixel density of the window. If the window is invalid, returns 0.0f. */ float GetPixelDensity() const { return SDL_GetWindowPixelDensity(*this); } /** @see SDL_GetWindowSurfaceVSync * https://wiki.libsdl.org/SDL3/SDL_GetWindowSurfaceVSync * @brief Get current vertical refresh sync interval. * @param vsync pointer to existing int to be filled with the current vertical refresh sync interval. If the * window is invalid, this function will return false and vsync will be set to 0. * @return bool True if the vertical refresh sync interval was successfully retrieved, false otherwise. */ bool GetSurfaceVSync(int* vsync) const { return SDL_GetWindowSurfaceVSync(*this, vsync); } /** @see SDL_SetWindowSurfaceVSync * https://wiki.libsdl.org/SDL3/SDL_SetWindowSurfaceVSync * @brief Set vertical refresh sync interval. * @param vsync The vertical refresh sync interval. If the window is invalid, this function will return false. * @return bool True if the vertical refresh sync interval was successfully set, false otherwise. */ bool SetSurfaceVSync(int vsync) const { return SDL_SetWindowSurfaceVSync(*this, vsync); } /** @see SDL_GetWindowPixelFormat * https://wiki.libsdl.org/SDL3/SDL_GetWindowPixelFormat * @brief Get the pixel format of the window. * @return Uint32 The pixel format of the window. If the window is invalid, returns 0. */ SDL_PixelFormat GetPixelFormat() const { return SDL_GetWindowPixelFormat(*this); } /** @see SDL_GetWindowPosition * https://wiki.libsdl.org/SDL3/SDL_GetWindowPosition * @brief Get the position of the window. * @param x Pointer to an int to be filled with the x position of the window. If the window is invalid, this * function will return false and x will be set to 0. * @param y Pointer to an int to be filled with the y position of the window. If the window is invalid, this * function will return false and y will be set to 0. * @return bool True if the position was successfully retrieved, false otherwise. */ bool GetPosition(int* x, int* y) const { return SDL_GetWindowPosition(*this, x, y); } /** @see SDL_SetWindowPosition * https://wiki.libsdl.org/SDL3/SDL_SetWindowPosition * @brief Set the position of the window. * @param x The x position of the window in pixels. If the window is invalid, this function will return false. * @param y The y position of the window in pixels. If the window is invalid, this function will return false. * @return bool True if the position was successfully set, false otherwise. */ bool SetPosition(int x, int y) const { return SDL_SetWindowPosition(*this, x, y); } /** @see SDL_GetWindowProgressState * @see SDL_ProgressState * https://wiki.libsdl.org/SDL3/SDL_GetWindowProgressState * @brief Get the progress state of the window. * @return The progress state of the window. If the window is invalid, returns 0. */ SDL_ProgressState GetProgressState() const { return SDL_GetWindowProgressState(*this); } /** @see SDL_SetWindowProgressState * @see SDL_ProgressState * https://wiki.libsdl.org/SDL3/SDL_SetWindowProgressState * @brief Set the progress state of the window. * @param state The progress state of the window. If the window is invalid, this function will return false. * @return bool True if the progress state was successfully set, false otherwise. */ bool SetProgressState(SDL_ProgressState state) const { return SDL_SetWindowProgressState(*this, state); } /** @see SDL_GetWindowProgressValue * https://wiki.libsdl.org/SDL3/SDL_GetWindowProgressValue * @brief Get the progress value of the window. * @return float The progress value of the window, between 0.0f and 1.0f. If the window is invalid, returns 0.0f. */ float GetProgressValue() const { return SDL_GetWindowProgressValue(*this); } /** @see SDL_SetWindowProgressValue * https://wiki.libsdl.org/SDL3/SDL_SetWindowProgressValue * @brief Set the progress value of the window. * @param value The progress value of the window, between 0.0f and 1.0f. If the window is invalid, this function * will return false. * @return bool True if the progress value was successfully set, false otherwise. */ bool SetProgressValue(float value) const { return SDL_SetWindowProgressValue(*this, value); } /** @see SDL_GetWindowProperties * https://wiki.libsdl.org/SDL3/SDL_GetWindowProperties * @brief Get the properties set of the window. * @return Properties The properties set of the window. If the window is invalid, returns an empty properties set. */ Properties GetProperties() const { return Properties(SDL_GetWindowProperties(*this)); } /** @see SDL_GetRenderer * https://wiki.libsdl.org/SDL3/SDL_GetRenderer * @brief Get the renderer associated with the window. * @return Renderer The renderer associated with the window. If the window is invalid, returns nullptr. */ Renderer GetRenderer() const; /** @see SDL_GetWindowTitle * https://wiki.libsdl.org/SDL3/SDL_GetWindowTitle * @brief Get the title of the window. * @return const char* The title of the window. If the window is invalid, returns an empty string. */ const char* GetTitle() const { return SDL_GetWindowTitle(*this); } /** @see SDL_SetWindowTitle * https://wiki.libsdl.org/SDL3/SDL_SetWindowTitle * @brief Set the title of the window. * @param title The title of the window. If the window is invalid, this function will return false. * @return bool True if the title was successfully set, false otherwise. */ bool SetTitle(const char* title) const { return SDL_SetWindowTitle(*this, title); } /** @see SDL_SetWindowAlwaysOnTop * https://wiki.libsdl.org/SDL3/SDL_SetWindowAlwaysOnTop * @brief Set the window to be always on top. * @param alwaysOnTop True to make the window always on top, false otherwise. * @return bool True if the operation was successful, false otherwise. */ bool SetAlwaysOnTop(bool alwaysOnTop) const { return SDL_SetWindowAlwaysOnTop(*this, alwaysOnTop); } /** @see SDL_SetWindowIcon * https://wiki.libsdl.org/SDL3/SDL_SetWindowIcon * @brief Set the icon of the window. * @param icon The surface to use as the window's icon. If the window is invalid, this function will return false. * @return bool True if the icon was successfully set, false otherwise. */ bool SetIcon(SDL_Surface* icon) const { return SDL_SetWindowIcon(*this, icon); } /** @see SDL_SetWindowModal * https://wiki.libsdl.org/SDL3/SDL_SetWindowModal * @brief Set the window to be modal. * @param modal True to make the window modal, false otherwise. * @return bool True if the operation was successful, false otherwise. */ bool SetModal(bool modal) const { return SDL_SetWindowModal(*this, modal); } /** @see SDL_SetWindowResizable * https://wiki.libsdl.org/SDL3/SDL_SetWindowResizable * @brief Set the window to be resizable. * @param resizable True to make the window resizable, false otherwise. * @return bool True if the operation was successful, false otherwise. */ bool SetResizable(bool resizable) const { return SDL_SetWindowResizable(*this, resizable); } /** @see SDL_SetWindowShape * https://wiki.libsdl.org/SDL3/SDL_SetWindowShape * @brief Set the shape of the window. * @param shape The shape mode to set for the window. If the window is invalid, this function will return false. * @return bool True if the shape was successfully set, false otherwise. */ bool SetShape(SDL_Surface* shape) const { return SDL_SetWindowShape(*this, shape); } /** @see SDL_CreatePopupWindow * https://wiki.libsdl.org/SDL3/SDL_CreatePopupWindow * @brief Create a popup window. * @param offset_x The x position of the popup window relative to the parent window. * @param offset_y The y position of the popup window relative to the parent window. * @param w The width of the popup window. * @param h The height of the popup window. * @param flags The flags for the popup window. * @return Window The created popup window. If the creation fails, returns an invalid window. */ Window CreatePopup(int offset_x, int offset_y, int w, int h, SDL_WindowFlags flags) const { return Window( get_or_cache(SDL_CreatePopupWindow(*this, offset_x, offset_y, w, h, flags), SDL_DestroyWindow)); } /** @see SDL_DestroyWindowSurface * https://wiki.libsdl.org/SDL3/SDL_DestroyWindowSurface * @brief Destroy the window surface. * @return bool True if the surface was successfully destroyed, false otherwise. */ bool DestroySurface() const { return SDL_DestroyWindowSurface(*this); } /** @see SDL_FlashWindow * https://wiki.libsdl.org/SDL3/SDL_FlashWindow * @brief Flash the window to get the user's attention. * @param flashType The type of flash to perform. * @return bool True if the window was successfully flashed, false otherwise. */ bool Flash(SDL_FlashOperation flashType) const { return SDL_FlashWindow(*this, flashType); } /** @see SDL_HideWindow * https://wiki.libsdl.org/SDL3/SDL_HideWindow * @brief Hide the window. * @return bool True if the window was successfully hidden, false otherwise. */ bool Hide() const { return SDL_HideWindow(*this); } /** @see SDL_MaximizeWindow * https://wiki.libsdl.org/SDL3/SDL_MaximizeWindow * @brief Maximize the window. If the window is already maximized, this function will return false. * @return bool True if the window was successfully maximized, false otherwise. */ bool Maximize() const { return SDL_MaximizeWindow(*this); } /** @see SDL_MinimizeWindow * https://wiki.libsdl.org/SDL3/SDL_MinimizeWindow * @brief Minimize the window. If the window is already minimized, this function will * return false. * @return bool True if the window was successfully minimized, false otherwise. */ bool Minimize() const { return SDL_MinimizeWindow(*this); } /** @see SDL_RaiseWindow * https://wiki.libsdl.org/SDL3/SDL_RaiseWindow * @brief Raise the window above other windows. If the window is already raised, this function will return false. * @return bool True if the window was successfully raised, false otherwise. */ bool Raise() const { return SDL_RaiseWindow(*this); } /** @see SDL_RestoreWindow * https://wiki.libsdl.org/SDL3/SDL_RestoreWindow * @brief Restore the window to its normal size and position. If the window is not minimized or maximized, this * function will return false. * @return bool True if the window was successfully restored, false otherwise. */ bool Restore() const { return SDL_RestoreWindow(*this); } /** @see SDL_ShowWindow * https://wiki.libsdl.org/SDL3/SDL_ShowWindow * @brief Show the window. * @return bool True if the window was successfully shown, false otherwise. */ bool Show() const { return SDL_ShowWindow(*this); } /** @see SDL_ShowWindowSystemMenu * https://wiki.libsdl.org/SDL3/SDL_ShowWindowSystemMenu * @brief Show the window's system menu. * @param x * @param y * @return bool True if the system menu was successfully shown, false otherwise. */ bool ShowSystemMenu(int x, int y) const { return SDL_ShowWindowSystemMenu(*this, x, y); } /** @see SDL_SyncWindow * https://wiki.libsdl.org/SDL3/SDL_SyncWindow * @brief Sync the window's state with the display. This is useful after changing display modes or other * operations that may affect the window's appearance. * @return bool True if the window was successfully synced, false otherwise. */ bool Sync() const { return SDL_SyncWindow(*this); } /** @see SDL_UpdateWindowSurface * https://wiki.libsdl.org/SDL3/SDL_UpdateWindowSurface * @brief Update the window surface with any changes made to the surface. This should only be used if you are * using the window surface for rendering. If the window is invalid, this function will return false. * @return bool True if the window surface was successfully updated, false otherwise. */ bool UpdateSurface() const { return SDL_UpdateWindowSurface(*this); } /** @see SDL_UpdateWindowSurfaceRects * https://wiki.libsdl.org/SDL3/SDL_UpdateWindowSurfaceRects * @brief Update the window surface with any changes made to the specified rectangles on the surface. This should * only be used if you are using the window surface for rendering. If the window is invalid, this function will * return false. * @param rects An array of SDL_Rect structures that define the rectangles to update on the window surface. * @param num_rects The number of rectangles in the rects array. * @return bool True if the window surface was successfully updated, false otherwise. */ bool UpdateSurfaceRects(const SDL_Rect* rects, int num_rects) const { return SDL_UpdateWindowSurfaceRects(*this, rects, num_rects); } }; } // namespace hdk::sdl