-
Notifications
You must be signed in to change notification settings - Fork 13
Changelog
Finalspace edited this page May 29, 2026
·
1 revision
- First stable release
- New input backend system decoupled from windowing, with multi-backend polling and merging
- New SDL-compatible gamepad mapping system with resolver callbacks and device enumeration
- New DirectInput backend on Windows and improved /dev/input/jsX backend on Linux
- New PulseAudio, PipeWire and OSS audio backends (OSS covers FreeBSD/NetBSD/OpenBSD/DragonFly)
- New WASAPI audio backend
- New date time API with UTC/local support and thread-safe queries
- New file/path helpers: append-binary, path normalization, safe size queries, safe string-to-int parsing
- New headless/no-window event pump for input-only applications
- Thread-safe error reporting (lock-free) and lock-free window event queue
- Improved type safety for opaque X11/Win32/POSIX handles with compile-time size checks
- Implemented missing X11 window surface (display API, clipboard, fullscreen rect, window state, resizable/floating, cursor query)
- Improved POSIX support (BSD/macOS version detection, thread-safe date time, separator-tolerant directory creation)
- Improved UNIX/BSD support
- Reworked and normalized API documentation across the header
- Numerous ABI, runtime-linking, and platform-specific bugfixes (X11, ALSA, OpenGL, Vulkan)
- Several breaking changes in string/path/window-title APIs (now return required size)
- Changed: fplEnforcePathSeparatorLen is now returning the total number of characters required or returns zero on errors
- Changed: fplEnforcePathSeparator is now returning the total number of characters required or returns zero on errors
- Changed: fplStringAppendLen is now returning the total number of characters required or returns zero on errors
- Changed: fplStringAppend is now returning the total number of characters required or returns zero on errors
- Changed: fplCopyStringLen is now returning the total number of characters required or returns zero on errors
- Changed: fplCopyString is now returning the total number of characters required or returns zero on errors
- Changed: fplGetWindowTitle is now returning the total number of characters required or returns zero on errors
- Changed: fplGetAudioDeviceInfo now returns a plain fplAudioDeviceInfo (no extended/supportedFormats variant — backend-reported lists were unreliable; use fplGetAudioHardwareFormat for the native format)
- Changed: Renamed fplInitFlags_GameController to fplInitFlags_Gamepad due to naming inconsisitency
- Changed: Renamed fplMemoryGetInfos to fplMemoryGetUsage
- Changed: fplGetCurrentThreadId() now returns uint64_t (was uint32_t) and fplThreadHandle.id widened to uint64_t to portably hold pthread_t
- Removed: struct fplAudioDeviceInfoExtended (rolled into fplAudioDeviceInfo)
- Removed: enum value fplAudioBackendType_Custom (no public custom-backend API)
- New: Added FPL_IS_C17, FPL_IS_C23 and FPL_IS_CPP23 detection
- New: Added macro FPL_CACHELINE_SIZE that detects the cacheline size from the detected CPU architectures
- New: Added macro fplIsMaskSet that returns true when a bit mask matches a specified bit value
- New: Added enum fplDateTimeType, that defines the types of date times, such as UTC or local
- New: Added enum fplDateTimeErrors, that defines the error flags that can happen due to date time construction or formattion
- New: Added struct fplDateTime, that stores a date time stamp with an included UTC offset
- New: Added struct fplDateTimeResult, that stores the components for displaying a date time
- New: Added struct fplDateTimeCreationResult, that stores the result of the function fplDateTimeCreate()
- New: Added function fplDateTimeQuery that returns a date time stamp, that allows the display in either local or UTC format
- New: Added function fplFormatDateTime that formats a fplDateTime into either a local or UTC date time components
- New: Added function fplDateTimeCreate that creates a fplDateTime from seperate date time components
- New: Added function fplFileAppendBinary() for opening a file for appending, that is useful for log-files and such
- New: Added function fplPathNormalize() for normalizing any partial path into a absolute path
- New: Added function fplTryStringToS32Len that is a more safe-method than to fplStringToS32
- New: Added function fplTryStringToS32 that is a more safe-method than to fplStringToS32
- New: Added macro FPL_MAX_VERSION_PART_LENGTH for the maximum length of a version part string
- New: Added init flags fplInitFlags_Keyboard, fplInitFlags_Mouse, fplInitFlags_Input
- New[#183]: Added macro fpl_extern_inline
- New[#190]: [Linux] Implemented fplMemoryGetUsage via sysinfo() and /proc/meminfo parsing
- New[#26]: [Unix/BSD] Implemented fplMemoryGetUsage via sysctl (hw.*, vm.*)
- New: [Unix/BSD] Implemented fplGetSystemLocale / fplGetUserLocale / fplGetInputLocale via setlocale + ISO-639 conversion (shared fpl__PosixLocaleToISO639 helper)
- Improved: Better documentation of the preprocessor setup blocks
- Improved: Better and consistent documentation of the entire public API
- Improved: Added fplStaticAssert checks in the non-opaque branch verifying that the real Win32/POSIX/X11 handle types fit into the opaque-branch buffers (catches portability breakage at compile time instead of corrupting memory at runtime)
- Improved: fplDateTime documentation now states explicitly that pre-1970 dates are intentionally not supported
- Improved: fplWideStringToUTF8String / fplUTF8StringToWideString now use wchar.h with mbrtowc / wcrtomb directly instead of doing redundant work
- Improved: Simplified fplPathCombine by removing all internal memory allocation
- Improved: [POSIX] Improved fplOSGetVersionInfos() by adding support for retrieving detailed version information on BSD/macOS/other Unix systems
- Improved: [POSIX] fplCPUGetCoreCount was not working/compiling in FreeBSD
- Fixed: Fixed duplicate platform includes
- Fixed: Fixed documentation typos and misspellings
- Fixed: fpLGetAlignmentOffset() was not guarding the alignment argument in all cases
- Fixed: fplS32ToString() was not handling negative values correctly
- Fixed: fplStringFormatArgs must always NUL-terminate even when the buffer is too small
- Fixed: fplStringFormat and fplStringFormatArgs was not implemented correctly due to its documentation rules
- Fixed: fplStringToS32Len and fplStringToS32 was not implemented correctly due to its documentation rules
- Fixed: Calls to fpl__AllocateTemporaryMemory use either fpl__MinAlignment or 16 or more
- Fixed: fplCPUID, fplCPURDTSC, fplCPUXCR0 was not detected on GCC/Clang
- Fixed: fplGetErrorCount / fplGetErrorByIndex / fplGetLastError and pushing of errors was not thread-safe
- Fixed: fplAlignAs was using a condition based macro, which is not supported for some compilers
- Fixed: FPL_CACHELINE_SIZE on PowerPC64 used defined(defined(FPL_ARCH_POWERPC64)) and never matched — PPC64 silently fell through to the 64-byte default instead of the intended 128
- Fixed: FPL_X86_CPU_INSTR_SET_LEVEL swapped the SSSE3 and SSE3 branches — Supplemental SSE3 was reported as SSE3 and vice versa
- Fixed: fplStaticAssert generated colliding identifiers because the token-paste used ##line_##counter (the literal token line_) instead of ##line##_##counter — multiple static asserts in the same translation unit redefined the same symbol
- Fixed[#183]: fpl_internal_inline was not compiling on GCC/Clang
- Fixed[#189]: [Linux] Remember and restore LC_ALL locale on linux startup/shutdown
- Fixed: [POSIX] FPL_NO_RUNTIME_LINKING did not compile - optional pthread functions (pthread_yield removed in glibc 2.34, pthread_timedjoin_np GNU extension) are now left null with caller fallback
- Fixed: [POSIX] FPL_NO_RUNTIME_LINKING semaphore loading - sem_* function assignments now cast to the FPL prototype, fixing the mismatch against the opaque fpl__POSIXSemaphoreHandle type
- Fixed: [Audio] ALSA/PulseAudio/PipeWire reported "api not loaded" under FPL_NO_RUNTIME_LINKING because the library handle is never set - the api pointer is now used as a loaded sentinel
- Fixed: [POSIX] FPL__POSIX_GET_FUNCTION_ADDRESS_OPTIONAL define was being set twice
- Fixed: [POSIX] fplDateTime functions were not thread-safe — now use localtime_r / gmtime_r
- Fixed: [POSIX] fplMemoryAllocate was not compiling in FreeBSD (MAP_ANONYMOUS vs MAP_ANON)
- Changed: Use fplIsMaskSet for all bit flags checks to make such checks more robust
- Changed: Ensure that std types has the correct sizes always using equals
- Changed: [POSIX] Disabled FPL_NO_PLATFORM_INCLUDES for pthread includes
- Changed: [BSD] Define __BSD_VISIBLE on BSD platforms
- Changed: [UNIX] Init/release platform now save and restore LC_ALL across startup/shutdown
- Removed: Removed ANDROID platform detection, because it was never supported in the first place
- New: [Unix] Added struct fplUnixSignalEvent
- New: [Unix] Implemented fplSignal* for Unix/BSD
- Changed: [POSIX] sched_getscheduler POSIX standard coverage check
- Removed: [POSIX] Removed unused pthread_setschedprio loader/typedef/API-table entry (not exported by FreeBSD libthr, never called by FPL)
- Fixed: [POSIX] Fixed pthread fpl__POSIXSemaphoreHandle was not used
- Fixed: [POSIX] fpl__PThreadLoadApi fails on missing pthread library in FreeBSD
- New: Added function fplFileTryGetSizeFromPath that returns a bool and writes the size to a uint64_t out parameter, disambiguating 0-byte files from errors
- New: Added function fplFileTryGetSizeFromHandle that returns a bool and writes the size to a uint64_t out parameter, disambiguating 0-byte files from errors
- New: [Win32] Implemented function fplFileAppendBinary() for Win32 API
- New: [POSIX] Implemented function fplFileAppendBinary() for POSIX Unix API
- New: [Win32] Implemented function fplPathNormalize() for Win32 API
- New: [POSIX] Implemented function fplPathNormalize() for POSIX Unix API
- Changed: fplFileWriteBlock*() changed to const for the source argument
- Changed: fplExtractFilePath return type changed from int to size_t
- Changed: [POSIX] st_atim vs st_atime fallback detection for older POSIX
- Fixed: fplDirectoryListBegin lifetime issue — path and filter are now copied into fpl__InternalFileRootInfo buffers instead of held by reference
- Fixed: [POSIX] fplDirectoriesCreate was not separator-tolerant
- Fixed: [BSD] fplGetExecutableFilePath returned 0 on FreeBSD/DragonFly (procfs not mounted) — now uses sysctl(KERN_PROC_PATHNAME) before falling back to /proc
- Fixed: [Win32] fplFileSetPosition32 / fplFileGetSizeFromPath32 / fplFileGetSizeFromHandle32 was not using the best suitable API function
- Fixed: [Win32] GetModuleFileNameW and SHGetFolderPathW return values were not error-checked
- Fixed: [POSIX] dirint.h and sched.h was not included always
- Fixed[#184]: [POSIX] fplDirectoriesCreate() does not create parent sub-directories
- New: [X11] Implemented fplSetWindowCursorEnabled
- New: [X11] Implemented fplIsWindowResizable / fplSetWindowResizeable
- New: [X11] Implemented fplIsWindowFloating / fplSetWindowFloating
- New: [X11] Implemented fplGetWindowState / fplSetWindowState
- New: [X11] Implemented fplSetWindowFullscreenRect
- New: [X11] Implemented fplGetClipboardText / fplSetClipboardText (with INCR/timeout handling)
- New: [X11] Implemented fplQueryCursorPosition
- New: [X11] Implemented display API: fplGetDisplayCount, fplGetDisplays, fplGetPrimaryDisplay, fplGetWindowDisplay, fplGetDisplayFromPosition, fplGetDisplayModes
- Improved[#176]: Made internal event queue thread-safe using a lock-free push/pop linear buffer
- Improved: [X11] fpl__X11Display / Visual / GC / Image are now forward-declared incomplete struct types instead of typedef void, so fpl__X11Display * is a distinct, type-safe pointer rather than an alias for void *
- Fixed: [Win32] Fixed last event from event queue was never used, when there is no events from the window
- Fixed: [Win32] Lost/Got focus event was not detected properly
- Fixed: [Win32] fpl__Win32EnterFullscreen assumed (0,0) origin in resolution-change path — now anchors to xpos/ypos or target monitor origin (multi-monitor safe)
- Fixed: [Win32] fpl__Win32EnterFullscreen non-resolution-change path wrote ypos+height into windowRect.top instead of windowRect.bottom
- Fixed: [X11] Fixed last event from event queue was never used, when there is no events from the window
- Fixed: [X11] Fixed window support was not disabled when X11 is not present
- Fixed: [X11] Fixed fplPollEvent() was not handling the events properly, resulting in not processing any events anymore
- Fixed: [X11] Fixed ClientMessage for Atom netWMPing was not calling XFlush
- Fixed: [X11] Fixed wrong X11 type aliases
- Fixed: [X11] fpl__X11Window opaque pointer was wrong sized
- Fixed: [X11] FPL__FUNC_X11_XOpenDisplay vs XOpenDisplay ABI mismatch
- Fixed: [X11] FPL__FUNC_X11_XSetErrorHandler vs XSetErrorHandler ABI mismatch
- Fixed: [X11] fpl__X11Display vs Display and fpl__X11Visual vs Visual type mismatches
- Fixed: [X11] Compile errors when using opaque X11 types
- Fixed: [X11] fplQueryCursorPosition returned window-relative coords instead of screen-relative; now matches Win32 GetCursorPos by returning root-window coords
- Fixed: [X11] fplQueryCursorPosition was compiled outside FPL__ENABLE_WINDOW guard, breaking window-disabled builds
- Fixed: [X11] FPL_SUBPLATFORM_X11 was set, even when X11 was not available
- Fixed: [X11] NET_WM_ICON pixel packing promoted uint8_t operands to int before shifting — alpha/red values >= 128 overflowed the signed int (UB) and could corrupt the icon; bytes are now cast to unsigned long first
- Fixed[#58]: [X11] Window had no WM_CLASS set — GNOME/mutter treated it as an orphan and showed a generic icon and "Unknown" as name; WM_CLASS is now set from the window title via XSetClassHint
- Fixed[#181]: [X11] fpl__X11ParseUriPaths does not do any URI decoding, resulting in most-likely unuseable file paths
- Changed: [X11] Window size and position are no longer overwritten on creation
- Changed: [X11] Default window size changed to 720p (1280x720)
- New: [X11] Full support for FPL_NO_PLATFORM_INCLUDES and FPL_OPAQUE_HANDLES - no X11 headers are required anymore
- New: [X11] Self-contained X11 ABI - all X11 types/constants are defined with the fpl__X11 / FPL__X11_ prefix, mapped to the real X11 types when platform includes are enabled
- New: [X11] Direct extern declarations for FPL_NO_RUNTIME_LINKING builds (X11, XRandR, Xinerama, GLX)
- Fixed: [Vulkan] VK_KHR_xlib_surface is self-defined under FPL_NO_PLATFORM_INCLUDES, so vulkan.h no longer pulls in Xlib.h
- Fixed: [OpenGL] Wrong GLubyte type when _gl_h is not present
- Fixed: [OpenGL] FPL__FUNC_GLX_glXGetProcAddress vs glXGetProcAddress ABI mismatch
- Fixed: [OpenGL] GL/glx.h was not included when FPL_NO_RUNTIME_LINKING is disabled
- Fixed: [Vulkan] Vulkan headers were not included when FPL_NO_RUNTIME_LINKING is set
- Renamed: fplOpenGLCompabilityFlags -> fplOpenGLCompatibilityFlags (incl. enum values and fplOpenGLSettings::compabilityFlags -> compatibilityFlags) - typo fix
- New: Implemented OSS audio backend for BSD platforms (FreeBSD/NetBSD/OpenBSD/DragonFly), gated on FPL_SUBPLATFORM_BSD and <sys/soundcard.h>; uses direct ioctl/write on /dev/dsp without runtime linking
- New: Added enum value fplAudioBackendType_PulseAudio
- New: Added enum value fplAudioBackendType_PipeWire
- New: Added enum value fplAudioBackendType_OSS
- New: Added enum value fplAudioBackendType_WASAPI
- New: Added struct fplPulseAudioSettings
- New: Added struct fplPipeWireAudioSettings
- New: Added struct fplOSSAudioSettings
- New[#35]: Implemented PulseAudio audio backend
- New[#186]: Implemented PipeWire audio backend
- New[#34]: Implemented OSS audio backend
- New[#33]: Implemented WASAPI audio backend
- New: [DirectSound] Implemented getAudioDeviceInfo via DirectSoundEnumerateW lookup-by-GUID
- New: [ALSA] Implemented getAudioDeviceInfo via snd_device_name_hint lookup-by-name
- Changed: WASAPI is now the default Windows audio backend (probed before DirectSound); DirectSound remains as automatic fallback
- Changed: fplGetAudioDeviceInfo and the backend getAudioDeviceInfo contract now require a non-null deviceId (no implicit default-device path)
- Changed: fplSetDefaultAudioSettings() sets audio backend type to automatic
- Changed: [ALSA] Audio device enumeration prints out each audio device to verbose log
- Fixed: fpl__InitAudio probe loop is now fallback-outer, backend-inner so every backend is tried with the exact target format first; also fixed off-by-one in test-format list
- Fixed: Audio backend probing is now tier-based - perfect match -> rate+channels -> rate+type -> rate -> full fallback -> backend-native - keeping sample rate sacred (when the user locked it) until the second-last tier; the final tier hands the backend a blank format so it can pick its own native
- Fixed: fpl__Win32BuildWaveFormatExtensible now sets WAVEFORMATEX.cbSize to sizeof(WAVEFORMATEXTENSIBLE)-sizeof(WAVEFORMATEX) (22) instead of full-struct size; DirectSound tolerated the prior wrong value, WASAPI's IsFormatSupported is strict
- Fixed: fpl__ReadAudioFramesFromClient was not returning frameCount always and produce silence bytes for the remaining samples (now enforced via asserts at all call sites)
- Fixed: fpl__InitAudio() was raising an assertion instead of returning fplAudioResultType_NoBackendsFound, when no backends are available
- Fixed: fplGetTargetAudioFrameCount used a broken fake-round formula (wrong direction ratio for downsampling, negative fractional cast); replaced with round((double)in * outRate / inRate)
- Fixed: [ALSA] Defines were not handled correctly for FPL_NO_RUNTIME_LINKING
- Fixed[#182]: [ALSA] Fixed default audio devices are not detected in modern linux audio systems
- Improved: [ALSA] fpl__MapAudioFormatToAlsaFormat now uses an indexed lookup table covering all fplAudioFormatType values incl. F64
- Improved: [ALSA] fpl__MapAlsaFormatToAudioFormat now uses a lookup table that also handles native-endian aliases (SND_PCM_FORMAT_S16/S32/FLOAT/FLOAT64) and FLOAT64 variants
- New: Added enum value fplMouseButtonType_X1 / fplMouseButtonType_X2 (extra mouse buttons)
- New: Added enum values fplKey_First / fplKey_Last to fplKey enum
- New: Added enum fplInputBackendType
- New: Added enum fplInputConnectionState (Unknown/Connected/Disconnected)
- New: Added enum fplInputDeviceFeatureFlags (None/Polling/Events/Hotplug)
- New: Added enum fplGamepadInputType, that defines the source kind (button/axis/hat) referenced by a fplGamepadInputBinding
- New: Added enum fplGamepadAxisSign, that defines the half-axis selector (full/positive/negative) for axis bindings
- New: Added enum fplGamepadAxisType, that defines the logical analog axis slots filled by a fplGamepadMapping
- New: Added enum fplGamepadPlatform, that mirrors the SDL gamecontrollerdb "platform:" tag (Windows/Linux/MacOS/Android/iOS)
- New: Added struct fplGamepadSettings, that stores several properties required for updating/polling game controllers frequently
- New: Added struct fplGamepadInputBinding, that describes a raw input source bound to one logical FPL gamepad slot
- New: Added struct fplGamepadMapping, that holds a complete mapping from raw device inputs onto FPL's logical gamepad layout
- New: Added struct fplGamepadData, that captures a backend-agnostic snapshot of raw device input for use with fplGamepadMapping
- New: Added struct fplGamepadInfo, that describes a controller for the mapping resolver callback
- New: Added struct fplInputBackendSupport
- New: Added struct fplInputDevice
- New: Added struct fplInputDeviceGuid
- New: Added typedef fpl_gamepad_mapping_resolver_callback, the callback type fired once per controller connect on raw-HID gamepad backends
- New: Added typedef fplGamepadGuid
- New: Added macros FPL_GAMEPAD_BUTTON_COUNT, FPL_GAMEPAD_GUID_SIZE, FPL_GAMEPAD_DATA_MAX_AXES, FPL_GAMEPAD_DATA_MAX_BUTTONS, FPL_GAMEPAD_DATA_MAX_HATS, FPL_GAMEPAD_MAPPING_RESOLVE_CALLBACK
- New: Added macros FPL_MAX_INPUT_BACKEND_COUNT, FPL_MAX_INPUT_DEVICE_COUNT, FPL_MAX_INPUT_DEVICE_NAME
- New: Added enum fplInputSourceType
- New: Added struct fplInputBackendMask
- New: Added function fplKeyGetName() for getting the name for a fplKey
- New: Added function fplInputBackendMaskIsEnabled
- New: Added function fplInputBackendMaskEnable
- New: Added function fplInputBackendMaskDisable
- New: Added function fplGamepadMappingApply
- New: Added function fplGamepadMappingApplyDefault
- New: Added function fplGetInputBackendSupport
- New: Added function fplGetInputBackendSupportByType
- New: Added function fplGetInputDevices
- New: Added function fplGetKeyboardDevices
- New: Added function fplGetMouseDevices
- New: Added function fplGetGamepadDevices
- New: Added function fplFindInputDevice
- New: Added function fplUpdateInputDevices
- New: Added function fplSetDefaultGamepadSettings
- New[#178]: Separate input system from windowing system, by introducing a input backend system
- New[#187]: Implemented DirectInput input backend
- New: Added input device enumeration API
- New: Added no-window fplPollEvent / fplPollEvents pump for input-only / headless applications
- New: Multi-backend gamepad polling merge — multiple gamepad backends can be polled in parallel and merged into a single state
- Improved: [Win32/DInput] Backend now routes DIJOYSTATE through fplGamepadMappingApply / fplGamepadMappingApplyDefault, with the resolver from fplGamepadSettings.mappingResolver invoked once per controller connect to install a custom fplGamepadMapping
- Improved: [Linux/Joystick] /dev/input/jsX backend now feeds JS_EVENT_AXIS/BUTTON into a fplGamepadData snapshot, calls the mappingResolver with VID/PID/version read from /sys/class/input/jsX/device/id, and applies fplGamepadMappingApply when a mapping is installed (legacy behavior preserved when no resolver returns true)
- Improved: [Linux/Joystick] Auto-detection of controllers with log throttling
- Improved: Gamepad connect/disconnect is now handled in the poll state
- Improved[#88]: Gamepad input device is not locked to /dev/input/js0 anymore
- Fixed: [Linux/Joystick] init-message check was incorrect
- Changed: Extented struct fplInputSettings with fields for new input system
- Changed: Extented struct fplGamepadState with union action buttons (down/right/left/up) and (A/B/X/Y)
- Improved and extended system/platform detection macros
- Improved audio format detection
- Improved stability for input polling
- Reworked API documentations
- Refactored audio system to use dispatch tables
- Support for multiple audio channels with channel layouts and channel mapping
- Removed several obsolete functions
- Renamed several types and functions
- Bugfixes in audio format probing
- Bugfixes for ARM/GCC compilations
- Bugfixes for X86 compilations
- Bugfixes for vulkan backend
- struct fplAudioDeviceFormat replaced by fplAudioFormat
- struct fplAudioTargetFormat replaced by fplAudioFormat
- struct fplVersionInfo has no anonymous structs/unions anymore
- function fplCPUID() -> Changed argument order and changed return type from void to bool
- function GetAvailableThreadCount() renamed to fplGetAvailableThreadCount()
- function GetUsedThreadCount() renamed to fplGetUsedThreadCount()
- function fplGetAudioDevices() added stride argument
- type audio channel count is now U16 instead of U32
- type audio period count is now U16 instead of U32
- enum value fplPlatformResultType_FailedMemory renamed to fplPlatformResultType_OutOfMemory
- All argument-less functions -> Added nameless void argument
- New: Added typedef fplAudioFormatU64 that encodes a audio format (sample rate, channels, type) as 64-bit
- New: Added enum fplAudioChannelLayout that stores the supported channel layouts
- New: Added enum fplAudioChannelType that stores the geometry of a audio channel as flags
- New: Added enum fplAudioMode that stores the exlusive/shared mode and the latency modes
- New: Added enum fplAudioShareMode that stores the supported sharing modes
- New: Added enum fplAudioLatencyType that stores the supported latency types
- New: Added enum fplCPUCapabilitiesType that stores the CPU capabilieis type
- New: Added enum fplX86InstructionSetLevel that defines the X86 instruction set level, that is detected at compile time.
- New: Added struct fplAudioChannelMap that stores an array of the audio channel configuration
- New: Added struct fplX86CPUCapabilities that stores the features for a X86 based CPU
- New: Added struct fplARMCPUCapabilities that stores the features for a ARM based CPU
- New: Added enum value fplAudioDefaultFields_ChannelLayout to fplAudioDefaultFields
- New: Added several enum values to fplAudioResultType to indicate audio issues better
- New: Added define FPL_X86_CPU_INSTR_SET_LEVEL
- New: Added function fplAudioInit() that manually loads the audio system
- New: Added function fplAudioRelease() that manually unloads/releases the audio system
- New: Added function fplGetAudioDeviceInfo() that returns a fplAudioDeviceInfo from a device id
- New: Added function fplGetAudioLatencyType() that returns a fplAudioLatencyType from a fplAudioMode
- New: Added function fplGetAudioShareMode() that returns a fplAudioShareMode from a fplAudioMode
- New: Added function fplCreateAudioMode() that returns a fplAudioMode from a fplAudioLatencyType and fplAudioShareMode
- New: Added function fplGetAudioChannelsFromLayout() that returns the number of channels from a fplAudioChannelLayout
- New: Added function fplGetDefaultAudioChannelLayoutFromChannels() that returns default fplAudioChannelLayout from the number of audio channels
- New: Added function fplEncodeAudioFormatU64() that encodes a sample rate, number of channels and type into a 64-bit
- New: Added function fplDecodeAudioFormatU64() that decodes a 64-bit value into a sample rate, number of channels and type
- New: Added function fplGetAudioDeviceInfo() that returns a fplAudioDeviceInfo from a fplAudioDeviceID
- New: Added function fplGetAudioChannelMap() that returns the fplAudioChannelMap for the active audio backend
- New: Added function fplGetCPUCapabilitiesTypeName() that returns the name of a fplCPUCapabilitiesType
- New: Added function fplGetTargetAudioFrameCount() that computes the target audio frames for an input/out sample rate from number of input frames
- New: Added field manualLoad to fplAudioSettings that controls the initialization behavior of the audio system
- Fixed: fplCreateColorRGBA() was not compiling on GCC due to inlining failing
- Fixed: fplCreateVideoRectFromLTRB() was not compiling on GCC due to inlining failing
- Fixed: fpl__VideoBackend_Vulkan_PrepareWindow() was crashing due to invalid free of memory
- Fixed: [Win32] fpl__Win32Guid was not properly defined when opaque API was enabled
- Fixed: [Win32] fplSetWindowState() was not implementing fplWindowState_Fullscreen
- Fixed: Compile errors for vulkan KHR missing cast to void pointer
- Fixed: Renamed GetAvailableThreadCount() to fplGetAvailableThreadCount()
- Fixed: Renamed GetUsedThreadCount() to fplGetUsedThreadCount()
- Changed: Added stride argument to to fplGetAudioDevices()
- Changed: Renamed field userData to clientUserData in fplAudioSettings
- Changed: Renamed fplAudioDeviceFormat to fplAudioFormat
- Changed: Renamed function fplClearErrors to fplErrorsClear
- Changed: Renamed enum value fplPlatformResultType_FailedMemory to fplPlatformResultType_OutOfMemory
- Changed: Replaced audio exclusive flag and latency mode with a single enum fplAudioMode in fplAudioFormat
- Changed: fplCPUCapabilities is now separated by x86 and arm features
- Changed: All FPL public and internal functions without arguments has now a (void) as argument
- Changed: fplVersionInfo has no anonymous structs/unions anymore
- Changed: fplColor32 has no anonymous structs/unions anymore
- Changed: fplCPUID argument order swapped and return type is now bool instead
- Changed: All argument-less functions have now a nameless void argument
- Changed: Audio channel count type is now U16 instead of U32
- Changed: Audio period count type is now U16 instead of U32
- Removed: Removed obsolete function fplFileSetTimestamps
- Removed: Removed obsolete struct fplAudioTargetFormat
- Removed: Removed obsolete function fplSetDefaultAudioTargetFormat
- Removed: Removed obsolete function fplConvertAudioTargetFormatToDeviceFormat
- Removed: Removed backend field from fplAudioFormat former fplAudioDeviceFormat
- Improved: C/C++ detection improved
- Improved: Architecture detection extended (Apple, Risc-V, Mips, Sparc)
- Improved: CPU bits detection improved
- Improved: x86 instruction set level detection improved
- Improved: Fixed lots of incorrect struct alignments
- New[#36]: Support for multiple audio channels + channel layouts + channel mapping
- Fixed[#156]: Target audio format type and periods was never used
- Fixed[#157]: Compile error for missing _countof() fplArrayCount in some scenarios
- Fixed[#164]: Changed default controllerDetectionFrequency from 100 ms to 1000 ms
- Fixed[#160/#158]: Building with G++ or Clang was not working anymore
- Fixed[#169]: Only audio initialization may create a window/console, which is incorrect
- Fixed[#172]: POSIX main thread was never initialized, so get fplGetMainThread() was returning zero values
- Improved[#161]: Compiler detected improved & extended (MingW, Apple, Borland, TCC, DMC, CSMC, Linaro)
- Improved[#149]: Refactoring of audio backends to dispatch tables
- Improved[#163]: Make endianess detection more robust
- Improved[#167]: Use improved doxygen commands such as at struct, at enum, etc.
- Added useful functions for multithreading
- Added support for changing the default window background color
- Added support for preventing the screensaver for kicking-in
- Several Bugfixes for several platforms
- Several Bugfixes for several audio backends
- Several Improvements for platforms
- Renamed tons of functions to match naming scheme
- New: Added function fplGetAvailableThreadCount() that returns the number of available threads
- New: Added function fplGetUsedThreadCount() that returns the number of used/active threads
- New: Added union fplColor32 for representing a 32-bit color value
- New: Added typedef fplMilliseconds that specifies milliseconds as 64-bit integer
- New: Added typedef fplSeconds that specifies seconds as 64-bit floating point
- New: Added field background as fplColor32 to fplWindowSettings
- New: Added fields isScreenSaverPrevented/isMonitorPowerPrevented to configure, if monitor-off or screensaver is prevented
- Fixed[#135]: Stackoverflow in fpl__PushError_Formatted() when FPL_USERFUNC_vsnprintf is overloaded
- Fixed[#139]: Assertion on machine with 32 logical cores -> fplThreadHandle array capacity too small
- Fixed[#141]: fplMemoryCopy() was wrong for 16-bit optimized operations
- Changed[#95]: Platform support for fplMemorySet, fplMemoryClear, fplMemoryCopy (See FPL_NO_MEMORY_MACROS / FPL_USE_MEMORY_MACROS for more details)
- New[#150]: [Win32] Prevent screensaver for kicking-in
- Fixed[#127]: [Win32/Window] Incorrect initial window background color
- Fixed[#130]: [Win32/Window] Main fiber was never properly released
- Fixed[#131]: [Win32/Console] Console window was not shown the second time fplPlatformInit() was called
- Fixed[#134]: [Win32] Duplicate executable arguments in main() passed when CRT is disabled
- Fixed[#137]: [POSIX] pthread_yield is not always present, so it may fail the FPL startup
- Fixed[#138]: [X11] Compile error in function fpl__X11InitWindow, initSettings was not found
- Changed: [Audio/ALSA] Use bcm2835 device pattern for buffer scale instead of individual ones
- New: Added field libraryFile to fplOpenGLSettings, for passing in a custom driver library file for OpenGL
- New: Added field libraryFile to fplVulkanSettings, for passing in a custom driver library file for Vulkan
- New[#117]: Support for passing in a driver dll for OpenGL/Vulkan
- Fixed[#136]: Video initialization failed due to wrong fplGraphicsApiSettings union
- Fixed[#124]: [Video/Vulkan] Fallback when creation with validation failed
- Improvement[#148]: Refactoring of video backends
- Changed: Renamed function fplOpenBinaryFile() to fplFileOpenBinary()
- Changed: Renamed function fplCreateBinaryFile() to fplFileCreateBinary()
- Changed: Renamed functions fplReadFileBlock*() to fplFileReadBlock*()
- Changed: Renamed functions fplWriteFileBlock*() to fplFileWriteBlock*()
- Changed: Renamed functions fplSetFilePosition*() to fplFileSetPosition*()
- Changed: Renamed functions fplGetFilePosition*() to fplFileGetPosition*()
- Changed: Renamed function fplFlushFile() to fplFileFlush()
- Changed: Renamed function fplCloseFile() to fplFileClose()
- Changed: Renamed functions fplGetFileSizeFromPath*() to fplFileGetSizeFromPath*()
- Changed: Renamed functions fplGetFileSizeFromHandle*() to fplFileGetSizeFromHandle*()
- Changed: Renamed function fplGetFileTimestampsFromPath() to fplFileGetTimestampsFromPath()
- Changed: Renamed function fplGetFileTimestampsFromHandle() to fplFileGetTimestampsFromHandle()
- Changed: Renamed function fplSetFileTimestamps() to fplFileSetTimestamps()
- Changed: Renamed function fplListDirBegin() to fplDirectoryListBegin()
- Changed: Renamed function fplListDirNext() to fplDirectoryListNext()
- Changed: Renamed function fplListDirEnd() to fplDirectoryListEnd()
- Changed: Renamed function fplGetPlatformResultName() to fplPlatformGetResultName()
- Changed: Renamed function fplFormatString() to fplStringFormat()
- Changed: Renamed function fplFormatStringArgs() to fplStringFormatArgs()
- Changed: Renamed function fplGetWallClock() to fplTimestampQuery()
- Changed: Renamed function fplGetTimeInMilliseconds() to fplMillisecondsQuery()
- Changed: Renamed function fplGetWallDelta() to fplTimestampElapsed()
- Changed: Renamed struct fplWallClock to fplTimestamp
- Changed: Removed obsolete functions fplGetTimeInSeconds*()
- Changed: Removed obsolete functions fplGetTimeInMillisecondsHP()
- Changed: Removed obsolete functions fplGetTimeInMillisecondsLP()
- Changed: Replaced enum flag fplVulkanValidationLayerMode_User with fplVulkanValidationLayerMode_Optional
- Changed: Replaced enum flag fplVulkanValidationLayerMode_Callback with fplVulkanValidationLayerMode_Required
- Changed: Moved fplTimeoutValue and FPL_TIMEOUT_INFINITE to time sections
- Added Vulkan support
- Added seamless window resizing support for Win32
- Added query functions for accessing video backend handles
- Improved video system stability
- Improved console window handling for Win32
- Fixed some major & minor bugs
- New: Added structs fplVideoRequirements, fplVideoRequirementsVulkan
- New: Added function fplGetVideoRequirements() to query any requirements for a particular video backend
- New: Added macro fplAssertPtr() for simply (exp != fpl_null) assertions
- New: Added typedef fplVulkanValidationLayerCallback
- New: Added enums fplVulkanValidationLayerMode, fplVulkanValidationSeverity
- New: Added struct fplVulkanSettings
- New: Added structs fplVideoWindow, fplVideoWindowWin32, fplVideoWindowX11
- New: Added structs fplVideoSurface, fplVideoSurfaceOpenGL, fplVideoSurfaceVulkan
- New: Added function fplGetVideoSurface() for query the current fplVideoSurface
- New[#48]: Added function fplGetVideoProcedure() for query functions from the active video backend
- New[#18]: [Win32] Support for message proc fibers to support seamless window resize -> works only with fplPollEvents()
- New[#105]: [Win32] Added support for creating and using a console in addition to a window
- New[#31]: [Win32] Added support for Vulkan
- New[#32]: [X11] Added support for Vulkan
- Changed: Changed video system to use jump tables instead, to support more backends in the future
- Changed: Added field fplVulkanSettings to fplGraphicsApiSettings
- Changed[#116]: AudioDriver/VideoDriver renamed to AudioBackend/VideoBackend
- Changed[#98]: [Win32] Use YieldProcessor instead of SwitchToThread for fplThreadYield()
- Changed[#111]: [Win32] Use SetConsoleTitle with fplConsoleSettings::title
- Changed[#113]: [Win32] Properly show window on initialize (Foreground, Focus)
- Fixed[#109]: fplS32ToString is not working anymore
- Fixed[#121]: fplMutexHandle isValid flag was never working properly
- Fixed[#122]: Compile errors on Arm32/C99 for "asm volatile"
- Fixed[#123]: Compile error for wrong usage of fplStructInit in fplCPUID() for non-x86 architectures
- Fixed[#110]: [Win32] Erasing of background when no video driver hides window always
- Fixed[#114]: [Win32] Console window does not appear at the very first
- New[#73]: Added fplAsm macro to handle different inline assembler keywords (Clang, GCC, MSVC)
- New[#75]: Added fplAlignAs macro for aligning structures to N-bytes (Clang, GCC, MSVC, C++/11)
- New[#79]: Added function fplGetAudioDriver()
- New[#81]: Added function fplGetAudioBufferSizeInMilliseconds() to compute milliseconds from frame-count + sample-rate
- New[#85]: Added fpl*_First and fpl*_Last to every enum
- New[#84]: Added support for controlling the inclusion of platform includes with define FPL_NO_PLATFORM_INCLUDES
- New[#84]: Added support for use opaque handles instead of OS handles with define FPL_OPAQUE_HANDLES
- New[#75]: Added fplMinAlignment macro to get the minimum required alignment
- New[#90]: Added struct fplThreadParameters
- New[#90]: Added function fplThreadCreateWithParameters() which allows to set the stack size and the priority in the creation directly
- New[#51]: [POSIX] Implemented fplGetThreadPriority() and fplSetThreadPriority()
- New[#60]: [POSIX] Implemented fplGetCurrentThreadId()
- New[#90]: [POSIX] Implemented fplThreadCreateWithParameters()
- New[#90]: [Win32] Implemented fplThreadCreateWithParameters()
- New[#86]: [X11] Implemented fplEnableWindowFullscreen() and fplDisableWindowFullscreen()
- Changed: New Changelog format with categories (Features, bugfixes, improvements, breaking changes, internal changes)
- Changed[#74]: fplGetAudioDevices() allows to pass null-pointer as devices argument to return the number of audio devices only
- Changed[#74]: fplWideStringToUTF8String() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplUTF8StringToWideString() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetExecutableFilePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetHomePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplExtractFilePath() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplChangeFileExtension() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplPathCombine() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplFormatStringArgs() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplFormatString() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetCurrentUsername() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetDisplayModes() allows to pass null-pointer as output argument to return the number of modes only
- Changed[#74]: fplGetInputLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetUserLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetSystemLocale() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#74]: fplGetProcessorName() allows to pass null-pointer as output argument to return the number of characters only
- Changed[#63]: Replaced usage of fplStackAllocate() with fpl__AllocateTemporaryMemory()
- Changed[#92]: Use _offsetof() and ARRAY_SIZE() for fplArrayCount() instead
- Updated: Better documentation for fplAssert*
- Changed[#72]: [Win32] Query QueryPerformanceFrequency for every High-Precision timer calls instead of once per app start
- Changed[#84]: [Win32] Moved windows.h include to the implementation and entry point block (all handles are void* or have correct size)
- Fixed[#76]: FPL__ERROR, FPL__WARNING, FPL__INFO was not passing the correct function name and line number in some cases
- Fixed[#83]: fplGetAudioBufferSizeInFrames() does not return correct values always
- Fixed[#83]: fplGetAudioBufferSizeInMilliseconds() does not return correct values always
- Fixed[#94]: Fixed MINGW compile error for typo FPL_SUBPLATFORM_WINDOWS vs FPL_PLATFORM_WINDOWS (_WIN32_WINNT 0x0600)
- Fixed: Corrected a few code documentation translation bugs
- Fixed[#69]: [Win32] Removed the manual handling of ALT + F4 shut down of event handling
- Fixed[#87]: [POSIX] fplGetWallDelta() was returning incorrect values
- Renamed a lot of internal FPL_ defines to FPL__
- Removed[#85]: Removed obsolete FPL_FIRST_* and FPL_LAST_* defines
- Renamed[#78]: fplGetAudioResultTypeString to fplGetAudioResultName
- Renamed[#78]: fplGetArchTypeString to fplCPUGetArchName
- Renamed[#78]: fplGetVideoDriverString to fplGetVideoDriverName
- Renamed[#78]: fplGetAudioDriverString to fplGetAudioDriverName
- Renamed[#78]: fplGetAudioFormatTypeString to fplGetAudioFormatName
- Renamed[#78]: fplGetPlatformResultTypeString to fplGetPlatformResultName
- Renamed[#50]: struct fplOSInfos to fplOSVersionInfos
- Renamed[#50]: fplGetCurrentUsername() to fplSessionGetUsername()
- Renamed[#50]: fplGetOperatingSystemInfos() to fplOSGetVersionInfos()
- Renamed[#50]: fplIsAtomicCompareAndSwapPtr() to fplAtomicIsCompareAndSwapPtr()
- Renamed[#50]: fplIsAtomicCompareAndSwapSize() to fplAtomicIsCompareAndSwapSize()
- Renamed[#50]: fplIsAtomicCompareAndSwapS64() to fplAtomicIsCompareAndSwapS64()
- Renamed[#50]: fplIsAtomicCompareAndSwapS32() to fplAtomicIsCompareAndSwapS32()
- Renamed[#50]: fplIsAtomicCompareAndSwapU64() to fplAtomicIsCompareAndSwapU64()
- Renamed[#50]: fplIsAtomicCompareAndSwapU32() to fplAtomicIsCompareAndSwapU32()
- Renamed[#50]: fplXCR0() to fplCPUXCR0()
- Renamed[#50]: fplRDTSC() to fplCPURDTSC()
- Renamed[#50]: fplGetArchName() to fplCPUGetArchName()
- Renamed[#50]: fplGetProcessorCoreCount() to fplCPUGetCoreCount()
- Renamed[#50]: fplGetProcessorName() to fplCPUGetName()
- Renamed[#50]: fplGetProcessorCapabilities() to fplCPUGetCapabilities()
- Renamed[#50]: fplGetProcessorArchitecture() to fplCPUGetArchitecture()
- Renamed[#50]: fplGetRunningMemoryInfos() to fplMemoryGetInfos()
- Renamed[#50]: struct fplProcessorCapabilities to fplCPUCapabilities
- Renamed[#50]: enum fplArchType to fplCPUArchType
- Renamed[#50]: enum values fplArchType_* to fplCPUArchType_
- Changed[#74]: fplWideStringToUTF8String() returns the number of characters instead of a char-pointer
- Changed[#74]: fplUTF8StringToWideString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetExecutableFilePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetHomePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplExtractFilePath() returns the number of characters instead of a char-pointer
- Changed[#74]: fplChangeFileExtension() returns the number of characters instead of a char-pointer
- Changed[#74]: fplCopyString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplCopyStringLen() returns the number of characters instead of a char-pointer
- Changed[#74]: fplPathCombine() returns the number of characters instead of a char-pointer
- Changed[#74]: fplFormatStringArgs() returns the number of characters instead of a char-pointer
- Changed[#74]: fplFormatString() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetCurrentUsername() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetInputLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetUserLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetSystemLocale() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetProcessorName() returns the number of characters instead of a char-pointer
- Changed[#74]: fplGetDisplayModeCount() -> Use fplGetDisplayModes() with null-pointer instead
- New: Added enum fplAudioDefaultFields
- New: Added field defaultFields to fplAudioDeviceFormat struct
- New: Added C++/11 detection (FPL_IS_CPP11)
- New: Added enum fplAudioLatencyMode to fplAudioTargetFormat
- New: Added function fplSetFileTimestamps()
- New: Added fplAudioDriverType to fplAudioDeviceFormat
- New: Added fplWallClock struct
- New: Added function fplGetWallClock()
- New: Added function fplGetWallDelta()
- New: Support for logging out keyboard button events (FPL_LOG_KEY_EVENTS)
- New: Added support for hard crashing on errors or warnings (define FPL_CRASH_ON_ERROR or FPL_CRASH_ON_WARNING) to enable it
- New: [Win32] Added implementation for fplSetFileTimestamps()
- New: [Win32] Added implementation for fplGetWallClock()
- New: [Win32] Added implementation for fplGetWallDelta()
- New: [POSIX] Added implementation for fplGetWallClock()
- New: [POSIX] Added implementation for fplGetWallDelta()
- Fixed: fplS32ToString() was not returning the last written character
- Fixed: fplStringAppendLen() was not returning the last written character
- Fixed: Fixed several warnings for doxygen
- Fixed: [Core] Added empty functions for fplCPUID(), fplGetXCR0() for non-x86 platforms
- Fixed: [Core] Implemented fplRDTSC() for non-x86 platforms
- Fixed: [POSIX] Fixed several compile errors
- Fixed: [Linux] Fixed non-joystick devices as gamepad detected
- Fixed: [X11] Fixed keyrepeat issue for text input (finally!)
- Fixed: [X11] Fixed duplicated key events in some cases
- Changed: FPL_MAX_THREAD_COUNT and FPL_MAX_SIGNAL_COUNT can now be overridden by the user
- Changed: Removed redundant field bufferSizeInBytes from fplAudioDeviceFormat struct
- Changed: Simplified audio system default values initialization
- Changed: Use default audio buffer size based on set fplAudioLatencyMode in fplAudioTargetFormat
- Changed: [ALSA] Introduced audio buffer scaling for bad latency devices
- New: Added callbacks fpl_memory_allocate_callback & fpl_memory_release_callback
- New: Added enum fplMemoryAllocationMode
- New: Added struct fplMemoryAllocationSettings
- New: Added struct fplMemorySettings for controlling dynamic and temporary memory allocations
- New: Added enum fplThreadPriority
- New: Added function fplGetThreadPriority
- New: Added function fplSetThreadPriority
- New: Added function fplGetCurrentThreadId
- New: Introduced dynamic/temporary allocations wrapping
- New: Added FPL_WARNING macro for pushing on warnings only
- New: Print out function name and line number in all log outputs
- New: Added functions fplAtomicIncrement* used for incrementing a value by one atomically
- New: Added macro fplRDTSC
- New: Added struct fplProcessorCapabilities
- New: Added function fplGetProcessorCapabilities
- New: Added macro fplIsBitSet
- New: Added function fplGetMainThread
- New: Added field isActive to struct fplGamepadState
- New: Added field deviceName to struct fplGamepadState and fplGamepadEvent
- New: Added function fplSetWindowInputEvents
- New: Added struct fplCPUIDLeaf
- New: Added function fplCPUID and implemented it for X86/X64
- New: Added function fplGetXCR0 and implemented it for X86/X64
- New: Added macro fplHasInclude
- New: Added power-pc 32/64 architecture detection
- New: Added storage class identifier fpl_no_inline
- New: Added macro fplAlwaysAssert()
- New: Added function fplIsPlatformInitialized()
- New: Added FPL_IS_IDE macro for checking if any source editor is active.
- New: [MSVC] Always show implementation block when FPL_IS_IDE is set
- Fixed: Corrected opengl example code in the header file
- Fixed: Tons of documentation improvements
- Fixed: fpl__PushError_Formatted was always pushing errors on regardless of the log level
- Fixed: Invalid memory clear with zero bytes, when there was no audio samples to clear
- Fixed: All non inlineable functions changed from fpl_internal_inline to fpl_internal instead (GCC/Clang compatible)
- Fixed: Use actual window size for video initialization always instead of fixed size
- Fixed: fplAtomicAddAndFetch* had no addend parameter
- Fixed: All non-tab spacings replaced with tab spacings
- Fixed: ARM64 was not detected properly
- Fixed: Atomics was not detected for ICC (Intel C/C++ Compiler)
- Changed: Removed fake thread-safe implementation of the internal event queue
- Changed: Changed drop event structure in fplWindowEvent to support multiple dropped files
- Changed: Renamed fplGetPlatformTypeString() to fplGetPlatformName()
- Changed: Added stride to fplThreadWaitForAll() to support custom sized user structs
- Changed: Added stride to fplThreadWaitForAny() to support custom sized user structs
- Changed: Added stride to fplSignalWaitForAll() to support custom sized user structs
- Changed: Added stride to fplSignalWaitForAny() to support custom sized user structs
- Changed: Set audio worker thread to realtime priority
- Changed: Use name table for fplArchType to string conversion
- Changed: Use name table for fplPlatformType to string conversion
- Changed: Use name table for fplPlatformResultType to string conversion
- Changed: Use name table for fplVideoDriverType to string conversion
- Changed: Use name table for fplAudioDriverType to string conversion
- Changed: Use name table for fplAudioFormatType to string conversion
- Changed: Use name table for fplLogLevel to string conversion
- Changed: Values for fplPlatformResultType changed to be ascending
- Changed: Moved fplInitFlags_All constant to fplInitFlags enum
- Changed: CPU size detection is now independent from CPU architecture detection
- Changed: fplGetProcessorName moved to common section with fallback to not supported architectures
- Changed: Removed wrong compiler detection for LLVM (Clang is LLVM)
- Changed: Removed pre-spaces from all code documentation comments
- Changed: Changed from default audio sample rate of 48000 to 44100
- Changed: Moved compiler includes into its own section
- Changed: Moved rdtsc/cpuid, etc. into the implementation block
- Changed: Renamed enum fplAudioResult to fplAudioResultType
- Changed: Use fplLogLevel_Warning as max by default for all log functions
- Renamed function fplGetAudioFormatString to fplGetAudioFormatTypeString
- New: [Win32] Implemented function fplGetCurrentThreadId
- New: [Win32] Support for multiple files in WM_DROPFILES
- New: [Win32] Implemented fplGetThreadPriority
- New: [Win32] Implemented fplSetThreadPriority
- New: [Win32/Linux] Implemented isActive field for fplGamepadState for state querying, indicating any buttons are pressed or triggers have been moved
- New: [Win32/XInput] Fill out the deviceName in fplGamepadState and fplGamepadEvent -> Generic name for now
- New: [POSIX/Win32] Implemented functions fplAtomicIncrement*
- New: [Linux/ALSA] Print compiler warning when alsa include was not found
- New: [X11] Implemented fplSetWindowDecorated
- New: [X11] Implemented fplIsWindowDecorated
- Fixed: [Win32] Fixed missing WINAPI keyword for fpl__Win32MonitorCountEnumProc/fpl__Win32MonitorInfoEnumProc/fpl__Win32PrimaryMonitorEnumProc
- Fixed: [Win32] Software video output was not outputing the image as top-down
- Fixed: [Win32/X11] Mouse wheel delta message is not ignored anymore
- Fixed: [X11] Fixed software video output (was broken)
- Fixed: [POSIX] Moved __sync_synchronize before __sync_lock_test_and_set in fplAtomicStore*
- Fixed: [POSIX/Win32] fplAtomicAddAndFetch* uses now addend parameter
- Fixed: [Linux] Previous gamepad state was not cleared before filling in the new state
- Fixed: [X11] Gamepad controller handling was broken
- Changed: [POSIX] Use __sync_add_and_fetch instead of __sync_fetch_and_or in fplAtomicLoad*
- Changed: [POSIX/Win32] When a dynamic library failed to load, it will push on a warning instead of a error
- Changed: [POSIX/Win32] When a dynamic library procedure address failed to retrieve, it will push on a warning instead of a error
- Changed: [POSIX/Win32] Reflect api changes for fplThreadWaitForAll()
- Changed: [POSIX/Win32] Reflect api changes for fplThreadWaitForAny()
- Changed: [POSIX/Win32] Reflect api changes for fplSignalWaitForAll()
- Changed: [POSIX/Win32] Reflect api changes for fplSignalWaitForAny()
- Changed: [X86/X64] fplGetProcessorName are only enabled on X86 or X64 architecture
- Changed: [X86/X64] fplGetProcessorCapabilities are only enabled on X86 or X64 architecture
- Changed: [MSVC] Implemented fplCPUID/fplGetXCR0 for MSVC
- Changed: [GCC/Clang] Implemented fplCPUID/fplGetXCR0 for GCC/Clang
- Changed: [Win32] Input events are not flushed anymore, when disabled
- Changed: Renamed fplSetWindowFullscreen to fplSetWindowFullscreenSize
- Changed: Replaced windowWidth and windowHeight from fplWindowSettings with windowSize structure
- Changed: Replaced fullscreenWidth and fullscreenHeight from fplWindowSettings with fullscreenSize structure
- Changed: Renamed macro FPL_PLATFORM_WIN32 to FPL_PLATFORM_WINDOWS
- Changed: Renamed fplGetWindowArea() to fplGetWindowSize()
- Changed: Renamed fplSetWindowArea() to fplSetWindowSize()
- Changed: Renamed fplWindowSettings.windowTitle to fplWindowSettings.title
- Changed: Reversed buffer/max-size argument of fplS32ToString()
- Changed: Renamed fullPath into name in the fplFileEntry structure and limit its size to FPL_MAX_FILENAME_LENGTH
- Changed: Introduced fpl__m_ for internal defines mapped to the public define
- Changed: FPL_ENABLE renamed to FPL__ENABLE
- Changed: FPL_SUPPORT renamed to FPL__SUPPORT
- Changed: [CPP] Export every function without name mangling -> extern "C"
- Changed: [Win32] Moved a bit of entry point code around, so that every linking configuration works
- Fixed: fplPlatformInit() was using the width for the height for the default window size
- Fixed: fplExtractFileExtension() was not favour the last path part
- Fixed [Win32/MSVC]: Workaround for "combaseapi.h(229): error C2187: syntax error: 'identifier' was unexpected here"
- Fixed: [POSIX] Parse version string (isdigit was not found)
- Fixed: [X11] Added missing fpl*Display* stubs
- New: Added fplSetWindowFullscreenRect()
- New: Added fplGetDisplayCount()
- New: Added fplGetDisplays()
- New: Added fplGetWindowDisplay()
- New: Added fplGetPrimaryDisplay()
- New: Added fplGetDisplayFromPosition()
- New: Added fplGetDisplayModeCount()
- New: Added fplGetDisplayModes()
- New: Added fplGetWindowTitle()
- New: Added docs back-references from atomic functions
- New: Added support for compiling FPL as a dynamic library
- Changed: [Win32] fplSetWindowFullscreenSize does not use virtual screen coordinates anymore
- Changed: [Win32/POSIX] Store filename in fplFileEntry instead of the full path
- Fixed: [Win32] fplGetExecutableFilePath was not returning the last written character
- Fixed: [Win32] fplGetHomePath was not returning the last written character
- New: [Win32/X11] Use fplWindowSettings.fullscreenRefreshRate for startup when needed
- New: [Win32] Implemented fplSetWindowFullscreenRect()
- New: [Win32] Implemented fplGetDisplayCount()
- New: [Win32] Implemented fplGetDisplays()
- New: [Win32] Implemented fplGetWindowDisplay()
- New: [Win32] Implemented fplGetPrimaryDisplay()
- New: [Win32] Implemented fplGetDisplayFromPosition()
- New: [Win32] Implemented fplGetDisplayModeCount()
- New: [Win32] Implemented fplGetDisplayModes()
- Changed: Removed "Ansi" part from all ansi functions
- Changed: Debug/Release user define is always prefered
- Changed: Properly define posix defines like _XOPEN_SOURCE
- Changed: Renamed FPL_STACKALLOCATE to fplStackAllocate
- Changed: Renamed FPL_OFFSETOF to fplOffsetOf
- Changed: Renamed FPL_ARRAYCOUNT to fplArrayCount
- Changed: Renamed FPL_ASSERT to fplAssert
- Changed: Renamed FPL_STATICASSERT to fplStaticAssert
- Changed: Renamed FPL_CLEAR_STRUCT to fplClearStruct
- Changed: Renamed FPL_MIN to fplMin
- Changed: Renamed FPL_MAX to fplMax
- Changed: Renamed FPL_ZERO_INIT to fplZeroInit
- Changed: Renamed FPL_STRUCT_SET to fplStructSet
- Changed: Renamed FPL_STRUCT_INIT to fplStructInit
- Changed: Renamed FPL_KILOBYTES to fplKiloBytes
- Changed: Renamed FPL_MEGABYTES to fplMegaBytes
- Changed: Renamed FPL_GIGABYTES to fplGigaBytes
- Changed: Renamed FPL_TERABYTES to fplTeraBytes
- Changed: Renamed FPL_ALIGNMENT_OFFSET to fplGetAlignmentOffset
- Changed: Renamed FPL_ALIGNED_SIZE to fplGetAlignedSize
- Changed: Renamed FPL_IS_ALIGNED to fplIsAligned
- Changed: Renamed FPL_IS_POWEROFTWO to fplIsPowerOfTwo
- Changed: Renamed fplFormatAnsiStringArgs() to fplFormatStringArgs()
- Changed: Renamed fplFormatAnsiString() to fplFormatString()
- Changed: Renamed fplCopyAnsiString() to fplCopyString()
- Changed: Renamed fplCopyAnsiStringLen() to fplCopyStringLen()
- Changed: Renamed fplGetAnsiStringLength() to fplGetStringLength()
- Changed: Renamed fplOpenAnsiBinaryFile() to fplOpenBinaryFile()
- Changed: Renamed fplCreateAnsiBinaryFile() to fplCreateBinaryFile()
- Changed: Renamed fplSetWindowAnsiTitle() to fplSetWindowTitle()
- Changed: Renamed fplGetClipboardAnsiText() to fplGetClipboardText()
- Changed: Renamed fplSetClipboardAnsiText() to fplSetClipboardText()
- Changed: Renamed all fplAtomicCompareAndExchange*() to fplAtomicCompareAndSwap*()
- Changed: Renamed all fplAtomicAdd*() to fplAtomicFetchAndAdd*()
- Changed: Renamed all fplAtomicInc*() to fplAtomicAddAndFetch*()
- Changed: Renamed fplGetRunningArchitecture() to fplGetProcessorArchitecture()
- Changed: Renamed fplAudioSettings.deviceFormat to fplAudioSettings.targetFormat
- Changed: Renamed fplAudioSettings.deviceInfo to fplAudioSettings.targetDevice
- Changed: All buffers or fixed char/byte arrays uses now either FPL_MAX_BUFFER_LENGTH or FPL_MAX_NAME_LENGTH except for device-id
- Changed: All callback typedefs are now properly named as such
- Changed: Auto-play/stop of audio samples when enabled in configuration
- Changed: fplPlayAudio() will return fplAudioResult_Success when playback is already started
- Changed: fplStopAudio() will return fplAudioResult_Success when playback is already stopped
- Changed: Use nullptr for fpl_null when C++/11 is detected
- Changed: Separated audio target format and device format
- Removed: Removed obsolete to fplGetWideStringLength()
- Removed: Removed obsolete to fplCopyWideString()
- Removed: Removed obsolete to fplCopyWideStringLen()
- Removed: Removed obsolete fplOpenWideBinaryFile()
- Removed: Removed obsolete fplCreateWideBinaryFile()
- Removed: Removed obsolete fplSetWindowWideTitle()
- Removed: Removed obsolete fplGetClipboardWideText()
- Removed: Removed obsolete fplSetClipboardWideText()
- Removed: Removed obsolete fplWideStringToAnsiString()
- Removed: Removed obsolete fplAnsiStringToWideString()
- Removed: fplUpdateGameControllers()
- Removed: fplPushEvent()
- Removed: fplClearEvents()
- Fixed: fplStaticAssert was not compiling on gcc/clang C99 mode
- Fixed: Corrected a ton of misspellings in the documentation
- Fixed: Define FPL_DEBUG was missing a pound symbol
- Fixed: Use va_copy for all va_list function arguments
- New: Added fplFlushFile()
- New: Added fplAtomicAddAndFetchPtr()
- New: Added fplAtomicFetchAndAddPtr()
- New: Added startAuto field to fplAudioSettings structure
- New: Added stopAuto field to fplAudioSettings structure
- New: Added fplInitFlags_GameController to fplInitFlags enumeration
- New: Added fplPollEvents()
- New: Added typedef fpl_window_event_callback
- New: Added typedef fpl_window_exposed_callback
- New: Added structure fplWindowCallbacks as a field in fplWindowSettings
- New: Added support for disabling runtime linking -> FPL_NO_RUNTIME_LINKING
- New: Added structure fplAudioTargetFormat
- New: Added macro fplCopyStruct()
- New: Added macro fplIsBigEndian()
- New: Added macro fplIsLittleEndian()
- New: Added fplGetWindowState()
- New: Added fplSetWindowState()
- Changed: [Win32] GetTickCount() replaced with GetTickCount64()
- Changed: [Win32] Use unicode (*W) win32 api functions for everything now
- Changed: [Win32] fplGetOperatingSystemInfos uses additional RtlGetVersion
- Changed: [DirectSound] fplGetAudioDevices() uses DirectSoundEnumerateW instead of DirectSoundEnumerateA
- Changed: [Win32/X11] Changed event handling from indirect to direct
- Changed[*]: Optional runtime linking for OS library calls
- Fixed: [Win32] fplGetProcessorArchitecture was not handling the WOW64-case
- Fixed: [Win32] fplGetClipboardAnsiText() was broken
- Fixed: [Win32] Forced compile error when compiling on < vista (FPL uses several features which requires vista or higher)
- Fixed: [Win32] fplGetOperatingSystemInfos had no WINAPI call defined for GetVersion prototype
- Fixed: [Win32] fplSetWindowFloating was not working
- Fixed: [Win32] fplSetWindowDecorated was not working
- Fixed: [Win32] fplSetWindowResizeable was not working
- Fixed: [Alsa] fpl__AudioWaitForFramesAlsa was not compiling (commonAudio missing)
- Fixed: [Alsa] Alsa output was not working anymore for certain playback devices
- Fixed: [X11] fplButtonState_Repeat was not handled in keyboard events
- New: [Win32/POSIX] Implemented fplFlushFile()
- New: [Win32/X11] Handle fplInitFlags_GameController to enable/disable game controllers
- New: [Win32/X11] Support for handling the OS event directly -> fpl_window_event_callback
- New: [Win32/X11] Support for handling the exposed (Repaint) event directly -> fpl_window_exposed_callback
- New: [Win32] Implemented fplSetWindowState / fplGetWindowState
- Changed: Updated all the lists
- Changed: Added known issues section
- Changed: Renamed fplPlatformResultType to fplPlatformResultType
- Changed: fplPlatformInit returns now bool instead fplPlatformResultType
- Changed: Changed all comment prefix from \ to @, so it matches java-doc style
- Changed: Disable compile error when unix or bsd is detected
- Changed: Renamed fplGetKeyboardState to fplPollKeyboardState
- Changed: Renamed fplGetGamepadStates to fplPollGamepadStates
- Changed: fplDebugOut prints out to the console on non-MSVC
- Changed: Added enum value fplLogWriterFlags_StandardConsole
- Changed: Added enum value fplLogWriterFlags_ErrorConsole
- Changed: Removed field logToError from fplLogWriterConsole
- Changed: Internal audio system uses condition variables instead of signals now
- Removed: Removed obsolete field skipRepeatKeys in fplInputSettings
- Fixed: Clang compiler detection was not working because LLVM was detected first
- Fixed: UINT32_MAX was missing on android POSIX
- Fixed: fplFormatAnsiStringArgs was checking for argList as pointer which is wrong
- Fixed: leftTrigger/rightTrigger field in fplGamepadState had incorrect documentation
- New: Added function fplGetPlatformResult()
- New: Added struct fplMouseState
- New: Added function fplPollMouseState()
- New: Added field disabledEvents to fplInputSettings
- New: Added android platform detection
- New: Added enum fplGamepadButtonType
- Changed: [POSIX] Proper detection of all architecturess (x86, x86_64, x64, arm32, arm64)
- Changed: [POSIX] Moved fplGetCurrentUsername from the linux-section into the posix-section
- Changed: [POSIX] Moved fplGetProcessorCoreCount from Linux into the POSIX section
- Changed: [POSIX] Moved fplGetOperatingSystemInfos from Linux into the POSIX section
- Changed: [POSIX] Moved fplGetHomePath from Linux into the POSIX section
- Changed: [POSIX] Made fplGetExecutableFilePath Unix/Linux complaint and moved it into the POSIX section
- Changed: [POSIX] Added Clang/LLVM to atomics detection
- Fixed: [POSIX]: Removed alloca.h include when nor win32 or linux is detected
- Fixed: [POSIX]: Fixed typo in fplGetRunningArchitecture
- Fixed: [POSIX]: fplSemaphoreInit() was testing INT32_MAX instead of UINT32_MAX
- Fixed: [Win32] PeekMessage was not using our windowHandle at all
- Fixed: [Win32] fplReadFileBlock64/fplWriteFileBlock64 was not working at all
- Fixed: [Win32/XInput] Left/Right gamepad thumb buttons was not mapped
- Fixed: [POSIX] fplReadFileBlock64/fplWriteFileBlock64 was not working at all
- Fixed: [POSIX] Removed initialization (PTHREAD_MUTEX_INITIALIZER) of pthread_mutex_t in fpl__PosixMutexCreate
- Fixed: [X11] Fixed broken fplPollKeyboardState
- Fixed: [MSVC] Removed duplicated warning override in header
- New: [Win32]: Use SetCapture/ReleaseCapture for mouse down/up events
- New: [Win32]: Implemented fplPollMouseState()
- New: [Win32] Disable keyboard/mouse/gamepad events when fplInputSettings.disabledEvents is enabled
- New: [POSIX] Added __USE_LARGEFILE64 before including sys/types.h
- New: [X11] Implemented fplPollMouseState
- New: [X11] Implemented modifier keys in fplPollKeyboardState
- New: [Linux] Implemented fplPollGamepadStates
- Changed: Renamed fields "kernel*" to "os*" in fplOSInfos
- Changed: Renamed fields "system*" to "distribution*" in fplOSInfos
- Fixed: [X11] Fixed icon loading was not working at all
- Fixed: [POSIX] fplWriteFileBlock64 was not properly implemented
- Fixed: [POSIX] fplReadFileBlock64 was not properly implemented
- Changed: fplKey_Enter renamed to fplKey_Return
- Changed: fplKey_LeftWin renamed to fplKey_LeftSuper
- Changed: fplKey_RightWin renamed to fplKey_RightSuper
- Changed: fplKey_Plus renamed to fplKey_OemPlus
- Changed: fplKey_Minus renamed to fplKey_OemMinus
- Changed: fplKey_Comma renamed to fplKey_OemComma
- Changed: fplKey_Period renamed to fplKey_OemPeriod
- Changed: fplKeyboardModifierFlags_Alt are split into left/right part respectively
- Changed: fplKeyboardModifierFlags_Shift are split into left/right part respectively
- Changed: fplKeyboardModifierFlags_Super are split into left/right part respectively
- Changed: fplKeyboardModifierFlags_Ctrl are split into left/right part respectively
- Changed: All bool fields in structs are replaced with fpl_b32
- Changed: Added COUNTER macro to non-CRT FPL_STATICASSERT
- Changed: Renamed fields in fplMemoryInfos to match correct meaning
- Changed: String copy functions uses fplMemoryCopy instead of iterating and copy each char
- Changed: fplSetFilePosition32 returns now uint32_t instead of void
- Changed: Added field timeStamps to fplFileEntry
- Changed: [X11] Window title uses XChangeProperty now instead of XStoreName
- Changed: [Win32] Detection of left/right keyboard modifier flags
- Changed: [Win32] Mapping OEM 1-8 keys
- Changed: [Win32] Use MapVirtualKeyA to map key code to virtual key
- Fixed: Corrected a ton of comments
- Fixed: fpl__HandleKeyboardButtonEvent had incorrect previous state mapping
- Fixed: [X11] fplMouseEventType_Move event was never created anymore
- New: Added typedef fpl_b32 (32-bit boolean type)
- New: Added struct fplKeyboardState
- New: Added struct fplGamepadStates
- New: Added function fplGetKeyboardState()
- New: Added function fplGetSystemLocale()
- New: Added function fplGetUserLocale()
- New: Added function fplGetInputLocale()
- New: Added function fplGetGamepadStates()
- New: Added function fplKey_Oem1-fplKey_Oem8
- New: Added function fplGetFileTimestampsFromPath
- New: Added function fplGetFileTimestampsFromHandle
- New: Added internal function fpl__ParseTextFile used for parsing /proc/cpuinfo or other device files
- New: Added function fplGetFileSizeFromHandle
- New: Added function fplGetFileSizeFromHandle64
- New: Added function fplGetFileSizeFromPath
- New: Added function fplGetFileSizeFromPath64
- New: Added function fplGetFilePosition
- New: Added function fplGetFilePosition64
- New: Added function fplSetFilePosition
- New: Added function fplSetFilePosition64
- New: Added function fplWriteFileBlock
- New: Added function fplWriteFileBlock64
- New: Added function fplReadFileBlock
- New: Added function fplReadFileBlock64
- New: [Win32] Implemented fplGetKeyboardState
- New: [Win32] Implemented fplGetGamepadStates
- New: [Win32] Implemented fplGetSystemLocale
- New: [Win32] Implemented fplGetUserLocale
- New: [Win32] Implemented fplGetInputLocale
- New: [Win32] Implemented fplGetFileTimestampsFromPath
- New: [Win32] Implemented fplGetFileTimestampsFromHandle
- New: [Win32] Implemented fplReadFileBlock64
- New: [Win32] Implemented fplWriteFileBlock64
- New: [Win32] Implemented fplSetFilePosition64
- New: [Win32] Implemented fplGetFilePosition64
- New: [Win32] Implemented fplGetFileSizeFromPath64
- New: [Win32] Implemented fplGetFileSizeFromHandle64
- New: [X11] Implemented fplGetKeyboardState
- New: [X11] Set window icon title using XChangeProperty
- New: [X11] Give window our process id
- New: [X11] Load window icons on startup
- New: [X11] Added ping support for letting the WM wakeup the window
- New: [Linux] Implemented fplGetSystemLocale
- New: [Linux] Implemented fplGetUserLocale
- New: [Linux] Implemented fplGetInputLocale
- New: [Linux] Reading first joystick as game controller in linux
- New: [POSIX] Implemented fplGetFileTimestampsFromPath
- New: [POSIX] Implemented fplGetFileTimestampsFromHandle
- New: [POSIX] Implemented fplReadFileBlock64
- New: [POSIX] Implemented fplWriteFileBlock64
- New: [POSIX] Implemented fplSetFilePosition64
- New: [POSIX] Implemented fplGetFilePosition64
- New: [POSIX] Implemented fplGetFileSizeFromPath64
- New: [POSIX] Implemented fplGetFileSizeFromHandle64
- New: Added macro function FPL_STRUCT_INIT
- New: Added enum value fplWindowEventType_DropSingleFile
- New: Added structure fplWindowDropFiles
- New: Added enum value fplInitFlags_Console
- New: [Win32] Support for WM_DROPFILES -> fplWindowEventType_DropSingleFile event
- Changed: Move fplInitFlags_All out and made it a static constant
- Changed: Use fplInitFlags_Console to activate console or not
- Fixed: fplExtractFileExtension was returning wrong result for files with multiple separators
- Fixed: [Win32] Fullscreen toggling was broken in maximize/minimize mode
- Fixed: [Win32] ClientToScreen prototype was missing WINAPI call
- Fixed: [POSIX] fplListDirNext() was broken
- Fixed: [X11] Key up event was never fired (KeyRelease + KeyPress = Key-Repeat)
- Changed: fplVersionInfo is now parsed as char[4] instead of uint32_t
- Changed: fplMouseEvent / fplKeyboardEvent uses fplButtonState instead of a bool for the state
- Changed: Replaced fplMouseEventType_ButtonDown / fplMouseEventType_ButtonUp with fplMouseEventType_Button
- Changed: Replaced fplKeyboardEventType_KeyDown / fplKeyboardEventType_KeyUp with fplKeyboardEventType_Button
- Fixed: Fixed incompabilties with MingW compiler
- New: Added function fplStringToS32
- New: Added function fplStringToS32Len
- New: Added function fplS32ToString
- New: Added function fplAtomicLoadSize
- New: Added function fplAtomicStoreSize
- New: Added function fplAtomicExchangeSize
- New: Added function fplAtomicCompareAndExchangeSize
- New: Added function fplIsAtomicCompareAndSwapSize
- New: Added function fplAtomicAddSize
- New: Added function fplAtomicIncU32
- New: Added function fplAtomicIncU64
- New: Added function fplAtomicIncS32
- New: Added function fplAtomicIncS64
- New: Added function fplAtomicIncSize
- New: Added macro FPL_IS_POWEROFTWO
- New: Introduced FPL_CPU_32BIT and FPL_CPU_64BIT
- New: fplAtomic*Ptr uses FPL_CPU_ instead of FPL_ARCH_ now
- New: Added enumeration fplButtonState
- New: Added field multiSamplingCount to fplOpenGLVideoSettings
- Changed: [Win32] Changed keyboard and mouse handling to use fplButtonState now
- Changed: [Win32] Changed fplListDirBegin/fplListDirNext to ignore . and ..
- Changed: [Win32] Console activation is done when _CONSOLE is set as well
- Changed: [X11] Changed keyboard and mouse handling to use fplButtonState now
- Fixed: [Win32] fplGetTimeInMillisecondsHP was not returning a proper double value
- Fixed: [Win32] Fixed crash when using fplThreadTerminate while threads are already exiting
- Fixed: [Win32] fplThreadWaitForAll/fplThreadWaitForAny was not working properly when threads was already in the process of exiting naturally
- Fixed: [Win32] Fixed incompabilties with MingW compiler
- Fixed: [POSIX] Fixed crash when using fplThreadTerminate while threads are already exiting
- New: [Win32] Support for OpenGL multi sampling context creation
- New: [GLX] Support for OpenGL multi sampling context creation
- Changed: Ensures const correctness on all functions
- Changed: Signature of fplDynamicLibraryLoad changed (Returns bool + Target handle parameter)
- Fixed: Corrected code documentation for all categories
- Fixed: FPL_ENUM_AS_FLAGS_OPERATORS had invalid signature for operator overloadings and missed some operators
- Fixed: Fixed fplMemorySet was not working for values > 0
- New: Forward declare thread handle for thread callback
- New: Added fplKey for OEM keys (Plus, Comma, Minus, Period)
- New: Added fplKey for Media & Audio keys
- New: Added fplWindowEventType_Maximized / fplWindowEventType_Minimized / fplWindowEventType_Restored
- New: Added documentation category: Assertions & Debug
- New: Added documentation category: Storage class identifiers
- New: Added documentation category: Constants
- New: Added documentation category: Function macros
- New: Undef annoying defined constants such as None, Success, etc.
- New: Added fplImageType enumeration
- New: Added fplImageSource structure
- New: Added icons as fplImageSource array to fplWindowSettings
- Changed: [Win32] Correct fplDynamicLibraryLoad to match signature change
- Changed: [Win32] Corrected function prototype macro names
- Fixed: [Win32] ClientToScreen prototype was defined twice
- New: [Win32] OEM keys mapping
- New: [Win32] Media & Audio key mapping
- New: [Win32] Handle window maximized/minimized and restored events
- New: [Win32] Load small/big icon from the fplWindowSettings icon imagesources
- Changed: [X11] Corrected function prototype macro names
- New: [X11] OEM keys mapping
- Changed: [X11] Corrected function prototype macro names
- Changed: [POSIX] Correct fplDynamicLibraryLoad to match signature change
- Changed: [POSIX] Use of pthread_timedjoin_np to support timeout in fplThreadWaitForOne when available (GNU extension)
- Changed: Locked error states to multiple and removed FPL_NO_MULTIPLE_ERRORSTATES
- Changed: Renamed fplClearPlatformErrors() to fplClearErrors()
- Changed: Renamed fplGetPlatformErrorCount() to fplGetErrorCount()
- Changed: Renamed fplGetPlatformErrorFromIndex() to fplGetErrorByIndex()
- Changed: Renamed fplGetPlatformError() to fplGetLastError()
- Changed: Refactored logging system
- Changed: Updated comments
- Fixed: fplAnsiString<->WideString conversion enforces ANSI locale (Non Win32)
- New: Added enum fplLogLevel
- New: Added enum fplLogWriterFlags
- New: Added struct fplLogWriter
- New: Added struct fplLogSettings
- New: Added struct fplSemaphoreHandle
- New: Added fplSetLogSettings()
- New: Added fplGetLogSettings()
- New: Added fplSetMaxLogLevel()
- New: Added fplGetMaxLogLevel()
- New: Added fplSemaphoreInit()
- New: Added fplSemaphoreDestroy()
- New: Added fplSemaphoreWait()
- New: Added fplSemaphoreTryWait()
- New: Added fplSemaphoreValue()
- New: Added fplSemaphoreRelease()
- New: Added fplIsStringMatchWildcard()
- Changed: [ALSA] Allow user selection of audio device id
- Fixed: [Win32] WaitForMultipleObjects >= WAIT_OBJECT_0 bugfix
- New: [ALSA] Implemented fplGetAudioDevices
- New: [Win32] Implemented Semaphores
- New: [POSIX] Implemented Semaphores
- Changed: Changed from inline to api call for fplGetAudioBufferSizeInFrames/fplGetAudioFrameSizeInBytes/fplGetAudioBufferSizeInBytes
- Changed: Changed from inline to api call for fplGetArchTypeString / fplGetPlatformResultTypeString / fplGetPlatformTypeString
- Changed: Moved FPL_CLEAR_STRUCT to public api
- New: Added fplThreadYield()
- Changed: [GLX] Added types such as XVisualInfo directly without relying on glx.h
- Fixed: [Win32] Console window was not working anymore the second time fplPlatformInit was called
- Fixed: [GLX] XVisualInfo was manually defined, now we use Xutil.h
- New: [Win32] Implemented fplThreadYield()
- New: [POSIX] Implemented fplThreadYield()
- New: [Linux] Implemented fplGetRunningArchitecture()
- New: [Linux] Implemented fplGetOperatingSystemInfos()
- New: [X11] Implemented Video Software output for X11
- Changed: Collapsed down all argument checking using macros
- Changed: Use FPL_CLEAR_STRUCT only when it is appropriate
- Changed: All public checks for fpl__global__AppState returns proper error now
- Changed: fplGetAudioHardwareFormat returns bool and requires a outFormat argument now
- Changed: fplSetAudioClientReadCallback returns bool now
- Changed: fplListFiles* is renamed to fplListDir*
- Changed: fplListDir* argument for fplFileEntry is renamed to entry for all 3 functions
- Changed. fplFileEntry stores the fullPath instead of the name + internal root infos - Changed: Introduced fplFilePermissions in fplFileEntry
- Changed: Removed flag fplFileAttributeFlags_ReadOnly from fplFileAttributeFlags
- Fixed: Fixed a ton of wrong inline definitions
- Fixed: Fixed GCC warning -Wwrite-strings
- Fixed: fplDebugBreak() was missing function braces for __debugbreak
- New: Added fplEnforcePathSeparatorLen()
- New: Added fplEnforcePathSeparator()
- New: Added fileSize field to fplFileEntry
- New: Added struct fplFilePermissions
- New: Added enum fplFilePermissionMasks
- New: Added fplDebugOut()
- New: Added fplDebugFormatOut()
- New: Added fplWindowShutdown()
- New: Added macro FPL_STRUCT_SET
- Changed: [POSIX] Removed all pthread checks, because there is a check for platform initialization now
- Changed: [Win32] Changed fplListDir* to support fplFilePermissions
- Changed: [Win32] Showing cursor does not clip cursor anymore
- Fixed: [POSIX] Fixed a ton of C99 compile errors
- New: [POSIX] Implemented fplListDirBegin
- New: [POSIX] Implemented fplListDirNext
- New: [POSIX] Implemented fplListDirEnd
- New: [X11] Implemented fplWindowShutdown()
- New: [Win32] Fill out fileSize for fplFileEntry in fplListDir*
- New: [Win32] Implemented fplWindowShutdown()
- New: Added fplMutexTryLock()
- New: Added fplMakeDefaultSettings()
- New: Added fplStringAppend() / fplStringAppendLen()
- New: Added fplDebugBreak()
- Changed: Any string buffer writing functions returns the last written character now
- Changed: Changed fplGetClipboardAnsiText() to return bool instead of char *
- Changed: Changed fplGetClipboardWideText() to return bool instead of wchar_t *
- Changed: Entry point definition implementation is now a separated block and controlled by FPL_ENTRYPOINT
- Changed: MSVC compiler warnings are only disabled inside the implementation block
- Fixed: Never detected Win32 Path separator (Wrong define check)
- Fixed: MSVC compiler warnings was overwritten always, now uses push/pop
- Fixed: MSVC _Interlocked* functions has no signature for unsigned, so we use either LONG or LONG64
- Fixed: MSVC _Interlocked* replaced with Interlocked* macros
- New: [X11] Implemented fplIsWindowFullscreen
- New: [X11] Implemented basic fplSetWindowFullscreen
- Fixed: [POSIX] Create/Open*BinaryFile was wrong named
- Fixed: [Win32] fplMemoryFree actually never freed any memory
- Changed: Renamed fplGetRunningArchitectureType to fplGetRunningArchitecture
- Changed: Renamed fplThreadDestroy() to fplThreadTerminate() + signature changed (Returns bool)
- Changed: fplSignalInit() + new parameter "initialValue"
- Changed: All functions which uses timeout uses fplTimeoutValue instead of uint32_t
- Changed: All string buffer writing functions returns the last written character instead
- Changed: Removed timeout parameter from fplMutexLock()
- New: Added struct fplConditionVariable
- New: Added enum fplSignalValue
- New: Added fplConditionInit()
- New: Added fplConditionDestroy()
- New: Added fplConditionWait()
- New: Added fplConditionSignal()
- New: Added fplConditionBroadcast()
- New: Added typedef fplTimeoutValue
- New: Added constant FPL_TIMEOUT_INFINITE
- Changed: [Win32] Thread resources are automatically cleaned up when a thread is done running
- Changed: [POSIX] Thread resources are automatically cleaned up when a thread is done running
- Changed: [Win32] fplSignalInit updated to support isSetInitially
- Changed: [Linux] fplSignalInit updated to support isSetInitially
- Fixed: [GLX] Fallback to glXCreateContext was not working properly
- New: [Linux] Implemented fplGetCurrentUsername
- New: [Win32] Implemented all fplCondition*
- New: [POSIX] Implemented all fplCondition*
- Changed: Updated documentations
- Changed: Small refactoring of the internal audio system
- Changed: Renamed fplMutexCreate to fplMutexInit + signature change (Returns bool, Mutex pointer argument)
- Changed: Renamed fplSignalCreate to fplSignalInit + signature change (Returns bool, Signal pointer argument)
- Changed: Removed mutex parameter from SignalWaitFor*
- Changed: [GLX] Use glXCreateContext with visual info caching for GLX < 1.3 and glXCreateNewContext for GLX >= 1.3
- Changed: [POSIX] All FPL__POSIX_GET_FUNCTION_ADDRESS_BREAK are wrapped around a do-while loop so it can "break" properly.
- Removed: [POSIX] All signal functions removed
- New: [ALSA] Added rudimentary ALSA playback support
- New: [Linux] Implemented signal functions using eventfd
- Fixed: [Win32] Removed x64 detection for fplAtomicStoreS64 and fplAtomicExchangeS64 and use _InterlockedExchange*64 directly
- Changed: [GLX] Implemented modern opengl context creation
- Changed: fplConsoleWaitForCharInput returns char instead of const char
- Changed: Added isDecorated field to fplWindowSettings
- Changed: Added isFloating field to fplWindowSettings
- Changed: Renamed fplSetWindowTitle() -> fplSetWindowAnsiTitle()
- Changed: Copy Ansi/Wide String pushes error for buffer range error
- Fixed: Fixed api name mismatch CloseFile() -> fplCloseFile()
- Fixed: Corrected wrong doxygen defines
- Fixed: Corrected most clang compile warnings
- New: Added fplIsWindowDecorated() / fplSetWindowDecorated()
- New: Added fplIsWindowFloating() / fplSetWindowFloating()
- New: Added fplSetWindowWideTitle()
- New: Added fplGetTimeInMillisecondsHP()
- New: Added fplGetTimeInMillisecondsLP()
- New: Added fplGetTimeInSecondsLP()
- New: Added fplGetTimeInSecondsHP()
- New: Added FPL_NO_ENTRYPOINT
- Changed: [Win32] fplAtomicExchangeS64() / fplAtomicAddS64() / fplAtomicStoreS64() uses _Interlocked* operatings directly for x86
- Fixed: [Win32] Corrected wrong case-sensitivity in includes
- Fixed: [Win32] Fixed Cursor visibility was not properly changeable
- Fixed: [Win32] Function prototype macros was not properly named
- New: [Win32] Implemented fplIsWindowDecorated() / fplSetWindowDecorated()
- New: [Win32] Implemented fplIsWindowFloating() / fplSetWindowFloating()
- New: [Win32] Implemented fplSetWindowWideTitle()
- New: [Win32] Implemented fplGetTimeInMillisecondsLP()
- New: [Win32] Implemented fplGetTimeInMillisecondsHP()
- New: [Win32] Implemented fplGetTimeInSecondsLP()
- New: [Win32] Implemented fplGetTimeInSecondsHP()
- New: [POSIX] Implemented fplGetTimeInMillisecondsLP()
- New: [POSIX] Implemented fplGetTimeInMillisecondsHP()
- New: [POSIX] Implemented fplGetTimeInSecondsLP()
- New: [POSIX] Implemented fplGetTimeInSecondsHP()
- Changed: Signature of fplGetRunningMemoryInfos() changed
- Changed: Renamed fplGetSystemMemoryInfos to fplGetRunningMemoryInfos
- Changed: Added "p" prefix to linux and unix app state
- New: Added enum fplArchType
- New: Added fplGetRunningArchitectureType()
- New: Added fplGetArchTypeString()
- New: Added enum fplPlatformType
- New: Added fplGetPlatformType()
- New: Added fplGetPlatformTypeString()
- New: Added struct fplVersionInfo
- New: Added struct fplOSInfos
- New: Added fplGetOperatingSystemInfos()
- New: Added fplGetCurrentUsername()
- Changed: [Docs] Updated all documentations to match the current state
- Fixed: [Docs] Missing brief for fpl_extern
- Changed: [MSVC] Removed the compiler specific No-CRT block such as _fltused, etc. -> The caller is responsible for this!
- New: [Win32] Implemented fplGetCurrentUsername()
- New: [Win32] Implemented fplGetOperatingSystemInfos()
- New: [Win32] Implemented fplGetRunningArchitectureType()
- Changed: fplConsoleFormatOut/fplConsoleFormatError is now common_api instead of platform_api
- Changed: FPL uses a keyMap for mapping OS key codes to fplKey for every platform
- Changed: [Win32] Console does not cache the output/input/error handles
- Changed: [Win32] fplConsole* uses ReadFile/WriteFile instead of ReadConsole/WriteConsole
- Changed: BSD Platform is detected as a Unix Platform, but has its own subplatform as well
- Fixed: [Win32] Console was always allocated
- Fixed: No CRT stub defintions such as memset and RTC was added for all compilers which is wrong
- Fixed: Several bugfixes
- New: Added stubs for Unix Platform
- Changed: Switched to C99
- Changed: Changed Init/app state structs a lot
- Changed: Removed most anonymous unions and structs
- Changed: Renamed a lot of the internal handles
- Changed: Renamed ThreadContext to ThreadHandle
- Changed: Renamed ThreadSignal to SignalHandle
- Changed: Renamed ThreadMutex to MutexHandle
- Changed: All structs, functions with name API renamed to *Api
- Changed: Moved internal functions around and restructured things
- Changed: Moved platforms and subplatforms into its own namespace
- Changed: Updated documentation a bit
- Changed: Introduced common::Argument*Error functions
- Changed: Removed MemoryStackAllocate()
- Changed: App state memory size is aligned by 16-bytes as well
- Changed: Video/Audio state memory block is included in app state memory as well
- Changed: PlatformInit uses InitResultType
- Changed: fpl*DefaultSettings is now fplSet*DefaultSettings and does not return a struct anymore
- Fixed: Get rid of const char to char* warnings for Get*DriverString() functions
- Fixed: [Win32] Icon was not default application icon
- Fixed: ExtractFileName and ExtractFileExtension was not returning const char*
- New: [X11][Window] Implemented X11 Subplatform
- New: [X11][OpenGL] Implemented X11/GLX video driver
- New: [X11][Software] Implemented Software video driver
- New: [POSIX] Implemented all remaining posix functions
- New: Introduced debug logging -> FPL_LOGGING
- New: Added FPL_ALIGNMENT_OFFSET macro
- New: Added FPL_ALIGNED_SIZE macro
- New: Added InitResultType
- New: CRT (C-Runtime) is not required anymore
- Changed: Documentation changed a bit
- Changed: Renamed SignalWakeUp() to SignalSet()
- Changed: [Win32] Start thread always immediatly
- Changed: Included "Windows" prefix for output path in visual studio projects
- Changed: Moved opengl settings into graphics union
- Changed: All global functions use :: as a prefix
- Deleted: Removed ThreadSuspend() -> Not complaint with pthread
- Deleted: Removed ThreadResume() -> Not complaint with pthread
- Deleted: Removed SignalReset() -> Not complaint with pthread
- Fixed: Resize video backbuffer was not working anymore
- Fixed: [Win32] Some _Interlocked* functions was not existing on x86
- New: Introduced PrepareWindowForVideoAfter() so we can setup a video context after the window has been created
- New: Introduced PrepareWindowForVideoBefore() so we can setup any window before initializing the video context
- New: Added timings::GetTimeInMilliseconds() with [Win32] and [POSIX] implementation
- New: [POSIX] Implemented all threading functions
- New: [Linux] Added a makefile for each demo project
- New: Added files::FileMove
- Changed: MemoryInfos uses uint64_t instead of size_t
- Changed: Added BSD to platform detecton
- Changed: Architecture detection does not use _WIN64 or _WIN32 anymore
- Changed: fpl_api is now either fpl_platform_api or fpl_common_api
- Changed: Internal code refactoring
- Changed: Renamed VideoSettings driverType to driver
- Changed: Video initialization is now platform independent
- Changed: Window initialization is now platform independent
- Changed: Moved window::WindowFlip to video::VideoFlip
- Changed: [POSIX] Replaced file-io with POSIX open, read, write
- Changed: [Win32] Removed fpl_api from main entry point forward declararation
- Changed: [Win32] Moved main entry point inside the implementation block
- Fixed: Arm64 was misdetected as X64, this is now its own arch
- Fixed: GNUC and ICC are pure C-compilers, it makes no sense to detect such in a C++ library
- Fixed: [Linux][POSIX] Refactor init and release to match PlatformInitState and PlatformAppState
- Updated: Documentations updated
- New: [POSIX][X11][Linux] Added missing functions as not-implemented
- Changed: Moved documentation inside its own file "final_platform_layer.documentation"
- Changed: [Win32] Window creation uses CS_OWNDC always
- Changed: Refactoring of platform and non-platform code
- Changed: InitPlatform() and ReleasePlatform() is now platform independent
- Changed: KeyboardEventType::Char renamed to KeyboardEventType::CharInput
- Changed: Completed basic documentation
- Changed: Renamed VideoBackBuffer.stride to VideoBackBuffer.lineWidth
- Changed: Moved a few internal inline audio functions to the global audio namespace
- Fixed: [Win32] WM_CHAR was allowing unicode characters as well, which is wrong because it must be properly converted first.
- Fixed: Audio driver selection was buggy
- Added: pixelStride to fpl::video::VideoBackBuffer
- Added: fpl::window::ClearWindowEvents()
- Added: fpl::window::PushWindowEvent()
- Added: fpl::window::UpdateGameControllers()
- Added: fpl::audio::GetAudioBufferSizeInFrames()
- Added: fpl::audio::GetAudioDriverString()
- Added: fpl::audio::GetAudioFormatString()
- Added: fpl::audio::GetAudioSampleSizeInBytes()
- Added: fpl::audio::GetAudioFrameSizeInBytes()
- Added: fpl::audio::GetAudioBufferSizeInBytes()
- Changed: SignalWaitFor* requires additional parameter for passing in the ThreadMutex reference (pthread compatibility)
- Changed: Signal* does not use const reference anymore (pthread compatibility)
- Changed: Updated documentation a ton
- Changed: Decreased MAX_ERRORSTATE_COUNT from 1024 to 256
- Changed: global__LastErrorState is a non-pointer global now
- Changed: Renamed GetPlatformLastError() to GetPlatformError()
- Changed: All array of objects parameters uses C++ array style -> int *arr[] instead of int **arr
- Fixed: MemoryAlignedFree() had wrong signature (void **) instead of (void *)
- Fixed: GetPlatformErrorCount() was not increasing when an empty error was pushed on for single error states
- Fixed: [Win32] InitPlatform() was not cleaning up the Win32State when the initialization failed
- Replaced: VideoCompatibilityProfile is replaced by OpenGLCompatibilityFlags (Only available with OpenGL)
- New: Added ClearPlatformErrors()
- Changed: Updated code documentation for all functions and types to doxygen/javadoc style
- Changed: SetFilePosition32 position is now int32_t instead of uint32_t to support negative positions as well
- Changed: Renamed desiredFormat to deviceFormat in AudioSettings
- Changed: [DirectSound] Use deviceID as GUID for the audio device
- New: Introduced AudioDeviceID
- New: Added deviceID field in AudioSettings
- New: Added audio::GetAudioDevices()
- New: Added strings::FormatString()
- Fixed: [Win32] Fixed SetWindowFullscreen was not working properly
- New: Introduced outputRect in VideoBackBuffer + Win32 implementation
- Changed: SetWindowFullscreen returns bool
- Added: Added new audio formats (AudioFormatType::F64, AudioFormatType::S64)
- Fixed: xInputSetState renamed to xInputGetState internally
- Added: Introduced InputSettings
- Added: [Win32] XInput controller detection is now limited to a fixed frequency, for improving performance (InputSettings.controllerDetectionFrequency)
- Changed: Total change of documentation style
- Changed: [Win32] ThreadMutex uses a critical section instead of a event
- Changed: [Win32] Include windows.h in the header, so we can define HANDLE, CRITICAL_SECTION in the api
- Changed: [Win32] Changed lots of functions to use conditions instead of asserts
- Changed: [Win32] Changed format specifiers to use either d or zu for integer types
- Changed: All Thread*Wait functions returns if the wait was successful or not in the same way Signal*Wait
- Changed: All ListFiles* functions uses reference instead of pointer
- Changed: We are back to C++/11 and we will never going back to C++/98
- New[POSIX]: Implemented fpl::timings
- New[POSIX]: Implemented fpl::library
- New[POSIX]: Implemented fpl::threading::ThreadSleep
- Changed[POSIX]: Moved Linux fpl::console functions to Posix
- Changed: All internal handles are now unions now, so can have different sizes of handles
- Changed: Introduced POSIX platform and moved linux atomics into it
- Fixed: Some enum types was not using the namespace version
- Changed: Use custom int types because C++/98 has no default types unfortunatly
- Fixed: Changed compiler detection order, because some non-MSVC compilers define _MSVC
- Changed: Better C++/11 feature detection for optional nullptr and constexpr
- Fixed: Corrected all doxygen statements to match new enum style or added missing exlamation marks.
- Changed: Library is now C++/98 complaint
- Changed: The actual enum type for "flags" has no "s" at the end anymore.
- Opimization: Changed some internal functions to "static inline"
- Changed: Renamed audio::GetAudioNativeFormat to audio::GetAudioHardwareFormat
- New: Added "periods", "bufferSizeInBytes", "bufferSizeInFrames" to AudioDeviceFormat
- New: audio::GetAudioNativeFormat()
- New: audio::SetAudioClientReadCallback()
- Fixed: InitFlags::Audio was never tested before InitAudio() was being called.
- Changed: Renamed ThreadStop to ThreadDestroy
- Added: [Win32] DirectSound playback support
- Added: Asyncronous audio playback
- Fixed: [Win32] For now, load all user32 functions always, even when window is not used (This is to prepare for audio playback)
- Fixed: [Win32] ThreadStop was not releasing the thread handle
- Added: [Win32] ThreadWaitForAny
- Added: [Win32] SignalWaitForAll
- Added: [Win32] SignalWaitForAny
- Added: [Win32] SignalReset
- Added: FPL_NO_VIDEO
- Changed: ThreadWaitForSingle renamed to ThreadWaitForOne
- Changed: ThreadWaitForMultiple renamed to ThreadWaitForAll
- Changed: SignalWait renamed to SignalWaitForOne
- Removed: Removed all _internal _INTERNAL postfixes from types, functions and macros
- Changed: Proper identitation for compiler directives based on context
- Added: [Win32] Dynamically loading ole32 functions (CoCreateInstance, CoInitializeEx, etc.)
- Fixed: [Win32] GetCursor was not using the dynamic loaded function
- Fixed: [Win32] Missing Clipboard dynamic functions
- Removed: Removed all audio code for now
- Changed: A total cleanup of all internal stuff, so its much easier to add in new features
- New: AtomicLoadU32, AtomicLoadU64, AtomicLoadS32, AtomicLoadS64, AtomicLoadPtr
- New: AtomicStoreU32, AtomicStoreU64, AtomicStoreS32, AtomicStoreS64, AtomicStorePtr
- New: AtomicExchangePtr, AtomicCompareAndExchangePtr, IsAtomicCompareAndExchangePtr
- New: [Win32] Implementation for AtomicLoadU32, AtomicLoadU64, AtomicLoadS32, AtomicLoadS64, AtomicLoadPtr
- New: [Win32] Implementation for AtomicStoreU32, AtomicStoreU64, AtomicStoreS32, AtomicStoreS64, AtomicStorePtr
- New: [Linux] Implementation for AtomicLoadU32, AtomicLoadU64, AtomicLoadS32, AtomicLoadS64, AtomicLoadPtr
- New: [Linux] Implementation for AtomicStoreU32, AtomicStoreU64, AtomicStoreS32, AtomicStoreS64, AtomicStorePtr
- New: [Win32] Loading of DirectSound (Prepare for audio output support)
- Draft: Added first audio output api
- Fixed: Threading context determination
- Fixed: [Win32] Fixed all thread implementations
- Fixed: [Win32] SetWindowLongPtrA does not exists on X86
- Fixed: [Win32] Missing call convention in SHGetFolderPathA and SHGetFolderPathW
- Changed: Improved header documentation (More examples, better descriptions, proper markdown syntax, etc.)
- Changed: All threading functions uses pointer instead of reference
- Changed: [Linux] Atomic* uses __sync instead of __atomic
- Changed: A bit of internal cleanup
- Changed: [Win32] Load all user32 and shell32 functions dynamically
- Changed: FPL_ENUM_AS_FLAGS_OPERATORS_INTERNAL requires a int type as well
- Fixed: MemoryAlignedAllocate and MemoryAlignedFree was broken
- Added: FPL_IS_ALIGNED macro
- Fixed: [Win32] Crash when window is not set in the InitFlags but FPL_USE_WINDOW is set.
- Changed: [Win32] Use CommandLineToArgvW for command line parsing
- New: [Win32] Implemented argument parsing for WinMain and wWinMain
- Fixed: Corrected small things for doxygen
- Changed: Renamed CopyAFile to FileCopy
- Changed: Renamed DeleteAFile to FileDelete
- New: Introduced IsAtomicCompareAndExchange
- Added: [Linux] Implemented IsAtomicCompareAndExchange for all 32 and 64 bit integer types
- Added: [Win32] Implemented IsAtomicCompareAndExchange for all 32 and 64 bit integer types
- Added: [Win32] Loading gdi32.dll dynamically for ChoosePixelFormat, etc.
- Added: [Win32] Loading opengl32.dll dynamically for wglGetProcAddress, wglMakeCurrent, etc.
- Fixed: [Win32] Adding memory fence for AtomicReadWriteFence on non-x64 architectures
- Fixed: [Win32] Adding memory fence for AtomicReadFence on non-x64 architectures
- Fixed: [Win32] Adding memory fence for AtomicWriteFence on non-x64 architectures
- Fixed: Solidified descriptions for all Atomic*Fence
- Changed: Enabled FPL_FORCE_ASSERTIONS will ensure that C asserts are never used, because it may be compiled out.
- Changed: Removed all FPL_WIN32_ kernel32 macros and replaced it with normal calls.
- Changed: [Win32] Changed a lof ot the internals
- Added: [Linux] Started linux implementation
- Added: [Linux] Memory allocations
- Added: [Linux] Atomic operations
- Added: Check for C++/11 compiler and fail if not supported
- Added: Nasty vstudio 2015+ workaround to detect C++/11
- Added: &= operator overloading for enums
- Changed: AtomicCompareAndExchange argument "comparand" and "exchange" flipped.
- Changed: constexpr is now fpl_constant to make clear what is a constant
- Removed: [Win32] CreateDIBSection is not needed for a software backbuffer
- Fixed: [Win32] Software rendering was not working properly.
- Fixed: Some AtomicCompareAndExchange signatures was still AtomicAndCompareExchange
- Cleanup: Internal cleanup
- Changed: All the settings constructors removed and replaced by a simple inline function.
- Added: Added native C++ unit test project to demos solution
- Fixed: FPL_OFFSETOF was not working
- Fixed: All file size macros like FPL_MEGABYTES was returning invalid results.
- Removed: FPL_PETABYTES and higher are removed, just because its useless.
- Changed: All FPL_ENABLE_ defines are internal now, the caller must use FPL_NO_ or FPL_YES_ respectivily.
- Changed: AtomicCompareExchange* is now AtomicCompareAndExchange*
- Changed: InitFlags::VideoOpenGL is now InitFlags::Video
- Added: Software rendering support
- Added: VideoDriverType enumeration for selecting the active video driver
- Added: video::GetVideoBackBuffer with [Win32] implementation
- Added: video::ResizeVideoBackBuffer with [Win32] implementation
- Added: FPL_PETABYTES macro
- Added: FPL_EXABYTES macro
- Added: FPL_ZETTABYTES macro
- Added: FPL_YOTTABYTES macro
- Added: FPL_MIN macro
- Added: FPL_MAX macro
- Added: MutexCreate with [Win32] implementation
- Added: MutexDestroy with [Win32] implementation
- Added: MutexLock with [Win32] implementation
- Added: MutexUnlock with [Win32] implementation
- Added: SignalCreate with [Win32] implementation
- Added: SignalDestroy with [Win32] implementation
- Added: SignalWait with [Win32] implementation
- Added: SignalWakeUp with [Win32] implementation
- Added: GetClipboardAnsiText with [Win32] implementation
- Added: GetClipboardWideText with [Win32] implementation
- Added: SetClipboardText with [Win32] implementation for ansi and wide strings
- Added [MSVC]: AtomicExchangeS32 (Signed integer)
- Added [MSVC]: AtomicExchangeS64 (Signed integer)
- Added [MSVC]: AtomicAddS32 (Signed integer)
- Added [MSVC]: AtomicAddS64 (Signed integer)
- Added [MSVC]: AtomicCompareExchangeS32 (Signed integer)
- Added [MSVC]: AtomicCompareExchangeS64 (Signed integer)
- Fixed [MSVC]: AtomicExchangeU32 was not using unsigned intrinsic
- Fixed [MSVC]: AtomicExchangeU64 was not using unsigned intrinsic
- Fixed [MSVC]: AtomicAddU32 was not using unsigned intrinsic
- Fixed [MSVC]: AtomicAddU64 was not using unsigned intrinsic
- Fixed [MSVC]: AtomicCompareExchangeU32 was not using unsigned intrinsic
- Fixed [MSVC]: AtomicCompareExchangeU64 was not using unsigned intrinsic
- Implemented [Win32]: GetProcessorCoreCount
- Implemented [Win32]: Main thread infos
- Performance [Win32]: GetProcessorName (3 loop iterations at max)
- Cleanup: All win32 functions are macro calls now (prepare for dynamic function loading)
- Fixed: FPL_ENABLE_WINDOW was enabling window features even when it was deactivated by the caller
- Renamed: All memory/library/threading functions
- Removed: FPL_ENABLE_PUSHMEMORY removed entirely
- Renamed: CopyFile/DeleteFile/All memory functions renamed (Stupid win32!)
- Renamed: All internal opengl defines renamed, so that it wont conflict with other libraries
- Fixed: [Win32] strings::All Wide conversions was not working properly
- Removed: [Win32] Undefs for CopyFile
- Changed: [Win32/OpenGL] Test for already included gl.h
- Basic threading creation and handling
- Fixed strings::All Wide convertions was not working properly
- Introduced: Automatic namespace inclusion (FPL_AUTO_NAMESPACE)
- Introduced: Push memory (FPL_ENABLE_PUSHMEMORY)
- Signature changed for: ExtractFilePath/ChangeFileExtension (source first, destination second)
- Window features not not compiled out anymore when FPL_ENABLE_WINDOW is 0
- New overloaded CombinePath without any destination arguments
- New: AllocateStackMemory function
- Optional destination arguments for: GetExecutableFilePath/GetHomePath/ChangeFileExtension/CombinePath
- Fixed strings::CopyAnsiString/CopyWideString was not returning the correct value
- All types/structs/fields/functions documented
- [Win32] Fixed legacy opengl (GL_INVALID_OPERATION)
- Updated documentation a lot
- [Win32] Support for WGL opengl profile selection
- Added memory::CopyMemory
- Added fpl::GetLastError and fpl::GetLastErrorCount for proper error handling
- Added files::CreateBinaryFile and files::OpenBinaryFile for wide file paths
- Added basic support for creating a modern opengl rendering context, see VideoCompatibilityProfile in VideoSettings
- Added support for enabling opengl vsync through WGL
- Returns char * for all paths:: get like functions
- Returns char/wchar_t * for all strings:: functions
- Fixed files::CreateBinaryFile was never able to overwrite the file.
- Fixed include was in some namespaces defined
- Fixed files::ClearMemory was wrong
- Replaced all const constants with fpl_constant
- Removed template code / Replaced it with macros
- Added CreateDirectories
- Returns char * for all path get like functions
- Fixed CreateBinaryFile was never able to overwrite the file.
- Changed to a doxygen + vc complaint documentation style
- CopyFile2, DeleteFile2 and CloseFile2 are now CopyFile, DeleteFile, CloseFile
- Support for doxygen in documentations
- Added XInput support
- Changed a lot of pointer arguments to reference
- Added gamepad event structures
- Dropped C support and moved to a more C++ ish api
- Dropped no C-Runtime support
- Initial version
- Assertion & Debug
- Atomic operations
- Audio functions
- Clipboard functions
- Console functions
- Constants
- Display/Monitor functions
- Dynamic library loading
- Error Handling
- Files/IO functions
- Function macros
- Hardware Infos
- Input types and functions
- Localization functions
- Logging
- Memory Macros
- Memory functions
- Operating system Infos
- Path functions
- Platform functions
- Session Infos
- Settings & Configurations
- Storage class identifiers
- String functions
- Threading and synchronizations routines
- Timing functions
- Video functions
- Window events
- Window functions
- fplARMCPUCapabilities
- fplAudioChannelMap
- fplAudioDeviceID
- fplAudioDeviceInfo
- fplAudioFormat
- fplAudioSettings
- fplColor32
- fplConditionVariable
- fplConsoleSettings
- fplCPUCapabilities
- fplCPUIDLeaf
- fplDateTime
- fplDateTimeCreationResult
- fplDateTimeResult
- fplDisplayInfo
- fplDisplayMode
- fplDynamicLibraryHandle
- fplEndianess
- fplEvent
- fplFileEntry
- fplFileHandle
- fplFilePermissions
- fplFileTimeStamps
- fplGamepadButton
- fplGamepadData
- fplGamepadEvent
- fplGamepadInfo
- fplGamepadInputBinding
- fplGamepadMapping
- fplGamepadSettings
- fplGamepadState
- fplGamepadStates
- fplGraphicsApiSettings
- fplImageSource
- fplInputBackendMask
- fplInputBackendSupport
- fplInputDevice
- fplInputDeviceGuid
- fplInputSettings
- fplInternalConditionVariable
- fplInternalDynamicLibraryHandle
- fplInternalFileEntryHandle
- fplInternalFileHandle
- fplInternalFileRootInfo
- fplInternalMutexHandle
- fplInternalSemaphoreHandle
- fplInternalSignalHandle
- fplInternalThreadHandle
- fplKeyboardEvent
- fplKeyboardState
- fplLogSettings
- fplLogWriter
- fplLogWriterConsole
- fplLogWriterCustom
- fplMemoryAllocationSettings
- fplMemoryBlock
- fplMemoryInfos
- fplMemorySettings
- fplMouseEvent
- fplMouseState
- fplMutexHandle
- fplOpenGLSettings
- fplOSVersionInfos
- fplSemaphoreHandle
- fplSettings
- fplSignalHandle
- fplSpecificAudioSettings
- fplThreadHandle
- fplThreadParameters
- fplTimestamp
- fplVersionInfo
- fplVideoBackBuffer
- fplVideoRect
- fplVideoRequirements
- fplVideoRequirementsVulkan
- fplVideoSettings
- fplVideoSurface
- fplVideoSurfaceOpenGL
- fplVideoSurfaceVulkan
- fplVideoWindow
- fplVulkanSettings
- fplWindowCallbacks
- fplWindowDropFiles
- fplWindowEvent
- fplWindowPosition
- fplWindowSettings
- fplWindowSize
- fplX86CPUCapabilities