Files
kaizen/test/testautomation_video.c
SimoZ64 28d94e8b86 Squashed 'external/SDL/' changes from 8ec576dda..90fd2a3cb
90fd2a3cb Sync SDL3 wiki -> header
edd08771a wayland: Add xdg_toplevel v7 edge constraint support
113475acb wayland: Add multi-seat support
4093e4a19 Fixed process I/O redirection to NUL on Windows
c025fdbb7 Add the CREATE_NO_WINDOW flag for background processes
8a57c83ff Updated to GameInput v1.1
f35a2736b Don't reset the render target when invalidating GPU renderer cache state
47e52ab37 Sync SDL3 wiki -> header
6a3dbe34d Sync SDL3 wiki -> header
d84c000ac Sync SDL3 wiki -> header
98e76d283 Fixed conflict when linking both SDL and hidapi statically
f6db5ba4c Add Turtle Beach VelocityOne
a1016bd06 Allow 01-joystick-polling example to be resizable
60fb1b554 Fix IMU orientations for 8bitdo wireless 2 controller in bluetooth mode
b0860fb0c Disable EGL in Emscripten builds
f303ccca6 Updated the report size for Ultimate 2 Wireless firmware v1.02
0add03780 [Windows]: dialog: Add `OFN_OVERWRITEPROMPT` to save dialogs (#12782)
a390f5716 docs: improve man page generation
93ac1e689 Fixed non-XBox controllers being detected as Series X controllers
d29bb902f Don't treat the Keychron K1 Pro System Control keyboard as a joystick
ab57ef9d7 update sdlgenblit.pl after PR/12769
b0a0d236d fix sdlgenblit.pl so that it actually matches the generated source
0fdfa925f rename local pointer vars 'pixel' to 'pixels'
46c314cc3 Revert "bool is 4 bytes in Apple MacOS X 32 bit PPC ABI"
2abfb92c5 Sync SDL3 wiki -> header
97eddacd7 Use the actual value of EGL_PLATFORM_DEVICE_EXT if it's not defined
4c1a3ccd4 rename local vars 'pixel' to 'pixelvalue'
433704e77 rename 'pixel' params of SDL_GetRGB, SDL_GetRGBA and SDL_LookupRGBAColor
83b261ae8 Remove unused message box includes
cccad933a Updated version documentation to match SDL 3.x practice
adad7dcae x11/wayland: Ignore redundant restore and fullscreen leave requests when showing the window
d7d6d8e28 Sync SDL3 wiki -> header
f7b718883 Add SDL_CreateGPURenderer
5a59b5f32 bool is 4 bytes in Apple MacOS X 32 bit PPC ABI
3b9101768 pulseaudio: cleanup TLS every time we finish a threaded-mainloop callback.
646f1f243 x11: Only enable _NET_WM_SYNC_REQUEST for OpenGL windows
33f90f2e4 GPU Vulkan: Clean up in Submit in headless mode (#12744)
93b06cffd Sync SDL3 wiki -> header
c2c3a930b Add STRING suffix to SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_* string properties
44710a248 gpu: alpha-to-coverage support
d6d2c958a Move global event handlers to SDL_VideoInit
05939909d SDL_gpu.h: SDL_GetGPUDeviceProperties() is thread-safe.
1687bc746 Sync SDL3 wiki -> header
accd952c4 SDL_gpu.h: Another attempt to clean up SDL_GetGPUDeviceProperties() docs.
c5f369f55 Sync SDL3 wiki -> header
0c9eccd0e Sync SDL3 wiki -> header
906c6c751 GPU: Add missing error code to VkErrorMessages()
205c34c62 GPU: The D3D12 blit shaders are DXIL
300013cea GPU: Don't pass null properties to SDL_CopyProperties()
8ad64aba1 GPU: Remove subheadings from SDL_GetGPUDeviceProperties() docs
94ab2b76a Sync SDL3 wiki -> header
85281be78 Re-added text removed by the wiki bridge
b53e7b447 GPU Vulkan: Fix recursive Submit calls causing defrag to fail (#12718)
b1919783c Sync SDL3 wiki -> header
39a3b14df Renamed SDL_GetGPUDeviceDebugProperties() to SDL_GetGPUDeviceProperties()
ca613b9d8 x11: Send a restored event before entering fullscreen
667b706a9 x11: Don't set the hidden flag when minimizing windows
6430aed3d Removed SDL_XInputVersion, which isn't used
40e08ee7a Assume new XBox controllers have a share button
6bb16296b Added special handling for SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY
ebb52973e cmake: make SDL_CPU_xxx variable visible when using CMAKE_OSX_ARCHITECTURES
b4af01cd0 only build static library in some feature tests
756b455d3 Fixed building for Xbox One
25232c077 Sync SDL3 wiki -> header
f78aa4d8e GPU: Expose debug information from devices
008690d01 Sync SDL3 wiki -> header
df3282740 Note that you might get a different size window than you expect
ab34ea5a2 Fixed documentation for SDL_GL_*_SIZE
87d6beb89 Rename cmake/sdltargets.cmake -> cmake/sdlcommands.cmake
208ec1829 Update README-documentation-rules.md
5709466dd Sync SDL3 wiki -> header
b52140086 Note that the Emscripten window properties are strings
82b245d13 Added support for the HORI Taiko No Tatsujin Drum Controller
12ef57ede Sync SDL3 wiki -> header
735b68581 Fixed wiki reformatting
cc8ec6cf1 Handle global mouse state for Emscripten (#12669)
53d053279 Sync SDL3 wiki -> header
cbc26fe2c Add Emscripten window data to window properties
4aefde015 Only send sensor data if sensors are enabled for 8BitDo controllers
6d7827344 Return early in stead of goto
c3ce216c4 Fixed crash at shutdown on Windows
e87a00c07 tests: port failing SDL_Renderer test from pysdl2 to testautomation
10819273b tests: port failing SDL_Renderer test from pysdl2 to testautomation
ffbd434a1 tests: port failing window  test from pysdl2 to testautomation
2775e7a78 tests: port failing SDL_Rect tests from pysdl2 to testautomation
39eed1d23 tests: port failing SDL_Hint tests from pysdl2 to testautomation
366a5281b Fixed comment
79a41ca7f Implemented DEBUG_8BITDO_PROTOCOL
5922e2cb7 Corrected comment with 8BitDo controller report sizes
0d9ff082f 8BitDo HIDAPI driver cleanup
e236a48e1 8BitDo
4de396734 More clarification for high DPI support
36fc1c2c9 Fixed texture colorspace when creating a texture from a surface
512485869 fix vulkan vertex buffer indexing
2e494fda3 Clarify high DPI support and best practices
44faac292 Fixed A/B/X/Y buttons on Nintendo 3DS
38c2081ae Temporarily default SDL_HINT_JOYSTICK_HIDAPI_8BITDO off
bcacc37e3 Sync SDL3 wiki -> header
e18c6bd2e 8BitDo (#12661)
6b1d6bfbe wayland: Commit the confinement region upon creation
266ee41c8 wayland: Defer creating cursor confinement regions until the surface is mapped
cb1d79db3 Sync SDL3 wiki -> header
088ad66f7 Update include/SDL3/SDL_power.h
032d69602 Add performance disclaimer in `SDL_GetPowerInfo` documentation
0d04e9ea6 Fixed build
7bb95bde4 Set the alpha opaque when blending to an RGB format
8eb57c5a4 diskaudio: Use SDL_GetAudioFormatName instead of recreating it from scratch.
f05bb7aae diskaudio: Log the raw PCM's format during "device" open.
210b317d8 x11: Popup positions after constraining are in the window-relative space, not global
daa7a5ad7 Updated Visual Studio example projects
f7a89d19c fix missing AVFoundation in CMakeLists.txt
a23f97483 Temporarily disable DwmFlush()
536a1a236 coreaudio: Added some NULL pointer checks.
712c76fdc gamepad: Fix inability to disable SDL_EVENT_GAMEPAD_UPDATE_COMPLETE events
418acf629 Sync SDL3 wiki -> header
633b9f6fb Added SDL_SetRenderTextureAddressMode() and SDL_GetRenderTextureAddressMode()
eb918af3d video: fix surface leak when duplicating mjpeg
567dfd2eb examples/renderer/19-affine-textures: add metadata for examples.libsdl.org.
5ab1aef36 examples/renderer/19-affine-textures: blue background so you can see the cube.
87e6d2250 examples, affine-textures: fix RISC-OS build.
254f34808 examples/renderer/19-affine-textures: Flip coords so SDL logo is right-side up.
391545105 examples/renderer/19-affine-textures: Whole source file was indented one space.
2ebcee203 examples: added examples/renderer/19-affine-textures to CMakeLists.txt.
2207f6bc9 examples/renderer/affine-textures: Fixed compiler warnings.
83eea00d6 Create affine-textures.c
401aaf3d2 video: Revert unnecessary member assignment
eed94cb03 Updated link to PSP Hello World
be2f7f206 Sync SDL3 wiki -> header
0f27c3aab Added SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING
289f5cfdb touch: Don't call ResetTouch() if SDL_GetTouch() can't find a virtual device.
b00b08f83 touch: Keep state correct when removing virtual touch devices during quit.
09fff161e cocoa: Clear pending state on fullscreen switch failures
05d23cae7 cocoa: Re-add sync timeout
2e61b4165 Don't send relative motion while in a modal loop
4c035a1fd audio: Allow PipeWire and PulseAudio streams to migrate to other sinks.
f3d4e6fe5 Sync SDL3 wiki -> header
8e6eaf12a wayland: Expose wl_output objects on video displays
1f917d523 Sync SDL3 wiki -> header
00f316737 Progress bar comment changes
e28974124 Added mappings for the NSO N64/SEGA/SNES controllers
b88200b79 Fixed face buttons for the NSO SNES controller under the HIDAPI driver
f355c7f21 Allow the progress API to be used on all platforms
b45ed98ae Fix spelling mistake in documentation
716e33f10 x11: Send the _XWAYLAND_MAY_GRAB_KEYBOARD message when grabbing the keyboard
a5633ad0f Sync SDL3 wiki -> header
6cc00a31b WindowProgressState API getters and fixes (#12629)
b520cde18 cocoa: Properly set the pending fullscreen spaces state when in a transition
dd9b9d451 Check if GL_OES_EGL_image_external is supported before trying to use it
7ec13a2ea Document SDL_malloc alignment guarantees
ae17b04c0 alsa: Don't start the hardware until the device thread is ready to do work.
41636959d audio: Feed output devices immediately, instead of waiting upfront.
48d4104ec pulseaudio: Fixed typo in commented-out debug logging.
8cb303126 wayland: Fix global mouse position retrieval
d6f137b2b Added a note to tag the wiki when doing feature releases
7f927de1f x11: remove 'args' and 'ret' from SDL_X11_SYM macro
b6ca03611 Fixed mixed trigger and body rumble for Xbox controllers on Windows
c3a3a11db keyboard: Don't check text input on a null window
035d9179a WIN_SetWindowProgressState(): Unsupported parameter error message
c217663fb SDL_SetWindowProgressState(): Add parameter validation check for `state`
3fa1bd81f Fixed previous commit renaming {add,remove}AudioDevice to native{Add,Remove}AudioDevice
b8381b3a2 Sync SDL3 wiki -> header
fa0a86409 Additions to progress bar comments
721476033 SDL_SetWindowProgressValue(): Move value clamp from `WIN_SetWindowProgressValue()` to `SDL_SetWindowProgressValue()`
69ad66b01 Fixed error messages in GetTaskbarList()
a3be7a137 WIN_SetWindowProgressValue(): Fix value clamp
017783835 Native functions renamed: {add,remove}AudioDevice to native{Add,Remove}AudioDevice
6e875397f Proguard: remove onNativePen
027df89ed wayland: Scale accelerated relative pointer coordinates with emulated resolutions
f52f982b1 chore: rename integer mode field names
8407a1625 Sync SDL3 wiki -> header
7a10fcdcc Add progress bar support for Windows (#12530)
6b13d6910 Improve move/resize visual smoothness on Windows
4fcef9074 audio: hold floating point exceptions when using neon
b493e29a8 x11: Fix backwards _NET_WM_SYNC_REQUEST init check
2fbb58329 SDL_ClaimWindowForGPUDevice() should fail for transparent windows
bde49abdb GPU: Support swapchain buffer transparency in Vulkan
79081a178 cocoa: Fix zoom check when leaving fullscreen
03cdd297e video: Fix boolean logic for getting the pending window position
fbdb63797 Fixed build when virtual joysticks are disabled
758eb256b Fixed DebugLogRenderCommands() output
4ceb02434 We need to rebind D3D12 resources after updating them
3538abfb8 Revert "Don't update a texture twice in the same batch on D3D12"
0681d0881 Don't update a texture twice in the same batch on D3D12
ac5b2b610 Don't send text event while ctrl/alt is held on X11/Wayland
365b7837c add private definitions to SDL_build_config.h.cmake
817260c73 Updates SDL_SetEventFilter code snippet to SDL3
3fd61b053 Updated for SDL style
581b61429 Emscripten: Support Custom Message Boxes (#12583)
54f5b7333 emscripten: Don't use legacy JS library functions for assertions
03a53ce0d Always show the on-screen keyboard on Steam Deck
8caeaaacd A Steam Controller might be generating keyboard input
cbb83be89 Show the on-screen keyboard if we don't have active keyboard input
67b4c3a15 Sync SDL3 wiki -> header
10072bb07 asyncio: SDL_LoadFileAsync was not null-terminating the file data.
85435d5a1 SDL_audio.h: Fixed typos in docs.
3ed61f203 Fixed applications that integrate Qt with SDL joystick support
de60a5f39 Revert "Make native functions be public otherwise it fails at run-time."
fe024b8fe Fixed typo in build.gradle
10fae8c34 Fixed Android build warnings
bf7b9b020 Fixed gradle deprecation warnings
ac2870250 Use the android-21 SDK as documented in README-android.md
476e7e54c Don't create surfaces with invalid pixel formats
6f456da63 GPU: Request sampleRateShading feature on Vulkan
4fd4d89b6 Make native functions be public otherwise it fails at run-time. (they are public such as the one in SDLActivity)
f2ed5c7a1 Fix illegal calls to DwmGetWindowAttribute()
96bf12444 Windows allows windows to be resized to zero height.
47b0c7547 Make sure we're getting called for the correct window
3415bc920 Fixed crash if a window couldn't be created on Windows
07e4dea69 The posix4 library has been merged into the libc library
9820f655d android: reduce visiblity as much as possible
c696e9318 GPU Vulkan: Fix render pass race (#12587)
7b93a744c time: Fix compilation on Solaris
14deef997 emscripten: Fix undefined behavior in opengles2 renderer
5283f7374 storage: Declare a private bootstrap for NDA user storage
8b924df48 Use an autoreleasepool in Cocoa_GetDisplayUsableBounds()
82335fd0e Fixed building with SDL_LEAN_AND_MEAN
a551c2a6d Fix Vulkan error check
5985f0a32 Fixed infinite recursion in SDL_IsGamepad()
6d0fb0a2e gpu: Fix MTLLibrary dispatch data destructor
3e5664a5b Fix return type in SDL_CreateGPURenderState
4fc9509ab Fixed raw input device GUIDs changing randomly between runs
0bd70684b GPU: Fix Vulkan backend never checking deallocations (#12567)
715301cef Fixed crash if info->path is NULL
f5eea7efa remove status message for SDL_STATIC_PIC PIC is controlled through CMAKE_POSITION_INDEPENDENT_CODE and not by an SDL option
35c03774f [SDL3] Adding input and FFB support for Logitech G29(PS3) on hidapi (#11598)
d66483dfc video: Send pending coordinates for moved, hidden windows
b9504f247 opengl: pixelart fragment shader uses GLSL version 1.30
05531c5f4 release: use NDK r21e for building Android release artifact
18185e30e Remove breaks under return
80ff0f45f Move default
3b58ad9d4 Add breaks and defaults to switch statements
8b6e9936e Missed a bracket
36ec4cd39 Align spacing
3b90ce499 Fix spacing; tabs to 4 spaces
60857935c Add preliminary joystick support for snake example
aad1e3516 mouse: Allow use of integer coordinates with fractional wheel events
501e71f25 Added unaligned version of SDL_ConvertPixels_SwapNV_std()
ad9f9af4e Removed accidentally enabled debug code
efe122be4 Removed width/height parameters from LoadTexture()
dcb97a5f4 Set a default shader entry point
1a2fccc56 hints: The auto mode switching hint is for 3.4.0
285fa671a Sync SDL3 wiki -> header
0bfe0497f video: Add a hint to disable auto mode switching if an exclusive fullscreen window moves between displays
58f6e9c27 Fix trailing doc comments
f15832c68 Sync SDL3 wiki -> header
17b84dbcf emscripten: add window properties for canvas ID and keyboard element (#12509)
ffe69fc35 Fixed SDL_GPUTextureSupportsSampleCount() documentation
e671bc265 Sync SDL3 wiki -> header
02faa8f75 Rename SDL_SetGPURenderStateFragmentUniformData() to SDL_SetGPURenderStateFragmentUniforms()
96194347b Added an example of fullscreen shader effects with the GPU renderer
2aee105b4 Added support for custom shaders with the GPU renderer
eb56c8af8 Sync SDL3 wiki -> header
1ae4ef65e Fixed incorrect assert
3e9e22f17 Added SDL_SCALEMODE_PIXELART
853375da6 Removed texture_size from the GPU renderer vertex shader
28ec461eb Organize the GPU renderer draw code
af0420d89 Switched GPU renderer shaders to shadercross and HLSL
c318b1f92 SDL_mutex.h: Fixed code example.
0e29c6295 gpu: Clean up unused code in Vulkan and D3D12 drivers
71c4de190 Sync SDL3 wiki -> header
512d97eab cocoa: Set the internal window data before calling methods that may result in referencing the internal data
5e951a230 windows: Fix WIN_SetWindowAlwaysOnTop causing owner window z-order changes when child windows are created or change top-level status
50a397bb4 Removed help for obsolete (and removed) command line option
3235a4eb4 Initialize the padding of aligned allocations to zero
efaafd766 VITA: Remove unused/duplicate headers
7746a9656 Fixup the mingw readme cmakelists
2ce3dfdf1 Fixed Nintendo controller face button layout under Steam
be6ed6e9c Fixed sscanf("026", "%1x%1x%1x", &r, &g, &b)
24339524c Use sized types when fixing undefined behavior
f1d16e9b4 avoid UB (left shift of negative number) in SDL_windowsevents.c
9fcca8351 gpu: Validate that CopyGPUTextureToTexture formats match
f2866418d wayland: Fix enum/boolean comparison and assignment
597bfe6b2 mouse: Add internal integer mouse mode hint for sdl2-compat
65cd2256c emscripten: Fix handling of special HTML targets
5d804a39d Implement SDL_GetSystemRAM and SDL_GetNumLogicalCPUCores for the 3ds (#12494)
99336ea37 Fixed memory leak in memory leak tracking
0306b5a86 Fix n3ds/SDL_syssem.c:SDL_SignalSemaphore (libsdl-org/SDL#12411)
3353b92a9 Fixed pen events on iOS after reinitializing SDL
ad2584813 cocoa: Ignore both clicks and motion on tooltip windows
fe245c6e0 x11: Always synthesize size events for external windows
84d047cc1 wayland: Rollback the round trip when reading data offers
fc3510785 Sync SDL3 wiki -> header
d631a3add Add a link to docs/INTRO-mingw.md
04b4577b5 Added MinGW Intro readme, touched up CMake and Visual Studio readmes. (#12485)
b99ff00a9 Removed logic forcing vsync on if setting it off fails
55695d372 Sync SDL3 wiki -> header
9c7c11f25 wayland: Roundtrip when receiving data offers
c4be7f77a wayland: Add additional MIME types for text drag & drop
e20e27e1f Added SIMD blitters for 8888 -> 8888 format conversion
4c82b5843 Added support for SDL_PIXELFORMAT_MJPG to SDL_DuplicateSurface()
cb099ebd4 Make texture scale mode a part of the 2D renderer draw state
6e2d3c9b5 x11: Enable legacy synchronization for external window resize and move events
bdde07468 Sync SDL3 wiki -> header
49af57694 Disable XTest by default
794ff283e Added support for using XTest to warp the mouse
fae324dac Update XSync code to match SDL3 conventions
f01bcaeb1 Sync SDL3 wiki -> header
fe9bdcf50 Added SDL_HINT_VIDEO_X11_EXTERNAL_WINDOW_INPUT
9f557941f Sync SDL3 wiki -> header
8f40dad46 Document the thread safety of SDL surface functions
aef240b2e Fixed continuous logging if returning to desktop mode fails on X11
e9632c83c Handle XWayland not sending display disconnected events
ca9bc6b16 Revert "Ignore BadRROutput errors from XRRGetOutputInfo()"
0c8ddc1f0 Ignore BadRROutput errors from XRRGetOutputInfo()
80ae3a751 Fixed crash when restoring the desktop mode on macOS
5f07347e4 Fixed crash unplugging a HIDAPI controller
82552e5b7 Make SDL_RegisterEvents() thread-safe
9f9a44282 video: Synthesize fullscreen related moves if the driver does not.
e7abbf158 x11: Synthesize fullscreen size events on Openbox
5d20bbf34 Presenting while drawing to a render target should fail.
debbe1cf7 Fix for Message Box failing to init on X11 (#12455)
4bb46e93c Fixed clip rect when logical presentation is enabled
7df0ffd43 Sync SDL3 wiki -> header
7c29c8b26 Added fullscreen_active to better track fullscreen state
3b9f0dff1 Use _this pointer to reference the video device
0ccf272ee Check the display device before dereferencing
6c347cbf3 video: Handle Cocoa desktop mode switch inhibition in the video layer
24ec2ed78 Don't save temporary mode changes to the desktop mode
d57aa6f7a pipewire: Don't require pw_check_library_version() with Pipewire < 0.3.75
113eb6f01 gpu: Add BC2_RGBA_UNORM_SRGB to GetBlockWidth/Height functions
2c7c3d4d7 Only use VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR on Android
ca3c5fd40 fix build:  s/SDL_DetectSandbox/SDL_GetSandbox/
eac63b473 Add the definition for DBUS_TYPE_UNIX_FD to SDL_dbus.h
16f12c0d5 Implement the XDP Camera portal
c3b415641 Sync SDL3 wiki -> header
2a0223487 Sync SDL3 wiki -> header
1a7c20698 Save and restore error messages when rolling back after failed init
2c46c3d5b Updated dynamic API for new functions
5373271a1 forbid transform change while relative mode active
428f0dcd6 add SDL_SetRelativeMouseTransform
67127afe3 Fix from #12118
e25ee2246 Added tiled 9-grid texture rendering function
954675b32 Sync SDL3 wiki -> header
44bca81fd Change default texture scale mode per renderer
b0d2a4f35 gpu: Fix Z offset for D3D12 realigned 3D texture uploads
b69201dae cocoa: Don't overwrite the desktop mode when changing the fullscreen mode
078d737a2 cocoa: Run pending events to completion
b0df1cbbe Updated to version 3.3.0 for development
65864190c Added testpen to the Xcode test project
292e43174 Updated to version 3.2.6 for release
f0cb78e08 Handle XCreateIC() failing when composition UI is enabled
55484ef02 Moved WIN_UpdateMouseCapture() to be with the other mouse functions
020664bd1 Update mouse button state when re-entering a window
b836ad4d4 Fix a root signature mismatch for the D3D12 renderer
a88105784 camera: Delete some failure code that should have been removed before.
f868408a3 Ceil the audio resampling rate to avoid over-estimating output samples.
cbdc93b17 cmake: make sure a SDL3 library is present when not using COMPONENTs
8a7beca12 camera: clear the spec when closing, so re-opening can probe again
ee5f5c917 Sync SDL3 wiki -> header
6e4193b74 Note that the file names are UTF-8 encoded
60c65f9fa SDL_camera.c: fix failure-return in SDL_PrepareCameraSurfaces().
b8c2bc143 Added build dependencies for Arch Linux
7ab1412e2 Sync SDL3 wiki -> header
725af6ad1 camera: Fixed surface formats, etc, for Emscripten backend.
ef23ebfb5 Fixed the cursor clip rect when toggling window borders on macOS
c68259944 GPU_d3d12: Switched the default swapchain scaling mode to none.
ea513fd47 Fixed vulkan gpu backend android orientation behaviour to just work like on iOS.
87b1c9736 Fix pen generated mouse events not having SDL_PEN_MOUSEID  (#12392)
a44107540 sysjoystick: don't leak fd on error
9a802797d SDL_pen: fix eraser check
54c7aa9c9 Sync SDL3 wiki -> header
35e8cf8ee render: allow render targets to use logical presentation.
281f0fae1 Include the VID/PID of generic keyboard/mouse devices on Windows
d09bf5681 clipboard: Cleanup coding style
edaf44767 tests: Add showing/setting the primary selection text to testclipboard
7b9036bea wayland: Don't overwrite clipboard data with the primary selection text
f7cadcba8 examples: Use SDL_GetAudioStreamQueued, not SDL_GetAudioStreamAvailable.
b3336c5a7 Match style
2b784b5bf Fix SDL_GlobDirectory
eb89d0c8c Don't put wired Switch Pro controllers into simple report mode
1ea99bc90 Early out if setting a duplicate window title
56e2955b6 Sync SDL3 wiki -> header
cc984c973 Added a mapping for the 8BitDo SN30 Pro+ controller on macOS
ba88b6aa0 Fixed reliability of initializing Switch controllers on macOS
66ecdc69a Don't update the report mode until the related hint is set
fab52b578 wayland: Ensure that color descriptions are always retrieved
9464aaa8a Change D3D12 GPU backend to respect has_depth_stencil_target
cf819ca81 Don't allow further operations on properties while we're destroying them
e01257376 Don't fixup mappings for Joy-Con controllers
34c373495 Fixed opening one Joy-Con when the other is visible but disconnected
049a7a04d Wake the main thread for main function dispatch
f0f593f04 Embed a description about Wayland clipboard instead of a link
bb748ef2d Don't cleanup clipboard in SDL_SendClipboardUpdate on Wayland
38a73a178 Sync SDL3 wiki -> header
85a302550 Set an error message if the rect passed to SDL_RenderReadPixels() is entirely outside the viewport
29df99ee3 Clarified SDL_RenderReadPixels() documentation
2f77558ba fix comment
44f1ec35c GPU: Make Vulkan transfer buffers dedicated allocs
1c2189c7c strings.h isn't available in Windows environments
ffdca343f Sync SDL3 wiki -> header
ac5fca4ae Clarify the expected usage of SDL_StorageReady()
fc365e945 Sync SDL3 wiki -> header
ad840e879 Better document that main functionality is in SDL_main.h
bb8dcf08e Sync SDL3 wiki -> header
698032531 Added support for the "%n" sscanf format specifier
e6a24fcbb fix stbi__parse_png_file() reading too much bytes (thanks @miniupnp!)
db4e6c193 Cocoa metal layers need their size updated before renderer updates
0a592b78c Sync SDL3 wiki -> header
58388e8db Add SDL_HINT_JOYSTICK_HAPTIC_AXES
db817a37f gpu: Fix forward declaration and inclusion of PrivateGPUDriver
a7bc6c5e0 gpu: initialize VkDebugUtilsLabelEXT::color
60b7faa98 gpu: Validate that reserved struct members are unset
2990d142c Map additonal Linux keycodes to SDL scancodes
a0086a5cc Add missing scancode names
35544df83 Changed PULSEAUDIO_FlushRecording() to only flush audio present when called.
deadfe0c9 Sync SDL3 wiki -> header
0815637cf vulkan build fix
ea77472d7 Document/ignore GPU features without universal support
ad11c6988 src/io/SDL_asyncio.c:SDL_AsyncIOFromFile(): Fix null-dereference warning
8bfde6755 Remove unnecessary fcitx's devel package dependency in linux doc
52af81ea1 wayland: Fix mapping borderless windows under libdecor
1a0a94b50 x11: Accommodate the borders when setting the initial window position
52e64f816 Use SDL C runtime functions in OpenVR driver
7224b4040 Fix errors when building stb_image with -DSDL_LIBC=OFF
945da099a pipewire: Fix possible deadlock when opening a device
70f657e52 ci: farewell, clang32 on msys2
e50db698e Disable all camera drivers if SDL_CAMERA_DISABLED is defined
1ddba3ad5 Replace "8BitDo Tech Ltd" with "8BitDo" in the manufacturer string
fdf72d1e4 Use the keyboard/mouse vendor if available
a811e0ef0 Added support for the 8BitDo Micro gamepad
bc85c5535 testcontroller: create window with high pixel density
75bbcbf87 Added support for Motion JPEG pipewire camera capture
5c214e5e9 testcamera: SDL_AppQuit destroys state and SDL
03e00cd34 v4l2: map SDL_PIXELFORMAT_MJPG to V4L2_PIX_FMT_MJPEG
fcd41c1d2 Check desired window area when checking zoom state
b5297de56 Add 'const' to pointer parameters
911e53dec Retain mouse focus as long as we're getting mouse events
3b8cb6228 Make it easier to enable IME debug logs
9a607e886 make start&length represent utf32 indices
9d06145d6 ci: fix type + names of intel compiler artifacts
fa380a400 Update include/SDL3/SDL_assert.h
2a1b617fb Update include/SDL3/SDL_assert.h
69e03094b fallback to defining SDL_TriggerBreakpoint as __builtin_trap in older linux arm64 environments that do not have a __has_builtin facility
c70f54e28 Remove redundant casts
2e346d716 Added 32-bit texture formats to Texture_GetBlockWidth() and Texture_GetBlockHeight()
5d776c070 Refactored SDL_CreateJoystickName() into a general SDL_CreateDeviceName()
3293eb1a1 use hidapi to get mouse/keyboard string
785584230 ci: disable precompiled headers for classic intel compiler
71d1de5d9 ci: add cppflags to CMAKE_(C|CXX)_FLAGS
28f086794 SPA_FALLTHROUGH expands to nothing when using the Intel compiler
8d3db06ff ci: GitHub is retiring Ubuntu 20.04 support
c153f83df ci: enable ccache
52ee0c105 Sync SDL3 wiki -> header
9267930fe Added a fast path for converting the same format and pitch
f24f9d3be Revert "testcamera: added support for Motion JPEG camera frames"
2e89c53eb Added support for decoding MJPG into NV12 textures
06602f4e8 Document that the pitch is the length of the image data for SDL_PIXELFORMAT_MJPG
a792434a3 Added initial MJPG support using stb_image
baf69edfc Revert "cmake: build SDL_uclibc with -fPIC"
fdf8e5a70 ci: build static loongarch libraries with -fPIC
9784414dd cmake: build SDL_uclibc with -fPIC
b48de48ef wayland: Add support for high-DPI icons
6e0264d38 x11: Use the current or last-requested window position when setting the size hint
1a38960ee Call SDL_DiscardAllCommands() for the software renderer as well
8f4c5e15f Finish any drawing when destroying a software renderer
1a853973a thread/windows: fix stack overflow in exception naming
a40b2de94 Fix SDL_emscriptenaudio.c under wasm64
523e6530a SDL_test: fix "'function': different 'const' qualifiers" warning in SDL_test_harness
9e4c657ed wayland: Fix color manager protocol string check
7500a758b Remove usages of `restrict` keyword in SDL_render.c
a7f01cd73 x11: Set the pending window position immediately after mapping
1fd626939 Renamed DreamPort to DreamPicoPort
31f9cb480 Unchecked Return Value in WIN_SuspendScreenSaver (#12316)
057c3602e Removing Double-free Issue
5c79f4cae Incorrect bfOffBits Calculation in WIN_ConvertDIBtoBMP
70d23b234 README-migration: Remove errant reference to SDL_FALSE_
6aef6ae9a AddPulseAudioDevice(): Fix use-after-free
3b4cfc11f wayland: Update copyright dates in added color manager source files
fadb261b6 wayland: Add color manager protocol support
6ef687c86 Simplified and fixed media foundation buffer handling
de12cb92d Fixed crash at shutdown with new hashtable code
a51316890 Fixed Memory/Resource Leaks (#12304)
045a4492f test/testaudio.c: Fix use-after-free warning
da2460f9e test/testautomation_audio.c: Free variables before returning
7ea0ffb74 update
06eb10c51 haiku: check if the returned _SDL_GLView is null or not
dea99e54f Sync SDL3 wiki -> header
175494359 Fixed camera frame acquisition on Windows 7
e3d9f1172 Remove the reference to the thread when it is detached
831fc7092 test/testautomation_intrinsics.c: Free variables before returning
c6a3b5b6e src/test/SDL_test_harness.c: Free variables before returning
84a236c92 hashtable: Redesign the hashtable API.
4a9b57919 joystick: remove dead udev code
ba4525694 Sync SDL3 wiki -> header
fd4e6d294 Don't render 0 sized texture rectangles
6f3b14a6d audio/video: Fix uninitialized field warnings
5b98c4a52 Fixed motion events with TOOL_TYPE_UNKNOWN
8a648dfd9 emscripten: Fixed unregistering of key event handlers
c16b7bcb7 SDL_Get*Driver() functions: Set error message on failure
ed0a03e9b Fixed Cursor Icon State for SYSTEM_CURSOR_PROGRESS
5dce8c748 SDL_GetRelativeMouseState(): Get relative mouse position also when relative mouse mode is disabled
cedf53bbc Sync SDL3 wiki -> header
3de975884 Document the "trace" log priority
b9d018f2a Fixed wayland cursor use-after-free at shutdown
041894a52 Sync SDL3 wiki -> header
3be67ced6 Fix GTK tray icon without menu + lifetime
1354affd2 haiku: Fixed keyboard input.
d2b7a8465 Fixed SDL_GetNumGamepadTouchpads() returning 1 for a NULL gamepad
ca29304ce Fixed continually resetting keyboard and mouse readings
f67c64464 Fixed reporting hat positions for GameInput controllers
1b35ca9c3 Refactored GameInput initialization
706de78a9 audio/video: Skip preferred drivers when loading a driver on demand
715c18739 Added an internal hint "SDL_VIDEO_X11_XINPUT2" for sdl2-compat
ce69e9898 Copy SDL2_SYSWMEVENT data into temporary memory for the event
55fd205ba Add missing integer texture formats to SDL_GPUTextureFormatTexelBlockSize (#12151)
e6029401d Check for non-NULL icon for trays on Unix
b03332b68 updated bytepusher demo to be C++ compatible
5dd249264 updated the snake demo to be C++ compatible
78f816d74 x11: Apply the modifier state from key events
99cf16287 Fixed the name of SDL_SYSWMEVENT
6c3797152 Removed the mapping for the Sanwa Supply JY-P76USV
9b18e8438 [GPU] D3D12 backend debug markers were being cut
0bce19cf1 The 10-bit texture formats have alpha on Direct3D
3cfa476d3 Added support for SDL_PIXELFORMAT_ABGR8888 textures
5ccee7719 testcamera: added support for Motion JPEG camera frames
cf41ccc6c Removed stb_image.h from SDL
9308404e9 Removed functions not used by SDL
5e31bbf05 Remove functions not used when STBI_NO_PNG and STBI_NO_HDR are defined
84b0c13c4 Added support for Motion JPEG camera capture
3bc53b9ad wayland: Don't set libdecor frame visibility before the first commit
c03258626 wayland: Scale-to-display mode requires both viewports and xdg-output for proper functionality
b63d3afc1 Sync SDL3 wiki -> header
0bc1f8712 Added SDL_PROP_SURFACE_HOTSPOT_X_NUMBER and SDL_PROP_SURFACE_HOTSPOT_Y_NUMBER
da464e9e5 win32: Keep the window on the last maximized display when leaving fullscreen
bf01cc8ce Renamed "Dreamcast Controller Usb" to "DreamPort"
ecd089bb6 Don't return short waits from SDL_IOReady()
4fd0b2a85 Fix #12142 - the problem was if the size of the vertex buffer was exceeded, the currentVertexBuffer would be reset to zero and thus we'd leave it pointing to an in-use VB that would get overwritten on the next present before the vkQueueSubmit occurred.
f6126e9ea Centered joystick axis values should be 0
d35bef64e pipewire: Ensure that the correct struct is used for enumeration APIs
9bd6d3647 Added SDL_DEPS_SHARED option to control default dynamic loading of shared libraries (#12215)
78721d720 joystick: Fix PS5 player LED hint change callback name
7aba6c4c7 Proper Resource Cleanup in WIN_UpdateWindowShape
e29ebb9f1 Update geometry renderer example
ca9a044b3 Memory Leak in WIN_CreateHCursor When CreateColorBitmap Fails
69d28027a Fix for 500ms hang after user clicks on the title bar, but before moving (#12217)
a0b6c0fd8 x11: Don't wait for events when the connection errored out (#8392)
864bb65ce Removed crc
006605c3b Corrected alphabetical order
dc035c5ca Added mapping for Dreamcast Controller USB
5d1bbd9b2 Fix SSE 4.2 test
7c12c63f6 Add generic SDL_syscond to N3DS threads source list
2ced6b09f Delete src/thread/n3ds/SDL_syscond.c
7af17f874 Sync SDL3 wiki -> header
982094c85 Updated to version 3.2.5 for development
b5c3eab6b Updated to version 3.2.4 for release
48c00bfe6 Fixed creating a window with both software and hardware renderer attached
3c6e6645f Sync SDL3 wiki -> header
ad8429f1b Let the renderer always see window events
c59ac249d Revert "wayland: Don't send size events while the window is hidden"
6cb3d37a2 Sync SDL3 wiki -> header
80653a42c Remove non-ASCII character from public header SDL_hints.h
a646dc89e Note that SDL_GUIDToString() and SDL_StringToGUID() are thread-safe.
8730f6a56 dynapi: Don't use SDL_getenv; it might malloc before the app sets an allocator.
c9341489c Fix #12197: Force set /utf-8 for msvc compilers (#12198)
8397e1fcc Fix up SDL2 style mappings for HIDAPI controllers
7691cabe4 Removed incorrect HIDAPI gamepad mapping
86691d325 GPU: Remove stencil bit from sampler aspect mask on Vulkan (#12196)
6782cfe2c Don't use the HIDAPI driver for Thrustmaster wheels
1c0e2b7f9 SDL_OpenHapticFromJoystick() returns a valid haptic object
c4550d906 testcontroller: show the gamepad device type
5ad033768 Sync SDL3 wiki -> header
68dabd48c SDL_GetTrayEntries(): Rename parameter `size` to `count`
b99e19c0a Fixed potential double-free
8ba8cca69 Fixed memory leak looking up pen tool names
2cd2834df Fixed memory leak in the pen cleanup
c4c185283 dbus: fix spurious leak reports with SDL_SHUTDOWN_DBUS_ON_QUIT=0
691a6133d Remove #undef __3DS__
33c0654d5 Allow OpenGL initialization on XB1 and XSX.
eb5ab2203 Check nullptr before calling the windows message hook for WM_ENTERSIZEMOVE and WM_ENTERMENULOOP
e7f326a84 bmp: Removed debug printf call.
61b1c25ee x11: SDL_SetWindowPosition on an unmapped window will do the actual move later.
f1b3523c6 Remove redundant parenthesis in SDL_MUSTLOCK macro
8527d042b Remove const from parameter of inline function SDL_RectsEqualEpsilon()
07c22da46 Fixed decoding 4-bit RLE encoded BMP files
8ccf85c59 Formatting spaces around pointer symbol.
94409d350 Added Switch Input-only controller entries for Zuiki MasCon controller for Nintendo Switch.
a8a2874ef Added distinct VID/PIDs for the PS4 vs Xbox eSwap Pro controllers
84bc2abda Corrected the entry for the PXN V900 racing wheel
eac07bda0 Sort the controller lists by VID/PID
6243a0653 Call the windows message hook for WM_ENTERSIZEMOVE and WM_ENTERMENULOOP
ec959a434 Sync SDL3 wiki -> header
8e51b2468 Renamed SDL_SoftStretch() to SDL_StretchSurface()
f40ef62a2 Sync SDL3 wiki -> header
614ae843a Sync SDL3 wiki -> header
8848f8656 Corrected the version where SDL_SoftStretch() was added
a98a4b8a6 Re-added SDL_SoftStretch() to the API
842f85da0 Sync SDL3 wiki -> header
c06172dc1 Track mouse button state by real mouse ID
73a814358 timer, windows: allow building high resolution code with old SDKs.
be991239d Updated to version 3.2.3 for development
2fa1e7258 Updated to version 3.2.2 for release
c92276279 proposed fix: set curr_src.h is to bottom_height before drawing bottom edges / corners in SDL_RenderTexture9Grid, to avoid issue where inadvertently using top height if the npatch existed on a larger texture than the drawn edge would cause too many pixels to be included in the bottom part of the render.
235022fe2 Fixed error C2059: syntax error: '}'
dc13a6ae9 SDL_SaveBMP_IO: Write bitmap header v5 values
fe6bd8e9b Sync SDL3 wiki -> header
bc3264130 Fixed mouse motion events while the mouse is grabbed
69d361dee Ignore SDL_HINT_RENDER_DRIVER set to software when creating a window surface
70a239210 GPU: Describe "readonly storage" images as sampled images on Vulkan backend (#12149)
4c6d949e6 wayland: make sure the desktop mode is in the fullscreen mode list
ab5cb707a Fixed enabling call logging
16f8122a0 Keep the simplest mapping of scancode + modifer for a given keycode
6beda3421 do not build camera drivers if camera support is disabled
0825d07a4 wayland: Don't send size events while the window is hidden
8e766c925 GPU: Resource binding state shadowing (#12138)
43924ec87 Sync SDL3 wiki -> header
8c2682a21 Sync SDL3 wiki -> header
e4fcc7b6e gpu/vulkan/SDL_gpu_vulkan.c: fix type redefinition error
14edb21ae check for backslashes as well as the forward slash
50b8c6cdf Sync SDL3 wiki -> header
943c4abcb pipewire: Report correct device default formats instead of hardcoding Float32.
943579a54 Fix inverted pen Y tilt on macOS and add tilt display to example - Negate tilt.y in Cocoa pen handling to correct inverted Y tilt axis - Update drawing example to display X/Y tilt values for visualization - see 0f128fd7c5/src/plugins/platforms/cocoa/qnsview_tablet.mm (L63) - see https://source.chromium.org/chromium/chromium/src/+/main:components/input/web_input_event_builders_mac.mm;drc=0af5ffa1e4cc4cc4f818725f8fee93ec57855e4b;l=421
31364477f Rename parameter of type SDL_CameraID from devid to instance_id
36758d70c Rename parameters of type SDL_AudioDeviceID from dev to devid
2abc7735a Free XIDeviceInfo in X11_MaybeAddPenByDeviceID
8298d60e4 Dynamically load CreateWaitableTimerExW and SetWaitableTimerEx
409f3ade8 Removed SDF test program
4176e188b Enable testgles2 on all platforms
cf249b0cb fix -Wformat problem in 32 bit builds
11dbff246 Sync SDL3 wiki -> header
ccd5fcef1 audio: Fix potential NULL dereference in AudioStream gain adjustment.
48f555065 wayland: Don't send keyboard and mouse added events during initialization
2a946e91b android: updated release build SDK to match documented requirements
44edbf713 Use templates for the package support files
1c008d8ed Change DBUS introspection timer from INFINITE -> DEFAULT when introspecting available dialog services
c21bc48a7 Fix undefined behavior in SDL_windowsmouse.c
1c7cc6028 Skip IsRegularFileOrPipe() check on Emscripten
8f958953f audio: Fix audio stream gain going wrong in certain scenarios.
3b3af7105 audio: Fix a minor code style thing.
725ee7665 Documentation: fixed typos around floats precision
6f098a920 Avoid a crash when a tray without a menu is clicked on Windows.
09f900f66 audio: Remove resampling limits.
5f8e0ebf5 Fixed memory leak at shutdown
913e0a5e5 SDL_migration.cocci: handle more renamed event fields
628130ec8 SDL_migration.cocci: fix incorrect SDL3 API name
fa8c0f055 Sync SDL3 wiki -> header
17c4bdd75 Sync SDL3 wiki -> header
ad8a09000 Sync SDL3 wiki -> header
8df17c97d GPU: Add notes about shader resource requirements to documentation
303fd5ed5 release: rename resources/cmake -> resources/CMake in dmg
fdf33f904 xcode+cmake: Use SDL3.framework/SDL3 as IMPORTED_LOCATION
cb3d6dc46 .wikiheaders-options: Removed wikipreamble setting.
84c4ff2f1 Sync SDL3 wiki -> header
2e381a717 Fix possible integer overflow of size + 1
129ebc77b Sync SDL3 wiki -> header
a336b62d8 Remove newlines from error messages
d0ae09368 x11: Don't force position windows with an undefined position
72a3eae0d Fix buffer overrun in ConvertAudio with different src/dst channel count
983cfe8b1 Remove even more newlines from log messages
718034f5f Remove newlines from log messages
17625e20d Removed redundant step in Visual Studio instructions
c806c271c Tweaked emscripten introduction
74536243d Emscripten works well using the normal CMake workflow
98c447802 ci: bump to NetBSD 10.1
a437dbc7e Improve log documentation
1c21a72bd Sync SDL3 wiki -> header
73fc2b03a Copy pen handling code from `SDLSurface` to `SDLControllerManager`
6f3d0b3cd Fixed build when using an older Xcode SDK
cb3cc2880 emscripten: pass --no-sandbox to the chrome web driver
df3cfbc79 Sync SDL3 wiki -> header
799093799 GPU: Note buffer alignment requirements
5bf077f1f Sync SDL3 wiki -> header
5d6a78045 Sync SDL3 wiki -> header
77b520e93 Updated to version 3.2.1 for development
bb3c5b4f3 Fix multiple occurences of typo "an simple" to "a simple"
efa6e7aec android: add style to test apk's
535d80bad Include the README and related files in the SDL framework
ed2920afe All SDL 3.0 release symbols are at version 3.2.0
7a5604cf0 Sync SDL3 wiki -> headers.
7e130e27b fnsince.pl: Remove prerelease version tapdancing.
b775135b4 Removed temporary debug code
a52fc209b Updated to version 3.2.0 for release
f16c67115 Sync SDL3 wiki -> header
90bda6548 video: Don't let SDL_CreateWindowTexture use the software renderer.
c45c4a5e5 render: SDL_HINT_RENDER_DRIVER now accepts a comma-separated list.
670a7d812 Sync SDL3 wiki -> header
8a67896d9 docs: Note the preferred function for getting the content scale of a window
852686856 dialog: cleaned up D-Bus portal implementation
071bebf23 coreaudio: Add a note about why this uses 3 buffers instead of 2.
c0a9d220b vulkan: Fixes for swapchain resize crash on X11.
ea9880b76 Sync SDL3 wiki -> header
bcf7ead6e documentation typo: SFLOAT -> FLOAT
6d5815db5 vulkan: Deal with VK_ERROR_OUT_OF_DATE_KHR returns from vkAcquireNextImageKHR.
6b7dad7d8 vulkan: move temporary pointer to its own field to prevent a bad dereference.
3e530c6db cmake: remove superfluous cmake_minimum_required
7bff36e4b ci: add ubuntu arm job
37140aa9f cmake: expand libunwind
abe6d9db9 Automatically detect SDL_main_private.h
10c9fbf41 Use proper polar direction when creating FF_RUMBLE effect
c6c746970 Translate conditional effect direction instead of hardcoding it to 0
b476695e6 Call the windows message hook while inside a modal message loop
b6d0bc043 coreaudio: Use three buffers for the audioqueue, not two.
aa10e51c7 audio: Added some minor missing comments in struct SDL_AudioDevice.
10a5b388d win32: Retain the WS_MAXIMIZEDBOX style while in fullscreen
6449339ae win32: Restore the base size of a window when leaving fullscreen
075c0337c Removed debug print statement
a036aeda3 The Vulkan renderer doesn't actually support RGB texture formats
9b454a762 Revert "testautomation: don't validate alpha values on XRGB formats"
dcadd23ba render: Prevent division by zero if logical presentation is 0 pixels.
adb91fd3d process: Don't use vfork() on Apple platforms.
819628c6b testautomation: Remove Win32 borderless resizable hint
759e01bd6 testautomation: don't validate alpha values on XRGB formats
c698c61f0 renderer: initialize the surface colorspace correctly
c975f77b0 Update joysticks and so forth during live resize
362f96a6c testcontroller: use SDL_MAIN_USE_CALLBACKS so updates happen during live resizing
f8040b2e0 Use UIKeyboardTypeDecimalPad for number fields on iOS
90b2e2527 include: Added a tiny bit to SDL_sensor.h's category documentation.
2be749b23 include: More category documentation.
642262e30 cocoa: Fix mousegrab when going fullscreen.
d5766bc4b include: More category documentation.
b809da52f assert: Try using __builtin_trap() for SDL_TriggerBreakpoint().
c4c0bfdfb Sync SDL3 wiki -> header
7133969e3 Feature add hint to remap option as alt key (#12021)
53a535029 Sync SDL3 wiki -> header
5f2dd5f04 tray: fixed multi-threading issues with GTk implementation
dfdc12026 tray: document thread-safety
d4cda5105 tray: renamed SDL_HasNoActiveTrays() to SDL_HasActiveTrays()
a974888aa tray: fixed icon colors on Windows
7570ab106 tray: improved error checking
b716eeefe testtray: minor cleanup
3afd1e7ea windows: use WIN_UTF8ToStringW() for dialog titles
78023500f Sync SDL3 wiki -> header
34c12d0db include: Add category documentation to SDL_timer.h.
b088e8919 Sync SDL3 wiki -> header
0851322fb include: Add category documentation to SDL_power.h.
43b54b3d7 Fix Windows dialog folder titles
32965b4bf pen: Send virtual mouse motion without a button press when a pen is hovering.
5da9d4ecc cocoa: Slightly better display hotplugging detection.
19f42094b Fix Windows fie dialog args freeing
721fc7de0 Correct spacing of pointers ('a* b;' -> 'a *b;')
cd269730e Fix Windows dialog memory management
049a8f0e5 Use SDL_calloc() instead of SDL_malloc()
354d2c390 Initialize invalid parent_{tray,entry} to NULL
b79ada6aa Windows trays: Fix ParentEntry & Enabling
ba95c54f9 macOS: get the correct display name on macOS 10.15+
42e0fb10f wayland: Set the mouse state before calling the hit test callback
cd0db8d35 Added Linux evdev mappings for the Wireless HORIPAD For Steam
1d7a681e4 Revert "emscripten: resizable windows take whole page, resize with browser window."
e054f3c08 Sync SDL3 wiki -> header
75317dae5 include: Added category docs for SDL_mouse.h
c7d1fd90e Added support for the 8BitDo Ultimate 2C Wireless in Bluetooth mode
dbe3baeb0 release: document using the xcframework with CMake
ad3c7b92f xcode+cmake: use SDL3.framework folder as IMPORTED_LOCATION
0401b07ee Fixed typo
08e74d29b Fixed typo
923123a52 emscripten: Let SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT accept "#none"
c603a9c94 Moved flag documentation
90b7174a7 Respect the SDL_BORDERLESS_RESIZABLE_STYLE hint, but default it to true.
6a72d32d4 emscripten: Let SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT accept "".
f3a39074b windows: use WS_THICKFRAME style on borderless windows.
842f6dc40 Fixed wrong type of `phase` (#12014)
b95989d14 Fixed sine wave distortion over time.
010f27dc7 storage: enumerate and glob on storage can accept a NULL path.
a6a8598b9 storage: deal with paths with Windows '\\' path separators appended.
7c6adc1ca gpu renderer: removed unused sampler slots
feeea6a77 Sync SDL3 wiki -> headers.
e9f7f11f1 fnsince.pl: Fix script once bump to 3.1.10 exposed a bug.
d2fc394a2 Sync SDL3 wiki -> header
d317fc9c0 emscripten: resizable windows take whole page, resize with browser window.
ee469c6af Sync SDL3 wiki -> header
d4d22dd8d GPU: Add remarks about point topology
59ea078ee x11: check to see if displays moved when connected/disconnected
1848ce680 win32: Use the window coordinates to get the monitor when de-minimizing a maximized window
656c519cc Fixed warning C6313: Incorrect operator. Use an equality test to check for zero-valued flags.
9ed96f392 Sync SDL3 wiki -> header
ae8df1dcb Note that the primary monitor isn't always at 0,0
4b429b9fa Updated README-platforms.md
616ae9906 Removed README-git.md
c2dac95f5 Revert "Add CategoryAPICategory to the complete API index"
dd4f5df82 release: support android-X-ext-Y directories
cdc5483cf Vita: Fix off-by-one error for synthetic mouse events
07a5c144c Sync SDL3 wiki -> header
eb168e410 Updated to version 3.1.11 for development
b96bb152c wayland: Don't redundantly set the border state when showing a window
5a564a718 wayland: Add a dummy function for the libdecor dismiss popup callback
9f6eeb109 wayland: Set the border state before the initial configure
274bc95df Sync SDL3 wiki -> header
07f7c4046 Sync SDL3 wiki -> header
22d8e7353 include: filled in category documentation for SDL_messagebox.h.
21a42d2b0 Add CategoryAPICategory to the complete API index
1006236aa ci: add summary to release.yml
326ce9bb8 gpu: D3D12 buildfix for Xbox
c95b842b3 video: Xbox does not use CreateIconFromSurface
d8e1ad0eb release: skip extended Android SDK versions
7ee2ab383 wayland: Fix return value check from int-to-bool conversion
1dd8fadca Updated to version 3.1.10 for the release candidate
9225a421b Sync SDL3 wiki -> header
3ffb1a8cb storage: generic title storage allows override paths without '/' appended.
874c07f8d storage: Don't allow "." and ".." paths, enforce '/' dir separators.
67664a042 testfilesystem: test some Storage APIs, too.
eb793dede filesystem: SDL_GetCurrentDirectory() should add a path separator at the end.
87e1b0eb8 filesystem: SDL_EnumerateDirectory() gives dirs with path seperators appended.
e98ee9bb0 Adjust testgl.c to test gl_release_behavior
3424ec948 video: SDL_GL_GetAttribute gets correct SDL_GL_CONTEXT_RELEASE_BEHAVIOR value.
05877f2ce cmake: Add the IoRing async i/o code to the Windows build.
4d63a2b88 io: Renamed src/file to src/io
ea642fe9f cocoa: clear mouse focus based on NSEventTypeMouseExited events (#11991)
5f4696ce6 Updating documentation for the 3.2.0 release
2c7b7d1d3 Keep the lifecycle observer active while there are windows active
355f69ebf GPU: Ensure thread safety of Vulkan resource creation
c9d602307 cocoa: Only process hit tests on left clicks
dd0bdc256 win32: Pass through non-left mouse button presses when over draggable areas
84d35587e filesystem: SDL_SYS_EnumerateDirectory inexplicably takes the same arg twice.
fc9b2478d windows: don't set focus click pending if SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH is set
18d21b36f windows: use the initial rect to anchor fixed aspect ratio resizing
199547192 cocoa: fixed resizing windows with fixed aspect ratio
67382e9c8 Fixed detection of function keys on Emscripten
23410debf SDL_GetKeyboardNameForID(): Set an error message for invalid keyboard IDs
8ce176b59 SDL_GetMouseNameForID(): Set an error message for invalid mouse IDs.
51fa076fd Don't send normal keyboard events if no application window has focus
a446381ea Tooltips and unfocusable windows can't become main windows
ebb24eedc mouse: Clean up virtual touch devices as appropriate.
dabc93a63 pen: Send virtual mouse and touch events for pen input.
169c8d514 Fix incorrect hotspot calculation for cursor positioning
8e9c44bc3 Fixed accidental removal of optional delegate interface check
4dd585fb6 coreaudio: convert MPEG channel layout to WAVE channel layout
81e57147f Child windows shouldn't take focus if the parent window is in relative mouse mode
3bea84531 Sync SDL3 wiki -> header
9ed23a4b7 Updated SDL_SetEventFilter() documentation
e19a56f4d Don't send fake key events while processing real ones on Android
1ab61635a Use SDL_Log() for keyboard debugging.
29c684c62 Removed debug logging
0eaa6197c Removed unnecessary __builtin_available check
ffe194c52 Fixed build when SDL_JOYSTICK_MFI isn't enabled
a4547fe77 Updated weak framework dependencies for new deployment targets
49dd24e19 Fixed potentially overlapping memcpy() to use memmove()
191a6417d events: use SDL_memmove instead of SDL_memcpy for overlapping memory
bf793bf43 Sync SDL3 wiki -> header
9e60a8994 audio: Allow streams to change the device-side channels maps.
b2793a2ce Removed obsolete Raspberry Pi documentation
04e3b6770 Removed outdated Visual Studio instructions
a41f93bd1 Added https://github.com/Ravbug/sdl3-sample as a more complete Android example
5ca735b40 Only use WAVE surround sound channel layouts on macOS 10.15+
cdde6dd7b Bumped deployment requirements for Apple platforms
8f8af918b Removed CMakeLists.txt example that says you shouldn't use it
8feb21a1d Updated README-cmake.md with build instructions for several platforms
4294c0683 GPU: Check texture format support in pipeline creation
31dd4fe81 Sync SDL3 wiki -> header
417ed7f35 Fix references in docs
0aa319e4f Added support for custom tray icon on Windows via SDL hints.
581537220 minor update to mingw-w64 build instructions.
5d079c9a2 GPU: Remove bogus property from header docs
d590e1f12 GPU: Align D3D12 clear properties to naming convention
7098e525d Sync SDL3 wiki -> header
fb6df9338 GPU: Add name properties to resources (#11946)
a2b0ddcca Sync SDL3 wiki -> header
d28e95322 Added thread safety documentation for SDL_iostream.h
f731741ea Sync SDL3 wiki -> header
0eaa8c6d8 Added INTRO-emscripten.md
21b433536 Scale up the text for large displays
6bc7e88ca Added INTRO-androidstudio.md
e4e76ac72 Added INTRO-xcode.md
1b30a01b4 Added INTRO-visualstudio.md
191b9d502 Added INTRO-cmake.md
7d2a1c5f8 Mention the tests in INSTALL.md
b6b939044 Simplified INSTALL.md
55e094f7a Updated INSTALL.md with simple intro breadcrumbs
584c1d579 Tweaking the README
995a6a033 Minor readability improvement for README-contributing.md
86b46c678 Removed README-git.md
96414fa56 Removed obsolete Raspberry Pi documentation
670db4d24 Made the README links in INSTALL.md markdown links
b08d04581 Added a Discord link to BUGS.txt
2ad0f1e1f Updated the credits for SDL 3.0
41d48db4a Removed the runtime README
922b73195 Simplified the README
5e4a2974a Removed obsolete warnings about MIT licensed SIMD code
3766a3940 emscripten: double the audio buffer size.
e10e42c81 Sync SDL3 wiki -> header
2b8fb0bdd wikiheaders: Maybe fix perl warning.
efaf3739c Sync SDL3 wiki -> header
4bddf521d emscripten: Override emscripten's fullscreen button with SDL's implementation.
569de8490 better numerical precision for playback example
e5a4f0936 Call SDL_UDEV_Quit() if we don't end up using it
7d7a76c07 Sync SDL3 wiki -> header
66408308b Added documentation for mouse handling in relative mode
438075a83 Sync SDL3 wiki -> header
b4562c024 cocoa: Add a hint to control menu visibility in fullscreen spaces windows
611f132fd Don't use a hint callback for SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY
03a3c19c2 examples: use doubles to generate sine waves and avoid distortion
307e6f2ca emscripten: simulate mouse autocapture.
f79083d9b release: don't add test directory to mingw release archives
4ba4f0a10 release: add Android aar to devel zip archive
c4f2f7b35 Removed redundant information in example pages
949ec0c50 Sync SDL3 wiki -> header
839227b4b Sync SDL3 wiki -> header
c04b739df GPU: Note that resource naming functions are not thread safe.
3df0767e3 gpu: Initialize Metal stencil format even if stencil test is disabled
307dac97a testcontroller.c: fix build errors due to -Wformat after commit b524af1
21cc1878f Reset enhanced mode state when closing a controller
b524af1b4 testcontroller: log the ID of gamepads as they are added and removed
9a83fa026 apply multiplier scale after system scale
ea859fba3 Sync SDL3 wiki -> header
551510c0e SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE can be combined with SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE
95c158438 README-migration: note SDL2 brightness/gamma ramp APIs that have been removed.
f0af6c348 emscripten: Add SDL_EVENT_DISPLAY_ORIENTATION support.
3ad9c38a4 emscripten: Don't set OpenGL swap intervals until first PumpEvents.
d42b4ed96 Leave SDL_TriggerBreakpoint undefined on unknown platforms
9a7cfbc2d Add onNativePen to proguard-rules.pro
82125ec1d x11: Be more aggressive about finding _any_ usable messagebox font.
423184879 Revert "Separate android initialization from Activity (#11891)"
61f13b94d add a fallback SDL_TriggerBreakpoint() for MSVC after commit ebaa30d3.
d14c93c4b Separate android initialization from Activity (#11891)
c64197be1 Sync SDL3 wiki -> header
042898995 Added SDL_ClickTrayEntry()
fb0f6a119 cocoa: Display mode changes set Desktop display mode, not current.
38176bfe9 cocoa: Implemented display hotplugging support.
0e2ca934b events: Remove unused function declaration
715897aea Added support for displaying XIM composition strings
a8a65b6fc Use XIM for IME input on X11
1f3b40797 Sync SDL3 wiki -> header
fb94a79f8 stdinc: define SDL_NOLONGLONG for old Visual Studios, document the symbol.
bda90c3cb cmake: rename SDL_DISABLE_* CMake options to SDL_xxx
90aff306c gpu: Show a debug error when pipelines are not given the right shader stages
00b23a012 Sync SDL3 wiki -> header
6b776a998 keyboard: Add some SDL keycodes for common Xkb keys
e5966bbdb x11: Add support for Mod3 and more esoteric Xkb configurations
73ee99978 wayland: Add support for Mod3 and more esoteric Xkb configurations
ebaa30d33 __debugbreak was introduced in Microsoft Visual Studio 2003
c8f3f1b46 _BitScanReverse was introduced in Microsoft Visual Studio 2005
a78104a47 Disable long long support in the headers with SDL_NOLONGLONG
6cdde10ed gpu: Metal depth write should behave like Vulkan/D3D12
dd0dc64d5 Sync SDL3 wiki -> header
c688853a8 Sync SDL3 wiki -> header
507593f48 wikiheaders: Allow symbols to be filtered from manpage generation by regex.
7acf78ba9 storage: Trim the title storage root from enumerated paths
037cd25a2 win32: Use the pending size during NCCALCSIZE
e8916b260 pipewire: Use byte order pixel format aliases
d2090d1c8 Sync SDL3 wiki -> header
3f7f632e1 audio: Added SDL_AudioDeviceStreamPaused.
f61860fa9 testautomation: fixed incorrect test.
4bb3c2a1c render: Some cleanups.
61bdbacda render: SDL_RenderTextureTiled shouldn't try to drop draw calls, either.
f044a3d6c Revert "render: GetRenderViewportSize shouldn't use scale, just logical presentation."
fa7a52991 render: GetRenderViewportSize shouldn't scale viewport dimensions.
163600951 Sync SDL3 wiki -> header
bf8532094 render: Don't try to drop draws outside of the viewport.
f2f04e825 tests: Fix get/set window size test being skipped
cbdbd66e1 Sync SDL3 wiki -> header
ef1fdf11b tray: Create tray icons for libappindicator securely
e6bb50a71 Updated to version 3.1.9 for development
6b34c9fe7 Sync SDL3 wiki -> header
22422f774 Fixed ABI compatibility with 3.1.6
d7b10d05b Updated to version 3.1.8 for the preview release
4290fc8bd tray: Load GTK and libappindicator by versioned names, except on OpenBSD
6b38d250a tray: Don't try to use GTK 2 versions of libappindicator
bba066c44 tray: Don't call g_object_unref(NULL)
0bc370dfb Android doc cleanup
6934c910b opengl: use GL_UNSIGNED_BYTE instead of GL_UNSIGNED_INT_8_8_8_8_REV.
0176a19ae Fixed platform define condition for Windows phone
0180ca541 windows: Catch WM_POINTERCAPTURECHANGED events.

git-subtree-dir: external/SDL
git-subtree-split: 90fd2a3cbee5b7ead1f0517d7cc0eba1f3059207
2025-04-15 09:23:03 +02:00

2603 lines
108 KiB
C

/**
* Video test suite
*/
#include <SDL3/SDL.h>
#include <SDL3/SDL_test.h>
#include "testautomation_suites.h"
/* Private helpers */
/**
* Create a test window
*/
static SDL_Window *createVideoSuiteTestWindow(const char *title)
{
SDL_Window *window;
SDL_Window **windows;
SDL_Event event;
int w, h;
int count;
SDL_WindowFlags flags;
bool needs_renderer = false;
bool needs_events_pumped = false;
/* Standard window */
w = SDLTest_RandomIntegerInRange(320, 1024);
h = SDLTest_RandomIntegerInRange(320, 768);
flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS;
window = SDL_CreateWindow(title, w, h, flags);
SDLTest_AssertPass("Call to SDL_CreateWindow('Title',%d,%d,%" SDL_PRIu64 ")", w, h, flags);
SDLTest_AssertCheck(window != NULL, "Validate that returned window is not NULL");
/* Check the window is available in the window list */
windows = SDL_GetWindows(&count);
SDLTest_AssertCheck(windows != NULL, "Validate that returned window list is not NULL");
SDLTest_AssertCheck(windows[0] == window, "Validate that the window is first in the window list");
SDL_free(windows);
/* Wayland and XWayland windows require that a frame be presented before they are fully mapped and visible onscreen.
* This is required for the mouse/keyboard grab tests to pass.
*/
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0) {
needs_renderer = true;
} else if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) {
/* Try to detect if the x11 driver is running under XWayland */
const char *session_type = SDL_GetEnvironmentVariable(SDL_GetEnvironment(), "XDG_SESSION_TYPE");
if (session_type && SDL_strcasecmp(session_type, "wayland") == 0) {
needs_renderer = true;
}
/* X11 needs the initial events pumped, or it can erroneously deliver old configuration events at a later time. */
needs_events_pumped = true;
}
if (needs_renderer) {
SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL);
if (renderer) {
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
/* Some desktops don't display the window immediately after presentation,
* so delay to give the window time to actually appear on the desktop.
*/
SDL_Delay(100);
} else {
SDLTest_Log("Unable to create a renderer, some tests may fail on Wayland/XWayland");
}
}
if (needs_events_pumped) {
/* Pump out the event queue */
while (SDL_PollEvent(&event)) {
}
}
return window;
}
/**
* Destroy test window
*/
static void destroyVideoSuiteTestWindow(SDL_Window *window)
{
if (window != NULL) {
SDL_Renderer *renderer = SDL_GetRenderer(window);
if (renderer) {
SDL_DestroyRenderer(renderer);
}
SDL_DestroyWindow(window);
window = NULL;
SDLTest_AssertPass("Call to SDL_DestroyWindow()");
}
}
/* Test case functions */
/**
* Enable and disable screensaver while checking state
*/
static int SDLCALL video_enableDisableScreensaver(void *arg)
{
bool initialResult;
bool result;
/* Get current state and proceed according to current state */
initialResult = SDL_ScreenSaverEnabled();
SDLTest_AssertPass("Call to SDL_ScreenSaverEnabled()");
if (initialResult == true) {
/* Currently enabled: disable first, then enable again */
/* Disable screensaver and check */
SDL_DisableScreenSaver();
SDLTest_AssertPass("Call to SDL_DisableScreenSaver()");
result = SDL_ScreenSaverEnabled();
SDLTest_AssertPass("Call to SDL_ScreenSaverEnabled()");
SDLTest_AssertCheck(result == false, "Verify result from SDL_ScreenSaverEnabled, expected: %i, got: %i", false, result);
/* Enable screensaver and check */
SDL_EnableScreenSaver();
SDLTest_AssertPass("Call to SDL_EnableScreenSaver()");
result = SDL_ScreenSaverEnabled();
SDLTest_AssertPass("Call to SDL_ScreenSaverEnabled()");
SDLTest_AssertCheck(result == true, "Verify result from SDL_ScreenSaverEnabled, expected: %i, got: %i", true, result);
} else {
/* Currently disabled: enable first, then disable again */
/* Enable screensaver and check */
SDL_EnableScreenSaver();
SDLTest_AssertPass("Call to SDL_EnableScreenSaver()");
result = SDL_ScreenSaverEnabled();
SDLTest_AssertPass("Call to SDL_ScreenSaverEnabled()");
SDLTest_AssertCheck(result == true, "Verify result from SDL_ScreenSaverEnabled, expected: %i, got: %i", true, result);
/* Disable screensaver and check */
SDL_DisableScreenSaver();
SDLTest_AssertPass("Call to SDL_DisableScreenSaver()");
result = SDL_ScreenSaverEnabled();
SDLTest_AssertPass("Call to SDL_ScreenSaverEnabled()");
SDLTest_AssertCheck(result == false, "Verify result from SDL_ScreenSaverEnabled, expected: %i, got: %i", false, result);
}
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_CreateWindow function using different sizes
*/
static int SDLCALL video_createWindowVariousSizes(void *arg)
{
SDL_Window *window;
const char *title = "video_createWindowVariousSizes Test Window";
int w = 0, h = 0;
int wVariation, hVariation;
for (wVariation = 0; wVariation < 3; wVariation++) {
for (hVariation = 0; hVariation < 3; hVariation++) {
switch (wVariation) {
case 0:
/* Width of 1 */
w = 1;
break;
case 1:
/* Random "normal" width */
w = SDLTest_RandomIntegerInRange(320, 1920);
break;
case 2:
/* Random "large" width */
w = SDLTest_RandomIntegerInRange(2048, 4095);
break;
}
switch (hVariation) {
case 0:
/* Height of 1 */
h = 1;
break;
case 1:
/* Random "normal" height */
h = SDLTest_RandomIntegerInRange(320, 1080);
break;
case 2:
/* Random "large" height */
h = SDLTest_RandomIntegerInRange(2048, 4095);
break;
}
window = SDL_CreateWindow(title, w, h, 0);
SDLTest_AssertPass("Call to SDL_CreateWindow('Title',%d,%d,SHOWN)", w, h);
SDLTest_AssertCheck(window != NULL, "Validate that returned window is not NULL");
/* Clean up */
destroyVideoSuiteTestWindow(window);
}
}
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_CreateWindow function using different flags
*/
static int SDLCALL video_createWindowVariousFlags(void *arg)
{
SDL_Window *window;
const char *title = "video_createWindowVariousFlags Test Window";
int w, h;
int fVariation;
SDL_WindowFlags flags;
/* Standard window */
w = SDLTest_RandomIntegerInRange(320, 1024);
h = SDLTest_RandomIntegerInRange(320, 768);
for (fVariation = 1; fVariation < 14; fVariation++) {
switch (fVariation) {
default:
case 1:
flags = SDL_WINDOW_FULLSCREEN;
/* Skip - blanks screen; comment out next line to run test */
continue;
break;
case 2:
flags = SDL_WINDOW_OPENGL;
/* Skip - not every video driver supports OpenGL; comment out next line to run test */
continue;
break;
case 3:
flags = 0;
break;
case 4:
flags = SDL_WINDOW_HIDDEN;
break;
case 5:
flags = SDL_WINDOW_BORDERLESS;
break;
case 6:
flags = SDL_WINDOW_RESIZABLE;
break;
case 7:
flags = SDL_WINDOW_MINIMIZED;
break;
case 8:
flags = SDL_WINDOW_MAXIMIZED;
break;
case 9:
flags = SDL_WINDOW_MOUSE_GRABBED;
break;
case 10:
flags = SDL_WINDOW_INPUT_FOCUS;
break;
case 11:
flags = SDL_WINDOW_MOUSE_FOCUS;
break;
case 12:
flags = SDL_WINDOW_EXTERNAL;
break;
case 13:
flags = SDL_WINDOW_KEYBOARD_GRABBED;
break;
}
window = SDL_CreateWindow(title, w, h, flags);
SDLTest_AssertPass("Call to SDL_CreateWindow('Title',%d,%d,%" SDL_PRIu64 ")", w, h, flags);
SDLTest_AssertCheck(window != NULL, "Validate that returned window is not NULL");
/* Clean up */
destroyVideoSuiteTestWindow(window);
}
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_GetWindowFlags function
*/
static int SDLCALL video_getWindowFlags(void *arg)
{
SDL_Window *window;
const char *title = "video_getWindowFlags Test Window";
SDL_WindowFlags flags;
SDL_WindowFlags actualFlags;
/* Reliable flag set always set in test window */
flags = 0;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (window != NULL) {
actualFlags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("Call to SDL_GetWindowFlags()");
SDLTest_AssertCheck((flags & actualFlags) == flags, "Verify returned value has flags %" SDL_PRIu64 " set, got: %" SDL_PRIu64, flags, actualFlags);
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_GetFullscreenDisplayModes function
*/
static int SDLCALL video_getFullscreenDisplayModes(void *arg)
{
SDL_DisplayID *displays;
SDL_DisplayMode **modes;
int count;
int i;
/* Get number of displays */
displays = SDL_GetDisplays(NULL);
if (displays) {
SDLTest_AssertPass("Call to SDL_GetDisplays()");
/* Make call for each display */
for (i = 0; displays[i]; ++i) {
modes = SDL_GetFullscreenDisplayModes(displays[i], &count);
SDLTest_AssertPass("Call to SDL_GetFullscreenDisplayModes(%" SDL_PRIu32 ")", displays[i]);
SDLTest_AssertCheck(modes != NULL, "Validate returned value from function; expected != NULL; got: %p", modes);
SDLTest_AssertCheck(count >= 0, "Validate number of modes; expected: >= 0; got: %d", count);
SDL_free(modes);
}
SDL_free(displays);
}
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_GetClosestFullscreenDisplayMode function against current resolution
*/
static int SDLCALL video_getClosestDisplayModeCurrentResolution(void *arg)
{
SDL_DisplayID *displays;
SDL_DisplayMode **modes;
SDL_DisplayMode current;
SDL_DisplayMode closest;
int i, result, num_modes;
/* Get number of displays */
displays = SDL_GetDisplays(NULL);
if (displays) {
SDLTest_AssertPass("Call to SDL_GetDisplays()");
/* Make calls for each display */
for (i = 0; displays[i]; ++i) {
SDLTest_Log("Testing against display: %" SDL_PRIu32, displays[i]);
/* Get first display mode to get a sane resolution; this should always work */
modes = SDL_GetFullscreenDisplayModes(displays[i], &num_modes);
SDLTest_AssertPass("Call to SDL_GetDisplayModes()");
SDLTest_Assert(modes != NULL, "Verify returned value is not NULL");
if (num_modes > 0) {
SDL_memcpy(&current, modes[0], sizeof(current));
/* Make call */
result = SDL_GetClosestFullscreenDisplayMode(displays[i], current.w, current.h, current.refresh_rate, false, &closest);
SDLTest_AssertPass("Call to SDL_GetClosestFullscreenDisplayMode(target=current)");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* Check that one gets the current resolution back again */
if (result == 0) {
SDLTest_AssertCheck(closest.w == current.w,
"Verify returned width matches current width; expected: %d, got: %d",
current.w, closest.w);
SDLTest_AssertCheck(closest.h == current.h,
"Verify returned height matches current height; expected: %d, got: %d",
current.h, closest.h);
}
}
SDL_free(modes);
}
SDL_free(displays);
}
return TEST_COMPLETED;
}
/**
* Tests the functionality of the SDL_GetClosestFullscreenDisplayMode function against random resolution
*/
static int SDLCALL video_getClosestDisplayModeRandomResolution(void *arg)
{
SDL_DisplayID *displays;
SDL_DisplayMode target;
SDL_DisplayMode closest;
int i;
int variation;
/* Get number of displays */
displays = SDL_GetDisplays(NULL);
if (displays) {
SDLTest_AssertPass("Call to SDL_GetDisplays()");
/* Make calls for each display */
for (i = 0; displays[i]; ++i) {
SDLTest_Log("Testing against display: %" SDL_PRIu32, displays[i]);
for (variation = 0; variation < 16; variation++) {
/* Set random constraints */
SDL_zero(target);
target.w = (variation & 1) ? SDLTest_RandomIntegerInRange(1, 4096) : 0;
target.h = (variation & 2) ? SDLTest_RandomIntegerInRange(1, 4096) : 0;
target.refresh_rate = (variation & 8) ? (float)SDLTest_RandomIntegerInRange(25, 120) : 0.0f;
/* Make call; may or may not find anything, so don't validate any further */
SDL_GetClosestFullscreenDisplayMode(displays[i], target.w, target.h, target.refresh_rate, false, &closest);
SDLTest_AssertPass("Call to SDL_GetClosestFullscreenDisplayMode(target=random/variation%d)", variation);
}
}
SDL_free(displays);
}
return TEST_COMPLETED;
}
/**
* Tests call to SDL_GetWindowFullscreenMode
*
* \sa SDL_GetWindowFullscreenMode
*/
static int SDLCALL video_getWindowDisplayMode(void *arg)
{
SDL_Window *window;
const char *title = "video_getWindowDisplayMode Test Window";
const SDL_DisplayMode *mode;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (window != NULL) {
mode = SDL_GetWindowFullscreenMode(window);
SDLTest_AssertPass("Call to SDL_GetWindowFullscreenMode()");
SDLTest_AssertCheck(mode == NULL, "Validate result value; expected: NULL, got: %p", mode);
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
return TEST_COMPLETED;
}
/* Helper function that checks for an 'Invalid window' error */
static void checkInvalidWindowError(void)
{
const char *invalidWindowError = "Invalid window";
const char *lastError;
lastError = SDL_GetError();
SDLTest_AssertPass("SDL_GetError()");
SDLTest_AssertCheck(lastError != NULL, "Verify error message is not NULL");
if (lastError != NULL) {
SDLTest_AssertCheck(SDL_strcmp(lastError, invalidWindowError) == 0,
"SDL_GetError(): expected message '%s', was message: '%s'",
invalidWindowError,
lastError);
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
}
}
/**
* Tests call to SDL_GetWindowFullscreenMode with invalid input
*
* \sa SDL_GetWindowFullscreenMode
*/
static int SDLCALL video_getWindowDisplayModeNegative(void *arg)
{
const SDL_DisplayMode *mode;
/* Call against invalid window */
mode = SDL_GetWindowFullscreenMode(NULL);
SDLTest_AssertPass("Call to SDL_GetWindowFullscreenMode(window=NULL)");
SDLTest_AssertCheck(mode == NULL, "Validate result value; expected: NULL, got: %p", mode);
checkInvalidWindowError();
return TEST_COMPLETED;
}
/* Helper for setting and checking the window mouse grab state */
static void setAndCheckWindowMouseGrabState(SDL_Window *window, bool desiredState)
{
bool currentState;
/* Set state */
SDL_SetWindowMouseGrab(window, desiredState);
SDLTest_AssertPass("Call to SDL_SetWindowMouseGrab(%s)", (desiredState == false) ? "false" : "true");
/* Get and check state */
currentState = SDL_GetWindowMouseGrab(window);
SDLTest_AssertPass("Call to SDL_GetWindowMouseGrab()");
SDLTest_AssertCheck(
currentState == desiredState,
"Validate returned state; expected: %s, got: %s",
(desiredState == false) ? "false" : "true",
(currentState == false) ? "false" : "true");
if (desiredState) {
SDLTest_AssertCheck(
SDL_GetGrabbedWindow() == window,
"Grabbed window should be to our window");
SDLTest_AssertCheck(
SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_GRABBED,
"SDL_WINDOW_MOUSE_GRABBED should be set");
} else {
SDLTest_AssertCheck(
!(SDL_GetWindowFlags(window) & SDL_WINDOW_MOUSE_GRABBED),
"SDL_WINDOW_MOUSE_GRABBED should be unset");
}
}
/* Helper for setting and checking the window keyboard grab state */
static void setAndCheckWindowKeyboardGrabState(SDL_Window *window, bool desiredState)
{
bool currentState;
/* Set state */
SDL_SetWindowKeyboardGrab(window, desiredState);
SDLTest_AssertPass("Call to SDL_SetWindowKeyboardGrab(%s)", (desiredState == false) ? "false" : "true");
/* Get and check state */
currentState = SDL_GetWindowKeyboardGrab(window);
SDLTest_AssertPass("Call to SDL_GetWindowKeyboardGrab()");
SDLTest_AssertCheck(
currentState == desiredState,
"Validate returned state; expected: %s, got: %s",
(desiredState == false) ? "false" : "true",
(currentState == false) ? "false" : "true");
if (desiredState) {
SDLTest_AssertCheck(
SDL_GetGrabbedWindow() == window,
"Grabbed window should be set to our window");
SDLTest_AssertCheck(
SDL_GetWindowFlags(window) & SDL_WINDOW_KEYBOARD_GRABBED,
"SDL_WINDOW_KEYBOARD_GRABBED should be set");
} else {
SDLTest_AssertCheck(
!(SDL_GetWindowFlags(window) & SDL_WINDOW_KEYBOARD_GRABBED),
"SDL_WINDOW_KEYBOARD_GRABBED should be unset");
}
}
/**
* Tests keyboard and mouse grab support
*
* \sa SDL_GetWindowMouseGrab
* \sa SDL_GetWindowKeyboardGrab
* \sa SDL_SetWindowMouseGrab
* \sa SDL_SetWindowKeyboardGrab
*/
static int SDLCALL video_getSetWindowGrab(void *arg)
{
const char *title = "video_getSetWindowGrab Test Window";
SDL_Window *window;
bool originalMouseState, originalKeyboardState;
bool hasFocusGained = false;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
/* Need to raise the window to have and SDL_EVENT_WINDOW_FOCUS_GAINED,
* so that the window gets the flags SDL_WINDOW_INPUT_FOCUS,
* so that it can be "grabbed" */
SDL_RaiseWindow(window);
if (!(SDL_GetWindowFlags(window) & SDL_WINDOW_INPUT_FOCUS)) {
int count = 0;
SDL_Event evt;
SDL_zero(evt);
while (!hasFocusGained && count++ < 3) {
while (SDL_PollEvent(&evt)) {
if (evt.type == SDL_EVENT_WINDOW_FOCUS_GAINED) {
hasFocusGained = true;
}
}
}
} else {
hasFocusGained = true;
}
SDLTest_AssertCheck(hasFocusGained == true, "Expectded window with focus");
/* Get state */
originalMouseState = SDL_GetWindowMouseGrab(window);
SDLTest_AssertPass("Call to SDL_GetWindowMouseGrab()");
originalKeyboardState = SDL_GetWindowKeyboardGrab(window);
SDLTest_AssertPass("Call to SDL_GetWindowKeyboardGrab()");
/* F */
setAndCheckWindowKeyboardGrabState(window, false);
setAndCheckWindowMouseGrabState(window, false);
SDLTest_AssertCheck(SDL_GetGrabbedWindow() == NULL,
"Expected NULL grabbed window");
/* F --> F */
setAndCheckWindowMouseGrabState(window, false);
setAndCheckWindowKeyboardGrabState(window, false);
SDLTest_AssertCheck(SDL_GetGrabbedWindow() == NULL,
"Expected NULL grabbed window");
/* F --> T */
setAndCheckWindowMouseGrabState(window, true);
setAndCheckWindowKeyboardGrabState(window, true);
/* T --> T */
setAndCheckWindowKeyboardGrabState(window, true);
setAndCheckWindowMouseGrabState(window, true);
/* M: T --> F */
/* K: T --> T */
setAndCheckWindowKeyboardGrabState(window, true);
setAndCheckWindowMouseGrabState(window, false);
/* M: F --> T */
/* K: T --> F */
setAndCheckWindowMouseGrabState(window, true);
setAndCheckWindowKeyboardGrabState(window, false);
/* M: T --> F */
/* K: F --> F */
setAndCheckWindowMouseGrabState(window, false);
setAndCheckWindowKeyboardGrabState(window, false);
SDLTest_AssertCheck(SDL_GetGrabbedWindow() == NULL,
"Expected NULL grabbed window");
/* Negative tests */
SDL_GetWindowMouseGrab(NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMouseGrab(window=NULL)");
checkInvalidWindowError();
SDL_GetWindowKeyboardGrab(NULL);
SDLTest_AssertPass("Call to SDL_GetWindowKeyboardGrab(window=NULL)");
checkInvalidWindowError();
SDL_SetWindowMouseGrab(NULL, false);
SDLTest_AssertPass("Call to SDL_SetWindowMouseGrab(window=NULL,false)");
checkInvalidWindowError();
SDL_SetWindowKeyboardGrab(NULL, false);
SDLTest_AssertPass("Call to SDL_SetWindowKeyboardGrab(window=NULL,false)");
checkInvalidWindowError();
SDL_SetWindowMouseGrab(NULL, true);
SDLTest_AssertPass("Call to SDL_SetWindowMouseGrab(window=NULL,true)");
checkInvalidWindowError();
SDL_SetWindowKeyboardGrab(NULL, true);
SDLTest_AssertPass("Call to SDL_SetWindowKeyboardGrab(window=NULL,true)");
checkInvalidWindowError();
/* Restore state */
setAndCheckWindowMouseGrabState(window, originalMouseState);
setAndCheckWindowKeyboardGrabState(window, originalKeyboardState);
/* Clean up */
destroyVideoSuiteTestWindow(window);
return TEST_COMPLETED;
}
/**
* Tests call to SDL_GetWindowID and SDL_GetWindowFromID
*
* \sa SDL_GetWindowID
* \sa SDL_SetWindowFromID
*/
static int SDLCALL video_getWindowId(void *arg)
{
const char *title = "video_getWindowId Test Window";
SDL_Window *window;
SDL_Window *result;
Uint32 id, randomId;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
/* Get ID */
id = SDL_GetWindowID(window);
SDLTest_AssertPass("Call to SDL_GetWindowID()");
/* Get window from ID */
result = SDL_GetWindowFromID(id);
SDLTest_AssertPass("Call to SDL_GetWindowID(%" SDL_PRIu32 ")", id);
SDLTest_AssertCheck(result == window, "Verify result matches window pointer");
/* Get window from random large ID, no result check */
randomId = SDLTest_RandomIntegerInRange(UINT8_MAX, UINT16_MAX);
result = SDL_GetWindowFromID(randomId);
SDLTest_AssertPass("Call to SDL_GetWindowID(%" SDL_PRIu32 "/random_large)", randomId);
/* Get window from 0 and Uint32 max ID, no result check */
result = SDL_GetWindowFromID(0);
SDLTest_AssertPass("Call to SDL_GetWindowID(0)");
result = SDL_GetWindowFromID(UINT32_MAX);
SDLTest_AssertPass("Call to SDL_GetWindowID(UINT32_MAX)");
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Get window from ID for closed window */
result = SDL_GetWindowFromID(id);
SDLTest_AssertPass("Call to SDL_GetWindowID(%" SDL_PRIu32 "/closed_window)", id);
SDLTest_AssertCheck(result == NULL, "Verify result is NULL");
/* Negative test */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
id = SDL_GetWindowID(NULL);
SDLTest_AssertPass("Call to SDL_GetWindowID(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
/**
* Tests call to SDL_GetWindowPixelFormat
*
* \sa SDL_GetWindowPixelFormat
*/
static int SDLCALL video_getWindowPixelFormat(void *arg)
{
const char *title = "video_getWindowPixelFormat Test Window";
SDL_Window *window;
SDL_PixelFormat format;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
/* Get format */
format = SDL_GetWindowPixelFormat(window);
SDLTest_AssertPass("Call to SDL_GetWindowPixelFormat()");
SDLTest_AssertCheck(format != SDL_PIXELFORMAT_UNKNOWN, "Verify that returned format is valid; expected: != SDL_PIXELFORMAT_UNKNOWN, got: SDL_PIXELFORMAT_UNKNOWN");
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Negative test */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
format = SDL_GetWindowPixelFormat(NULL);
SDLTest_AssertPass("Call to SDL_GetWindowPixelFormat(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
static bool getPositionFromEvent(int *x, int *y)
{
bool ret = false;
SDL_Event evt;
SDL_zero(evt);
while (SDL_PollEvent(&evt)) {
if (evt.type == SDL_EVENT_WINDOW_MOVED) {
*x = evt.window.data1;
*y = evt.window.data2;
ret = true;
}
}
return ret;
}
static bool getSizeFromEvent(int *w, int *h)
{
bool ret = false;
SDL_Event evt;
SDL_zero(evt);
while (SDL_PollEvent(&evt)) {
if (evt.type == SDL_EVENT_WINDOW_RESIZED) {
*w = evt.window.data1;
*h = evt.window.data2;
ret = true;
}
}
return ret;
}
/**
* Tests call to SDL_GetWindowPosition and SDL_SetWindowPosition
*
* \sa SDL_GetWindowPosition
* \sa SDL_SetWindowPosition
*/
static int SDLCALL video_getSetWindowPosition(void *arg)
{
const char *title = "video_getSetWindowPosition Test Window";
SDL_Window *window;
int result;
int maxxVariation, maxyVariation;
int xVariation, yVariation;
int referenceX, referenceY;
int currentX, currentY;
int desiredX, desiredY;
SDL_Rect display_bounds;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
/* Sanity check */
SDL_GetWindowPosition(window, &currentX, &currentY);
if (!SDL_SetWindowPosition(window, currentX, currentY)) {
SDLTest_Log("Skipping window positioning tests: %s reports window positioning as unsupported", SDL_GetCurrentVideoDriver());
goto null_tests;
}
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) {
/* The X11 server allows arbitrary window placement, but compositing
* window managers such as GNOME and KDE force windows to be within
* desktop bounds.
*/
maxxVariation = 2;
maxyVariation = 2;
SDL_GetDisplayUsableBounds(SDL_GetPrimaryDisplay(), &display_bounds);
} else if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "cocoa") == 0) {
/* Platform doesn't allow windows with negative Y desktop bounds */
maxxVariation = 4;
maxyVariation = 3;
SDL_GetDisplayUsableBounds(SDL_GetPrimaryDisplay(), &display_bounds);
} else {
/* Platform allows windows to be placed out of bounds */
maxxVariation = 4;
maxyVariation = 4;
SDL_GetDisplayBounds(SDL_GetPrimaryDisplay(), &display_bounds);
}
for (xVariation = 0; xVariation < maxxVariation; xVariation++) {
for (yVariation = 0; yVariation < maxyVariation; yVariation++) {
switch (xVariation) {
default:
case 0:
/* Zero X Position */
desiredX = display_bounds.x > 0 ? display_bounds.x : 0;
break;
case 1:
/* Random X position inside screen */
desiredX = SDLTest_RandomIntegerInRange(display_bounds.x + 1, display_bounds.x + 100);
break;
case 2:
/* Random X position outside screen (positive) */
desiredX = SDLTest_RandomIntegerInRange(10000, 11000);
break;
case 3:
/* Random X position outside screen (negative) */
desiredX = SDLTest_RandomIntegerInRange(-1000, -100);
break;
}
switch (yVariation) {
default:
case 0:
/* Zero Y Position */
desiredY = display_bounds.y > 0 ? display_bounds.y : 0;
break;
case 1:
/* Random Y position inside screen */
desiredY = SDLTest_RandomIntegerInRange(display_bounds.y + 1, display_bounds.y + 100);
break;
case 2:
/* Random Y position outside screen (positive) */
desiredY = SDLTest_RandomIntegerInRange(10000, 11000);
break;
case 3:
/* Random Y position outside screen (negative) */
desiredY = SDLTest_RandomIntegerInRange(-1000, -100);
break;
}
/* Set position */
SDL_SetWindowPosition(window, desiredX, desiredY);
SDLTest_AssertPass("Call to SDL_SetWindowPosition(...,%d,%d)", desiredX, desiredY);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* Get position */
currentX = desiredX + 1;
currentY = desiredY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
if (desiredX == currentX && desiredY == currentY) {
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X position; expected: %d, got: %d", desiredX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y position; expected: %d, got: %d", desiredY, currentY);
} else {
bool hasEvent;
/* SDL_SetWindowPosition() and SDL_SetWindowSize() will make requests of the window manager and set the internal position and size,
* and then we get events signaling what actually happened, and they get passed on to the application if they're not what we expect. */
currentX = desiredX + 1;
currentY = desiredY + 1;
hasEvent = getPositionFromEvent(&currentX, &currentY);
SDLTest_AssertCheck(hasEvent == true, "Changing position was not honored by WM, checking present of SDL_EVENT_WINDOW_MOVED");
if (hasEvent) {
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X position is the position from SDL event; expected: %d, got: %d", desiredX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y position is the position from SDL event; expected: %d, got: %d", desiredY, currentY);
}
}
/* Get position X */
currentX = desiredX + 1;
SDL_GetWindowPosition(window, &currentX, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowPosition(&y=NULL)");
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X position; expected: %d, got: %d", desiredX, currentX);
/* Get position Y */
currentY = desiredY + 1;
SDL_GetWindowPosition(window, NULL, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition(&x=NULL)");
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y position; expected: %d, got: %d", desiredY, currentY);
}
}
null_tests:
/* Dummy call with both pointers NULL */
SDL_GetWindowPosition(window, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowPosition(&x=NULL,&y=NULL)");
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Set some 'magic' value for later check that nothing was changed */
referenceX = SDLTest_RandomSint32();
referenceY = SDLTest_RandomSint32();
currentX = referenceX;
currentY = referenceY;
desiredX = SDLTest_RandomSint32();
desiredY = SDLTest_RandomSint32();
/* Negative tests */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
SDL_GetWindowPosition(NULL, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition(window=NULL)");
SDLTest_AssertCheck(
currentX == referenceX && currentY == referenceY,
"Verify that content of X and Y pointers has not been modified; expected: %d,%d; got: %d,%d",
referenceX, referenceY,
currentX, currentY);
checkInvalidWindowError();
SDL_GetWindowPosition(NULL, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowPosition(NULL, NULL, NULL)");
checkInvalidWindowError();
SDL_SetWindowPosition(NULL, desiredX, desiredY);
SDLTest_AssertPass("Call to SDL_SetWindowPosition(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
/* Helper function that checks for an 'Invalid parameter' error */
static void checkInvalidParameterError(void)
{
const char *invalidParameterError = "Parameter";
const char *lastError;
lastError = SDL_GetError();
SDLTest_AssertPass("SDL_GetError()");
SDLTest_AssertCheck(lastError != NULL, "Verify error message is not NULL");
if (lastError != NULL) {
SDLTest_AssertCheck(SDL_strncmp(lastError, invalidParameterError, SDL_strlen(invalidParameterError)) == 0,
"SDL_GetError(): expected message starts with '%s', was message: '%s'",
invalidParameterError,
lastError);
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
}
}
/**
* Tests call to SDL_GetWindowSize and SDL_SetWindowSize
*
* \sa SDL_GetWindowSize
* \sa SDL_SetWindowSize
*/
static int SDLCALL video_getSetWindowSize(void *arg)
{
const char *title = "video_getSetWindowSize Test Window";
SDL_Window *window;
int result;
SDL_Rect display;
int maxwVariation, maxhVariation;
int wVariation, hVariation;
int referenceW, referenceH;
int currentW, currentH;
int desiredW, desiredH;
/* Get display bounds for size range */
result = SDL_GetDisplayUsableBounds(SDL_GetPrimaryDisplay(), &display);
SDLTest_AssertPass("SDL_GetDisplayUsableBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!result) {
return TEST_ABORTED;
}
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
SDL_GetWindowSize(window, &currentW, &currentH);
if (!SDL_SetWindowSize(window, currentW, currentH)) {
SDLTest_Log("Skipping window resize tests: %s reports window resizing as unsupported", SDL_GetCurrentVideoDriver());
goto null_tests;
}
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "windows") == 0 ||
SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) {
/* Platform clips window size to screen size */
maxwVariation = 4;
maxhVariation = 4;
} else {
/* Platform allows window size >= screen size */
maxwVariation = 5;
maxhVariation = 5;
}
for (wVariation = 0; wVariation < maxwVariation; wVariation++) {
for (hVariation = 0; hVariation < maxhVariation; hVariation++) {
switch (wVariation) {
default:
case 0:
/* 1 Pixel Wide */
desiredW = 1;
break;
case 1:
/* Random width inside screen */
desiredW = SDLTest_RandomIntegerInRange(1, 100);
break;
case 2:
/* Width 1 pixel smaller than screen */
desiredW = display.w - 1;
break;
case 3:
/* Width at screen size */
desiredW = display.w;
break;
case 4:
/* Width 1 pixel larger than screen */
desiredW = display.w + 1;
break;
}
switch (hVariation) {
default:
case 0:
/* 1 Pixel High */
desiredH = 1;
break;
case 1:
/* Random height inside screen */
desiredH = SDLTest_RandomIntegerInRange(1, 100);
break;
case 2:
/* Height 1 pixel smaller than screen */
desiredH = display.h - 1;
break;
case 3:
/* Height at screen size */
desiredH = display.h;
break;
case 4:
/* Height 1 pixel larger than screen */
desiredH = display.h + 1;
break;
}
/* Set size */
SDL_SetWindowSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowSize(...,%d,%d)", desiredW, desiredH);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* Get size */
currentW = desiredW + 1;
currentH = desiredH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
if (desiredW == currentW && desiredH == currentH) {
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
} else {
bool hasEvent;
/* SDL_SetWindowPosition() and SDL_SetWindowSize() will make requests of the window manager and set the internal position and size,
* and then we get events signaling what actually happened, and they get passed on to the application if they're not what we expect. */
currentW = desiredW + 1;
currentH = desiredH + 1;
hasEvent = getSizeFromEvent(&currentW, &currentH);
SDLTest_AssertCheck(hasEvent == true, "Changing size was not honored by WM, checking presence of SDL_EVENT_WINDOW_RESIZED");
if (hasEvent) {
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width is the one from SDL event; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height is the one from SDL event; expected: %d, got: %d", desiredH, currentH);
}
}
/* Get just width */
currentW = desiredW + 1;
SDL_GetWindowSize(window, &currentW, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowSize(&h=NULL)");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
/* Get just height */
currentH = desiredH + 1;
SDL_GetWindowSize(window, NULL, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize(&w=NULL)");
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
}
}
null_tests:
/* Dummy call with both pointers NULL */
SDL_GetWindowSize(window, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowSize(&w=NULL,&h=NULL)");
/* Negative tests for parameter input */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
for (desiredH = -2; desiredH < 2; desiredH++) {
for (desiredW = -2; desiredW < 2; desiredW++) {
if (desiredW <= 0 || desiredH <= 0) {
SDL_SetWindowSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowSize(...,%d,%d)", desiredW, desiredH);
checkInvalidParameterError();
}
}
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Set some 'magic' value for later check that nothing was changed */
referenceW = SDLTest_RandomSint32();
referenceH = SDLTest_RandomSint32();
currentW = referenceW;
currentH = referenceH;
desiredW = SDLTest_RandomSint32();
desiredH = SDLTest_RandomSint32();
/* Negative tests for window input */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
SDL_GetWindowSize(NULL, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize(window=NULL)");
SDLTest_AssertCheck(
currentW == referenceW && currentH == referenceH,
"Verify that content of W and H pointers has not been modified; expected: %d,%d; got: %d,%d",
referenceW, referenceH,
currentW, currentH);
checkInvalidWindowError();
SDL_GetWindowSize(NULL, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowSize(NULL, NULL, NULL)");
checkInvalidWindowError();
SDL_SetWindowSize(NULL, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowSize(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
/**
* Tests call to SDL_GetWindowMinimumSize and SDL_SetWindowMinimumSize
*
*/
static int SDLCALL video_getSetWindowMinimumSize(void *arg)
{
const char *title = "video_getSetWindowMinimumSize Test Window";
SDL_Window *window;
int result;
SDL_Rect display;
int wVariation, hVariation;
int referenceW, referenceH;
int currentW, currentH;
int desiredW = 1;
int desiredH = 1;
/* Get display bounds for size range */
result = SDL_GetDisplayBounds(SDL_GetPrimaryDisplay(), &display);
SDLTest_AssertPass("SDL_GetDisplayBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!result) {
return TEST_ABORTED;
}
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
for (wVariation = 0; wVariation < 5; wVariation++) {
for (hVariation = 0; hVariation < 5; hVariation++) {
switch (wVariation) {
case 0:
/* 1 Pixel Wide */
desiredW = 1;
break;
case 1:
/* Random width inside screen */
desiredW = SDLTest_RandomIntegerInRange(2, display.w - 1);
break;
case 2:
/* Width at screen size */
desiredW = display.w;
break;
}
switch (hVariation) {
case 0:
/* 1 Pixel High */
desiredH = 1;
break;
case 1:
/* Random height inside screen */
desiredH = SDLTest_RandomIntegerInRange(2, display.h - 1);
break;
case 2:
/* Height at screen size */
desiredH = display.h;
break;
case 4:
/* Height 1 pixel larger than screen */
desiredH = display.h + 1;
break;
}
/* Set size */
SDL_SetWindowMinimumSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMinimumSize(...,%d,%d)", desiredW, desiredH);
/* Get size */
currentW = desiredW + 1;
currentH = desiredH + 1;
SDL_GetWindowMinimumSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize()");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
/* Get just width */
currentW = desiredW + 1;
SDL_GetWindowMinimumSize(window, &currentW, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize(&h=NULL)");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentH);
/* Get just height */
currentH = desiredH + 1;
SDL_GetWindowMinimumSize(window, NULL, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize(&w=NULL)");
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredW, currentH);
}
}
/* Dummy call with both pointers NULL */
SDL_GetWindowMinimumSize(window, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize(&w=NULL,&h=NULL)");
/* Negative tests for parameter input */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
for (desiredH = -2; desiredH < 2; desiredH++) {
for (desiredW = -2; desiredW < 2; desiredW++) {
if (desiredW < 0 || desiredH < 0) {
SDL_SetWindowMinimumSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMinimumSize(...,%d,%d)", desiredW, desiredH);
checkInvalidParameterError();
}
}
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Set some 'magic' value for later check that nothing was changed */
referenceW = SDLTest_RandomSint32();
referenceH = SDLTest_RandomSint32();
currentW = referenceW;
currentH = referenceH;
desiredW = SDLTest_RandomSint32();
desiredH = SDLTest_RandomSint32();
/* Negative tests for window input */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
SDL_GetWindowMinimumSize(NULL, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize(window=NULL)");
SDLTest_AssertCheck(
currentW == referenceW && currentH == referenceH,
"Verify that content of W and H pointers has not been modified; expected: %d,%d; got: %d,%d",
referenceW, referenceH,
currentW, currentH);
checkInvalidWindowError();
SDL_GetWindowMinimumSize(NULL, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMinimumSize(NULL, NULL, NULL)");
checkInvalidWindowError();
SDL_SetWindowMinimumSize(NULL, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMinimumSize(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
/**
* Tests call to SDL_GetWindowMaximumSize and SDL_SetWindowMaximumSize
*
*/
static int SDLCALL video_getSetWindowMaximumSize(void *arg)
{
const char *title = "video_getSetWindowMaximumSize Test Window";
SDL_Window *window;
int result;
SDL_Rect display;
int wVariation, hVariation;
int referenceW, referenceH;
int currentW, currentH;
int desiredW = 0, desiredH = 0;
/* Get display bounds for size range */
result = SDL_GetDisplayBounds(SDL_GetPrimaryDisplay(), &display);
SDLTest_AssertPass("SDL_GetDisplayBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!result) {
return TEST_ABORTED;
}
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
for (wVariation = 0; wVariation < 3; wVariation++) {
for (hVariation = 0; hVariation < 3; hVariation++) {
switch (wVariation) {
case 0:
/* 1 Pixel Wide */
desiredW = 1;
break;
case 1:
/* Random width inside screen */
desiredW = SDLTest_RandomIntegerInRange(2, display.w - 1);
break;
case 2:
/* Width at screen size */
desiredW = display.w;
break;
}
switch (hVariation) {
case 0:
/* 1 Pixel High */
desiredH = 1;
break;
case 1:
/* Random height inside screen */
desiredH = SDLTest_RandomIntegerInRange(2, display.h - 1);
break;
case 2:
/* Height at screen size */
desiredH = display.h;
break;
}
/* Set size */
SDL_SetWindowMaximumSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMaximumSize(...,%d,%d)", desiredW, desiredH);
/* Get size */
currentW = desiredW + 1;
currentH = desiredH + 1;
SDL_GetWindowMaximumSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize()");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
/* Get just width */
currentW = desiredW + 1;
SDL_GetWindowMaximumSize(window, &currentW, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize(&h=NULL)");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentH);
/* Get just height */
currentH = desiredH + 1;
SDL_GetWindowMaximumSize(window, NULL, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize(&w=NULL)");
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredW, currentH);
}
}
/* Dummy call with both pointers NULL */
SDL_GetWindowMaximumSize(window, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize(&w=NULL,&h=NULL)");
/* Negative tests for parameter input */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
for (desiredH = -2; desiredH < 2; desiredH++) {
for (desiredW = -2; desiredW < 2; desiredW++) {
if (desiredW < 0 || desiredH < 0) {
SDL_SetWindowMaximumSize(window, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMaximumSize(...,%d,%d)", desiredW, desiredH);
checkInvalidParameterError();
}
}
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Set some 'magic' value for later check that nothing was changed */
referenceW = SDLTest_RandomSint32();
referenceH = SDLTest_RandomSint32();
currentW = referenceW;
currentH = referenceH;
desiredW = SDLTest_RandomSint32();
desiredH = SDLTest_RandomSint32();
/* Negative tests */
SDL_ClearError();
SDLTest_AssertPass("Call to SDL_ClearError()");
SDL_GetWindowMaximumSize(NULL, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize(window=NULL)");
SDLTest_AssertCheck(
currentW == referenceW && currentH == referenceH,
"Verify that content of W and H pointers has not been modified; expected: %d,%d; got: %d,%d",
referenceW, referenceH,
currentW, currentH);
checkInvalidWindowError();
SDL_GetWindowMaximumSize(NULL, NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowMaximumSize(NULL, NULL, NULL)");
checkInvalidWindowError();
SDL_SetWindowMaximumSize(NULL, desiredW, desiredH);
SDLTest_AssertPass("Call to SDL_SetWindowMaximumSize(window=NULL)");
checkInvalidWindowError();
return TEST_COMPLETED;
}
/**
* Tests call to SDL_SetWindowData and SDL_GetWindowData
*
* \sa SDL_SetWindowData
* \sa SDL_GetWindowData
*/
static int SDLCALL video_getSetWindowData(void *arg)
{
int returnValue = TEST_COMPLETED;
const char *title = "video_setGetWindowData Test Window";
SDL_Window *window;
const char *referenceName = "TestName";
const char *name = "TestName";
const char *referenceName2 = "TestName2";
const char *name2 = "TestName2";
int datasize;
char *referenceUserdata = NULL;
char *userdata = NULL;
char *referenceUserdata2 = NULL;
char *userdata2 = NULL;
char *result;
int iteration;
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
/* Create testdata */
datasize = SDLTest_RandomIntegerInRange(1, 32);
referenceUserdata = SDLTest_RandomAsciiStringOfSize(datasize);
if (!referenceUserdata) {
returnValue = TEST_ABORTED;
goto cleanup;
}
userdata = SDL_strdup(referenceUserdata);
if (!userdata) {
returnValue = TEST_ABORTED;
goto cleanup;
}
datasize = SDLTest_RandomIntegerInRange(1, 32);
referenceUserdata2 = SDLTest_RandomAsciiStringOfSize(datasize);
if (!referenceUserdata2) {
returnValue = TEST_ABORTED;
goto cleanup;
}
userdata2 = SDL_strdup(referenceUserdata2);
if (!userdata2) {
returnValue = TEST_ABORTED;
goto cleanup;
}
/* Get non-existent data */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s)", name);
SDLTest_AssertCheck(result == NULL, "Validate that result is NULL");
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
/* Set data */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, userdata);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,%s)", name, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
/* Get data (twice) */
for (iteration = 1; iteration <= 2; iteration++) {
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s) [iteration %d]", name, iteration);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, result) == 0, "Validate that correct result was returned; expected: %s, got: %s", referenceUserdata, result);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
}
/* Set data again twice */
for (iteration = 1; iteration <= 2; iteration++) {
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, userdata);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,%s) [iteration %d]", name, userdata, iteration);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
}
/* Get data again */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s) [again]", name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, result) == 0, "Validate that correct result was returned; expected: %s, got: %s", referenceUserdata, result);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
/* Set data with new data */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, userdata2);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,%s) [new userdata]", name, userdata2);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata2, userdata2) == 0, "Validate that userdata2 was not changed, expected: %s, got: %s", referenceUserdata2, userdata2);
/* Set data with new data again */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, userdata2);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,%s) [new userdata again]", name, userdata2);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata2, userdata2) == 0, "Validate that userdata2 was not changed, expected: %s, got: %s", referenceUserdata2, userdata2);
/* Get new data */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s)", name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata2, result) == 0, "Validate that correct result was returned; expected: %s, got: %s", referenceUserdata2, result);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
/* Set data with NULL to clear */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,NULL)", name);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata2, userdata2) == 0, "Validate that userdata2 was not changed, expected: %s, got: %s", referenceUserdata2, userdata2);
/* Set data with NULL to clear again */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,NULL) [again]", name);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata2, userdata2) == 0, "Validate that userdata2 was not changed, expected: %s, got: %s", referenceUserdata2, userdata2);
/* Get non-existent data */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s)", name);
SDLTest_AssertCheck(result == NULL, "Validate that result is NULL");
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
/* Get non-existent data new name */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name2, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s)", name2);
SDLTest_AssertCheck(result == NULL, "Validate that result is NULL");
SDLTest_AssertCheck(SDL_strcmp(referenceName2, name2) == 0, "Validate that name2 was not changed, expected: %s, got: %s", referenceName2, name2);
/* Set data (again) */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), name, userdata);
SDLTest_AssertPass("Call to SDL_SetWindowData(...%s,%s) [again, after clear]", name, userdata);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, userdata) == 0, "Validate that userdata was not changed, expected: %s, got: %s", referenceUserdata, userdata);
/* Get data (again) */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), name, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(..,%s) [again, after clear]", name);
SDLTest_AssertCheck(SDL_strcmp(referenceUserdata, result) == 0, "Validate that correct result was returned; expected: %s, got: %s", referenceUserdata, result);
SDLTest_AssertCheck(SDL_strcmp(referenceName, name) == 0, "Validate that name was not changed, expected: %s, got: %s", referenceName, name);
/* Set data with NULL name, valid userdata */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), NULL, userdata);
SDLTest_AssertPass("Call to SDL_SetWindowData(name=NULL)");
checkInvalidParameterError();
/* Set data with empty name, valid userdata */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), "", userdata);
SDLTest_AssertPass("Call to SDL_SetWindowData(name='')");
checkInvalidParameterError();
/* Set data with NULL name, NULL userdata */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), NULL, NULL);
SDLTest_AssertPass("Call to SDL_SetWindowData(name=NULL,userdata=NULL)");
checkInvalidParameterError();
/* Set data with empty name, NULL userdata */
SDL_SetPointerProperty(SDL_GetWindowProperties(window), "", NULL);
SDLTest_AssertPass("Call to SDL_SetWindowData(name='',userdata=NULL)");
checkInvalidParameterError();
/* Get data with NULL name */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), NULL, NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(name=NULL)");
SDLTest_AssertCheck(result == NULL, "Validate that result is NULL");
/* Get data with empty name */
result = (char *)SDL_GetPointerProperty(SDL_GetWindowProperties(window), "", NULL);
SDLTest_AssertPass("Call to SDL_GetWindowData(name='')");
SDLTest_AssertCheck(result == NULL, "Validate that result is NULL");
/* Clean up */
destroyVideoSuiteTestWindow(window);
cleanup:
SDL_free(referenceUserdata);
SDL_free(referenceUserdata2);
SDL_free(userdata);
SDL_free(userdata2);
return returnValue;
}
/**
* Tests the functionality of the SDL_WINDOWPOS_CENTERED_DISPLAY along with SDL_WINDOW_FULLSCREEN.
*
* Especially useful when run on a multi-monitor system with different DPI scales per monitor,
* to test that the window size is maintained when moving between monitors.
*
* As the Wayland windowing protocol does not allow application windows to control their position in the
* desktop space, coupled with the general asynchronous nature of Wayland compositors, the positioning
* tests don't work in windowed mode and are unreliable in fullscreen mode, thus are disabled when using
* the Wayland video driver. All that can be done is check that the windows are the expected size.
*/
static int SDLCALL video_setWindowCenteredOnDisplay(void *arg)
{
SDL_DisplayID *displays;
SDL_Window *window;
const char *title = "video_setWindowCenteredOnDisplay Test Window";
int x, y, w, h;
int xVariation, yVariation;
int displayNum;
int result;
SDL_Rect display0, display1;
const char *video_driver = SDL_GetCurrentVideoDriver();
bool video_driver_is_wayland = SDL_strcmp(video_driver, "wayland") == 0;
bool video_driver_is_emscripten = SDL_strcmp(video_driver, "emscripten") == 0;
displays = SDL_GetDisplays(&displayNum);
if (displays) {
/* Get display bounds */
result = SDL_GetDisplayUsableBounds(displays[0 % displayNum], &display0);
SDLTest_AssertPass("SDL_GetDisplayUsableBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!result) {
return TEST_ABORTED;
}
result = SDL_GetDisplayUsableBounds(displays[1 % displayNum], &display1);
SDLTest_AssertPass("SDL_GetDisplayUsableBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!result) {
return TEST_ABORTED;
}
for (xVariation = 0; xVariation < 2; xVariation++) {
for (yVariation = 0; yVariation < 2; yVariation++) {
int currentX = 0, currentY = 0;
int currentW = 0, currentH = 0;
int expectedX = 0, expectedY = 0;
int currentDisplay;
int expectedDisplay;
SDL_Rect expectedDisplayRect, expectedFullscreenRect;
SDL_PropertiesID props;
/* xVariation is the display we start on */
expectedDisplay = displays[xVariation % displayNum];
x = SDL_WINDOWPOS_CENTERED_DISPLAY(expectedDisplay);
y = SDL_WINDOWPOS_CENTERED_DISPLAY(expectedDisplay);
w = SDLTest_RandomIntegerInRange(640, 800);
h = SDLTest_RandomIntegerInRange(400, 600);
expectedDisplayRect = (xVariation == 0) ? display0 : display1;
expectedX = (expectedDisplayRect.x + ((expectedDisplayRect.w - w) / 2));
expectedY = (expectedDisplayRect.y + ((expectedDisplayRect.h - h) / 2));
props = SDL_CreateProperties();
SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, title);
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_X_NUMBER, x);
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_Y_NUMBER, y);
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER, w);
SDL_SetNumberProperty(props, SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER, h);
SDL_SetBooleanProperty(props, SDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN, true);
window = SDL_CreateWindowWithProperties(props);
SDL_DestroyProperties(props);
SDLTest_AssertPass("Call to SDL_CreateWindow('Title',%d,%d,%d,%d,SHOWN)", x, y, w, h);
SDLTest_AssertCheck(window != NULL, "Validate that returned window is not NULL");
/* Wayland windows require that a frame be presented before they are fully mapped and visible onscreen. */
if (video_driver_is_wayland) {
SDL_Renderer *renderer = SDL_CreateRenderer(window, NULL);
if (renderer) {
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
/* Some desktops don't display the window immediately after presentation,
* so delay to give the window time to actually appear on the desktop.
*/
SDL_Delay(100);
} else {
SDLTest_Log("Unable to create a renderer, tests may fail under Wayland");
}
}
/* Check the window is centered on the requested display */
currentDisplay = SDL_GetDisplayForWindow(window);
SDL_GetWindowSize(window, &currentW, &currentH);
SDL_GetWindowPosition(window, &currentX, &currentY);
if (video_driver_is_wayland) {
SDLTest_Log("Skipping display ID validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentDisplay == expectedDisplay, "Validate display ID (current: %d, expected: %d)", currentDisplay, expectedDisplay);
}
if (video_driver_is_emscripten) {
SDLTest_Log("Skipping window size validation: %s driver does not support window resizing", video_driver);
} else {
SDLTest_AssertCheck(currentW == w, "Validate width (current: %d, expected: %d)", currentW, w);
SDLTest_AssertCheck(currentH == h, "Validate height (current: %d, expected: %d)", currentH, h);
}
if (video_driver_is_emscripten || video_driver_is_wayland) {
SDLTest_Log("Skipping window position validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentX == expectedX, "Validate x (current: %d, expected: %d)", currentX, expectedX);
SDLTest_AssertCheck(currentY == expectedY, "Validate y (current: %d, expected: %d)", currentY, expectedY);
}
/* Enter fullscreen desktop */
SDL_SetWindowPosition(window, x, y);
result = SDL_SetWindowFullscreen(window, true);
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* Check we are filling the full display */
currentDisplay = SDL_GetDisplayForWindow(window);
SDL_GetWindowSize(window, &currentW, &currentH);
SDL_GetWindowPosition(window, &currentX, &currentY);
/* Get the expected fullscreen rect.
* This needs to be queried after window creation and positioning as some drivers can alter the
* usable bounds based on the window scaling mode.
*/
result = SDL_GetDisplayBounds(expectedDisplay, &expectedFullscreenRect);
SDLTest_AssertPass("SDL_GetDisplayBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (video_driver_is_wayland) {
SDLTest_Log("Skipping display ID validation: Wayland driver does not support window positioning");
} else {
SDLTest_AssertCheck(currentDisplay == expectedDisplay, "Validate display ID (current: %d, expected: %d)", currentDisplay, expectedDisplay);
}
if (video_driver_is_emscripten) {
SDLTest_Log("Skipping window position validation: %s driver does not support window resizing", video_driver);
} else {
SDLTest_AssertCheck(currentW == expectedFullscreenRect.w, "Validate width (current: %d, expected: %d)", currentW, expectedFullscreenRect.w);
SDLTest_AssertCheck(currentH == expectedFullscreenRect.h, "Validate height (current: %d, expected: %d)", currentH, expectedFullscreenRect.h);
}
if (video_driver_is_emscripten || video_driver_is_wayland) {
SDLTest_Log("Skipping window position validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentX == expectedFullscreenRect.x, "Validate x (current: %d, expected: %d)", currentX, expectedFullscreenRect.x);
SDLTest_AssertCheck(currentY == expectedFullscreenRect.y, "Validate y (current: %d, expected: %d)", currentY, expectedFullscreenRect.y);
}
/* Leave fullscreen desktop */
result = SDL_SetWindowFullscreen(window, false);
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* Check window was restored correctly */
currentDisplay = SDL_GetDisplayForWindow(window);
SDL_GetWindowSize(window, &currentW, &currentH);
SDL_GetWindowPosition(window, &currentX, &currentY);
if (video_driver_is_wayland) {
SDLTest_Log("Skipping display ID validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentDisplay == expectedDisplay, "Validate display index (current: %d, expected: %d)", currentDisplay, expectedDisplay);
}
if (video_driver_is_emscripten) {
SDLTest_Log("Skipping window position validation: %s driver does not support window resizing", video_driver);
} else {
SDLTest_AssertCheck(currentW == w, "Validate width (current: %d, expected: %d)", currentW, w);
SDLTest_AssertCheck(currentH == h, "Validate height (current: %d, expected: %d)", currentH, h);
}
if (video_driver_is_emscripten || video_driver_is_wayland) {
SDLTest_Log("Skipping window position validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentX == expectedX, "Validate x (current: %d, expected: %d)", currentX, expectedX);
SDLTest_AssertCheck(currentY == expectedY, "Validate y (current: %d, expected: %d)", currentY, expectedY);
}
/* Center on display yVariation, and check window properties */
expectedDisplay = displays[yVariation % displayNum];
x = SDL_WINDOWPOS_CENTERED_DISPLAY(expectedDisplay);
y = SDL_WINDOWPOS_CENTERED_DISPLAY(expectedDisplay);
expectedDisplayRect = (yVariation == 0) ? display0 : display1;
expectedX = (expectedDisplayRect.x + ((expectedDisplayRect.w - w) / 2));
expectedY = (expectedDisplayRect.y + ((expectedDisplayRect.h - h) / 2));
SDL_SetWindowPosition(window, x, y);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
currentDisplay = SDL_GetDisplayForWindow(window);
SDL_GetWindowSize(window, &currentW, &currentH);
SDL_GetWindowPosition(window, &currentX, &currentY);
if (video_driver_is_wayland) {
SDLTest_Log("Skipping display ID validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentDisplay == expectedDisplay, "Validate display ID (current: %d, expected: %d)", currentDisplay, expectedDisplay);
}
if (video_driver_is_emscripten) {
SDLTest_Log("Skipping window position validation: %s driver does not support window resizing", video_driver);
} else {
SDLTest_AssertCheck(currentW == w, "Validate width (current: %d, expected: %d)", currentW, w);
SDLTest_AssertCheck(currentH == h, "Validate height (current: %d, expected: %d)", currentH, h);
}
if (video_driver_is_emscripten || video_driver_is_wayland) {
SDLTest_Log("Skipping window position validation: %s driver does not support window positioning", video_driver);
} else {
SDLTest_AssertCheck(currentX == expectedX, "Validate x (current: %d, expected: %d)", currentX, expectedX);
SDLTest_AssertCheck(currentY == expectedY, "Validate y (current: %d, expected: %d)", currentY, expectedY);
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
}
}
SDL_free(displays);
}
return TEST_COMPLETED;
}
/**
* Tests calls to SDL_MaximizeWindow(), SDL_RestoreWindow(), and SDL_SetWindowFullscreen(),
* interspersed with calls to set the window size and position, and verifies the flags,
* sizes, and positions of maximized, fullscreen, and restored windows.
*
* NOTE: This test is good on Mac, Win32, GNOME, and KDE (Wayland and X11). Other *nix
* desktops, particularly tiling desktops, may not support the expected behavior,
* so don't be surprised if this fails.
*/
static int SDLCALL video_getSetWindowState(void *arg)
{
const char *title = "video_getSetWindowState Test Window";
SDL_Window *window;
int result;
SDL_Rect display;
SDL_WindowFlags flags;
int windowedX, windowedY;
int currentX, currentY;
int desiredX = 0, desiredY = 0;
int windowedW, windowedH;
int currentW, currentH;
int desiredW = 0, desiredH = 0;
SDL_WindowFlags skipFlags = 0;
const bool restoreHint = SDL_GetHintBoolean("SDL_BORDERLESS_RESIZABLE_STYLE", true);
const bool skipPos = SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0;
/* This test is known to be good only on GNOME and KDE. At the time of writing, Weston seems to have maximize related bugs
* that prevent it from running correctly (no configure events are received when unsetting maximize), and tiling window
* managers such as Sway have fundamental behavioral differences that conflict with it.
*
* Other desktops can be enabled in the future as required.
*/
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0 || SDL_strcmp(SDL_GetCurrentVideoDriver(), "x11") == 0) {
const char *desktop = SDL_GetEnvironmentVariable(SDL_GetEnvironment(), "XDG_CURRENT_DESKTOP");
if (SDL_strcmp(desktop, "GNOME") != 0 && SDL_strcmp(desktop, "KDE") != 0) {
SDLTest_Log("Skipping test video_getSetWindowState: desktop environment %s not supported", desktop);
return TEST_SKIPPED;
}
}
/* Win32 borderless windows are not resizable by default and need this undocumented hint */
SDL_SetHint("SDL_BORDERLESS_RESIZABLE_STYLE", "1");
/* Call against new test window */
window = createVideoSuiteTestWindow(title);
if (!window) {
return TEST_ABORTED;
}
SDL_GetWindowSize(window, &windowedW, &windowedH);
SDLTest_AssertPass("SDL_GetWindowSize()");
SDL_GetWindowPosition(window, &windowedX, &windowedY);
SDLTest_AssertPass("SDL_GetWindowPosition()");
if (skipPos) {
SDLTest_Log("Skipping positioning tests: %s reports window positioning as unsupported", SDL_GetCurrentVideoDriver());
}
/* Maximize and check the dimensions */
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
if (!result) {
SDLTest_Log("Skipping state transition tests: %s reports window maximizing as unsupported", SDL_GetCurrentVideoDriver());
skipFlags |= SDL_WINDOW_MAXIMIZED;
goto minimize_test;
}
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(flags & SDL_WINDOW_MAXIMIZED, "Verify the `SDL_WINDOW_MAXIMIZED` flag is set: %s", (flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
/* Check that the maximized window doesn't extend beyond the usable display bounds.
* FIXME: Maximizing Win32 borderless windows is broken, so this always fails.
* Skip it for now.
*/
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "windows") != 0) {
result = SDL_GetDisplayUsableBounds(SDL_GetDisplayForWindow(window), &display);
SDLTest_AssertPass("SDL_GetDisplayUsableBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
desiredW = display.w;
desiredH = display.h;
currentW = windowedW + 1;
currentH = windowedH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(currentW <= desiredW, "Verify returned width; expected: <= %d, got: %d", desiredW,
currentW);
SDLTest_AssertCheck(currentH <= desiredH, "Verify returned height; expected: <= %d, got: %d", desiredH,
currentH);
}
/* Restore and check the dimensions */
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
if (!skipPos) {
currentX = windowedX + 1;
currentY = windowedY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(windowedX == currentX, "Verify returned X coordinate; expected: %d, got: %d", windowedX, currentX);
SDLTest_AssertCheck(windowedY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", windowedY, currentY);
}
currentW = windowedW + 1;
currentH = windowedH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(windowedW == currentW, "Verify returned width; expected: %d, got: %d", windowedW, currentW);
SDLTest_AssertCheck(windowedH == currentH, "Verify returned height; expected: %d, got: %d", windowedH, currentH);
/* Maximize, then immediately restore */
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
/* Make sure the restored size and position matches the original windowed size and position. */
if (!skipPos) {
currentX = windowedX + 1;
currentY = windowedY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(windowedX == currentX, "Verify returned X coordinate; expected: %d, got: %d", windowedX, currentX);
SDLTest_AssertCheck(windowedY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", windowedY, currentY);
}
currentW = windowedW + 1;
currentH = windowedH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(windowedW == currentW, "Verify returned width; expected: %d, got: %d", windowedW, currentW);
SDLTest_AssertCheck(windowedH == currentH, "Verify returned height; expected: %d, got: %d", windowedH, currentH);
/* Maximize, then enter fullscreen */
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SetWindowFullscreen(window, true);
SDLTest_AssertPass("SDL_SetWindowFullscreen(true)");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(flags & SDL_WINDOW_FULLSCREEN, "Verify the `SDL_WINDOW_FULLSCREEN` flag is set: %s", (flags & SDL_WINDOW_FULLSCREEN) ? "true" : "false");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
/* Verify the fullscreen size and position */
result = SDL_GetDisplayBounds(SDL_GetDisplayForWindow(window), &display);
SDLTest_AssertPass("SDL_GetDisplayBounds()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!skipPos) {
desiredX = display.x;
desiredY = display.y;
currentX = windowedX + 1;
currentY = windowedY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X coordinate; expected: %d, got: %d", desiredX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", desiredY, currentY);
}
desiredW = display.w;
desiredH = display.h;
currentW = windowedW + 1;
currentH = windowedH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(currentW == desiredW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(currentH == desiredH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
/* Leave fullscreen and restore the window */
result = SDL_SetWindowFullscreen(window, false);
SDLTest_AssertPass("SDL_SetWindowFullscreen(false)");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
/* Make sure the restored size and position matches the original windowed size and position. */
if (!skipPos) {
currentX = windowedX + 1;
currentY = windowedY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(windowedX == currentX, "Verify returned X coordinate; expected: %d, got: %d", windowedX, currentX);
SDLTest_AssertCheck(windowedY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", windowedY, currentY);
}
currentW = windowedW + 1;
currentH = windowedH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(windowedW == currentW, "Verify returned width; expected: %d, got: %d", windowedW, currentW);
SDLTest_AssertCheck(windowedH == currentH, "Verify returned height; expected: %d, got: %d", windowedH, currentH);
/* Maximize, restore, and change size */
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
desiredW = windowedW + 10;
desiredH = windowedH + 10;
result = SDL_SetWindowSize(window, desiredW, desiredH);
SDLTest_AssertPass("SDL_SetWindowSize()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!skipPos) {
desiredX = windowedX + 10;
desiredY = windowedY + 10;
result = SDL_SetWindowPosition(window, desiredX, desiredY);
SDLTest_AssertPass("SDL_SetWindowPosition()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
}
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
if (!skipPos) {
currentX = desiredX + 1;
currentY = desiredY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X coordinate; expected: %d, got: %d", desiredX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", desiredY, currentY);
}
currentW = desiredW + 1;
currentH = desiredH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
/* Maximize, change size/position (should be ignored), and restore. */
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
desiredW = windowedW + 10;
desiredH = windowedH + 10;
result = SDL_SetWindowSize(window, desiredW, desiredH);
SDLTest_AssertPass("SDL_SetWindowSize()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!skipPos) {
desiredX = windowedX + 10;
desiredY = windowedY + 10;
result = SDL_SetWindowPosition(window, desiredX, desiredY);
SDLTest_AssertPass("SDL_SetWindowPosition()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
}
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
if (!skipPos) {
int previousX = desiredX + 1;
int previousY = desiredY + 1;
SDL_GetWindowPosition(window, &previousX, &previousY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X coordinate; expected: %d, got: %d", previousX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", previousY, currentY);
}
int previousW = desiredW + 1;
int previousH = desiredH + 1;
SDL_GetWindowSize(window, &previousW, &previousH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", previousW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", previousH, currentH);
/* Change size and position, maximize and restore */
desiredW = windowedW - 5;
desiredH = windowedH - 5;
result = SDL_SetWindowSize(window, desiredW, desiredH);
SDLTest_AssertPass("SDL_SetWindowSize()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
if (!skipPos) {
desiredX = windowedX + 5;
desiredY = windowedY + 5;
result = SDL_SetWindowPosition(window, desiredX, desiredY);
SDLTest_AssertPass("SDL_SetWindowPosition()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
}
result = SDL_MaximizeWindow(window);
SDLTest_AssertPass("SDL_MaximizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(!(flags & SDL_WINDOW_MAXIMIZED), "Verify that the `SDL_WINDOW_MAXIMIZED` flag is cleared: %s", !(flags & SDL_WINDOW_MAXIMIZED) ? "true" : "false");
if (!skipPos) {
currentX = desiredX + 1;
currentY = desiredY + 1;
SDL_GetWindowPosition(window, &currentX, &currentY);
SDLTest_AssertPass("Call to SDL_GetWindowPosition()");
SDLTest_AssertCheck(desiredX == currentX, "Verify returned X coordinate; expected: %d, got: %d", desiredX, currentX);
SDLTest_AssertCheck(desiredY == currentY, "Verify returned Y coordinate; expected: %d, got: %d", desiredY, currentY);
}
currentW = desiredW + 1;
currentH = desiredH + 1;
SDL_GetWindowSize(window, &currentW, &currentH);
SDLTest_AssertPass("Call to SDL_GetWindowSize()");
SDLTest_AssertCheck(desiredW == currentW, "Verify returned width; expected: %d, got: %d", desiredW, currentW);
SDLTest_AssertCheck(desiredH == currentH, "Verify returned height; expected: %d, got: %d", desiredH, currentH);
minimize_test:
/* Minimize */
result = SDL_MinimizeWindow(window);
if (result) {
SDLTest_AssertPass("SDL_MinimizeWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
result = SDL_SyncWindow(window);
SDLTest_AssertPass("SDL_SyncWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
flags = SDL_GetWindowFlags(window);
SDLTest_AssertPass("SDL_GetWindowFlags()");
SDLTest_AssertCheck(flags & SDL_WINDOW_MINIMIZED, "Verify that the `SDL_WINDOW_MINIMIZED` flag is set: %s", (flags & SDL_WINDOW_MINIMIZED) ? "true" : "false");
} else {
SDLTest_Log("Skipping minimize test: %s reports window minimizing as unsupported", SDL_GetCurrentVideoDriver());
skipFlags |= SDL_WINDOW_MINIMIZED;
}
/* Clean up */
destroyVideoSuiteTestWindow(window);
/* Restore the hint to the previous value */
SDL_SetHint("SDL_BORDERLESS_RESIZABLE_STYLE", restoreHint ? "1" : "0");
return skipFlags != (SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED) ? TEST_COMPLETED : TEST_SKIPPED;
}
static int SDLCALL video_createMinimized(void *arg)
{
const char *title = "video_createMinimized Test Window";
int result;
SDL_Window *window;
int windowedX, windowedY;
int windowedW, windowedH;
/* Call against new test window */
window = SDL_CreateWindow(title, 320, 200, SDL_WINDOW_MINIMIZED);
if (!window) {
return TEST_ABORTED;
}
SDL_GetWindowSize(window, &windowedW, &windowedH);
SDLTest_AssertPass("SDL_GetWindowSize()");
SDLTest_AssertCheck(windowedW > 0 && windowedH > 0, "Verify return value; expected: 320x200, got: %dx%d", windowedW, windowedH);
SDL_GetWindowSizeInPixels(window, &windowedW, &windowedH);
SDLTest_AssertPass("SDL_GetWindowSizeInPixels()");
SDLTest_AssertCheck(windowedW > 0 && windowedH > 0, "Verify return value; expected: > 0, got: %dx%d", windowedW, windowedH);
SDL_GetWindowPosition(window, &windowedX, &windowedY);
SDLTest_AssertPass("SDL_GetWindowPosition()");
SDLTest_AssertCheck(windowedX >= 0 && windowedY >= 0, "Verify return value; expected: >= 0, got: %d,%d", windowedX, windowedY);
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) {
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
} else {
SDLTest_Log("Requested minimized window on creation, but that isn't supported on this platform.");
}
SDL_DestroyWindow(window);
return TEST_COMPLETED;
}
static int SDLCALL video_createMaximized(void *arg)
{
const char *title = "video_createMaximized Test Window";
int result;
SDL_Window *window;
int windowedX, windowedY;
int windowedW, windowedH;
/* Call against new test window */
window = SDL_CreateWindow(title, 320, 200, SDL_WINDOW_MAXIMIZED);
if (!window) {
return TEST_ABORTED;
}
SDL_GetWindowSize(window, &windowedW, &windowedH);
SDLTest_AssertPass("SDL_GetWindowSize()");
SDLTest_AssertCheck(windowedW > 0 && windowedH > 0, "Verify return value; expected: 320x200, got: %dx%d", windowedW, windowedH);
SDL_GetWindowSizeInPixels(window, &windowedW, &windowedH);
SDLTest_AssertPass("SDL_GetWindowSizeInPixels()");
SDLTest_AssertCheck(windowedW > 0 && windowedH > 0, "Verify return value; expected: > 0, got: %dx%d", windowedW, windowedH);
SDL_GetWindowPosition(window, &windowedX, &windowedY);
SDLTest_AssertPass("SDL_GetWindowPosition()");
SDLTest_AssertCheck(windowedX >= 0 && windowedY >= 0, "Verify return value; expected: >= 0, got: %d,%d", windowedX, windowedY);
if (SDL_GetWindowFlags(window) & SDL_WINDOW_MAXIMIZED) {
result = SDL_RestoreWindow(window);
SDLTest_AssertPass("SDL_RestoreWindow()");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
} else {
SDLTest_Log("Requested maximized window on creation, but that isn't supported on this platform.");
}
SDL_DestroyWindow(window);
return TEST_COMPLETED;
}
/**
* Tests window surface functionality
*/
static int SDLCALL video_getWindowSurface(void *arg)
{
const char *title = "video_getWindowSurface Test Window";
SDL_Window *window;
SDL_Surface *surface;
SDL_Renderer *renderer;
const char *renderer_name = NULL;
int result;
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "dummy") == 0) {
renderer_name = SDL_SOFTWARE_RENDERER;
}
/* Make sure we're testing interaction with an accelerated renderer */
SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "1");
window = SDL_CreateWindow(title, 320, 320, 0);
SDLTest_AssertPass("Call to SDL_CreateWindow('Title',320,320,0)");
SDLTest_AssertCheck(window != NULL, "Validate that returned window is not NULL");
surface = SDL_GetWindowSurface(window);
SDLTest_AssertPass("Call to SDL_GetWindowSurface(window)");
SDLTest_AssertCheck(surface != NULL, "Validate that returned surface is not NULL");
SDLTest_AssertCheck(SDL_WindowHasSurface(window), "Validate that window has a surface");
result = SDL_UpdateWindowSurface(window);
SDLTest_AssertPass("Call to SDL_UpdateWindowSurface(window)");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
/* We shouldn't be able to create a renderer on a window with a surface */
renderer = SDL_CreateRenderer(window, renderer_name);
SDLTest_AssertPass("Call to SDL_CreateRenderer(window, %s)", renderer_name);
SDLTest_AssertCheck(renderer == NULL, "Validate that returned renderer is NULL");
result = SDL_DestroyWindowSurface(window);
SDLTest_AssertPass("Call to SDL_DestroyWindowSurface(window)");
SDLTest_AssertCheck(result == true, "Verify return value; expected: true, got: %d", result);
SDLTest_AssertCheck(!SDL_WindowHasSurface(window), "Validate that window does not have a surface");
/* We should be able to create a renderer on the window now */
renderer = SDL_CreateRenderer(window, renderer_name);
SDLTest_AssertPass("Call to SDL_CreateRenderer(window, %s)", renderer_name);
SDLTest_AssertCheck(renderer != NULL, "Validate that returned renderer is not NULL");
/* We should not be able to create a window surface now, unless it was created by the renderer */
if (!SDL_WindowHasSurface(window)) {
surface = SDL_GetWindowSurface(window);
SDLTest_AssertPass("Call to SDL_GetWindowSurface(window)");
SDLTest_AssertCheck(surface == NULL, "Validate that returned surface is NULL");
}
SDL_DestroyRenderer(renderer);
SDLTest_AssertPass("Call to SDL_DestroyRenderer(renderer)");
SDLTest_AssertCheck(!SDL_WindowHasSurface(window), "Validate that window does not have a surface");
/* We should be able to create a window surface again */
surface = SDL_GetWindowSurface(window);
SDLTest_AssertPass("Call to SDL_GetWindowSurface(window)");
SDLTest_AssertCheck(surface != NULL, "Validate that returned surface is not NULL");
SDLTest_AssertCheck(SDL_WindowHasSurface(window), "Validate that window has a surface");
/* Clean up */
SDL_DestroyWindow(window);
return TEST_COMPLETED;
}
/**
* Tests SDL_RaiseWindow
*/
static int SDLCALL video_raiseWindow(void *arg)
{
bool result;
SDL_Window *window;
SDLTest_AssertPass("SDL_SetWindowInputFocus is not supported on dummy and SDL2 wayland driver");
if (SDL_strcmp(SDL_GetCurrentVideoDriver(), "dummy") == 0 || SDL_strcmp(SDL_GetCurrentVideoDriver(), "wayland") == 0) {
return TEST_SKIPPED;
}
window = createVideoSuiteTestWindow("video_raiseWindow");
if (!window) {
return TEST_ABORTED;
}
SDLTest_AssertPass("About to call SDL_RaiseWindow(window)");
result = SDL_RaiseWindow(window);
SDLTest_AssertCheck(result, "Result is %d, expected 1 (%s)", result, SDL_GetError());
destroyVideoSuiteTestWindow(window);
return TEST_COMPLETED;
}
/* ================= Test References ================== */
/* Video test cases */
static const SDLTest_TestCaseReference videoTestEnableDisableScreensaver = {
video_enableDisableScreensaver, "video_enableDisableScreensaver", "Enable and disable screenaver while checking state", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestCreateWindowVariousSizes = {
video_createWindowVariousSizes, "video_createWindowVariousSizes", "Create windows with various sizes", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestCreateWindowVariousFlags = {
video_createWindowVariousFlags, "video_createWindowVariousFlags", "Create windows using various flags", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowFlags = {
video_getWindowFlags, "video_getWindowFlags", "Get window flags set during SDL_CreateWindow", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetFullscreenDisplayModes = {
video_getFullscreenDisplayModes, "video_getFullscreenDisplayModes", "Use SDL_GetFullscreenDisplayModes function to get number of display modes", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetClosestDisplayModeCurrentResolution = {
video_getClosestDisplayModeCurrentResolution, "video_getClosestDisplayModeCurrentResolution", "Use function to get closes match to requested display mode for current resolution", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetClosestDisplayModeRandomResolution = {
video_getClosestDisplayModeRandomResolution, "video_getClosestDisplayModeRandomResolution", "Use function to get closes match to requested display mode for random resolution", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowDisplayMode = {
video_getWindowDisplayMode, "video_getWindowDisplayMode", "Get window display mode", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowDisplayModeNegative = {
video_getWindowDisplayModeNegative, "video_getWindowDisplayModeNegative", "Get window display mode with invalid input", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowGrab = {
video_getSetWindowGrab, "video_getSetWindowGrab", "Checks input grab positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowID = {
video_getWindowId, "video_getWindowId", "Checks SDL_GetWindowID and SDL_GetWindowFromID", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowPixelFormat = {
video_getWindowPixelFormat, "video_getWindowPixelFormat", "Checks SDL_GetWindowPixelFormat", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowPosition = {
video_getSetWindowPosition, "video_getSetWindowPosition", "Checks SDL_GetWindowPosition and SDL_SetWindowPosition positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowSize = {
video_getSetWindowSize, "video_getSetWindowSize", "Checks SDL_GetWindowSize and SDL_SetWindowSize positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowMinimumSize = {
video_getSetWindowMinimumSize, "video_getSetWindowMinimumSize", "Checks SDL_GetWindowMinimumSize and SDL_SetWindowMinimumSize positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowMaximumSize = {
video_getSetWindowMaximumSize, "video_getSetWindowMaximumSize", "Checks SDL_GetWindowMaximumSize and SDL_SetWindowMaximumSize positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowData = {
video_getSetWindowData, "video_getSetWindowData", "Checks SDL_SetWindowData and SDL_GetWindowData positive and negative cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestSetWindowCenteredOnDisplay = {
video_setWindowCenteredOnDisplay, "video_setWindowCenteredOnDisplay", "Checks using SDL_WINDOWPOS_CENTERED_DISPLAY centers the window on a display", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetSetWindowState = {
video_getSetWindowState, "video_getSetWindowState", "Checks transitioning between windowed, minimized, maximized, and fullscreen states", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestCreateMinimized = {
video_createMinimized, "video_createMinimized", "Checks window state for windows created minimized", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestCreateMaximized = {
video_createMaximized, "video_createMaximized", "Checks window state for windows created maximized", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestGetWindowSurface = {
video_getWindowSurface, "video_getWindowSurface", "Checks window surface functionality", TEST_ENABLED
};
static const SDLTest_TestCaseReference videoTestRaiseWindow = {
video_raiseWindow, "video_raiseWindow", "Checks window focus", TEST_ENABLED
};
/* Sequence of Video test cases */
static const SDLTest_TestCaseReference *videoTests[] = {
&videoTestEnableDisableScreensaver,
&videoTestCreateWindowVariousSizes,
&videoTestCreateWindowVariousFlags,
&videoTestGetWindowFlags,
&videoTestGetFullscreenDisplayModes,
&videoTestGetClosestDisplayModeCurrentResolution,
&videoTestGetClosestDisplayModeRandomResolution,
&videoTestGetWindowDisplayMode,
&videoTestGetWindowDisplayModeNegative,
&videoTestGetSetWindowGrab,
&videoTestGetWindowID,
&videoTestGetWindowPixelFormat,
&videoTestGetSetWindowPosition,
&videoTestGetSetWindowSize,
&videoTestGetSetWindowMinimumSize,
&videoTestGetSetWindowMaximumSize,
&videoTestGetSetWindowData,
&videoTestSetWindowCenteredOnDisplay,
&videoTestGetSetWindowState,
&videoTestCreateMinimized,
&videoTestCreateMaximized,
&videoTestGetWindowSurface,
&videoTestRaiseWindow,
NULL
};
/* Video test suite (global) */
SDLTest_TestSuiteReference videoTestSuite = {
"Video",
NULL,
videoTests,
NULL
};