Change version number to v0.4.1 and updated SDL

This commit is contained in:
Yousef Khadadeh 2026-02-03 12:16:39 +03:00
parent b5c3c77a95
commit 842896dc15
22 changed files with 33 additions and 1027 deletions

View file

@ -207,8 +207,8 @@ elseif(APPLE)
BUNDLE True
MACOSX_BUNDLE_GUI_IDENTIFIER com.erroratline0.infinipaint
MACOSX_BUNDLE_BUNDLE_NAME infinipaint
MACOSX_BUNDLE_BUNDLE_VERSION "0.4.0"
MACOSX_BUNDLE_SHORT_VERSION_STRING "0.4.0"
MACOSX_BUNDLE_BUNDLE_VERSION "0.4.1"
MACOSX_BUNDLE_SHORT_VERSION_STRING "0.4.1"
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/macosinstall/Info.plist
)
add_custom_command(TARGET infinipaint POST_BUILD
@ -385,7 +385,7 @@ if(APPLE OR WIN32)
set(CPACK_PACKAGE_NAME "infinipaint")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
set(CPACK_PACKAGE_VERSION_MINOR "4")
set(CPACK_PACKAGE_VERSION_PATCH "0")
set(CPACK_PACKAGE_VERSION_PATCH "1")
set(CPACK_PACKAGE_VENDOR "ErrorAtLine0")
set(CPACK_PACKAGE_CONTACT "erroratline0@gmail.com")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")

View file

@ -1,3 +1,2 @@
conan export %0/../conan-skia/recipes/skia/all/conanfile.py --version=143.20251028.0
conan export %0/../sdl3/3.x/conanfile.py --version=3.2.26
conan export %0/../icu/all/conanfile.py --version=77.1

View file

@ -3,7 +3,6 @@
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
conan export "$(dirname "$0")/conan-skia/recipes/skia/all/conanfile.py" --version=143.20251028.0
conan export "$(dirname "$0")/sdl3/3.x/conanfile.py" --version=3.2.26
conan export "$(dirname "$0")/icu/all/conanfile.py" --version=77.1
#conan create . -o use_system_expat=False -o use_system_freetype=False -o use_system_harfbuzz=False -o use_system_icu=False -o use_system_libjpeg_turbo=False -o use_system_libpng=False -o use_system_libwebp=False -o use_system_zlib=False --build=missing --version=134.20250327.0
#cd ../../../..

View file

@ -1,4 +0,0 @@
sources:
"3.2.26":
url: "https://github.com/libsdl-org/SDL/releases/download/release-3.2.26/SDL3-3.2.26.tar.gz"
sha256: "dad488474a51a0b01d547cd2834893d6299328d2e30f479a3564088b5476bae2"

View file

@ -1,467 +0,0 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.apple import is_apple_os
from conan.tools.files import get, copy, replace_in_file, rmdir
from conan.tools.gnu import PkgConfigDeps
from conan.tools.microsoft import is_msvc
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout, CMakeDeps
import os
required_conan_version = ">=2"
_subsystems = [
("audio", []),
("video", []),
("gpu", ["video"]),
("render", ["video"]),
("camera", ["video"]),
("joystick", []),
("haptic", ["joystick"]),
("hidapi", []),
("power", []),
("sensor", []),
("dialog", []),
]
class SDLConan(ConanFile):
name = "sdl"
description = "A cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware"
license = "Zlib"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://www.libsdl.org"
topics = ("sdl3", "audio", "keyboard", "graphics", "opengl")
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
**{
"shared": [True, False],
"fPIC": [True, False],
},
**{subsystem: [True, False] for subsystem, _ in _subsystems},
**{
"alsa": [True, False],
"pulseaudio": [True, False],
"sndio": [True, False],
"opengl": [True, False],
"opengles": [True, False],
"x11": [True, False],
"xcursor": [True, False],
"xdbe": [True, False],
"xinput": [True, False],
"xfixes": [True, False],
"xrandr": [True, False],
"xscrnsaver": [True, False],
"xshape": [True, False],
"xsync": [True, False],
"wayland": [True, False],
"vulkan": [True, False],
"metal": [True, False],
"directx": [True, False],
"libudev": [True, False],
"dbus": [True, False],
"libusb": [True, False],
"libiconv": [True, False],
}
}
default_options = {
**{
"shared": False,
"fPIC": True,
},
**{subsystem: True for subsystem, _ in _subsystems},
**{
## Audio
# Linux only
"alsa": True,
"pulseaudio": True,
"sndio": True,
## Video
"opengl": True,
"opengles": True,
"x11": True,
"xcursor": True,
"xdbe": True,
"xinput": True,
"xfixes": True,
"xrandr": True,
"xscrnsaver": True,
"xshape": True,
"xsync": True,
"wayland": True,
"vulkan": True,
"metal": True,
"directx": True,
## Hidapi
"libusb": False,
## Other
"libudev": True,
"dbus": True,
"libiconv": False,
}
}
def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC
if not self._is_unix_sys:
del self.options.pulseaudio
del self.options.alsa
del self.options.sndio
del self.options.libudev
del self.options.dbus
del self.options.x11
del self.options.xcursor
del self.options.xdbe
del self.options.xinput
del self.options.xfixes
del self.options.xrandr
del self.options.xscrnsaver
del self.options.xshape
del self.options.xsync
del self.options.wayland
if not is_apple_os(self):
del self.options.metal
if self.settings.os != "Windows":
del self.options.directx
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
if not (self.settings.os == "Android" and self.options.get_safe("hidapi")):
self.settings.rm_safe("compiler.libcxx")
self.settings.rm_safe("compiler.cppstd")
if not self.options.get_safe("audio"):
self.options.rm_safe("alsa")
self.options.rm_safe("pulseaudio")
self.options.rm_safe("sndio")
if not self.options.get_safe("video"):
self.options.rm_safe("opengl")
self.options.rm_safe("opengles")
self.options.rm_safe("x11")
self.options.rm_safe("wayland")
self.options.rm_safe("vulkan")
self.options.rm_safe("metal")
if not self.options.get_safe("x11"):
self.options.rm_safe("xcursor")
self.options.rm_safe("xdbe")
self.options.rm_safe("xinput")
self.options.rm_safe("xfixes")
self.options.rm_safe("xrandr")
self.options.rm_safe("xscrnsaver")
self.options.rm_safe("xshape")
self.options.rm_safe("xsync")
if not self.options.get_safe("hidapi") or self.settings.os in ["Android", "iOS", "tvOS", "visionOS", "watchOS"]:
# libusb is only an option if hidapi is enabled: https://github.com/libsdl-org/SDL/blob/db3a35e9bc3aa245dfbe67585b3f67d7b4b62845/cmake/sdlchecks.cmake#L1111
# libusb is not available on Android/iOS/tvOS/visionOS/watchOS https://github.com/libsdl-org/SDL/blob/db3a35e9bc3aa245dfbe67585b3f67d7b4b62845/CMakeLists.txt#L159-L160
self.options.rm_safe("libusb")
def validate(self):
# If any of the subsystems is enabled, then the corresponding dependencies must be enabled
for subsystem, dependencies in _subsystems:
if self.options.get_safe(subsystem):
for dependency in dependencies:
if not self.options.get_safe(dependency):
raise ConanInvalidConfiguration(f'-o="&:{subsystem}=True" subsystem requires -o="&:{dependency}=True"')
def validate_build(self):
if self.settings.os == "Android" and not self.conf.get("user.sdl:android", False):
raise ConanInvalidConfiguration("SDL builds on android require extra configuration on the user's side. "
"Set -c user.sdl:android=True if you understand it and want to build it")
def layout(self):
cmake_layout(self, src_folder="src")
def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)
# Prevent inspecting target properties for libusb to derive the name of the .so/.dll
# instead, just link the library normally, see
# https://github.com/libsdl-org/SDL/blob/96292a5b464258a2b926e0a3d72f8b98c2a81aa6/cmake/sdlchecks.cmake#L1107-L1113
replace_in_file(self, os.path.join(self.source_folder, "cmake", "sdlchecks.cmake"),
"target_get_dynamic_library(dynamic_libusb", "#target_get_dynamic_library(dynamic_libusb")
@property
def _is_unix_sys(self):
""" True for UNIX but not Macos/Android"""
return self.settings.os in ("Linux", "FreeBSD")
@property
def _supports_opengl(self):
return (self.options.get_safe("opengl")
and self.settings.os not in ("iOS", "visionOS", "tvOS", "watchOS"))
@property
def _supports_opengles(self):
return (self.options.get_safe("opengles")
and self.settings.os in ("Android", "iOS", "visionOS", "tvOS", "watchOS"))
@property
def _supports_dbus(self):
return self.options.get_safe("dbus") and self._is_unix_sys
def requirements(self):
if self.options.get_safe("libiconv"):
self.requires("libiconv/1.17")
if self.options.get_safe("libusb"):
self.requires("libusb/1.0.26")
if self._supports_opengl:
self.requires("opengl/system")
if self.options.get_safe("libudev"):
self.requires("libudev/system")
if self._supports_dbus:
self.requires("dbus/1.15.8")
if self.options.get_safe("pulseaudio"):
self.requires("pulseaudio/17.0")
if self.options.get_safe("alsa"):
self.requires("libalsa/[>=1.2 <1.3]")
if self.options.get_safe("sndio"):
self.requires("libsndio/1.9.0")
if self.options.get_safe("wayland"):
self.requires("wayland/1.22.0")
self.requires("xkbcommon/1.6.0")
self.requires("egl/system")
if self.options.get_safe("x11"):
self.requires("xorg/system")
def build_requirements(self):
self.tool_requires("cmake/[>=3.24 <4]")
if self._is_unix_sys and not self.conf.get("tools.gnu:pkg_config", check_type=str):
self.tool_requires("pkgconf/[>=2.2 <3]")
if self.options.get_safe("wayland"):
self.tool_requires("wayland/<host_version>") # Provides wayland-scanner
def generate(self):
tc = CMakeToolchain(self)
tc.cache_variables["SDL_SHARED"] = self.options.shared
tc.cache_variables["SDL_STATIC"] = not self.options.shared
tc.cache_variables["SDL_TEST_LIBRARY"] = False
tc.cache_variables["SDL_TESTS"] = False
tc.cache_variables["SDL_EXAMPLES"] = False
tc.cache_variables["SDL_INSTALL_EXAMPLES"] = False
tc.cache_variables["CMAKE_TRY_COMPILE_CONFIGURATION"] = str(self.settings.build_type)
tc.cache_variables["SDL_SYSTEM_ICONV_DEFAULT"] = True
tc.cache_variables["SDL_LIBICONV"] = self.options.libiconv
tc.cache_variables["SDL_JACK"] = False # Jack is not available in CCI
for subsystem in _subsystems:
tc.cache_variables[f"SDL_{subsystem[0].upper()}"] = self.options.get_safe(subsystem[0])
if self._supports_opengl:
tc.cache_variables["SDL_OPENGL"] = True
if self._supports_opengles:
tc.cache_variables["SDL_OPENGLES"] = True
if self.options.hidapi:
tc.cache_variables["SDL_HIDAPI_LIBUSB"] = self.options.get_safe("libusb")
# Prevent loading shared libusb during runtime
# This just means it will be linked traditionally, even when libusb is shared
# See https://github.com/libsdl-org/SDL/blob/96292a5b464258a2b926e0a3d72f8b98c2a81aa6/cmake/sdlchecks.cmake#L1107-L1113
tc.cache_variables["SDL_HIDAPI_LIBUSB_SHARED"] = False
tc.variables["SDL_VULKAN"] = self.options.get_safe("vulkan")
tc.variables["SDL_METAL"] = self.options.get_safe("metal")
tc.variables["SDL_DIRECTX"] = self.options.get_safe("directx")
if self.options.get_safe("pulseaudio"):
tc.cache_variables["SDL_PULSEAUDIO"] = True
tc.cache_variables["SDL_PULSEAUDIO_SHARED"] = self.dependencies["pulseaudio"].options.get_safe("shared", True)
if self.options.get_safe("alsa"):
tc.cache_variables["SDL_ALSA"] = True
tc.cache_variables["SDL_ALSA_SHARED"] = self.dependencies["libalsa"].options.shared
if self.options.get_safe("sndio"):
tc.cache_variables["SDL_SNDIO"] = True
tc.cache_variables["SDL_SNDIO_SHARED"] = True # sndio is always shared
tc.cache_variables["SDL_LIBUDEV"] = self.options.get_safe("libudev", False)
# X11 and wayland configuration
with_x11 = self.options.get_safe("x11", False)
tc.cache_variables["SDL_X11"] = with_x11
tc.cache_variables["SDL_X11_SHARED"] = True
if with_x11:
# See https://github.com/bincrafters/community/issues/696
tc.cache_variables["SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS"] = 1
tc.cache_variables["SDL_X11_XCURSOR"] = self.options.xcursor
tc.cache_variables["SDL_X11_XDBE"] = self.options.xdbe
tc.cache_variables["SDL_X11_XINPUT"] = self.options.xinput
tc.cache_variables["SDL_X11_XFIXES"] = self.options.xfixes
tc.cache_variables["SDL_X11_XRANDR"] = self.options.xrandr
tc.cache_variables["SDL_X11_XSCRNSAVER"] = self.options.xscrnsaver
tc.cache_variables["SDL_X11_XSHAPE"] = self.options.xshape
tc.cache_variables["SDL_X11_XSYNC"] = self.options.xsync
with_wayland = self.options.get_safe("wayland", False)
tc.cache_variables["SDL_WAYLAND"] = with_wayland
if with_wayland:
tc.cache_variables["SDL_WAYLAND_SHARED"] = self.dependencies["wayland"].options.shared
if not with_x11 and not with_wayland:
# Disable windowing support:
# https://github.com/libsdl-org/SDL/blob/main/docs/README-cmake.md#cmake-fails-to-build-without-x11-or-wayland-support
tc.cache_variables["SDL_UNIX_CONSOLE_BUILD"] = True
tc.generate()
deps = CMakeDeps(self)
deps.set_property("libusb", "cmake_target_name", "LibUSB::LibUSB")
deps.set_property("libusb", "cmake_file_name", "LibUSB")
deps.generate()
pcdeps = PkgConfigDeps(self)
pcdeps.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
copy(self, "LICENSE.txt", self.source_folder, os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()
rmdir(self, os.path.join(self.package_folder, "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
@property
def _is_clang_cl(self):
return self.settings.os == "Windows" and self.settings.compiler == "clang" and \
self.settings.compiler.get_safe("runtime")
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "SDL3")
sdl_lib_name = "SDL3"
if (is_msvc(self) or self._is_clang_cl) and not self.options.shared:
sdl_lib_name = f"{sdl_lib_name}-static"
self.cpp_info.components["sdl3"].libs = [sdl_lib_name]
self.cpp_info.components["sdl3"].set_property("cmake_target_name", "SDL3::SDL3")
self.cpp_info.components["sdl3"].set_property("cmake_target_aliases", [
"SDL3::SDL3-shared" if self.options.shared else "SDL3::SDL3-static",
])
# Target that only contains the include directories
self.cpp_info.components["headers"].set_property("cmake_target_name", "SDL3::Headers")
self.cpp_info.components["headers"].libdirs = []
self.cpp_info.components["sdl3"].requires.append("headers")
if self.settings.os in ("Linux", "FreeBSD", "Macos"):
self.cpp_info.components["sdl3"].system_libs.append("pthread")
if self.options.get_safe("libiconv"):
self.cpp_info.components["sdl3"].requires.append("libiconv::libiconv")
if self.options.get_safe("libudev"):
self.cpp_info.components["sdl3"].requires.append("libudev::libudev")
if self.options.get_safe("libusb"):
self.cpp_info.components["sdl3"].requires.append("libusb::libusb")
if self.options.get_safe("dbus"):
self.cpp_info.components["sdl3"].requires.append("dbus::dbus")
if self.options.get_safe("opengl"):
self.cpp_info.components["sdl3"].requires.append("opengl::opengl")
if self.options.get_safe("wayland"):
self.cpp_info.components["sdl3"].requires.extend(["wayland::wayland", "xkbcommon::xkbcommon", "egl::egl"])
if self.options.get_safe("x11"):
self.cpp_info.components["sdl3"].requires.extend(["xorg::x11", "xorg::xext"])
# xdbe, xshape and xsync are covered by x11 and xext
if self.options.xcursor:
self.cpp_info.components["sdl3"].requires.append("xorg::xcursor")
if self.options.xinput:
self.cpp_info.components["sdl3"].requires.append("xorg::xi")
if self.options.xfixes:
self.cpp_info.components["sdl3"].requires.append("xorg::xfixes")
if self.options.xrandr:
self.cpp_info.components["sdl3"].requires.append("xorg::xrandr")
if self.options.xscrnsaver:
self.cpp_info.components["sdl3"].requires.append("xorg::xscrnsaver")
if self.options.get_safe("audio"):
if self.options.get_safe("alsa"):
self.cpp_info.components["sdl3"].requires.append("libalsa::libalsa")
if self.options.get_safe("pulseaudio"):
self.cpp_info.components["sdl3"].requires.append("pulseaudio::pulseaudio")
if self.options.get_safe("sndio"):
self.cpp_info.components["sdl3"].requires.append("libsndio::libsndio")
if self.settings.os == "Android":
if self.options.get_safe("video"):
self.cpp_info.components["sdl3"].system_libs.extend(["dl", "log", "android"])
if self.options.get_safe("opengles"):
self.cpp_info.components["sdl3"].system_libs.extend(["GLESv1_CM", "GLESv2"])
if self.options.get_safe("audio"):
self.cpp_info.components["sdl3"].system_libs.append("OpenSLES")
# TODO(conan client): when shared, SDL do not need to link against its dependencies but conan will complain about it
if is_apple_os(self) and not self.options.shared:
self.cpp_info.components["sdl3"].frameworks = ["CoreVideo", "Foundation"]
if self.settings.os == "Macos":
self.cpp_info.components["sdl3"].frameworks.extend(["Cocoa", "Carbon"])
if self.options.get_safe("audio"):
self.cpp_info.components["sdl3"].frameworks.extend(["CoreAudio", "AudioToolbox", "AVFoundation"])
if self.options.get_safe("video"):
if self.settings.os in ("iOS", "tvOS", "visionOS", "watchOS"):
self.cpp_info.components["sdl3"].frameworks.extend(["CoreGraphics", "QuartzCore", "UIKit"])
else:
self.cpp_info.components["sdl3"].frameworks.append("UniformTypeIdentifiers")
if self.options.get_safe("camera"):
if self.settings.os in ("Macos", "iOS"):
self.cpp_info.components["sdl3"].frameworks.append("CoreMedia")
self.cpp_info.components["sdl3"].frameworks.append("AVFoundation")
if self.options.get_safe("joystick"):
self.cpp_info.components["sdl3"].frameworks.append("GameController")
self.cpp_info.components["sdl3"].sharedlinkflags.append("-Wl,-weak_framework,CoreHaptics")
self.cpp_info.components["sdl3"].exelinkflags.append("-Wl,-weak_framework,CoreHaptics")
if self.settings.os == "Macos":
# Mind that ForceFeedback is also added in haptic system, but haptic depends on joystick
self.cpp_info.components["sdl3"].frameworks.extend(["ForceFeedback", "IOKit"])
elif self.settings.os in ("iOS", "visionOS", "watchOS"):
self.cpp_info.components["sdl3"].frameworks.append("CoreMotion")
if self.options.get_safe("hidapi") and self.settings.os in ("iOS", "tvOS"):
self.cpp_info.components["sdl3"].frameworks.append("CoreBluetooth")
if self.options.get_safe("power") and self.settings.os == "Macos":
self.cpp_info.components["sdl3"].frameworks.append("IOKit")
if self.options.get_safe("opengles") and self.settings.os in ("iOS", "tvOS", "visionOS", "watchOS"):
self.cpp_info.components["sdl3"].frameworks.append("OpenGLES")
if self.options.get_safe("metal"):
self.cpp_info.components["sdl3"].frameworks.extend(["Metal", "QuartzCore"])
# Windows links with all libs by default
if self.settings.os == "Windows":
self.cpp_info.components["sdl3"].system_libs.extend(
[
"kernel32",
"user32",
"gdi32",
"winmm",
"imm32",
"ole32",
"oleaut32",
"version",
"uuid",
"advapi32",
"setupapi",
"shell32",
]
)

View file

@ -1,8 +0,0 @@
cmake_minimum_required(VERSION 3.15)
project(test_package)
find_package(SDL3 REQUIRED CONFIG)
add_executable(${PROJECT_NAME} test_package.cpp)
target_link_libraries(${PROJECT_NAME} SDL3::SDL3)

View file

@ -1,31 +0,0 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import cmake_layout, CMake, CMakeToolchain
import os
class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "VirtualRunEnv"
test_type = "explicit"
def requirements(self):
self.requires(self.tested_reference_str)
def layout(self):
cmake_layout(self)
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")

View file

@ -1,8 +0,0 @@
#include <SDL3/SDL.h>
#include <iostream>
int main(int argc, char* args[]) {
auto version = SDL_GetVersion();
std::cout << "SDL version " << version << std::endl;
return 0;
}

View file

@ -1,4 +0,0 @@
sources:
"2.32.10":
url: "https://www.libsdl.org/release/SDL2-2.32.10.tar.gz"
sha256: "5f5993c530f084535c65a6879e9b26ad441169b3e25d789d83287040a9ca5165"

View file

@ -1,431 +0,0 @@
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.apple import is_apple_os
from conan.tools.files import get, replace_in_file, rm, rmdir, copy
from conan.tools.microsoft import is_msvc
from conan.tools.scm import Version
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
from conan.tools.env import Environment
import os
required_conan_version = ">=2.1"
class SDLConan(ConanFile):
name = "sdl"
description = "Access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL, Direct3D and Vulkan"
license = "Zlib"
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://www.libsdl.org"
topics = ("sdl2", "audio", "keyboard", "graphics", "opengl")
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
"directx": [True, False],
"alsa": [True, False],
"jack": [True, False],
"pulse": [True, False],
"sndio": [True, False],
"nas": [True, False],
"esd": [True, False],
"arts": [True, False],
"x11": [True, False],
"xcursor": [True, False],
"xinerama": [True, False],
"xinput": [True, False],
"xrandr": [True, False],
"xscrnsaver": [True, False],
"xshape": [True, False],
"xvm": [True, False],
"wayland": [True, False],
"directfb": [True, False],
"iconv": [True, False],
"video_rpi": [True, False],
"sdl2main": [True, False],
"opengl": [True, False],
"opengles": [True, False],
"vulkan": [True, False],
"libunwind": [True, False],
"hidapi": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
"directx": True,
"alsa": True,
"jack": False,
"pulse": True,
"sndio": False,
"nas": False,
"esd": False,
"arts": False,
"x11": True,
"xcursor": True,
"xinerama": True,
"xinput": True,
"xrandr": True,
"xscrnsaver": True,
"xshape": True,
"xvm": True,
"wayland": True,
"directfb": False,
"video_rpi": False,
"sdl2main": True,
"opengl": True,
"opengles": True,
"vulkan": True,
"libunwind": True,
"hidapi": True,
}
generators = "CMakeDeps", "PkgConfigDeps", "VirtualBuildEnv"
@property
def _is_clang_cl(self):
return self.settings.os == "Windows" and self.settings.compiler == "clang" and \
self.settings.compiler.get_safe("runtime")
def layout(self):
cmake_layout(self, src_folder="src")
def generate(self):
self.define_toolchain()
lib_paths = [lib for _, dep in self.dependencies.items() for lib in dep.cpp_info.libdirs]
env = Environment()
env.define_path("LIBRARY_PATH", os.pathsep.join(lib_paths))
env = env.vars(self, scope="build")
env.save_script("sdl_env")
def config_options(self):
# Don't depend on iconv on Apple by default
# SDL2 depends on many system freamworks,
# which depend on the system-provided iconv
# and can conflict with the Conan provided one
self.options.iconv = not is_apple_os(self)
if self.settings.os == "Windows":
del self.options.fPIC
if (is_msvc(self) or self._is_clang_cl):
del self.options.iconv
if self.settings.os != "Linux":
del self.options.alsa
del self.options.jack
del self.options.pulse
del self.options.sndio
del self.options.nas
del self.options.esd
del self.options.arts
del self.options.x11
del self.options.xcursor
del self.options.xinerama
del self.options.xinput
del self.options.xrandr
del self.options.xscrnsaver
del self.options.xshape
del self.options.xvm
del self.options.wayland
del self.options.directfb
del self.options.video_rpi
del self.options.libunwind
if self.settings.os != "Windows":
del self.options.directx
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
# TODO: C++ is also required for WinRT and Haiku
if not (self.settings.os == "Android" and self.options.hidapi):
self.settings.rm_safe("compiler.libcxx")
self.settings.rm_safe("compiler.cppstd")
def requirements(self):
if self.options.get_safe("iconv", False):
self.requires("libiconv/1.17")
if self.settings.os == "Linux":
if self.options.alsa:
self.requires("libalsa/1.2.10")
if self.options.pulse:
self.requires("pulseaudio/14.2")
if self.options.opengl:
self.requires("opengl/system")
if self.options.nas:
self.requires("nas/1.9.5")
if self.options.wayland:
self.requires("wayland/1.22.0")
self.requires("xkbcommon/1.6.0")
self.requires("egl/system")
if self.options.libunwind:
self.requires("libunwind/1.8.0")
def validate(self):
# SDL>=2.0.18 requires xcode 12 or higher because it uses CoreHaptics.
if is_apple_os(self) and Version(self.settings.compiler.version) < "12":
raise ConanInvalidConfiguration("{}/{} requires xcode 12 or higher".format(self.name, self.version))
if self.settings.os == "Linux":
if self.options.sndio:
raise ConanInvalidConfiguration("Package for 'sndio' is not available (yet)")
if self.options.jack:
raise ConanInvalidConfiguration("Package for 'jack' is not available (yet)")
if self.options.esd:
raise ConanInvalidConfiguration("Package for 'esd' is not available (yet)")
if self.options.directfb:
raise ConanInvalidConfiguration("Package for 'directfb' is not available (yet)")
def build_requirements(self):
self.tool_requires("cmake/[>3.27 <4]")
if self.settings.os == "Linux" and not self.conf.get("tools.gnu:pkg_config", check_type=str):
self.tool_requires("pkgconf/2.1.0")
if hasattr(self, "settings_build") and self.options.get_safe("wayland"):
self.build_requires("wayland/1.22.0") # Provides wayland-scanner
def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)
def _patch_sources(self):
# Ensure to find wayland-scanner from wayland recipe in build requirements (or requirements if 1 profile)
if self.options.get_safe("wayland"):
replace_in_file(self,
os.path.join(self.source_folder, "cmake", "sdlchecks.cmake"),
"find_program(WAYLAND_SCANNER NAMES wayland-scanner REQUIRED)",
'find_program(WAYLAND_SCANNER NAMES wayland-scanner REQUIRED PATHS "${WAYLAND_BIN_DIR}" NO_DEFAULT_PATH)',
)
if not self.options.shared:
replace_in_file(self, os.path.join(self.source_folder, "CMakeLists.txt"), "list(APPEND targets SDL2-static)", "set(targets SDL2-static)")
def define_toolchain(self):
tc = CMakeToolchain(self)
if self.settings.os == "Linux" and self.settings.compiler == "gcc" and Version(self.settings.compiler.version) < 5.0:
tc.preprocessor_definitions["GBM_BO_USE_CURSOR"] = 2
tc.variables["SDL2_DISABLE_INSTALL"] = False # SDL2_* options will get renamed to SDL_ options in the next SDL release
if is_apple_os(self):
tc.variables["CMAKE_OSX_ARCHITECTURES"] = {
"armv8": "arm64",
}.get(str(self.settings.arch), str(self.settings.arch))
cmake_required_includes = [] # List of directories used by CheckIncludeFile (https://cmake.org/cmake/help/latest/module/CheckIncludeFile.html)
cmake_extra_ldflags = []
cmake_extra_libs = []
if self.settings.os != "Windows" and not self.options.shared:
tc.variables["SDL_STATIC_PIC"] = self.options.fPIC
if (is_msvc(self) or self._is_clang_cl) and not self.options.shared:
tc.variables["HAVE_LIBC"] = True
tc.variables["SDL_SHARED"] = self.options.shared
tc.variables["SDL_STATIC"] = not self.options.shared
tc.variables["SDL_TEST"] = False
tc.variables["SDL_OPENGL"] = self.options.opengl
tc.variables["SDL_OPENGLES"] = self.options.opengles
tc.variables["SDL_VULKAN"] = self.options.vulkan
tc.variables["SDL_HIDAPI"] = self.options.hidapi
if self.settings.os == "Linux":
# See https://github.com/bincrafters/community/issues/696
tc.variables["SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS"] = 1
tc.variables["SDL_ALSA"] = self.options.alsa
if self.options.alsa:
tc.variables["SDL_ALSA_SHARED"] = self.dependencies["libalsa"].options.shared
tc.variables["HAVE_ASOUNDLIB_H"] = True
tc.variables["HAVE_LIBASOUND"] = True
tc.variables["SDL_JACK"] = self.options.jack
if self.options.jack:
tc.variables["SDL_JACK_SHARED"] = self.options["jack"].shared
tc.variables["SDL_ESD"] = self.options.esd
if self.options.esd:
tc.variables["SDL_ESD_SHARED"] = self.options["esd"].shared
tc.variables["SDL_PULSEAUDIO"] = self.options.pulse
if self.options.pulse:
tc.variables["SDL_PULSEAUDIO_SHARED"] = self.dependencies["pulseaudio"].options.shared
for component in self.dependencies["pulseaudio"].cpp_info.components:
if self.dependencies["pulseaudio"].cpp_info.components[component].libs:
cmake_extra_libs += self.dependencies["pulseaudio"].cpp_info.components[component].libs
cmake_extra_ldflags += ["-L{}".format(it) for it in self.dependencies["pulseaudio"].cpp_info.components[component].libdirs]
cmake_extra_ldflags += ["-lxcb", "-lrt"] # FIXME: SDL sources doesn't take into account transitive dependencies
tc.variables["SDL_SNDIO"] = self.options.sndio
if self.options.sndio:
tc.variables["SDL_SNDIO_SHARED"] = self.options["sndio"].shared
tc.variables["SDL_NAS"] = self.options.nas
if self.options.nas:
cmake_extra_ldflags += ["-lXau"] # FIXME: SDL sources doesn't take into account transitive dependencies
cmake_required_includes += self.dependencies["nas"].cpp_info.includedirs
tc.variables["SDL_NAS_SHARED"] = self.dependencies["nas"].options.shared
tc.variables["SDL_X11"] = self.options.x11
if self.options.x11:
tc.variables["HAVE_XEXT_H"] = True
tc.variables["SDL_X11_XCURSOR"] = self.options.xcursor
if self.options.xcursor:
tc.variables["HAVE_XCURSOR_H"] = True
tc.variables["SDL_X11_XINERAMA"] = self.options.xinerama
if self.options.xinerama:
tc.variables["HAVE_XINERAMA_H"] = True
tc.variables["SDL_X11_XINPUT"] = self.options.xinput
if self.options.xinput:
tc.variables["HAVE_XINPUT_H"] = True
tc.variables["SDL_X11_XRANDR"] = self.options.xrandr
if self.options.xrandr:
tc.variables["HAVE_XRANDR_H"] = True
tc.variables["SDL_X11_XSCRNSAVER"] = self.options.xscrnsaver
if self.options.xscrnsaver:
tc.variables["HAVE_XSS_H"] = True
tc.variables["SDL_X11_XSHAPE"] = self.options.xshape
if self.options.xshape:
tc.variables["HAVE_XSHAPE_H"] = True
tc.variables["SDL_X11_XVM"] = self.options.xvm
if self.options.xvm:
tc.variables["HAVE_XF86VM_H"] = True
tc.variables["SDL_WAYLAND"] = self.options.wayland
if self.options.wayland:
# FIXME: Otherwise 2.0.16 links with system wayland (from egl/system requirement)
cmake_extra_ldflags += ["-L{}".format(it) for it in self.dependencies["wayland"].cpp_info.libdirs]
tc.variables["SDL_WAYLAND_SHARED"] = self.dependencies["wayland"].options.shared
wayland = self.dependencies["wayland"] if not hasattr(self, "settings_build") else self.dependencies.build["wayland"]
wayland_bin_dir = wayland.cpp_info.bindirs[0] # for wayland scanner
tc.variables["WAYLAND_BIN_DIR"] = wayland_bin_dir
tc.variables["SDL_DIRECTFB"] = self.options.directfb
tc.variables["SDL_RPI"] = self.options.video_rpi
tc.variables["HAVE_LIBUNWIND_H"] = self.options.libunwind
elif self.settings.os == "Windows":
tc.variables["SDL_DIRECTX"] = self.options.directx
tc.variables["SDL2_DISABLE_SDL2MAIN"] = not self.options.sdl2main
tc.variables["SDL_LIBICONV"] = self.options.get_safe("iconv", False)
tc.variables["SDL_SYSTEM_ICONV"] = False
# Add extra information collected from the deps
tc.variables["EXTRA_LDFLAGS"] = ";".join(cmake_extra_ldflags)
tc.variables["CMAKE_REQUIRED_INCLUDES"] = ";".join(cmake_required_includes)
cmake_extra_cflags = ["-I{}".format(path) for _, dep in self.dependencies.items() for path in dep.cpp_info.includedirs]
tc.variables["EXTRA_CFLAGS"] = ";".join(cmake_extra_cflags).replace(os.sep, '/')
tc.variables["EXTRA_LIBS"] = ";".join(cmake_extra_libs)
tc.cache_variables["CMAKE_POLICY_DEFAULT_CMP0077"] = "NEW"
tc.generate()
def build(self):
self._patch_sources()
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
cmake = CMake(self)
cmake.install()
copy(self, pattern="LICENSE.txt", src=os.path.join(self.source_folder), dst=os.path.join(self.package_folder, "licenses"))
rm(self, "sdl2-config", os.path.join(self.package_folder, "bin"))
rm(self, "*.pdb", os.path.join(self.package_folder, "lib"))
rm(self, "*.pdb", os.path.join(self.package_folder, "bin"))
rmdir(self, os.path.join(self.package_folder, "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "libdata"))
rmdir(self, os.path.join(self.package_folder, "share"))
if self.settings.os == "Android":
copy(self, pattern="*",
src=os.path.join(self.source_folder, "android-project", "app", "src", "main", "java"),
dst=os.path.join(self.package_folder, "share", "java", "SDL2"))
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "SDL2")
postfix = "d" if self.settings.os != "Android" and self.settings.build_type == "Debug" else ""
# SDL2
lib_postfix = postfix
if (is_msvc(self) or self._is_clang_cl) and not self.options.shared:
lib_postfix = "-static" + postfix
self.cpp_info.components["libsdl2"].set_property("cmake_target_name", "SDL2::SDL2")
if not self.options.shared:
self.cpp_info.components["libsdl2"].set_property("cmake_target_aliases", ["SDL2::SDL2-static"])
self.cpp_info.components["libsdl2"].set_property("pkg_config_name", "sdl2")
self.cpp_info.components["libsdl2"].includedirs.append(os.path.join("include", "SDL2"))
self.cpp_info.components["libsdl2"].libs = ["SDL2" + lib_postfix]
if self.options.get_safe("iconv", False):
self.cpp_info.components["libsdl2"].requires.append("libiconv::libiconv")
if self.settings.os == "Linux":
self.cpp_info.components["libsdl2"].system_libs = ["dl", "rt", "pthread"]
if self.options.alsa:
self.cpp_info.components["libsdl2"].requires.append("libalsa::libalsa")
if self.options.pulse:
self.cpp_info.components["libsdl2"].requires.append("pulseaudio::pulseaudio")
if self.options.opengl:
self.cpp_info.components["libsdl2"].requires.append("opengl::opengl")
if self.options.jack:
self.cpp_info.components["libsdl2"].requires.append("jack::jack")
if self.options.sndio:
self.cpp_info.components["libsdl2"].requires.append("sndio::sndio")
if self.options.nas:
self.cpp_info.components["libsdl2"].requires.append("nas::nas")
if self.options.esd:
self.cpp_info.components["libsdl2"].requires.append("esd::esd")
if self.options.directfb:
self.cpp_info.components["libsdl2"].requires.append("directfb::directfb")
if self.options.video_rpi:
self.cpp_info.components["libsdl2"].libs.append("bcm_host")
self.cpp_info.components["libsdl2"].includedirs.extend([
"/opt/vc/include",
"/opt/vc/include/interface/vcos/pthreads",
"/opt/vc/include/interface/vmcs_host/linux"
])
self.cpp_info.components["libsdl2"].libdirs.append("/opt/vc/lib")
self.cpp_info.components["libsdl2"].sharedlinkflags.append("-Wl,-rpath,/opt/vc/lib")
self.cpp_info.components["libsdl2"].exelinkflags.append("-Wl,-rpath,/opt/vc/lib")
if self.options.wayland:
self.cpp_info.components["libsdl2"].requires.append("wayland::wayland")
self.cpp_info.components["libsdl2"].requires.append("xkbcommon::xkbcommon")
self.cpp_info.components["libsdl2"].requires.append("egl::egl")
if self.options.libunwind:
self.cpp_info.components["libsdl2"].requires.append("libunwind::libunwind")
elif is_apple_os(self) and not self.options.shared:
self.cpp_info.components["libsdl2"].frameworks = [
"CoreVideo", "CoreAudio", "AudioToolbox",
"AVFoundation", "Foundation", "QuartzCore",
]
if self.settings.os == "Macos":
self.cpp_info.components["libsdl2"].frameworks.extend([
"Cocoa",
"Carbon",
"IOKit",
"ForceFeedback",
"CoreFoundation",
"CoreServices",
"AppKit"
])
self.cpp_info.components["libsdl2"].frameworks.append("GameController")
elif self.settings.os in ["iOS", "tvOS", "watchOS"]:
self.cpp_info.components["libsdl2"].frameworks.extend([
"UIKit", "OpenGLES", "GameController", "CoreMotion",
"CoreGraphics", "CoreBluetooth",
])
self.cpp_info.components["libsdl2"].frameworks.append("Metal")
self.cpp_info.components["libsdl2"].sharedlinkflags.append("-Wl,-weak_framework,CoreHaptics")
self.cpp_info.components["libsdl2"].exelinkflags.append("-Wl,-weak_framework,CoreHaptics")
elif self.settings.os == "Windows":
self.cpp_info.components["libsdl2"].system_libs = ["user32", "gdi32", "winmm", "imm32", "ole32", "oleaut32", "version", "uuid", "advapi32", "setupapi", "shell32"]
if self.settings.compiler == "gcc":
self.cpp_info.components["libsdl2"].system_libs.append("mingw32")
elif self.settings.os == "Android" and not self.options.shared:
self.cpp_info.components["libsdl2"].system_libs.extend(["android", "dl", "log"])
if self.options.opengles:
self.cpp_info.components["libsdl2"].system_libs.extend(["GLESv1_CM", "GLESv2"])
self.cpp_info.components["libsdl2"].system_libs.append("OpenSLES")
# SDL2main
if self.options.sdl2main:
self.cpp_info.components["sdl2main"].set_property("cmake_target_name", "SDL2::SDL2main")
self.cpp_info.components["sdl2main"].libs = ["SDL2main" + postfix]
self.cpp_info.components["sdl2main"].requires = ["libsdl2"]
# Workaround to avoid unwanted sdl::sdl target in CMakeDeps generator
self.cpp_info.set_property(
"cmake_target_name",
"SDL2::{}".format("SDL2main" if self.options.sdl2main else "SDL2"),
)

View file

@ -1,13 +0,0 @@
cmake_minimum_required(VERSION 3.15)
project(test_package)
find_package(SDL2 REQUIRED CONFIG)
add_executable(${PROJECT_NAME} test_package.cpp)
target_link_libraries(${PROJECT_NAME} SDL2::SDL2main)
if(TARGET SDL2::SDL2-static)
target_link_libraries(${PROJECT_NAME} SDL2::SDL2-static)
else()
target_link_libraries(${PROJECT_NAME} SDL2::SDL2)
endif()

View file

@ -1,31 +0,0 @@
from conan import ConanFile
from conan.tools.build import can_run
from conan.tools.cmake import cmake_layout, CMake, CMakeToolchain
import os
class TestPackageConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
generators = "CMakeDeps", "VirtualRunEnv"
test_type = "explicit"
def requirements(self):
self.requires(self.tested_reference_str)
def layout(self):
cmake_layout(self)
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def test(self):
if can_run(self):
bin_path = os.path.join(self.cpp.build.bindir, "test_package")
self.run(bin_path, env="conanrun")

View file

@ -1,9 +0,0 @@
#include <SDL.h>
#include <iostream>
int main(int argc, char* args[]) {
SDL_version v;
SDL_GetVersion(&v);
std::cout << "SDL version " << int(v.major) << "." << int(v.minor) << "." << int(v.patch) << std::endl;
return 0;
}

View file

@ -1,5 +0,0 @@
versions:
"3.2.26":
folder: 3.x
"2.32.10":
folder: all

View file

@ -90,7 +90,7 @@ class CompressorRecipe(ConanFile):
if self.settings.os == "Linux":
self.requires("sdl/3.2.26", options = {
self.requires("sdl/3.4.0", options = {
"wayland": False,
"x11": True,
"pulseaudio": False,
@ -100,9 +100,12 @@ class CompressorRecipe(ConanFile):
"opengles": False
})
else:
self.requires("sdl/3.2.26")
self.requires("sdl/3.4.0")
if self.settings.os != "Emscripten" and self.settings.os != "Macos":
self.requires("hwloc/2.12.2", options = {
"shared": True
})
self.requires("onetbb/2022.0.0")
if self.settings.os != "Emscripten":

View file

@ -14,7 +14,7 @@ template <class T> std::weak_ptr<T> make_weak_ptr(std::shared_ptr<T> ptr) { retu
#define RELIABLE_COMMAND_CHANNEL "reliableCommand"
#define UNRELIABLE_COMMAND_CHANNEL "unreliableCommand"
#define RESOURCE_COMMAND_CHANNEL "resourceCommand"
#define MAIN_NETLIBRARY_CHANNEL "main00006" // NOTE: Change this value whenever netcode is incompatible with the previous version
#define MAIN_NETLIBRARY_CHANNEL "main00007" // NOTE: Change this value whenever netcode is incompatible with the previous version
typedef uint8_t MessageCommandType;
typedef uint8_t NetTypeIDType;

View file

@ -60,6 +60,22 @@
<launchable type="desktop-id">com.infinipaint.infinipaint.desktop</launchable>
<releases>
<release version="0.4.1" date="2026-02-03">
<description>
<p>Minor update:</p>
<ul>
<li>Send objects to front or back of layer through right click popup menu</li>
<li>Change color of outlines and brush strokes through selection tool</li>
<li>Improved cache system increases FPS</li>
<li>Popup menu to save files before closing</li>
<li>Tool configuration is saved</li>
<li>Lock brush/outline size from zoom</li>
<li>Move selected objects with arrow keys</li>
<li>Switch from pan to zoom when pen touches tablet</li>
<li>Every tool has its own size value</li>
</ul>
</description>
</release>
<release version="0.4.0" date="2026-01-10">
<description>
<p>Major update:</p>

View file

@ -57,7 +57,7 @@ modules:
- -DSDL_X11=ON
sources:
- type: git
tag: release-3.2.26
tag: release-3.4.0
url: https://github.com/libsdl-org/SDL.git
- name: Skia
buildsystem: simple

View file

@ -13,13 +13,13 @@
<key>CFBundleSpokenName</key>
<string>InfiniPaint</string>
<key>CFBundleVersion</key>
<string>0.4.0</string>
<string>0.4.1</string>
<key>CFBundleShortVersionString</key>
<string>0.4.0</string>
<string>0.4.1</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) 2025 Yousef Khadadeh</string>
<string>Copyright (c) 2026 Yousef Khadadeh</string>
<key>CFBundleDevelopmentRegion</key>
<string>en-US</string>
<key>CFBundleExecutable</key>

View file

@ -227,7 +227,7 @@ void Toolbar::load_licenses() {
ownLicenseText +=
R"(
Copyright © 2025 Yousef Khadadeh
Copyright © 2026 Yousef Khadadeh
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View file

@ -11,6 +11,6 @@ namespace VersionConstants {
constexpr int SAVEFILE_HEADER_LEN = 12; // DO NOT CHANGE THIS HEADER LENGTH
const std::string CURRENT_SAVEFILE_HEADER = "INFPNT000005"; // Change whenever the save file is incompatible with the previous version
const std::string CURRENT_VERSION_STRING = "0.4.0";
constexpr VersionNumber CURRENT_VERSION_NUMBER(0, 4, 0);
const std::string CURRENT_VERSION_STRING = "0.4.1";
constexpr VersionNumber CURRENT_VERSION_NUMBER(0, 4, 1);
}

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="0.4.0.0" processorArchitecture="*" name="com.infinipaint.infinipaint" type="win32" />
<assemblyIdentity version="0.4.1.0" processorArchitecture="*" name="com.infinipaint.infinipaint" type="win32" />
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- Enable UTF-8 -->