mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge remote-tracking branch 'offical/master'
This commit is contained in:
@@ -32,6 +32,8 @@ jobs:
|
|||||||
gmake -C vendor/miniaudio/src
|
gmake -C vendor/miniaudio/src
|
||||||
./odin check examples/all -vet -strict-style -disallow-do -target:netbsd_amd64
|
./odin check examples/all -vet -strict-style -disallow-do -target:netbsd_amd64
|
||||||
./odin check examples/all -vet -strict-style -disallow-do -target:netbsd_arm64
|
./odin check examples/all -vet -strict-style -disallow-do -target:netbsd_arm64
|
||||||
|
./odin check vendor/sdl3 -vet -strict-style -disallow-do -target:netbsd_amd64 -no-entry-point
|
||||||
|
./odin check vendor/sdl3 -vet -strict-style -disallow-do -target:netbsd_arm64 -no-entry-point
|
||||||
./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
./odin test tests/core/speed.odin -file -all-packages -vet -strict-style -disallow-do -o:speed -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/core/speed.odin -file -all-packages -vet -strict-style -disallow-do -o:speed -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
./odin test tests/vendor -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/vendor -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
@@ -62,6 +64,7 @@ jobs:
|
|||||||
gmake -C vendor/cgltf/src
|
gmake -C vendor/cgltf/src
|
||||||
gmake -C vendor/miniaudio/src
|
gmake -C vendor/miniaudio/src
|
||||||
./odin check examples/all -vet -strict-style -disallow-do -target:freebsd_amd64
|
./odin check examples/all -vet -strict-style -disallow-do -target:freebsd_amd64
|
||||||
|
./odin check vendor/sdl3 -vet -strict-style -disallow-do -target:freebsd_amd64 -no-entry-point
|
||||||
./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
./odin test tests/core/speed.odin -file -all-packages -vet -strict-style -disallow-do -o:speed -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/core/speed.odin -file -all-packages -vet -strict-style -disallow-do -o:speed -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
./odin test tests/vendor -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
./odin test tests/vendor -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
@@ -117,7 +120,9 @@ jobs:
|
|||||||
- name: Odin run -debug
|
- name: Odin run -debug
|
||||||
run: ./odin run examples/demo -debug
|
run: ./odin run examples/demo -debug
|
||||||
- name: Odin check examples/all
|
- name: Odin check examples/all
|
||||||
run: ./odin check examples/all -strict-style
|
run: ./odin check examples/all -strict-style -vet -disallow-do
|
||||||
|
- name: Odin check vendor/sdl3
|
||||||
|
run: ./odin check vendor/sdl3 -strict-style -vet -disallow-do -no-entry-point
|
||||||
- name: Normal Core library tests
|
- name: Normal Core library tests
|
||||||
run: ./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
run: ./odin test tests/core/normal.odin -file -all-packages -vet -strict-style -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true
|
||||||
- name: Optimized Core library tests
|
- name: Optimized Core library tests
|
||||||
@@ -146,6 +151,20 @@ jobs:
|
|||||||
run: ./odin check examples/all -vet -strict-style -disallow-do -target:openbsd_amd64
|
run: ./odin check examples/all -vet -strict-style -disallow-do -target:openbsd_amd64
|
||||||
if: matrix.os == 'ubuntu-latest'
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
|
||||||
|
- name: Odin check vendor/sdl3 for Linux i386
|
||||||
|
run: ./odin check vendor/sdl3 -vet -strict-style -disallow-do -no-entry-point -target:linux_i386
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
- name: Odin check vendor/sdl3 for Linux arm64
|
||||||
|
run: ./odin check vendor/sdl3 -vet -strict-style -disallow-do -no-entry-point -target:linux_arm64
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
- name: Odin check vendor/sdl3 for FreeBSD amd64
|
||||||
|
run: ./odin check vendor/sdl3 -vet -strict-style -disallow-do -no-entry-point -target:freebsd_amd64
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
- name: Odin check vendor/sdl3 for OpenBSD amd64
|
||||||
|
run: ./odin check vendor/sdl3 -vet -strict-style -disallow-do -no-entry-point -target:openbsd_amd64
|
||||||
|
if: matrix.os == 'ubuntu-latest'
|
||||||
|
|
||||||
|
|
||||||
- name: Run demo on WASI WASM32
|
- name: Run demo on WASI WASM32
|
||||||
run: |
|
run: |
|
||||||
./odin build examples/demo -target:wasi_wasm32 -vet -strict-style -disallow-do -out:demo.wasm
|
./odin build examples/demo -target:wasi_wasm32 -vet -strict-style -disallow-do -out:demo.wasm
|
||||||
@@ -187,6 +206,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat
|
||||||
odin check examples/all -vet -strict-style -disallow-do
|
odin check examples/all -vet -strict-style -disallow-do
|
||||||
|
- name: Odin check vendor/sdl3
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat
|
||||||
|
odin check vendor/sdl3 -vet -strict-style -disallow-do -no-entry-point
|
||||||
- name: Core library tests
|
- name: Core library tests
|
||||||
shell: cmd
|
shell: cmd
|
||||||
run: |
|
run: |
|
||||||
@@ -266,9 +290,12 @@ jobs:
|
|||||||
make -C vendor/cgltf/src
|
make -C vendor/cgltf/src
|
||||||
make -C vendor/miniaudio/src
|
make -C vendor/miniaudio/src
|
||||||
|
|
||||||
- name: Odin check
|
- name: Odin check examples/all
|
||||||
run: ./odin check examples/all -target:linux_riscv64 -vet -strict-style -disallow-do
|
run: ./odin check examples/all -target:linux_riscv64 -vet -strict-style -disallow-do
|
||||||
|
|
||||||
|
- name: Odin check vendor/sdl3
|
||||||
|
run: ./odin check vendor/sdl3 -target:linux_riscv64 -vet -strict-style -disallow-do -no-entry-point
|
||||||
|
|
||||||
- name: Install riscv64 toolchain and qemu
|
- name: Install riscv64 toolchain and qemu
|
||||||
run: sudo apt-get install -y qemu-user qemu-user-static gcc-12-riscv64-linux-gnu libc6-riscv64-cross
|
run: sudo apt-get install -y qemu-user qemu-user-static gcc-12-riscv64-linux-gnu libc6-riscv64-cross
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ _load_library :: proc(path: string, global_symbols: bool, allocator: runtime.All
|
|||||||
flags := posix.RTLD_Flags{.NOW}
|
flags := posix.RTLD_Flags{.NOW}
|
||||||
if global_symbols {
|
if global_symbols {
|
||||||
flags += {.GLOBAL}
|
flags += {.GLOBAL}
|
||||||
|
} else {
|
||||||
|
flags += posix.RTLD_LOCAL
|
||||||
}
|
}
|
||||||
|
|
||||||
cpath := strings.clone_to_cstring(path, allocator)
|
cpath := strings.clone_to_cstring(path, allocator)
|
||||||
|
|||||||
@@ -209,13 +209,23 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
|
|||||||
opt_write_end(w, opt, ']') or_return
|
opt_write_end(w, opt, ']') or_return
|
||||||
|
|
||||||
case runtime.Type_Info_Enumerated_Array:
|
case runtime.Type_Info_Enumerated_Array:
|
||||||
opt_write_start(w, opt, '[') or_return
|
index_type := reflect.type_info_base(info.index)
|
||||||
|
enum_type := index_type.variant.(reflect.Type_Info_Enum)
|
||||||
|
|
||||||
|
opt_write_start(w, opt, '{') or_return
|
||||||
for i in 0..<info.count {
|
for i in 0..<info.count {
|
||||||
|
value := cast(runtime.Type_Info_Enum_Value)i
|
||||||
|
index, found := slice.linear_search(enum_type.values, value)
|
||||||
|
if !found {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
opt_write_iteration(w, opt, i == 0) or_return
|
opt_write_iteration(w, opt, i == 0) or_return
|
||||||
|
opt_write_key(w, opt, enum_type.names[index]) or_return
|
||||||
data := uintptr(v.data) + uintptr(i*info.elem_size)
|
data := uintptr(v.data) + uintptr(i*info.elem_size)
|
||||||
marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt) or_return
|
marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt) or_return
|
||||||
}
|
}
|
||||||
opt_write_end(w, opt, ']') or_return
|
opt_write_end(w, opt, '}') or_return
|
||||||
|
|
||||||
case runtime.Type_Info_Dynamic_Array:
|
case runtime.Type_Info_Dynamic_Array:
|
||||||
opt_write_start(w, opt, '[') or_return
|
opt_write_start(w, opt, '[') or_return
|
||||||
|
|||||||
+2
-2
@@ -126,7 +126,7 @@ _i64_err :: #force_inline proc "contextless" (n: int, err: Error) -> (i64, Error
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// read reads up to len(p) bytes into s. It returns the number of bytes read and any error if occurred.
|
// read reads up to len(p) bytes into p. It returns the number of bytes read and any error if occurred.
|
||||||
//
|
//
|
||||||
// When read encounters an .EOF or error after successfully reading n > 0 bytes, it returns the number of
|
// When read encounters an .EOF or error after successfully reading n > 0 bytes, it returns the number of
|
||||||
// bytes read along with the error.
|
// bytes read along with the error.
|
||||||
@@ -142,7 +142,7 @@ read :: proc(s: Reader, p: []byte, n_read: ^int = nil) -> (n: int, err: Error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// write writes up to len(p) bytes into s. It returns the number of bytes written and any error if occurred.
|
// write writes up to len(p) bytes into p. It returns the number of bytes written and any error if occurred.
|
||||||
write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Error) {
|
write :: proc(s: Writer, p: []byte, n_written: ^int = nil) -> (n: int, err: Error) {
|
||||||
if s.procedure != nil {
|
if s.procedure != nil {
|
||||||
n64: i64
|
n64: i64
|
||||||
|
|||||||
@@ -468,7 +468,7 @@ Example:
|
|||||||
Possible Output:
|
Possible Output:
|
||||||
|
|
||||||
15.312
|
15.312
|
||||||
673.130
|
273.130
|
||||||
|
|
||||||
*/
|
*/
|
||||||
@(require_results) float32_range :: proc(low, high: f32, gen := context.random_generator) -> (val: f32) {
|
@(require_results) float32_range :: proc(low, high: f32, gen := context.random_generator) -> (val: f32) {
|
||||||
|
|||||||
@@ -260,7 +260,7 @@ adjust_request_size :: proc(size, align: uint) -> (adjusted: uint) {
|
|||||||
|
|
||||||
// aligned size must not exceed `BLOCK_SIZE_MAX`, or we'll go out of bounds on `sl_bitmap`.
|
// aligned size must not exceed `BLOCK_SIZE_MAX`, or we'll go out of bounds on `sl_bitmap`.
|
||||||
if aligned := align_up(size, align); aligned < BLOCK_SIZE_MAX {
|
if aligned := align_up(size, align); aligned < BLOCK_SIZE_MAX {
|
||||||
adjusted = min(aligned, BLOCK_SIZE_MAX)
|
adjusted = max(aligned, BLOCK_SIZE_MIN)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-7
@@ -50,9 +50,12 @@ init_dns_configuration :: proc() {
|
|||||||
dns_configuration.hosts_file, _ = replace_environment_path(dns_configuration.hosts_file)
|
dns_configuration.hosts_file, _ = replace_environment_path(dns_configuration.hosts_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(fini, private)
|
||||||
destroy_dns_configuration :: proc() {
|
destroy_dns_configuration :: proc() {
|
||||||
delete(dns_configuration.resolv_conf)
|
delete(dns_configuration.resolv_conf)
|
||||||
|
dns_configuration.resolv_conf = ""
|
||||||
delete(dns_configuration.hosts_file)
|
delete(dns_configuration.hosts_file)
|
||||||
|
dns_configuration.hosts_file = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
dns_configuration := DEFAULT_DNS_CONFIGURATION
|
dns_configuration := DEFAULT_DNS_CONFIGURATION
|
||||||
@@ -533,18 +536,21 @@ decode_hostname :: proc(packet: []u8, start_idx: int, allocator := context.alloc
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if packet[cur_idx] > 63 && packet[cur_idx] != 0xC0 {
|
switch {
|
||||||
|
|
||||||
|
// A pointer is when the two higher bits are set.
|
||||||
|
case packet[cur_idx] & 0xC0 == 0xC0:
|
||||||
|
if len(packet[cur_idx:]) < 2 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
switch packet[cur_idx] {
|
|
||||||
|
|
||||||
// This is a offset to more data in the packet, jump to it
|
|
||||||
case 0xC0:
|
|
||||||
pkt := packet[cur_idx:cur_idx+2]
|
pkt := packet[cur_idx:cur_idx+2]
|
||||||
val := (^u16be)(raw_data(pkt))^
|
val := (^u16be)(raw_data(pkt))^
|
||||||
offset := int(val & 0x3FFF)
|
offset := int(val & 0x3FFF)
|
||||||
if offset > len(packet) {
|
// RFC 9267 a ptr should only point backwards, enough to avoid infinity.
|
||||||
|
// "The offset at which this octet is located must be smaller than the offset
|
||||||
|
// at which the compression pointer is located". Still keep iteration_max to
|
||||||
|
// avoid tiny jumps.
|
||||||
|
if offset > len(packet) || offset >= cur_idx {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,6 +561,10 @@ decode_hostname :: proc(packet: []u8, start_idx: int, allocator := context.alloc
|
|||||||
level += 1
|
level += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate label len
|
||||||
|
case packet[cur_idx] > LABEL_MAX:
|
||||||
|
return
|
||||||
|
|
||||||
// This is a label, insert it into the hostname
|
// This is a label, insert it into the hostname
|
||||||
case:
|
case:
|
||||||
label_size := int(packet[cur_idx])
|
label_size := int(packet[cur_idx])
|
||||||
|
|||||||
+32
-19
@@ -34,23 +34,12 @@ any_socket_to_socket :: proc "contextless" (socket: Any_Socket) -> Socket {
|
|||||||
Expects both hostname and port to be present in the `hostname_and_port` parameter, either as:
|
Expects both hostname and port to be present in the `hostname_and_port` parameter, either as:
|
||||||
`a.host.name:9999`, or as `1.2.3.4:9999`, or IP6 equivalent.
|
`a.host.name:9999`, or as `1.2.3.4:9999`, or IP6 equivalent.
|
||||||
|
|
||||||
Calls `parse_hostname_or_endpoint` and `resolve`, then `dial_tcp_from_endpoint`.
|
Calls `parse_hostname_or_endpoint` and `dial_tcp_from_host_or_endpoint`.
|
||||||
*/
|
*/
|
||||||
dial_tcp_from_hostname_and_port_string :: proc(hostname_and_port: string, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
dial_tcp_from_hostname_and_port_string :: proc(hostname_and_port: string, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
||||||
target := parse_hostname_or_endpoint(hostname_and_port) or_return
|
target := parse_hostname_or_endpoint(hostname_and_port) or_return
|
||||||
switch t in target {
|
|
||||||
case Endpoint:
|
return dial_tcp_from_host_or_endpoint(target, options)
|
||||||
return dial_tcp_from_endpoint(t, options)
|
|
||||||
case Host:
|
|
||||||
if t.port == 0 {
|
|
||||||
return 0, .Port_Required
|
|
||||||
}
|
|
||||||
ep4, ep6 := resolve(t.hostname) or_return
|
|
||||||
ep := ep4 if ep4.address != nil else ep6 // NOTE(tetra): We don't know what family the server uses, so we just default to IP4.
|
|
||||||
ep.port = t.port
|
|
||||||
return dial_tcp_from_endpoint(ep, options)
|
|
||||||
}
|
|
||||||
unreachable()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -61,17 +50,39 @@ dial_tcp_from_hostname_and_port_string :: proc(hostname_and_port: string, option
|
|||||||
*/
|
*/
|
||||||
dial_tcp_from_hostname_with_port_override :: proc(hostname: string, port: int, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
dial_tcp_from_hostname_with_port_override :: proc(hostname: string, port: int, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
||||||
target := parse_hostname_or_endpoint(hostname) or_return
|
target := parse_hostname_or_endpoint(hostname) or_return
|
||||||
switch t in target {
|
switch &t in target {
|
||||||
case Endpoint:
|
case Endpoint:
|
||||||
return dial_tcp_from_endpoint({t.address, port}, options)
|
t.port = port
|
||||||
case Host:
|
case Host:
|
||||||
if port == 0 {
|
t.port = port
|
||||||
|
}
|
||||||
|
|
||||||
|
return dial_tcp_from_host_or_endpoint(target, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Expects the `host` as Host.
|
||||||
|
*/
|
||||||
|
dial_tcp_from_host :: proc(host: Host, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
||||||
|
if host.port == 0 {
|
||||||
return 0, .Port_Required
|
return 0, .Port_Required
|
||||||
}
|
}
|
||||||
ep4, ep6 := resolve(t.hostname) or_return
|
ep4, ep6 := resolve(host.hostname) or_return
|
||||||
ep := ep4 if ep4.address != nil else ep6 // NOTE(tetra): We don't know what family the server uses, so we just default to IP4.
|
ep := ep4 if ep4.address != nil else ep6 // NOTE(tetra): We don't know what family the server uses, so we just default to IP4.
|
||||||
ep.port = port
|
ep.port = host.port
|
||||||
return dial_tcp_from_endpoint(ep, options)
|
return dial_tcp_from_endpoint(ep, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Expects the `target` as a Host_OrEndpoint.
|
||||||
|
Unwraps the underlying type and calls `dial_tcp_from_host` or `dial_tcp_from_endpoint`.
|
||||||
|
*/
|
||||||
|
dial_tcp_from_host_or_endpoint :: proc(target: Host_Or_Endpoint, options := default_tcp_options) -> (socket: TCP_Socket, err: Network_Error) {
|
||||||
|
switch t in target {
|
||||||
|
case Endpoint:
|
||||||
|
return dial_tcp_from_endpoint(t, options)
|
||||||
|
case Host:
|
||||||
|
return dial_tcp_from_host(t, options)
|
||||||
}
|
}
|
||||||
unreachable()
|
unreachable()
|
||||||
}
|
}
|
||||||
@@ -90,6 +101,8 @@ dial_tcp :: proc{
|
|||||||
dial_tcp_from_address_and_port,
|
dial_tcp_from_address_and_port,
|
||||||
dial_tcp_from_hostname_and_port_string,
|
dial_tcp_from_hostname_and_port_string,
|
||||||
dial_tcp_from_hostname_with_port_override,
|
dial_tcp_from_hostname_with_port_override,
|
||||||
|
dial_tcp_from_host,
|
||||||
|
dial_tcp_from_host_or_endpoint,
|
||||||
}
|
}
|
||||||
|
|
||||||
create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Network_Error) {
|
create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (socket: Any_Socket, err: Network_Error) {
|
||||||
|
|||||||
@@ -1031,14 +1031,17 @@ Returns:
|
|||||||
*/
|
*/
|
||||||
@private
|
@private
|
||||||
_split_iterator :: proc(s: ^string, sep: string, sep_save: int) -> (res: string, ok: bool) {
|
_split_iterator :: proc(s: ^string, sep: string, sep_save: int) -> (res: string, ok: bool) {
|
||||||
|
m: int
|
||||||
if sep == "" {
|
if sep == "" {
|
||||||
res = s[:]
|
if len(s) == 0 {
|
||||||
ok = true
|
m = -1
|
||||||
s^ = s[len(s):]
|
} else {
|
||||||
return
|
_, w := utf8.decode_rune_in_string(s^)
|
||||||
|
m = w
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m = index(s^, sep)
|
||||||
}
|
}
|
||||||
|
|
||||||
m := index(s^, sep)
|
|
||||||
if m < 0 {
|
if m < 0 {
|
||||||
// not found
|
// not found
|
||||||
res = s[:]
|
res = s[:]
|
||||||
|
|||||||
@@ -134,6 +134,11 @@ String_isEqualToString :: proc "c" (self, other: ^String) -> BOOL {
|
|||||||
return msgSend(BOOL, self, "isEqualToString:", other)
|
return msgSend(BOOL, self, "isEqualToString:", other)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@(objc_type=String, objc_name="stringByAppendingString")
|
||||||
|
String_stringByAppendingString :: proc "c" (self, other: ^String) -> ^String {
|
||||||
|
return msgSend(^String, self, "stringByAppendingString:", other)
|
||||||
|
}
|
||||||
|
|
||||||
@(objc_type=String, objc_name="rangeOfString")
|
@(objc_type=String, objc_name="rangeOfString")
|
||||||
String_rangeOfString :: proc "c" (self, other: ^String, options: StringCompareOptions) -> Range {
|
String_rangeOfString :: proc "c" (self, other: ^String, options: StringCompareOptions) -> Range {
|
||||||
return msgSend(Range, self, "rangeOfString:options:", other, options)
|
return msgSend(Range, self, "rangeOfString:options:", other, options)
|
||||||
|
|||||||
@@ -1329,6 +1329,7 @@ Socket_Option :: enum {
|
|||||||
ACCEPTCONN = 30,
|
ACCEPTCONN = 30,
|
||||||
PEERSEC = 31,
|
PEERSEC = 31,
|
||||||
PASSSEC = 34,
|
PASSSEC = 34,
|
||||||
|
IP_ADD_MEMBERSHIP = 35,
|
||||||
MARK = 36,
|
MARK = 36,
|
||||||
PROTOCOL = 38,
|
PROTOCOL = 38,
|
||||||
DOMAIN = 39,
|
DOMAIN = 39,
|
||||||
|
|||||||
@@ -2010,10 +2010,10 @@ statfs :: proc "contextless" (path: cstring, statfs: ^Stat_FS) -> (Errno) {
|
|||||||
*/
|
*/
|
||||||
fstatfs :: proc "contextless" (fd: Fd, statfs: ^Stat_FS) -> (Errno) {
|
fstatfs :: proc "contextless" (fd: Fd, statfs: ^Stat_FS) -> (Errno) {
|
||||||
when size_of(int) == 8 {
|
when size_of(int) == 8 {
|
||||||
ret := syscall(SYS_statfs, fd, statfs)
|
ret := syscall(SYS_fstatfs, fd, statfs)
|
||||||
return Errno(-ret)
|
return Errno(-ret)
|
||||||
} else {
|
} else {
|
||||||
ret := syscall(SYS_statfs64, fd, size_of(Stat_FS), statfs)
|
ret := syscall(SYS_fstatfs64, fd, size_of(Stat_FS), statfs)
|
||||||
return Errno(-ret)
|
return Errno(-ret)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -352,6 +352,18 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS
|
|||||||
// The highest reserved port number.
|
// The highest reserved port number.
|
||||||
IPPORT_RESERVED :: 1024
|
IPPORT_RESERVED :: 1024
|
||||||
|
|
||||||
|
when ODIN_OS == .Linux || ODIN_OS == .OpenBSD {
|
||||||
|
addrinfo :: struct {
|
||||||
|
ai_flags: Addrinfo_Flags, /* [PSX] input flags */
|
||||||
|
ai_family: AF, /* [PSX] address family of socket */
|
||||||
|
ai_socktype: Sock, /* [PSX] socket type */
|
||||||
|
ai_protocol: Protocol, /* [PSX] protocol of socket */
|
||||||
|
ai_addrlen: socklen_t, /* [PSX] length of socket address */
|
||||||
|
ai_addr: ^sockaddr, /* [PSX] binary address */
|
||||||
|
ai_canonname: cstring, /* [PSX] canonical name of service location */
|
||||||
|
ai_next: ^addrinfo, /* [PSX] pointer to next in list */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
addrinfo :: struct {
|
addrinfo :: struct {
|
||||||
ai_flags: Addrinfo_Flags, /* [PSX] input flags */
|
ai_flags: Addrinfo_Flags, /* [PSX] input flags */
|
||||||
ai_family: AF, /* [PSX] address family of socket */
|
ai_family: AF, /* [PSX] address family of socket */
|
||||||
@@ -362,6 +374,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS
|
|||||||
ai_addr: ^sockaddr, /* [PSX] binary address */
|
ai_addr: ^sockaddr, /* [PSX] binary address */
|
||||||
ai_next: ^addrinfo, /* [PSX] pointer to next in list */
|
ai_next: ^addrinfo, /* [PSX] pointer to next in list */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
when ODIN_OS == .Darwin {
|
when ODIN_OS == .Darwin {
|
||||||
|
|
||||||
|
|||||||
+175
-135
@@ -899,7 +899,7 @@ CS :: enum c.int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PC :: enum c.int {
|
PC :: enum c.int {
|
||||||
_2_SYMLINK = _PC_2_SYMLINK,
|
_2_SYMLINKS = _PC_2_SYMLINKS,
|
||||||
_ALLOC_SIZE_MIN = _PC_ALLOC_SIZE_MIN,
|
_ALLOC_SIZE_MIN = _PC_ALLOC_SIZE_MIN,
|
||||||
_ASYNC_IO = _PC_ASYNC_IO,
|
_ASYNC_IO = _PC_ASYNC_IO,
|
||||||
_CHOWN_RESTRICTED = _PC_CHOWN_RESTRICTED,
|
_CHOWN_RESTRICTED = _PC_CHOWN_RESTRICTED,
|
||||||
@@ -1099,7 +1099,7 @@ when ODIN_OS == .Darwin {
|
|||||||
_PC_CHOWN_RESTRICTED :: 7
|
_PC_CHOWN_RESTRICTED :: 7
|
||||||
_PC_NO_TRUNC :: 8
|
_PC_NO_TRUNC :: 8
|
||||||
_PC_VDISABLE :: 9
|
_PC_VDISABLE :: 9
|
||||||
_PC_2_SYMLINK :: 15
|
_PC_2_SYMLINKS :: 15
|
||||||
_PC_ALLOC_SIZE_MIN :: 16
|
_PC_ALLOC_SIZE_MIN :: 16
|
||||||
_PC_ASYNC_IO :: 17
|
_PC_ASYNC_IO :: 17
|
||||||
_PC_FILESIZEBITS :: 18
|
_PC_FILESIZEBITS :: 18
|
||||||
@@ -1280,7 +1280,7 @@ when ODIN_OS == .Darwin {
|
|||||||
_PC_CHOWN_RESTRICTED :: 7
|
_PC_CHOWN_RESTRICTED :: 7
|
||||||
_PC_NO_TRUNC :: 8
|
_PC_NO_TRUNC :: 8
|
||||||
_PC_VDISABLE :: 9
|
_PC_VDISABLE :: 9
|
||||||
_PC_2_SYMLINK :: 13 // NOTE: not in headers (freebsd)
|
_PC_2_SYMLINKS :: 13 // NOTE: not in headers (freebsd)
|
||||||
_PC_ALLOC_SIZE_MIN :: 10
|
_PC_ALLOC_SIZE_MIN :: 10
|
||||||
_PC_ASYNC_IO :: 53
|
_PC_ASYNC_IO :: 53
|
||||||
_PC_FILESIZEBITS :: 12
|
_PC_FILESIZEBITS :: 12
|
||||||
@@ -1461,7 +1461,7 @@ when ODIN_OS == .Darwin {
|
|||||||
_PC_CHOWN_RESTRICTED :: 7
|
_PC_CHOWN_RESTRICTED :: 7
|
||||||
_PC_NO_TRUNC :: 8
|
_PC_NO_TRUNC :: 8
|
||||||
_PC_VDISABLE :: 9
|
_PC_VDISABLE :: 9
|
||||||
_PC_2_SYMLINK :: 13 // NOTE: not in headers
|
_PC_2_SYMLINKS :: 13 // NOTE: not in headers
|
||||||
_PC_ALLOC_SIZE_MIN :: 10 // NOTE: not in headers
|
_PC_ALLOC_SIZE_MIN :: 10 // NOTE: not in headers
|
||||||
_PC_ASYNC_IO :: 53 // NOTE: not in headers
|
_PC_ASYNC_IO :: 53 // NOTE: not in headers
|
||||||
_PC_FILESIZEBITS :: 11
|
_PC_FILESIZEBITS :: 11
|
||||||
@@ -1646,7 +1646,7 @@ when ODIN_OS == .Darwin {
|
|||||||
_PC_CHOWN_RESTRICTED :: 7
|
_PC_CHOWN_RESTRICTED :: 7
|
||||||
_PC_NO_TRUNC :: 8
|
_PC_NO_TRUNC :: 8
|
||||||
_PC_VDISABLE :: 9
|
_PC_VDISABLE :: 9
|
||||||
_PC_2_SYMLINK :: 10
|
_PC_2_SYMLINKS :: 10
|
||||||
_PC_ALLOC_SIZE_MIN :: 11
|
_PC_ALLOC_SIZE_MIN :: 11
|
||||||
_PC_ASYNC_IO :: 12
|
_PC_ASYNC_IO :: 12
|
||||||
_PC_FILESIZEBITS :: 13
|
_PC_FILESIZEBITS :: 13
|
||||||
@@ -1816,127 +1816,164 @@ when ODIN_OS == .Darwin {
|
|||||||
F_TLOCK :: 2
|
F_TLOCK :: 2
|
||||||
F_ULOCK :: 0
|
F_ULOCK :: 0
|
||||||
|
|
||||||
_CS_PATH :: 1
|
_CS_PATH :: 0
|
||||||
_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 2
|
_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 1
|
||||||
|
_CS_GNU_LIBC_VERSION :: 2
|
||||||
|
_CS_GNU_LIBPTHREAD_VERSION :: 3
|
||||||
|
_CS_POSIX_V5_WIDTH_RESTRICTED_ENVS :: 4
|
||||||
|
_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS :: 5
|
||||||
|
|
||||||
_CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 1116
|
_CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 1116
|
||||||
_CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 1117
|
_CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 1117
|
||||||
_CS_POSIX_V6_ILP32_OFF32_LIBS :: 1118
|
_CS_POSIX_V6_ILP32_OFF32_LIBS :: 1118
|
||||||
|
_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS :: 1119
|
||||||
_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 1120
|
_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 1120
|
||||||
_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 1121
|
_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 1121
|
||||||
_CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 1122
|
_CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 1122
|
||||||
|
_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS :: 1123
|
||||||
_CS_POSIX_V6_LP64_OFF64_CFLAGS :: 1124
|
_CS_POSIX_V6_LP64_OFF64_CFLAGS :: 1124
|
||||||
_CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 1125
|
_CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 1125
|
||||||
_CS_POSIX_V6_LP64_OFF64_LIBS :: 1126
|
_CS_POSIX_V6_LP64_OFF64_LIBS :: 1126
|
||||||
|
_CS_POSIX_V6_LP64_OFF64_LINTFLAGS :: 1127
|
||||||
_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 1128
|
_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 1128
|
||||||
_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 1129
|
_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 1129
|
||||||
_CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 1130
|
_CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 1130
|
||||||
|
_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS :: 1131
|
||||||
|
_CS_POSIX_V7_ILP32_OFF32_CFLAGS :: 1132
|
||||||
|
_CS_POSIX_V7_ILP32_OFF32_LDFLAGS :: 1133
|
||||||
|
_CS_POSIX_V7_ILP32_OFF32_LIBS :: 1134
|
||||||
|
_CS_POSIX_V7_ILP32_OFF32_LINTFLAGS :: 1135
|
||||||
|
_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS :: 1136
|
||||||
|
_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS :: 1137
|
||||||
|
_CS_POSIX_V7_ILP32_OFFBIG_LIBS :: 1138
|
||||||
|
_CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS :: 1139
|
||||||
|
_CS_POSIX_V7_LP64_OFF64_CFLAGS :: 1140
|
||||||
|
_CS_POSIX_V7_LP64_OFF64_LDFLAGS :: 1141
|
||||||
|
_CS_POSIX_V7_LP64_OFF64_LIBS :: 1142
|
||||||
|
_CS_POSIX_V7_LP64_OFF64_LINTFLAGS :: 1143
|
||||||
|
_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS :: 1144
|
||||||
|
_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS :: 1145
|
||||||
|
_CS_POSIX_V7_LPBIG_OFFBIG_LIBS :: 1146
|
||||||
|
_CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS :: 1147
|
||||||
|
_CS_V6_ENV :: 1148
|
||||||
|
_CS_V7_ENV :: 1149
|
||||||
|
_CS_POSIX_V7_THREADS_CFLAGS :: 1150
|
||||||
|
_CS_POSIX_V7_THREADS_LDFLAGS :: 1151
|
||||||
|
|
||||||
_PC_LINK_MAX :: 1
|
_PC_LINK_MAX :: 0
|
||||||
_PC_MAX_CANON :: 2
|
_PC_MAX_CANON :: 1
|
||||||
_PC_MAX_INPUT :: 3
|
_PC_MAX_INPUT :: 2
|
||||||
_PC_NAME_MAX :: 4
|
_PC_NAME_MAX :: 3
|
||||||
_PC_PATH_MAX :: 5
|
_PC_PATH_MAX :: 4
|
||||||
_PC_PIPE_BUF :: 6
|
_PC_PIPE_BUF :: 5
|
||||||
_PC_CHOWN_RESTRICTED :: 7
|
_PC_CHOWN_RESTRICTED :: 6
|
||||||
_PC_NO_TRUNC :: 8
|
_PC_NO_TRUNC :: 7
|
||||||
_PC_VDISABLE :: 9
|
_PC_VDISABLE :: 8
|
||||||
_PC_SYNC_IO :: 10
|
_PC_SYNC_IO :: 9
|
||||||
_PC_ASYNC_IO :: 11
|
_PC_ASYNC_IO :: 10
|
||||||
_PC_PRIO_IO :: 12
|
_PC_PRIO_IO :: 11
|
||||||
_PC_FILESIZEBITS :: 14
|
_PC_SOCK_MAXBUF :: 12
|
||||||
_PC_REC_INCR_XFER_SIZE :: 15
|
_PC_FILESIZEBITS :: 13
|
||||||
_PC_REC_MAX_XFER_SIZE :: 16
|
_PC_REC_INCR_XFER_SIZE :: 14
|
||||||
_PC_REC_MIN_XFER_SIZE :: 17
|
_PC_REC_MAX_XFER_SIZE :: 15
|
||||||
_PC_REC_XFER_ALIGN :: 18
|
_PC_REC_MIN_XFER_SIZE :: 16
|
||||||
_PC_ALLOC_SIZE_MIN :: 19
|
_PC_REC_XFER_ALIGN :: 17
|
||||||
_PC_SYMLINK_MAX :: 20
|
_PC_ALLOC_SIZE_MIN :: 18
|
||||||
_PC_2_SYMLINK :: 21
|
_PC_SYMLINK_MAX :: 19
|
||||||
|
_PC_2_SYMLINKS :: 20
|
||||||
|
|
||||||
_SC_ARG_MAX :: 1
|
_SC_ARG_MAX :: 0
|
||||||
_SC_CHILD_MAX :: 2
|
_SC_CHILD_MAX :: 1
|
||||||
_SC_CLK_TCK :: 3
|
_SC_CLK_TCK :: 2
|
||||||
_SC_NGROUPS_MAX :: 4
|
_SC_NGROUPS_MAX :: 3
|
||||||
_SC_OPEN_MAX :: 5
|
_SC_OPEN_MAX :: 4
|
||||||
_SC_STREAM_MAX :: 6
|
_SC_STREAM_MAX :: 5
|
||||||
_SC_TZNAME_MAX :: 7
|
_SC_TZNAME_MAX :: 6
|
||||||
_SC_JOB_CONTROL :: 8
|
_SC_JOB_CONTROL :: 7
|
||||||
_SC_SAVED_IDS :: 9
|
_SC_SAVED_IDS :: 8
|
||||||
_SC_REALTIME_SIGNALS :: 10
|
_SC_REALTIME_SIGNALS :: 9
|
||||||
_SC_PRIORITY_SCHEDULING :: 11
|
_SC_PRIORITY_SCHEDULING :: 10
|
||||||
_SC_TIMERS :: 12
|
_SC_TIMERS :: 11
|
||||||
_SC_ASYNCHRONOUS_IO :: 13
|
_SC_ASYNCHRONOUS_IO :: 12
|
||||||
_SC_PRIORITIZED_IO :: 14
|
_SC_PRIORITIZED_IO :: 13
|
||||||
_SC_SYNCHRONIZED_IO :: 15
|
_SC_SYNCHRONIZED_IO :: 14
|
||||||
_SC_FSYNC :: 16
|
_SC_FSYNC :: 15
|
||||||
_SC_MAPPED_FILES :: 17
|
_SC_MAPPED_FILES :: 16
|
||||||
_SC_MEMLOCK :: 18
|
_SC_MEMLOCK :: 17
|
||||||
_SC_MEMLOCK_RANGE :: 19
|
_SC_MEMLOCK_RANGE :: 18
|
||||||
_SC_MEMORY_PROTECTION :: 20
|
_SC_MEMORY_PROTECTION :: 19
|
||||||
_SC_MESSAGE_PASSING :: 21
|
_SC_MESSAGE_PASSING :: 20
|
||||||
_SC_SEMAPHORES :: 22
|
_SC_SEMAPHORES :: 21
|
||||||
_SC_SHARED_MEMORY_OBJECTS :: 23
|
_SC_SHARED_MEMORY_OBJECTS :: 22
|
||||||
_SC_AIO_LISTIO_MAX :: 24
|
_SC_AIO_LISTIO_MAX :: 23
|
||||||
_SC_AIO_MAX :: 25
|
_SC_AIO_MAX :: 24
|
||||||
_SC_AIO_PRIO_DELTA_MAX :: 26
|
_SC_AIO_PRIO_DELTA_MAX :: 25
|
||||||
_SC_DELAYTIMER_MAX :: 27
|
_SC_DELAYTIMER_MAX :: 26
|
||||||
_SC_MQ_OPEN_MAX :: 28
|
_SC_MQ_OPEN_MAX :: 27
|
||||||
_SC_MQ_PRIO_MAX :: 29
|
_SC_MQ_PRIO_MAX :: 28
|
||||||
_SC_VERSION :: 30
|
_SC_VERSION :: 29
|
||||||
_SC_PAGESIZE :: 31
|
_SC_PAGE_SIZE :: 30
|
||||||
_SC_PAGE_SIZE :: _SC_PAGESIZE
|
_SC_PAGESIZE :: _SC_PAGE_SIZE
|
||||||
_SC_RTSIG_MAX :: 32
|
_SC_RTSIG_MAX :: 31
|
||||||
_SC_SEM_NSEMS_MAX :: 33
|
_SC_SEM_NSEMS_MAX :: 32
|
||||||
_SC_SEM_VALUE_MAX :: 34
|
_SC_SEM_VALUE_MAX :: 33
|
||||||
_SC_SIGQUEUE_MAX :: 35
|
_SC_SIGQUEUE_MAX :: 34
|
||||||
_SC_TIMER_MAX :: 36
|
_SC_TIMER_MAX :: 35
|
||||||
_SC_BC_BASE_MAX :: 37
|
_SC_BC_BASE_MAX :: 36
|
||||||
_SC_BC_DIM_MAX :: 38
|
_SC_BC_DIM_MAX :: 37
|
||||||
_SC_BC_SCALE_MAX :: 39
|
_SC_BC_SCALE_MAX :: 38
|
||||||
_SC_BC_STRING_MAX :: 40
|
_SC_BC_STRING_MAX :: 39
|
||||||
_SC_COLL_WEIGHTS_MAX :: 41
|
_SC_COLL_WEIGHTS_MAX :: 40
|
||||||
_SC_EXPR_NEST_MAX :: 43
|
_SC_EXPR_NEST_MAX :: 42
|
||||||
_SC_LINE_MAX :: 44
|
_SC_LINE_MAX :: 43
|
||||||
_SC_RE_DUP_MAX :: 45
|
_SC_RE_DUP_MAX :: 44
|
||||||
_SC_2_VERSION :: 47
|
_SC_2_VERSION :: 46
|
||||||
_SC_2_C_BIND :: 48
|
_SC_2_C_BIND :: 47
|
||||||
_SC_2_C_DEV :: 49
|
_SC_2_C_DEV :: 48
|
||||||
_SC_2_FORT_DEV :: 50
|
_SC_2_FORT_DEV :: 49
|
||||||
_SC_2_FORT_RUN :: 51
|
_SC_2_FORT_RUN :: 50
|
||||||
_SC_2_SW_DEV :: 52
|
_SC_2_SW_DEV :: 51
|
||||||
_SC_2_LOCALEDEF :: 53
|
_SC_2_LOCALEDEF :: 52
|
||||||
|
_SC_UIO_MAXIOV :: 60
|
||||||
_SC_IOV_MAX :: 62
|
_SC_IOV_MAX :: _SC_UIO_MAXIOV
|
||||||
_SC_THREADS :: 69
|
_SC_THREADS :: 67
|
||||||
_SC_THREAD_SAFE_FUNCTIONS :: 70
|
_SC_THREAD_SAFE_FUNCTIONS :: 68
|
||||||
_SC_GETGR_R_SIZE_MAX :: 71
|
_SC_GETGR_R_SIZE_MAX :: 69
|
||||||
_SC_GETPW_R_SIZE_MAX :: 72
|
_SC_GETPW_R_SIZE_MAX :: 70
|
||||||
_SC_LOGIN_NAME_MAX :: 73
|
_SC_LOGIN_NAME_MAX :: 71
|
||||||
_SC_TTY_NAME_MAX :: 74
|
_SC_TTY_NAME_MAX :: 72
|
||||||
_SC_THREAD_DESTRUCTOR_ITERATIONS :: 75
|
_SC_THREAD_DESTRUCTOR_ITERATIONS :: 73
|
||||||
_SC_THREAD_KEYS_MAX :: 76
|
_SC_THREAD_KEYS_MAX :: 74
|
||||||
_SC_THREAD_STACK_MIN :: 77
|
_SC_THREAD_STACK_MIN :: 75
|
||||||
_SC_THREAD_THREADS_MAX :: 78
|
_SC_THREAD_THREADS_MAX :: 76
|
||||||
_SC_THREAD_ATTR_STACKADDR :: 79
|
_SC_THREAD_ATTR_STACKADDR :: 77
|
||||||
_SC_THREAD_ATTR_STACKSIZE :: 80
|
_SC_THREAD_ATTR_STACKSIZE :: 78
|
||||||
_SC_THREAD_PRIORITY_SCHEDULING :: 81
|
_SC_THREAD_PRIORITY_SCHEDULING :: 79
|
||||||
_SC_THREAD_PRIO_INHERIT :: 82
|
_SC_THREAD_PRIO_INHERIT :: 80
|
||||||
_SC_THREAD_PRIO_PROTECT :: 83
|
_SC_THREAD_PRIO_PROTECT :: 81
|
||||||
_SC_THREAD_PROCESS_SHARED :: 84
|
_SC_THREAD_PROCESS_SHARED :: 82
|
||||||
_SC_NPROCESSORS_CONF :: 85
|
_SC_NPROCESSORS_CONF :: 83
|
||||||
_SC_NPROCESSORS_ONLN :: 86
|
_SC_NPROCESSORS_ONLN :: 84
|
||||||
_SC_PHYS_PAGES :: 87
|
_SC_PHYS_PAGES :: 85
|
||||||
_SC_AVPHYS_PAGES :: 88
|
_SC_AVPHYS_PAGES :: 86
|
||||||
_SC_ATEXIT_MAX :: 89
|
_SC_ATEXIT_MAX :: 87
|
||||||
_SC_PASS_MAX :: 90
|
_SC_PASS_MAX :: 88
|
||||||
_SC_XOPEN_VERSION :: 91
|
_SC_XOPEN_VERSION :: 89
|
||||||
_SC_XOPEN_UNIX :: 92
|
_SC_XOPEN_XCU_VERSION :: 90
|
||||||
_SC_XOPEN_CRYPT :: 93
|
_SC_XOPEN_UNIX :: 91
|
||||||
_SC_XOPEN_ENH_I18N :: 94
|
_SC_XOPEN_CRYPT :: 92
|
||||||
_SC_XOPEN_SHM :: 95
|
_SC_XOPEN_ENH_I18N :: 93
|
||||||
_SC_2_CHAR_TERM :: 96
|
_SC_XOPEN_SHM :: 94
|
||||||
|
_SC_2_CHAR_TERM :: 95
|
||||||
_SC_2_UPE :: 97
|
_SC_2_UPE :: 97
|
||||||
|
_SC_XOPEN_XPG2 :: 98
|
||||||
|
_SC_XOPEN_XPG3 :: 99
|
||||||
|
_SC_XOPEN_XPG4 :: 100
|
||||||
|
_SC_NZERO :: 109
|
||||||
|
_SC_XBS5_ILP32_OFF32 :: 125
|
||||||
|
_SC_XBS5_ILP32_OFFBIG :: 126
|
||||||
|
_SC_XBS5_LP64_OFF64 :: 127
|
||||||
|
_SC_XBS5_LPBIG_OFFBIG :: 128
|
||||||
_SC_XOPEN_LEGACY :: 129
|
_SC_XOPEN_LEGACY :: 129
|
||||||
_SC_XOPEN_REALTIME :: 130
|
_SC_XOPEN_REALTIME :: 130
|
||||||
_SC_XOPEN_REALTIME_THREADS :: 131
|
_SC_XOPEN_REALTIME_THREADS :: 131
|
||||||
@@ -1961,31 +1998,34 @@ when ODIN_OS == .Darwin {
|
|||||||
_SC_2_PBS_MESSAGE :: 171
|
_SC_2_PBS_MESSAGE :: 171
|
||||||
_SC_2_PBS_TRACK :: 172
|
_SC_2_PBS_TRACK :: 172
|
||||||
_SC_SYMLOOP_MAX :: 173
|
_SC_SYMLOOP_MAX :: 173
|
||||||
_SC_2_PBS_CHECKPOINT :: 174
|
_SC_STREAMS :: 174
|
||||||
_SC_V6_ILP32_OFF32 :: 175
|
_SC_2_PBS_CHECKPOINT :: 175
|
||||||
_SC_V6_ILP32_OFFBIG :: 176
|
_SC_V6_ILP32_OFF32 :: 176
|
||||||
_SC_V6_LP64_OFF64 :: 177
|
_SC_V6_ILP32_OFFBIG :: 177
|
||||||
_SC_V6_LPBIG_OFFBIG :: 178
|
_SC_V6_LP64_OFF64 :: 178
|
||||||
_SC_HOST_NAME_MAX :: 179
|
_SC_V6_LPBIG_OFFBIG :: 179
|
||||||
_SC_TRACE :: 180
|
_SC_HOST_NAME_MAX :: 180
|
||||||
_SC_TRACE_EVENT_FILTER :: 181
|
_SC_TRACE :: 181
|
||||||
_SC_TRACE_INHERIT :: 182
|
_SC_TRACE_EVENT_FILTER :: 182
|
||||||
_SC_TRACE_LOG :: 183
|
_SC_TRACE_INHERIT :: 183
|
||||||
|
_SC_TRACE_LOG :: 184
|
||||||
|
|
||||||
_SC_IPV6 :: 234
|
_SC_IPV6 :: 235
|
||||||
_SC_RAW_SOCKETS :: 235
|
_SC_RAW_SOCKETS :: 236
|
||||||
_SC_V7_ILP32_OFF32 :: 236
|
_SC_V7_ILP32_OFF32 :: 237
|
||||||
_SC_V7_ILP32_OFFBIG :: 237
|
_SC_V7_ILP32_OFFBIG :: 238
|
||||||
_SC_V7_LP64_OFF64 :: 238
|
_SC_V7_LP64_OFF64 :: 239
|
||||||
_SC_V7_LPBIG_OFFBIG :: 239
|
_SC_V7_LPBIG_OFFBIG :: 240
|
||||||
_SC_SS_REPL_MAX :: 240
|
_SC_SS_REPL_MAX :: 241
|
||||||
_SC_TRACE_EVENT_NAME_MAX :: 241
|
_SC_TRACE_EVENT_NAME_MAX :: 242
|
||||||
_SC_TRACE_NAME_MAX :: 242
|
_SC_TRACE_NAME_MAX :: 243
|
||||||
_SC_TRACE_SYS_MAX :: 243
|
_SC_TRACE_SYS_MAX :: 244
|
||||||
_SC_TRACE_USER_EVENT_MAX :: 244
|
_SC_TRACE_USER_EVENT_MAX :: 245
|
||||||
_SC_XOPEN_STREAMS :: 245
|
_SC_XOPEN_STREAMS :: 246
|
||||||
_SC_THREAD_ROBUST_PRIO_INHERIT :: 246
|
_SC_THREAD_ROBUST_PRIO_INHERIT :: 247
|
||||||
_SC_THREAD_ROBUST_PRIO_PROTECT :: 247
|
_SC_THREAD_ROBUST_PRIO_PROTECT :: 248
|
||||||
|
_SC_MINSIGSTKSZ :: 249
|
||||||
|
_SC_SIGSTKSZ :: 250
|
||||||
|
|
||||||
// NOTE: Not implemented.
|
// NOTE: Not implemented.
|
||||||
_SC_XOPEN_UUCP :: 0
|
_SC_XOPEN_UUCP :: 0
|
||||||
@@ -2046,7 +2086,7 @@ when ODIN_OS == .Darwin {
|
|||||||
_PC_REC_XFER_ALIGN :: 34
|
_PC_REC_XFER_ALIGN :: 34
|
||||||
_PC_ALLOC_SIZE_MIN :: 35
|
_PC_ALLOC_SIZE_MIN :: 35
|
||||||
_PC_SYMLINK_MAX :: 36
|
_PC_SYMLINK_MAX :: 36
|
||||||
_PC_2_SYMLINK :: 37
|
_PC_2_SYMLINKS :: 37
|
||||||
|
|
||||||
_SC_ARG_MAX :: 15
|
_SC_ARG_MAX :: 15
|
||||||
_SC_CHILD_MAX :: 16
|
_SC_CHILD_MAX :: 16
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -66,6 +66,7 @@ PULONG_PTR :: ^ULONG_PTR
|
|||||||
LPULONG_PTR :: ^ULONG_PTR
|
LPULONG_PTR :: ^ULONG_PTR
|
||||||
DWORD_PTR :: ULONG_PTR
|
DWORD_PTR :: ULONG_PTR
|
||||||
LONG_PTR :: int
|
LONG_PTR :: int
|
||||||
|
INT_PTR :: int
|
||||||
UINT_PTR :: uintptr
|
UINT_PTR :: uintptr
|
||||||
ULONG :: c_ulong
|
ULONG :: c_ulong
|
||||||
ULONGLONG :: c_ulonglong
|
ULONGLONG :: c_ulonglong
|
||||||
@@ -542,6 +543,44 @@ COLOR_3DHIGHLIGHT :: COLOR_BTNHIGHLIGHT
|
|||||||
COLOR_3DHILIGHT :: COLOR_BTNHIGHLIGHT
|
COLOR_3DHILIGHT :: COLOR_BTNHIGHLIGHT
|
||||||
COLOR_BTNHILIGHT :: COLOR_BTNHIGHLIGHT
|
COLOR_BTNHILIGHT :: COLOR_BTNHIGHLIGHT
|
||||||
|
|
||||||
|
// Common Control Notification Code Ranges
|
||||||
|
NM_FIRST :: 0
|
||||||
|
NM_LAST :: ~DWORD(99 - 1)
|
||||||
|
LVN_FIRST :: ~DWORD(100 - 1)
|
||||||
|
LVN_LAST :: ~DWORD(199 - 1)
|
||||||
|
HDN_FIRST :: ~DWORD(300 - 1)
|
||||||
|
HDN_LAST :: ~DWORD(399 - 1)
|
||||||
|
TVN_FIRST :: ~DWORD(400 - 1)
|
||||||
|
TVN_LAST :: ~DWORD(499 - 1)
|
||||||
|
TTN_FIRST :: ~DWORD(520 - 1)
|
||||||
|
TTN_LAST :: ~DWORD(549 - 1)
|
||||||
|
TCN_FIRST :: ~DWORD(550 - 1)
|
||||||
|
TCN_LAST :: ~DWORD(580 - 1)
|
||||||
|
CDN_FIRST :: ~DWORD(601 - 1)
|
||||||
|
CDN_LAST :: ~DWORD(699 - 1)
|
||||||
|
TBN_FIRST :: ~DWORD(700 - 1)
|
||||||
|
TBN_LAST :: ~DWORD(720 - 1)
|
||||||
|
UDN_FIRST :: ~DWORD(721 - 1)
|
||||||
|
UDN_LAST :: ~DWORD(740 - 1)
|
||||||
|
MCN_FIRST :: ~DWORD(750 - 1)
|
||||||
|
MCN_LAST :: ~DWORD(759 - 1)
|
||||||
|
DTN_FIRST :: ~DWORD(760 - 1)
|
||||||
|
DTN_LAST :: ~DWORD(799 - 1)
|
||||||
|
CBEN_FIRST :: ~DWORD(800 - 1)
|
||||||
|
CBEN_LAST :: ~DWORD(830 - 1)
|
||||||
|
RBN_FIRST :: ~DWORD(831 - 1)
|
||||||
|
RBN_LAST :: ~DWORD(859 - 1)
|
||||||
|
IPN_FIRST :: ~DWORD(860 - 1)
|
||||||
|
IPN_LAST :: ~DWORD(879 - 1)
|
||||||
|
SBN_FIRST :: ~DWORD(880 - 1)
|
||||||
|
SBN_LAST :: ~DWORD(899 - 1)
|
||||||
|
PGN_FIRST :: ~DWORD(900 - 1)
|
||||||
|
PGN_LAST :: ~DWORD(950 - 1)
|
||||||
|
WMN_FIRST :: ~DWORD(1000 - 1)
|
||||||
|
WMN_LAST :: ~DWORD(1200 - 1)
|
||||||
|
BCN_FIRST :: ~DWORD(1250 - 1)
|
||||||
|
BCN_LAST :: ~DWORD(1350 - 1)
|
||||||
|
|
||||||
// Combo Box Notification Codes
|
// Combo Box Notification Codes
|
||||||
CBN_ERRSPACE :: -1
|
CBN_ERRSPACE :: -1
|
||||||
CBN_SELCHANGE :: 1
|
CBN_SELCHANGE :: 1
|
||||||
@@ -624,6 +663,10 @@ BST_INDETERMINATE :: 0x0002
|
|||||||
BST_PUSHED :: 0x0004
|
BST_PUSHED :: 0x0004
|
||||||
BST_FOCUS :: 0x0008
|
BST_FOCUS :: 0x0008
|
||||||
|
|
||||||
|
// Button Control Notification Codes
|
||||||
|
BCN_HOTITEMCHANGE :: (BCN_FIRST + 0x0001)
|
||||||
|
BCN_DROPDOWN :: (BCN_FIRST + 0x0002)
|
||||||
|
|
||||||
// Static Control Constants
|
// Static Control Constants
|
||||||
SS_LEFT :: 0x00000000
|
SS_LEFT :: 0x00000000
|
||||||
SS_CENTER :: 0x00000001
|
SS_CENTER :: 0x00000001
|
||||||
@@ -686,6 +729,416 @@ EN_VSCROLL :: 0x0602
|
|||||||
EN_ALIGN_LTR_EC :: 0x0700
|
EN_ALIGN_LTR_EC :: 0x0700
|
||||||
EN_ALIGN_RTL_EC :: 0x0701
|
EN_ALIGN_RTL_EC :: 0x0701
|
||||||
|
|
||||||
|
// Toolbar Styles
|
||||||
|
TBS_AUTOTICKS :: 0x001
|
||||||
|
TBS_VERT :: 0x002
|
||||||
|
TBS_HORZ :: 0x000
|
||||||
|
TBS_TOP :: 0x004
|
||||||
|
TBS_BOTTOM :: 0x000
|
||||||
|
TBS_LEFT :: 0x004
|
||||||
|
TBS_RIGHT :: 0x000
|
||||||
|
TBS_BOTH :: 0x008
|
||||||
|
TBS_NOTICKS :: 0x010
|
||||||
|
TBS_ENABLESELRANGE :: 0x020
|
||||||
|
TBS_FIXEDLENGTH :: 0x040
|
||||||
|
TBS_NOTHUMB :: 0x080
|
||||||
|
TBS_TOOLTIPS :: 0x100
|
||||||
|
TBS_REVERSED :: 0x200
|
||||||
|
TBS_DOWNISLEFT :: 0x400
|
||||||
|
|
||||||
|
// Toolbar Button Styles
|
||||||
|
TBSTYLE_BUTTON :: 0x0000
|
||||||
|
TBSTYLE_SEP :: 0x0001
|
||||||
|
TBSTYLE_CHECK :: 0x0002
|
||||||
|
TBSTYLE_GROUP :: 0x0004
|
||||||
|
TBSTYLE_CHECKGROUP :: (TBSTYLE_GROUP | TBSTYLE_CHECK)
|
||||||
|
TBSTYLE_DROPDOWN :: 0x0008
|
||||||
|
TBSTYLE_AUTOSIZE :: 0x0010
|
||||||
|
TBSTYLE_NOPREFIX :: 0x0020
|
||||||
|
TBSTYLE_TOOLTIPS :: 0x0100
|
||||||
|
TBSTYLE_WRAPABLE :: 0x0200
|
||||||
|
TBSTYLE_ALTDRAG :: 0x0400
|
||||||
|
TBSTYLE_FLAT :: 0x0800
|
||||||
|
TBSTYLE_LIST :: 0x1000
|
||||||
|
TBSTYLE_CUSTOMERASE :: 0x2000
|
||||||
|
TBSTYLE_REGISTERDROP :: 0x4000
|
||||||
|
TBSTYLE_TRANSPARENT :: 0x8000
|
||||||
|
|
||||||
|
// Toolbar Button Styles (Aliases)
|
||||||
|
BTNS_BUTTON :: TBSTYLE_BUTTON
|
||||||
|
BTNS_SEP :: TBSTYLE_SEP
|
||||||
|
BTNS_CHECK :: TBSTYLE_CHECK
|
||||||
|
BTNS_GROUP :: TBSTYLE_GROUP
|
||||||
|
BTNS_CHECKGROUP :: TBSTYLE_CHECKGROUP
|
||||||
|
BTNS_DROPDOWN :: TBSTYLE_DROPDOWN
|
||||||
|
BTNS_AUTOSIZE :: TBSTYLE_AUTOSIZE
|
||||||
|
BTNS_NOPREFIX :: TBSTYLE_NOPREFIX
|
||||||
|
BTNS_SHOWTEXT :: 0x40
|
||||||
|
BTNS_WHOLEDROPDOWN :: 0x80
|
||||||
|
|
||||||
|
// Toolbar Extended Styles
|
||||||
|
TBSTYLE_EX_DRAWDDARROWS :: 0x01
|
||||||
|
TBSTYLE_EX_MIXEDBUTTONS :: 0x08
|
||||||
|
TBSTYLE_EX_HIDECLIPPEDBUTTONS :: 0x10
|
||||||
|
TBSTYLE_EX_DOUBLEBUFFER :: 0x80
|
||||||
|
|
||||||
|
// Toolbar Item State Codes
|
||||||
|
TBSTATE_CHECKED :: 0x01
|
||||||
|
TBSTATE_PRESSED :: 0x02
|
||||||
|
TBSTATE_ENABLED :: 0x04
|
||||||
|
TBSTATE_HIDDEN :: 0x08
|
||||||
|
TBSTATE_INDETERMINATE :: 0x10
|
||||||
|
TBSTATE_WRAP :: 0x20
|
||||||
|
TBSTATE_ELLIPSES :: 0x40
|
||||||
|
TBSTATE_MARKED :: 0x80
|
||||||
|
|
||||||
|
// Toolbar Constants
|
||||||
|
TBCDRF_NOEDGES :: 0x010000
|
||||||
|
TBCDRF_HILITEHOTTRACK :: 0x020000
|
||||||
|
TBCDRF_NOOFFSET :: 0x040000
|
||||||
|
TBCDRF_NOMARK :: 0x080000
|
||||||
|
TBCDRF_NOETCHEDEFFECT :: 0x100000
|
||||||
|
TBCDRF_BLENDICON :: 0x200000
|
||||||
|
TBCDRF_NOBACKGROUND :: 0x400000
|
||||||
|
|
||||||
|
TBBF_LARGE :: 0x1
|
||||||
|
|
||||||
|
TBIF_IMAGE :: 0x00000001
|
||||||
|
TBIF_TEXT :: 0x00000002
|
||||||
|
TBIF_STATE :: 0x00000004
|
||||||
|
TBIF_STYLE :: 0x00000008
|
||||||
|
TBIF_LPARAM :: 0x00000010
|
||||||
|
TBIF_COMMAND :: 0x00000020
|
||||||
|
TBIF_SIZE :: 0x00000040
|
||||||
|
TBIF_BYINDEX :: 0x80000000
|
||||||
|
|
||||||
|
TBMF_PAD :: 0x1
|
||||||
|
TBMF_BARPAD :: 0x2
|
||||||
|
TBMF_BUTTONSPACING :: 0x4
|
||||||
|
|
||||||
|
IDB_STD_SMALL_COLOR :: 0
|
||||||
|
IDB_STD_LARGE_COLOR :: 1
|
||||||
|
IDB_VIEW_SMALL_COLOR :: 4
|
||||||
|
IDB_VIEW_LARGE_COLOR :: 5
|
||||||
|
IDB_HIST_SMALL_COLOR :: 8
|
||||||
|
IDB_HIST_LARGE_COLOR :: 9
|
||||||
|
|
||||||
|
STD_CUT :: 0
|
||||||
|
STD_COPY :: 1
|
||||||
|
STD_PASTE :: 2
|
||||||
|
STD_UNDO :: 3
|
||||||
|
STD_REDOW :: 4
|
||||||
|
STD_DELETE :: 5
|
||||||
|
STD_FILENEW :: 6
|
||||||
|
STD_FILEOPEN :: 7
|
||||||
|
STD_FILESAVE :: 8
|
||||||
|
STD_PRINTPRE :: 9
|
||||||
|
STD_PROPERTIES :: 10
|
||||||
|
STD_HELP :: 11
|
||||||
|
STD_FIND :: 12
|
||||||
|
STD_REPLACE :: 13
|
||||||
|
STD_PRINT :: 14
|
||||||
|
|
||||||
|
VIEW_LARGEICONS :: 0
|
||||||
|
VIEW_SMALLICONS :: 1
|
||||||
|
VIEW_LIST :: 2
|
||||||
|
VIEW_DETAILS :: 3
|
||||||
|
VIEW_SORTNAME :: 4
|
||||||
|
VIEW_SORTSIZE :: 5
|
||||||
|
VIEW_SORTDATE :: 6
|
||||||
|
VIEW_SORTTYPE :: 7
|
||||||
|
VIEW_PARENTFOLDER :: 8
|
||||||
|
VIEW_NETCONNECT :: 9
|
||||||
|
VIEW_NETDISCONNECT :: 10
|
||||||
|
VIEW_NEWFOLDER :: 11
|
||||||
|
VIEW_VIEWMENU :: 12
|
||||||
|
|
||||||
|
HIST_BACK :: 0
|
||||||
|
HIST_FORWARD :: 1
|
||||||
|
HIST_FAVORITES :: 2
|
||||||
|
HIST_ADDTOFAVORITES :: 3
|
||||||
|
HIST_VIEWTREE :: 4
|
||||||
|
|
||||||
|
// Header Control Styles
|
||||||
|
HDS_HORZ :: 0x000
|
||||||
|
HDS_BUTTONS :: 0x002
|
||||||
|
HDS_HOTTRACK :: 0x004
|
||||||
|
HDS_HIDDEN :: 0x008
|
||||||
|
HDS_DRAGDROP :: 0x040
|
||||||
|
HDS_FULLDRAG :: 0x080
|
||||||
|
HDS_FILTERBAR :: 0x100
|
||||||
|
HDS_FLAT :: 0x200
|
||||||
|
|
||||||
|
// Header Control Notifications
|
||||||
|
HDN_ITEMCHANGINGA :: (HDN_FIRST-0)
|
||||||
|
HDN_ITEMCHANGEDA :: (HDN_FIRST-1)
|
||||||
|
HDN_ITEMCLICKA :: (HDN_FIRST-2)
|
||||||
|
HDN_ITEMDBLCLICKA :: (HDN_FIRST-3)
|
||||||
|
HDN_DIVIDERDBLCLICKA :: (HDN_FIRST-5)
|
||||||
|
HDN_BEGINTRACKA :: (HDN_FIRST-6)
|
||||||
|
HDN_ENDTRACKA :: (HDN_FIRST-7)
|
||||||
|
HDN_TRACKA :: (HDN_FIRST-8)
|
||||||
|
HDN_GETDISPINFOA :: (HDN_FIRST-9)
|
||||||
|
HDN_BEGINDRAG :: (HDN_FIRST-10)
|
||||||
|
HDN_ENDDRAG :: (HDN_FIRST-11)
|
||||||
|
HDN_FILTERCHANGE :: (HDN_FIRST-12)
|
||||||
|
HDN_FILTERBTNCLICK :: (HDN_FIRST-13)
|
||||||
|
HDN_ITEMCHANGINGW :: (HDN_FIRST-20)
|
||||||
|
HDN_ITEMCHANGEDW :: (HDN_FIRST-21)
|
||||||
|
HDN_ITEMCLICKW :: (HDN_FIRST-22)
|
||||||
|
HDN_ITEMDBLCLICKW :: (HDN_FIRST-23)
|
||||||
|
HDN_DIVIDERDBLCLICKW :: (HDN_FIRST-25)
|
||||||
|
HDN_BEGINTRACKW :: (HDN_FIRST-26)
|
||||||
|
HDN_ENDTRACKW :: (HDN_FIRST-27)
|
||||||
|
HDN_TRACKW :: (HDN_FIRST-28)
|
||||||
|
HDN_GETDISPINFOW :: (HDN_FIRST-29)
|
||||||
|
|
||||||
|
// Header Control Constants
|
||||||
|
HDFT_ISSTRING :: 0x0000
|
||||||
|
HDFT_ISNUMBER :: 0x0001
|
||||||
|
HDFT_HASNOVALUE :: 0x8000
|
||||||
|
|
||||||
|
HDI_WIDTH :: 0x001
|
||||||
|
HDI_HEIGHT :: HDI_WIDTH
|
||||||
|
HDI_TEXT :: 0x002
|
||||||
|
HDI_FORMAT :: 0x004
|
||||||
|
HDI_LPARAM :: 0x008
|
||||||
|
HDI_BITMAP :: 0x010
|
||||||
|
HDI_IMAGE :: 0x020
|
||||||
|
HDI_DI_SETITEM :: 0x040
|
||||||
|
HDI_ORDER :: 0x080
|
||||||
|
HDI_FILTER :: 0x100
|
||||||
|
|
||||||
|
HDF_LEFT :: 0x0000000
|
||||||
|
HDF_RIGHT :: 0x0000001
|
||||||
|
HDF_CENTER :: 0x0000002
|
||||||
|
HDF_JUSTIFYMASK :: 0x0000003
|
||||||
|
HDF_RTLREADING :: 0x0000004
|
||||||
|
HDF_CHECKBOX :: 0x0000040
|
||||||
|
HDF_CHECKED :: 0x0000080
|
||||||
|
HDF_FIXEDWIDTH :: 0x0000100
|
||||||
|
HDF_SORTDOWN :: 0x0000200
|
||||||
|
HDF_SORTUP :: 0x0000400
|
||||||
|
HDF_IMAGE :: 0x0000800
|
||||||
|
HDF_BITMAP_ON_RIGHT :: 0x0001000
|
||||||
|
HDF_BITMAP :: 0x0002000
|
||||||
|
HDF_STRING :: 0x0004000
|
||||||
|
HDF_OWNERDRAW :: 0x0008000
|
||||||
|
HDF_SPLITBUTTON :: 0x1000000
|
||||||
|
|
||||||
|
HHT_NOWHERE :: 0x001
|
||||||
|
HHT_ONHEADER :: 0x002
|
||||||
|
HHT_ONDIVIDER :: 0x004
|
||||||
|
HHT_ONDIVOPEN :: 0x008
|
||||||
|
HHT_ONFILTER :: 0x010
|
||||||
|
HHT_ONFILTERBUTTON :: 0x020
|
||||||
|
HHT_ABOVE :: 0x100
|
||||||
|
HHT_BELOW :: 0x200
|
||||||
|
HHT_TORIGHT :: 0x400
|
||||||
|
HHT_TOLEFT :: 0x800
|
||||||
|
|
||||||
|
// Rebar Control Styles
|
||||||
|
RBS_TOOLTIPS :: 0x0100
|
||||||
|
RBS_VARHEIGHT :: 0x0200
|
||||||
|
RBS_BANDBORDERS :: 0x0400
|
||||||
|
RBS_FIXEDORDER :: 0x0800
|
||||||
|
RBS_REGISTERDROP :: 0x1000
|
||||||
|
RBS_AUTOSIZE :: 0x2000
|
||||||
|
RBS_VERTICALGRIPPER :: 0x4000
|
||||||
|
RBS_DBLCLKTOGGLE :: 0x8000
|
||||||
|
|
||||||
|
// Tooltip Control Styles
|
||||||
|
TTS_ALWAYSTIP :: 0x01
|
||||||
|
TTS_NOPREFIX :: 0x02
|
||||||
|
TTS_NOANIMATE :: 0x10
|
||||||
|
TTS_NOFADE :: 0x20
|
||||||
|
TTS_BALLOON :: 0x40
|
||||||
|
TTS_CLOSE :: 0x80
|
||||||
|
|
||||||
|
// Statusbar Control Styles
|
||||||
|
SBARS_SIZEGRIP :: 0x100
|
||||||
|
SBARS_TOOLTIPS :: 0x800
|
||||||
|
|
||||||
|
// Statusbar Control Constants
|
||||||
|
SBT_TOOLTIPS :: 0x800
|
||||||
|
|
||||||
|
// Up-Down Control Styles
|
||||||
|
UDS_WRAP :: 0x001
|
||||||
|
UDS_SETBUDDYINT :: 0x002
|
||||||
|
UDS_ALIGNRIGHT :: 0x004
|
||||||
|
UDS_ALIGNLEFT :: 0x008
|
||||||
|
UDS_AUTOBUDDY :: 0x010
|
||||||
|
UDS_ARROWKEYS :: 0x020
|
||||||
|
UDS_HORZ :: 0x040
|
||||||
|
UDS_NOTHOUSANDS :: 0x080
|
||||||
|
UDS_HOTTRACK :: 0x100
|
||||||
|
|
||||||
|
// Common Control Styles
|
||||||
|
CCS_TOP :: 0x01
|
||||||
|
CCS_NOMOVEY :: 0x02
|
||||||
|
CCS_BOTTOM :: 0x03
|
||||||
|
CCS_NORESIZE :: 0x04
|
||||||
|
CCS_NOPARENTALIGN :: 0x08
|
||||||
|
CCS_ADJUSTABLE :: 0x20
|
||||||
|
CCS_NODIVIDER :: 0x40
|
||||||
|
CCS_VERT :: 0x80
|
||||||
|
CCS_LEFT :: (CCS_VERT | CCS_TOP)
|
||||||
|
CCS_RIGHT :: (CCS_VERT | CCS_BOTTOM)
|
||||||
|
CCS_NOMOVEX :: (CCS_VERT | CCS_NOMOVEY)
|
||||||
|
|
||||||
|
// List-View Control Styles
|
||||||
|
LVS_ICON :: 0x0000
|
||||||
|
LVS_REPORT :: 0x0001
|
||||||
|
LVS_SMALLICON :: 0x0002
|
||||||
|
LVS_LIST :: 0x0003
|
||||||
|
LVS_TYPEMASK :: 0x0003
|
||||||
|
LVS_SINGLESEL :: 0x0004
|
||||||
|
LVS_SHOWSELALWAYS :: 0x0008
|
||||||
|
LVS_SORTASCENDING :: 0x0010
|
||||||
|
LVS_SORTDESCENDING :: 0x0020
|
||||||
|
LVS_SHAREIMAGELISTS :: 0x0040
|
||||||
|
LVS_NOLABELWRAP :: 0x0080
|
||||||
|
LVS_AUTOARRANGE :: 0x0100
|
||||||
|
LVS_EDITLABELS :: 0x0200
|
||||||
|
LVS_OWNERDATA :: 0x1000
|
||||||
|
LVS_NOSCROLL :: 0x2000
|
||||||
|
LVS_TYPESTYLEMASK :: 0xFC00
|
||||||
|
LVS_ALIGNTOP :: 0x0000
|
||||||
|
LVS_ALIGNLEFT :: 0x0800
|
||||||
|
LVS_ALIGNMASK :: 0x0C00
|
||||||
|
LVS_OWNERDRAWFIXED :: 0x0400
|
||||||
|
LVS_NOCOLUMNHEADER :: 0x4000
|
||||||
|
LVS_NOSORTHEADER :: 0x8000
|
||||||
|
|
||||||
|
// Tree-View Control Styles
|
||||||
|
TVS_HASBUTTONS :: 0x0001
|
||||||
|
TVS_HASLINES :: 0x0002
|
||||||
|
TVS_LINESATROOT :: 0x0004
|
||||||
|
TVS_EDITLABELS :: 0x0008
|
||||||
|
TVS_DISABLEDRAGDROP :: 0x0010
|
||||||
|
TVS_SHOWSELALWAYS :: 0x0020
|
||||||
|
TVS_RTLREADING :: 0x0040
|
||||||
|
TVS_NOTOOLTIPS :: 0x0080
|
||||||
|
TVS_CHECKBOXES :: 0x0100
|
||||||
|
TVS_TRACKSELECT :: 0x0200
|
||||||
|
TVS_SINGLEEXPAND :: 0x0400
|
||||||
|
TVS_INFOTIP :: 0x0800
|
||||||
|
TVS_FULLROWSELECT :: 0x1000
|
||||||
|
TVS_NOSCROLL :: 0x2000
|
||||||
|
TVS_NONEVENHEIGHT :: 0x4000
|
||||||
|
TVS_NOHSCROLL :: 0x8000
|
||||||
|
|
||||||
|
// Tree-View Control Constants
|
||||||
|
TVE_COLLAPSE :: 0x0001
|
||||||
|
TVE_EXPAND :: 0x0002
|
||||||
|
TVE_TOGGLE :: 0x0003
|
||||||
|
TVE_EXPANDPARTIAL :: 0x4000
|
||||||
|
TVE_COLLAPSERESET :: 0x8000
|
||||||
|
|
||||||
|
TVSIL_NORMAL :: 0
|
||||||
|
TVSIL_STATE :: 2
|
||||||
|
|
||||||
|
TVGN_ROOT :: 0x0
|
||||||
|
TVGN_NEXT :: 0x1
|
||||||
|
TVGN_PREVIOUS :: 0x2
|
||||||
|
TVGN_PARENT :: 0x3
|
||||||
|
TVGN_CHILD :: 0x4
|
||||||
|
TVGN_FIRSTVISIBLE :: 0x5
|
||||||
|
TVGN_NEXTVISIBLE :: 0x6
|
||||||
|
TVGN_PREVIOUSVISIBLE :: 0x7
|
||||||
|
TVGN_DROPHILITE :: 0x8
|
||||||
|
TVGN_CARET :: 0x9
|
||||||
|
TVGN_LASTVISIBLE :: 0xA
|
||||||
|
|
||||||
|
TVSI_NOSINGLEEXPAND :: 0x8000
|
||||||
|
|
||||||
|
TVHT_NOWHERE :: 0x001
|
||||||
|
TVHT_ONITEMICON :: 0x002
|
||||||
|
TVHT_ONITEMLABEL :: 0x004
|
||||||
|
TVHT_ONITEM :: (TVHT_ONITEMICON | TVHT_ONITEMLABEL | TVHT_ONITEMSTATEICON)
|
||||||
|
TVHT_ONITEMINDENT :: 0x008
|
||||||
|
TVHT_ONITEMBUTTON :: 0x010
|
||||||
|
TVHT_ONITEMRIGHT :: 0x020
|
||||||
|
TVHT_ONITEMSTATEICON :: 0x040
|
||||||
|
TVHT_ABOVE :: 0x100
|
||||||
|
TVHT_BELOW :: 0x200
|
||||||
|
TVHT_TORIGHT :: 0x400
|
||||||
|
TVHT_TOLEFT :: 0x800
|
||||||
|
|
||||||
|
// Tab Control Styles
|
||||||
|
TCS_SCROLLOPPOSITE :: 0x0001
|
||||||
|
TCS_BOTTOM :: 0x0002
|
||||||
|
TCS_RIGHT :: 0x0002
|
||||||
|
TCS_MULTISELECT :: 0x0004
|
||||||
|
TCS_FLATBUTTONS :: 0x0008
|
||||||
|
TCS_FORCEICONLEFT :: 0x0010
|
||||||
|
TCS_FORCELABELLEFT :: 0x0020
|
||||||
|
TCS_HOTTRACK :: 0x0040
|
||||||
|
TCS_VERTICAL :: 0x0080
|
||||||
|
TCS_TABS :: 0x0000
|
||||||
|
TCS_BUTTONS :: 0x0100
|
||||||
|
TCS_SINGLELINE :: 0x0000
|
||||||
|
TCS_MULTILINE :: 0x0200
|
||||||
|
TCS_RIGHTJUSTIFY :: 0x0000
|
||||||
|
TCS_FIXEDWIDTH :: 0x0400
|
||||||
|
TCS_RAGGEDRIGHT :: 0x0800
|
||||||
|
TCS_FOCUSONBUTTONDOWN :: 0x1000
|
||||||
|
TCS_OWNERDRAWFIXED :: 0x2000
|
||||||
|
TCS_TOOLTIPS :: 0x4000
|
||||||
|
TCS_FOCUSNEVER :: 0x8000
|
||||||
|
|
||||||
|
// Tab Control Constants
|
||||||
|
TCIF_TEXT :: 0x01
|
||||||
|
TCIF_IMAGE :: 0x02
|
||||||
|
TCIF_RTLREADING :: 0x04
|
||||||
|
TCIF_PARAM :: 0x08
|
||||||
|
TCIF_STATE :: 0x10
|
||||||
|
|
||||||
|
TCIS_BUTTONPRESSED :: 0x1
|
||||||
|
TCIS_HIGHLIGHTED :: 0x2
|
||||||
|
|
||||||
|
TCHT_NOWHERE :: 0x1
|
||||||
|
TCHT_ONITEMICON :: 0x2
|
||||||
|
TCHT_ONITEMLABEL :: 0x4
|
||||||
|
TCHT_ONITEM :: (TCHT_ONITEMICON | TCHT_ONITEMLABEL)
|
||||||
|
|
||||||
|
// Animation Control Styles
|
||||||
|
ACS_CENTER :: 0x1
|
||||||
|
ACS_TRANSPARENT :: 0x2
|
||||||
|
ACS_AUTOPLAY :: 0x4
|
||||||
|
ACS_TIMER :: 0x8
|
||||||
|
|
||||||
|
// Month-Calendar Control Styles
|
||||||
|
MCS_DAYSTATE :: 0x01
|
||||||
|
MCS_MULTISELECT :: 0x02
|
||||||
|
MCS_WEEKNUMBERS :: 0x04
|
||||||
|
MCS_NOTODAYCIRCLE :: 0x08
|
||||||
|
MCS_NOTODAY :: 0x10
|
||||||
|
|
||||||
|
// Date-and-Time Picker Control Styles
|
||||||
|
DTS_UPDOWN :: 0x01
|
||||||
|
DTS_SHOWNONE :: 0x02
|
||||||
|
DTS_SHORTDATEFORMAT :: 0x00
|
||||||
|
DTS_LONGDATEFORMAT :: 0x04
|
||||||
|
DTS_SHORTDATECENTURYFORMAT :: 0x0C
|
||||||
|
DTS_TIMEFORMAT :: 0x09
|
||||||
|
DTS_APPCANPARSE :: 0x10
|
||||||
|
DTS_RIGHTALIGN :: 0x20
|
||||||
|
|
||||||
|
// Pager Control Styles
|
||||||
|
PGS_VERT :: 0x0
|
||||||
|
PGS_HORZ :: 0x1
|
||||||
|
PGS_AUTOSCROLL :: 0x2
|
||||||
|
PGS_DRAGNDROP :: 0x4
|
||||||
|
|
||||||
|
// Native Font Control Styles
|
||||||
|
NFS_EDIT :: 0x01
|
||||||
|
NFS_STATIC :: 0x02
|
||||||
|
NFS_LISTCOMBO :: 0x04
|
||||||
|
NFS_BUTTON :: 0x08
|
||||||
|
NFS_ALL :: 0x10
|
||||||
|
NFS_USEFONTASSOC :: 0x20
|
||||||
|
|
||||||
// Font Weights
|
// Font Weights
|
||||||
FW_DONTCARE :: 0
|
FW_DONTCARE :: 0
|
||||||
FW_THIN :: 100
|
FW_THIN :: 100
|
||||||
@@ -1206,6 +1659,16 @@ NMHDR :: struct {
|
|||||||
code: UINT, // NM_ code
|
code: UINT, // NM_ code
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NMCUSTOMDRAW :: struct {
|
||||||
|
hdr: NMHDR,
|
||||||
|
dwDrawStage: DWORD,
|
||||||
|
hdc: HDC,
|
||||||
|
rc: RECT,
|
||||||
|
dwItemSpec: DWORD_PTR,
|
||||||
|
uItemState: UINT,
|
||||||
|
lItemlParam: LPARAM,
|
||||||
|
}
|
||||||
|
|
||||||
NCCALCSIZE_PARAMS :: struct {
|
NCCALCSIZE_PARAMS :: struct {
|
||||||
rgrc: [3]RECT,
|
rgrc: [3]RECT,
|
||||||
lppos: PWINDOWPOS,
|
lppos: PWINDOWPOS,
|
||||||
@@ -2204,7 +2667,24 @@ DUPLICATE_SAME_ACCESS: DWORD : 0x00000002
|
|||||||
CONDITION_VARIABLE_INIT :: CONDITION_VARIABLE{}
|
CONDITION_VARIABLE_INIT :: CONDITION_VARIABLE{}
|
||||||
SRWLOCK_INIT :: SRWLOCK{}
|
SRWLOCK_INIT :: SRWLOCK{}
|
||||||
|
|
||||||
|
// Flags in STARTUPINFOW.dwFlags.
|
||||||
|
STARTF_USESHOWWINDOW: DWORD : 0x00000001
|
||||||
|
STARTF_USESIZE: DWORD : 0x00000002
|
||||||
|
STARTF_USEPOSITION: DWORD : 0x00000004
|
||||||
|
STARTF_USECOUNTCHARS: DWORD : 0x00000008
|
||||||
|
STARTF_USEFILLATTRIBUTE: DWORD : 0x00000010
|
||||||
|
STARTF_RUNFULLSCREEN: DWORD : 0x00000020 // ignored for non-x86 platforms
|
||||||
|
STARTF_FORCEONFEEDBACK: DWORD : 0x00000040
|
||||||
|
STARTF_FORCEOFFFEEDBACK: DWORD : 0x00000080
|
||||||
STARTF_USESTDHANDLES: DWORD : 0x00000100
|
STARTF_USESTDHANDLES: DWORD : 0x00000100
|
||||||
|
// WINVER >= 0x400
|
||||||
|
STARTF_USEHOTKEY: DWORD : 0x00000200
|
||||||
|
STARTF_TITLEISLINKNAME: DWORD : 0x00000800
|
||||||
|
STARTF_TITLEISAPPID: DWORD : 0x00001000
|
||||||
|
STARTF_PREVENTPINNING: DWORD : 0x00002000
|
||||||
|
// WINVER >= 0x600
|
||||||
|
STARTF_UNTRUSTEDSOURCE: DWORD : 0x00008000
|
||||||
|
|
||||||
|
|
||||||
VOLUME_NAME_DOS: DWORD : 0x0
|
VOLUME_NAME_DOS: DWORD : 0x0
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ foreign user32 {
|
|||||||
UpdateWindow :: proc(hWnd: HWND) -> BOOL ---
|
UpdateWindow :: proc(hWnd: HWND) -> BOOL ---
|
||||||
SetActiveWindow :: proc(hWnd: HWND) -> HWND ---
|
SetActiveWindow :: proc(hWnd: HWND) -> HWND ---
|
||||||
GetActiveWindow :: proc() -> HWND ---
|
GetActiveWindow :: proc() -> HWND ---
|
||||||
|
SetFocus :: proc(hWnd: HWND) -> HWND ---
|
||||||
|
GetFocus :: proc() -> HWND ---
|
||||||
RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL ---
|
RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL ---
|
||||||
SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND ---
|
SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND ---
|
||||||
SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL ---
|
SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL ---
|
||||||
@@ -211,6 +213,7 @@ foreign user32 {
|
|||||||
EnumDisplayMonitors :: proc(hdc: HDC, lprcClip: LPRECT, lpfnEnum: Monitor_Enum_Proc, dwData: LPARAM) -> BOOL ---
|
EnumDisplayMonitors :: proc(hdc: HDC, lprcClip: LPRECT, lpfnEnum: Monitor_Enum_Proc, dwData: LPARAM) -> BOOL ---
|
||||||
|
|
||||||
EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL ---
|
EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL ---
|
||||||
|
EnumChildWindows :: proc(hWndParent: HWND, lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL ---
|
||||||
|
|
||||||
IsProcessDPIAware :: proc() -> BOOL ---
|
IsProcessDPIAware :: proc() -> BOOL ---
|
||||||
SetProcessDPIAware :: proc() -> BOOL ---
|
SetProcessDPIAware :: proc() -> BOOL ---
|
||||||
@@ -846,3 +849,23 @@ FKF_CONFIRMHOTKEY :: 0x8
|
|||||||
FKF_HOTKEYSOUND :: 0x10
|
FKF_HOTKEYSOUND :: 0x10
|
||||||
FKF_INDICATOR :: 0x20
|
FKF_INDICATOR :: 0x20
|
||||||
FKF_CLICKON :: 0x40
|
FKF_CLICKON :: 0x40
|
||||||
|
|
||||||
|
NONCLIENTMETRICSW :: struct {
|
||||||
|
cbSize: UINT,
|
||||||
|
iBorderWidth: i32,
|
||||||
|
iScrollWidth: i32,
|
||||||
|
iScrollHeight: i32,
|
||||||
|
iCaptionWidth: i32,
|
||||||
|
iCaptionHeight: i32,
|
||||||
|
lfCaptionFont: LOGFONTW,
|
||||||
|
iSmCaptionWidth: i32,
|
||||||
|
iSmCaptionHeight: i32,
|
||||||
|
lfSmCaptionFont: LOGFONTW,
|
||||||
|
iMenuWidth: i32,
|
||||||
|
iMenuHeight: i32,
|
||||||
|
lfMenuFont: LOGFONTW,
|
||||||
|
lfStatusFont: LOGFONTW,
|
||||||
|
lfMessageFont: LOGFONTW,
|
||||||
|
iPaddedBorderWidth: i32,
|
||||||
|
}
|
||||||
|
LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW
|
||||||
|
|||||||
@@ -9,4 +9,5 @@ PMARGINS :: ^MARGINS
|
|||||||
@(default_calling_convention="system")
|
@(default_calling_convention="system")
|
||||||
foreign uxtheme {
|
foreign uxtheme {
|
||||||
IsThemeActive :: proc() -> BOOL ---
|
IsThemeActive :: proc() -> BOOL ---
|
||||||
|
SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT ---
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -687,10 +687,14 @@ EM_GETAUTOURLDETECT :: 0x045c
|
|||||||
TB_GETSTRINGA :: 0x045c
|
TB_GETSTRINGA :: 0x045c
|
||||||
EM_SETPALETTE :: 0x045d
|
EM_SETPALETTE :: 0x045d
|
||||||
EM_GETTEXTEX :: 0x045e
|
EM_GETTEXTEX :: 0x045e
|
||||||
|
TB_SETHOTITEM2 :: 0x045e
|
||||||
EM_GETTEXTLENGTHEX :: 0x045f
|
EM_GETTEXTLENGTHEX :: 0x045f
|
||||||
EM_SHOWSCROLLBAR :: 0x0460
|
EM_SHOWSCROLLBAR :: 0x0460
|
||||||
|
TB_SETLISTGAP :: 0x0460
|
||||||
EM_SETTEXTEX :: 0x0461
|
EM_SETTEXTEX :: 0x0461
|
||||||
|
TB_GETIMAGELISTCOUNT :: 0x0462
|
||||||
TAPI_REPLY :: 0x0463
|
TAPI_REPLY :: 0x0463
|
||||||
|
TB_GETIDEALSIZE :: 0x0463
|
||||||
ACM_OPENA :: 0x0464
|
ACM_OPENA :: 0x0464
|
||||||
BFFM_SETSTATUSTEXTA :: 0x0464
|
BFFM_SETSTATUSTEXTA :: 0x0464
|
||||||
CDM_FIRST :: 0x0464
|
CDM_FIRST :: 0x0464
|
||||||
@@ -704,6 +708,7 @@ CDM_GETFILEPATH :: 0x0465
|
|||||||
EM_GETPUNCTUATION :: 0x0465
|
EM_GETPUNCTUATION :: 0x0465
|
||||||
IPM_SETADDRESS :: 0x0465
|
IPM_SETADDRESS :: 0x0465
|
||||||
PSM_SETCURSEL :: 0x0465
|
PSM_SETCURSEL :: 0x0465
|
||||||
|
TB_GETMETRICS :: 0x0465
|
||||||
UDM_SETRANGE :: 0x0465
|
UDM_SETRANGE :: 0x0465
|
||||||
WM_CHOOSEFONT_SETLOGFONT :: 0x0465
|
WM_CHOOSEFONT_SETLOGFONT :: 0x0465
|
||||||
ACM_STOP :: 0x0466
|
ACM_STOP :: 0x0466
|
||||||
@@ -712,6 +717,7 @@ CDM_GETFOLDERPATH :: 0x0466
|
|||||||
EM_SETWORDWRAPMODE :: 0x0466
|
EM_SETWORDWRAPMODE :: 0x0466
|
||||||
IPM_GETADDRESS :: 0x0466
|
IPM_GETADDRESS :: 0x0466
|
||||||
PSM_REMOVEPAGE :: 0x0466
|
PSM_REMOVEPAGE :: 0x0466
|
||||||
|
TB_SETMETRICS :: 0x0466
|
||||||
UDM_GETRANGE :: 0x0466
|
UDM_GETRANGE :: 0x0466
|
||||||
WM_CAP_SET_CALLBACK_ERRORW :: 0x0466
|
WM_CAP_SET_CALLBACK_ERRORW :: 0x0466
|
||||||
WM_CHOOSEFONT_SETFLAGS :: 0x0466
|
WM_CHOOSEFONT_SETFLAGS :: 0x0466
|
||||||
@@ -721,6 +727,7 @@ CDM_GETFOLDERIDLIST :: 0x0467
|
|||||||
EM_GETWORDWRAPMODE :: 0x0467
|
EM_GETWORDWRAPMODE :: 0x0467
|
||||||
IPM_SETRANGE :: 0x0467
|
IPM_SETRANGE :: 0x0467
|
||||||
PSM_ADDPAGE :: 0x0467
|
PSM_ADDPAGE :: 0x0467
|
||||||
|
TB_GETITEMDROPDOWNRECT :: 0x0467
|
||||||
UDM_SETPOS :: 0x0467
|
UDM_SETPOS :: 0x0467
|
||||||
WM_CAP_SET_CALLBACK_STATUSW :: 0x0467
|
WM_CAP_SET_CALLBACK_STATUSW :: 0x0467
|
||||||
BFFM_SETSTATUSTEXTW :: 0x0468
|
BFFM_SETSTATUSTEXTW :: 0x0468
|
||||||
@@ -728,11 +735,13 @@ CDM_SETCONTROLTEXT :: 0x0468
|
|||||||
EM_SETIMECOLOR :: 0x0468
|
EM_SETIMECOLOR :: 0x0468
|
||||||
IPM_SETFOCUS :: 0x0468
|
IPM_SETFOCUS :: 0x0468
|
||||||
PSM_CHANGED :: 0x0468
|
PSM_CHANGED :: 0x0468
|
||||||
|
TB_SETPRESSEDIMAGELIST :: 0x0468
|
||||||
UDM_GETPOS :: 0x0468
|
UDM_GETPOS :: 0x0468
|
||||||
CDM_HIDECONTROL :: 0x0469
|
CDM_HIDECONTROL :: 0x0469
|
||||||
EM_GETIMECOLOR :: 0x0469
|
EM_GETIMECOLOR :: 0x0469
|
||||||
IPM_ISBLANK :: 0x0469
|
IPM_ISBLANK :: 0x0469
|
||||||
PSM_RESTARTWINDOWS :: 0x0469
|
PSM_RESTARTWINDOWS :: 0x0469
|
||||||
|
TB_GETPRESSEDIMAGELIST :: 0x0469
|
||||||
UDM_SETBUDDY :: 0x0469
|
UDM_SETBUDDY :: 0x0469
|
||||||
CDM_SETDEFEXT :: 0x046a
|
CDM_SETDEFEXT :: 0x046a
|
||||||
EM_SETIMEOPTIONS :: 0x046a
|
EM_SETIMEOPTIONS :: 0x046a
|
||||||
@@ -915,6 +924,10 @@ FM_GETDRIVEINFOW :: 0x0611
|
|||||||
FM_GETFILESELW :: 0x0614
|
FM_GETFILESELW :: 0x0614
|
||||||
FM_GETFILESELLFNW :: 0x0615
|
FM_GETFILESELLFNW :: 0x0615
|
||||||
WLX_WM_SAS :: 0x0659
|
WLX_WM_SAS :: 0x0659
|
||||||
|
LM_HITTEST :: 0x0700
|
||||||
|
LM_GETIDEALHEIGHT :: 0x0701
|
||||||
|
LM_SETITEM :: 0x0702
|
||||||
|
LM_GETITEM :: 0x0703
|
||||||
SM_GETSELCOUNT :: 0x07e8
|
SM_GETSELCOUNT :: 0x07e8
|
||||||
UM_GETSELCOUNT :: 0x07e8
|
UM_GETSELCOUNT :: 0x07e8
|
||||||
WM_CPL_LAUNCH :: 0x07e8
|
WM_CPL_LAUNCH :: 0x07e8
|
||||||
@@ -1011,6 +1024,7 @@ LVM_GETITEMW :: 0x104b
|
|||||||
LVM_SETITEMW :: 0x104c
|
LVM_SETITEMW :: 0x104c
|
||||||
LVM_INSERTITEMW :: 0x104d
|
LVM_INSERTITEMW :: 0x104d
|
||||||
LVM_GETTOOLTIPS :: 0x104e
|
LVM_GETTOOLTIPS :: 0x104e
|
||||||
|
LVM_SORTITEMSEX :: 0x1051
|
||||||
LVM_FINDITEMW :: 0x1053
|
LVM_FINDITEMW :: 0x1053
|
||||||
LVM_GETSTRINGWIDTHW :: 0x1057
|
LVM_GETSTRINGWIDTHW :: 0x1057
|
||||||
LVM_GETCOLUMNW :: 0x105f
|
LVM_GETCOLUMNW :: 0x105f
|
||||||
@@ -1065,7 +1079,143 @@ LVM_GETFOOTERITEM :: 0x10d0
|
|||||||
LVM_GETITEMINDEXRECT :: 0x10d1
|
LVM_GETITEMINDEXRECT :: 0x10d1
|
||||||
LVM_SETITEMINDEXSTATE :: 0x10d2
|
LVM_SETITEMINDEXSTATE :: 0x10d2
|
||||||
LVM_GETNEXTITEMINDEX :: 0x10d3
|
LVM_GETNEXTITEMINDEX :: 0x10d3
|
||||||
|
TV_FIRST :: 0x1100
|
||||||
|
TVM_INSERTITEMA :: (TV_FIRST+0)
|
||||||
|
TVM_DELETEITEM :: (TV_FIRST+1)
|
||||||
|
TVM_EXPAND :: (TV_FIRST+2)
|
||||||
|
TVM_GETITEMRECT :: (TV_FIRST+4)
|
||||||
|
TVM_GETCOUNT :: (TV_FIRST+5)
|
||||||
|
TVM_GETINDENT :: (TV_FIRST+6)
|
||||||
|
TVM_SETINDENT :: (TV_FIRST+7)
|
||||||
|
TVM_GETIMAGELIST :: (TV_FIRST+8)
|
||||||
|
TVM_SETIMAGELIST :: (TV_FIRST+9)
|
||||||
|
TVM_GETNEXTITEM :: (TV_FIRST+10)
|
||||||
|
TVM_SELECTITEM :: (TV_FIRST+11)
|
||||||
|
TVM_GETITEMA :: (TV_FIRST+12)
|
||||||
|
TVM_SETITEMA :: (TV_FIRST+13)
|
||||||
|
TVM_EDITLABELA :: (TV_FIRST+14)
|
||||||
|
TVM_GETEDITCONTROL :: (TV_FIRST+15)
|
||||||
|
TVM_GETVISIBLECOUNT :: (TV_FIRST+16)
|
||||||
|
TVM_HITTEST :: (TV_FIRST+17)
|
||||||
|
TVM_CREATEDRAGIMAGE :: (TV_FIRST+18)
|
||||||
|
TVM_SORTCHILDREN :: (TV_FIRST+19)
|
||||||
|
TVM_ENSUREVISIBLE :: (TV_FIRST+20)
|
||||||
|
TVM_SORTCHILDRENCB :: (TV_FIRST+21)
|
||||||
|
TVM_ENDEDITLABELNOW :: (TV_FIRST+22)
|
||||||
|
TVM_GETISEARCHSTRINGA :: (TV_FIRST+23)
|
||||||
|
TVM_SETTOOLTIPS :: (TV_FIRST+24)
|
||||||
|
TVM_GETTOOLTIPS :: (TV_FIRST+25)
|
||||||
|
TVM_SETINSERTMARK :: (TV_FIRST+26)
|
||||||
|
TVM_SETUNICODEFORMAT :: CCM_SETUNICODEFORMAT
|
||||||
|
TVM_GETUNICODEFORMAT :: CCM_GETUNICODEFORMAT
|
||||||
|
TVM_SETITEMHEIGHT :: (TV_FIRST+27)
|
||||||
|
TVM_GETITEMHEIGHT :: (TV_FIRST+28)
|
||||||
|
TVM_SETBKCOLOR :: (TV_FIRST+29)
|
||||||
|
TVM_SETTEXTCOLOR :: (TV_FIRST+30)
|
||||||
|
TVM_GETBKCOLOR :: (TV_FIRST+31)
|
||||||
|
TVM_GETTEXTCOLOR :: (TV_FIRST+32)
|
||||||
|
TVM_SETSCROLLTIME :: (TV_FIRST+33)
|
||||||
|
TVM_GETSCROLLTIME :: (TV_FIRST+34)
|
||||||
|
TVM_SETINSERTMARKCOLOR :: (TV_FIRST+37)
|
||||||
|
TVM_GETINSERTMARKCOLOR :: (TV_FIRST+38)
|
||||||
|
TVM_GETITEMSTATE :: (TV_FIRST+39)
|
||||||
|
TVM_SETLINECOLOR :: (TV_FIRST+40)
|
||||||
|
TVM_GETLINECOLOR :: (TV_FIRST+41)
|
||||||
|
TVM_MAPACCIDTOHTREEITEM :: (TV_FIRST+42)
|
||||||
|
TVM_MAPHTREEITEMTOACCID :: (TV_FIRST+43)
|
||||||
|
TVM_INSERTITEMW :: (TV_FIRST+50)
|
||||||
|
TVM_GETITEMW :: (TV_FIRST+62)
|
||||||
|
TVM_SETITEMW :: (TV_FIRST+63)
|
||||||
|
TVM_GETISEARCHSTRINGW :: (TV_FIRST+64)
|
||||||
|
TVM_EDITLABELW :: (TV_FIRST+65)
|
||||||
|
HDM_FIRST :: 0x1200
|
||||||
|
HDM_GETITEMCOUNT :: (HDM_FIRST+0)
|
||||||
|
HDM_INSERTITEMA :: (HDM_FIRST+1)
|
||||||
|
HDM_DELETEITEM :: (HDM_FIRST+2)
|
||||||
|
HDM_GETITEMA :: (HDM_FIRST+3)
|
||||||
|
HDM_SETITEMA :: (HDM_FIRST+4)
|
||||||
|
HDM_LAYOUT :: (HDM_FIRST+5)
|
||||||
|
HDM_HITTEST :: (HDM_FIRST+6)
|
||||||
|
HDM_GETITEMRECT :: (HDM_FIRST+7)
|
||||||
|
HDM_SETIMAGELIST :: (HDM_FIRST+8)
|
||||||
|
HDM_GETIMAGELIST :: (HDM_FIRST+9)
|
||||||
|
HDM_INSERTITEMW :: (HDM_FIRST+10)
|
||||||
|
HDM_GETITEMW :: (HDM_FIRST+11)
|
||||||
|
HDM_SETITEMW :: (HDM_FIRST+12)
|
||||||
|
HDM_ORDERTOINDEX :: (HDM_FIRST+15)
|
||||||
|
HDM_CREATEDRAGIMAGE :: (HDM_FIRST+16)
|
||||||
|
HDM_GETORDERARRAY :: (HDM_FIRST+17)
|
||||||
|
HDM_SETORDERARRAY :: (HDM_FIRST+18)
|
||||||
|
HDM_SETHOTDIVIDER :: (HDM_FIRST+19)
|
||||||
|
HDM_SETBITMAPMARGIN :: (HDM_FIRST+20)
|
||||||
|
HDM_GETBITMAPMARGIN :: (HDM_FIRST+21)
|
||||||
|
HDM_SETFILTERCHANGETIMEOUT :: (HDM_FIRST+22)
|
||||||
|
HDM_SETUNICODEFORMAT :: CCM_SETUNICODEFORMAT
|
||||||
|
HDM_GETUNICODEFORMAT :: CCM_GETUNICODEFORMAT
|
||||||
|
HDM_EDITFILTER :: (HDM_FIRST+23)
|
||||||
|
HDM_CLEARFILTER :: (HDM_FIRST+24)
|
||||||
|
TCM_FIRST :: 0x1300
|
||||||
|
TCM_GETIMAGELIST :: (TCM_FIRST+2)
|
||||||
|
TCM_SETIMAGELIST :: (TCM_FIRST+3)
|
||||||
|
TCM_GETITEMCOUNT :: (TCM_FIRST+4)
|
||||||
|
TCM_GETITEMA :: (TCM_FIRST+5)
|
||||||
|
TCM_SETITEMA :: (TCM_FIRST+6)
|
||||||
|
TCM_INSERTITEMA :: (TCM_FIRST+7)
|
||||||
|
TCM_DELETEITEM :: (TCM_FIRST+8)
|
||||||
|
TCM_DELETEALLITEMS :: (TCM_FIRST+9)
|
||||||
|
TCM_GETITEMRECT :: (TCM_FIRST+10)
|
||||||
|
TCM_GETCURSEL :: (TCM_FIRST+11)
|
||||||
|
TCM_SETCURSEL :: (TCM_FIRST+12)
|
||||||
|
TCM_HITTEST :: (TCM_FIRST+13)
|
||||||
|
TCM_SETITEMEXTRA :: (TCM_FIRST+14)
|
||||||
|
TCM_ADJUSTRECT :: (TCM_FIRST+40)
|
||||||
|
TCM_SETITEMSIZE :: (TCM_FIRST+41)
|
||||||
|
TCM_REMOVEIMAGE :: (TCM_FIRST+42)
|
||||||
|
TCM_SETPADDING :: (TCM_FIRST+43)
|
||||||
|
TCM_GETROWCOUNT :: (TCM_FIRST+44)
|
||||||
|
TCM_GETTOOLTIPS :: (TCM_FIRST+45)
|
||||||
|
TCM_SETTOOLTIPS :: (TCM_FIRST+46)
|
||||||
|
TCM_GETCURFOCUS :: (TCM_FIRST+47)
|
||||||
|
TCM_SETCURFOCUS :: (TCM_FIRST+48)
|
||||||
|
TCM_SETMINTABWIDTH :: (TCM_FIRST+49)
|
||||||
|
TCM_DESELECTALL :: (TCM_FIRST+50)
|
||||||
|
TCM_HIGHLIGHTITEM :: (TCM_FIRST+51)
|
||||||
|
TCM_SETEXTENDEDSTYLE :: (TCM_FIRST+52)
|
||||||
|
TCM_GETEXTENDEDSTYLE :: (TCM_FIRST+53)
|
||||||
|
TCM_SETUNICODEFORMAT :: CCM_SETUNICODEFORMAT
|
||||||
|
TCM_GETUNICODEFORMAT :: CCM_GETUNICODEFORMAT
|
||||||
|
TCM_GETITEMW :: (TCM_FIRST+60)
|
||||||
|
TCM_SETITEMW :: (TCM_FIRST+61)
|
||||||
|
TCM_INSERTITEMW :: (TCM_FIRST+62)
|
||||||
|
PGM_FIRST :: 0x1400
|
||||||
|
PGM_SETCHILD :: (PGM_FIRST+1)
|
||||||
|
PGM_RECALCSIZE :: (PGM_FIRST+2)
|
||||||
|
PGM_FORWARDMOUSE :: (PGM_FIRST+3)
|
||||||
|
PGM_SETBKCOLOR :: (PGM_FIRST+4)
|
||||||
|
PGM_GETBKCOLOR :: (PGM_FIRST+5)
|
||||||
|
PGM_SETBORDER :: (PGM_FIRST+6)
|
||||||
|
PGM_GETBORDER :: (PGM_FIRST+7)
|
||||||
|
PGM_SETPOS :: (PGM_FIRST+8)
|
||||||
|
PGM_GETPOS :: (PGM_FIRST+9)
|
||||||
|
PGM_SETBUTTONSIZE :: (PGM_FIRST+10)
|
||||||
|
PGM_GETBUTTONSIZE :: (PGM_FIRST+11)
|
||||||
|
PGM_GETBUTTONSTATE :: (PGM_FIRST+12)
|
||||||
|
PGM_GETDROPTARGET :: CCM_GETDROPTARGET
|
||||||
|
ECM_FIRST :: 0x1500
|
||||||
|
EM_SETCUEBANNER :: ECM_FIRST + 0x0001
|
||||||
|
EM_GETCUEBANNER :: ECM_FIRST + 0x0002
|
||||||
|
EM_SHOWBALLOONTIP :: ECM_FIRST + 0x0003
|
||||||
|
EM_HIDEBALLOONTIP :: ECM_FIRST + 0x0004
|
||||||
|
EM_SETHILITE :: ECM_FIRST + 0x0005
|
||||||
|
EM_GETHILITE :: ECM_FIRST + 0x0006
|
||||||
|
EM_NOSETFOCUS :: ECM_FIRST + 0x0007
|
||||||
|
EM_TAKEFOCUS :: ECM_FIRST + 0x0008
|
||||||
BCM_FIRST :: 0x1600
|
BCM_FIRST :: 0x1600
|
||||||
|
BCM_GETIDEALSIZE :: BCM_FIRST + 0x0001
|
||||||
|
BCM_SETIMAGELIST :: BCM_FIRST + 0x0002
|
||||||
|
BCM_GETIMAGELIST :: BCM_FIRST + 0x0003
|
||||||
|
BCM_SETTEXTMARGIN :: BCM_FIRST + 0x0004
|
||||||
|
BCM_GETTEXTMARGIN :: BCM_FIRST + 0x0005
|
||||||
BCM_SETDROPDOWNSTATE :: BCM_FIRST + 0x0006
|
BCM_SETDROPDOWNSTATE :: BCM_FIRST + 0x0006
|
||||||
BCM_SETSPLITINFO :: BCM_FIRST + 0x0007
|
BCM_SETSPLITINFO :: BCM_FIRST + 0x0007
|
||||||
BCM_GETSPLITINFO :: BCM_FIRST + 0x0008
|
BCM_GETSPLITINFO :: BCM_FIRST + 0x0008
|
||||||
@@ -1073,9 +1223,29 @@ BCM_SETNOTE :: BCM_FIRST + 0x0009
|
|||||||
BCM_GETNOTE :: BCM_FIRST + 0x000A
|
BCM_GETNOTE :: BCM_FIRST + 0x000A
|
||||||
BCM_GETNOTELENGTH :: BCM_FIRST + 0x000B
|
BCM_GETNOTELENGTH :: BCM_FIRST + 0x000B
|
||||||
BCM_SETSHIELD :: BCM_FIRST + 0x000C
|
BCM_SETSHIELD :: BCM_FIRST + 0x000C
|
||||||
|
CBM_FIRST :: 0x1700
|
||||||
|
CB_SETMINVISIBLE :: CBM_FIRST + 0x0001
|
||||||
|
CB_GETMINVISIBLE :: CBM_FIRST + 0x0002
|
||||||
|
CCM_FIRST :: 0x2000
|
||||||
|
CCM_LAST :: (CCM_FIRST+0x200)
|
||||||
|
CCM_SETBKCOLOR :: (CCM_FIRST+1)
|
||||||
|
CCM_SETCOLORSCHEME :: (CCM_FIRST+2)
|
||||||
|
CCM_GETCOLORSCHEME :: (CCM_FIRST+3)
|
||||||
|
CCM_GETDROPTARGET :: (CCM_FIRST+4)
|
||||||
|
CCM_SETUNICODEFORMAT :: (CCM_FIRST+5)
|
||||||
|
CCM_GETUNICODEFORMAT :: (CCM_FIRST+6)
|
||||||
|
CCM_SETVERSION :: (CCM_FIRST+7)
|
||||||
|
CCM_GETVERSION :: (CCM_FIRST+8)
|
||||||
|
CCM_SETNOTIFYWINDOW :: (CCM_FIRST+9)
|
||||||
|
CCM_SETWINDOWTHEME :: (CCM_FIRST+11)
|
||||||
|
CCM_DPISCALE :: (CCM_FIRST+12)
|
||||||
OCM__BASE :: 0x2000
|
OCM__BASE :: 0x2000
|
||||||
LVM_SETUNICODEFORMAT :: 0x2005
|
LVM_SETUNICODEFORMAT :: 0x2005
|
||||||
|
SB_SETUNICODEFORMAT :: 0x2005
|
||||||
LVM_GETUNICODEFORMAT :: 0x2006
|
LVM_GETUNICODEFORMAT :: 0x2006
|
||||||
|
SB_GETUNICODEFORMAT :: 0x2006
|
||||||
|
CBEM_SETWINDOWTHEME :: 0x200b
|
||||||
|
TB_SETWINDOWTHEME :: 0x200b
|
||||||
OCM_CTLCOLOR :: 0x2019
|
OCM_CTLCOLOR :: 0x2019
|
||||||
OCM_DRAWITEM :: 0x202b
|
OCM_DRAWITEM :: 0x202b
|
||||||
OCM_MEASUREITEM :: 0x202c
|
OCM_MEASUREITEM :: 0x202c
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package all
|
|||||||
|
|
||||||
import wgpu "vendor:wgpu"
|
import wgpu "vendor:wgpu"
|
||||||
import b2 "vendor:box2d"
|
import b2 "vendor:box2d"
|
||||||
|
import game_input "vendor:windows/GameInput"
|
||||||
|
|
||||||
_ :: wgpu
|
_ :: wgpu
|
||||||
_ :: b2
|
_ :: b2
|
||||||
|
_ :: game_input
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -532,9 +532,9 @@ gb_internal void report_os_info() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t major, minor, patch;
|
uint32_t major, minor, patch = 0;
|
||||||
|
|
||||||
if (sscanf(cast(const char *)sw_vers, "%u.%u.%u", &major, &minor, &patch) != 3) {
|
if (sscanf(cast(const char *)sw_vers, "%u.%u.%u", &major, &minor, &patch) < 1) {
|
||||||
gb_printf("macOS Unknown\n");
|
gb_printf("macOS Unknown\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3502,9 +3502,12 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
|
|||||||
case ExactValue_Integer:
|
case ExactValue_Integer:
|
||||||
mp_abs(&operand->value.value_integer, &operand->value.value_integer);
|
mp_abs(&operand->value.value_integer, &operand->value.value_integer);
|
||||||
break;
|
break;
|
||||||
case ExactValue_Float:
|
case ExactValue_Float: {
|
||||||
operand->value.value_float = gb_abs(operand->value.value_float);
|
u64 abs = bit_cast<u64>(operand->value.value_float);
|
||||||
|
abs &= 0x7FFFFFFFFFFFFFFF;
|
||||||
|
operand->value.value_float = bit_cast<f64>(abs);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case ExactValue_Complex: {
|
case ExactValue_Complex: {
|
||||||
f64 r = operand->value.value_complex->real;
|
f64 r = operand->value.value_complex->real;
|
||||||
f64 i = operand->value.value_complex->imag;
|
f64 i = operand->value.value_complex->imag;
|
||||||
@@ -5558,6 +5561,9 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
|
|||||||
// NOTE(bill): Is this even correct?
|
// NOTE(bill): Is this even correct?
|
||||||
new_type->Union.node = operand->expr;
|
new_type->Union.node = operand->expr;
|
||||||
new_type->Union.scope = bt->Union.scope;
|
new_type->Union.scope = bt->Union.scope;
|
||||||
|
if (bt->Union.kind == UnionType_no_nil) {
|
||||||
|
new_type->Union.kind = UnionType_no_nil;
|
||||||
|
}
|
||||||
|
|
||||||
operand->type = new_type;
|
operand->type = new_type;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -857,6 +857,7 @@ gb_internal Entity *init_entity_foreign_library(CheckerContext *ctx, Entity *e)
|
|||||||
} else {
|
} else {
|
||||||
String name = ident->Ident.token.string;
|
String name = ident->Ident.token.string;
|
||||||
Entity *found = scope_lookup(ctx->scope, name);
|
Entity *found = scope_lookup(ctx->scope, name);
|
||||||
|
|
||||||
if (found == nullptr) {
|
if (found == nullptr) {
|
||||||
if (is_blank_ident(name)) {
|
if (is_blank_ident(name)) {
|
||||||
// NOTE(bill): link against nothing
|
// NOTE(bill): link against nothing
|
||||||
|
|||||||
+5
-2
@@ -3649,7 +3649,8 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type
|
|||||||
gb_string_free(oper_str);
|
gb_string_free(oper_str);
|
||||||
gb_string_free(to_type);
|
gb_string_free(to_type);
|
||||||
} else if (is_type_integer(src_t) && is_type_integer(dst_t) &&
|
} else if (is_type_integer(src_t) && is_type_integer(dst_t) &&
|
||||||
types_have_same_internal_endian(src_t, dst_t)) {
|
types_have_same_internal_endian(src_t, dst_t) &&
|
||||||
|
type_endian_kind_of(src_t) == type_endian_kind_of(dst_t)) {
|
||||||
gbString oper_type = type_to_string(src_t);
|
gbString oper_type = type_to_string(src_t);
|
||||||
gbString to_type = type_to_string(dst_t);
|
gbString to_type = type_to_string(dst_t);
|
||||||
error(o->expr, "Use of 'transmute' where 'cast' would be preferred since both are integers of the same endianness, from '%s' to '%s'", oper_type, to_type);
|
error(o->expr, "Use of 'transmute' where 'cast' would be preferred since both are integers of the same endianness, from '%s' to '%s'", oper_type, to_type);
|
||||||
@@ -10377,7 +10378,7 @@ gb_internal ExprKind check_type_assertion(CheckerContext *c, Operand *o, Ast *no
|
|||||||
add_type_info_type(c, o->type);
|
add_type_info_type(c, o->type);
|
||||||
o->type = type_hint;
|
o->type = type_hint;
|
||||||
o->mode = Addressing_OptionalOk;
|
o->mode = Addressing_OptionalOk;
|
||||||
return kind;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10442,6 +10443,8 @@ gb_internal ExprKind check_type_assertion(CheckerContext *c, Operand *o, Ast *no
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end:;
|
||||||
|
|
||||||
if ((c->state_flags & StateFlag_no_type_assert) == 0) {
|
if ((c->state_flags & StateFlag_no_type_assert) == 0) {
|
||||||
add_package_dependency(c, "runtime", "type_assertion_check");
|
add_package_dependency(c, "runtime", "type_assertion_check");
|
||||||
add_package_dependency(c, "runtime", "type_assertion_check2");
|
add_package_dependency(c, "runtime", "type_assertion_check2");
|
||||||
|
|||||||
+17
-3
@@ -5016,6 +5016,9 @@ gb_internal DECL_ATTRIBUTE_PROC(foreign_import_decl_attribute) {
|
|||||||
error(elem, "Expected a string value for '%.*s'", LIT(name));
|
error(elem, "Expected a string value for '%.*s'", LIT(name));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
} else if (name == "export") {
|
||||||
|
ac->is_export = true;
|
||||||
|
return true;
|
||||||
} else if (name == "force" || name == "require") {
|
} else if (name == "force" || name == "require") {
|
||||||
if (value != nullptr) {
|
if (value != nullptr) {
|
||||||
error(elem, "Expected no parameter for '%.*s'", LIT(name));
|
error(elem, "Expected no parameter for '%.*s'", LIT(name));
|
||||||
@@ -5181,14 +5184,21 @@ gb_internal void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) {
|
|||||||
GB_ASSERT(fl->library_name.pos.line != 0);
|
GB_ASSERT(fl->library_name.pos.line != 0);
|
||||||
fl->library_name.string = library_name;
|
fl->library_name.string = library_name;
|
||||||
|
|
||||||
|
AttributeContext ac = {};
|
||||||
|
check_decl_attributes(ctx, fl->attributes, foreign_import_decl_attribute, &ac);
|
||||||
|
|
||||||
|
Scope *scope = parent_scope;
|
||||||
|
if (ac.is_export) {
|
||||||
|
scope = parent_scope->parent;
|
||||||
|
}
|
||||||
|
|
||||||
Entity *e = alloc_entity_library_name(parent_scope, fl->library_name, t_invalid,
|
Entity *e = alloc_entity_library_name(parent_scope, fl->library_name, t_invalid,
|
||||||
fl->fullpaths, library_name);
|
fl->fullpaths, library_name);
|
||||||
e->LibraryName.decl = decl;
|
e->LibraryName.decl = decl;
|
||||||
add_entity_flags_from_file(ctx, e, parent_scope);
|
add_entity_flags_from_file(ctx, e, parent_scope);
|
||||||
add_entity(ctx, parent_scope, nullptr, e);
|
add_entity(ctx, scope, nullptr, e);
|
||||||
|
|
||||||
|
|
||||||
AttributeContext ac = {};
|
|
||||||
check_decl_attributes(ctx, fl->attributes, foreign_import_decl_attribute, &ac);
|
|
||||||
if (ac.require_declaration) {
|
if (ac.require_declaration) {
|
||||||
mpsc_enqueue(&ctx->info->required_foreign_imports_through_force_queue, e);
|
mpsc_enqueue(&ctx->info->required_foreign_imports_through_force_queue, e);
|
||||||
add_entity_use(ctx, nullptr, e);
|
add_entity_use(ctx, nullptr, e);
|
||||||
@@ -6309,6 +6319,10 @@ gb_internal void check_deferred_procedures(Checker *c) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dst_params == nullptr) {
|
||||||
|
error(src->token, "Deferred procedure must have parameters for %s", attribute);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
GB_ASSERT(dst_params->kind == Type_Tuple);
|
GB_ASSERT(dst_params->kind == Type_Tuple);
|
||||||
|
|
||||||
Type *tsrc = alloc_type_tuple();
|
Type *tsrc = alloc_type_tuple();
|
||||||
|
|||||||
+12
-1
@@ -5837,9 +5837,20 @@ gb_inline isize gb_printf_err_va(char const *fmt, va_list va) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gb_inline isize gb_fprintf_va(struct gbFile *f, char const *fmt, va_list va) {
|
gb_inline isize gb_fprintf_va(struct gbFile *f, char const *fmt, va_list va) {
|
||||||
gb_local_persist char buf[4096];
|
char buf[4096];
|
||||||
isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va);
|
isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va);
|
||||||
|
char *new_buf = NULL;
|
||||||
|
isize n = gb_size_of(buf);
|
||||||
|
while (len < 0) {
|
||||||
|
n <<= 1;
|
||||||
|
gb_free(gb_heap_allocator(), new_buf);
|
||||||
|
new_buf = gb_alloc_array(gb_heap_allocator(), char, n);;
|
||||||
|
len = gb_snprintf_va(new_buf, n, fmt, va);
|
||||||
|
}
|
||||||
gb_file_write(f, buf, len-1); // NOTE(bill): prevent extra whitespace
|
gb_file_write(f, buf, len-1); // NOTE(bill): prevent extra whitespace
|
||||||
|
if (new_buf != NULL) {
|
||||||
|
gb_free(gb_heap_allocator(), new_buf);
|
||||||
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -169,11 +169,17 @@ gb_internal void lb_correct_entity_linkage(lbGenerator *gen) {
|
|||||||
other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname);
|
other_global = LLVMGetNamedGlobal(ec.other_module->mod, ec.cname);
|
||||||
if (other_global) {
|
if (other_global) {
|
||||||
LLVMSetLinkage(other_global, LLVMWeakAnyLinkage);
|
LLVMSetLinkage(other_global, LLVMWeakAnyLinkage);
|
||||||
|
if (!ec.e->Variable.is_export) {
|
||||||
|
LLVMSetVisibility(other_global, LLVMHiddenVisibility);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (ec.e->kind == Entity_Procedure) {
|
} else if (ec.e->kind == Entity_Procedure) {
|
||||||
other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname);
|
other_global = LLVMGetNamedFunction(ec.other_module->mod, ec.cname);
|
||||||
if (other_global) {
|
if (other_global) {
|
||||||
LLVMSetLinkage(other_global, LLVMWeakAnyLinkage);
|
LLVMSetLinkage(other_global, LLVMWeakAnyLinkage);
|
||||||
|
if (!ec.e->Procedure.is_export) {
|
||||||
|
LLVMSetVisibility(other_global, LLVMHiddenVisibility);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3364,9 +3364,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
|
|||||||
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
||||||
args[0] = ok;
|
args[0] = ok;
|
||||||
|
|
||||||
args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id));
|
lb_set_file_line_col(p, array_slice(args, 1, args.count), pos);
|
||||||
args[2] = lb_const_int(p->module, t_i32, pos.line);
|
|
||||||
args[3] = lb_const_int(p->module, t_i32, pos.column);
|
|
||||||
|
|
||||||
if (!build_context.no_rtti) {
|
if (!build_context.no_rtti) {
|
||||||
args[4] = lb_typeid(p->module, src_type);
|
args[4] = lb_typeid(p->module, src_type);
|
||||||
@@ -3393,9 +3391,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
|
|||||||
auto args = array_make<lbValue>(permanent_allocator(), 6);
|
auto args = array_make<lbValue>(permanent_allocator(), 6);
|
||||||
args[0] = ok;
|
args[0] = ok;
|
||||||
|
|
||||||
args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id));
|
lb_set_file_line_col(p, array_slice(args, 1, args.count), pos);
|
||||||
args[2] = lb_const_int(p->module, t_i32, pos.line);
|
|
||||||
args[3] = lb_const_int(p->module, t_i32, pos.column);
|
|
||||||
|
|
||||||
args[4] = any_id;
|
args[4] = any_id;
|
||||||
args[5] = id;
|
args[5] = id;
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ gb_global isize lb_global_type_info_member_offsets_index = 0;
|
|||||||
gb_global isize lb_global_type_info_member_usings_index = 0;
|
gb_global isize lb_global_type_info_member_usings_index = 0;
|
||||||
gb_global isize lb_global_type_info_member_tags_index = 0;
|
gb_global isize lb_global_type_info_member_tags_index = 0;
|
||||||
|
|
||||||
|
|
||||||
gb_internal void lb_init_module(lbModule *m, Checker *c) {
|
gb_internal void lb_init_module(lbModule *m, Checker *c) {
|
||||||
m->info = &c->info;
|
m->info = &c->info;
|
||||||
|
|
||||||
@@ -540,6 +539,22 @@ gb_internal lbValue lb_build_addr_ptr(lbProcedure *p, Ast *expr) {
|
|||||||
return lb_addr_get_ptr(p, addr);
|
return lb_addr_get_ptr(p, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gb_internal void lb_set_file_line_col(lbProcedure *p, Array<lbValue> arr, TokenPos pos) {
|
||||||
|
String file = get_file_path_string(pos.file_id);
|
||||||
|
i32 line = pos.line;
|
||||||
|
i32 col = pos.column;
|
||||||
|
|
||||||
|
if (build_context.obfuscate_source_code_locations) {
|
||||||
|
file = obfuscate_string(file, "F");
|
||||||
|
line = obfuscate_i32(line);
|
||||||
|
col = obfuscate_i32(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
arr[0] = lb_find_or_add_entity_string(p->module, file);
|
||||||
|
arr[1] = lb_const_int(p->module, t_i32, line);
|
||||||
|
arr[2] = lb_const_int(p->module, t_i32, col);
|
||||||
|
}
|
||||||
|
|
||||||
gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) {
|
gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index, lbValue len) {
|
||||||
if (build_context.no_bounds_check) {
|
if (build_context.no_bounds_check) {
|
||||||
return;
|
return;
|
||||||
@@ -553,14 +568,8 @@ gb_internal void lb_emit_bounds_check(lbProcedure *p, Token token, lbValue index
|
|||||||
index = lb_emit_conv(p, index, t_int);
|
index = lb_emit_conv(p, index, t_int);
|
||||||
len = lb_emit_conv(p, len, t_int);
|
len = lb_emit_conv(p, len, t_int);
|
||||||
|
|
||||||
lbValue file = lb_find_or_add_entity_string(p->module, get_file_path_string(token.pos.file_id));
|
|
||||||
lbValue line = lb_const_int(p->module, t_i32, token.pos.line);
|
|
||||||
lbValue column = lb_const_int(p->module, t_i32, token.pos.column);
|
|
||||||
|
|
||||||
auto args = array_make<lbValue>(temporary_allocator(), 5);
|
auto args = array_make<lbValue>(temporary_allocator(), 5);
|
||||||
args[0] = file;
|
lb_set_file_line_col(p, args, token.pos);
|
||||||
args[1] = line;
|
|
||||||
args[2] = column;
|
|
||||||
args[3] = index;
|
args[3] = index;
|
||||||
args[4] = len;
|
args[4] = len;
|
||||||
|
|
||||||
@@ -582,14 +591,8 @@ gb_internal void lb_emit_matrix_bounds_check(lbProcedure *p, Token token, lbValu
|
|||||||
row_count = lb_emit_conv(p, row_count, t_int);
|
row_count = lb_emit_conv(p, row_count, t_int);
|
||||||
column_count = lb_emit_conv(p, column_count, t_int);
|
column_count = lb_emit_conv(p, column_count, t_int);
|
||||||
|
|
||||||
lbValue file = lb_find_or_add_entity_string(p->module, get_file_path_string(token.pos.file_id));
|
|
||||||
lbValue line = lb_const_int(p->module, t_i32, token.pos.line);
|
|
||||||
lbValue column = lb_const_int(p->module, t_i32, token.pos.column);
|
|
||||||
|
|
||||||
auto args = array_make<lbValue>(temporary_allocator(), 7);
|
auto args = array_make<lbValue>(temporary_allocator(), 7);
|
||||||
args[0] = file;
|
lb_set_file_line_col(p, args, token.pos);
|
||||||
args[1] = line;
|
|
||||||
args[2] = column;
|
|
||||||
args[3] = row_index;
|
args[3] = row_index;
|
||||||
args[4] = column_index;
|
args[4] = column_index;
|
||||||
args[5] = row_count;
|
args[5] = row_count;
|
||||||
@@ -610,14 +613,8 @@ gb_internal void lb_emit_multi_pointer_slice_bounds_check(lbProcedure *p, Token
|
|||||||
low = lb_emit_conv(p, low, t_int);
|
low = lb_emit_conv(p, low, t_int);
|
||||||
high = lb_emit_conv(p, high, t_int);
|
high = lb_emit_conv(p, high, t_int);
|
||||||
|
|
||||||
lbValue file = lb_find_or_add_entity_string(p->module, get_file_path_string(token.pos.file_id));
|
|
||||||
lbValue line = lb_const_int(p->module, t_i32, token.pos.line);
|
|
||||||
lbValue column = lb_const_int(p->module, t_i32, token.pos.column);
|
|
||||||
|
|
||||||
auto args = array_make<lbValue>(permanent_allocator(), 5);
|
auto args = array_make<lbValue>(permanent_allocator(), 5);
|
||||||
args[0] = file;
|
lb_set_file_line_col(p, args, token.pos);
|
||||||
args[1] = line;
|
|
||||||
args[2] = column;
|
|
||||||
args[3] = low;
|
args[3] = low;
|
||||||
args[4] = high;
|
args[4] = high;
|
||||||
|
|
||||||
@@ -632,16 +629,11 @@ gb_internal void lb_emit_slice_bounds_check(lbProcedure *p, Token token, lbValue
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lbValue file = lb_find_or_add_entity_string(p->module, get_file_path_string(token.pos.file_id));
|
|
||||||
lbValue line = lb_const_int(p->module, t_i32, token.pos.line);
|
|
||||||
lbValue column = lb_const_int(p->module, t_i32, token.pos.column);
|
|
||||||
high = lb_emit_conv(p, high, t_int);
|
high = lb_emit_conv(p, high, t_int);
|
||||||
|
|
||||||
if (!lower_value_used) {
|
if (!lower_value_used) {
|
||||||
auto args = array_make<lbValue>(permanent_allocator(), 5);
|
auto args = array_make<lbValue>(permanent_allocator(), 5);
|
||||||
args[0] = file;
|
lb_set_file_line_col(p, args, token.pos);
|
||||||
args[1] = line;
|
|
||||||
args[2] = column;
|
|
||||||
args[3] = high;
|
args[3] = high;
|
||||||
args[4] = len;
|
args[4] = len;
|
||||||
|
|
||||||
@@ -651,9 +643,7 @@ gb_internal void lb_emit_slice_bounds_check(lbProcedure *p, Token token, lbValue
|
|||||||
low = lb_emit_conv(p, low, t_int);
|
low = lb_emit_conv(p, low, t_int);
|
||||||
|
|
||||||
auto args = array_make<lbValue>(permanent_allocator(), 6);
|
auto args = array_make<lbValue>(permanent_allocator(), 6);
|
||||||
args[0] = file;
|
lb_set_file_line_col(p, args, token.pos);
|
||||||
args[1] = line;
|
|
||||||
args[2] = column;
|
|
||||||
args[3] = low;
|
args[3] = low;
|
||||||
args[4] = high;
|
args[4] = high;
|
||||||
args[5] = len;
|
args[5] = len;
|
||||||
|
|||||||
@@ -2174,7 +2174,32 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
|
|||||||
case 128: return lb_emit_runtime_call(p, "abs_complex128", args);
|
case 128: return lb_emit_runtime_call(p, "abs_complex128", args);
|
||||||
}
|
}
|
||||||
GB_PANIC("Unknown complex type");
|
GB_PANIC("Unknown complex type");
|
||||||
|
} else if (is_type_float(t)) {
|
||||||
|
bool little = is_type_endian_little(t) || (is_type_endian_platform(t) && build_context.endian_kind == TargetEndian_Little);
|
||||||
|
Type *t_unsigned = nullptr;
|
||||||
|
lbValue mask = {0};
|
||||||
|
switch (type_size_of(t)) {
|
||||||
|
case 2:
|
||||||
|
t_unsigned = t_u16;
|
||||||
|
mask = lb_const_int(p->module, t_unsigned, little ? 0x7FFF : 0xFF7F);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
t_unsigned = t_u32;
|
||||||
|
mask = lb_const_int(p->module, t_unsigned, little ? 0x7FFFFFFF : 0xFFFFFF7F);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
t_unsigned = t_u64;
|
||||||
|
mask = lb_const_int(p->module, t_unsigned, little ? 0x7FFFFFFFFFFFFFFF : 0xFFFFFFFFFFFFFF7F);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GB_PANIC("abs: unhandled float size");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lbValue as_unsigned = lb_emit_transmute(p, x, t_unsigned);
|
||||||
|
lbValue abs = lb_emit_arith(p, Token_And, as_unsigned, mask, t_unsigned);
|
||||||
|
return lb_emit_transmute(p, abs, t);
|
||||||
|
}
|
||||||
|
|
||||||
lbValue zero = lb_const_nil(p->module, t);
|
lbValue zero = lb_const_nil(p->module, t);
|
||||||
lbValue cond = lb_emit_comp(p, Token_Lt, x, zero);
|
lbValue cond = lb_emit_comp(p, Token_Lt, x, zero);
|
||||||
lbValue neg = lb_emit_unary_arith(p, Token_Sub, x, t);
|
lbValue neg = lb_emit_unary_arith(p, Token_Sub, x, t);
|
||||||
|
|||||||
@@ -771,9 +771,7 @@ gb_internal lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type
|
|||||||
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
||||||
args[0] = ok;
|
args[0] = ok;
|
||||||
|
|
||||||
args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
|
lb_set_file_line_col(p, array_slice(args, 1, args.count), pos);
|
||||||
args[2] = lb_const_int(m, t_i32, pos.line);
|
|
||||||
args[3] = lb_const_int(m, t_i32, pos.column);
|
|
||||||
|
|
||||||
if (!build_context.no_rtti) {
|
if (!build_context.no_rtti) {
|
||||||
args[4] = lb_typeid(m, src_type);
|
args[4] = lb_typeid(m, src_type);
|
||||||
@@ -847,9 +845,7 @@ gb_internal lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *ty
|
|||||||
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
auto args = array_make<lbValue>(permanent_allocator(), arg_count);
|
||||||
args[0] = ok;
|
args[0] = ok;
|
||||||
|
|
||||||
args[1] = lb_const_string(m, get_file_path_string(pos.file_id));
|
lb_set_file_line_col(p, array_slice(args, 1, args.count), pos);
|
||||||
args[2] = lb_const_int(m, t_i32, pos.line);
|
|
||||||
args[3] = lb_const_int(m, t_i32, pos.column);
|
|
||||||
|
|
||||||
if (!build_context.no_rtti) {
|
if (!build_context.no_rtti) {
|
||||||
args[4] = any_typeid;
|
args[4] = any_typeid;
|
||||||
|
|||||||
@@ -1801,6 +1801,27 @@ gb_internal bool is_type_union_maybe_pointer_original_alignment(Type *t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum TypeEndianKind {
|
||||||
|
TypeEndian_Platform,
|
||||||
|
TypeEndian_Little,
|
||||||
|
TypeEndian_Big,
|
||||||
|
};
|
||||||
|
|
||||||
|
gb_internal TypeEndianKind type_endian_kind_of(Type *t) {
|
||||||
|
t = core_type(t);
|
||||||
|
if (t->kind == Type_Basic) {
|
||||||
|
if (t->Basic.flags & BasicFlag_EndianLittle) {
|
||||||
|
return TypeEndian_Little;
|
||||||
|
}
|
||||||
|
if (t->Basic.flags & BasicFlag_EndianBig) {
|
||||||
|
return TypeEndian_Big;
|
||||||
|
}
|
||||||
|
} else if (t->kind == Type_BitSet) {
|
||||||
|
return type_endian_kind_of(bit_set_to_int(t));
|
||||||
|
}
|
||||||
|
return TypeEndian_Platform;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
gb_internal bool is_type_endian_big(Type *t) {
|
gb_internal bool is_type_endian_big(Type *t) {
|
||||||
t = core_type(t);
|
t = core_type(t);
|
||||||
|
|||||||
@@ -483,3 +483,49 @@ map_with_integer_keys :: proc(t: ^testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test
|
||||||
|
enumerated_array :: proc(t: ^testing.T) {
|
||||||
|
Fruit :: enum { Apple, Banana, Pear }
|
||||||
|
Fruit_Stock :: [Fruit]uint {
|
||||||
|
.Apple = 14,
|
||||||
|
.Banana = 3,
|
||||||
|
.Pear = 513,
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // test unmarshaling from array
|
||||||
|
marshaled := "[14,3,513]"
|
||||||
|
|
||||||
|
unmarshaled: [Fruit]uint
|
||||||
|
err := json.unmarshal_string(marshaled, &unmarshaled)
|
||||||
|
testing.expect_value(t, err, nil)
|
||||||
|
testing.expect_value(t, unmarshaled, Fruit_Stock)
|
||||||
|
}
|
||||||
|
|
||||||
|
Sparse_Fruit :: enum { Apple, Banana, Cherry = 23, Pear }
|
||||||
|
Sparse_Fruit_Stock :: #partial #sparse [Sparse_Fruit]uint {
|
||||||
|
.Apple = 14,
|
||||||
|
.Banana = 3,
|
||||||
|
.Pear = 513,
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // test unmarshaling from object
|
||||||
|
marshaled := `{"Apple":14,"Banana":3,"Cherry":0,"Pear":513}`
|
||||||
|
|
||||||
|
unmarshaled: #sparse [Sparse_Fruit]uint
|
||||||
|
err := json.unmarshal_string(marshaled, &unmarshaled)
|
||||||
|
testing.expect_value(t, err, nil)
|
||||||
|
testing.expect_value(t, unmarshaled, Sparse_Fruit_Stock)
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // test marshal -> unmarshal
|
||||||
|
marshaled, err_marshal := json.marshal(Sparse_Fruit_Stock)
|
||||||
|
defer delete(marshaled)
|
||||||
|
testing.expect_value(t, err_marshal, nil)
|
||||||
|
|
||||||
|
unmarshaled: #sparse [Sparse_Fruit]uint
|
||||||
|
err_unmarshal := json.unmarshal(marshaled, &unmarshaled)
|
||||||
|
testing.expect_value(t, err_unmarshal, nil)
|
||||||
|
testing.expect_value(t, unmarshaled, Sparse_Fruit_Stock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <stddef.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <glob.h>
|
#include <glob.h>
|
||||||
@@ -70,6 +71,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("protoent %zu %zu\n", sizeof(struct protoent), _Alignof(struct protoent));
|
printf("protoent %zu %zu\n", sizeof(struct protoent), _Alignof(struct protoent));
|
||||||
printf("servent %zu %zu\n", sizeof(struct servent), _Alignof(struct servent));
|
printf("servent %zu %zu\n", sizeof(struct servent), _Alignof(struct servent));
|
||||||
printf("addrinfo %zu %zu\n", sizeof(struct addrinfo), _Alignof(struct addrinfo));
|
printf("addrinfo %zu %zu\n", sizeof(struct addrinfo), _Alignof(struct addrinfo));
|
||||||
|
printf("ai_canonname %zu\n", offsetof(struct addrinfo, ai_canonname));
|
||||||
|
|
||||||
printf("pollfd %zu %zu\n", sizeof(struct pollfd), _Alignof(struct pollfd));
|
printf("pollfd %zu %zu\n", sizeof(struct pollfd), _Alignof(struct pollfd));
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ main :: proc() {
|
|||||||
fmt.println("protoent", size_of(posix.protoent), align_of(posix.protoent))
|
fmt.println("protoent", size_of(posix.protoent), align_of(posix.protoent))
|
||||||
fmt.println("servent", size_of(posix.servent), align_of(posix.servent))
|
fmt.println("servent", size_of(posix.servent), align_of(posix.servent))
|
||||||
fmt.println("addrinfo", size_of(posix.addrinfo), align_of(posix.addrinfo))
|
fmt.println("addrinfo", size_of(posix.addrinfo), align_of(posix.addrinfo))
|
||||||
|
fmt.println("ai_canonname", offset_of(posix.addrinfo, ai_canonname))
|
||||||
|
|
||||||
fmt.println("pollfd", size_of(posix.pollfd), align_of(posix.pollfd))
|
fmt.println("pollfd", size_of(posix.pollfd), align_of(posix.pollfd))
|
||||||
fmt.println("passwd", size_of(posix.passwd), align_of(posix.passwd))
|
fmt.println("passwd", size_of(posix.passwd), align_of(posix.passwd))
|
||||||
|
|||||||
@@ -0,0 +1,168 @@
|
|||||||
|
package test_internal
|
||||||
|
|
||||||
|
import "core:testing"
|
||||||
|
|
||||||
|
@(private="file")
|
||||||
|
not_const :: proc(v: $T) -> T { return v }
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f16_const :: proc(t: ^testing.T) {
|
||||||
|
// Constant f16
|
||||||
|
testing.expect_value(t, abs(f16(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f16)), max(f16))
|
||||||
|
testing.expect_value(t, abs(max(f16)), max(f16))
|
||||||
|
testing.expect_value(t, abs(f16(-.12)), .12)
|
||||||
|
|
||||||
|
// Constant f16le
|
||||||
|
testing.expect_value(t, abs(f16le(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16le(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16le(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f16le)), max(f16le))
|
||||||
|
testing.expect_value(t, abs(max(f16le)), max(f16le))
|
||||||
|
testing.expect_value(t, abs(f16le(-.12)), .12)
|
||||||
|
|
||||||
|
// Constant f16be
|
||||||
|
testing.expect_value(t, abs(f16be(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16be(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f16be(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f16be)), max(f16be))
|
||||||
|
testing.expect_value(t, abs(max(f16be)), max(f16be))
|
||||||
|
testing.expect_value(t, abs(f16be(-.12)), .12)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f16_variable :: proc(t: ^testing.T) {
|
||||||
|
// Variable f16
|
||||||
|
testing.expect_value(t, abs(not_const(f16(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f16))), max(f16))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f16))), max(f16))
|
||||||
|
testing.expect_value(t, abs(not_const(f16(-.12))), .12)
|
||||||
|
|
||||||
|
// Variable f16le
|
||||||
|
testing.expect_value(t, abs(not_const(f16le(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16le(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16le(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f16le))), max(f16le))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f16le))), max(f16le))
|
||||||
|
testing.expect_value(t, abs(not_const(f16le(-.12))), .12)
|
||||||
|
|
||||||
|
// Variable f16be
|
||||||
|
testing.expect_value(t, abs(not_const(f16be(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16be(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f16be(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f16be))), max(f16be))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f16be))), max(f16be))
|
||||||
|
testing.expect_value(t, abs(not_const(f16be(-.12))), .12)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f32_const :: proc(t: ^testing.T) {
|
||||||
|
// Constant f32
|
||||||
|
testing.expect_value(t, abs(f32(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f32)), max(f32))
|
||||||
|
testing.expect_value(t, abs(max(f32)), max(f32))
|
||||||
|
testing.expect_value(t, abs(f32(-.12345)), .12345)
|
||||||
|
|
||||||
|
// Constant f32le
|
||||||
|
testing.expect_value(t, abs(f32le(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32le(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32le(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f32le)), max(f32le))
|
||||||
|
testing.expect_value(t, abs(max(f32le)), max(f32le))
|
||||||
|
testing.expect_value(t, abs(f32le(-.12345)), .12345)
|
||||||
|
|
||||||
|
// Constant f32be
|
||||||
|
testing.expect_value(t, abs(f32be(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32be(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f32be(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f32be)), max(f32be))
|
||||||
|
testing.expect_value(t, abs(max(f32be)), max(f32be))
|
||||||
|
testing.expect_value(t, abs(f32be(-.12345)), .12345)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f32_variable :: proc(t: ^testing.T) {
|
||||||
|
// Variable f32
|
||||||
|
testing.expect_value(t, abs(not_const(f32(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f32))), max(f32))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f32))), max(f32))
|
||||||
|
testing.expect_value(t, abs(not_const(f32(-.12345))), .12345)
|
||||||
|
|
||||||
|
// Variable f32le
|
||||||
|
testing.expect_value(t, abs(not_const(f32le(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32le(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32le(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f32le))), max(f32le))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f32le))), max(f32le))
|
||||||
|
testing.expect_value(t, abs(not_const(f32le(-.12345))), .12345)
|
||||||
|
|
||||||
|
// Variable f32be
|
||||||
|
testing.expect_value(t, abs(not_const(f32be(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32be(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f32be(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f32be))), max(f32be))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f32be))), max(f32be))
|
||||||
|
testing.expect_value(t, abs(not_const(f32be(-.12345))), .12345)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f64_const :: proc(t: ^testing.T) {
|
||||||
|
// Constant f64
|
||||||
|
testing.expect_value(t, abs(f64(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f64)), max(f64))
|
||||||
|
testing.expect_value(t, abs(max(f64)), max(f64))
|
||||||
|
testing.expect_value(t, abs(f64(-.12345)), .12345)
|
||||||
|
|
||||||
|
// Constant f64le
|
||||||
|
testing.expect_value(t, abs(f64le(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64le(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64le(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f64le)), max(f64le))
|
||||||
|
testing.expect_value(t, abs(max(f64le)), max(f64le))
|
||||||
|
testing.expect_value(t, abs(f64le(-.12345)), .12345)
|
||||||
|
|
||||||
|
// Constant f64be
|
||||||
|
testing.expect_value(t, abs(f64be(0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64be(-0.)), 0.)
|
||||||
|
testing.expect_value(t, abs(f64be(-1.)), 1.)
|
||||||
|
testing.expect_value(t, abs(min(f64be)), max(f64be))
|
||||||
|
testing.expect_value(t, abs(max(f64be)), max(f64be))
|
||||||
|
testing.expect_value(t, abs(f64be(-.12345)), .12345)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(test)
|
||||||
|
abs_f64_variable :: proc(t: ^testing.T) {
|
||||||
|
// Variable f64
|
||||||
|
testing.expect_value(t, abs(not_const(f64(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f64))), max(f64))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f64))), max(f64))
|
||||||
|
testing.expect_value(t, abs(not_const(f64(-.12345))), .12345)
|
||||||
|
|
||||||
|
// Variable f64le
|
||||||
|
testing.expect_value(t, abs(not_const(f64le(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64le(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64le(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f64le))), max(f64le))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f64le))), max(f64le))
|
||||||
|
testing.expect_value(t, abs(not_const(f64le(-.12345))), .12345)
|
||||||
|
|
||||||
|
// Variable f64be
|
||||||
|
testing.expect_value(t, abs(not_const(f64be(0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64be(-0.))), 0.)
|
||||||
|
testing.expect_value(t, abs(not_const(f64be(-1.))), 1.)
|
||||||
|
testing.expect_value(t, abs(not_const(min(f64be))), max(f64be))
|
||||||
|
testing.expect_value(t, abs(not_const(max(f64be))), max(f64be))
|
||||||
|
testing.expect_value(t, abs(not_const(f64be(-.12345))), .12345)
|
||||||
|
}
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Vendored
+1
@@ -322,6 +322,7 @@ attribute_type_t :: enum c.int {
|
|||||||
V3I, // Set of 3 32-bit integers.
|
V3I, // Set of 3 32-bit integers.
|
||||||
V3F, // Set of 3 32-bit floats.
|
V3F, // Set of 3 32-bit floats.
|
||||||
V3D, // Set of 3 64-bit floats.
|
V3D, // Set of 3 64-bit floats.
|
||||||
|
DEEP_IMAGE_STATE, // ``uint8_t`` declaring deep image state.
|
||||||
OPAQUE, // User/unknown provided type.
|
OPAQUE, // User/unknown provided type.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+4
-2
@@ -6,12 +6,14 @@ when ODIN_OS == .Windows {
|
|||||||
when OPENEXRCORE_SHARED {
|
when OPENEXRCORE_SHARED {
|
||||||
#panic("Dynamic linking is not supported for OpenEXRCore yet")
|
#panic("Dynamic linking is not supported for OpenEXRCore yet")
|
||||||
} else {
|
} else {
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
foreign import lib_ "OpenEXRCore-3_3.lib"
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
foreign import lib_ "system:OpenEXRCore-3_3"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lib :: lib_
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
/** @brief Function pointer used to hold a malloc-like routine.
|
/** @brief Function pointer used to hold a malloc-like routine.
|
||||||
|
|||||||
Vendored
+14
-6
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,6 +35,20 @@ chunk_info_t :: struct {
|
|||||||
|
|
||||||
@(link_prefix="exr_", default_calling_convention="c")
|
@(link_prefix="exr_", default_calling_convention="c")
|
||||||
foreign lib {
|
foreign lib {
|
||||||
|
/** @brief Retrieve the chunk table offset for the part in question.
|
||||||
|
*/
|
||||||
|
get_chunk_table_offset :: proc(ctxt: const_context_t , part_index: c.int, chunk_offset_out: ^c.uint64_t) -> result_t ---
|
||||||
|
|
||||||
|
/** initialize chunk info with the default values from the specified part
|
||||||
|
*
|
||||||
|
* The 'x' and 'y' parameters are used to indicate the starting position
|
||||||
|
* of the chunk being initialized. This does not perform any I/O to validate
|
||||||
|
* and so the values are only indicative. (but can be used to do things
|
||||||
|
* like compress / decompress a chunk without having a file to actually
|
||||||
|
* read
|
||||||
|
*/
|
||||||
|
chunk_default_initialize :: proc(ctxt: context_t, part_index: c.int, box: ^attr_box2i_t, levelx: c.int, levely: c.int, cinfo: ^chunk_info_t) -> result_t ---
|
||||||
|
|
||||||
read_scanline_chunk_info :: proc(ctxt: const_context_t, part_index: c.int, y: c.int, cinfo: ^chunk_info_t) -> result_t ---
|
read_scanline_chunk_info :: proc(ctxt: const_context_t, part_index: c.int, y: c.int, cinfo: ^chunk_info_t) -> result_t ---
|
||||||
|
|
||||||
read_tile_chunk_info :: proc(
|
read_tile_chunk_info :: proc(
|
||||||
|
|||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
package vendor_openexr
|
||||||
|
|
||||||
|
import "core:c"
|
||||||
|
|
||||||
|
@(link_prefix="exr_", default_calling_convention="c")
|
||||||
|
foreign lib {
|
||||||
|
/** Computes a buffer that will be large enough to hold the compressed
|
||||||
|
* data. This may include some extra padding for headers / scratch */
|
||||||
|
compress_max_buffer_size :: proc(in_bytes: c.size_t) -> c.size_t ---
|
||||||
|
|
||||||
|
/** Compresses a buffer using a zlib style compression.
|
||||||
|
*
|
||||||
|
* If the level is -1, will use the default compression set to the library
|
||||||
|
* \ref set_default_zip_compression_level
|
||||||
|
* data. This may include some extra padding for headers / scratch */
|
||||||
|
compress_buffer :: proc(
|
||||||
|
ctxt: const_context_t,
|
||||||
|
level: c.int,
|
||||||
|
in_: rawptr,
|
||||||
|
in_bytes: c.size_t,
|
||||||
|
out: rawptr,
|
||||||
|
out_bytes_avail: c.size_t,
|
||||||
|
actual_out: ^c.size_t) -> result_t ---
|
||||||
|
|
||||||
|
/** Decompresses a buffer using a zlib style compression. */
|
||||||
|
uncompress_buffer :: proc(
|
||||||
|
ctxt: const_context_t,
|
||||||
|
in_: rawptr,
|
||||||
|
in_bytes: c.size_t,
|
||||||
|
out: rawptr,
|
||||||
|
out_bytes_avail: c.size_t,
|
||||||
|
actual_out: ^c.size_t) -> result_t ---
|
||||||
|
|
||||||
|
/** Apply simple run length encoding and put in the output buffer. */
|
||||||
|
rle_compress_buffer :: proc(
|
||||||
|
in_bytes: c.size_t,
|
||||||
|
in_: rawptr,
|
||||||
|
out: rawptr,
|
||||||
|
out_bytes_avail: c.size_t) -> c.size_t ---
|
||||||
|
|
||||||
|
/** Decode run length encoding and put in the output buffer. */
|
||||||
|
rle_uncompress_buffer :: proc(
|
||||||
|
in_bytes: c.size_t,
|
||||||
|
max_len: c.size_t,
|
||||||
|
in_: rawptr,
|
||||||
|
out: rawptr) -> c.size_t ---
|
||||||
|
|
||||||
|
/** Routine to query the lines required per chunk to compress with the
|
||||||
|
* specified method.
|
||||||
|
*
|
||||||
|
* This is only meaningful for scanline encodings, tiled
|
||||||
|
* representations have a different interpretation of this.
|
||||||
|
*
|
||||||
|
* These are constant values, this function returns -1 if the compression
|
||||||
|
* type is unknown.
|
||||||
|
*/
|
||||||
|
compression_lines_per_chunk :: proc(comptype: compression_t) -> c.int ---
|
||||||
|
|
||||||
|
/** Exposes a method to apply compression to a chunk of data.
|
||||||
|
*
|
||||||
|
* This can be useful for inheriting default behavior of the
|
||||||
|
* compression stage of an encoding pipeline, or other helper classes
|
||||||
|
* to expose compression.
|
||||||
|
*
|
||||||
|
* NB: As implied, this function will be used during a normal encode
|
||||||
|
* and write operation but can be used directly with a temporary
|
||||||
|
* context (i.e. not running the full encode pipeline).
|
||||||
|
*/
|
||||||
|
compress_chunk :: proc(encode_state: ^encode_pipeline_t) -> result_t ---
|
||||||
|
|
||||||
|
/** Exposes a method to decompress a chunk of data.
|
||||||
|
*
|
||||||
|
* This can be useful for inheriting default behavior of the
|
||||||
|
* uncompression stage of an decoding pipeline, or other helper classes
|
||||||
|
* to expose compress / uncompress operations.
|
||||||
|
*
|
||||||
|
* NB: This function will be used during a normal read and decode
|
||||||
|
* operation but can be used directly with a temporary context (i.e.
|
||||||
|
* not running the full decode pipeline).
|
||||||
|
*/
|
||||||
|
uncompress_chunk :: proc(decode_state: ^decode_pipeline_t) -> result_t ---
|
||||||
|
}
|
||||||
Vendored
+27
-8
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
#assert(size_of(c.int) == size_of(b32))
|
#assert(size_of(c.int) == size_of(b32))
|
||||||
@@ -282,6 +276,8 @@ context_initializer_t :: struct {
|
|||||||
/** Initialize with a bitwise or of the various context flags
|
/** Initialize with a bitwise or of the various context flags
|
||||||
*/
|
*/
|
||||||
flags: c.int,
|
flags: c.int,
|
||||||
|
|
||||||
|
pad: [4]u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief context flag which will enforce strict header validation
|
/** @brief context flag which will enforce strict header validation
|
||||||
@@ -418,19 +414,42 @@ foreign lib {
|
|||||||
filename: cstring,
|
filename: cstring,
|
||||||
ctxtdata: ^context_initializer_t) -> result_t ---
|
ctxtdata: ^context_initializer_t) -> result_t ---
|
||||||
|
|
||||||
|
/** @brief Create a new context for temporary use in memory.
|
||||||
|
*
|
||||||
|
* This is a custom mode that does not supporting writing actual image
|
||||||
|
* data, but one can create one of these, manipulate attributes,
|
||||||
|
* define additional parts, run validation, etc. without any
|
||||||
|
* requirement of actual file i/o.
|
||||||
|
*
|
||||||
|
* Note that this creates an defines an initial part for use, so one
|
||||||
|
* can immediately start definining attributes into part index 0.
|
||||||
|
*
|
||||||
|
* See the initializer context documentation \ref
|
||||||
|
* exr_context_initializer_t to be able to provide allocation
|
||||||
|
* overrides or other controls. The @p ctxtdata parameter is optional,
|
||||||
|
* if `NULL`, default values will be used.
|
||||||
|
*/
|
||||||
|
start_temporary_context :: proc(
|
||||||
|
ctxt: ^context_t,
|
||||||
|
context_name: [^]c.char,
|
||||||
|
ctxtdata: ^context_initializer_t) -> result_t ---
|
||||||
|
|
||||||
/** @brief Retrieve the file name the context is for as provided
|
/** @brief Retrieve the file name the context is for as provided
|
||||||
* during the start routine.
|
* during the start routine.
|
||||||
*
|
*
|
||||||
* Do not free the resulting string.
|
* Do not free the resulting string.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
get_file_name :: proc(ctxt: const_context_t, name: ^cstring) -> result_t ---
|
get_file_name :: proc(ctxt: const_context_t, name: ^cstring) -> result_t ---
|
||||||
|
|
||||||
|
/** @brief Retrieve the file version and flags the context is for as
|
||||||
|
* parsed during the start routine.
|
||||||
|
*/
|
||||||
|
get_file_version_and_flags :: proc(ctxt: const_context_t, ver: ^u32) -> result_t ---
|
||||||
|
|
||||||
/** @brief Query the user data the context was constructed with. This
|
/** @brief Query the user data the context was constructed with. This
|
||||||
* is perhaps useful in the error handler callback to jump back into
|
* is perhaps useful in the error handler callback to jump back into
|
||||||
* an object the user controls.
|
* an object the user controls.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
get_user_data :: proc(ctxt: const_context_t, userdata: ^rawptr) -> result_t ---
|
get_user_data :: proc(ctxt: const_context_t, userdata: ^rawptr) -> result_t ---
|
||||||
|
|
||||||
/** Any opaque attribute data entry of the specified type is tagged
|
/** Any opaque attribute data entry of the specified type is tagged
|
||||||
|
|||||||
Vendored
-6
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
@(link_prefix="exr_", default_calling_convention="c")
|
@(link_prefix="exr_", default_calling_convention="c")
|
||||||
foreign lib {
|
foreign lib {
|
||||||
print_context_info :: proc(c: const_context_t, verbose: b32) -> result_t ---
|
print_context_info :: proc(c: const_context_t, verbose: b32) -> result_t ---
|
||||||
|
|||||||
Vendored
+21
-7
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
/** Can be bit-wise or'ed into the decode_flags in the decode pipeline.
|
/** Can be bit-wise or'ed into the decode_flags in the decode pipeline.
|
||||||
@@ -55,6 +49,12 @@ DECODE_SAMPLE_DATA_ONLY :: u16(1 << 2)
|
|||||||
* the same context concurrently.
|
* the same context concurrently.
|
||||||
*/
|
*/
|
||||||
decode_pipeline_t :: struct {
|
decode_pipeline_t :: struct {
|
||||||
|
/** Used for versioning the decode pipeline in the future.
|
||||||
|
*
|
||||||
|
* \ref EXR_DECODE_PIPELINE_INITIALIZER
|
||||||
|
*/
|
||||||
|
pipe_size: c.size_t,
|
||||||
|
|
||||||
/** The output channel information for this chunk.
|
/** The output channel information for this chunk.
|
||||||
*
|
*
|
||||||
* User is expected to fill the channel pointers for the desired
|
* User is expected to fill the channel pointers for the desired
|
||||||
@@ -79,6 +79,20 @@ decode_pipeline_t :: struct {
|
|||||||
ctx: const_context_t,
|
ctx: const_context_t,
|
||||||
chunk: chunk_info_t,
|
chunk: chunk_info_t,
|
||||||
|
|
||||||
|
/** How many lines of the chunk to skip filling, assumes the
|
||||||
|
* pointer is at the beginning of data (i.e. includes this
|
||||||
|
* skip so does not need to be adjusted
|
||||||
|
*/
|
||||||
|
user_line_begin_skip: i32,
|
||||||
|
|
||||||
|
/** How many lines of the chunk to ignore at the end, assumes the
|
||||||
|
* output is meant to be N lines smaller
|
||||||
|
*/
|
||||||
|
user_line_end_ignore: i32,
|
||||||
|
|
||||||
|
/** How many bytes were actually decoded when items compressed */
|
||||||
|
bytes_decompressed: u64,
|
||||||
|
|
||||||
/** Can be used by the user to pass custom context data through
|
/** Can be used by the user to pass custom context data through
|
||||||
* the decode pipeline.
|
* the decode pipeline.
|
||||||
*/
|
*/
|
||||||
@@ -236,7 +250,7 @@ decode_pipeline_t :: struct {
|
|||||||
_quick_chan_store: [5]coding_channel_info_t,
|
_quick_chan_store: [5]coding_channel_info_t,
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE_PIPELINE_INITIALIZER :: decode_pipeline_t{}
|
DECODE_PIPELINE_INITIALIZER :: decode_pipeline_t{ pipe_size = size_of(decode_pipeline_t) }
|
||||||
|
|
||||||
|
|
||||||
@(link_prefix="exr_", default_calling_convention="c")
|
@(link_prefix="exr_", default_calling_convention="c")
|
||||||
|
|||||||
Vendored
+8
-8
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
/** Can be bit-wise or'ed into the decode_flags in the decode pipeline.
|
/** Can be bit-wise or'ed into the decode_flags in the decode pipeline.
|
||||||
@@ -46,7 +40,13 @@ ENCODE_NON_IMAGE_DATA_AS_POINTERS :: u16(1 << 1)
|
|||||||
* meant to be used by separate threads, which can all be accessing
|
* meant to be used by separate threads, which can all be accessing
|
||||||
* the same context concurrently.
|
* the same context concurrently.
|
||||||
*/
|
*/
|
||||||
encode_pipeline_t :: struct {
|
encode_pipeline_t :: struct {
|
||||||
|
/** Used for versioning the decode pipeline in the future
|
||||||
|
*
|
||||||
|
* \ref EXR_ENCODE_PIPELINE_INITIALIZER
|
||||||
|
*/
|
||||||
|
pipe_size: c.size_t,
|
||||||
|
|
||||||
/** The output channel information for this chunk.
|
/** The output channel information for this chunk.
|
||||||
*
|
*
|
||||||
* User is expected to fill the channel pointers for the input
|
* User is expected to fill the channel pointers for the input
|
||||||
@@ -264,7 +264,7 @@ ENCODE_NON_IMAGE_DATA_AS_POINTERS :: u16(1 << 1)
|
|||||||
_quick_chan_store: [5]coding_channel_info_t,
|
_quick_chan_store: [5]coding_channel_info_t,
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE_PIPELINE_INITIALIZER :: encode_pipeline_t{}
|
ENCODE_PIPELINE_INITIALIZER :: encode_pipeline_t{ pipe_size = size_of(encode_pipeline_t) }
|
||||||
|
|
||||||
|
|
||||||
@(link_prefix="exr_", default_calling_convention="c")
|
@(link_prefix="exr_", default_calling_convention="c")
|
||||||
|
|||||||
Vendored
+1
-6
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
#assert(size_of(c.int) == size_of(i32))
|
#assert(size_of(c.int) == size_of(i32))
|
||||||
@@ -37,6 +31,7 @@ result_t :: enum i32 {
|
|||||||
ALREADY_WROTE_ATTRS,
|
ALREADY_WROTE_ATTRS,
|
||||||
BAD_CHUNK_LEADER,
|
BAD_CHUNK_LEADER,
|
||||||
CORRUPT_CHUNK,
|
CORRUPT_CHUNK,
|
||||||
|
INCOMPLETE_CHUNK_TABLE,
|
||||||
INCORRECT_PART,
|
INCORRECT_PART,
|
||||||
INCORRECT_CHUNK,
|
INCORRECT_CHUNK,
|
||||||
USE_SCAN_DEEP_WRITE,
|
USE_SCAN_DEEP_WRITE,
|
||||||
|
|||||||
Vendored
+35
-7
@@ -1,11 +1,5 @@
|
|||||||
package vendor_openexr
|
package vendor_openexr
|
||||||
|
|
||||||
when ODIN_OS == .Windows {
|
|
||||||
foreign import lib "OpenEXRCore-3_1.lib"
|
|
||||||
} else {
|
|
||||||
foreign import lib "system:OpenEXRCore-3_1"
|
|
||||||
}
|
|
||||||
|
|
||||||
import "core:c"
|
import "core:c"
|
||||||
|
|
||||||
attr_list_access_mode_t :: enum c.int {
|
attr_list_access_mode_t :: enum c.int {
|
||||||
@@ -73,6 +67,25 @@ foreign lib {
|
|||||||
levely: c.int,
|
levely: c.int,
|
||||||
tilew: ^i32,
|
tilew: ^i32,
|
||||||
tileh: ^i32) -> result_t ---
|
tileh: ^i32) -> result_t ---
|
||||||
|
/** @brief Query the tile count for a particular level in the specified part.
|
||||||
|
*
|
||||||
|
* If the part is a tiled part, fills in the count for the
|
||||||
|
* specified levels.
|
||||||
|
*
|
||||||
|
* Return `ERR_SUCCESS` on success, an error otherwise (i.e. if the part
|
||||||
|
* is not tiled).
|
||||||
|
*
|
||||||
|
* It is valid to pass `NULL` to either of the @p countx or @p county
|
||||||
|
* arguments, which enables testing if this part is a tiled part, or
|
||||||
|
* if you don't need both for some reason.
|
||||||
|
*/
|
||||||
|
get_tile_counts :: proc(
|
||||||
|
ctxt: const_context_t,
|
||||||
|
part_index: c.int,
|
||||||
|
levelx: c.int,
|
||||||
|
levely: c.int,
|
||||||
|
countx: ^i32,
|
||||||
|
county: ^i32) -> result_t ---
|
||||||
|
|
||||||
/** @brief Query the data sizes for a particular level in the specified part.
|
/** @brief Query the data sizes for a particular level in the specified part.
|
||||||
*
|
*
|
||||||
@@ -108,6 +121,21 @@ foreign lib {
|
|||||||
*/
|
*/
|
||||||
get_chunk_count :: proc(ctxt: const_context_t, part_index: c.int, out: ^i32) -> result_t ---
|
get_chunk_count :: proc(ctxt: const_context_t, part_index: c.int, out: ^i32) -> result_t ---
|
||||||
|
|
||||||
|
/** Return a pointer to the chunk table and the count
|
||||||
|
*
|
||||||
|
* TODO: consider removing this prior to release once C++ fully converted
|
||||||
|
*/
|
||||||
|
get_chunk_table :: proc(ctxt: const_context_t, part_index: c.int, table: [^][^]u64, count: ^i32) -> result_t ---
|
||||||
|
|
||||||
|
/** Return whether the chunk table for this part is completely written.
|
||||||
|
*
|
||||||
|
* This only validates that all the offsets are valid.
|
||||||
|
*
|
||||||
|
* return EXR_ERR_INCOMPLETE_CHUNK_TABLE when incomplete, EXR_ERR_SUCCESS
|
||||||
|
* if it appears ok, or another error if otherwise problematic
|
||||||
|
*/
|
||||||
|
exr_validate_chunk_table :: proc(ctxt: context_t, part_index: c.int) -> result_t ---
|
||||||
|
|
||||||
/** Return the number of scanlines chunks for this file part.
|
/** Return the number of scanlines chunks for this file part.
|
||||||
*
|
*
|
||||||
* When iterating over a scanline file, this may be an easier metric
|
* When iterating over a scanline file, this may be an easier metric
|
||||||
@@ -306,7 +334,7 @@ foreign lib {
|
|||||||
ptype: pixel_type_t,
|
ptype: pixel_type_t,
|
||||||
percept: perceptual_treatment_t,
|
percept: perceptual_treatment_t,
|
||||||
xsamp: i32,
|
xsamp: i32,
|
||||||
ysamp: i32) -> c.int ---
|
ysamp: i32) -> result_t ---
|
||||||
|
|
||||||
/** @brief Copy the channels from another source.
|
/** @brief Copy the channels from another source.
|
||||||
*
|
*
|
||||||
|
|||||||
Vendored
+4
-4
@@ -2423,7 +2423,7 @@ IFence1 :: struct #raw_union {
|
|||||||
using id3d12fence1_vtable: ^IFence1_VTable,
|
using id3d12fence1_vtable: ^IFence1_VTable,
|
||||||
}
|
}
|
||||||
IFence1_VTable :: struct {
|
IFence1_VTable :: struct {
|
||||||
#subtype id3d12fence_vtable: IFence_VTable,
|
using id3d12fence_vtable: IFence_VTable,
|
||||||
GetCreationFlags: proc "system" (this: ^IFence1) -> FENCE_FLAGS,
|
GetCreationFlags: proc "system" (this: ^IFence1) -> FENCE_FLAGS,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2456,14 +2456,14 @@ IDescriptorHeap_VTable :: struct {
|
|||||||
IQueryHeap_UUID_STRING :: "0d9658ae-ed45-469e-a61d-970ec583cab4"
|
IQueryHeap_UUID_STRING :: "0d9658ae-ed45-469e-a61d-970ec583cab4"
|
||||||
IQueryHeap_UUID := &IID{0x0d9658ae, 0xed45, 0x469e, {0xa6, 0x1d, 0x97, 0x0e, 0xc5, 0x83, 0xca, 0xb4}}
|
IQueryHeap_UUID := &IID{0x0d9658ae, 0xed45, 0x469e, {0xa6, 0x1d, 0x97, 0x0e, 0xc5, 0x83, 0xca, 0xb4}}
|
||||||
IQueryHeap :: struct {
|
IQueryHeap :: struct {
|
||||||
#subtype id3d12pageable: IPageable,
|
using id3d12pageable: IPageable,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ICommandSignature_UUID_STRING :: "c36a797c-ec80-4f0a-8985-a7b2475082d1"
|
ICommandSignature_UUID_STRING :: "c36a797c-ec80-4f0a-8985-a7b2475082d1"
|
||||||
ICommandSignature_UUID := &IID{0xc36a797c, 0xec80, 0x4f0a, {0x89, 0x85, 0xa7, 0xb2, 0x47, 0x50, 0x82, 0xd1}}
|
ICommandSignature_UUID := &IID{0xc36a797c, 0xec80, 0x4f0a, {0x89, 0x85, 0xa7, 0xb2, 0x47, 0x50, 0x82, 0xd1}}
|
||||||
ICommandSignature :: struct {
|
ICommandSignature :: struct {
|
||||||
#subtype id3d12pageable: IPageable,
|
using id3d12pageable: IPageable,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2921,7 +2921,7 @@ META_COMMAND_DESC :: struct {
|
|||||||
IStateObject_UUID_STRING :: "47016943-fca8-4594-93ea-af258b55346d"
|
IStateObject_UUID_STRING :: "47016943-fca8-4594-93ea-af258b55346d"
|
||||||
IStateObject_UUID := &IID{0x47016943, 0xfca8, 0x4594, {0x93, 0xea, 0xaf, 0x25, 0x8b, 0x55, 0x34, 0x6d}}
|
IStateObject_UUID := &IID{0x47016943, 0xfca8, 0x4594, {0x93, 0xea, 0xaf, 0x25, 0x8b, 0x55, 0x34, 0x6d}}
|
||||||
IStateObject :: struct #raw_union {
|
IStateObject :: struct #raw_union {
|
||||||
#subtype id3d12pageable: IPageable,
|
using id3d12pageable: IPageable,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Vendored
+1714
-743
File diff suppressed because it is too large
Load Diff
Vendored
+18
@@ -0,0 +1,18 @@
|
|||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
+2111
File diff suppressed because it is too large
Load Diff
Vendored
+90
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main include header for the SDL library, version 3.2.0
|
||||||
|
*
|
||||||
|
* It is almost always best to include just this one header instead of
|
||||||
|
* picking out individual headers included here. There are exceptions to
|
||||||
|
* this rule--SDL_main.h is special and not included here--but usually
|
||||||
|
* letting SDL.h include the kitchen sink for you is the correct approach.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_h_
|
||||||
|
#define SDL_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_assert.h>
|
||||||
|
#include <SDL3/SDL_asyncio.h>
|
||||||
|
#include <SDL3/SDL_atomic.h>
|
||||||
|
#include <SDL3/SDL_audio.h>
|
||||||
|
#include <SDL3/SDL_bits.h>
|
||||||
|
#include <SDL3/SDL_blendmode.h>
|
||||||
|
#include <SDL3/SDL_camera.h>
|
||||||
|
#include <SDL3/SDL_clipboard.h>
|
||||||
|
#include <SDL3/SDL_cpuinfo.h>
|
||||||
|
#include <SDL3/SDL_dialog.h>
|
||||||
|
#include <SDL3/SDL_endian.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_events.h>
|
||||||
|
#include <SDL3/SDL_filesystem.h>
|
||||||
|
#include <SDL3/SDL_gamepad.h>
|
||||||
|
#include <SDL3/SDL_gpu.h>
|
||||||
|
#include <SDL3/SDL_guid.h>
|
||||||
|
#include <SDL3/SDL_haptic.h>
|
||||||
|
#include <SDL3/SDL_hidapi.h>
|
||||||
|
#include <SDL3/SDL_hints.h>
|
||||||
|
#include <SDL3/SDL_init.h>
|
||||||
|
#include <SDL3/SDL_iostream.h>
|
||||||
|
#include <SDL3/SDL_joystick.h>
|
||||||
|
#include <SDL3/SDL_keyboard.h>
|
||||||
|
#include <SDL3/SDL_keycode.h>
|
||||||
|
#include <SDL3/SDL_loadso.h>
|
||||||
|
#include <SDL3/SDL_locale.h>
|
||||||
|
#include <SDL3/SDL_log.h>
|
||||||
|
#include <SDL3/SDL_messagebox.h>
|
||||||
|
#include <SDL3/SDL_metal.h>
|
||||||
|
#include <SDL3/SDL_misc.h>
|
||||||
|
#include <SDL3/SDL_mouse.h>
|
||||||
|
#include <SDL3/SDL_mutex.h>
|
||||||
|
#include <SDL3/SDL_pen.h>
|
||||||
|
#include <SDL3/SDL_pixels.h>
|
||||||
|
#include <SDL3/SDL_platform.h>
|
||||||
|
#include <SDL3/SDL_power.h>
|
||||||
|
#include <SDL3/SDL_process.h>
|
||||||
|
#include <SDL3/SDL_properties.h>
|
||||||
|
#include <SDL3/SDL_rect.h>
|
||||||
|
#include <SDL3/SDL_render.h>
|
||||||
|
#include <SDL3/SDL_scancode.h>
|
||||||
|
#include <SDL3/SDL_sensor.h>
|
||||||
|
#include <SDL3/SDL_storage.h>
|
||||||
|
#include <SDL3/SDL_surface.h>
|
||||||
|
#include <SDL3/SDL_system.h>
|
||||||
|
#include <SDL3/SDL_thread.h>
|
||||||
|
#include <SDL3/SDL_time.h>
|
||||||
|
#include <SDL3/SDL_timer.h>
|
||||||
|
#include <SDL3/SDL_tray.h>
|
||||||
|
#include <SDL3/SDL_touch.h>
|
||||||
|
#include <SDL3/SDL_version.h>
|
||||||
|
#include <SDL3/SDL_video.h>
|
||||||
|
#include <SDL3/SDL_oldnames.h>
|
||||||
|
|
||||||
|
#endif /* SDL_h_ */
|
||||||
Vendored
+660
@@ -0,0 +1,660 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryAssert
|
||||||
|
*
|
||||||
|
* A helpful assertion macro!
|
||||||
|
*
|
||||||
|
* SDL assertions operate like your usual `assert` macro, but with some added
|
||||||
|
* features:
|
||||||
|
*
|
||||||
|
* - It uses a trick with the `sizeof` operator, so disabled assertions
|
||||||
|
* vaporize out of the compiled code, but variables only referenced in the
|
||||||
|
* assertion won't trigger compiler warnings about being unused.
|
||||||
|
* - It is safe to use with a dangling-else: `if (x) SDL_assert(y); else
|
||||||
|
* do_something();`
|
||||||
|
* - It works the same everywhere, instead of counting on various platforms'
|
||||||
|
* compiler and C runtime to behave.
|
||||||
|
* - It provides multiple levels of assertion (SDL_assert, SDL_assert_release,
|
||||||
|
* SDL_assert_paranoid) instead of a single all-or-nothing option.
|
||||||
|
* - It offers a variety of responses when an assertion fails (retry, trigger
|
||||||
|
* the debugger, abort the program, ignore the failure once, ignore it for
|
||||||
|
* the rest of the program's run).
|
||||||
|
* - It tries to show the user a dialog by default, if possible, but the app
|
||||||
|
* can provide a callback to handle assertion failures however they like.
|
||||||
|
* - It lets failed assertions be retried. Perhaps you had a network failure
|
||||||
|
* and just want to retry the test after plugging your network cable back
|
||||||
|
* in? You can.
|
||||||
|
* - It lets the user ignore an assertion failure, if there's a harmless
|
||||||
|
* problem that one can continue past.
|
||||||
|
* - It lets the user mark an assertion as ignored for the rest of the
|
||||||
|
* program's run; if there's a harmless problem that keeps popping up.
|
||||||
|
* - It provides statistics and data on all failed assertions to the app.
|
||||||
|
* - It allows the default assertion handler to be controlled with environment
|
||||||
|
* variables, in case an automated script needs to control it.
|
||||||
|
* - It can be used as an aid to Clang's static analysis; it will treat SDL
|
||||||
|
* assertions as universally true (under the assumption that you are serious
|
||||||
|
* about the asserted claims and that your debug builds will detect when
|
||||||
|
* these claims were wrong). This can help the analyzer avoid false
|
||||||
|
* positives.
|
||||||
|
*
|
||||||
|
* To use it: compile a debug build and just sprinkle around tests to check
|
||||||
|
* your code!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_assert_h_
|
||||||
|
#define SDL_assert_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The level of assertion aggressiveness.
|
||||||
|
*
|
||||||
|
* This value changes depending on compiler options and other preprocessor
|
||||||
|
* defines.
|
||||||
|
*
|
||||||
|
* It is currently one of the following values, but future SDL releases might
|
||||||
|
* add more:
|
||||||
|
*
|
||||||
|
* - 0: All SDL assertion macros are disabled.
|
||||||
|
* - 1: Release settings: SDL_assert disabled, SDL_assert_release enabled.
|
||||||
|
* - 2: Debug settings: SDL_assert and SDL_assert_release enabled.
|
||||||
|
* - 3: Paranoid settings: All SDL assertion macros enabled, including
|
||||||
|
* SDL_assert_paranoid.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_ASSERT_LEVEL SomeNumberBasedOnVariousFactors
|
||||||
|
|
||||||
|
#elif !defined(SDL_ASSERT_LEVEL)
|
||||||
|
#ifdef SDL_DEFAULT_ASSERT_LEVEL
|
||||||
|
#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL
|
||||||
|
#elif defined(_DEBUG) || defined(DEBUG) || \
|
||||||
|
(defined(__GNUC__) && !defined(__OPTIMIZE__))
|
||||||
|
#define SDL_ASSERT_LEVEL 2
|
||||||
|
#else
|
||||||
|
#define SDL_ASSERT_LEVEL 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to tell an attached debugger to pause.
|
||||||
|
*
|
||||||
|
* This allows an app to programmatically halt ("break") the debugger as if it
|
||||||
|
* had hit a breakpoint, allowing the developer to examine program state, etc.
|
||||||
|
*
|
||||||
|
* This is a macro--not a function--so that the debugger breaks on the source
|
||||||
|
* code line that used SDL_TriggerBreakpoint and not in some random guts of
|
||||||
|
* SDL. SDL_assert uses this macro for the same reason.
|
||||||
|
*
|
||||||
|
* If the program is not running under a debugger, SDL_TriggerBreakpoint will
|
||||||
|
* likely terminate the app, possibly without warning. If the current platform
|
||||||
|
* isn't supported, this macro is left undefined.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) && _MSC_VER >= 1310
|
||||||
|
/* Don't include intrin.h here because it contains C++ code */
|
||||||
|
extern void __cdecl __debugbreak(void);
|
||||||
|
#define SDL_TriggerBreakpoint() __debugbreak()
|
||||||
|
#elif defined(_MSC_VER) && defined(_M_IX86)
|
||||||
|
#define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
|
||||||
|
#elif defined(ANDROID)
|
||||||
|
#include <assert.h>
|
||||||
|
#define SDL_TriggerBreakpoint() assert(0)
|
||||||
|
#elif SDL_HAS_BUILTIN(__builtin_debugtrap)
|
||||||
|
#define SDL_TriggerBreakpoint() __builtin_debugtrap()
|
||||||
|
#elif SDL_HAS_BUILTIN(__builtin_trap)
|
||||||
|
#define SDL_TriggerBreakpoint() __builtin_trap()
|
||||||
|
#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" )
|
||||||
|
#elif (defined(__GNUC__) || defined(__clang__)) && defined(__riscv)
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "ebreak\n\t" )
|
||||||
|
#elif ( defined(SDL_PLATFORM_APPLE) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" )
|
||||||
|
#elif defined(SDL_PLATFORM_APPLE) && defined(__arm__)
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "bkpt #22\n\t" )
|
||||||
|
#elif defined(_WIN32) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__arm64__) || defined(__aarch64__)) )
|
||||||
|
#define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #0xF000\n\t" )
|
||||||
|
#elif defined(__386__) && defined(__WATCOMC__)
|
||||||
|
#define SDL_TriggerBreakpoint() { _asm { int 0x03 } }
|
||||||
|
#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__)
|
||||||
|
#include <signal.h>
|
||||||
|
#define SDL_TriggerBreakpoint() raise(SIGTRAP)
|
||||||
|
#else
|
||||||
|
/* SDL_TriggerBreakpoint is intentionally left undefined on unknown platforms. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro that reports the current function being compiled.
|
||||||
|
*
|
||||||
|
* If SDL can't figure how the compiler reports this, it will use "???".
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_FUNCTION __FUNCTION__
|
||||||
|
|
||||||
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */
|
||||||
|
# define SDL_FUNCTION __func__
|
||||||
|
#elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__))
|
||||||
|
# define SDL_FUNCTION __FUNCTION__
|
||||||
|
#else
|
||||||
|
# define SDL_FUNCTION "???"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro that reports the current file being compiled.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_FILE __FILE__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro that reports the current line number of the file being compiled.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_LINE __LINE__
|
||||||
|
|
||||||
|
/*
|
||||||
|
sizeof (x) makes the compiler still parse the expression even without
|
||||||
|
assertions enabled, so the code is always checked at compile time, but
|
||||||
|
doesn't actually generate code for it, so there are no side effects or
|
||||||
|
expensive checks at run time, just the constant size of what x WOULD be,
|
||||||
|
which presumably gets optimized out as unused.
|
||||||
|
This also solves the problem of...
|
||||||
|
|
||||||
|
int somevalue = blah();
|
||||||
|
SDL_assert(somevalue == 1);
|
||||||
|
|
||||||
|
...which would cause compiles to complain that somevalue is unused if we
|
||||||
|
disable assertions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro for wrapping code in `do {} while (0);` without compiler warnings.
|
||||||
|
*
|
||||||
|
* Visual Studio with really aggressive warnings enabled needs this to avoid
|
||||||
|
* compiler complaints.
|
||||||
|
*
|
||||||
|
* the `do {} while (0);` trick is useful for wrapping code in a macro that
|
||||||
|
* may or may not be a single statement, to avoid various C language
|
||||||
|
* accidents.
|
||||||
|
*
|
||||||
|
* To use:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* do { SomethingOnce(); } while (SDL_NULL_WHILE_LOOP_CONDITION (0));
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_NULL_WHILE_LOOP_CONDITION (0)
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) /* Avoid /W4 warnings. */
|
||||||
|
/* "while (0,0)" fools Microsoft's compiler's /W4 warning level into thinking
|
||||||
|
this condition isn't constant. And looks like an owl's face! */
|
||||||
|
#define SDL_NULL_WHILE_LOOP_CONDITION (0,0)
|
||||||
|
#else
|
||||||
|
#define SDL_NULL_WHILE_LOOP_CONDITION (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The macro used when an assertion is disabled.
|
||||||
|
*
|
||||||
|
* This isn't for direct use by apps, but this is the code that is inserted
|
||||||
|
* when an SDL_assert is disabled (perhaps in a release build).
|
||||||
|
*
|
||||||
|
* The code does nothing, but wraps `condition` in a sizeof operator, which
|
||||||
|
* generates no code and has no side effects, but avoid compiler warnings
|
||||||
|
* about unused variables.
|
||||||
|
*
|
||||||
|
* \param condition the condition to assert (but not actually run here).
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_disabled_assert(condition) \
|
||||||
|
do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible outcomes from a triggered assertion.
|
||||||
|
*
|
||||||
|
* When an enabled assertion triggers, it may call the assertion handler
|
||||||
|
* (possibly one provided by the app via SDL_SetAssertionHandler), which will
|
||||||
|
* return one of these values, possibly after asking the user.
|
||||||
|
*
|
||||||
|
* Then SDL will respond based on this outcome (loop around to retry the
|
||||||
|
* condition, try to break in a debugger, kill the program, or ignore the
|
||||||
|
* problem).
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_AssertState
|
||||||
|
{
|
||||||
|
SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */
|
||||||
|
SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */
|
||||||
|
SDL_ASSERTION_ABORT, /**< Terminate the program. */
|
||||||
|
SDL_ASSERTION_IGNORE, /**< Ignore the assert. */
|
||||||
|
SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */
|
||||||
|
} SDL_AssertState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about an assertion failure.
|
||||||
|
*
|
||||||
|
* This structure is filled in with information about a triggered assertion,
|
||||||
|
* used by the assertion handler, then added to the assertion report. This is
|
||||||
|
* returned as a linked list from SDL_GetAssertionReport().
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AssertData
|
||||||
|
{
|
||||||
|
bool always_ignore; /**< true if app should always continue when assertion is triggered. */
|
||||||
|
unsigned int trigger_count; /**< Number of times this assertion has been triggered. */
|
||||||
|
const char *condition; /**< A string of this assert's test code. */
|
||||||
|
const char *filename; /**< The source file where this assert lives. */
|
||||||
|
int linenum; /**< The line in `filename` where this assert lives. */
|
||||||
|
const char *function; /**< The name of the function where this assert lives. */
|
||||||
|
const struct SDL_AssertData *next; /**< next item in the linked list. */
|
||||||
|
} SDL_AssertData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Never call this directly.
|
||||||
|
*
|
||||||
|
* Use the SDL_assert macros instead.
|
||||||
|
*
|
||||||
|
* \param data assert data structure.
|
||||||
|
* \param func function name.
|
||||||
|
* \param file file name.
|
||||||
|
* \param line line number.
|
||||||
|
* \returns assert state.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *data,
|
||||||
|
const char *func,
|
||||||
|
const char *file, int line) SDL_ANALYZER_NORETURN;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The macro used when an assertion triggers a breakpoint.
|
||||||
|
*
|
||||||
|
* This isn't for direct use by apps; use SDL_assert or SDL_TriggerBreakpoint
|
||||||
|
* instead.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_AssertBreakpoint() SDL_TriggerBreakpoint()
|
||||||
|
|
||||||
|
#elif !defined(SDL_AssertBreakpoint)
|
||||||
|
# if defined(ANDROID) && defined(assert)
|
||||||
|
/* Define this as empty in case assert() is defined as SDL_assert */
|
||||||
|
# define SDL_AssertBreakpoint()
|
||||||
|
# else
|
||||||
|
# define SDL_AssertBreakpoint() SDL_TriggerBreakpoint()
|
||||||
|
# endif
|
||||||
|
#endif /* !SDL_AssertBreakpoint */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The macro used when an assertion is enabled.
|
||||||
|
*
|
||||||
|
* This isn't for direct use by apps, but this is the code that is inserted
|
||||||
|
* when an SDL_assert is enabled.
|
||||||
|
*
|
||||||
|
* The `do {} while(0)` avoids dangling else problems:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* if (x) SDL_assert(y); else blah();
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* ... without the do/while, the "else" could attach to this macro's "if". We
|
||||||
|
* try to handle just the minimum we need here in a macro...the loop, the
|
||||||
|
* static vars, and break points. The heavy lifting is handled in
|
||||||
|
* SDL_ReportAssertion().
|
||||||
|
*
|
||||||
|
* \param condition the condition to assert.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_enabled_assert(condition) \
|
||||||
|
do { \
|
||||||
|
while ( !(condition) ) { \
|
||||||
|
static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \
|
||||||
|
const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
|
||||||
|
if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
|
||||||
|
continue; /* go again. */ \
|
||||||
|
} else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \
|
||||||
|
SDL_AssertBreakpoint(); \
|
||||||
|
} \
|
||||||
|
break; /* not retrying. */ \
|
||||||
|
} \
|
||||||
|
} while (SDL_NULL_WHILE_LOOP_CONDITION)
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An assertion test that is normally performed only in debug builds.
|
||||||
|
*
|
||||||
|
* This macro is enabled when the SDL_ASSERT_LEVEL is >= 2, otherwise it is
|
||||||
|
* disabled. This is meant to only do these tests in debug builds, so they can
|
||||||
|
* tend to be more expensive, and they are meant to bring everything to a halt
|
||||||
|
* when they fail, with the programmer there to assess the problem.
|
||||||
|
*
|
||||||
|
* In short: you can sprinkle these around liberally and assume they will
|
||||||
|
* evaporate out of the build when building for end-users.
|
||||||
|
*
|
||||||
|
* When assertions are disabled, this wraps `condition` in a `sizeof`
|
||||||
|
* operator, which means any function calls and side effects will not run, but
|
||||||
|
* the compiler will not complain about any otherwise-unused variables that
|
||||||
|
* are only referenced in the assertion.
|
||||||
|
*
|
||||||
|
* One can set the environment variable "SDL_ASSERT" to one of several strings
|
||||||
|
* ("abort", "break", "retry", "ignore", "always_ignore") to force a default
|
||||||
|
* behavior, which may be desirable for automation purposes. If your platform
|
||||||
|
* requires GUI interfaces to happen on the main thread but you're debugging
|
||||||
|
* an assertion in a background thread, it might be desirable to set this to
|
||||||
|
* "break" so that your debugger takes control as soon as assert is triggered,
|
||||||
|
* instead of risking a bad UI interaction (deadlock, etc) in the application.
|
||||||
|
*
|
||||||
|
* \param condition boolean value to test.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_assert(condition) if (assertion_enabled && (condition)) { trigger_assertion; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An assertion test that is performed even in release builds.
|
||||||
|
*
|
||||||
|
* This macro is enabled when the SDL_ASSERT_LEVEL is >= 1, otherwise it is
|
||||||
|
* disabled. This is meant to be for tests that are cheap to make and
|
||||||
|
* extremely unlikely to fail; generally it is frowned upon to have an
|
||||||
|
* assertion failure in a release build, so these assertions generally need to
|
||||||
|
* be of more than life-and-death importance if there's a chance they might
|
||||||
|
* trigger. You should almost always consider handling these cases more
|
||||||
|
* gracefully than an assert allows.
|
||||||
|
*
|
||||||
|
* When assertions are disabled, this wraps `condition` in a `sizeof`
|
||||||
|
* operator, which means any function calls and side effects will not run, but
|
||||||
|
* the compiler will not complain about any otherwise-unused variables that
|
||||||
|
* are only referenced in the assertion.
|
||||||
|
*
|
||||||
|
* One can set the environment variable "SDL_ASSERT" to one of several strings
|
||||||
|
* ("abort", "break", "retry", "ignore", "always_ignore") to force a default
|
||||||
|
* behavior, which may be desirable for automation purposes. If your platform
|
||||||
|
* requires GUI interfaces to happen on the main thread but you're debugging
|
||||||
|
* an assertion in a background thread, it might be desirable to set this to
|
||||||
|
* "break" so that your debugger takes control as soon as assert is triggered,
|
||||||
|
* instead of risking a bad UI interaction (deadlock, etc) in the application.
|
||||||
|
* *
|
||||||
|
*
|
||||||
|
* \param condition boolean value to test.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_assert_release(condition) SDL_disabled_assert(condition)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An assertion test that is performed only when built with paranoid settings.
|
||||||
|
*
|
||||||
|
* This macro is enabled when the SDL_ASSERT_LEVEL is >= 3, otherwise it is
|
||||||
|
* disabled. This is a higher level than both release and debug, so these
|
||||||
|
* tests are meant to be expensive and only run when specifically looking for
|
||||||
|
* extremely unexpected failure cases in a special build.
|
||||||
|
*
|
||||||
|
* When assertions are disabled, this wraps `condition` in a `sizeof`
|
||||||
|
* operator, which means any function calls and side effects will not run, but
|
||||||
|
* the compiler will not complain about any otherwise-unused variables that
|
||||||
|
* are only referenced in the assertion.
|
||||||
|
*
|
||||||
|
* One can set the environment variable "SDL_ASSERT" to one of several strings
|
||||||
|
* ("abort", "break", "retry", "ignore", "always_ignore") to force a default
|
||||||
|
* behavior, which may be desirable for automation purposes. If your platform
|
||||||
|
* requires GUI interfaces to happen on the main thread but you're debugging
|
||||||
|
* an assertion in a background thread, it might be desirable to set this to
|
||||||
|
* "break" so that your debugger takes control as soon as assert is triggered,
|
||||||
|
* instead of risking a bad UI interaction (deadlock, etc) in the application.
|
||||||
|
*
|
||||||
|
* \param condition boolean value to test.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
|
||||||
|
|
||||||
|
/* Enable various levels of assertions. */
|
||||||
|
#elif SDL_ASSERT_LEVEL == 0 /* assertions disabled */
|
||||||
|
# define SDL_assert(condition) SDL_disabled_assert(condition)
|
||||||
|
# define SDL_assert_release(condition) SDL_disabled_assert(condition)
|
||||||
|
# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
|
||||||
|
#elif SDL_ASSERT_LEVEL == 1 /* release settings. */
|
||||||
|
# define SDL_assert(condition) SDL_disabled_assert(condition)
|
||||||
|
# define SDL_assert_release(condition) SDL_enabled_assert(condition)
|
||||||
|
# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
|
||||||
|
#elif SDL_ASSERT_LEVEL == 2 /* debug settings. */
|
||||||
|
# define SDL_assert(condition) SDL_enabled_assert(condition)
|
||||||
|
# define SDL_assert_release(condition) SDL_enabled_assert(condition)
|
||||||
|
# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition)
|
||||||
|
#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */
|
||||||
|
# define SDL_assert(condition) SDL_enabled_assert(condition)
|
||||||
|
# define SDL_assert_release(condition) SDL_enabled_assert(condition)
|
||||||
|
# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition)
|
||||||
|
#else
|
||||||
|
# error Unknown assertion level.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An assertion test that is always performed.
|
||||||
|
*
|
||||||
|
* This macro is always enabled no matter what SDL_ASSERT_LEVEL is set to. You
|
||||||
|
* almost never want to use this, as it could trigger on an end-user's system,
|
||||||
|
* crashing your program.
|
||||||
|
*
|
||||||
|
* One can set the environment variable "SDL_ASSERT" to one of several strings
|
||||||
|
* ("abort", "break", "retry", "ignore", "always_ignore") to force a default
|
||||||
|
* behavior, which may be desirable for automation purposes. If your platform
|
||||||
|
* requires GUI interfaces to happen on the main thread but you're debugging
|
||||||
|
* an assertion in a background thread, it might be desirable to set this to
|
||||||
|
* "break" so that your debugger takes control as soon as assert is triggered,
|
||||||
|
* instead of risking a bad UI interaction (deadlock, etc) in the application.
|
||||||
|
*
|
||||||
|
* \param condition boolean value to test.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_assert_always(condition) SDL_enabled_assert(condition)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A callback that fires when an SDL assertion fails.
|
||||||
|
*
|
||||||
|
* \param data a pointer to the SDL_AssertData structure corresponding to the
|
||||||
|
* current assertion.
|
||||||
|
* \param userdata what was passed as `userdata` to SDL_SetAssertionHandler().
|
||||||
|
* \returns an SDL_AssertState value indicating how to handle the failure.
|
||||||
|
*
|
||||||
|
* \threadsafety This callback may be called from any thread that triggers an
|
||||||
|
* assert at any time.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)(
|
||||||
|
const SDL_AssertData *data, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an application-defined assertion handler.
|
||||||
|
*
|
||||||
|
* This function allows an application to show its own assertion UI and/or
|
||||||
|
* force the response to an assertion failure. If the application doesn't
|
||||||
|
* provide this, SDL will try to do the right thing, popping up a
|
||||||
|
* system-specific GUI dialog, and probably minimizing any fullscreen windows.
|
||||||
|
*
|
||||||
|
* This callback may fire from any thread, but it runs wrapped in a mutex, so
|
||||||
|
* it will only fire from one thread at a time.
|
||||||
|
*
|
||||||
|
* This callback is NOT reset to SDL's internal handler upon SDL_Quit()!
|
||||||
|
*
|
||||||
|
* \param handler the SDL_AssertionHandler function to call when an assertion
|
||||||
|
* fails or NULL for the default handler.
|
||||||
|
* \param userdata a pointer that is passed to `handler`.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAssertionHandler
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetAssertionHandler(
|
||||||
|
SDL_AssertionHandler handler,
|
||||||
|
void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default assertion handler.
|
||||||
|
*
|
||||||
|
* This returns the function pointer that is called by default when an
|
||||||
|
* assertion is triggered. This is an internal function provided by SDL, that
|
||||||
|
* is used for assertions when SDL_SetAssertionHandler() hasn't been used to
|
||||||
|
* provide a different function.
|
||||||
|
*
|
||||||
|
* \returns the default SDL_AssertionHandler that is called when an assert
|
||||||
|
* triggers.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAssertionHandler
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current assertion handler.
|
||||||
|
*
|
||||||
|
* This returns the function pointer that is called when an assertion is
|
||||||
|
* triggered. This is either the value last passed to
|
||||||
|
* SDL_SetAssertionHandler(), or if no application-specified function is set,
|
||||||
|
* is equivalent to calling SDL_GetDefaultAssertionHandler().
|
||||||
|
*
|
||||||
|
* The parameter `puserdata` is a pointer to a void*, which will store the
|
||||||
|
* "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value
|
||||||
|
* will always be NULL for the default handler. If you don't care about this
|
||||||
|
* data, it is safe to pass a NULL pointer to this function to ignore it.
|
||||||
|
*
|
||||||
|
* \param puserdata pointer which is filled with the "userdata" pointer that
|
||||||
|
* was passed to SDL_SetAssertionHandler().
|
||||||
|
* \returns the SDL_AssertionHandler that is called when an assert triggers.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAssertionHandler
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of all assertion failures.
|
||||||
|
*
|
||||||
|
* This function gets all assertions triggered since the last call to
|
||||||
|
* SDL_ResetAssertionReport(), or the start of the program.
|
||||||
|
*
|
||||||
|
* The proper way to examine this data looks something like this:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* const SDL_AssertData *item = SDL_GetAssertionReport();
|
||||||
|
* while (item) {
|
||||||
|
* printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n",
|
||||||
|
* item->condition, item->function, item->filename,
|
||||||
|
* item->linenum, item->trigger_count,
|
||||||
|
* item->always_ignore ? "yes" : "no");
|
||||||
|
* item = item->next;
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \returns a list of all failed assertions or NULL if the list is empty. This
|
||||||
|
* memory should not be modified or freed by the application. This
|
||||||
|
* pointer remains valid until the next call to SDL_Quit() or
|
||||||
|
* SDL_ResetAssertionReport().
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe. Other threads calling
|
||||||
|
* SDL_ResetAssertionReport() simultaneously, may render the
|
||||||
|
* returned pointer invalid.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ResetAssertionReport
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the list of all assertion failures.
|
||||||
|
*
|
||||||
|
* This function will clear the list of all assertions triggered up to that
|
||||||
|
* point. Immediately following this call, SDL_GetAssertionReport will return
|
||||||
|
* no items. In addition, any previously-triggered assertions will be reset to
|
||||||
|
* a trigger_count of zero, and their always_ignore state will be false.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe. Other threads triggering an
|
||||||
|
* assertion, or simultaneously calling this function may cause
|
||||||
|
* memory leaks or crashes.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAssertionReport
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ResetAssertionReport(void);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_assert_h_ */
|
||||||
Vendored
+546
@@ -0,0 +1,546 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: AsyncIO */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryAsyncIO
|
||||||
|
*
|
||||||
|
* SDL offers a way to perform I/O asynchronously. This allows an app to read
|
||||||
|
* or write files without waiting for data to actually transfer; the functions
|
||||||
|
* that request I/O never block while the request is fulfilled.
|
||||||
|
*
|
||||||
|
* Instead, the data moves in the background and the app can check for results
|
||||||
|
* at their leisure.
|
||||||
|
*
|
||||||
|
* This is more complicated than just reading and writing files in a
|
||||||
|
* synchronous way, but it can allow for more efficiency, and never having
|
||||||
|
* framerate drops as the hard drive catches up, etc.
|
||||||
|
*
|
||||||
|
* The general usage pattern for async I/O is:
|
||||||
|
*
|
||||||
|
* - Create one or more SDL_AsyncIOQueue objects.
|
||||||
|
* - Open files with SDL_AsyncIOFromFile.
|
||||||
|
* - Start I/O tasks to the files with SDL_ReadAsyncIO or SDL_WriteAsyncIO,
|
||||||
|
* putting those tasks into one of the queues.
|
||||||
|
* - Later on, use SDL_GetAsyncIOResult on a queue to see if any task is
|
||||||
|
* finished without blocking. Tasks might finish in any order with success
|
||||||
|
* or failure.
|
||||||
|
* - When all your tasks are done, close the file with SDL_CloseAsyncIO. This
|
||||||
|
* also generates a task, since it might flush data to disk!
|
||||||
|
*
|
||||||
|
* This all works, without blocking, in a single thread, but one can also wait
|
||||||
|
* on a queue in a background thread, sleeping until new results have arrived:
|
||||||
|
*
|
||||||
|
* - Call SDL_WaitAsyncIOResult from one or more threads to efficiently block
|
||||||
|
* until new tasks complete.
|
||||||
|
* - When shutting down, call SDL_SignalAsyncIOQueue to unblock any sleeping
|
||||||
|
* threads despite there being no new tasks completed.
|
||||||
|
*
|
||||||
|
* And, of course, to match the synchronous SDL_LoadFile, we offer
|
||||||
|
* SDL_LoadFileAsync as a convenience function. This will handle allocating a
|
||||||
|
* buffer, slurping in the file data, and null-terminating it; you still check
|
||||||
|
* for results later.
|
||||||
|
*
|
||||||
|
* Behind the scenes, SDL will use newer, efficient APIs on platforms that
|
||||||
|
* support them: Linux's io_uring and Windows 11's IoRing, for example. If
|
||||||
|
* those technologies aren't available, SDL will offload the work to a thread
|
||||||
|
* pool that will manage otherwise-synchronous loads without blocking the app.
|
||||||
|
*
|
||||||
|
* ## Best Practices
|
||||||
|
*
|
||||||
|
* Simple non-blocking I/O--for an app that just wants to pick up data
|
||||||
|
* whenever it's ready without losing framerate waiting on disks to spin--can
|
||||||
|
* use whatever pattern works well for the program. In this case, simply call
|
||||||
|
* SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call
|
||||||
|
* SDL_GetAsyncIOResult to check for any completed tasks and deal with the
|
||||||
|
* data as it arrives.
|
||||||
|
*
|
||||||
|
* If two separate pieces of the same program need their own I/O, it is legal
|
||||||
|
* for each to create their own queue. This will prevent either piece from
|
||||||
|
* accidentally consuming the other's completed tasks. Each queue does require
|
||||||
|
* some amount of resources, but it is not an overwhelming cost. Do not make a
|
||||||
|
* queue for each task, however. It is better to put many tasks into a single
|
||||||
|
* queue. They will be reported in order of completion, not in the order they
|
||||||
|
* were submitted, so it doesn't generally matter what order tasks are
|
||||||
|
* started.
|
||||||
|
*
|
||||||
|
* One async I/O queue can be shared by multiple threads, or one thread can
|
||||||
|
* have more than one queue, but the most efficient way--if ruthless
|
||||||
|
* efficiency is the goal--is to have one queue per thread, with multiple
|
||||||
|
* threads working in parallel, and attempt to keep each queue loaded with
|
||||||
|
* tasks that are both started by and consumed by the same thread. On modern
|
||||||
|
* platforms that can use newer interfaces, this can keep data flowing as
|
||||||
|
* efficiently as possible all the way from storage hardware to the app, with
|
||||||
|
* no contention between threads for access to the same queue.
|
||||||
|
*
|
||||||
|
* Written data is not guaranteed to make it to physical media by the time a
|
||||||
|
* closing task is completed, unless SDL_CloseAsyncIO is called with its
|
||||||
|
* `flush` parameter set to true, which is to say that a successful result
|
||||||
|
* here can still result in lost data during an unfortunately-timed power
|
||||||
|
* outage if not flushed. However, flushing will take longer and may be
|
||||||
|
* unnecessary, depending on the app's needs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_asyncio_h_
|
||||||
|
#define SDL_asyncio_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The asynchronous I/O operation structure.
|
||||||
|
*
|
||||||
|
* This operates as an opaque handle. One can then request read or write
|
||||||
|
* operations on it.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AsyncIOFromFile
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AsyncIO SDL_AsyncIO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of asynchronous I/O tasks.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_AsyncIOTaskType
|
||||||
|
{
|
||||||
|
SDL_ASYNCIO_TASK_READ, /**< A read operation. */
|
||||||
|
SDL_ASYNCIO_TASK_WRITE, /**< A write operation. */
|
||||||
|
SDL_ASYNCIO_TASK_CLOSE /**< A close operation. */
|
||||||
|
} SDL_AsyncIOTaskType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible outcomes of an asynchronous I/O task.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_AsyncIOResult
|
||||||
|
{
|
||||||
|
SDL_ASYNCIO_COMPLETE, /**< request was completed without error */
|
||||||
|
SDL_ASYNCIO_FAILURE, /**< request failed for some reason; check SDL_GetError()! */
|
||||||
|
SDL_ASYNCIO_CANCELED /**< request was canceled before completing. */
|
||||||
|
} SDL_AsyncIOResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about a completed asynchronous I/O request.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AsyncIOOutcome
|
||||||
|
{
|
||||||
|
SDL_AsyncIO *asyncio; /**< what generated this task. This pointer will be invalid if it was closed! */
|
||||||
|
SDL_AsyncIOTaskType type; /**< What sort of task was this? Read, write, etc? */
|
||||||
|
SDL_AsyncIOResult result; /**< the result of the work (success, failure, cancellation). */
|
||||||
|
void *buffer; /**< buffer where data was read/written. */
|
||||||
|
Uint64 offset; /**< offset in the SDL_AsyncIO where data was read/written. */
|
||||||
|
Uint64 bytes_requested; /**< number of bytes the task was to read/write. */
|
||||||
|
Uint64 bytes_transferred; /**< actual number of bytes that were read/written. */
|
||||||
|
void *userdata; /**< pointer provided by the app when starting the task */
|
||||||
|
} SDL_AsyncIOOutcome;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A queue of completed asynchronous I/O tasks.
|
||||||
|
*
|
||||||
|
* When starting an asynchronous operation, you specify a queue for the new
|
||||||
|
* task. A queue can be asked later if any tasks in it have completed,
|
||||||
|
* allowing an app to manage multiple pending tasks in one place, in whatever
|
||||||
|
* order they complete.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CreateAsyncIOQueue
|
||||||
|
* \sa SDL_ReadAsyncIO
|
||||||
|
* \sa SDL_WriteAsyncIO
|
||||||
|
* \sa SDL_GetAsyncIOResult
|
||||||
|
* \sa SDL_WaitAsyncIOResult
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AsyncIOQueue SDL_AsyncIOQueue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this function to create a new SDL_AsyncIO object for reading from
|
||||||
|
* and/or writing to a named file.
|
||||||
|
*
|
||||||
|
* The `mode` string understands the following values:
|
||||||
|
*
|
||||||
|
* - "r": Open a file for reading only. It must exist.
|
||||||
|
* - "w": Open a file for writing only. It will create missing files or
|
||||||
|
* truncate existing ones.
|
||||||
|
* - "r+": Open a file for update both reading and writing. The file must
|
||||||
|
* exist.
|
||||||
|
* - "w+": Create an empty file for both reading and writing. If a file with
|
||||||
|
* the same name already exists its content is erased and the file is
|
||||||
|
* treated as a new empty file.
|
||||||
|
*
|
||||||
|
* There is no "b" mode, as there is only "binary" style I/O, and no "a" mode
|
||||||
|
* for appending, since you specify the position when starting a task.
|
||||||
|
*
|
||||||
|
* This function supports Unicode filenames, but they must be encoded in UTF-8
|
||||||
|
* format, regardless of the underlying operating system.
|
||||||
|
*
|
||||||
|
* This call is _not_ asynchronous; it will open the file before returning,
|
||||||
|
* under the assumption that doing so is generally a fast operation. Future
|
||||||
|
* reads and writes to the opened file will be async, however.
|
||||||
|
*
|
||||||
|
* \param file a UTF-8 string representing the filename to open.
|
||||||
|
* \param mode an ASCII string representing the mode to be used for opening
|
||||||
|
* the file.
|
||||||
|
* \returns a pointer to the SDL_AsyncIO structure that is created or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CloseAsyncIO
|
||||||
|
* \sa SDL_ReadAsyncIO
|
||||||
|
* \sa SDL_WriteAsyncIO
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_AsyncIO * SDLCALL SDL_AsyncIOFromFile(const char *file, const char *mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this function to get the size of the data stream in an SDL_AsyncIO.
|
||||||
|
*
|
||||||
|
* This call is _not_ asynchronous; it assumes that obtaining this info is a
|
||||||
|
* non-blocking operation in most reasonable cases.
|
||||||
|
*
|
||||||
|
* \param asyncio the SDL_AsyncIO to get the size of the data stream from.
|
||||||
|
* \returns the size of the data stream in the SDL_IOStream on success or a
|
||||||
|
* negative error code on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC Sint64 SDLCALL SDL_GetAsyncIOSize(SDL_AsyncIO *asyncio);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start an async read.
|
||||||
|
*
|
||||||
|
* This function reads up to `size` bytes from `offset` position in the data
|
||||||
|
* source to the area pointed at by `ptr`. This function may read less bytes
|
||||||
|
* than requested.
|
||||||
|
*
|
||||||
|
* This function returns as quickly as possible; it does not wait for the read
|
||||||
|
* to complete. On a successful return, this work will continue in the
|
||||||
|
* background. If the work begins, even failure is asynchronous: a failing
|
||||||
|
* return value from this function only means the work couldn't start at all.
|
||||||
|
*
|
||||||
|
* `ptr` must remain available until the work is done, and may be accessed by
|
||||||
|
* the system at any time until then. Do not allocate it on the stack, as this
|
||||||
|
* might take longer than the life of the calling function to complete!
|
||||||
|
*
|
||||||
|
* An SDL_AsyncIOQueue must be specified. The newly-created task will be added
|
||||||
|
* to it when it completes its work.
|
||||||
|
*
|
||||||
|
* \param asyncio a pointer to an SDL_AsyncIO structure.
|
||||||
|
* \param ptr a pointer to a buffer to read data into.
|
||||||
|
* \param offset the position to start reading in the data source.
|
||||||
|
* \param size the number of bytes to read from the data source.
|
||||||
|
* \param queue a queue to add the new SDL_AsyncIO to.
|
||||||
|
* \param userdata an app-defined pointer that will be provided with the task
|
||||||
|
* results.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_WriteAsyncIO
|
||||||
|
* \sa SDL_CreateAsyncIOQueue
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ReadAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start an async write.
|
||||||
|
*
|
||||||
|
* This function writes `size` bytes from `offset` position in the data source
|
||||||
|
* to the area pointed at by `ptr`.
|
||||||
|
*
|
||||||
|
* This function returns as quickly as possible; it does not wait for the
|
||||||
|
* write to complete. On a successful return, this work will continue in the
|
||||||
|
* background. If the work begins, even failure is asynchronous: a failing
|
||||||
|
* return value from this function only means the work couldn't start at all.
|
||||||
|
*
|
||||||
|
* `ptr` must remain available until the work is done, and may be accessed by
|
||||||
|
* the system at any time until then. Do not allocate it on the stack, as this
|
||||||
|
* might take longer than the life of the calling function to complete!
|
||||||
|
*
|
||||||
|
* An SDL_AsyncIOQueue must be specified. The newly-created task will be added
|
||||||
|
* to it when it completes its work.
|
||||||
|
*
|
||||||
|
* \param asyncio a pointer to an SDL_AsyncIO structure.
|
||||||
|
* \param ptr a pointer to a buffer to write data from.
|
||||||
|
* \param offset the position to start writing to the data source.
|
||||||
|
* \param size the number of bytes to write to the data source.
|
||||||
|
* \param queue a queue to add the new SDL_AsyncIO to.
|
||||||
|
* \param userdata an app-defined pointer that will be provided with the task
|
||||||
|
* results.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ReadAsyncIO
|
||||||
|
* \sa SDL_CreateAsyncIOQueue
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_WriteAsyncIO(SDL_AsyncIO *asyncio, void *ptr, Uint64 offset, Uint64 size, SDL_AsyncIOQueue *queue, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close and free any allocated resources for an async I/O object.
|
||||||
|
*
|
||||||
|
* Closing a file is _also_ an asynchronous task! If a write failure were to
|
||||||
|
* happen during the closing process, for example, the task results will
|
||||||
|
* report it as usual.
|
||||||
|
*
|
||||||
|
* Closing a file that has been written to does not guarantee the data has
|
||||||
|
* made it to physical media; it may remain in the operating system's file
|
||||||
|
* cache, for later writing to disk. This means that a successfully-closed
|
||||||
|
* file can be lost if the system crashes or loses power in this small window.
|
||||||
|
* To prevent this, call this function with the `flush` parameter set to true.
|
||||||
|
* This will make the operation take longer, and perhaps increase system load
|
||||||
|
* in general, but a successful result guarantees that the data has made it to
|
||||||
|
* physical storage. Don't use this for temporary files, caches, and
|
||||||
|
* unimportant data, and definitely use it for crucial irreplaceable files,
|
||||||
|
* like game saves.
|
||||||
|
*
|
||||||
|
* This function guarantees that the close will happen after any other pending
|
||||||
|
* tasks to `asyncio`, so it's safe to open a file, start several operations,
|
||||||
|
* close the file immediately, then check for all results later. This function
|
||||||
|
* will not block until the tasks have completed.
|
||||||
|
*
|
||||||
|
* Once this function returns true, `asyncio` is no longer valid, regardless
|
||||||
|
* of any future outcomes. Any completed tasks might still contain this
|
||||||
|
* pointer in their SDL_AsyncIOOutcome data, in case the app was using this
|
||||||
|
* value to track information, but it should not be used again.
|
||||||
|
*
|
||||||
|
* If this function returns false, the close wasn't started at all, and it's
|
||||||
|
* safe to attempt to close again later.
|
||||||
|
*
|
||||||
|
* An SDL_AsyncIOQueue must be specified. The newly-created task will be added
|
||||||
|
* to it when it completes its work.
|
||||||
|
*
|
||||||
|
* \param asyncio a pointer to an SDL_AsyncIO structure to close.
|
||||||
|
* \param flush true if data should sync to disk before the task completes.
|
||||||
|
* \param queue a queue to add the new SDL_AsyncIO to.
|
||||||
|
* \param userdata an app-defined pointer that will be provided with the task
|
||||||
|
* results.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread, but two
|
||||||
|
* threads should not attempt to close the same object.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CloseAsyncIO(SDL_AsyncIO *asyncio, bool flush, SDL_AsyncIOQueue *queue, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a task queue for tracking multiple I/O operations.
|
||||||
|
*
|
||||||
|
* Async I/O operations are assigned to a queue when started. The queue can be
|
||||||
|
* checked for completed tasks thereafter.
|
||||||
|
*
|
||||||
|
* \returns a new task queue object or NULL if there was an error; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DestroyAsyncIOQueue
|
||||||
|
* \sa SDL_GetAsyncIOResult
|
||||||
|
* \sa SDL_WaitAsyncIOResult
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_AsyncIOQueue * SDLCALL SDL_CreateAsyncIOQueue(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a previously-created async I/O task queue.
|
||||||
|
*
|
||||||
|
* If there are still tasks pending for this queue, this call will block until
|
||||||
|
* those tasks are finished. All those tasks will be deallocated. Their
|
||||||
|
* results will be lost to the app.
|
||||||
|
*
|
||||||
|
* Any pending reads from SDL_LoadFileAsync() that are still in this queue
|
||||||
|
* will have their buffers deallocated by this function, to prevent a memory
|
||||||
|
* leak.
|
||||||
|
*
|
||||||
|
* Once this function is called, the queue is no longer valid and should not
|
||||||
|
* be used, including by other threads that might access it while destruction
|
||||||
|
* is blocking on pending tasks.
|
||||||
|
*
|
||||||
|
* Do not destroy a queue that still has threads waiting on it through
|
||||||
|
* SDL_WaitAsyncIOResult(). You can call SDL_SignalAsyncIOQueue() first to
|
||||||
|
* unblock those threads, and take measures (such as SDL_WaitThread()) to make
|
||||||
|
* sure they have finished their wait and won't wait on the queue again.
|
||||||
|
*
|
||||||
|
* \param queue the task queue to destroy.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread, so long as
|
||||||
|
* no other thread is waiting on the queue with
|
||||||
|
* SDL_WaitAsyncIOResult.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_DestroyAsyncIOQueue(SDL_AsyncIOQueue *queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query an async I/O task queue for completed tasks.
|
||||||
|
*
|
||||||
|
* If a task assigned to this queue has finished, this will return true and
|
||||||
|
* fill in `outcome` with the details of the task. If no task in the queue has
|
||||||
|
* finished, this function will return false. This function does not block.
|
||||||
|
*
|
||||||
|
* If a task has completed, this function will free its resources and the task
|
||||||
|
* pointer will no longer be valid. The task will be removed from the queue.
|
||||||
|
*
|
||||||
|
* It is safe for multiple threads to call this function on the same queue at
|
||||||
|
* once; a completed task will only go to one of the threads.
|
||||||
|
*
|
||||||
|
* \param queue the async I/O task queue to query.
|
||||||
|
* \param outcome details of a finished task will be written here. May not be
|
||||||
|
* NULL.
|
||||||
|
* \returns true if a task has completed, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_WaitAsyncIOResult
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_GetAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Block until an async I/O task queue has a completed task.
|
||||||
|
*
|
||||||
|
* This function puts the calling thread to sleep until there a task assigned
|
||||||
|
* to the queue that has finished.
|
||||||
|
*
|
||||||
|
* If a task assigned to the queue has finished, this will return true and
|
||||||
|
* fill in `outcome` with the details of the task. If no task in the queue has
|
||||||
|
* finished, this function will return false.
|
||||||
|
*
|
||||||
|
* If a task has completed, this function will free its resources and the task
|
||||||
|
* pointer will no longer be valid. The task will be removed from the queue.
|
||||||
|
*
|
||||||
|
* It is safe for multiple threads to call this function on the same queue at
|
||||||
|
* once; a completed task will only go to one of the threads.
|
||||||
|
*
|
||||||
|
* Note that by the nature of various platforms, more than one waiting thread
|
||||||
|
* may wake to handle a single task, but only one will obtain it, so
|
||||||
|
* `timeoutMS` is a _maximum_ wait time, and this function may return false
|
||||||
|
* sooner.
|
||||||
|
*
|
||||||
|
* This function may return false if there was a system error, the OS
|
||||||
|
* inadvertently awoke multiple threads, or if SDL_SignalAsyncIOQueue() was
|
||||||
|
* called to wake up all waiting threads without a finished task.
|
||||||
|
*
|
||||||
|
* A timeout can be used to specify a maximum wait time, but rather than
|
||||||
|
* polling, it is possible to have a timeout of -1 to wait forever, and use
|
||||||
|
* SDL_SignalAsyncIOQueue() to wake up the waiting threads later.
|
||||||
|
*
|
||||||
|
* \param queue the async I/O task queue to wait on.
|
||||||
|
* \param outcome details of a finished task will be written here. May not be
|
||||||
|
* NULL.
|
||||||
|
* \param timeoutMS the maximum time to wait, in milliseconds, or -1 to wait
|
||||||
|
* indefinitely.
|
||||||
|
* \returns true if task has completed, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SignalAsyncIOQueue
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_WaitAsyncIOResult(SDL_AsyncIOQueue *queue, SDL_AsyncIOOutcome *outcome, Sint32 timeoutMS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wake up any threads that are blocking in SDL_WaitAsyncIOResult().
|
||||||
|
*
|
||||||
|
* This will unblock any threads that are sleeping in a call to
|
||||||
|
* SDL_WaitAsyncIOResult for the specified queue, and cause them to return
|
||||||
|
* from that function.
|
||||||
|
*
|
||||||
|
* This can be useful when destroying a queue to make sure nothing is touching
|
||||||
|
* it indefinitely. In this case, once this call completes, the caller should
|
||||||
|
* take measures to make sure any previously-blocked threads have returned
|
||||||
|
* from their wait and will not touch the queue again (perhaps by setting a
|
||||||
|
* flag to tell the threads to terminate and then using SDL_WaitThread() to
|
||||||
|
* make sure they've done so).
|
||||||
|
*
|
||||||
|
* \param queue the async I/O task queue to signal.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_WaitAsyncIOResult
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SignalAsyncIOQueue(SDL_AsyncIOQueue *queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load all the data from a file path, asynchronously.
|
||||||
|
*
|
||||||
|
* This function returns as quickly as possible; it does not wait for the read
|
||||||
|
* to complete. On a successful return, this work will continue in the
|
||||||
|
* background. If the work begins, even failure is asynchronous: a failing
|
||||||
|
* return value from this function only means the work couldn't start at all.
|
||||||
|
*
|
||||||
|
* The data is allocated with a zero byte at the end (null terminated) for
|
||||||
|
* convenience. This extra byte is not included in SDL_AsyncIOOutcome's
|
||||||
|
* bytes_transferred value.
|
||||||
|
*
|
||||||
|
* This function will allocate the buffer to contain the file. It must be
|
||||||
|
* deallocated by calling SDL_free() on SDL_AsyncIOOutcome's buffer field
|
||||||
|
* after completion.
|
||||||
|
*
|
||||||
|
* An SDL_AsyncIOQueue must be specified. The newly-created task will be added
|
||||||
|
* to it when it completes its work.
|
||||||
|
*
|
||||||
|
* \param file the path to read all available data from.
|
||||||
|
* \param queue a queue to add the new SDL_AsyncIO to.
|
||||||
|
* \param userdata an app-defined pointer that will be provided with the task
|
||||||
|
* results.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LoadFile_IO
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_LoadFileAsync(const char *file, SDL_AsyncIOQueue *queue, void *userdata);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_asyncio_h_ */
|
||||||
Vendored
+664
@@ -0,0 +1,664 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryAtomic
|
||||||
|
*
|
||||||
|
* Atomic operations.
|
||||||
|
*
|
||||||
|
* IMPORTANT: If you are not an expert in concurrent lockless programming, you
|
||||||
|
* should not be using any functions in this file. You should be protecting
|
||||||
|
* your data structures with full mutexes instead.
|
||||||
|
*
|
||||||
|
* ***Seriously, here be dragons!***
|
||||||
|
*
|
||||||
|
* You can find out a little more about lockless programming and the subtle
|
||||||
|
* issues that can arise here:
|
||||||
|
* https://learn.microsoft.com/en-us/windows/win32/dxtecharts/lockless-programming
|
||||||
|
*
|
||||||
|
* There's also lots of good information here:
|
||||||
|
*
|
||||||
|
* - https://www.1024cores.net/home/lock-free-algorithms
|
||||||
|
* - https://preshing.com/
|
||||||
|
*
|
||||||
|
* These operations may or may not actually be implemented using processor
|
||||||
|
* specific atomic operations. When possible they are implemented as true
|
||||||
|
* processor specific atomic operations. When that is not possible the are
|
||||||
|
* implemented using locks that *do* use the available atomic operations.
|
||||||
|
*
|
||||||
|
* All of the atomic operations that modify memory are full memory barriers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_atomic_h_
|
||||||
|
#define SDL_atomic_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_platform_defines.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An atomic spinlock.
|
||||||
|
*
|
||||||
|
* The atomic locks are efficient spinlocks using CPU instructions, but are
|
||||||
|
* vulnerable to starvation and can spin forever if a thread holding a lock
|
||||||
|
* has been terminated. For this reason you should minimize the code executed
|
||||||
|
* inside an atomic lock and never do expensive things like API or system
|
||||||
|
* calls while holding them.
|
||||||
|
*
|
||||||
|
* They are also vulnerable to starvation if the thread holding the lock is
|
||||||
|
* lower priority than other threads and doesn't get scheduled. In general you
|
||||||
|
* should use mutexes instead, since they have better performance and
|
||||||
|
* contention behavior.
|
||||||
|
*
|
||||||
|
* The atomic locks are not safe to lock recursively.
|
||||||
|
*
|
||||||
|
* Porting Note: The spin lock functions and type are required and can not be
|
||||||
|
* emulated because they are used in the atomic emulation code.
|
||||||
|
*/
|
||||||
|
typedef int SDL_SpinLock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to lock a spin lock by setting it to a non-zero value.
|
||||||
|
*
|
||||||
|
* ***Please note that spinlocks are dangerous if you don't know what you're
|
||||||
|
* doing. Please be careful using any sort of spinlock!***
|
||||||
|
*
|
||||||
|
* \param lock a pointer to a lock variable.
|
||||||
|
* \returns true if the lock succeeded, false if the lock is already held.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LockSpinlock
|
||||||
|
* \sa SDL_UnlockSpinlock
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_TryLockSpinlock(SDL_SpinLock *lock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock a spin lock by setting it to a non-zero value.
|
||||||
|
*
|
||||||
|
* ***Please note that spinlocks are dangerous if you don't know what you're
|
||||||
|
* doing. Please be careful using any sort of spinlock!***
|
||||||
|
*
|
||||||
|
* \param lock a pointer to a lock variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_TryLockSpinlock
|
||||||
|
* \sa SDL_UnlockSpinlock
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LockSpinlock(SDL_SpinLock *lock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock a spin lock by setting it to 0.
|
||||||
|
*
|
||||||
|
* Always returns immediately.
|
||||||
|
*
|
||||||
|
* ***Please note that spinlocks are dangerous if you don't know what you're
|
||||||
|
* doing. Please be careful using any sort of spinlock!***
|
||||||
|
*
|
||||||
|
* \param lock a pointer to a lock variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LockSpinlock
|
||||||
|
* \sa SDL_TryLockSpinlock
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_UnlockSpinlock(SDL_SpinLock *lock);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark a compiler barrier.
|
||||||
|
*
|
||||||
|
* A compiler barrier prevents the compiler from reordering reads and writes
|
||||||
|
* to globally visible variables across the call.
|
||||||
|
*
|
||||||
|
* This macro only prevents the compiler from reordering reads and writes, it
|
||||||
|
* does not prevent the CPU from reordering reads and writes. However, all of
|
||||||
|
* the atomic operations that modify memory are full memory barriers.
|
||||||
|
*
|
||||||
|
* \threadsafety Obviously this macro is safe to use from any thread at any
|
||||||
|
* time, but if you find yourself needing this, you are probably
|
||||||
|
* dealing with some very sensitive code; be careful!
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_CompilerBarrier() DoCompilerSpecificReadWriteBarrier()
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__)
|
||||||
|
void _ReadWriteBarrier(void);
|
||||||
|
#pragma intrinsic(_ReadWriteBarrier)
|
||||||
|
#define SDL_CompilerBarrier() _ReadWriteBarrier()
|
||||||
|
#elif (defined(__GNUC__) && !defined(SDL_PLATFORM_EMSCRIPTEN)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
|
||||||
|
/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */
|
||||||
|
#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory")
|
||||||
|
#elif defined(__WATCOMC__)
|
||||||
|
extern __inline void SDL_CompilerBarrier(void);
|
||||||
|
#pragma aux SDL_CompilerBarrier = "" parm [] modify exact [];
|
||||||
|
#else
|
||||||
|
#define SDL_CompilerBarrier() \
|
||||||
|
{ SDL_SpinLock _tmp = 0; SDL_LockSpinlock(&_tmp); SDL_UnlockSpinlock(&_tmp); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a memory release barrier (function version).
|
||||||
|
*
|
||||||
|
* Please refer to SDL_MemoryBarrierRelease for details. This is a function
|
||||||
|
* version, which might be useful if you need to use this functionality from a
|
||||||
|
* scripting language, etc. Also, some of the macro versions call this
|
||||||
|
* function behind the scenes, where more heavy lifting can happen inside of
|
||||||
|
* SDL. Generally, though, an app written in C/C++/etc should use the macro
|
||||||
|
* version, as it will be more efficient.
|
||||||
|
*
|
||||||
|
* \threadsafety Obviously this function is safe to use from any thread at any
|
||||||
|
* time, but if you find yourself needing this, you are probably
|
||||||
|
* dealing with some very sensitive code; be careful!
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_MemoryBarrierRelease
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a memory acquire barrier (function version).
|
||||||
|
*
|
||||||
|
* Please refer to SDL_MemoryBarrierRelease for details. This is a function
|
||||||
|
* version, which might be useful if you need to use this functionality from a
|
||||||
|
* scripting language, etc. Also, some of the macro versions call this
|
||||||
|
* function behind the scenes, where more heavy lifting can happen inside of
|
||||||
|
* SDL. Generally, though, an app written in C/C++/etc should use the macro
|
||||||
|
* version, as it will be more efficient.
|
||||||
|
*
|
||||||
|
* \threadsafety Obviously this function is safe to use from any thread at any
|
||||||
|
* time, but if you find yourself needing this, you are probably
|
||||||
|
* dealing with some very sensitive code; be careful!
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_MemoryBarrierAcquire
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a memory release barrier (macro version).
|
||||||
|
*
|
||||||
|
* Memory barriers are designed to prevent reads and writes from being
|
||||||
|
* reordered by the compiler and being seen out of order on multi-core CPUs.
|
||||||
|
*
|
||||||
|
* A typical pattern would be for thread A to write some data and a flag, and
|
||||||
|
* for thread B to read the flag and get the data. In this case you would
|
||||||
|
* insert a release barrier between writing the data and the flag,
|
||||||
|
* guaranteeing that the data write completes no later than the flag is
|
||||||
|
* written, and you would insert an acquire barrier between reading the flag
|
||||||
|
* and reading the data, to ensure that all the reads associated with the flag
|
||||||
|
* have completed.
|
||||||
|
*
|
||||||
|
* In this pattern you should always see a release barrier paired with an
|
||||||
|
* acquire barrier and you should gate the data reads/writes with a single
|
||||||
|
* flag variable.
|
||||||
|
*
|
||||||
|
* For more information on these semantics, take a look at the blog post:
|
||||||
|
* http://preshing.com/20120913/acquire-and-release-semantics
|
||||||
|
*
|
||||||
|
* This is the macro version of this functionality; if possible, SDL will use
|
||||||
|
* compiler intrinsics or inline assembly, but some platforms might need to
|
||||||
|
* call the function version of this, SDL_MemoryBarrierReleaseFunction to do
|
||||||
|
* the heavy lifting. Apps that can use the macro should favor it over the
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* \threadsafety Obviously this macro is safe to use from any thread at any
|
||||||
|
* time, but if you find yourself needing this, you are probably
|
||||||
|
* dealing with some very sensitive code; be careful!
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_MemoryBarrierAcquire
|
||||||
|
* \sa SDL_MemoryBarrierReleaseFunction
|
||||||
|
*/
|
||||||
|
#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert a memory acquire barrier (macro version).
|
||||||
|
*
|
||||||
|
* Please see SDL_MemoryBarrierRelease for the details on what memory barriers
|
||||||
|
* are and when to use them.
|
||||||
|
*
|
||||||
|
* This is the macro version of this functionality; if possible, SDL will use
|
||||||
|
* compiler intrinsics or inline assembly, but some platforms might need to
|
||||||
|
* call the function version of this, SDL_MemoryBarrierAcquireFunction, to do
|
||||||
|
* the heavy lifting. Apps that can use the macro should favor it over the
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* \threadsafety Obviously this macro is safe to use from any thread at any
|
||||||
|
* time, but if you find yourself needing this, you are probably
|
||||||
|
* dealing with some very sensitive code; be careful!
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_MemoryBarrierRelease
|
||||||
|
* \sa SDL_MemoryBarrierAcquireFunction
|
||||||
|
*/
|
||||||
|
#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
|
||||||
|
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory")
|
||||||
|
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory")
|
||||||
|
#elif defined(__GNUC__) && defined(__aarch64__)
|
||||||
|
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
|
||||||
|
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
|
||||||
|
#elif defined(__GNUC__) && defined(__arm__)
|
||||||
|
#if 0 /* defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_ANDROID) */
|
||||||
|
/* Information from:
|
||||||
|
https://chromium.googlesource.com/chromium/chromium/+/trunk/base/atomicops_internals_arm_gcc.h#19
|
||||||
|
|
||||||
|
The Linux kernel provides a helper function which provides the right code for a memory barrier,
|
||||||
|
hard-coded at address 0xffff0fa0
|
||||||
|
*/
|
||||||
|
typedef void (*SDL_KernelMemoryBarrierFunc)();
|
||||||
|
#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
|
||||||
|
#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)()
|
||||||
|
#else
|
||||||
|
#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) || defined(__ARM_ARCH_8A__)
|
||||||
|
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory")
|
||||||
|
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory")
|
||||||
|
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
|
||||||
|
#ifdef __thumb__
|
||||||
|
/* The mcr instruction isn't available in thumb mode, use real functions */
|
||||||
|
#define SDL_MEMORY_BARRIER_USES_FUNCTION
|
||||||
|
#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction()
|
||||||
|
#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction()
|
||||||
|
#else
|
||||||
|
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
|
||||||
|
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory")
|
||||||
|
#endif /* __thumb__ */
|
||||||
|
#else
|
||||||
|
#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory")
|
||||||
|
#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory")
|
||||||
|
#endif /* SDL_PLATFORM_LINUX || SDL_PLATFORM_ANDROID */
|
||||||
|
#endif /* __GNUC__ && __arm__ */
|
||||||
|
#else
|
||||||
|
#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120))
|
||||||
|
/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */
|
||||||
|
#include <mbarrier.h>
|
||||||
|
#define SDL_MemoryBarrierRelease() __machine_rel_barrier()
|
||||||
|
#define SDL_MemoryBarrierAcquire() __machine_acq_barrier()
|
||||||
|
#else
|
||||||
|
/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */
|
||||||
|
#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier()
|
||||||
|
#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier()
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to insert a CPU-specific "pause" instruction into the program.
|
||||||
|
*
|
||||||
|
* This can be useful in busy-wait loops, as it serves as a hint to the CPU as
|
||||||
|
* to the program's intent; some CPUs can use this to do more efficient
|
||||||
|
* processing. On some platforms, this doesn't do anything, so using this
|
||||||
|
* macro might just be a harmless no-op.
|
||||||
|
*
|
||||||
|
* Note that if you are busy-waiting, there are often more-efficient
|
||||||
|
* approaches with other synchronization primitives: mutexes, semaphores,
|
||||||
|
* condition variables, etc.
|
||||||
|
*
|
||||||
|
* \threadsafety This macro is safe to use from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_CPUPauseInstruction() DoACPUPauseInACompilerAndArchitectureSpecificWay
|
||||||
|
|
||||||
|
#elif (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))
|
||||||
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */
|
||||||
|
#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(__aarch64__)
|
||||||
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory")
|
||||||
|
#elif (defined(__powerpc__) || defined(__powerpc64__))
|
||||||
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27");
|
||||||
|
#elif (defined(__riscv) && __riscv_xlen == 64)
|
||||||
|
#define SDL_CPUPauseInstruction() __asm__ __volatile__(".insn i 0x0F, 0, x0, x0, 0x010");
|
||||||
|
#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
|
||||||
|
#define SDL_CPUPauseInstruction() _mm_pause() /* this is actually "rep nop" and not a SIMD instruction. No inline asm in MSVC x86-64! */
|
||||||
|
#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64))
|
||||||
|
#define SDL_CPUPauseInstruction() __yield()
|
||||||
|
#elif defined(__WATCOMC__) && defined(__386__)
|
||||||
|
extern __inline void SDL_CPUPauseInstruction(void);
|
||||||
|
#pragma aux SDL_CPUPauseInstruction = ".686p" ".xmm2" "pause"
|
||||||
|
#else
|
||||||
|
#define SDL_CPUPauseInstruction()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type representing an atomic integer value.
|
||||||
|
*
|
||||||
|
* This can be used to manage a value that is synchronized across multiple
|
||||||
|
* CPUs without a race condition; when an app sets a value with
|
||||||
|
* SDL_SetAtomicInt all other threads, regardless of the CPU it is running on,
|
||||||
|
* will see that value when retrieved with SDL_GetAtomicInt, regardless of CPU
|
||||||
|
* caches, etc.
|
||||||
|
*
|
||||||
|
* This is also useful for atomic compare-and-swap operations: a thread can
|
||||||
|
* change the value as long as its current value matches expectations. When
|
||||||
|
* done in a loop, one can guarantee data consistency across threads without a
|
||||||
|
* lock (but the usual warnings apply: if you don't know what you're doing, or
|
||||||
|
* you don't do it carefully, you can confidently cause any number of
|
||||||
|
* disasters with this, so in most cases, you _should_ use a mutex instead of
|
||||||
|
* this!).
|
||||||
|
*
|
||||||
|
* This is a struct so people don't accidentally use numeric operations on it
|
||||||
|
* directly. You have to use SDL atomic functions.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CompareAndSwapAtomicInt
|
||||||
|
* \sa SDL_GetAtomicInt
|
||||||
|
* \sa SDL_SetAtomicInt
|
||||||
|
* \sa SDL_AddAtomicInt
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AtomicInt { int value; } SDL_AtomicInt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an atomic variable to a new value if it is currently an old value.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt variable to be modified.
|
||||||
|
* \param oldval the old value.
|
||||||
|
* \param newval the new value.
|
||||||
|
* \returns true if the atomic variable was set, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAtomicInt
|
||||||
|
* \sa SDL_SetAtomicInt
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicInt(SDL_AtomicInt *a, int oldval, int newval);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an atomic variable to a value.
|
||||||
|
*
|
||||||
|
* This function also acts as a full memory barrier.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt variable to be modified.
|
||||||
|
* \param v the desired value.
|
||||||
|
* \returns the previous value of the atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAtomicInt
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_SetAtomicInt(SDL_AtomicInt *a, int v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of an atomic variable.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt variable.
|
||||||
|
* \returns the current value of an atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAtomicInt
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetAtomicInt(SDL_AtomicInt *a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add to an atomic variable.
|
||||||
|
*
|
||||||
|
* This function also acts as a full memory barrier.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt variable to be modified.
|
||||||
|
* \param v the desired value to add.
|
||||||
|
* \returns the previous value of the atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AtomicDecRef
|
||||||
|
* \sa SDL_AtomicIncRef
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_AddAtomicInt(SDL_AtomicInt *a, int v);
|
||||||
|
|
||||||
|
#ifndef SDL_AtomicIncRef
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increment an atomic variable used as a reference count.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this macro is for, you shouldn't use it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt to increment.
|
||||||
|
* \returns the previous value of the atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AtomicDecRef
|
||||||
|
*/
|
||||||
|
#define SDL_AtomicIncRef(a) SDL_AddAtomicInt(a, 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_AtomicDecRef
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrement an atomic variable used as a reference count.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this macro is for, you shouldn't use it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicInt to increment.
|
||||||
|
* \returns true if the variable reached zero after decrementing, false
|
||||||
|
* otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AtomicIncRef
|
||||||
|
*/
|
||||||
|
#define SDL_AtomicDecRef(a) (SDL_AddAtomicInt(a, -1) == 1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A type representing an atomic unsigned 32-bit value.
|
||||||
|
*
|
||||||
|
* This can be used to manage a value that is synchronized across multiple
|
||||||
|
* CPUs without a race condition; when an app sets a value with
|
||||||
|
* SDL_SetAtomicU32 all other threads, regardless of the CPU it is running on,
|
||||||
|
* will see that value when retrieved with SDL_GetAtomicU32, regardless of CPU
|
||||||
|
* caches, etc.
|
||||||
|
*
|
||||||
|
* This is also useful for atomic compare-and-swap operations: a thread can
|
||||||
|
* change the value as long as its current value matches expectations. When
|
||||||
|
* done in a loop, one can guarantee data consistency across threads without a
|
||||||
|
* lock (but the usual warnings apply: if you don't know what you're doing, or
|
||||||
|
* you don't do it carefully, you can confidently cause any number of
|
||||||
|
* disasters with this, so in most cases, you _should_ use a mutex instead of
|
||||||
|
* this!).
|
||||||
|
*
|
||||||
|
* This is a struct so people don't accidentally use numeric operations on it
|
||||||
|
* directly. You have to use SDL atomic functions.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CompareAndSwapAtomicU32
|
||||||
|
* \sa SDL_GetAtomicU32
|
||||||
|
* \sa SDL_SetAtomicU32
|
||||||
|
*/
|
||||||
|
typedef struct SDL_AtomicU32 { Uint32 value; } SDL_AtomicU32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an atomic variable to a new value if it is currently an old value.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicU32 variable to be modified.
|
||||||
|
* \param oldval the old value.
|
||||||
|
* \param newval the new value.
|
||||||
|
* \returns true if the atomic variable was set, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAtomicU32
|
||||||
|
* \sa SDL_SetAtomicU32
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicU32(SDL_AtomicU32 *a, Uint32 oldval, Uint32 newval);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an atomic variable to a value.
|
||||||
|
*
|
||||||
|
* This function also acts as a full memory barrier.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicU32 variable to be modified.
|
||||||
|
* \param v the desired value.
|
||||||
|
* \returns the previous value of the atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAtomicU32
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC Uint32 SDLCALL SDL_SetAtomicU32(SDL_AtomicU32 *a, Uint32 v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of an atomic variable.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to an SDL_AtomicU32 variable.
|
||||||
|
* \returns the current value of an atomic variable.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAtomicU32
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC Uint32 SDLCALL SDL_GetAtomicU32(SDL_AtomicU32 *a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a pointer to a new value if it is currently an old value.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to a pointer.
|
||||||
|
* \param oldval the old pointer value.
|
||||||
|
* \param newval the new pointer value.
|
||||||
|
* \returns true if the pointer was set, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CompareAndSwapAtomicInt
|
||||||
|
* \sa SDL_GetAtomicPointer
|
||||||
|
* \sa SDL_SetAtomicPointer
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CompareAndSwapAtomicPointer(void **a, void *oldval, void *newval);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a pointer to a value atomically.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to a pointer.
|
||||||
|
* \param v the desired pointer value.
|
||||||
|
* \returns the previous value of the pointer.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CompareAndSwapAtomicPointer
|
||||||
|
* \sa SDL_GetAtomicPointer
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void * SDLCALL SDL_SetAtomicPointer(void **a, void *v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of a pointer atomically.
|
||||||
|
*
|
||||||
|
* ***Note: If you don't know what this function is for, you shouldn't use
|
||||||
|
* it!***
|
||||||
|
*
|
||||||
|
* \param a a pointer to a pointer.
|
||||||
|
* \returns the current value of a pointer.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CompareAndSwapAtomicPointer
|
||||||
|
* \sa SDL_SetAtomicPointer
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void * SDLCALL SDL_GetAtomicPointer(void **a);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_atomic_h_ */
|
||||||
Vendored
+2197
File diff suppressed because it is too large
Load Diff
Vendored
+486
@@ -0,0 +1,486 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: BeginCode */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryBeginCode
|
||||||
|
*
|
||||||
|
* `SDL_begin_code.h` sets things up for C dynamic library function
|
||||||
|
* definitions, static inlined functions, and structures aligned at 4-byte
|
||||||
|
* alignment. If you don't like ugly C preprocessor code, don't look at this
|
||||||
|
* file. :)
|
||||||
|
*
|
||||||
|
* SDL's headers use this; applications generally should not include this
|
||||||
|
* header directly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This shouldn't be nested -- included it around code only. */
|
||||||
|
#ifdef SDL_begin_code_h
|
||||||
|
#error Nested inclusion of SDL_begin_code.h
|
||||||
|
#endif
|
||||||
|
#define SDL_begin_code_h
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a symbol as deprecated.
|
||||||
|
*
|
||||||
|
* A function is marked deprecated by adding this macro to its declaration:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* extern SDL_DEPRECATED int ThisFunctionWasABadIdea(void);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Compilers with deprecation support can give a warning when a deprecated
|
||||||
|
* function is used. This symbol may be used in SDL's headers, but apps are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* SDL, on occasion, might deprecate a function for various reasons. However,
|
||||||
|
* SDL never removes symbols before major versions, so deprecated interfaces
|
||||||
|
* in SDL3 will remain available until SDL4, where it would be expected an app
|
||||||
|
* would have to take steps to migrate anyhow.
|
||||||
|
*
|
||||||
|
* On compilers without a deprecation mechanism, this is defined to nothing,
|
||||||
|
* and using a deprecated function will not generate a warning.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_DEPRECATED __attribute__((deprecated))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a symbol as a public API.
|
||||||
|
*
|
||||||
|
* SDL uses this macro for all its public functions. On some targets, it is
|
||||||
|
* used to signal to the compiler that this function needs to be exported from
|
||||||
|
* a shared library, but it might have other side effects.
|
||||||
|
*
|
||||||
|
* This symbol is used in SDL's headers, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_DECLSPEC __attribute__ ((visibility("default")))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to set a function's calling conventions.
|
||||||
|
*
|
||||||
|
* SDL uses this macro for all its public functions, and any callbacks it
|
||||||
|
* defines. This macro guarantees that calling conventions match between SDL
|
||||||
|
* and the app, even if the two were built with different compilers or
|
||||||
|
* optimization settings.
|
||||||
|
*
|
||||||
|
* When writing a callback function, it is very important for it to be
|
||||||
|
* correctly tagged with SDLCALL, as mismatched calling conventions can cause
|
||||||
|
* strange behaviors and can be difficult to diagnose. Plus, on many
|
||||||
|
* platforms, SDLCALL is defined to nothing, so compilers won't be able to
|
||||||
|
* warn that the tag is missing.
|
||||||
|
*
|
||||||
|
* This symbol is used in SDL's headers, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDLCALL __cdecl
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to request a function be inlined.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler to inline a function. The compiler is free
|
||||||
|
* to ignore this request. On compilers without inline support, this is
|
||||||
|
* defined to nothing.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_INLINE __inline
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to demand a function be inlined.
|
||||||
|
*
|
||||||
|
* This is a command to the compiler to inline a function. SDL uses this macro
|
||||||
|
* in its public headers for a handful of simple functions. On compilers
|
||||||
|
* without forceinline support, this is defined to `static SDL_INLINE`, which
|
||||||
|
* is often good enough.
|
||||||
|
*
|
||||||
|
* This symbol is used in SDL's headers, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_FORCE_INLINE __forceinline
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function as never-returning.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler that a function does not return. An example
|
||||||
|
* of a function like this is the C runtime's exit() function.
|
||||||
|
*
|
||||||
|
* This hint can lead to code optimizations, and help analyzers understand
|
||||||
|
* code flow better. On compilers without noreturn support, this is defined to
|
||||||
|
* nothing.
|
||||||
|
*
|
||||||
|
* This symbol is used in SDL's headers, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_NORETURN __attribute__((noreturn))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function as never-returning (for analysis purposes).
|
||||||
|
*
|
||||||
|
* This is almost identical to SDL_NORETURN, except functions marked with this
|
||||||
|
* _can_ actually return. The difference is that this isn't used for code
|
||||||
|
* generation, but rather static analyzers use this information to assume
|
||||||
|
* truths about program state and available code paths. Specifically, this tag
|
||||||
|
* is useful for writing an assertion mechanism. Indeed, SDL_assert uses this
|
||||||
|
* tag behind the scenes. Generally, apps that don't understand the specific
|
||||||
|
* use-case for this tag should avoid using it directly.
|
||||||
|
*
|
||||||
|
* On compilers without analyzer_noreturn support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* This symbol is used in SDL's headers, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to signal that a case statement without a `break` is intentional.
|
||||||
|
*
|
||||||
|
* C compilers have gotten more aggressive about warning when a switch's
|
||||||
|
* `case` block does not end with a `break` or other flow control statement,
|
||||||
|
* flowing into the next case's code, as this is a common accident that leads
|
||||||
|
* to strange bugs. But sometimes falling through to the next case is the
|
||||||
|
* correct and desired behavior. This symbol lets an app communicate this
|
||||||
|
* intention to the compiler, so it doesn't generate a warning.
|
||||||
|
*
|
||||||
|
* It is used like this:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* switch (x) {
|
||||||
|
* case 1:
|
||||||
|
* DoSomethingOnlyForOne();
|
||||||
|
* SDL_FALLTHROUGH; // tell the compiler this was intentional.
|
||||||
|
* case 2:
|
||||||
|
* DoSomethingForOneAndTwo();
|
||||||
|
* break;
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_FALLTHROUGH [[fallthrough]]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function's return value as critical.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler that a function's return value should not be
|
||||||
|
* ignored.
|
||||||
|
*
|
||||||
|
* If an NODISCARD function's return value is thrown away (the function is
|
||||||
|
* called as if it returns `void`), the compiler will issue a warning.
|
||||||
|
*
|
||||||
|
* While it's generally good practice to check return values for errors, often
|
||||||
|
* times legitimate programs do not for good reasons. Be careful about what
|
||||||
|
* functions are tagged as NODISCARD. It operates best when used on a function
|
||||||
|
* that's failure is surprising and catastrophic; a good example would be a
|
||||||
|
* program that checks the return values of all its file write function calls
|
||||||
|
* but not the call to close the file, which it assumes incorrectly never
|
||||||
|
* fails.
|
||||||
|
*
|
||||||
|
* Function callers that want to throw away a NODISCARD return value can call
|
||||||
|
* the function with a `(void)` cast, which informs the compiler the act is
|
||||||
|
* intentional.
|
||||||
|
*
|
||||||
|
* On compilers without nodiscard support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_NODISCARD [[nodiscard]]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function as an allocator.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler that a function is an allocator, like
|
||||||
|
* malloc(), with certain rules. A description of how GCC treats this hint is
|
||||||
|
* here:
|
||||||
|
*
|
||||||
|
* https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
|
||||||
|
*
|
||||||
|
* On compilers without allocator tag support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* Most apps don't need to, and should not, use this directly.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function as returning a certain allocation.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler that a function allocates and returns a
|
||||||
|
* specific amount of memory based on one of its arguments. For example, the C
|
||||||
|
* runtime's malloc() function could use this macro with an argument of 1
|
||||||
|
* (first argument to malloc is the size of the allocation).
|
||||||
|
*
|
||||||
|
* On compilers without alloc_size support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* Most apps don't need to, and should not, use this directly.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a pointer variable, to help with pointer aliasing.
|
||||||
|
*
|
||||||
|
* A good explanation of the restrict keyword is here:
|
||||||
|
*
|
||||||
|
* https://en.wikipedia.org/wiki/Restrict
|
||||||
|
*
|
||||||
|
* On compilers without restrict support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_RESTRICT __restrict__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the compiler supports a given builtin functionality.
|
||||||
|
*
|
||||||
|
* This allows preprocessor checks for things that otherwise might fail to
|
||||||
|
* compile.
|
||||||
|
*
|
||||||
|
* Supported by virtually all clang versions and more-recent GCCs. Use this
|
||||||
|
* instead of checking the clang version if possible.
|
||||||
|
*
|
||||||
|
* On compilers without has_builtin support, this is defined to 0 (always
|
||||||
|
* false).
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_HAS_BUILTIN(x) __has_builtin(x)
|
||||||
|
|
||||||
|
/* end of wiki documentation section. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_HAS_BUILTIN
|
||||||
|
#ifdef __has_builtin
|
||||||
|
#define SDL_HAS_BUILTIN(x) __has_builtin(x)
|
||||||
|
#else
|
||||||
|
#define SDL_HAS_BUILTIN(x) 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_DEPRECATED
|
||||||
|
# if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */
|
||||||
|
# define SDL_DEPRECATED __attribute__((deprecated))
|
||||||
|
# elif defined(_MSC_VER)
|
||||||
|
# define SDL_DEPRECATED __declspec(deprecated)
|
||||||
|
# else
|
||||||
|
# define SDL_DEPRECATED
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_UNUSED
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# define SDL_UNUSED __attribute__((unused))
|
||||||
|
# else
|
||||||
|
# define SDL_UNUSED
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some compilers use a special export keyword */
|
||||||
|
#ifndef SDL_DECLSPEC
|
||||||
|
# if defined(SDL_PLATFORM_WINDOWS)
|
||||||
|
# ifdef DLL_EXPORT
|
||||||
|
# define SDL_DECLSPEC __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define SDL_DECLSPEC
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# if defined(__GNUC__) && __GNUC__ >= 4
|
||||||
|
# define SDL_DECLSPEC __attribute__ ((visibility("default")))
|
||||||
|
# else
|
||||||
|
# define SDL_DECLSPEC
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* By default SDL uses the C calling convention */
|
||||||
|
#ifndef SDLCALL
|
||||||
|
#if defined(SDL_PLATFORM_WINDOWS) && !defined(__GNUC__)
|
||||||
|
#define SDLCALL __cdecl
|
||||||
|
#else
|
||||||
|
#define SDLCALL
|
||||||
|
#endif
|
||||||
|
#endif /* SDLCALL */
|
||||||
|
|
||||||
|
/* Force structure packing at 4 byte alignment.
|
||||||
|
This is necessary if the header is included in code which has structure
|
||||||
|
packing set to an alternate value, say for loading structures from disk.
|
||||||
|
The packing is reset to the previous value in SDL_close_code.h
|
||||||
|
*/
|
||||||
|
#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(disable: 4103)
|
||||||
|
#endif
|
||||||
|
#ifdef __clang__
|
||||||
|
#pragma clang diagnostic ignored "-Wpragma-pack"
|
||||||
|
#endif
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma nopackwarning
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN64
|
||||||
|
/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */
|
||||||
|
#pragma pack(push,8)
|
||||||
|
#else
|
||||||
|
#pragma pack(push,4)
|
||||||
|
#endif
|
||||||
|
#endif /* Compiler needs structure packing set */
|
||||||
|
|
||||||
|
#ifndef SDL_INLINE
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define SDL_INLINE __inline__
|
||||||
|
#elif defined(_MSC_VER) || defined(__BORLANDC__) || \
|
||||||
|
defined(__DMC__) || defined(__SC__) || \
|
||||||
|
defined(__WATCOMC__) || defined(__LCC__) || \
|
||||||
|
defined(__DECC) || defined(__CC_ARM)
|
||||||
|
#define SDL_INLINE __inline
|
||||||
|
#ifndef __inline__
|
||||||
|
#define __inline__ __inline
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define SDL_INLINE inline
|
||||||
|
#ifndef __inline__
|
||||||
|
#define __inline__ inline
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_INLINE not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_FORCE_INLINE
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define SDL_FORCE_INLINE __forceinline
|
||||||
|
#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
|
||||||
|
#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__
|
||||||
|
#else
|
||||||
|
#define SDL_FORCE_INLINE static SDL_INLINE
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_FORCE_INLINE not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_NORETURN
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define SDL_NORETURN __attribute__((noreturn))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define SDL_NORETURN __declspec(noreturn)
|
||||||
|
#else
|
||||||
|
#define SDL_NORETURN
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_NORETURN not defined */
|
||||||
|
|
||||||
|
#ifdef __clang__
|
||||||
|
#if __has_feature(attribute_analyzer_noreturn)
|
||||||
|
#define SDL_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_ANALYZER_NORETURN
|
||||||
|
#define SDL_ANALYZER_NORETURN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Apparently this is needed by several Windows compilers */
|
||||||
|
#ifndef __MACH__
|
||||||
|
#ifndef NULL
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define NULL 0
|
||||||
|
#else
|
||||||
|
#define NULL ((void *)0)
|
||||||
|
#endif
|
||||||
|
#endif /* NULL */
|
||||||
|
#endif /* ! macOS - breaks precompiled headers */
|
||||||
|
|
||||||
|
#ifndef SDL_FALLTHROUGH
|
||||||
|
#if (defined(__cplusplus) && __cplusplus >= 201703L) || \
|
||||||
|
(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L)
|
||||||
|
#define SDL_FALLTHROUGH [[fallthrough]]
|
||||||
|
#else
|
||||||
|
#if defined(__has_attribute) && !defined(__SUNPRO_C) && !defined(__SUNPRO_CC)
|
||||||
|
#define SDL_HAS_FALLTHROUGH __has_attribute(__fallthrough__)
|
||||||
|
#else
|
||||||
|
#define SDL_HAS_FALLTHROUGH 0
|
||||||
|
#endif /* __has_attribute */
|
||||||
|
#if SDL_HAS_FALLTHROUGH && \
|
||||||
|
((defined(__GNUC__) && __GNUC__ >= 7) || \
|
||||||
|
(defined(__clang_major__) && __clang_major__ >= 10))
|
||||||
|
#define SDL_FALLTHROUGH __attribute__((__fallthrough__))
|
||||||
|
#else
|
||||||
|
#define SDL_FALLTHROUGH do {} while (0) /* fallthrough */
|
||||||
|
#endif /* SDL_HAS_FALLTHROUGH */
|
||||||
|
#undef SDL_HAS_FALLTHROUGH
|
||||||
|
#endif /* C++17 or C2x */
|
||||||
|
#endif /* SDL_FALLTHROUGH not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_NODISCARD
|
||||||
|
#if (defined(__cplusplus) && __cplusplus >= 201703L) || \
|
||||||
|
(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
|
||||||
|
#define SDL_NODISCARD [[nodiscard]]
|
||||||
|
#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) )
|
||||||
|
#define SDL_NODISCARD __attribute__((warn_unused_result))
|
||||||
|
#elif defined(_MSC_VER) && (_MSC_VER >= 1700)
|
||||||
|
#define SDL_NODISCARD _Check_return_
|
||||||
|
#else
|
||||||
|
#define SDL_NODISCARD
|
||||||
|
#endif /* C++17 or C23 */
|
||||||
|
#endif /* SDL_NODISCARD not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_MALLOC
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
||||||
|
#define SDL_MALLOC __attribute__((malloc))
|
||||||
|
/** FIXME
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define SDL_MALLOC __declspec(allocator) __desclspec(restrict)
|
||||||
|
**/
|
||||||
|
#else
|
||||||
|
#define SDL_MALLOC
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_MALLOC not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_ALLOC_SIZE
|
||||||
|
#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
|
||||||
|
#define SDL_ALLOC_SIZE(p) __attribute__((alloc_size(p)))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define SDL_ALLOC_SIZE(p)
|
||||||
|
#else
|
||||||
|
#define SDL_ALLOC_SIZE(p)
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_ALLOC_SIZE not defined */
|
||||||
|
|
||||||
|
#ifndef SDL_ALLOC_SIZE2
|
||||||
|
#if (defined(__clang__) && __clang_major__ >= 4) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
|
||||||
|
#define SDL_ALLOC_SIZE2(p1, p2) __attribute__((alloc_size(p1, p2)))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define SDL_ALLOC_SIZE2(p1, p2)
|
||||||
|
#else
|
||||||
|
#define SDL_ALLOC_SIZE2(p1, p2)
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_ALLOC_SIZE2 not defined */
|
||||||
Vendored
+147
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryBits
|
||||||
|
*
|
||||||
|
* Functions for fiddling with bits and bitmasks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_bits_h_
|
||||||
|
#define SDL_bits_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__WATCOMC__) && defined(__386__)
|
||||||
|
extern __inline int _SDL_bsr_watcom(Uint32);
|
||||||
|
#pragma aux _SDL_bsr_watcom = \
|
||||||
|
"bsr eax, eax" \
|
||||||
|
parm [eax] nomemory \
|
||||||
|
value [eax] \
|
||||||
|
modify exact [eax] nomemory;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the index of the most significant (set) bit in a 32-bit number.
|
||||||
|
*
|
||||||
|
* Result is undefined when called with 0. This operation can also be stated
|
||||||
|
* as "count leading zeroes" and "log base 2".
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the 32-bit value to examine.
|
||||||
|
* \returns the index of the most significant bit, or -1 if the value is 0.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE int SDL_MostSignificantBitIndex32(Uint32 x)
|
||||||
|
{
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
|
||||||
|
/* Count Leading Zeroes builtin in GCC.
|
||||||
|
* http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
|
||||||
|
*/
|
||||||
|
if (x == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 31 - __builtin_clz(x);
|
||||||
|
#elif defined(__WATCOMC__) && defined(__386__)
|
||||||
|
if (x == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return _SDL_bsr_watcom(x);
|
||||||
|
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
||||||
|
unsigned long index;
|
||||||
|
if (_BitScanReverse(&index, x)) {
|
||||||
|
return (int)index;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
#else
|
||||||
|
/* Based off of Bit Twiddling Hacks by Sean Eron Anderson
|
||||||
|
* <seander@cs.stanford.edu>, released in the public domain.
|
||||||
|
* http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
|
||||||
|
*/
|
||||||
|
const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
|
||||||
|
const int S[] = {1, 2, 4, 8, 16};
|
||||||
|
|
||||||
|
int msbIndex = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (x == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 4; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (x & b[i])
|
||||||
|
{
|
||||||
|
x >>= S[i];
|
||||||
|
msbIndex |= S[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return msbIndex;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if a unsigned 32-bit value has exactly one bit set.
|
||||||
|
*
|
||||||
|
* If there are no bits set (`x` is zero), or more than one bit set, this
|
||||||
|
* returns false. If any one bit is exclusively set, this returns true.
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the 32-bit value to examine.
|
||||||
|
* \returns true if exactly one bit is set in `x`, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE bool SDL_HasExactlyOneBitSet32(Uint32 x)
|
||||||
|
{
|
||||||
|
if (x && !(x & (x - 1))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_bits_h_ */
|
||||||
Vendored
+202
@@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryBlendmode
|
||||||
|
*
|
||||||
|
* Blend modes decide how two colors will mix together. There are both
|
||||||
|
* standard modes for basic needs and a means to create custom modes,
|
||||||
|
* dictating what sort of math to do on what color components.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_blendmode_h_
|
||||||
|
#define SDL_blendmode_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A set of blend modes used in drawing operations.
|
||||||
|
*
|
||||||
|
* These predefined blend modes are supported everywhere.
|
||||||
|
*
|
||||||
|
* Additional values may be obtained from SDL_ComposeCustomBlendMode.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ComposeCustomBlendMode
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_BlendMode;
|
||||||
|
|
||||||
|
#define SDL_BLENDMODE_NONE 0x00000000u /**< no blending: dstRGBA = srcRGBA */
|
||||||
|
#define SDL_BLENDMODE_BLEND 0x00000001u /**< alpha blending: dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)), dstA = srcA + (dstA * (1-srcA)) */
|
||||||
|
#define SDL_BLENDMODE_BLEND_PREMULTIPLIED 0x00000010u /**< pre-multiplied alpha blending: dstRGBA = srcRGBA + (dstRGBA * (1-srcA)) */
|
||||||
|
#define SDL_BLENDMODE_ADD 0x00000002u /**< additive blending: dstRGB = (srcRGB * srcA) + dstRGB, dstA = dstA */
|
||||||
|
#define SDL_BLENDMODE_ADD_PREMULTIPLIED 0x00000020u /**< pre-multiplied additive blending: dstRGB = srcRGB + dstRGB, dstA = dstA */
|
||||||
|
#define SDL_BLENDMODE_MOD 0x00000004u /**< color modulate: dstRGB = srcRGB * dstRGB, dstA = dstA */
|
||||||
|
#define SDL_BLENDMODE_MUL 0x00000008u /**< color multiply: dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)), dstA = dstA */
|
||||||
|
#define SDL_BLENDMODE_INVALID 0x7FFFFFFFu
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The blend operation used when combining source and destination pixel
|
||||||
|
* components.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_BlendOperation
|
||||||
|
{
|
||||||
|
SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */
|
||||||
|
SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< src - dst : supported by D3D, OpenGL, OpenGLES, and Vulkan */
|
||||||
|
SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< dst - src : supported by D3D, OpenGL, OpenGLES, and Vulkan */
|
||||||
|
SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */
|
||||||
|
SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan */
|
||||||
|
} SDL_BlendOperation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The normalized factor used to multiply pixel components.
|
||||||
|
*
|
||||||
|
* The blend factors are multiplied with the pixels from a drawing operation
|
||||||
|
* (src) and the pixels from the render target (dst) before the blend
|
||||||
|
* operation. The comma-separated factors listed above are always applied in
|
||||||
|
* the component order red, green, blue, and alpha.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_BlendFactor
|
||||||
|
{
|
||||||
|
SDL_BLENDFACTOR_ZERO = 0x1, /**< 0, 0, 0, 0 */
|
||||||
|
SDL_BLENDFACTOR_ONE = 0x2, /**< 1, 1, 1, 1 */
|
||||||
|
SDL_BLENDFACTOR_SRC_COLOR = 0x3, /**< srcR, srcG, srcB, srcA */
|
||||||
|
SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4, /**< 1-srcR, 1-srcG, 1-srcB, 1-srcA */
|
||||||
|
SDL_BLENDFACTOR_SRC_ALPHA = 0x5, /**< srcA, srcA, srcA, srcA */
|
||||||
|
SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6, /**< 1-srcA, 1-srcA, 1-srcA, 1-srcA */
|
||||||
|
SDL_BLENDFACTOR_DST_COLOR = 0x7, /**< dstR, dstG, dstB, dstA */
|
||||||
|
SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */
|
||||||
|
SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */
|
||||||
|
SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */
|
||||||
|
} SDL_BlendFactor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compose a custom blend mode for renderers.
|
||||||
|
*
|
||||||
|
* The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept
|
||||||
|
* the SDL_BlendMode returned by this function if the renderer supports it.
|
||||||
|
*
|
||||||
|
* A blend mode controls how the pixels from a drawing operation (source) get
|
||||||
|
* combined with the pixels from the render target (destination). First, the
|
||||||
|
* components of the source and destination pixels get multiplied with their
|
||||||
|
* blend factors. Then, the blend operation takes the two products and
|
||||||
|
* calculates the result that will get stored in the render target.
|
||||||
|
*
|
||||||
|
* Expressed in pseudocode, it would look like this:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
|
||||||
|
* dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Where the functions `colorOperation(src, dst)` and `alphaOperation(src,
|
||||||
|
* dst)` can return one of the following:
|
||||||
|
*
|
||||||
|
* - `src + dst`
|
||||||
|
* - `src - dst`
|
||||||
|
* - `dst - src`
|
||||||
|
* - `min(src, dst)`
|
||||||
|
* - `max(src, dst)`
|
||||||
|
*
|
||||||
|
* The red, green, and blue components are always multiplied with the first,
|
||||||
|
* second, and third components of the SDL_BlendFactor, respectively. The
|
||||||
|
* fourth component is not used.
|
||||||
|
*
|
||||||
|
* The alpha component is always multiplied with the fourth component of the
|
||||||
|
* SDL_BlendFactor. The other components are not used in the alpha
|
||||||
|
* calculation.
|
||||||
|
*
|
||||||
|
* Support for these blend modes varies for each renderer. To check if a
|
||||||
|
* specific SDL_BlendMode is supported, create a renderer and pass it to
|
||||||
|
* either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will
|
||||||
|
* return with an error if the blend mode is not supported.
|
||||||
|
*
|
||||||
|
* This list describes the support of custom blend modes for each renderer.
|
||||||
|
* All renderers support the four blend modes listed in the SDL_BlendMode
|
||||||
|
* enumeration.
|
||||||
|
*
|
||||||
|
* - **direct3d**: Supports all operations with all factors. However, some
|
||||||
|
* factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and
|
||||||
|
* `SDL_BLENDOPERATION_MAXIMUM`.
|
||||||
|
* - **direct3d11**: Same as Direct3D 9.
|
||||||
|
* - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all
|
||||||
|
* factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
|
||||||
|
* - **opengles2**: Supports the `SDL_BLENDOPERATION_ADD`,
|
||||||
|
* `SDL_BLENDOPERATION_SUBTRACT`, `SDL_BLENDOPERATION_REV_SUBTRACT`
|
||||||
|
* operations with all factors.
|
||||||
|
* - **psp**: No custom blend mode support.
|
||||||
|
* - **software**: No custom blend mode support.
|
||||||
|
*
|
||||||
|
* Some renderers do not provide an alpha component for the default render
|
||||||
|
* target. The `SDL_BLENDFACTOR_DST_ALPHA` and
|
||||||
|
* `SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA` factors do not have an effect in this
|
||||||
|
* case.
|
||||||
|
*
|
||||||
|
* \param srcColorFactor the SDL_BlendFactor applied to the red, green, and
|
||||||
|
* blue components of the source pixels.
|
||||||
|
* \param dstColorFactor the SDL_BlendFactor applied to the red, green, and
|
||||||
|
* blue components of the destination pixels.
|
||||||
|
* \param colorOperation the SDL_BlendOperation used to combine the red,
|
||||||
|
* green, and blue components of the source and
|
||||||
|
* destination pixels.
|
||||||
|
* \param srcAlphaFactor the SDL_BlendFactor applied to the alpha component of
|
||||||
|
* the source pixels.
|
||||||
|
* \param dstAlphaFactor the SDL_BlendFactor applied to the alpha component of
|
||||||
|
* the destination pixels.
|
||||||
|
* \param alphaOperation the SDL_BlendOperation used to combine the alpha
|
||||||
|
* component of the source and destination pixels.
|
||||||
|
* \returns an SDL_BlendMode that represents the chosen factors and
|
||||||
|
* operations.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetRenderDrawBlendMode
|
||||||
|
* \sa SDL_GetRenderDrawBlendMode
|
||||||
|
* \sa SDL_SetTextureBlendMode
|
||||||
|
* \sa SDL_GetTextureBlendMode
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor,
|
||||||
|
SDL_BlendFactor dstColorFactor,
|
||||||
|
SDL_BlendOperation colorOperation,
|
||||||
|
SDL_BlendFactor srcAlphaFactor,
|
||||||
|
SDL_BlendFactor dstAlphaFactor,
|
||||||
|
SDL_BlendOperation alphaOperation);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_blendmode_h_ */
|
||||||
Vendored
+519
@@ -0,0 +1,519 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryCamera
|
||||||
|
*
|
||||||
|
* Video capture for the SDL library.
|
||||||
|
*
|
||||||
|
* This API lets apps read input from video sources, like webcams. Camera
|
||||||
|
* devices can be enumerated, queried, and opened. Once opened, it will
|
||||||
|
* provide SDL_Surface objects as new frames of video come in. These surfaces
|
||||||
|
* can be uploaded to an SDL_Texture or processed as pixels in memory.
|
||||||
|
*
|
||||||
|
* Several platforms will alert the user if an app tries to access a camera,
|
||||||
|
* and some will present a UI asking the user if your application should be
|
||||||
|
* allowed to obtain images at all, which they can deny. A successfully opened
|
||||||
|
* camera will not provide images until permission is granted. Applications,
|
||||||
|
* after opening a camera device, can see if they were granted access by
|
||||||
|
* either polling with the SDL_GetCameraPermissionState() function, or waiting
|
||||||
|
* for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED
|
||||||
|
* event. Platforms that don't have any user approval process will report
|
||||||
|
* approval immediately.
|
||||||
|
*
|
||||||
|
* Note that SDL cameras only provide video as individual frames; they will
|
||||||
|
* not provide full-motion video encoded in a movie file format, although an
|
||||||
|
* app is free to encode the acquired frames into any format it likes. It also
|
||||||
|
* does not provide audio from the camera hardware through this API; not only
|
||||||
|
* do many webcams not have microphones at all, many people--from streamers to
|
||||||
|
* people on Zoom calls--will want to use a separate microphone regardless of
|
||||||
|
* the camera. In any case, recorded audio will be available through SDL's
|
||||||
|
* audio API no matter what hardware provides the microphone.
|
||||||
|
*
|
||||||
|
* ## Camera gotchas
|
||||||
|
*
|
||||||
|
* Consumer-level camera hardware tends to take a little while to warm up,
|
||||||
|
* once the device has been opened. Generally most camera apps have some sort
|
||||||
|
* of UI to take a picture (a button to snap a pic while a preview is showing,
|
||||||
|
* some sort of multi-second countdown for the user to pose, like a photo
|
||||||
|
* booth), which puts control in the users' hands, or they are intended to
|
||||||
|
* stay on for long times (Pokemon Go, etc).
|
||||||
|
*
|
||||||
|
* It's not uncommon that a newly-opened camera will provide a couple of
|
||||||
|
* completely black frames, maybe followed by some under-exposed images. If
|
||||||
|
* taking a single frame automatically, or recording video from a camera's
|
||||||
|
* input without the user initiating it from a preview, it could be wise to
|
||||||
|
* drop the first several frames (if not the first several _seconds_ worth of
|
||||||
|
* frames!) before using images from a camera.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_camera_h_
|
||||||
|
#define SDL_camera_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_pixels.h>
|
||||||
|
#include <SDL3/SDL_properties.h>
|
||||||
|
#include <SDL3/SDL_surface.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a unique ID for a camera device for the time it is connected to the
|
||||||
|
* system, and is never reused for the lifetime of the application.
|
||||||
|
*
|
||||||
|
* If the device is disconnected and reconnected, it will get a new ID.
|
||||||
|
*
|
||||||
|
* The value 0 is an invalid ID.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameras
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_CameraID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The opaque structure used to identify an opened SDL camera.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_Camera SDL_Camera;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The details of an output format for a camera device.
|
||||||
|
*
|
||||||
|
* Cameras often support multiple formats; each one will be encapsulated in
|
||||||
|
* this struct.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameraSupportedFormats
|
||||||
|
* \sa SDL_GetCameraFormat
|
||||||
|
*/
|
||||||
|
typedef struct SDL_CameraSpec
|
||||||
|
{
|
||||||
|
SDL_PixelFormat format; /**< Frame format */
|
||||||
|
SDL_Colorspace colorspace; /**< Frame colorspace */
|
||||||
|
int width; /**< Frame width */
|
||||||
|
int height; /**< Frame height */
|
||||||
|
int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
||||||
|
int framerate_denominator; /**< Frame rate demoninator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
||||||
|
} SDL_CameraSpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The position of camera in relation to system device.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameraPosition
|
||||||
|
*/
|
||||||
|
typedef enum SDL_CameraPosition
|
||||||
|
{
|
||||||
|
SDL_CAMERA_POSITION_UNKNOWN,
|
||||||
|
SDL_CAMERA_POSITION_FRONT_FACING,
|
||||||
|
SDL_CAMERA_POSITION_BACK_FACING
|
||||||
|
} SDL_CameraPosition;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this function to get the number of built-in camera drivers.
|
||||||
|
*
|
||||||
|
* This function returns a hardcoded number. This never returns a negative
|
||||||
|
* value; if there are no drivers compiled into this build of SDL, this
|
||||||
|
* function returns zero. The presence of a driver in this list does not mean
|
||||||
|
* it will function, it just means SDL is capable of interacting with that
|
||||||
|
* interface. For example, a build of SDL might have v4l2 support, but if
|
||||||
|
* there's no kernel support available, SDL's v4l2 driver would fail if used.
|
||||||
|
*
|
||||||
|
* By default, SDL tries all drivers, in its preferred order, until one is
|
||||||
|
* found to be usable.
|
||||||
|
*
|
||||||
|
* \returns the number of built-in camera drivers.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameraDriver
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetNumCameraDrivers(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this function to get the name of a built in camera driver.
|
||||||
|
*
|
||||||
|
* The list of camera drivers is given in the order that they are normally
|
||||||
|
* initialized by default; the drivers that seem more reasonable to choose
|
||||||
|
* first (as far as the SDL developers believe) are earlier in the list.
|
||||||
|
*
|
||||||
|
* The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
|
||||||
|
* "coremedia" or "android". These never have Unicode characters, and are not
|
||||||
|
* meant to be proper names.
|
||||||
|
*
|
||||||
|
* \param index the index of the camera driver; the value ranges from 0 to
|
||||||
|
* SDL_GetNumCameraDrivers() - 1.
|
||||||
|
* \returns the name of the camera driver at the requested index, or NULL if
|
||||||
|
* an invalid index was specified.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetNumCameraDrivers
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraDriver(int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the current camera driver.
|
||||||
|
*
|
||||||
|
* The names of drivers are all simple, low-ASCII identifiers, like "v4l2",
|
||||||
|
* "coremedia" or "android". These never have Unicode characters, and are not
|
||||||
|
* meant to be proper names.
|
||||||
|
*
|
||||||
|
* \returns the name of the current camera driver or NULL if no driver has
|
||||||
|
* been initialized.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetCurrentCameraDriver(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of currently connected camera devices.
|
||||||
|
*
|
||||||
|
* \param count a pointer filled in with the number of cameras returned, may
|
||||||
|
* be NULL.
|
||||||
|
* \returns a 0 terminated array of camera instance IDs or NULL on failure;
|
||||||
|
* call SDL_GetError() for more information. This should be freed
|
||||||
|
* with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_CameraID * SDLCALL SDL_GetCameras(int *count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of native formats/sizes a camera supports.
|
||||||
|
*
|
||||||
|
* This returns a list of all formats and frame sizes that a specific camera
|
||||||
|
* can offer. This is useful if your app can accept a variety of image formats
|
||||||
|
* and sizes and so want to find the optimal spec that doesn't require
|
||||||
|
* conversion.
|
||||||
|
*
|
||||||
|
* This function isn't strictly required; if you call SDL_OpenCamera with a
|
||||||
|
* NULL spec, SDL will choose a native format for you, and if you instead
|
||||||
|
* specify a desired format, it will transparently convert to the requested
|
||||||
|
* format on your behalf.
|
||||||
|
*
|
||||||
|
* If `count` is not NULL, it will be filled with the number of elements in
|
||||||
|
* the returned array.
|
||||||
|
*
|
||||||
|
* Note that it's legal for a camera to supply an empty list. This is what
|
||||||
|
* will happen on Emscripten builds, since that platform won't tell _anything_
|
||||||
|
* about available cameras until you've opened one, and won't even tell if
|
||||||
|
* there _is_ a camera until the user has given you permission to check
|
||||||
|
* through a scary warning popup.
|
||||||
|
*
|
||||||
|
* \param devid the camera device instance ID to query.
|
||||||
|
* \param count a pointer filled in with the number of elements in the list,
|
||||||
|
* may be NULL.
|
||||||
|
* \returns a NULL terminated array of pointers to SDL_CameraSpec or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information. This is a
|
||||||
|
* single allocation that should be freed with SDL_free() when it is
|
||||||
|
* no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameras
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_CameraSpec ** SDLCALL SDL_GetCameraSupportedFormats(SDL_CameraID devid, int *count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the human-readable device name for a camera.
|
||||||
|
*
|
||||||
|
* \param instance_id the camera device instance ID.
|
||||||
|
* \returns a human-readable device name or NULL on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameras
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetCameraName(SDL_CameraID instance_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the position of the camera in relation to the system.
|
||||||
|
*
|
||||||
|
* Most platforms will report UNKNOWN, but mobile devices, like phones, can
|
||||||
|
* often make a distinction between cameras on the front of the device (that
|
||||||
|
* points towards the user, for taking "selfies") and cameras on the back (for
|
||||||
|
* filming in the direction the user is facing).
|
||||||
|
*
|
||||||
|
* \param instance_id the camera device instance ID.
|
||||||
|
* \returns the position of the camera on the system hardware.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameras
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_CameraPosition SDLCALL SDL_GetCameraPosition(SDL_CameraID instance_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a video recording device (a "camera").
|
||||||
|
*
|
||||||
|
* You can open the device with any reasonable spec, and if the hardware can't
|
||||||
|
* directly support it, it will convert data seamlessly to the requested
|
||||||
|
* format. This might incur overhead, including scaling of image data.
|
||||||
|
*
|
||||||
|
* If you would rather accept whatever format the device offers, you can pass
|
||||||
|
* a NULL spec here and it will choose one for you (and you can use
|
||||||
|
* SDL_Surface's conversion/scaling functions directly if necessary).
|
||||||
|
*
|
||||||
|
* You can call SDL_GetCameraFormat() to get the actual data format if passing
|
||||||
|
* a NULL spec here. You can see the exact specs a device can support without
|
||||||
|
* conversion with SDL_GetCameraSupportedFormats().
|
||||||
|
*
|
||||||
|
* SDL will not attempt to emulate framerate; it will try to set the hardware
|
||||||
|
* to the rate closest to the requested speed, but it won't attempt to limit
|
||||||
|
* or duplicate frames artificially; call SDL_GetCameraFormat() to see the
|
||||||
|
* actual framerate of the opened the device, and check your timestamps if
|
||||||
|
* this is crucial to your app!
|
||||||
|
*
|
||||||
|
* Note that the camera is not usable until the user approves its use! On some
|
||||||
|
* platforms, the operating system will prompt the user to permit access to
|
||||||
|
* the camera, and they can choose Yes or No at that point. Until they do, the
|
||||||
|
* camera will not be usable. The app should either wait for an
|
||||||
|
* SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event,
|
||||||
|
* or poll SDL_GetCameraPermissionState() occasionally until it returns
|
||||||
|
* non-zero. On platforms that don't require explicit user approval (and
|
||||||
|
* perhaps in places where the user previously permitted access), the approval
|
||||||
|
* event might come immediately, but it might come seconds, minutes, or hours
|
||||||
|
* later!
|
||||||
|
*
|
||||||
|
* \param instance_id the camera device instance ID.
|
||||||
|
* \param spec the desired format for data the device will provide. Can be
|
||||||
|
* NULL.
|
||||||
|
* \returns an SDL_Camera object or NULL on failure; call SDL_GetError() for
|
||||||
|
* more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCameras
|
||||||
|
* \sa SDL_GetCameraFormat
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Camera * SDLCALL SDL_OpenCamera(SDL_CameraID instance_id, const SDL_CameraSpec *spec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query if camera access has been approved by the user.
|
||||||
|
*
|
||||||
|
* Cameras will not function between when the device is opened by the app and
|
||||||
|
* when the user permits access to the hardware. On some platforms, this
|
||||||
|
* presents as a popup dialog where the user has to explicitly approve access;
|
||||||
|
* on others the approval might be implicit and not alert the user at all.
|
||||||
|
*
|
||||||
|
* This function can be used to check the status of that approval. It will
|
||||||
|
* return 0 if still waiting for user response, 1 if the camera is approved
|
||||||
|
* for use, and -1 if the user denied access.
|
||||||
|
*
|
||||||
|
* Instead of polling with this function, you can wait for a
|
||||||
|
* SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event
|
||||||
|
* in the standard SDL event loop, which is guaranteed to be sent once when
|
||||||
|
* permission to use the camera is decided.
|
||||||
|
*
|
||||||
|
* If a camera is declined, there's nothing to be done but call
|
||||||
|
* SDL_CloseCamera() to dispose of it.
|
||||||
|
*
|
||||||
|
* \param camera the opened camera device to query.
|
||||||
|
* \returns -1 if user denied access to the camera, 1 if user approved access,
|
||||||
|
* 0 if no decision has been made yet.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
* \sa SDL_CloseCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetCameraPermissionState(SDL_Camera *camera);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the instance ID of an opened camera.
|
||||||
|
*
|
||||||
|
* \param camera an SDL_Camera to query.
|
||||||
|
* \returns the instance ID of the specified camera on success or 0 on
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_CameraID SDLCALL SDL_GetCameraID(SDL_Camera *camera);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the properties associated with an opened camera.
|
||||||
|
*
|
||||||
|
* \param camera the SDL_Camera obtained from SDL_OpenCamera().
|
||||||
|
* \returns a valid property ID on success or 0 on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetCameraProperties(SDL_Camera *camera);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the spec that a camera is using when generating images.
|
||||||
|
*
|
||||||
|
* Note that this might not be the native format of the hardware, as SDL might
|
||||||
|
* be converting to this format behind the scenes.
|
||||||
|
*
|
||||||
|
* If the system is waiting for the user to approve access to the camera, as
|
||||||
|
* some platforms require, this will return false, but this isn't necessarily
|
||||||
|
* a fatal error; you should either wait for an
|
||||||
|
* SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event,
|
||||||
|
* or poll SDL_GetCameraPermissionState() occasionally until it returns
|
||||||
|
* non-zero.
|
||||||
|
*
|
||||||
|
* \param camera opened camera device.
|
||||||
|
* \param spec the SDL_CameraSpec to be initialized by this function.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_GetCameraFormat(SDL_Camera *camera, SDL_CameraSpec *spec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acquire a frame.
|
||||||
|
*
|
||||||
|
* The frame is a memory pointer to the image data, whose size and format are
|
||||||
|
* given by the spec requested when opening the device.
|
||||||
|
*
|
||||||
|
* This is a non blocking API. If there is a frame available, a non-NULL
|
||||||
|
* surface is returned, and timestampNS will be filled with a non-zero value.
|
||||||
|
*
|
||||||
|
* Note that an error case can also return NULL, but a NULL by itself is
|
||||||
|
* normal and just signifies that a new frame is not yet available. Note that
|
||||||
|
* even if a camera device fails outright (a USB camera is unplugged while in
|
||||||
|
* use, etc), SDL will send an event separately to notify the app, but
|
||||||
|
* continue to provide blank frames at ongoing intervals until
|
||||||
|
* SDL_CloseCamera() is called, so real failure here is almost always an out
|
||||||
|
* of memory condition.
|
||||||
|
*
|
||||||
|
* After use, the frame should be released with SDL_ReleaseCameraFrame(). If
|
||||||
|
* you don't do this, the system may stop providing more video!
|
||||||
|
*
|
||||||
|
* Do not call SDL_DestroySurface() on the returned surface! It must be given
|
||||||
|
* back to the camera subsystem with SDL_ReleaseCameraFrame!
|
||||||
|
*
|
||||||
|
* If the system is waiting for the user to approve access to the camera, as
|
||||||
|
* some platforms require, this will return NULL (no frames available); you
|
||||||
|
* should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or
|
||||||
|
* SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll
|
||||||
|
* SDL_GetCameraPermissionState() occasionally until it returns non-zero.
|
||||||
|
*
|
||||||
|
* \param camera opened camera device.
|
||||||
|
* \param timestampNS a pointer filled in with the frame's timestamp, or 0 on
|
||||||
|
* error. Can be NULL.
|
||||||
|
* \returns a new frame of video on success, NULL if none is currently
|
||||||
|
* available.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ReleaseCameraFrame
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Surface * SDLCALL SDL_AcquireCameraFrame(SDL_Camera *camera, Uint64 *timestampNS);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release a frame of video acquired from a camera.
|
||||||
|
*
|
||||||
|
* Let the back-end re-use the internal buffer for camera.
|
||||||
|
*
|
||||||
|
* This function _must_ be called only on surface objects returned by
|
||||||
|
* SDL_AcquireCameraFrame(). This function should be called as quickly as
|
||||||
|
* possible after acquisition, as SDL keeps a small FIFO queue of surfaces for
|
||||||
|
* video frames; if surfaces aren't released in a timely manner, SDL may drop
|
||||||
|
* upcoming video frames from the camera.
|
||||||
|
*
|
||||||
|
* If the app needs to keep the surface for a significant time, they should
|
||||||
|
* make a copy of it and release the original.
|
||||||
|
*
|
||||||
|
* The app should not use the surface again after calling this function;
|
||||||
|
* assume the surface is freed and the pointer is invalid.
|
||||||
|
*
|
||||||
|
* \param camera opened camera device.
|
||||||
|
* \param frame the video frame surface to release.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AcquireCameraFrame
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ReleaseCameraFrame(SDL_Camera *camera, SDL_Surface *frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this function to shut down camera processing and close the camera
|
||||||
|
* device.
|
||||||
|
*
|
||||||
|
* \param camera opened camera device.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread, but no
|
||||||
|
* thread may reference `device` once this function is called.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_OpenCamera
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_CloseCamera(SDL_Camera *camera);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_camera_h_ */
|
||||||
Vendored
+331
@@ -0,0 +1,331 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryClipboard
|
||||||
|
*
|
||||||
|
* SDL provides access to the system clipboard, both for reading information
|
||||||
|
* from other processes and publishing information of its own.
|
||||||
|
*
|
||||||
|
* This is not just text! SDL apps can access and publish data by mimetype.
|
||||||
|
*
|
||||||
|
* ## Basic use (text)
|
||||||
|
*
|
||||||
|
* Obtaining and publishing simple text to the system clipboard is as easy as
|
||||||
|
* calling SDL_GetClipboardText() and SDL_SetClipboardText(), respectively.
|
||||||
|
* These deal with C strings in UTF-8 encoding. Data transmission and encoding
|
||||||
|
* conversion is completely managed by SDL.
|
||||||
|
*
|
||||||
|
* ## Clipboard callbacks (data other than text)
|
||||||
|
*
|
||||||
|
* Things get more complicated when the clipboard contains something other
|
||||||
|
* than text. Not only can the system clipboard contain data of any type, in
|
||||||
|
* some cases it can contain the same data in different formats! For example,
|
||||||
|
* an image painting app might let the user copy a graphic to the clipboard,
|
||||||
|
* and offers it in .BMP, .JPG, or .PNG format for other apps to consume.
|
||||||
|
*
|
||||||
|
* Obtaining clipboard data ("pasting") like this is a matter of calling
|
||||||
|
* SDL_GetClipboardData() and telling it the mimetype of the data you want.
|
||||||
|
* But how does one know if that format is available? SDL_HasClipboardData()
|
||||||
|
* can report if a specific mimetype is offered, and
|
||||||
|
* SDL_GetClipboardMimeTypes() can provide the entire list of mimetypes
|
||||||
|
* available, so the app can decide what to do with the data and what formats
|
||||||
|
* it can support.
|
||||||
|
*
|
||||||
|
* Setting the clipboard ("copying") to arbitrary data is done with
|
||||||
|
* SDL_SetClipboardData. The app does not provide the data in this call, but
|
||||||
|
* rather the mimetypes it is willing to provide and a callback function.
|
||||||
|
* During the callback, the app will generate the data. This allows massive
|
||||||
|
* data sets to be provided to the clipboard, without any data being copied
|
||||||
|
* before it is explicitly requested. More specifically, it allows an app to
|
||||||
|
* offer data in multiple formats without providing a copy of all of them
|
||||||
|
* upfront. If the app has an image that it could provide in PNG or JPG
|
||||||
|
* format, it doesn't have to encode it to either of those unless and until
|
||||||
|
* something tries to paste it.
|
||||||
|
*
|
||||||
|
* ## Primary Selection
|
||||||
|
*
|
||||||
|
* The X11 and Wayland video targets have a concept of the "primary selection"
|
||||||
|
* in addition to the usual clipboard. This is generally highlighted (but not
|
||||||
|
* explicitly copied) text from various apps. SDL offers APIs for this through
|
||||||
|
* SDL_GetPrimarySelectionText() and SDL_SetPrimarySelectionText(). SDL offers
|
||||||
|
* these APIs on platforms without this concept, too, but only so far that it
|
||||||
|
* will keep a copy of a string that the app sets for later retrieval; the
|
||||||
|
* operating system will not ever attempt to change the string externally if
|
||||||
|
* it doesn't support a primary selection.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_clipboard_h_
|
||||||
|
#define SDL_clipboard_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put UTF-8 text into the clipboard.
|
||||||
|
*
|
||||||
|
* \param text the text to store in the clipboard.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetClipboardText
|
||||||
|
* \sa SDL_HasClipboardText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get UTF-8 text from the clipboard.
|
||||||
|
*
|
||||||
|
* This functions returns an empty string if there was not enough memory left
|
||||||
|
* for a copy of the clipboard's content.
|
||||||
|
*
|
||||||
|
* \returns the clipboard text on success or an empty string on failure; call
|
||||||
|
* SDL_GetError() for more information. This should be freed with
|
||||||
|
* SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasClipboardText
|
||||||
|
* \sa SDL_SetClipboardText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char * SDLCALL SDL_GetClipboardText(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query whether the clipboard exists and contains a non-empty text string.
|
||||||
|
*
|
||||||
|
* \returns true if the clipboard has text, or false if it does not.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetClipboardText
|
||||||
|
* \sa SDL_SetClipboardText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardText(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put UTF-8 text into the primary selection.
|
||||||
|
*
|
||||||
|
* \param text the text to store in the primary selection.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetPrimarySelectionText
|
||||||
|
* \sa SDL_HasPrimarySelectionText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get UTF-8 text from the primary selection.
|
||||||
|
*
|
||||||
|
* This functions returns an empty string if there was not enough memory left
|
||||||
|
* for a copy of the primary selection's content.
|
||||||
|
*
|
||||||
|
* \returns the primary selection text on success or an empty string on
|
||||||
|
* failure; call SDL_GetError() for more information. This should be
|
||||||
|
* freed with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasPrimarySelectionText
|
||||||
|
* \sa SDL_SetPrimarySelectionText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query whether the primary selection exists and contains a non-empty text
|
||||||
|
* string.
|
||||||
|
*
|
||||||
|
* \returns true if the primary selection has text, or false if it does not.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetPrimarySelectionText
|
||||||
|
* \sa SDL_SetPrimarySelectionText
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function that will be called when data for the specified mime-type
|
||||||
|
* is requested by the OS.
|
||||||
|
*
|
||||||
|
* The callback function is called with NULL as the mime_type when the
|
||||||
|
* clipboard is cleared or new data is set. The clipboard is automatically
|
||||||
|
* cleared in SDL_Quit().
|
||||||
|
*
|
||||||
|
* \param userdata a pointer to provided user data.
|
||||||
|
* \param mime_type the requested mime-type.
|
||||||
|
* \param size a pointer filled in with the length of the returned data.
|
||||||
|
* \returns a pointer to the data for the provided mime-type. Returning NULL
|
||||||
|
* or setting length to 0 will cause no data to be sent to the
|
||||||
|
* "receiver". It is up to the receiver to handle this. Essentially
|
||||||
|
* returning no data is more or less undefined behavior and may cause
|
||||||
|
* breakage in receiving applications. The returned data will not be
|
||||||
|
* freed so it needs to be retained and dealt with internally.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
*/
|
||||||
|
typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const char *mime_type, size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback function that will be called when the clipboard is cleared, or new
|
||||||
|
* data is set.
|
||||||
|
*
|
||||||
|
* \param userdata a pointer to provided user data.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
*/
|
||||||
|
typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offer clipboard data to the OS.
|
||||||
|
*
|
||||||
|
* Tell the operating system that the application is offering clipboard data
|
||||||
|
* for each of the provided mime-types. Once another application requests the
|
||||||
|
* data the callback function will be called, allowing it to generate and
|
||||||
|
* respond with the data for the requested mime-type.
|
||||||
|
*
|
||||||
|
* The size of text data does not include any terminator, and the text does
|
||||||
|
* not need to be null terminated (e.g. you can directly copy a portion of a
|
||||||
|
* document).
|
||||||
|
*
|
||||||
|
* \param callback a function pointer to the function that provides the
|
||||||
|
* clipboard data.
|
||||||
|
* \param cleanup a function pointer to the function that cleans up the
|
||||||
|
* clipboard data.
|
||||||
|
* \param userdata an opaque pointer that will be forwarded to the callbacks.
|
||||||
|
* \param mime_types a list of mime-types that are being offered.
|
||||||
|
* \param num_mime_types the number of mime-types in the mime_types list.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ClearClipboardData
|
||||||
|
* \sa SDL_GetClipboardData
|
||||||
|
* \sa SDL_HasClipboardData
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback callback, SDL_ClipboardCleanupCallback cleanup, void *userdata, const char **mime_types, size_t num_mime_types);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the clipboard data.
|
||||||
|
*
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data from clipboard for a given mime type.
|
||||||
|
*
|
||||||
|
* The size of text data does not include the terminator, but the text is
|
||||||
|
* guaranteed to be null terminated.
|
||||||
|
*
|
||||||
|
* \param mime_type the mime type to read from the clipboard.
|
||||||
|
* \param size a pointer filled in with the length of the returned data.
|
||||||
|
* \returns the retrieved data buffer or NULL on failure; call SDL_GetError()
|
||||||
|
* for more information. This should be freed with SDL_free() when it
|
||||||
|
* is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasClipboardData
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, size_t *size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query whether there is data in the clipboard for the provided mime type.
|
||||||
|
*
|
||||||
|
* \param mime_type the mime type to check for data for.
|
||||||
|
* \returns true if there exists data in clipboard for the provided mime type,
|
||||||
|
* false if it does not.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
* \sa SDL_GetClipboardData
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the list of mime types available in the clipboard.
|
||||||
|
*
|
||||||
|
* \param num_mime_types a pointer filled with the number of mime types, may
|
||||||
|
* be NULL.
|
||||||
|
* \returns a null terminated array of strings with mime types, or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information. This should be
|
||||||
|
* freed with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetClipboardData
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char ** SDLCALL SDL_GetClipboardMimeTypes(size_t *num_mime_types);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_clipboard_h_ */
|
||||||
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file reverses the effects of SDL_begin_code.h and should be included
|
||||||
|
* after you finish any function and structure declarations in your headers.
|
||||||
|
*
|
||||||
|
* SDL's headers use this; applications generally should not include this
|
||||||
|
* header directly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_begin_code_h
|
||||||
|
#error SDL_close_code.h included without matching SDL_begin_code.h
|
||||||
|
#endif
|
||||||
|
#undef SDL_begin_code_h
|
||||||
|
|
||||||
|
/* Reset structure packing at previous byte alignment */
|
||||||
|
#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
|
||||||
|
#ifdef __BORLANDC__
|
||||||
|
#pragma nopackwarning
|
||||||
|
#endif
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif /* Compiler needs structure packing set */
|
||||||
Vendored
+22
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Header file containing SDL's license. */
|
||||||
Vendored
+353
@@ -0,0 +1,353 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: CPUInfo */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryCPUInfo
|
||||||
|
*
|
||||||
|
* CPU feature detection for SDL.
|
||||||
|
*
|
||||||
|
* These functions are largely concerned with reporting if the system has
|
||||||
|
* access to various SIMD instruction sets, but also has other important info
|
||||||
|
* to share, such as system RAM size and number of logical CPU cores.
|
||||||
|
*
|
||||||
|
* CPU instruction set checks, like SDL_HasSSE() and SDL_HasNEON(), are
|
||||||
|
* available on all platforms, even if they don't make sense (an ARM processor
|
||||||
|
* will never have SSE and an x86 processor will never have NEON, for example,
|
||||||
|
* but these functions still exist and will simply return false in these
|
||||||
|
* cases).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_cpuinfo_h_
|
||||||
|
#define SDL_cpuinfo_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A guess for the cacheline size used for padding.
|
||||||
|
*
|
||||||
|
* Most x86 processors have a 64 byte cache line. The 64-bit PowerPC
|
||||||
|
* processors have a 128 byte cache line. We use the larger value to be
|
||||||
|
* generally safe.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_CACHELINE_SIZE 128
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of logical CPU cores available.
|
||||||
|
*
|
||||||
|
* \returns the total number of logical CPU cores. On CPUs that include
|
||||||
|
* technologies such as hyperthreading, the number of logical cores
|
||||||
|
* may be more than the number of physical cores.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetNumLogicalCPUCores(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the L1 cache line size of the CPU.
|
||||||
|
*
|
||||||
|
* This is useful for determining multi-threaded structure padding or SIMD
|
||||||
|
* prefetch sizes.
|
||||||
|
*
|
||||||
|
* \returns the L1 cache line size of the CPU, in bytes.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has AltiVec features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using PowerPC instruction
|
||||||
|
* sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has AltiVec features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasAltiVec(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has MMX features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has MMX features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasMMX(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has SSE features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has SSE features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasSSE2
|
||||||
|
* \sa SDL_HasSSE3
|
||||||
|
* \sa SDL_HasSSE41
|
||||||
|
* \sa SDL_HasSSE42
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has SSE2 features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has SSE2 features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasSSE
|
||||||
|
* \sa SDL_HasSSE3
|
||||||
|
* \sa SDL_HasSSE41
|
||||||
|
* \sa SDL_HasSSE42
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE2(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has SSE3 features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has SSE3 features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasSSE
|
||||||
|
* \sa SDL_HasSSE2
|
||||||
|
* \sa SDL_HasSSE41
|
||||||
|
* \sa SDL_HasSSE42
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE3(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has SSE4.1 features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has SSE4.1 features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasSSE
|
||||||
|
* \sa SDL_HasSSE2
|
||||||
|
* \sa SDL_HasSSE3
|
||||||
|
* \sa SDL_HasSSE42
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE41(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has SSE4.2 features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has SSE4.2 features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasSSE
|
||||||
|
* \sa SDL_HasSSE2
|
||||||
|
* \sa SDL_HasSSE3
|
||||||
|
* \sa SDL_HasSSE41
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasSSE42(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has AVX features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has AVX features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasAVX2
|
||||||
|
* \sa SDL_HasAVX512F
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has AVX2 features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has AVX2 features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasAVX
|
||||||
|
* \sa SDL_HasAVX512F
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX2(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has AVX-512F (foundation) features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using Intel instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has AVX-512F features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasAVX
|
||||||
|
* \sa SDL_HasAVX2
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasAVX512F(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has ARM SIMD (ARMv6) features.
|
||||||
|
*
|
||||||
|
* This is different from ARM NEON, which is a different instruction set.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using ARM instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has ARM SIMD features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasNEON
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasARMSIMD(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has NEON (ARM SIMD) features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using ARM instruction sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has ARM NEON features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasNEON(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has LSX (LOONGARCH SIMD) features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using LOONGARCH instruction
|
||||||
|
* sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has LOONGARCH LSX features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasLSX(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether the CPU has LASX (LOONGARCH SIMD) features.
|
||||||
|
*
|
||||||
|
* This always returns false on CPUs that aren't using LOONGARCH instruction
|
||||||
|
* sets.
|
||||||
|
*
|
||||||
|
* \returns true if the CPU has LOONGARCH LASX features or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasLASX(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the amount of RAM configured in the system.
|
||||||
|
*
|
||||||
|
* \returns the amount of RAM configured in the system in MiB.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_GetSystemRAM(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report the alignment this system needs for SIMD allocations.
|
||||||
|
*
|
||||||
|
* This will return the minimum number of bytes to which a pointer must be
|
||||||
|
* aligned to be compatible with SIMD instructions on the current machine. For
|
||||||
|
* example, if the machine supports SSE only, it will return 16, but if it
|
||||||
|
* supports AVX-512F, it'll return 64 (etc). This only reports values for
|
||||||
|
* instruction sets SDL knows about, so if your SDL build doesn't have
|
||||||
|
* SDL_HasAVX512F(), then it might return 16 for the SSE support it sees and
|
||||||
|
* not 64 for the AVX-512 instructions that exist but SDL doesn't know about.
|
||||||
|
* Plan accordingly.
|
||||||
|
*
|
||||||
|
* \returns the alignment in bytes needed for available, known SIMD
|
||||||
|
* instructions.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_aligned_alloc
|
||||||
|
* \sa SDL_aligned_free
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC size_t SDLCALL SDL_GetSIMDAlignment(void);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_cpuinfo_h_ */
|
||||||
Vendored
+341
@@ -0,0 +1,341 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryDialog
|
||||||
|
*
|
||||||
|
* File dialog support.
|
||||||
|
*
|
||||||
|
* SDL offers file dialogs, to let users select files with native GUI
|
||||||
|
* interfaces. There are "open" dialogs, "save" dialogs, and folder selection
|
||||||
|
* dialogs. The app can control some details, such as filtering to specific
|
||||||
|
* files, or whether multiple files can be selected by the user.
|
||||||
|
*
|
||||||
|
* Note that launching a file dialog is a non-blocking operation; control
|
||||||
|
* returns to the app immediately, and a callback is called later (possibly in
|
||||||
|
* another thread) when the user makes a choice.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_dialog_h_
|
||||||
|
#define SDL_dialog_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_properties.h>
|
||||||
|
#include <SDL3/SDL_video.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An entry for filters for file dialogs.
|
||||||
|
*
|
||||||
|
* `name` is a user-readable label for the filter (for example, "Office
|
||||||
|
* document").
|
||||||
|
*
|
||||||
|
* `pattern` is a semicolon-separated list of file extensions (for example,
|
||||||
|
* "doc;docx"). File extensions may only contain alphanumeric characters,
|
||||||
|
* hyphens, underscores and periods. Alternatively, the whole string can be a
|
||||||
|
* single asterisk ("*"), which serves as an "All files" filter.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DialogFileCallback
|
||||||
|
* \sa SDL_ShowOpenFileDialog
|
||||||
|
* \sa SDL_ShowSaveFileDialog
|
||||||
|
* \sa SDL_ShowOpenFolderDialog
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
typedef struct SDL_DialogFileFilter
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
const char *pattern;
|
||||||
|
} SDL_DialogFileFilter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback used by file dialog functions.
|
||||||
|
*
|
||||||
|
* The specific usage is described in each function.
|
||||||
|
*
|
||||||
|
* If `filelist` is:
|
||||||
|
*
|
||||||
|
* - NULL, an error occurred. Details can be obtained with SDL_GetError().
|
||||||
|
* - A pointer to NULL, the user either didn't choose any file or canceled the
|
||||||
|
* dialog.
|
||||||
|
* - A pointer to non-`NULL`, the user chose one or more files. The argument
|
||||||
|
* is a null-terminated list of pointers to C strings, each containing a
|
||||||
|
* path.
|
||||||
|
*
|
||||||
|
* The filelist argument should not be freed; it will automatically be freed
|
||||||
|
* when the callback returns.
|
||||||
|
*
|
||||||
|
* The filter argument is the index of the filter that was selected, or -1 if
|
||||||
|
* no filter was selected or if the platform or method doesn't support
|
||||||
|
* fetching the selected filter.
|
||||||
|
*
|
||||||
|
* In Android, the `filelist` are `content://` URIs. They should be opened
|
||||||
|
* using SDL_IOFromFile() with appropriate modes. This applies both to open
|
||||||
|
* and save file dialog.
|
||||||
|
*
|
||||||
|
* \param userdata an app-provided pointer, for the callback's use.
|
||||||
|
* \param filelist the file(s) chosen by the user.
|
||||||
|
* \param filter index of the selected filter.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DialogFileFilter
|
||||||
|
* \sa SDL_ShowOpenFileDialog
|
||||||
|
* \sa SDL_ShowSaveFileDialog
|
||||||
|
* \sa SDL_ShowOpenFolderDialog
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
typedef void (SDLCALL *SDL_DialogFileCallback)(void *userdata, const char * const *filelist, int filter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a dialog that lets the user select a file on their filesystem.
|
||||||
|
*
|
||||||
|
* This is an asynchronous function; it will return immediately, and the
|
||||||
|
* result will be passed to the callback.
|
||||||
|
*
|
||||||
|
* The callback will be invoked with a null-terminated list of files the user
|
||||||
|
* chose. The list will be empty if the user canceled the dialog, and it will
|
||||||
|
* be NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* Note that the callback may be called from a different thread than the one
|
||||||
|
* the function was invoked on.
|
||||||
|
*
|
||||||
|
* Depending on the platform, the user may be allowed to input paths that
|
||||||
|
* don't yet exist.
|
||||||
|
*
|
||||||
|
* On Linux, dialogs may require XDG Portals, which requires DBus, which
|
||||||
|
* requires an event-handling loop. Apps that do not use SDL to handle events
|
||||||
|
* should add a call to SDL_PumpEvents in their main loop.
|
||||||
|
*
|
||||||
|
* \param callback a function pointer to be invoked when the user selects a
|
||||||
|
* file and accepts, or cancels the dialog, or an error
|
||||||
|
* occurs.
|
||||||
|
* \param userdata an optional pointer to pass extra data to the callback when
|
||||||
|
* it will be invoked.
|
||||||
|
* \param window the window that the dialog should be modal for, may be NULL.
|
||||||
|
* Not all platforms support this option.
|
||||||
|
* \param filters a list of filters, may be NULL. Not all platforms support
|
||||||
|
* this option, and platforms that do support it may allow the
|
||||||
|
* user to ignore the filters. If non-NULL, it must remain
|
||||||
|
* valid at least until the callback is invoked.
|
||||||
|
* \param nfilters the number of filters. Ignored if filters is NULL.
|
||||||
|
* \param default_location the default folder or file to start the dialog at,
|
||||||
|
* may be NULL. Not all platforms support this option.
|
||||||
|
* \param allow_many if non-zero, the user will be allowed to select multiple
|
||||||
|
* entries. Not all platforms support this option.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should be called only from the main thread. The
|
||||||
|
* callback may be invoked from the same thread or from a
|
||||||
|
* different one, depending on the OS's constraints.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DialogFileCallback
|
||||||
|
* \sa SDL_DialogFileFilter
|
||||||
|
* \sa SDL_ShowSaveFileDialog
|
||||||
|
* \sa SDL_ShowOpenFolderDialog
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location, bool allow_many);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a dialog that lets the user choose a new or existing file on their
|
||||||
|
* filesystem.
|
||||||
|
*
|
||||||
|
* This is an asynchronous function; it will return immediately, and the
|
||||||
|
* result will be passed to the callback.
|
||||||
|
*
|
||||||
|
* The callback will be invoked with a null-terminated list of files the user
|
||||||
|
* chose. The list will be empty if the user canceled the dialog, and it will
|
||||||
|
* be NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* Note that the callback may be called from a different thread than the one
|
||||||
|
* the function was invoked on.
|
||||||
|
*
|
||||||
|
* The chosen file may or may not already exist.
|
||||||
|
*
|
||||||
|
* On Linux, dialogs may require XDG Portals, which requires DBus, which
|
||||||
|
* requires an event-handling loop. Apps that do not use SDL to handle events
|
||||||
|
* should add a call to SDL_PumpEvents in their main loop.
|
||||||
|
*
|
||||||
|
* \param callback a function pointer to be invoked when the user selects a
|
||||||
|
* file and accepts, or cancels the dialog, or an error
|
||||||
|
* occurs.
|
||||||
|
* \param userdata an optional pointer to pass extra data to the callback when
|
||||||
|
* it will be invoked.
|
||||||
|
* \param window the window that the dialog should be modal for, may be NULL.
|
||||||
|
* Not all platforms support this option.
|
||||||
|
* \param filters a list of filters, may be NULL. Not all platforms support
|
||||||
|
* this option, and platforms that do support it may allow the
|
||||||
|
* user to ignore the filters. If non-NULL, it must remain
|
||||||
|
* valid at least until the callback is invoked.
|
||||||
|
* \param nfilters the number of filters. Ignored if filters is NULL.
|
||||||
|
* \param default_location the default folder or file to start the dialog at,
|
||||||
|
* may be NULL. Not all platforms support this option.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should be called only from the main thread. The
|
||||||
|
* callback may be invoked from the same thread or from a
|
||||||
|
* different one, depending on the OS's constraints.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DialogFileCallback
|
||||||
|
* \sa SDL_DialogFileFilter
|
||||||
|
* \sa SDL_ShowOpenFileDialog
|
||||||
|
* \sa SDL_ShowOpenFolderDialog
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ShowSaveFileDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const SDL_DialogFileFilter *filters, int nfilters, const char *default_location);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a dialog that lets the user select a folder on their filesystem.
|
||||||
|
*
|
||||||
|
* This is an asynchronous function; it will return immediately, and the
|
||||||
|
* result will be passed to the callback.
|
||||||
|
*
|
||||||
|
* The callback will be invoked with a null-terminated list of files the user
|
||||||
|
* chose. The list will be empty if the user canceled the dialog, and it will
|
||||||
|
* be NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* Note that the callback may be called from a different thread than the one
|
||||||
|
* the function was invoked on.
|
||||||
|
*
|
||||||
|
* Depending on the platform, the user may be allowed to input paths that
|
||||||
|
* don't yet exist.
|
||||||
|
*
|
||||||
|
* On Linux, dialogs may require XDG Portals, which requires DBus, which
|
||||||
|
* requires an event-handling loop. Apps that do not use SDL to handle events
|
||||||
|
* should add a call to SDL_PumpEvents in their main loop.
|
||||||
|
*
|
||||||
|
* \param callback a function pointer to be invoked when the user selects a
|
||||||
|
* file and accepts, or cancels the dialog, or an error
|
||||||
|
* occurs.
|
||||||
|
* \param userdata an optional pointer to pass extra data to the callback when
|
||||||
|
* it will be invoked.
|
||||||
|
* \param window the window that the dialog should be modal for, may be NULL.
|
||||||
|
* Not all platforms support this option.
|
||||||
|
* \param default_location the default folder or file to start the dialog at,
|
||||||
|
* may be NULL. Not all platforms support this option.
|
||||||
|
* \param allow_many if non-zero, the user will be allowed to select multiple
|
||||||
|
* entries. Not all platforms support this option.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should be called only from the main thread. The
|
||||||
|
* callback may be invoked from the same thread or from a
|
||||||
|
* different one, depending on the OS's constraints.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DialogFileCallback
|
||||||
|
* \sa SDL_ShowOpenFileDialog
|
||||||
|
* \sa SDL_ShowSaveFileDialog
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void *userdata, SDL_Window *window, const char *default_location, bool allow_many);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Various types of file dialogs.
|
||||||
|
*
|
||||||
|
* This is used by SDL_ShowFileDialogWithProperties() to decide what kind of
|
||||||
|
* dialog to present to the user.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ShowFileDialogWithProperties
|
||||||
|
*/
|
||||||
|
typedef enum SDL_FileDialogType
|
||||||
|
{
|
||||||
|
SDL_FILEDIALOG_OPENFILE,
|
||||||
|
SDL_FILEDIALOG_SAVEFILE,
|
||||||
|
SDL_FILEDIALOG_OPENFOLDER
|
||||||
|
} SDL_FileDialogType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create and launch a file dialog with the specified properties.
|
||||||
|
*
|
||||||
|
* These are the supported properties:
|
||||||
|
*
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_FILTERS_POINTER`: a pointer to a list of
|
||||||
|
* SDL_DialogFileFilter structs, which will be used as filters for
|
||||||
|
* file-based selections. Ignored if the dialog is an "Open Folder" dialog.
|
||||||
|
* If non-NULL, the array of filters must remain valid at least until the
|
||||||
|
* callback is invoked.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER`: the number of filters in the
|
||||||
|
* array of filters, if it exists.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_WINDOW_POINTER`: the window that the dialog should
|
||||||
|
* be modal for.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_LOCATION_STRING`: the default folder or file to
|
||||||
|
* start the dialog at.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_MANY_BOOLEAN`: true to allow the user to select
|
||||||
|
* more than one entry.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_TITLE_STRING`: the title for the dialog.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_ACCEPT_STRING`: the label that the accept button
|
||||||
|
* should have.
|
||||||
|
* - `SDL_PROP_FILE_DIALOG_CANCEL_STRING`: the label that the cancel button
|
||||||
|
* should have.
|
||||||
|
*
|
||||||
|
* Note that each platform may or may not support any of the properties.
|
||||||
|
*
|
||||||
|
* \param type the type of file dialog.
|
||||||
|
* \param callback a function pointer to be invoked when the user selects a
|
||||||
|
* file and accepts, or cancels the dialog, or an error
|
||||||
|
* occurs.
|
||||||
|
* \param userdata an optional pointer to pass extra data to the callback when
|
||||||
|
* it will be invoked.
|
||||||
|
* \param props the properties to use.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should be called only from the main thread. The
|
||||||
|
* callback may be invoked from the same thread or from a
|
||||||
|
* different one, depending on the OS's constraints.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_FileDialogType
|
||||||
|
* \sa SDL_DialogFileCallback
|
||||||
|
* \sa SDL_DialogFileFilter
|
||||||
|
* \sa SDL_ShowOpenFileDialog
|
||||||
|
* \sa SDL_ShowSaveFileDialog
|
||||||
|
* \sa SDL_ShowOpenFolderDialog
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ShowFileDialogWithProperties(SDL_FileDialogType type, SDL_DialogFileCallback callback, void *userdata, SDL_PropertiesID props);
|
||||||
|
|
||||||
|
#define SDL_PROP_FILE_DIALOG_FILTERS_POINTER "SDL.filedialog.filters"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER "SDL.filedialog.nfilters"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_WINDOW_POINTER "SDL.filedialog.window"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_LOCATION_STRING "SDL.filedialog.location"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_MANY_BOOLEAN "SDL.filedialog.many"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_TITLE_STRING "SDL.filedialog.title"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_ACCEPT_STRING "SDL.filedialog.accept"
|
||||||
|
#define SDL_PROP_FILE_DIALOG_CANCEL_STRING "SDL.filedialog.cancel"
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_dialog_h_ */
|
||||||
Vendored
+2355
File diff suppressed because it is too large
Load Diff
Vendored
+645
@@ -0,0 +1,645 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryEndian
|
||||||
|
*
|
||||||
|
* Functions converting endian-specific values to different byte orders.
|
||||||
|
*
|
||||||
|
* These functions either unconditionally swap byte order (SDL_Swap16,
|
||||||
|
* SDL_Swap32, SDL_Swap64, SDL_SwapFloat), or they swap to/from the system's
|
||||||
|
* native byte order (SDL_Swap16LE, SDL_Swap16BE, SDL_Swap32LE, SDL_Swap32BE,
|
||||||
|
* SDL_Swap32LE, SDL_Swap32BE, SDL_SwapFloatLE, SDL_SwapFloatBE). In the
|
||||||
|
* latter case, the functionality is provided by macros that become no-ops if
|
||||||
|
* a swap isn't necessary: on an x86 (littleendian) processor, SDL_Swap32LE
|
||||||
|
* does nothing, but SDL_Swap32BE reverses the bytes of the data. On a PowerPC
|
||||||
|
* processor (bigendian), the macros behavior is reversed.
|
||||||
|
*
|
||||||
|
* The swap routines are inline functions, and attempt to use compiler
|
||||||
|
* intrinsics, inline assembly, and other magic to make byteswapping
|
||||||
|
* efficient.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_endian_h_
|
||||||
|
#define SDL_endian_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||||
|
/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
|
||||||
|
so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
|
||||||
|
#ifdef __clang__
|
||||||
|
#ifndef __PRFCHWINTRIN_H
|
||||||
|
#define __PRFCHWINTRIN_H
|
||||||
|
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||||
|
_m_prefetch(void *__P)
|
||||||
|
{
|
||||||
|
__builtin_prefetch(__P, 0, 3 /* _MM_HINT_T0 */);
|
||||||
|
}
|
||||||
|
#endif /* __PRFCHWINTRIN_H */
|
||||||
|
#endif /* __clang__ */
|
||||||
|
|
||||||
|
#include <intrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name The two types of endianness
|
||||||
|
*/
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A value to represent littleendian byteorder.
|
||||||
|
*
|
||||||
|
* This is used with the preprocessor macro SDL_BYTEORDER, to determine a
|
||||||
|
* platform's byte ordering:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* #if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||||
|
* SDL_Log("This system is littleendian.");
|
||||||
|
* #endif
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_BYTEORDER
|
||||||
|
* \sa SDL_BIG_ENDIAN
|
||||||
|
*/
|
||||||
|
#define SDL_LIL_ENDIAN 1234
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A value to represent bigendian byteorder.
|
||||||
|
*
|
||||||
|
* This is used with the preprocessor macro SDL_BYTEORDER, to determine a
|
||||||
|
* platform's byte ordering:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* #if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||||
|
* SDL_Log("This system is bigendian.");
|
||||||
|
* #endif
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_BYTEORDER
|
||||||
|
* \sa SDL_LIL_ENDIAN
|
||||||
|
*/
|
||||||
|
#define SDL_BIG_ENDIAN 4321
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
||||||
|
#ifndef SDL_BYTEORDER
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro that reports the target system's byte order.
|
||||||
|
*
|
||||||
|
* This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other
|
||||||
|
* values in the future, if something else becomes popular). This can be
|
||||||
|
* tested with the preprocessor, so decisions can be made at compile time.
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* #if SDL_BYTEORDER == SDL_BIG_ENDIAN
|
||||||
|
* SDL_Log("This system is bigendian.");
|
||||||
|
* #endif
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LIL_ENDIAN
|
||||||
|
* \sa SDL_BIG_ENDIAN
|
||||||
|
*/
|
||||||
|
#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
|
||||||
|
#elif defined(SDL_PLATFORM_LINUX)
|
||||||
|
#include <endian.h>
|
||||||
|
#define SDL_BYTEORDER __BYTE_ORDER
|
||||||
|
#elif defined(SDL_PLATFORM_SOLARIS)
|
||||||
|
#include <sys/byteorder.h>
|
||||||
|
#if defined(_LITTLE_ENDIAN)
|
||||||
|
#define SDL_BYTEORDER SDL_LIL_ENDIAN
|
||||||
|
#elif defined(_BIG_ENDIAN)
|
||||||
|
#define SDL_BYTEORDER SDL_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#error Unsupported endianness
|
||||||
|
#endif
|
||||||
|
#elif defined(SDL_PLATFORM_OPENBSD) || defined(__DragonFly__)
|
||||||
|
#include <endian.h>
|
||||||
|
#define SDL_BYTEORDER BYTE_ORDER
|
||||||
|
#elif defined(SDL_PLATFORM_FREEBSD) || defined(SDL_PLATFORM_NETBSD)
|
||||||
|
#include <sys/endian.h>
|
||||||
|
#define SDL_BYTEORDER BYTE_ORDER
|
||||||
|
/* predefs from newer gcc and clang versions: */
|
||||||
|
#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__)
|
||||||
|
#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
||||||
|
#define SDL_BYTEORDER SDL_LIL_ENDIAN
|
||||||
|
#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
|
#define SDL_BYTEORDER SDL_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#error Unsupported endianness
|
||||||
|
#endif /**/
|
||||||
|
#else
|
||||||
|
#if defined(__hppa__) || \
|
||||||
|
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
|
||||||
|
(defined(__MIPS__) && defined(__MIPSEB__)) || \
|
||||||
|
defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \
|
||||||
|
defined(__sparc__) || defined(__sparc)
|
||||||
|
#define SDL_BYTEORDER SDL_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#define SDL_BYTEORDER SDL_LIL_ENDIAN
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_PLATFORM_LINUX */
|
||||||
|
#endif /* !SDL_BYTEORDER */
|
||||||
|
|
||||||
|
#ifndef SDL_FLOATWORDORDER
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro that reports the target system's floating point word order.
|
||||||
|
*
|
||||||
|
* This is set to either SDL_LIL_ENDIAN or SDL_BIG_ENDIAN (and maybe other
|
||||||
|
* values in the future, if something else becomes popular). This can be
|
||||||
|
* tested with the preprocessor, so decisions can be made at compile time.
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* #if SDL_FLOATWORDORDER == SDL_BIG_ENDIAN
|
||||||
|
* SDL_Log("This system's floats are bigendian.");
|
||||||
|
* #endif
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LIL_ENDIAN
|
||||||
|
* \sa SDL_BIG_ENDIAN
|
||||||
|
*/
|
||||||
|
#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
|
||||||
|
/* predefs from newer gcc versions: */
|
||||||
|
#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__)
|
||||||
|
#if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
||||||
|
#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
|
||||||
|
#elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
|
#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
#error Unsupported endianness
|
||||||
|
#endif /**/
|
||||||
|
#elif defined(__MAVERICK__)
|
||||||
|
/* For Maverick, float words are always little-endian. */
|
||||||
|
#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN
|
||||||
|
#elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__)
|
||||||
|
/* For FPA, float words are always big-endian. */
|
||||||
|
#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN
|
||||||
|
#else
|
||||||
|
/* By default, assume that floats words follow the memory system mode. */
|
||||||
|
#define SDL_FLOATWORDORDER SDL_BYTEORDER
|
||||||
|
#endif /* __FLOAT_WORD_ORDER__ */
|
||||||
|
#endif /* !SDL_FLOATWORDORDER */
|
||||||
|
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* various modern compilers may have builtin swap */
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
# define HAS_BUILTIN_BSWAP16 (SDL_HAS_BUILTIN(__builtin_bswap16)) || \
|
||||||
|
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
|
||||||
|
# define HAS_BUILTIN_BSWAP32 (SDL_HAS_BUILTIN(__builtin_bswap32)) || \
|
||||||
|
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
|
||||||
|
# define HAS_BUILTIN_BSWAP64 (SDL_HAS_BUILTIN(__builtin_bswap64)) || \
|
||||||
|
(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
|
||||||
|
|
||||||
|
/* this one is broken */
|
||||||
|
# define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95)
|
||||||
|
#else
|
||||||
|
# define HAS_BUILTIN_BSWAP16 0
|
||||||
|
# define HAS_BUILTIN_BSWAP32 0
|
||||||
|
# define HAS_BUILTIN_BSWAP64 0
|
||||||
|
# define HAS_BROKEN_BSWAP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Byte swap 16-bit integer. */
|
||||||
|
#ifndef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
#if HAS_BUILTIN_BSWAP16
|
||||||
|
#define SDL_Swap16(x) __builtin_bswap16(x)
|
||||||
|
#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
|
||||||
|
#pragma intrinsic(_byteswap_ushort)
|
||||||
|
#define SDL_Swap16(x) _byteswap_ushort(x)
|
||||||
|
#elif defined(__i386__) && !HAS_BROKEN_BSWAP
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
|
||||||
|
{
|
||||||
|
__asm__("xchgb %b0,%h0": "=q"(x):"0"(x));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
|
||||||
|
{
|
||||||
|
__asm__("xchgb %b0,%h0": "=Q"(x):"0"(x));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif (defined(__powerpc__) || defined(__ppc__))
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
__asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
|
||||||
|
return (Uint16)result;
|
||||||
|
}
|
||||||
|
#elif (defined(__m68k__) && !defined(__mcoldfire__))
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
|
||||||
|
{
|
||||||
|
__asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif defined(__WATCOMC__) && defined(__386__)
|
||||||
|
extern __inline Uint16 SDL_Swap16(Uint16);
|
||||||
|
#pragma aux SDL_Swap16 = \
|
||||||
|
"xchg al, ah" \
|
||||||
|
parm [ax] \
|
||||||
|
modify [ax];
|
||||||
|
#else
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x)
|
||||||
|
{
|
||||||
|
return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Byte swap 32-bit integer. */
|
||||||
|
#ifndef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
#if HAS_BUILTIN_BSWAP32
|
||||||
|
#define SDL_Swap32(x) __builtin_bswap32(x)
|
||||||
|
#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
|
||||||
|
#pragma intrinsic(_byteswap_ulong)
|
||||||
|
#define SDL_Swap32(x) _byteswap_ulong(x)
|
||||||
|
#elif defined(__i386__) && !HAS_BROKEN_BSWAP
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
|
||||||
|
{
|
||||||
|
__asm__("bswap %0": "=r"(x):"0"(x));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
|
||||||
|
{
|
||||||
|
__asm__("bswapl %0": "=r"(x):"0"(x));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif (defined(__powerpc__) || defined(__ppc__))
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
|
||||||
|
{
|
||||||
|
Uint32 result;
|
||||||
|
|
||||||
|
__asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x));
|
||||||
|
__asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x));
|
||||||
|
__asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#elif (defined(__m68k__) && !defined(__mcoldfire__))
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
|
||||||
|
{
|
||||||
|
__asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif defined(__WATCOMC__) && defined(__386__)
|
||||||
|
extern __inline Uint32 SDL_Swap32(Uint32);
|
||||||
|
#pragma aux SDL_Swap32 = \
|
||||||
|
"bswap eax" \
|
||||||
|
parm [eax] \
|
||||||
|
modify [eax];
|
||||||
|
#else
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x)
|
||||||
|
{
|
||||||
|
return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |
|
||||||
|
((x >> 8) & 0x0000FF00) | (x >> 24)));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Byte swap 64-bit integer. */
|
||||||
|
#ifndef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
#if HAS_BUILTIN_BSWAP64
|
||||||
|
#define SDL_Swap64(x) __builtin_bswap64(x)
|
||||||
|
#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && !defined(__ICL)
|
||||||
|
#pragma intrinsic(_byteswap_uint64)
|
||||||
|
#define SDL_Swap64(x) _byteswap_uint64(x)
|
||||||
|
#elif defined(__i386__) && !HAS_BROKEN_BSWAP
|
||||||
|
SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
Uint32 a, b;
|
||||||
|
} s;
|
||||||
|
Uint64 u;
|
||||||
|
} v;
|
||||||
|
v.u = x;
|
||||||
|
__asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
|
||||||
|
: "=r"(v.s.a), "=r"(v.s.b)
|
||||||
|
: "0" (v.s.a), "1"(v.s.b));
|
||||||
|
return v.u;
|
||||||
|
}
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
|
||||||
|
{
|
||||||
|
__asm__("bswapq %0": "=r"(x):"0"(x));
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#elif defined(__WATCOMC__) && defined(__386__)
|
||||||
|
extern __inline Uint64 SDL_Swap64(Uint64);
|
||||||
|
#pragma aux SDL_Swap64 = \
|
||||||
|
"bswap eax" \
|
||||||
|
"bswap edx" \
|
||||||
|
"xchg eax,edx" \
|
||||||
|
parm [eax edx] \
|
||||||
|
modify [eax edx];
|
||||||
|
#else
|
||||||
|
SDL_FORCE_INLINE Uint64 SDL_Swap64(Uint64 x)
|
||||||
|
{
|
||||||
|
Uint32 hi, lo;
|
||||||
|
|
||||||
|
/* Separate into high and low 32-bit values and swap them */
|
||||||
|
lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
|
||||||
|
x >>= 32;
|
||||||
|
hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
|
||||||
|
x = SDL_Swap32(lo);
|
||||||
|
x <<= 32;
|
||||||
|
x |= SDL_Swap32(hi);
|
||||||
|
return (x);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-swap a floating point number.
|
||||||
|
*
|
||||||
|
* This will always byte-swap the value, whether it's currently in the native
|
||||||
|
* byteorder of the system or not. You should use SDL_SwapFloatLE or
|
||||||
|
* SDL_SwapFloatBE instead, in most cases.
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the value to byte-swap.
|
||||||
|
* \returns x, with its bytes in the opposite endian order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE float SDL_SwapFloat(float x)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
float f;
|
||||||
|
Uint32 ui32;
|
||||||
|
} swapper;
|
||||||
|
swapper.f = x;
|
||||||
|
swapper.ui32 = SDL_Swap32(swapper.ui32);
|
||||||
|
return swapper.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove extra macros */
|
||||||
|
#undef HAS_BROKEN_BSWAP
|
||||||
|
#undef HAS_BUILTIN_BSWAP16
|
||||||
|
#undef HAS_BUILTIN_BSWAP32
|
||||||
|
#undef HAS_BUILTIN_BSWAP64
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-swap an unsigned 16-bit number.
|
||||||
|
*
|
||||||
|
* This will always byte-swap the value, whether it's currently in the native
|
||||||
|
* byteorder of the system or not. You should use SDL_Swap16LE or SDL_Swap16BE
|
||||||
|
* instead, in most cases.
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the value to byte-swap.
|
||||||
|
* \returns `x`, with its bytes in the opposite endian order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE Uint16 SDL_Swap16(Uint16 x) { return x_but_byteswapped; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-swap an unsigned 32-bit number.
|
||||||
|
*
|
||||||
|
* This will always byte-swap the value, whether it's currently in the native
|
||||||
|
* byteorder of the system or not. You should use SDL_Swap32LE or SDL_Swap32BE
|
||||||
|
* instead, in most cases.
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the value to byte-swap.
|
||||||
|
* \returns `x`, with its bytes in the opposite endian order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap32(Uint32 x) { return x_but_byteswapped; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Byte-swap an unsigned 64-bit number.
|
||||||
|
*
|
||||||
|
* This will always byte-swap the value, whether it's currently in the native
|
||||||
|
* byteorder of the system or not. You should use SDL_Swap64LE or SDL_Swap64BE
|
||||||
|
* instead, in most cases.
|
||||||
|
*
|
||||||
|
* Note that this is a forced-inline function in a header, and not a public
|
||||||
|
* API function available in the SDL library (which is to say, the code is
|
||||||
|
* embedded in the calling program and the linker and dynamic loader will not
|
||||||
|
* be able to find this function inside SDL itself).
|
||||||
|
*
|
||||||
|
* \param x the value to byte-swap.
|
||||||
|
* \returns `x`, with its bytes in the opposite endian order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
SDL_FORCE_INLINE Uint32 SDL_Swap64(Uint64 x) { return x_but_byteswapped; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 16-bit value from littleendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a littleendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in littleendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap16LE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 32-bit value from littleendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a littleendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in littleendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap32LE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 64-bit value from littleendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a littleendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in littleendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap64LE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a floating point value from littleendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a littleendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in littleendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_SwapFloatLE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 16-bit value from bigendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a bigendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in bigendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap16BE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 32-bit value from bigendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a bigendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in bigendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap32BE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a 64-bit value from bigendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a bigendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in bigendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Swap64BE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swap a floating point value from bigendian to native byte order.
|
||||||
|
*
|
||||||
|
* If this is running on a bigendian system, `x` is returned unchanged.
|
||||||
|
*
|
||||||
|
* This macro never references `x` more than once, avoiding side effects.
|
||||||
|
*
|
||||||
|
* \param x the value to swap, in bigendian byte order.
|
||||||
|
* \returns `x` in native byte order.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_SwapFloatBE(x) SwapOnlyIfNecessary(x)
|
||||||
|
|
||||||
|
#elif SDL_BYTEORDER == SDL_LIL_ENDIAN
|
||||||
|
#define SDL_Swap16LE(x) (x)
|
||||||
|
#define SDL_Swap32LE(x) (x)
|
||||||
|
#define SDL_Swap64LE(x) (x)
|
||||||
|
#define SDL_SwapFloatLE(x) (x)
|
||||||
|
#define SDL_Swap16BE(x) SDL_Swap16(x)
|
||||||
|
#define SDL_Swap32BE(x) SDL_Swap32(x)
|
||||||
|
#define SDL_Swap64BE(x) SDL_Swap64(x)
|
||||||
|
#define SDL_SwapFloatBE(x) SDL_SwapFloat(x)
|
||||||
|
#else
|
||||||
|
#define SDL_Swap16LE(x) SDL_Swap16(x)
|
||||||
|
#define SDL_Swap32LE(x) SDL_Swap32(x)
|
||||||
|
#define SDL_Swap64LE(x) SDL_Swap64(x)
|
||||||
|
#define SDL_SwapFloatLE(x) SDL_SwapFloat(x)
|
||||||
|
#define SDL_Swap16BE(x) (x)
|
||||||
|
#define SDL_Swap32BE(x) (x)
|
||||||
|
#define SDL_Swap64BE(x) (x)
|
||||||
|
#define SDL_SwapFloatBE(x) (x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_endian_h_ */
|
||||||
Vendored
+226
@@ -0,0 +1,226 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryError
|
||||||
|
*
|
||||||
|
* Simple error message routines for SDL.
|
||||||
|
*
|
||||||
|
* Most apps will interface with these APIs in exactly one function: when
|
||||||
|
* almost any SDL function call reports failure, you can get a human-readable
|
||||||
|
* string of the problem from SDL_GetError().
|
||||||
|
*
|
||||||
|
* These strings are maintained per-thread, and apps are welcome to set their
|
||||||
|
* own errors, which is popular when building libraries on top of SDL for
|
||||||
|
* other apps to consume. These strings are set by calling SDL_SetError().
|
||||||
|
*
|
||||||
|
* A common usage pattern is to have a function that returns true for success
|
||||||
|
* and false for failure, and do this when something fails:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* if (something_went_wrong) {
|
||||||
|
* return SDL_SetError("The thing broke in this specific way: %d", errcode);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* It's also common to just return `false` in this case if the failing thing
|
||||||
|
* is known to call SDL_SetError(), so errors simply propagate through.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_error_h_
|
||||||
|
#define SDL_error_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Public functions */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SDL error message for the current thread.
|
||||||
|
*
|
||||||
|
* Calling this function will replace any previous error message that was set.
|
||||||
|
*
|
||||||
|
* This function always returns false, since SDL frequently uses false to
|
||||||
|
* signify a failing result, leading to this idiom:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* if (error_code) {
|
||||||
|
* return SDL_SetError("This operation has failed: %d", error_code);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \param fmt a printf()-style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the `fmt` string, if
|
||||||
|
* any.
|
||||||
|
* \returns false.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ClearError
|
||||||
|
* \sa SDL_GetError
|
||||||
|
* \sa SDL_SetErrorV
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the SDL error message for the current thread.
|
||||||
|
*
|
||||||
|
* Calling this function will replace any previous error message that was set.
|
||||||
|
*
|
||||||
|
* \param fmt a printf()-style message format string.
|
||||||
|
* \param ap a variable argument list.
|
||||||
|
* \returns false.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ClearError
|
||||||
|
* \sa SDL_GetError
|
||||||
|
* \sa SDL_SetError
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetErrorV(SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an error indicating that memory allocation failed.
|
||||||
|
*
|
||||||
|
* This function does not do any memory allocation.
|
||||||
|
*
|
||||||
|
* \returns false.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_OutOfMemory(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a message about the last error that occurred on the current
|
||||||
|
* thread.
|
||||||
|
*
|
||||||
|
* It is possible for multiple errors to occur before calling SDL_GetError().
|
||||||
|
* Only the last error is returned.
|
||||||
|
*
|
||||||
|
* The message is only applicable when an SDL function has signaled an error.
|
||||||
|
* You must check the return values of SDL function calls to determine when to
|
||||||
|
* appropriately call SDL_GetError(). You should *not* use the results of
|
||||||
|
* SDL_GetError() to decide if an error has occurred! Sometimes SDL will set
|
||||||
|
* an error string even when reporting success.
|
||||||
|
*
|
||||||
|
* SDL will *not* clear the error string for successful API calls. You *must*
|
||||||
|
* check return values for failure cases before you can assume the error
|
||||||
|
* string applies.
|
||||||
|
*
|
||||||
|
* Error strings are set per-thread, so an error set in a different thread
|
||||||
|
* will not interfere with the current thread's operation.
|
||||||
|
*
|
||||||
|
* The returned value is a thread-local string which will remain valid until
|
||||||
|
* the current thread's error string is changed. The caller should make a copy
|
||||||
|
* if the value is needed after the next SDL API call.
|
||||||
|
*
|
||||||
|
* \returns a message with information about the specific error that occurred,
|
||||||
|
* or an empty string if there hasn't been an error message set since
|
||||||
|
* the last call to SDL_ClearError().
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ClearError
|
||||||
|
* \sa SDL_SetError
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetError(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear any previous error message for this thread.
|
||||||
|
*
|
||||||
|
* \returns true.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetError
|
||||||
|
* \sa SDL_SetError
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ClearError(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name Internal error functions
|
||||||
|
*
|
||||||
|
* \internal
|
||||||
|
* Private error reporting function - used internally.
|
||||||
|
*/
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to standardize error reporting on unsupported operations.
|
||||||
|
*
|
||||||
|
* This simply calls SDL_SetError() with a standardized error string, for
|
||||||
|
* convenience, consistency, and clarity.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_Unsupported() SDL_SetError("That operation is not supported")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to standardize error reporting on unsupported operations.
|
||||||
|
*
|
||||||
|
* This simply calls SDL_SetError() with a standardized error string, for
|
||||||
|
* convenience, consistency, and clarity.
|
||||||
|
*
|
||||||
|
* A common usage pattern inside SDL is this:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* bool MyFunction(const char *str) {
|
||||||
|
* if (!str) {
|
||||||
|
* return SDL_InvalidParamError("str"); // returns false.
|
||||||
|
* }
|
||||||
|
* DoSomething(str);
|
||||||
|
* return true;
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this macro from any thread.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param))
|
||||||
|
|
||||||
|
/* @} *//* Internal error functions */
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_error_h_ */
|
||||||
Vendored
+1574
File diff suppressed because it is too large
Load Diff
Vendored
+503
@@ -0,0 +1,503 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryFilesystem
|
||||||
|
*
|
||||||
|
* SDL offers an API for examining and manipulating the system's filesystem.
|
||||||
|
* This covers most things one would need to do with directories, except for
|
||||||
|
* actual file I/O (which is covered by [CategoryIOStream](CategoryIOStream)
|
||||||
|
* and [CategoryAsyncIO](CategoryAsyncIO) instead).
|
||||||
|
*
|
||||||
|
* There are functions to answer necessary path questions:
|
||||||
|
*
|
||||||
|
* - Where is my app's data? SDL_GetBasePath().
|
||||||
|
* - Where can I safely write files? SDL_GetPrefPath().
|
||||||
|
* - Where are paths like Downloads, Desktop, Music? SDL_GetUserFolder().
|
||||||
|
* - What is this thing at this location? SDL_GetPathInfo().
|
||||||
|
* - What items live in this folder? SDL_EnumerateDirectory().
|
||||||
|
* - What items live in this folder by wildcard? SDL_GlobDirectory().
|
||||||
|
* - What is my current working directory? SDL_GetCurrentDirectory().
|
||||||
|
*
|
||||||
|
* SDL also offers functions to manipulate the directory tree: renaming,
|
||||||
|
* removing, copying files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_filesystem_h_
|
||||||
|
#define SDL_filesystem_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the directory where the application was run from.
|
||||||
|
*
|
||||||
|
* SDL caches the result of this call internally, but the first call to this
|
||||||
|
* function is not necessarily fast, so plan accordingly.
|
||||||
|
*
|
||||||
|
* **macOS and iOS Specific Functionality**: If the application is in a ".app"
|
||||||
|
* bundle, this function returns the Resource directory (e.g.
|
||||||
|
* MyApp.app/Contents/Resources/). This behaviour can be overridden by adding
|
||||||
|
* a property to the Info.plist file. Adding a string key with the name
|
||||||
|
* SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the
|
||||||
|
* behaviour.
|
||||||
|
*
|
||||||
|
* Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an
|
||||||
|
* application in /Applications/SDLApp/MyApp.app):
|
||||||
|
*
|
||||||
|
* - `resource`: bundle resource directory (the default). For example:
|
||||||
|
* `/Applications/SDLApp/MyApp.app/Contents/Resources`
|
||||||
|
* - `bundle`: the Bundle directory. For example:
|
||||||
|
* `/Applications/SDLApp/MyApp.app/`
|
||||||
|
* - `parent`: the containing directory of the bundle. For example:
|
||||||
|
* `/Applications/SDLApp/`
|
||||||
|
*
|
||||||
|
* **Nintendo 3DS Specific Functionality**: This function returns "romfs"
|
||||||
|
* directory of the application as it is uncommon to store resources outside
|
||||||
|
* the executable. As such it is not a writable directory.
|
||||||
|
*
|
||||||
|
* The returned path is guaranteed to end with a path separator ('\\' on
|
||||||
|
* Windows, '/' on most other platforms).
|
||||||
|
*
|
||||||
|
* \returns an absolute path in UTF-8 encoding to the application data
|
||||||
|
* directory. NULL will be returned on error or when the platform
|
||||||
|
* doesn't implement this functionality, call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetPrefPath
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetBasePath(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the user-and-app-specific path where files can be written.
|
||||||
|
*
|
||||||
|
* Get the "pref dir". This is meant to be where users can write personal
|
||||||
|
* files (preferences and save games, etc) that are specific to your
|
||||||
|
* application. This directory is unique per user, per application.
|
||||||
|
*
|
||||||
|
* This function will decide the appropriate location in the native
|
||||||
|
* filesystem, create the directory if necessary, and return a string of the
|
||||||
|
* absolute path to the directory in UTF-8 encoding.
|
||||||
|
*
|
||||||
|
* On Windows, the string might look like:
|
||||||
|
*
|
||||||
|
* `C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\`
|
||||||
|
*
|
||||||
|
* On Linux, the string might look like:
|
||||||
|
*
|
||||||
|
* `/home/bob/.local/share/My Program Name/`
|
||||||
|
*
|
||||||
|
* On macOS, the string might look like:
|
||||||
|
*
|
||||||
|
* `/Users/bob/Library/Application Support/My Program Name/`
|
||||||
|
*
|
||||||
|
* You should assume the path returned by this function is the only safe place
|
||||||
|
* to write files (and that SDL_GetBasePath(), while it might be writable, or
|
||||||
|
* even the parent of the returned path, isn't where you should be writing
|
||||||
|
* things).
|
||||||
|
*
|
||||||
|
* Both the org and app strings may become part of a directory name, so please
|
||||||
|
* follow these rules:
|
||||||
|
*
|
||||||
|
* - Try to use the same org string (_including case-sensitivity_) for all
|
||||||
|
* your applications that use this function.
|
||||||
|
* - Always use a unique app string for each one, and make sure it never
|
||||||
|
* changes for an app once you've decided on it.
|
||||||
|
* - Unicode characters are legal, as long as they are UTF-8 encoded, but...
|
||||||
|
* - ...only use letters, numbers, and spaces. Avoid punctuation like "Game
|
||||||
|
* Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient.
|
||||||
|
*
|
||||||
|
* The returned path is guaranteed to end with a path separator ('\\' on
|
||||||
|
* Windows, '/' on most other platforms).
|
||||||
|
*
|
||||||
|
* \param org the name of your organization.
|
||||||
|
* \param app the name of your application.
|
||||||
|
* \returns a UTF-8 string of the user directory in platform-dependent
|
||||||
|
* notation. NULL if there's a problem (creating directory failed,
|
||||||
|
* etc.). This should be freed with SDL_free() when it is no longer
|
||||||
|
* needed.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetBasePath
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char * SDLCALL SDL_GetPrefPath(const char *org, const char *app);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of the OS-provided default folder for a specific purpose.
|
||||||
|
*
|
||||||
|
* Note that the Trash folder isn't included here, because trashing files
|
||||||
|
* usually involves extra OS-specific functionality to remember the file's
|
||||||
|
* original location.
|
||||||
|
*
|
||||||
|
* The folders supported per platform are:
|
||||||
|
*
|
||||||
|
* | | Windows | macOS/iOS | tvOS | Unix (XDG) | Haiku | Emscripten |
|
||||||
|
* | ----------- | ------- | --------- | ---- | ---------- | ----- | ---------- |
|
||||||
|
* | HOME | X | X | | X | X | X |
|
||||||
|
* | DESKTOP | X | X | | X | X | |
|
||||||
|
* | DOCUMENTS | X | X | | X | | |
|
||||||
|
* | DOWNLOADS | Vista+ | X | | X | | |
|
||||||
|
* | MUSIC | X | X | | X | | |
|
||||||
|
* | PICTURES | X | X | | X | | |
|
||||||
|
* | PUBLICSHARE | | X | | X | | |
|
||||||
|
* | SAVEDGAMES | Vista+ | | | | | |
|
||||||
|
* | SCREENSHOTS | Vista+ | | | | | |
|
||||||
|
* | TEMPLATES | X | X | | X | | |
|
||||||
|
* | VIDEOS | X | X* | | X | | |
|
||||||
|
*
|
||||||
|
* Note that on macOS/iOS, the Videos folder is called "Movies".
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetUserFolder
|
||||||
|
*/
|
||||||
|
typedef enum SDL_Folder
|
||||||
|
{
|
||||||
|
SDL_FOLDER_HOME, /**< The folder which contains all of the current user's data, preferences, and documents. It usually contains most of the other folders. If a requested folder does not exist, the home folder can be considered a safe fallback to store a user's documents. */
|
||||||
|
SDL_FOLDER_DESKTOP, /**< The folder of files that are displayed on the desktop. Note that the existence of a desktop folder does not guarantee that the system does show icons on its desktop; certain GNU/Linux distros with a graphical environment may not have desktop icons. */
|
||||||
|
SDL_FOLDER_DOCUMENTS, /**< User document files, possibly application-specific. This is a good place to save a user's projects. */
|
||||||
|
SDL_FOLDER_DOWNLOADS, /**< Standard folder for user files downloaded from the internet. */
|
||||||
|
SDL_FOLDER_MUSIC, /**< Music files that can be played using a standard music player (mp3, ogg...). */
|
||||||
|
SDL_FOLDER_PICTURES, /**< Image files that can be displayed using a standard viewer (png, jpg...). */
|
||||||
|
SDL_FOLDER_PUBLICSHARE, /**< Files that are meant to be shared with other users on the same computer. */
|
||||||
|
SDL_FOLDER_SAVEDGAMES, /**< Save files for games. */
|
||||||
|
SDL_FOLDER_SCREENSHOTS, /**< Application screenshots. */
|
||||||
|
SDL_FOLDER_TEMPLATES, /**< Template files to be used when the user requests the desktop environment to create a new file in a certain folder, such as "New Text File.txt". Any file in the Templates folder can be used as a starting point for a new file. */
|
||||||
|
SDL_FOLDER_VIDEOS, /**< Video files that can be played using a standard video player (mp4, webm...). */
|
||||||
|
SDL_FOLDER_COUNT /**< Total number of types in this enum, not a folder type by itself. */
|
||||||
|
} SDL_Folder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the most suitable user folder for a specific purpose.
|
||||||
|
*
|
||||||
|
* Many OSes provide certain standard folders for certain purposes, such as
|
||||||
|
* storing pictures, music or videos for a certain user. This function gives
|
||||||
|
* the path for many of those special locations.
|
||||||
|
*
|
||||||
|
* This function is specifically for _user_ folders, which are meant for the
|
||||||
|
* user to access and manage. For application-specific folders, meant to hold
|
||||||
|
* data for the application to manage, see SDL_GetBasePath() and
|
||||||
|
* SDL_GetPrefPath().
|
||||||
|
*
|
||||||
|
* The returned path is guaranteed to end with a path separator ('\\' on
|
||||||
|
* Windows, '/' on most other platforms).
|
||||||
|
*
|
||||||
|
* If NULL is returned, the error may be obtained with SDL_GetError().
|
||||||
|
*
|
||||||
|
* \param folder the type of folder to find.
|
||||||
|
* \returns either a null-terminated C string containing the full path to the
|
||||||
|
* folder, or NULL if an error happened.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetUserFolder(SDL_Folder folder);
|
||||||
|
|
||||||
|
|
||||||
|
/* Abstract filesystem interface */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of filesystem entries.
|
||||||
|
*
|
||||||
|
* Note that there may be other sorts of items on a filesystem: devices,
|
||||||
|
* symlinks, named pipes, etc. They are currently reported as
|
||||||
|
* SDL_PATHTYPE_OTHER.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_PathInfo
|
||||||
|
*/
|
||||||
|
typedef enum SDL_PathType
|
||||||
|
{
|
||||||
|
SDL_PATHTYPE_NONE, /**< path does not exist */
|
||||||
|
SDL_PATHTYPE_FILE, /**< a normal file */
|
||||||
|
SDL_PATHTYPE_DIRECTORY, /**< a directory */
|
||||||
|
SDL_PATHTYPE_OTHER /**< something completely different like a device node (not a symlink, those are always followed) */
|
||||||
|
} SDL_PathType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about a path on the filesystem.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetPathInfo
|
||||||
|
* \sa SDL_GetStoragePathInfo
|
||||||
|
*/
|
||||||
|
typedef struct SDL_PathInfo
|
||||||
|
{
|
||||||
|
SDL_PathType type; /**< the path type */
|
||||||
|
Uint64 size; /**< the file size in bytes */
|
||||||
|
SDL_Time create_time; /**< the time when the path was created */
|
||||||
|
SDL_Time modify_time; /**< the last time the path was modified */
|
||||||
|
SDL_Time access_time; /**< the last time the path was read */
|
||||||
|
} SDL_PathInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flags for path matching.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GlobDirectory
|
||||||
|
* \sa SDL_GlobStorageDirectory
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_GlobFlags;
|
||||||
|
|
||||||
|
#define SDL_GLOB_CASEINSENSITIVE (1u << 0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a directory, and any missing parent directories.
|
||||||
|
*
|
||||||
|
* This reports success if `path` already exists as a directory.
|
||||||
|
*
|
||||||
|
* If parent directories are missing, it will also create them. Note that if
|
||||||
|
* this fails, it will not remove any parent directories it already made.
|
||||||
|
*
|
||||||
|
* \param path the path of the directory to create.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CreateDirectory(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible results from an enumeration callback.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_EnumerateDirectoryCallback
|
||||||
|
*/
|
||||||
|
typedef enum SDL_EnumerationResult
|
||||||
|
{
|
||||||
|
SDL_ENUM_CONTINUE, /**< Value that requests that enumeration continue. */
|
||||||
|
SDL_ENUM_SUCCESS, /**< Value that requests that enumeration stop, successfully. */
|
||||||
|
SDL_ENUM_FAILURE /**< Value that requests that enumeration stop, as a failure. */
|
||||||
|
} SDL_EnumerationResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback for directory enumeration.
|
||||||
|
*
|
||||||
|
* Enumeration of directory entries will continue until either all entries
|
||||||
|
* have been provided to the callback, or the callback has requested a stop
|
||||||
|
* through its return value.
|
||||||
|
*
|
||||||
|
* Returning SDL_ENUM_CONTINUE will let enumeration proceed, calling the
|
||||||
|
* callback with further entries. SDL_ENUM_SUCCESS and SDL_ENUM_FAILURE will
|
||||||
|
* terminate the enumeration early, and dictate the return value of the
|
||||||
|
* enumeration function itself.
|
||||||
|
*
|
||||||
|
* `dirname` is guaranteed to end with a path separator ('\\' on Windows, '/'
|
||||||
|
* on most other platforms).
|
||||||
|
*
|
||||||
|
* \param userdata an app-controlled pointer that is passed to the callback.
|
||||||
|
* \param dirname the directory that is being enumerated.
|
||||||
|
* \param fname the next entry in the enumeration.
|
||||||
|
* \returns how the enumeration should proceed.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_EnumerateDirectory
|
||||||
|
*/
|
||||||
|
typedef SDL_EnumerationResult (SDLCALL *SDL_EnumerateDirectoryCallback)(void *userdata, const char *dirname, const char *fname);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerate a directory through a callback function.
|
||||||
|
*
|
||||||
|
* This function provides every directory entry through an app-provided
|
||||||
|
* callback, called once for each directory entry, until all results have been
|
||||||
|
* provided or the callback returns either SDL_ENUM_SUCCESS or
|
||||||
|
* SDL_ENUM_FAILURE.
|
||||||
|
*
|
||||||
|
* This will return false if there was a system problem in general, or if a
|
||||||
|
* callback returns SDL_ENUM_FAILURE. A successful return means a callback
|
||||||
|
* returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries
|
||||||
|
* were enumerated.
|
||||||
|
*
|
||||||
|
* \param path the path of the directory to enumerate.
|
||||||
|
* \param callback a function that is called for each entry in the directory.
|
||||||
|
* \param userdata a pointer that is passed to `callback`.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_EnumerateDirectory(const char *path, SDL_EnumerateDirectoryCallback callback, void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a file or an empty directory.
|
||||||
|
*
|
||||||
|
* Directories that are not empty will fail; this function will not recursely
|
||||||
|
* delete directory trees.
|
||||||
|
*
|
||||||
|
* \param path the path to remove from the filesystem.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_RemovePath(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename a file or directory.
|
||||||
|
*
|
||||||
|
* If the file at `newpath` already exists, it will replaced.
|
||||||
|
*
|
||||||
|
* Note that this will not copy files across filesystems/drives/volumes, as
|
||||||
|
* that is a much more complicated (and possibly time-consuming) operation.
|
||||||
|
*
|
||||||
|
* Which is to say, if this function fails, SDL_CopyFile() to a temporary file
|
||||||
|
* in the same directory as `newpath`, then SDL_RenamePath() from the
|
||||||
|
* temporary file to `newpath` and SDL_RemovePath() on `oldpath` might work
|
||||||
|
* for files. Renaming a non-empty directory across filesystems is
|
||||||
|
* dramatically more complex, however.
|
||||||
|
*
|
||||||
|
* \param oldpath the old path.
|
||||||
|
* \param newpath the new path.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_RenamePath(const char *oldpath, const char *newpath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copy a file.
|
||||||
|
*
|
||||||
|
* If the file at `newpath` already exists, it will be overwritten with the
|
||||||
|
* contents of the file at `oldpath`.
|
||||||
|
*
|
||||||
|
* This function will block until the copy is complete, which might be a
|
||||||
|
* significant time for large files on slow disks. On some platforms, the copy
|
||||||
|
* can be handed off to the OS itself, but on others SDL might just open both
|
||||||
|
* paths, and read from one and write to the other.
|
||||||
|
*
|
||||||
|
* Note that this is not an atomic operation! If something tries to read from
|
||||||
|
* `newpath` while the copy is in progress, it will see an incomplete copy of
|
||||||
|
* the data, and if the calling thread terminates (or the power goes out)
|
||||||
|
* during the copy, `newpath`'s previous contents will be gone, replaced with
|
||||||
|
* an incomplete copy of the data. To avoid this risk, it is recommended that
|
||||||
|
* the app copy to a temporary file in the same directory as `newpath`, and if
|
||||||
|
* the copy is successful, use SDL_RenamePath() to replace `newpath` with the
|
||||||
|
* temporary file. This will ensure that reads of `newpath` will either see a
|
||||||
|
* complete copy of the data, or it will see the pre-copy state of `newpath`.
|
||||||
|
*
|
||||||
|
* This function attempts to synchronize the newly-copied data to disk before
|
||||||
|
* returning, if the platform allows it, so that the renaming trick will not
|
||||||
|
* have a problem in a system crash or power failure, where the file could be
|
||||||
|
* renamed but the contents never made it from the system file cache to the
|
||||||
|
* physical disk.
|
||||||
|
*
|
||||||
|
* If the copy fails for any reason, the state of `newpath` is undefined. It
|
||||||
|
* might be half a copy, it might be the untouched data of what was already
|
||||||
|
* there, or it might be a zero-byte file, etc.
|
||||||
|
*
|
||||||
|
* \param oldpath the old path.
|
||||||
|
* \param newpath the new path.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CopyFile(const char *oldpath, const char *newpath);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get information about a filesystem path.
|
||||||
|
*
|
||||||
|
* \param path the path to query.
|
||||||
|
* \param info a pointer filled in with information about the path, or NULL to
|
||||||
|
* check for the existence of a file.
|
||||||
|
* \returns true on success or false if the file doesn't exist, or another
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_GetPathInfo(const char *path, SDL_PathInfo *info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerate a directory tree, filtered by pattern, and return a list.
|
||||||
|
*
|
||||||
|
* Files are filtered out if they don't match the string in `pattern`, which
|
||||||
|
* may contain wildcard characters '\*' (match everything) and '?' (match one
|
||||||
|
* character). If pattern is NULL, no filtering is done and all results are
|
||||||
|
* returned. Subdirectories are permitted, and are specified with a path
|
||||||
|
* separator of '/'. Wildcard characters '\*' and '?' never match a path
|
||||||
|
* separator.
|
||||||
|
*
|
||||||
|
* `flags` may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching
|
||||||
|
* case-insensitive.
|
||||||
|
*
|
||||||
|
* The returned array is always NULL-terminated, for your iterating
|
||||||
|
* convenience, but if `count` is non-NULL, on return it will contain the
|
||||||
|
* number of items in the array, not counting the NULL terminator.
|
||||||
|
*
|
||||||
|
* \param path the path of the directory to enumerate.
|
||||||
|
* \param pattern the pattern that files in the directory must match. Can be
|
||||||
|
* NULL.
|
||||||
|
* \param flags `SDL_GLOB_*` bitflags that affect this search.
|
||||||
|
* \param count on return, will be set to the number of items in the returned
|
||||||
|
* array. Can be NULL.
|
||||||
|
* \returns an array of strings on success or NULL on failure; call
|
||||||
|
* SDL_GetError() for more information. This is a single allocation
|
||||||
|
* that should be freed with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char ** SDLCALL SDL_GlobDirectory(const char *path, const char *pattern, SDL_GlobFlags flags, int *count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get what the system believes is the "current working directory."
|
||||||
|
*
|
||||||
|
* For systems without a concept of a current working directory, this will
|
||||||
|
* still attempt to provide something reasonable.
|
||||||
|
*
|
||||||
|
* SDL does not provide a means to _change_ the current working directory; for
|
||||||
|
* platforms without this concept, this would cause surprises with file access
|
||||||
|
* outside of SDL.
|
||||||
|
*
|
||||||
|
* The returned path is guaranteed to end with a path separator ('\\' on
|
||||||
|
* Windows, '/' on most other platforms).
|
||||||
|
*
|
||||||
|
* \returns a UTF-8 string of the current working directory in
|
||||||
|
* platform-dependent notation. NULL if there's a problem. This
|
||||||
|
* should be freed with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC char * SDLCALL SDL_GetCurrentDirectory(void);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_filesystem_h_ */
|
||||||
Vendored
+1509
File diff suppressed because it is too large
Load Diff
Vendored
+4122
File diff suppressed because it is too large
Load Diff
Vendored
+102
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: GUID */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryGUID
|
||||||
|
*
|
||||||
|
* A GUID is a 128-bit value that represents something that is uniquely
|
||||||
|
* identifiable by this value: "globally unique."
|
||||||
|
*
|
||||||
|
* SDL provides functions to convert a GUID to/from a string.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_guid_h_
|
||||||
|
#define SDL_guid_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An SDL_GUID is a 128-bit identifier for an input device that identifies
|
||||||
|
* that device across runs of SDL programs on the same platform.
|
||||||
|
*
|
||||||
|
* If the device is detached and then re-attached to a different port, or if
|
||||||
|
* the base system is rebooted, the device should still report the same GUID.
|
||||||
|
*
|
||||||
|
* GUIDs are as precise as possible but are not guaranteed to distinguish
|
||||||
|
* physically distinct but equivalent devices. For example, two game
|
||||||
|
* controllers from the same vendor with the same product ID and revision may
|
||||||
|
* have the same GUID.
|
||||||
|
*
|
||||||
|
* GUIDs may be platform-dependent (i.e., the same device may report different
|
||||||
|
* GUIDs on different operating systems).
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_GUID {
|
||||||
|
Uint8 data[16];
|
||||||
|
} SDL_GUID;
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an ASCII string representation for a given SDL_GUID.
|
||||||
|
*
|
||||||
|
* \param guid the SDL_GUID you wish to convert to string.
|
||||||
|
* \param pszGUID buffer in which to write the ASCII string.
|
||||||
|
* \param cbGUID the size of pszGUID, should be at least 33 bytes.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StringToGUID
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a GUID string into a SDL_GUID structure.
|
||||||
|
*
|
||||||
|
* Performs no error checking. If this function is given a string containing
|
||||||
|
* an invalid GUID, the function will silently succeed, but the GUID generated
|
||||||
|
* will not be useful.
|
||||||
|
*
|
||||||
|
* \param pchGUID string containing an ASCII representation of a GUID.
|
||||||
|
* \returns a SDL_GUID structure.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GUIDToString
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_StringToGUID(const char *pchGUID);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_guid_h_ */
|
||||||
Vendored
+1441
File diff suppressed because it is too large
Load Diff
Vendored
+552
@@ -0,0 +1,552 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: HIDAPI */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryHIDAPI
|
||||||
|
*
|
||||||
|
* Header file for SDL HIDAPI functions.
|
||||||
|
*
|
||||||
|
* This is an adaptation of the original HIDAPI interface by Alan Ott, and
|
||||||
|
* includes source code licensed under the following license:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* HIDAPI - Multi-Platform library for
|
||||||
|
* communication with HID devices.
|
||||||
|
*
|
||||||
|
* Copyright 2009, Alan Ott, Signal 11 Software.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This software may be used by anyone for any reason so
|
||||||
|
* long as the copyright notice in the source files
|
||||||
|
* remains intact.
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* (Note that this license is the same as item three of SDL's zlib license, so
|
||||||
|
* it adds no new requirements on the user.)
|
||||||
|
*
|
||||||
|
* If you would like a version of SDL without this code, you can build SDL
|
||||||
|
* with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for
|
||||||
|
* example on iOS or tvOS to avoid a dependency on the CoreBluetooth
|
||||||
|
* framework.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_hidapi_h_
|
||||||
|
#define SDL_hidapi_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An opaque handle representing an open HID device.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_hid_device SDL_hid_device;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HID underlying bus types.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_hid_bus_type {
|
||||||
|
/** Unknown bus type */
|
||||||
|
SDL_HID_API_BUS_UNKNOWN = 0x00,
|
||||||
|
|
||||||
|
/** USB bus
|
||||||
|
Specifications:
|
||||||
|
https://usb.org/hid */
|
||||||
|
SDL_HID_API_BUS_USB = 0x01,
|
||||||
|
|
||||||
|
/** Bluetooth or Bluetooth LE bus
|
||||||
|
Specifications:
|
||||||
|
https://www.bluetooth.com/specifications/specs/human-interface-device-profile-1-1-1/
|
||||||
|
https://www.bluetooth.com/specifications/specs/hid-service-1-0/
|
||||||
|
https://www.bluetooth.com/specifications/specs/hid-over-gatt-profile-1-0/ */
|
||||||
|
SDL_HID_API_BUS_BLUETOOTH = 0x02,
|
||||||
|
|
||||||
|
/** I2C bus
|
||||||
|
Specifications:
|
||||||
|
https://docs.microsoft.com/previous-versions/windows/hardware/design/dn642101(v=vs.85) */
|
||||||
|
SDL_HID_API_BUS_I2C = 0x03,
|
||||||
|
|
||||||
|
/** SPI bus
|
||||||
|
Specifications:
|
||||||
|
https://www.microsoft.com/download/details.aspx?id=103325 */
|
||||||
|
SDL_HID_API_BUS_SPI = 0x04
|
||||||
|
|
||||||
|
} SDL_hid_bus_type;
|
||||||
|
|
||||||
|
/** hidapi info structure */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about a connected HID device
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_hid_device_info
|
||||||
|
{
|
||||||
|
/** Platform-specific device path */
|
||||||
|
char *path;
|
||||||
|
/** Device Vendor ID */
|
||||||
|
unsigned short vendor_id;
|
||||||
|
/** Device Product ID */
|
||||||
|
unsigned short product_id;
|
||||||
|
/** Serial Number */
|
||||||
|
wchar_t *serial_number;
|
||||||
|
/** Device Release Number in binary-coded decimal,
|
||||||
|
also known as Device Version Number */
|
||||||
|
unsigned short release_number;
|
||||||
|
/** Manufacturer String */
|
||||||
|
wchar_t *manufacturer_string;
|
||||||
|
/** Product string */
|
||||||
|
wchar_t *product_string;
|
||||||
|
/** Usage Page for this Device/Interface
|
||||||
|
(Windows/Mac/hidraw only) */
|
||||||
|
unsigned short usage_page;
|
||||||
|
/** Usage for this Device/Interface
|
||||||
|
(Windows/Mac/hidraw only) */
|
||||||
|
unsigned short usage;
|
||||||
|
/** The USB interface which this logical device
|
||||||
|
represents.
|
||||||
|
|
||||||
|
Valid only if the device is a USB HID device.
|
||||||
|
Set to -1 in all other cases.
|
||||||
|
*/
|
||||||
|
int interface_number;
|
||||||
|
|
||||||
|
/** Additional information about the USB interface.
|
||||||
|
Valid on libusb and Android implementations. */
|
||||||
|
int interface_class;
|
||||||
|
int interface_subclass;
|
||||||
|
int interface_protocol;
|
||||||
|
|
||||||
|
/** Underlying bus type */
|
||||||
|
SDL_hid_bus_type bus_type;
|
||||||
|
|
||||||
|
/** Pointer to the next device */
|
||||||
|
struct SDL_hid_device_info *next;
|
||||||
|
|
||||||
|
} SDL_hid_device_info;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the HIDAPI library.
|
||||||
|
*
|
||||||
|
* This function initializes the HIDAPI library. Calling it is not strictly
|
||||||
|
* necessary, as it will be called automatically by SDL_hid_enumerate() and
|
||||||
|
* any of the SDL_hid_open_*() functions if it is needed. This function should
|
||||||
|
* be called at the beginning of execution however, if there is a chance of
|
||||||
|
* HIDAPI handles being opened by different threads simultaneously.
|
||||||
|
*
|
||||||
|
* Each call to this function should have a matching call to SDL_hid_exit()
|
||||||
|
*
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_hid_exit
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finalize the HIDAPI library.
|
||||||
|
*
|
||||||
|
* This function frees all of the static data associated with HIDAPI. It
|
||||||
|
* should be called at the end of execution to avoid memory leaks.
|
||||||
|
*
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_hid_init
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_exit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to see if devices may have been added or removed.
|
||||||
|
*
|
||||||
|
* Enumerating the HID devices is an expensive operation, so you can call this
|
||||||
|
* to see if there have been any system device changes since the last call to
|
||||||
|
* this function. A change in the counter returned doesn't necessarily mean
|
||||||
|
* that anything has changed, but you can call SDL_hid_enumerate() to get an
|
||||||
|
* updated device list.
|
||||||
|
*
|
||||||
|
* Calling this function for the first time may cause a thread or other system
|
||||||
|
* resource to be allocated to track device change notifications.
|
||||||
|
*
|
||||||
|
* \returns a change counter that is incremented with each potential device
|
||||||
|
* change, or 0 if device change detection isn't available.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_hid_enumerate
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enumerate the HID Devices.
|
||||||
|
*
|
||||||
|
* This function returns a linked list of all the HID devices attached to the
|
||||||
|
* system which match vendor_id and product_id. If `vendor_id` is set to 0
|
||||||
|
* then any vendor matches. If `product_id` is set to 0 then any product
|
||||||
|
* matches. If `vendor_id` and `product_id` are both set to 0, then all HID
|
||||||
|
* devices will be returned.
|
||||||
|
*
|
||||||
|
* By default SDL will only enumerate controllers, to reduce risk of hanging
|
||||||
|
* or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS
|
||||||
|
* can be set to "0" to enumerate all HID devices.
|
||||||
|
*
|
||||||
|
* \param vendor_id the Vendor ID (VID) of the types of device to open, or 0
|
||||||
|
* to match any vendor.
|
||||||
|
* \param product_id the Product ID (PID) of the types of device to open, or 0
|
||||||
|
* to match any product.
|
||||||
|
* \returns a pointer to a linked list of type SDL_hid_device_info, containing
|
||||||
|
* information about the HID devices attached to the system, or NULL
|
||||||
|
* in the case of failure. Free this linked list by calling
|
||||||
|
* SDL_hid_free_enumeration().
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_hid_device_change_count
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free an enumeration linked list.
|
||||||
|
*
|
||||||
|
* This function frees a linked list created by SDL_hid_enumerate().
|
||||||
|
*
|
||||||
|
* \param devs pointer to a list of struct_device returned from
|
||||||
|
* SDL_hid_enumerate().
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally
|
||||||
|
* a serial number.
|
||||||
|
*
|
||||||
|
* If `serial_number` is NULL, the first device with the specified VID and PID
|
||||||
|
* is opened.
|
||||||
|
*
|
||||||
|
* \param vendor_id the Vendor ID (VID) of the device to open.
|
||||||
|
* \param product_id the Product ID (PID) of the device to open.
|
||||||
|
* \param serial_number the Serial Number of the device to open (Optionally
|
||||||
|
* NULL).
|
||||||
|
* \returns a pointer to a SDL_hid_device object on success or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a HID device by its path name.
|
||||||
|
*
|
||||||
|
* The path name be determined by calling SDL_hid_enumerate(), or a
|
||||||
|
* platform-specific path name can be used (eg: /dev/hidraw0 on Linux).
|
||||||
|
*
|
||||||
|
* \param path the path name of the device to open.
|
||||||
|
* \returns a pointer to a SDL_hid_device object on success or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write an Output report to a HID device.
|
||||||
|
*
|
||||||
|
* The first byte of `data` must contain the Report ID. For devices which only
|
||||||
|
* support a single report, this must be set to 0x0. The remaining bytes
|
||||||
|
* contain the report data. Since the Report ID is mandatory, calls to
|
||||||
|
* SDL_hid_write() will always contain one more byte than the report contains.
|
||||||
|
* For example, if a hid report is 16 bytes long, 17 bytes must be passed to
|
||||||
|
* SDL_hid_write(), the Report ID (or 0x0, for devices with a single report),
|
||||||
|
* followed by the report data (16 bytes). In this example, the length passed
|
||||||
|
* in would be 17.
|
||||||
|
*
|
||||||
|
* SDL_hid_write() will send the data on the first OUT endpoint, if one
|
||||||
|
* exists. If it does not, it will send the data through the Control Endpoint
|
||||||
|
* (Endpoint 0).
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data the data to send, including the report number as the first
|
||||||
|
* byte.
|
||||||
|
* \param length the length in bytes of the data to send.
|
||||||
|
* \returns the actual number of bytes written and -1 on on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an Input report from a HID device with timeout.
|
||||||
|
*
|
||||||
|
* Input reports are returned to the host through the INTERRUPT IN endpoint.
|
||||||
|
* The first byte will contain the Report number if the device uses numbered
|
||||||
|
* reports.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data a buffer to put the read data into.
|
||||||
|
* \param length the number of bytes to read. For devices with multiple
|
||||||
|
* reports, make sure to read an extra byte for the report
|
||||||
|
* number.
|
||||||
|
* \param milliseconds timeout in milliseconds or -1 for blocking wait.
|
||||||
|
* \returns the actual number of bytes read and -1 on on failure; call
|
||||||
|
* SDL_GetError() for more information. If no packet was available to
|
||||||
|
* be read within the timeout period, this function returns 0.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read an Input report from a HID device.
|
||||||
|
*
|
||||||
|
* Input reports are returned to the host through the INTERRUPT IN endpoint.
|
||||||
|
* The first byte will contain the Report number if the device uses numbered
|
||||||
|
* reports.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data a buffer to put the read data into.
|
||||||
|
* \param length the number of bytes to read. For devices with multiple
|
||||||
|
* reports, make sure to read an extra byte for the report
|
||||||
|
* number.
|
||||||
|
* \returns the actual number of bytes read and -1 on failure; call
|
||||||
|
* SDL_GetError() for more information. If no packet was available to
|
||||||
|
* be read and the handle is in non-blocking mode, this function
|
||||||
|
* returns 0.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the device handle to be non-blocking.
|
||||||
|
*
|
||||||
|
* In non-blocking mode calls to SDL_hid_read() will return immediately with a
|
||||||
|
* value of 0 if there is no data to be read. In blocking mode, SDL_hid_read()
|
||||||
|
* will wait (block) until there is data to read before returning.
|
||||||
|
*
|
||||||
|
* Nonblocking can be turned on and off at any time.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param nonblock enable or not the nonblocking reads - 1 to enable
|
||||||
|
* nonblocking - 0 to disable nonblocking.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a Feature report to the device.
|
||||||
|
*
|
||||||
|
* Feature reports are sent over the Control endpoint as a Set_Report
|
||||||
|
* transfer. The first byte of `data` must contain the Report ID. For devices
|
||||||
|
* which only support a single report, this must be set to 0x0. The remaining
|
||||||
|
* bytes contain the report data. Since the Report ID is mandatory, calls to
|
||||||
|
* SDL_hid_send_feature_report() will always contain one more byte than the
|
||||||
|
* report contains. For example, if a hid report is 16 bytes long, 17 bytes
|
||||||
|
* must be passed to SDL_hid_send_feature_report(): the Report ID (or 0x0, for
|
||||||
|
* devices which do not use numbered reports), followed by the report data (16
|
||||||
|
* bytes). In this example, the length passed in would be 17.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data the data to send, including the report number as the first
|
||||||
|
* byte.
|
||||||
|
* \param length the length in bytes of the data to send, including the report
|
||||||
|
* number.
|
||||||
|
* \returns the actual number of bytes written and -1 on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a feature report from a HID device.
|
||||||
|
*
|
||||||
|
* Set the first byte of `data` to the Report ID of the report to be read.
|
||||||
|
* Make sure to allow space for this extra byte in `data`. Upon return, the
|
||||||
|
* first byte will still contain the Report ID, and the report data will start
|
||||||
|
* in data[1].
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data a buffer to put the read data into, including the Report ID.
|
||||||
|
* Set the first byte of `data` to the Report ID of the report to
|
||||||
|
* be read, or set it to zero if your device does not use numbered
|
||||||
|
* reports.
|
||||||
|
* \param length the number of bytes to read, including an extra byte for the
|
||||||
|
* report ID. The buffer can be longer than the actual report.
|
||||||
|
* \returns the number of bytes read plus one for the report ID (which is
|
||||||
|
* still in the first byte), or -1 on on failure; call SDL_GetError()
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an input report from a HID device.
|
||||||
|
*
|
||||||
|
* Set the first byte of `data` to the Report ID of the report to be read.
|
||||||
|
* Make sure to allow space for this extra byte in `data`. Upon return, the
|
||||||
|
* first byte will still contain the Report ID, and the report data will start
|
||||||
|
* in data[1].
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param data a buffer to put the read data into, including the Report ID.
|
||||||
|
* Set the first byte of `data` to the Report ID of the report to
|
||||||
|
* be read, or set it to zero if your device does not use numbered
|
||||||
|
* reports.
|
||||||
|
* \param length the number of bytes to read, including an extra byte for the
|
||||||
|
* report ID. The buffer can be longer than the actual report.
|
||||||
|
* \returns the number of bytes read plus one for the report ID (which is
|
||||||
|
* still in the first byte), or -1 on on failure; call SDL_GetError()
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_input_report(SDL_hid_device *dev, unsigned char *data, size_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close a HID device.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_close(SDL_hid_device *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get The Manufacturer String from a HID device.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param string a wide string buffer to put the data into.
|
||||||
|
* \param maxlen the length of the buffer in multiples of wchar_t.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get The Product String from a HID device.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param string a wide string buffer to put the data into.
|
||||||
|
* \param maxlen the length of the buffer in multiples of wchar_t.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get The Serial Number String from a HID device.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param string a wide string buffer to put the data into.
|
||||||
|
* \param maxlen the length of the buffer in multiples of wchar_t.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a string from a HID device, based on its string index.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param string_index the index of the string to get.
|
||||||
|
* \param string a wide string buffer to put the data into.
|
||||||
|
* \param maxlen the length of the buffer in multiples of wchar_t.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the device info from a HID device.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \returns a pointer to the SDL_hid_device_info for this hid_device or NULL
|
||||||
|
* on failure; call SDL_GetError() for more information. This struct
|
||||||
|
* is valid until the device is closed with SDL_hid_close().
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_get_device_info(SDL_hid_device *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a report descriptor from a HID device.
|
||||||
|
*
|
||||||
|
* User has to provide a preallocated buffer where descriptor will be copied
|
||||||
|
* to. The recommended size for a preallocated buffer is 4096 bytes.
|
||||||
|
*
|
||||||
|
* \param dev a device handle returned from SDL_hid_open().
|
||||||
|
* \param buf the buffer to copy descriptor into.
|
||||||
|
* \param buf_size the size of the buffer in bytes.
|
||||||
|
* \returns the number of bytes actually copied or -1 on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_hid_get_report_descriptor(SDL_hid_device *dev, unsigned char *buf, size_t buf_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
|
||||||
|
*
|
||||||
|
* \param active true to start the scan, false to stop the scan.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_hid_ble_scan(bool active);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_hidapi_h_ */
|
||||||
Vendored
+4448
File diff suppressed because it is too large
Load Diff
Vendored
+497
@@ -0,0 +1,497 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryInit
|
||||||
|
*
|
||||||
|
* All SDL programs need to initialize the library before starting to work
|
||||||
|
* with it.
|
||||||
|
*
|
||||||
|
* Almost everything can simply call SDL_Init() near startup, with a handful
|
||||||
|
* of flags to specify subsystems to touch. These are here to make sure SDL
|
||||||
|
* does not even attempt to touch low-level pieces of the operating system
|
||||||
|
* that you don't intend to use. For example, you might be using SDL for video
|
||||||
|
* and input but chose an external library for audio, and in this case you
|
||||||
|
* would just need to leave off the `SDL_INIT_AUDIO` flag to make sure that
|
||||||
|
* external library has complete control.
|
||||||
|
*
|
||||||
|
* Most apps, when terminating, should call SDL_Quit(). This will clean up
|
||||||
|
* (nearly) everything that SDL might have allocated, and crucially, it'll
|
||||||
|
* make sure that the display's resolution is back to what the user expects if
|
||||||
|
* you had previously changed it for your game.
|
||||||
|
*
|
||||||
|
* SDL3 apps are strongly encouraged to call SDL_SetAppMetadata() at startup
|
||||||
|
* to fill in details about the program. This is completely optional, but it
|
||||||
|
* helps in small ways (we can provide an About dialog box for the macOS menu,
|
||||||
|
* we can name the app in the system's audio mixer, etc). Those that want to
|
||||||
|
* provide a _lot_ of information should look at the more-detailed
|
||||||
|
* SDL_SetAppMetadataProperty().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_init_h_
|
||||||
|
#define SDL_init_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_events.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* As of version 0.5, SDL is loaded dynamically into the application */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialization flags for SDL_Init and/or SDL_InitSubSystem
|
||||||
|
*
|
||||||
|
* These are the flags which may be passed to SDL_Init(). You should specify
|
||||||
|
* the subsystems which you will be using in your application.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Init
|
||||||
|
* \sa SDL_Quit
|
||||||
|
* \sa SDL_InitSubSystem
|
||||||
|
* \sa SDL_QuitSubSystem
|
||||||
|
* \sa SDL_WasInit
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_InitFlags;
|
||||||
|
|
||||||
|
#define SDL_INIT_AUDIO 0x00000010u /**< `SDL_INIT_AUDIO` implies `SDL_INIT_EVENTS` */
|
||||||
|
#define SDL_INIT_VIDEO 0x00000020u /**< `SDL_INIT_VIDEO` implies `SDL_INIT_EVENTS`, should be initialized on the main thread */
|
||||||
|
#define SDL_INIT_JOYSTICK 0x00000200u /**< `SDL_INIT_JOYSTICK` implies `SDL_INIT_EVENTS`, should be initialized on the same thread as SDL_INIT_VIDEO on Windows if you don't set SDL_HINT_JOYSTICK_THREAD */
|
||||||
|
#define SDL_INIT_HAPTIC 0x00001000u
|
||||||
|
#define SDL_INIT_GAMEPAD 0x00002000u /**< `SDL_INIT_GAMEPAD` implies `SDL_INIT_JOYSTICK` */
|
||||||
|
#define SDL_INIT_EVENTS 0x00004000u
|
||||||
|
#define SDL_INIT_SENSOR 0x00008000u /**< `SDL_INIT_SENSOR` implies `SDL_INIT_EVENTS` */
|
||||||
|
#define SDL_INIT_CAMERA 0x00010000u /**< `SDL_INIT_CAMERA` implies `SDL_INIT_EVENTS` */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return values for optional main callbacks.
|
||||||
|
*
|
||||||
|
* Returning SDL_APP_SUCCESS or SDL_APP_FAILURE from SDL_AppInit,
|
||||||
|
* SDL_AppEvent, or SDL_AppIterate will terminate the program and report
|
||||||
|
* success/failure to the operating system. What that means is
|
||||||
|
* platform-dependent. On Unix, for example, on success, the process error
|
||||||
|
* code will be zero, and on failure it will be 1. This interface doesn't
|
||||||
|
* allow you to return specific exit codes, just whether there was an error
|
||||||
|
* generally or not.
|
||||||
|
*
|
||||||
|
* Returning SDL_APP_CONTINUE from these functions will let the app continue
|
||||||
|
* to run.
|
||||||
|
*
|
||||||
|
* See
|
||||||
|
* [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README/main-functions#main-callbacks-in-sdl3)
|
||||||
|
* for complete details.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_AppResult
|
||||||
|
{
|
||||||
|
SDL_APP_CONTINUE, /**< Value that requests that the app continue from the main callbacks. */
|
||||||
|
SDL_APP_SUCCESS, /**< Value that requests termination with success from the main callbacks. */
|
||||||
|
SDL_APP_FAILURE /**< Value that requests termination with error from the main callbacks. */
|
||||||
|
} SDL_AppResult;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function pointer typedef for SDL_AppInit.
|
||||||
|
*
|
||||||
|
* These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind
|
||||||
|
* the scenes for apps using the optional main callbacks. Apps that want to
|
||||||
|
* use this should just implement SDL_AppInit directly.
|
||||||
|
*
|
||||||
|
* \param appstate a place where the app can optionally store a pointer for
|
||||||
|
* future use.
|
||||||
|
* \param argc the standard ANSI C main's argc; number of elements in `argv`.
|
||||||
|
* \param argv the standard ANSI C main's argv; array of command line
|
||||||
|
* arguments.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef SDL_AppResult (SDLCALL *SDL_AppInit_func)(void **appstate, int argc, char *argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function pointer typedef for SDL_AppIterate.
|
||||||
|
*
|
||||||
|
* These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind
|
||||||
|
* the scenes for apps using the optional main callbacks. Apps that want to
|
||||||
|
* use this should just implement SDL_AppIterate directly.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef SDL_AppResult (SDLCALL *SDL_AppIterate_func)(void *appstate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function pointer typedef for SDL_AppEvent.
|
||||||
|
*
|
||||||
|
* These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind
|
||||||
|
* the scenes for apps using the optional main callbacks. Apps that want to
|
||||||
|
* use this should just implement SDL_AppEvent directly.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \param event the new event for the app to examine.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef SDL_AppResult (SDLCALL *SDL_AppEvent_func)(void *appstate, SDL_Event *event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function pointer typedef for SDL_AppQuit.
|
||||||
|
*
|
||||||
|
* These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind
|
||||||
|
* the scenes for apps using the optional main callbacks. Apps that want to
|
||||||
|
* use this should just implement SDL_AppEvent directly.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \param result the result code that terminated the app (success or failure).
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef void (SDLCALL *SDL_AppQuit_func)(void *appstate, SDL_AppResult result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the SDL library.
|
||||||
|
*
|
||||||
|
* SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the
|
||||||
|
* two may be used interchangeably. Though for readability of your code
|
||||||
|
* SDL_InitSubSystem() might be preferred.
|
||||||
|
*
|
||||||
|
* The file I/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread)
|
||||||
|
* subsystems are initialized by default. Message boxes
|
||||||
|
* (SDL_ShowSimpleMessageBox) also attempt to work without initializing the
|
||||||
|
* video subsystem, in hopes of being useful in showing an error dialog when
|
||||||
|
* SDL_Init fails. You must specifically initialize other subsystems if you
|
||||||
|
* use them in your application.
|
||||||
|
*
|
||||||
|
* Logging (such as SDL_Log) works without initialization, too.
|
||||||
|
*
|
||||||
|
* `flags` may be any of the following OR'd together:
|
||||||
|
*
|
||||||
|
* - `SDL_INIT_AUDIO`: audio subsystem; automatically initializes the events
|
||||||
|
* subsystem
|
||||||
|
* - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events
|
||||||
|
* subsystem, should be initialized on the main thread.
|
||||||
|
* - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the
|
||||||
|
* events subsystem
|
||||||
|
* - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem
|
||||||
|
* - `SDL_INIT_GAMEPAD`: gamepad subsystem; automatically initializes the
|
||||||
|
* joystick subsystem
|
||||||
|
* - `SDL_INIT_EVENTS`: events subsystem
|
||||||
|
* - `SDL_INIT_SENSOR`: sensor subsystem; automatically initializes the events
|
||||||
|
* subsystem
|
||||||
|
* - `SDL_INIT_CAMERA`: camera subsystem; automatically initializes the events
|
||||||
|
* subsystem
|
||||||
|
*
|
||||||
|
* Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem()
|
||||||
|
* for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or
|
||||||
|
* call SDL_Quit() to force shutdown). If a subsystem is already loaded then
|
||||||
|
* this call will increase the ref-count and return.
|
||||||
|
*
|
||||||
|
* Consider reporting some basic metadata about your application before
|
||||||
|
* calling SDL_Init, using either SDL_SetAppMetadata() or
|
||||||
|
* SDL_SetAppMetadataProperty().
|
||||||
|
*
|
||||||
|
* \param flags subsystem initialization flags.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAppMetadata
|
||||||
|
* \sa SDL_SetAppMetadataProperty
|
||||||
|
* \sa SDL_InitSubSystem
|
||||||
|
* \sa SDL_Quit
|
||||||
|
* \sa SDL_SetMainReady
|
||||||
|
* \sa SDL_WasInit
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_Init(SDL_InitFlags flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compatibility function to initialize the SDL library.
|
||||||
|
*
|
||||||
|
* This function and SDL_Init() are interchangeable.
|
||||||
|
*
|
||||||
|
* \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Init
|
||||||
|
* \sa SDL_Quit
|
||||||
|
* \sa SDL_QuitSubSystem
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_InitSubSystem(SDL_InitFlags flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shut down specific SDL subsystems.
|
||||||
|
*
|
||||||
|
* You still need to call SDL_Quit() even if you close all open subsystems
|
||||||
|
* with SDL_QuitSubSystem().
|
||||||
|
*
|
||||||
|
* \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_InitSubSystem
|
||||||
|
* \sa SDL_Quit
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_QuitSubSystem(SDL_InitFlags flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a mask of the specified subsystems which are currently initialized.
|
||||||
|
*
|
||||||
|
* \param flags any of the flags used by SDL_Init(); see SDL_Init for details.
|
||||||
|
* \returns a mask of all initialized subsystems if `flags` is 0, otherwise it
|
||||||
|
* returns the initialization status of the specified subsystems.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Init
|
||||||
|
* \sa SDL_InitSubSystem
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_InitFlags SDLCALL SDL_WasInit(SDL_InitFlags flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up all initialized subsystems.
|
||||||
|
*
|
||||||
|
* You should call this function even if you have already shutdown each
|
||||||
|
* initialized subsystem with SDL_QuitSubSystem(). It is safe to call this
|
||||||
|
* function even in the case of errors in initialization.
|
||||||
|
*
|
||||||
|
* You can use this function with atexit() to ensure that it is run when your
|
||||||
|
* application is shutdown, but it is not wise to do this from a library or
|
||||||
|
* other dynamically loaded code.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Init
|
||||||
|
* \sa SDL_QuitSubSystem
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_Quit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether this is the main thread.
|
||||||
|
*
|
||||||
|
* On Apple platforms, the main thread is the thread that runs your program's
|
||||||
|
* main() entry point. On other platforms, the main thread is the one that
|
||||||
|
* calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs
|
||||||
|
* your program's main() entry point. If you are using the main callbacks,
|
||||||
|
* SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the
|
||||||
|
* main thread.
|
||||||
|
*
|
||||||
|
* \returns true if this thread is the main thread, or false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_RunOnMainThread
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_IsMainThread(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback run on the main thread.
|
||||||
|
*
|
||||||
|
* \param userdata an app-controlled pointer that is passed to the callback.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_RunOnMainThread
|
||||||
|
*/
|
||||||
|
typedef void (SDLCALL *SDL_MainThreadCallback)(void *userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call a function on the main thread during event processing.
|
||||||
|
*
|
||||||
|
* If this is called on the main thread, the callback is executed immediately.
|
||||||
|
* If this is called on another thread, this callback is queued for execution
|
||||||
|
* on the main thread during event processing.
|
||||||
|
*
|
||||||
|
* Be careful of deadlocks when using this functionality. You should not have
|
||||||
|
* the main thread wait for the current thread while this function is being
|
||||||
|
* called with `wait_complete` true.
|
||||||
|
*
|
||||||
|
* \param callback the callback to call on the main thread.
|
||||||
|
* \param userdata a pointer that is passed to `callback`.
|
||||||
|
* \param wait_complete true to wait for the callback to complete, false to
|
||||||
|
* return immediately.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_IsMainThread
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_RunOnMainThread(SDL_MainThreadCallback callback, void *userdata, bool wait_complete);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify basic metadata about your app.
|
||||||
|
*
|
||||||
|
* You can optionally provide metadata about your app to SDL. This is not
|
||||||
|
* required, but strongly encouraged.
|
||||||
|
*
|
||||||
|
* There are several locations where SDL can make use of metadata (an "About"
|
||||||
|
* box in the macOS menu bar, the name of the app can be shown on some audio
|
||||||
|
* mixers, etc). Any piece of metadata can be left as NULL, if a specific
|
||||||
|
* detail doesn't make sense for the app.
|
||||||
|
*
|
||||||
|
* This function should be called as early as possible, before SDL_Init.
|
||||||
|
* Multiple calls to this function are allowed, but various state might not
|
||||||
|
* change once it has been set up with a previous call to this function.
|
||||||
|
*
|
||||||
|
* Passing a NULL removes any previous metadata.
|
||||||
|
*
|
||||||
|
* This is a simplified interface for the most important information. You can
|
||||||
|
* supply significantly more detailed metadata with
|
||||||
|
* SDL_SetAppMetadataProperty().
|
||||||
|
*
|
||||||
|
* \param appname The name of the application ("My Game 2: Bad Guy's
|
||||||
|
* Revenge!").
|
||||||
|
* \param appversion The version of the application ("1.0.0beta5" or a git
|
||||||
|
* hash, or whatever makes sense).
|
||||||
|
* \param appidentifier A unique string in reverse-domain format that
|
||||||
|
* identifies this app ("com.example.mygame2").
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAppMetadataProperty
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadata(const char *appname, const char *appversion, const char *appidentifier);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify metadata about your app through a set of properties.
|
||||||
|
*
|
||||||
|
* You can optionally provide metadata about your app to SDL. This is not
|
||||||
|
* required, but strongly encouraged.
|
||||||
|
*
|
||||||
|
* There are several locations where SDL can make use of metadata (an "About"
|
||||||
|
* box in the macOS menu bar, the name of the app can be shown on some audio
|
||||||
|
* mixers, etc). Any piece of metadata can be left out, if a specific detail
|
||||||
|
* doesn't make sense for the app.
|
||||||
|
*
|
||||||
|
* This function should be called as early as possible, before SDL_Init.
|
||||||
|
* Multiple calls to this function are allowed, but various state might not
|
||||||
|
* change once it has been set up with a previous call to this function.
|
||||||
|
*
|
||||||
|
* Once set, this metadata can be read using SDL_GetAppMetadataProperty().
|
||||||
|
*
|
||||||
|
* These are the supported properties:
|
||||||
|
*
|
||||||
|
* - `SDL_PROP_APP_METADATA_NAME_STRING`: The human-readable name of the
|
||||||
|
* application, like "My Game 2: Bad Guy's Revenge!". This will show up
|
||||||
|
* anywhere the OS shows the name of the application separately from window
|
||||||
|
* titles, such as volume control applets, etc. This defaults to "SDL
|
||||||
|
* Application".
|
||||||
|
* - `SDL_PROP_APP_METADATA_VERSION_STRING`: The version of the app that is
|
||||||
|
* running; there are no rules on format, so "1.0.3beta2" and "April 22nd,
|
||||||
|
* 2024" and a git hash are all valid options. This has no default.
|
||||||
|
* - `SDL_PROP_APP_METADATA_IDENTIFIER_STRING`: A unique string that
|
||||||
|
* identifies this app. This must be in reverse-domain format, like
|
||||||
|
* "com.example.mygame2". This string is used by desktop compositors to
|
||||||
|
* identify and group windows together, as well as match applications with
|
||||||
|
* associated desktop settings and icons. If you plan to package your
|
||||||
|
* application in a container such as Flatpak, the app ID should match the
|
||||||
|
* name of your Flatpak container as well. This has no default.
|
||||||
|
* - `SDL_PROP_APP_METADATA_CREATOR_STRING`: The human-readable name of the
|
||||||
|
* creator/developer/maker of this app, like "MojoWorkshop, LLC"
|
||||||
|
* - `SDL_PROP_APP_METADATA_COPYRIGHT_STRING`: The human-readable copyright
|
||||||
|
* notice, like "Copyright (c) 2024 MojoWorkshop, LLC" or whatnot. Keep this
|
||||||
|
* to one line, don't paste a copy of a whole software license in here. This
|
||||||
|
* has no default.
|
||||||
|
* - `SDL_PROP_APP_METADATA_URL_STRING`: A URL to the app on the web. Maybe a
|
||||||
|
* product page, or a storefront, or even a GitHub repository, for user's
|
||||||
|
* further information This has no default.
|
||||||
|
* - `SDL_PROP_APP_METADATA_TYPE_STRING`: The type of application this is.
|
||||||
|
* Currently this string can be "game" for a video game, "mediaplayer" for a
|
||||||
|
* media player, or generically "application" if nothing else applies.
|
||||||
|
* Future versions of SDL might add new types. This defaults to
|
||||||
|
* "application".
|
||||||
|
*
|
||||||
|
* \param name the name of the metadata property to set.
|
||||||
|
* \param value the value of the property, or NULL to remove that property.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetAppMetadataProperty
|
||||||
|
* \sa SDL_SetAppMetadata
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetAppMetadataProperty(const char *name, const char *value);
|
||||||
|
|
||||||
|
#define SDL_PROP_APP_METADATA_NAME_STRING "SDL.app.metadata.name"
|
||||||
|
#define SDL_PROP_APP_METADATA_VERSION_STRING "SDL.app.metadata.version"
|
||||||
|
#define SDL_PROP_APP_METADATA_IDENTIFIER_STRING "SDL.app.metadata.identifier"
|
||||||
|
#define SDL_PROP_APP_METADATA_CREATOR_STRING "SDL.app.metadata.creator"
|
||||||
|
#define SDL_PROP_APP_METADATA_COPYRIGHT_STRING "SDL.app.metadata.copyright"
|
||||||
|
#define SDL_PROP_APP_METADATA_URL_STRING "SDL.app.metadata.url"
|
||||||
|
#define SDL_PROP_APP_METADATA_TYPE_STRING "SDL.app.metadata.type"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get metadata about your app.
|
||||||
|
*
|
||||||
|
* This returns metadata previously set using SDL_SetAppMetadata() or
|
||||||
|
* SDL_SetAppMetadataProperty(). See SDL_SetAppMetadataProperty() for the list
|
||||||
|
* of available properties and their meanings.
|
||||||
|
*
|
||||||
|
* \param name the name of the metadata property to get.
|
||||||
|
* \returns the current value of the metadata property, or the default if it
|
||||||
|
* is not set, NULL for properties with no default.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread, although
|
||||||
|
* the string returned is not protected and could potentially be
|
||||||
|
* freed if you call SDL_SetAppMetadataProperty() to set that
|
||||||
|
* property from another thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetAppMetadata
|
||||||
|
* \sa SDL_SetAppMetadataProperty
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetAppMetadataProperty(const char *name);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_init_h_ */
|
||||||
Vendored
+407
@@ -0,0 +1,407 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: Intrinsics */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryIntrinsics
|
||||||
|
*
|
||||||
|
* SDL does some preprocessor gymnastics to determine if any CPU-specific
|
||||||
|
* compiler intrinsics are available, as this is not necessarily an easy thing
|
||||||
|
* to calculate, and sometimes depends on quirks of a system, versions of
|
||||||
|
* build tools, and other external forces.
|
||||||
|
*
|
||||||
|
* Apps including SDL's headers will be able to check consistent preprocessor
|
||||||
|
* definitions to decide if it's safe to use compiler intrinsics for a
|
||||||
|
* specific CPU architecture. This check only tells you that the compiler is
|
||||||
|
* capable of using those intrinsics; at runtime, you should still check if
|
||||||
|
* they are available on the current system with the
|
||||||
|
* [CPU info functions](https://wiki.libsdl.org/SDL3/CategoryCPUInfo)
|
||||||
|
* , such as SDL_HasSSE() or SDL_HasNEON(). Otherwise, the process might crash
|
||||||
|
* for using an unsupported CPU instruction.
|
||||||
|
*
|
||||||
|
* SDL only sets preprocessor defines for CPU intrinsics if they are
|
||||||
|
* supported, so apps should check with `#ifdef` and not `#if`.
|
||||||
|
*
|
||||||
|
* SDL will also include the appropriate instruction-set-specific support
|
||||||
|
* headers, so if SDL decides to define SDL_SSE2_INTRINSICS, it will also
|
||||||
|
* `#include <emmintrin.h>` as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_intrin_h_
|
||||||
|
#define SDL_intrin_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Loongarch LSX intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<lsxintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LASX_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_LSX_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Loongarch LSX intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<lasxintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LASX_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_LASX_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports ARM NEON intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<armintr.h>`
|
||||||
|
* `<arm_neon.h>`, `<arm64intr.h>`, and `<arm64_neon.h>`, as appropriate.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_NEON_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports PowerPC Altivec intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<altivec.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_ALTIVEC_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel MMX intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<mmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_MMX_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel SSE intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<xmmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE2_INTRINSICS
|
||||||
|
* \sa SDL_SSE3_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_1_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_2_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_SSE_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel SSE2 intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<emmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE_INTRINSICS
|
||||||
|
* \sa SDL_SSE3_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_1_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_2_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_SSE2_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel SSE3 intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<pmmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE_INTRINSICS
|
||||||
|
* \sa SDL_SSE2_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_1_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_2_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_SSE3_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel SSE4.1 intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<smmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE_INTRINSICS
|
||||||
|
* \sa SDL_SSE2_INTRINSICS
|
||||||
|
* \sa SDL_SSE3_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_2_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_SSE4_1_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel SSE4.2 intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<nmmintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SSE_INTRINSICS
|
||||||
|
* \sa SDL_SSE2_INTRINSICS
|
||||||
|
* \sa SDL_SSE3_INTRINSICS
|
||||||
|
* \sa SDL_SSE4_1_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_SSE4_2_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel AVX intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<immintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AVX2_INTRINSICS
|
||||||
|
* \sa SDL_AVX512F_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_AVX_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel AVX2 intrinsics.
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<immintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AVX_INTRINSICS
|
||||||
|
* \sa SDL_AVX512F_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_AVX2_INTRINSICS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if (and only if) the compiler supports Intel AVX-512F intrinsics.
|
||||||
|
*
|
||||||
|
* AVX-512F is also sometimes referred to as "AVX-512 Foundation."
|
||||||
|
*
|
||||||
|
* If this macro is defined, SDL will have already included `<immintrin.h>`
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AVX_INTRINSICS
|
||||||
|
* \sa SDL_AVX2_INTRINSICS
|
||||||
|
*/
|
||||||
|
#define SDL_AVX512F_INTRINSICS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Need to do this here because intrin.h has C++ code in it */
|
||||||
|
/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */
|
||||||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64))
|
||||||
|
#ifdef __clang__
|
||||||
|
/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
|
||||||
|
so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
|
||||||
|
#ifndef __PRFCHWINTRIN_H
|
||||||
|
#define __PRFCHWINTRIN_H
|
||||||
|
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||||
|
_m_prefetch(void *__P)
|
||||||
|
{
|
||||||
|
__builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */);
|
||||||
|
}
|
||||||
|
#endif /* __PRFCHWINTRIN_H */
|
||||||
|
#endif /* __clang__ */
|
||||||
|
#include <intrin.h>
|
||||||
|
|
||||||
|
#elif defined(__MINGW64_VERSION_MAJOR)
|
||||||
|
#include <intrin.h>
|
||||||
|
#if defined(__ARM_NEON) && !defined(SDL_DISABLE_NEON)
|
||||||
|
# define SDL_NEON_INTRINSICS 1
|
||||||
|
# include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC to have it included. */
|
||||||
|
#if defined(__ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC)
|
||||||
|
#define SDL_ALTIVEC_INTRINSICS 1
|
||||||
|
#include <altivec.h>
|
||||||
|
#endif
|
||||||
|
#ifndef SDL_DISABLE_NEON
|
||||||
|
# ifdef __ARM_NEON
|
||||||
|
# define SDL_NEON_INTRINSICS 1
|
||||||
|
# include <arm_neon.h>
|
||||||
|
# elif defined(SDL_PLATFORM_WINDOWS)
|
||||||
|
/* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */
|
||||||
|
# ifdef _M_ARM
|
||||||
|
# define SDL_NEON_INTRINSICS 1
|
||||||
|
# include <armintr.h>
|
||||||
|
# include <arm_neon.h>
|
||||||
|
# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
|
||||||
|
# endif
|
||||||
|
# if defined (_M_ARM64)
|
||||||
|
# define SDL_NEON_INTRINSICS 1
|
||||||
|
# include <arm64intr.h>
|
||||||
|
# include <arm64_neon.h>
|
||||||
|
# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
|
||||||
|
# define __ARM_ARCH 8
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#endif /* compiler version */
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
/**
|
||||||
|
* A macro to decide if the compiler supports `__attribute__((target))`.
|
||||||
|
*
|
||||||
|
* Even though this is defined in SDL's public headers, it is generally not
|
||||||
|
* used directly by apps. Apps should probably just use SDL_TARGETING
|
||||||
|
* directly, instead.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_TARGETING
|
||||||
|
*/
|
||||||
|
#define SDL_HAS_TARGET_ATTRIBS
|
||||||
|
|
||||||
|
#elif defined(__clang__) && defined(__has_attribute)
|
||||||
|
# if __has_attribute(target)
|
||||||
|
# define SDL_HAS_TARGET_ATTRIBS
|
||||||
|
# endif
|
||||||
|
#elif defined(__GNUC__) && (__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) /* gcc >= 4.9 */
|
||||||
|
# define SDL_HAS_TARGET_ATTRIBS
|
||||||
|
#elif defined(__ICC) && __ICC >= 1600
|
||||||
|
# define SDL_HAS_TARGET_ATTRIBS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a function as targeting a specific CPU architecture.
|
||||||
|
*
|
||||||
|
* This is a hint to the compiler that a function should be built with support
|
||||||
|
* for a CPU instruction set that might be different than the rest of the
|
||||||
|
* program.
|
||||||
|
*
|
||||||
|
* The particulars of this are explained in the GCC documentation:
|
||||||
|
*
|
||||||
|
* https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-target-function-attribute
|
||||||
|
*
|
||||||
|
* An example of using this feature is to turn on SSE2 support for a specific
|
||||||
|
* function, even if the rest of the source code is not compiled to use SSE2
|
||||||
|
* code:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* #ifdef SDL_SSE2_INTRINSICS
|
||||||
|
* static void SDL_TARGETING("sse2") DoSomethingWithSSE2(char *x) {
|
||||||
|
* ...use SSE2 intrinsic functions, etc...
|
||||||
|
* }
|
||||||
|
* #endif
|
||||||
|
*
|
||||||
|
* // later...
|
||||||
|
* #ifdef SDL_SSE2_INTRINSICS
|
||||||
|
* if (SDL_HasSSE2()) {
|
||||||
|
* DoSomethingWithSSE2(str);
|
||||||
|
* }
|
||||||
|
* #endif
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* The application is, on a whole, built without SSE2 instructions, so it will
|
||||||
|
* run on Intel machines that don't support SSE2. But then at runtime, it
|
||||||
|
* checks if the system supports the instructions, and then calls into a
|
||||||
|
* function that uses SSE2 opcodes. The ifdefs make sure that this code isn't
|
||||||
|
* used on platforms that don't have SSE2 at all.
|
||||||
|
*
|
||||||
|
* On compilers without target support, this is defined to nothing.
|
||||||
|
*
|
||||||
|
* This symbol is used by SDL internally, but apps and other libraries are
|
||||||
|
* welcome to use it for their own interfaces as well.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_TARGETING(x) __attribute__((target(x)))
|
||||||
|
|
||||||
|
#elif defined(SDL_HAS_TARGET_ATTRIBS)
|
||||||
|
# define SDL_TARGETING(x) __attribute__((target(x)))
|
||||||
|
#else
|
||||||
|
# define SDL_TARGETING(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __loongarch64
|
||||||
|
# ifndef SDL_DISABLE_LSX
|
||||||
|
# define SDL_LSX_INTRINSICS 1
|
||||||
|
# include <lsxintrin.h>
|
||||||
|
# endif
|
||||||
|
# ifndef SDL_DISABLE_LASX
|
||||||
|
# define SDL_LASX_INTRINSICS 1
|
||||||
|
# include <lasxintrin.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
|
||||||
|
# if ((defined(_MSC_VER) && !defined(_M_X64)) || defined(__MMX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_MMX)
|
||||||
|
# define SDL_MMX_INTRINSICS 1
|
||||||
|
# include <mmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__SSE__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE)
|
||||||
|
# define SDL_SSE_INTRINSICS 1
|
||||||
|
# include <xmmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__SSE2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE2)
|
||||||
|
# define SDL_SSE2_INTRINSICS 1
|
||||||
|
# include <emmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__SSE3__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE3)
|
||||||
|
# define SDL_SSE3_INTRINSICS 1
|
||||||
|
# include <pmmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__SSE4_1__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_1)
|
||||||
|
# define SDL_SSE4_1_INTRINSICS 1
|
||||||
|
# include <smmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__SSE4_2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_2)
|
||||||
|
# define SDL_SSE4_2_INTRINSICS 1
|
||||||
|
# include <nmmintrin.h>
|
||||||
|
# endif
|
||||||
|
# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX__) && !defined(SDL_DISABLE_AVX)
|
||||||
|
# define SDL_DISABLE_AVX /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__AVX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX)
|
||||||
|
# define SDL_AVX_INTRINSICS 1
|
||||||
|
# include <immintrin.h>
|
||||||
|
# endif
|
||||||
|
# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX2__) && !defined(SDL_DISABLE_AVX2)
|
||||||
|
# define SDL_DISABLE_AVX2 /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__AVX2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX2)
|
||||||
|
# define SDL_AVX2_INTRINSICS 1
|
||||||
|
# include <immintrin.h>
|
||||||
|
# endif
|
||||||
|
# if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX512F__) && !defined(SDL_DISABLE_AVX512F)
|
||||||
|
# define SDL_DISABLE_AVX512F /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
|
||||||
|
# endif
|
||||||
|
# if (defined(_MSC_VER) || defined(__AVX512F__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(_M_ARM64EC) && !defined(SDL_DISABLE_AVX512F)
|
||||||
|
# define SDL_AVX512F_INTRINSICS 1
|
||||||
|
# include <immintrin.h>
|
||||||
|
# endif
|
||||||
|
#endif /* defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) */
|
||||||
|
|
||||||
|
#endif /* SDL_intrin_h_ */
|
||||||
Vendored
+1354
File diff suppressed because it is too large
Load Diff
Vendored
+1202
File diff suppressed because it is too large
Load Diff
Vendored
+609
@@ -0,0 +1,609 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryKeyboard
|
||||||
|
*
|
||||||
|
* SDL keyboard management.
|
||||||
|
*
|
||||||
|
* Please refer to the Best Keyboard Practices document for details on how
|
||||||
|
* best to accept keyboard input in various types of programs:
|
||||||
|
*
|
||||||
|
* https://wiki.libsdl.org/SDL3/BestKeyboardPractices
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_keyboard_h_
|
||||||
|
#define SDL_keyboard_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_keycode.h>
|
||||||
|
#include <SDL3/SDL_properties.h>
|
||||||
|
#include <SDL3/SDL_rect.h>
|
||||||
|
#include <SDL3/SDL_scancode.h>
|
||||||
|
#include <SDL3/SDL_video.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a unique ID for a keyboard for the time it is connected to the
|
||||||
|
* system, and is never reused for the lifetime of the application.
|
||||||
|
*
|
||||||
|
* If the keyboard is disconnected and reconnected, it will get a new ID.
|
||||||
|
*
|
||||||
|
* The value 0 is an invalid ID.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_KeyboardID;
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether a keyboard is currently connected.
|
||||||
|
*
|
||||||
|
* \returns true if a keyboard is connected, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyboards
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasKeyboard(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of currently connected keyboards.
|
||||||
|
*
|
||||||
|
* Note that this will include any device or virtual driver that includes
|
||||||
|
* keyboard functionality, including some mice, KVM switches, motherboard
|
||||||
|
* power buttons, etc. You should wait for input from a device before you
|
||||||
|
* consider it actively in use.
|
||||||
|
*
|
||||||
|
* \param count a pointer filled in with the number of keyboards returned, may
|
||||||
|
* be NULL.
|
||||||
|
* \returns a 0 terminated array of keyboards instance IDs or NULL on failure;
|
||||||
|
* call SDL_GetError() for more information. This should be freed
|
||||||
|
* with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyboardNameForID
|
||||||
|
* \sa SDL_HasKeyboard
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_KeyboardID * SDLCALL SDL_GetKeyboards(int *count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of a keyboard.
|
||||||
|
*
|
||||||
|
* This function returns "" if the keyboard doesn't have a name.
|
||||||
|
*
|
||||||
|
* \param instance_id the keyboard instance ID.
|
||||||
|
* \returns the name of the selected keyboard or NULL on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyboards
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyboardNameForID(SDL_KeyboardID instance_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the window which currently has keyboard focus.
|
||||||
|
*
|
||||||
|
* \returns the window with keyboard focus.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a snapshot of the current state of the keyboard.
|
||||||
|
*
|
||||||
|
* The pointer returned is a pointer to an internal SDL array. It will be
|
||||||
|
* valid for the whole lifetime of the application and should not be freed by
|
||||||
|
* the caller.
|
||||||
|
*
|
||||||
|
* A array element with a value of true means that the key is pressed and a
|
||||||
|
* value of false means that it is not. Indexes into this array are obtained
|
||||||
|
* by using SDL_Scancode values.
|
||||||
|
*
|
||||||
|
* Use SDL_PumpEvents() to update the state array.
|
||||||
|
*
|
||||||
|
* This function gives you the current state after all events have been
|
||||||
|
* processed, so if a key or button has been pressed and released before you
|
||||||
|
* process events, then the pressed state will never show up in the
|
||||||
|
* SDL_GetKeyboardState() calls.
|
||||||
|
*
|
||||||
|
* Note: This function doesn't take into account whether shift has been
|
||||||
|
* pressed or not.
|
||||||
|
*
|
||||||
|
* \param numkeys if non-NULL, receives the length of the returned array.
|
||||||
|
* \returns a pointer to an array of key states.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_PumpEvents
|
||||||
|
* \sa SDL_ResetKeyboard
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const bool * SDLCALL SDL_GetKeyboardState(int *numkeys);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the state of the keyboard.
|
||||||
|
*
|
||||||
|
* This function will generate key up events for all pressed keys.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyboardState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ResetKeyboard(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current key modifier state for the keyboard.
|
||||||
|
*
|
||||||
|
* \returns an OR'd combination of the modifier keys for the keyboard. See
|
||||||
|
* SDL_Keymod for details.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyboardState
|
||||||
|
* \sa SDL_SetModState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the current key modifier state for the keyboard.
|
||||||
|
*
|
||||||
|
* The inverse of SDL_GetModState(), SDL_SetModState() allows you to impose
|
||||||
|
* modifier key states on your application. Simply pass your desired modifier
|
||||||
|
* states into `modstate`. This value may be a bitwise, OR'd combination of
|
||||||
|
* SDL_Keymod values.
|
||||||
|
*
|
||||||
|
* This does not change the keyboard state, only the key modifier flags that
|
||||||
|
* SDL reports.
|
||||||
|
*
|
||||||
|
* \param modstate the desired SDL_Keymod for the keyboard.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetModState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the key code corresponding to the given scancode according to the
|
||||||
|
* current keyboard layout.
|
||||||
|
*
|
||||||
|
* If you want to get the keycode as it would be delivered in key events,
|
||||||
|
* including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should
|
||||||
|
* pass `key_event` as true. Otherwise this function simply translates the
|
||||||
|
* scancode based on the given modifier state.
|
||||||
|
*
|
||||||
|
* \param scancode the desired SDL_Scancode to query.
|
||||||
|
* \param modstate the modifier state to use when translating the scancode to
|
||||||
|
* a keycode.
|
||||||
|
* \param key_event true if the keycode will be used in key events.
|
||||||
|
* \returns the SDL_Keycode that corresponds to the given SDL_Scancode.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyName
|
||||||
|
* \sa SDL_GetScancodeFromKey
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode, SDL_Keymod modstate, bool key_event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the scancode corresponding to the given key code according to the
|
||||||
|
* current keyboard layout.
|
||||||
|
*
|
||||||
|
* Note that there may be multiple scancode+modifier states that can generate
|
||||||
|
* this keycode, this will just return the first one found.
|
||||||
|
*
|
||||||
|
* \param key the desired SDL_Keycode to query.
|
||||||
|
* \param modstate a pointer to the modifier state that would be used when the
|
||||||
|
* scancode generates this key, may be NULL.
|
||||||
|
* \returns the SDL_Scancode that corresponds to the given SDL_Keycode.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyFromScancode
|
||||||
|
* \sa SDL_GetScancodeName
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key, SDL_Keymod *modstate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a human-readable name for a scancode.
|
||||||
|
*
|
||||||
|
* \param scancode the desired SDL_Scancode.
|
||||||
|
* \param name the name to use for the scancode, encoded as UTF-8. The string
|
||||||
|
* is not copied, so the pointer given to this function must stay
|
||||||
|
* valid while SDL is being used.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetScancodeName
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetScancodeName(SDL_Scancode scancode, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a human-readable name for a scancode.
|
||||||
|
*
|
||||||
|
* **Warning**: The returned name is by design not stable across platforms,
|
||||||
|
* e.g. the name for `SDL_SCANCODE_LGUI` is "Left GUI" under Linux but "Left
|
||||||
|
* Windows" under Microsoft Windows, and some scancodes like
|
||||||
|
* `SDL_SCANCODE_NONUSBACKSLASH` don't have any name at all. There are even
|
||||||
|
* scancodes that share names, e.g. `SDL_SCANCODE_RETURN` and
|
||||||
|
* `SDL_SCANCODE_RETURN2` (both called "Return"). This function is therefore
|
||||||
|
* unsuitable for creating a stable cross-platform two-way mapping between
|
||||||
|
* strings and scancodes.
|
||||||
|
*
|
||||||
|
* \param scancode the desired SDL_Scancode to query.
|
||||||
|
* \returns a pointer to the name for the scancode. If the scancode doesn't
|
||||||
|
* have a name this function returns an empty string ("").
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetScancodeFromKey
|
||||||
|
* \sa SDL_GetScancodeFromName
|
||||||
|
* \sa SDL_SetScancodeName
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetScancodeName(SDL_Scancode scancode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a scancode from a human-readable name.
|
||||||
|
*
|
||||||
|
* \param name the human-readable scancode name.
|
||||||
|
* \returns the SDL_Scancode, or `SDL_SCANCODE_UNKNOWN` if the name wasn't
|
||||||
|
* recognized; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyFromName
|
||||||
|
* \sa SDL_GetScancodeFromKey
|
||||||
|
* \sa SDL_GetScancodeName
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a human-readable name for a key.
|
||||||
|
*
|
||||||
|
* If the key doesn't have a name, this function returns an empty string ("").
|
||||||
|
*
|
||||||
|
* Letters will be presented in their uppercase form, if applicable.
|
||||||
|
*
|
||||||
|
* \param key the desired SDL_Keycode to query.
|
||||||
|
* \returns a UTF-8 encoded string of the key name.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyFromName
|
||||||
|
* \sa SDL_GetKeyFromScancode
|
||||||
|
* \sa SDL_GetScancodeFromKey
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetKeyName(SDL_Keycode key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a key code from a human-readable name.
|
||||||
|
*
|
||||||
|
* \param name the human-readable key name.
|
||||||
|
* \returns key code, or `SDLK_UNKNOWN` if the name wasn't recognized; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function is not thread safe.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetKeyFromScancode
|
||||||
|
* \sa SDL_GetKeyName
|
||||||
|
* \sa SDL_GetScancodeFromName
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start accepting Unicode text input events in a window.
|
||||||
|
*
|
||||||
|
* This function will enable text input (SDL_EVENT_TEXT_INPUT and
|
||||||
|
* SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this
|
||||||
|
* function paired with SDL_StopTextInput().
|
||||||
|
*
|
||||||
|
* Text input events are not received by default.
|
||||||
|
*
|
||||||
|
* On some platforms using this function shows the screen keyboard and/or
|
||||||
|
* activates an IME, which can prevent some key press events from being passed
|
||||||
|
* through.
|
||||||
|
*
|
||||||
|
* \param window the window to enable text input.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetTextInputArea
|
||||||
|
* \sa SDL_StartTextInputWithProperties
|
||||||
|
* \sa SDL_StopTextInput
|
||||||
|
* \sa SDL_TextInputActive
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInput(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Text input type.
|
||||||
|
*
|
||||||
|
* These are the valid values for SDL_PROP_TEXTINPUT_TYPE_NUMBER. Not every
|
||||||
|
* value is valid on every platform, but where a value isn't supported, a
|
||||||
|
* reasonable fallback will be used.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInputWithProperties
|
||||||
|
*/
|
||||||
|
typedef enum SDL_TextInputType
|
||||||
|
{
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT, /**< The input is text */
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT_NAME, /**< The input is a person's name */
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT_EMAIL, /**< The input is an e-mail address */
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT_USERNAME, /**< The input is a username */
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN, /**< The input is a secure password that is hidden */
|
||||||
|
SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE, /**< The input is a secure password that is visible */
|
||||||
|
SDL_TEXTINPUT_TYPE_NUMBER, /**< The input is a number */
|
||||||
|
SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN, /**< The input is a secure PIN that is hidden */
|
||||||
|
SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE /**< The input is a secure PIN that is visible */
|
||||||
|
} SDL_TextInputType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto capitalization type.
|
||||||
|
*
|
||||||
|
* These are the valid values for SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER.
|
||||||
|
* Not every value is valid on every platform, but where a value isn't
|
||||||
|
* supported, a reasonable fallback will be used.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInputWithProperties
|
||||||
|
*/
|
||||||
|
typedef enum SDL_Capitalization
|
||||||
|
{
|
||||||
|
SDL_CAPITALIZE_NONE, /**< No auto-capitalization will be done */
|
||||||
|
SDL_CAPITALIZE_SENTENCES, /**< The first letter of sentences will be capitalized */
|
||||||
|
SDL_CAPITALIZE_WORDS, /**< The first letter of words will be capitalized */
|
||||||
|
SDL_CAPITALIZE_LETTERS /**< All letters will be capitalized */
|
||||||
|
} SDL_Capitalization;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start accepting Unicode text input events in a window, with properties
|
||||||
|
* describing the input.
|
||||||
|
*
|
||||||
|
* This function will enable text input (SDL_EVENT_TEXT_INPUT and
|
||||||
|
* SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this
|
||||||
|
* function paired with SDL_StopTextInput().
|
||||||
|
*
|
||||||
|
* Text input events are not received by default.
|
||||||
|
*
|
||||||
|
* On some platforms using this function shows the screen keyboard and/or
|
||||||
|
* activates an IME, which can prevent some key press events from being passed
|
||||||
|
* through.
|
||||||
|
*
|
||||||
|
* These are the supported properties:
|
||||||
|
*
|
||||||
|
* - `SDL_PROP_TEXTINPUT_TYPE_NUMBER` - an SDL_TextInputType value that
|
||||||
|
* describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
|
||||||
|
* - `SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER` - an SDL_Capitalization value
|
||||||
|
* that describes how text should be capitalized, defaults to
|
||||||
|
* SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for
|
||||||
|
* SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail
|
||||||
|
* addresses, usernames, and passwords.
|
||||||
|
* - `SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN` - true to enable auto completion
|
||||||
|
* and auto correction, defaults to true.
|
||||||
|
* - `SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN` - true if multiple lines of text
|
||||||
|
* are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is
|
||||||
|
* "0" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME
|
||||||
|
* is "1".
|
||||||
|
*
|
||||||
|
* On Android you can directly specify the input type:
|
||||||
|
*
|
||||||
|
* - `SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER` - the text input type to
|
||||||
|
* use, overriding other properties. This is documented at
|
||||||
|
* https://developer.android.com/reference/android/text/InputType
|
||||||
|
*
|
||||||
|
* \param window the window to enable text input.
|
||||||
|
* \param props the properties to use.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetTextInputArea
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
* \sa SDL_StopTextInput
|
||||||
|
* \sa SDL_TextInputActive
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_StartTextInputWithProperties(SDL_Window *window, SDL_PropertiesID props);
|
||||||
|
|
||||||
|
#define SDL_PROP_TEXTINPUT_TYPE_NUMBER "SDL.textinput.type"
|
||||||
|
#define SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER "SDL.textinput.capitalization"
|
||||||
|
#define SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN "SDL.textinput.autocorrect"
|
||||||
|
#define SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN "SDL.textinput.multiline"
|
||||||
|
#define SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER "SDL.textinput.android.inputtype"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether or not Unicode text input events are enabled for a window.
|
||||||
|
*
|
||||||
|
* \param window the window to check.
|
||||||
|
* \returns true if text input events are enabled else false.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_TextInputActive(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop receiving any text input events in a window.
|
||||||
|
*
|
||||||
|
* If SDL_StartTextInput() showed the screen keyboard, this function will hide
|
||||||
|
* it.
|
||||||
|
*
|
||||||
|
* \param window the window to disable text input.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_StopTextInput(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dismiss the composition window/IME without disabling the subsystem.
|
||||||
|
*
|
||||||
|
* \param window the window to affect.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
* \sa SDL_StopTextInput
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ClearComposition(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the area used to type Unicode text input.
|
||||||
|
*
|
||||||
|
* Native input methods may place a window with word suggestions near the
|
||||||
|
* cursor, without covering the text being entered.
|
||||||
|
*
|
||||||
|
* \param window the window for which to set the text input area.
|
||||||
|
* \param rect the SDL_Rect representing the text input area, in window
|
||||||
|
* coordinates, or NULL to clear it.
|
||||||
|
* \param cursor the offset of the current cursor location relative to
|
||||||
|
* `rect->x`, in window coordinates.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetTextInputArea
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetTextInputArea(SDL_Window *window, const SDL_Rect *rect, int cursor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the area used to type Unicode text input.
|
||||||
|
*
|
||||||
|
* This returns the values previously set by SDL_SetTextInputArea().
|
||||||
|
*
|
||||||
|
* \param window the window for which to query the text input area.
|
||||||
|
* \param rect a pointer to an SDL_Rect filled in with the text input area,
|
||||||
|
* may be NULL.
|
||||||
|
* \param cursor a pointer to the offset of the current cursor location
|
||||||
|
* relative to `rect->x`, may be NULL.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetTextInputArea
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_GetTextInputArea(SDL_Window *window, SDL_Rect *rect, int *cursor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the platform has screen keyboard support.
|
||||||
|
*
|
||||||
|
* \returns true if the platform has some screen keyboard support or false if
|
||||||
|
* not.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_StartTextInput
|
||||||
|
* \sa SDL_ScreenKeyboardShown
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasScreenKeyboardSupport(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the screen keyboard is shown for given window.
|
||||||
|
*
|
||||||
|
* \param window the window for which screen keyboard should be queried.
|
||||||
|
* \returns true if screen keyboard is shown or false if not.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HasScreenKeyboardSupport
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ScreenKeyboardShown(SDL_Window *window);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_keyboard_h_ */
|
||||||
Vendored
+343
@@ -0,0 +1,343 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryKeycode
|
||||||
|
*
|
||||||
|
* Defines constants which identify keyboard keys and modifiers.
|
||||||
|
*
|
||||||
|
* Please refer to the Best Keyboard Practices document for details on what
|
||||||
|
* this information means and how best to use it.
|
||||||
|
*
|
||||||
|
* https://wiki.libsdl.org/SDL3/BestKeyboardPractices
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_keycode_h_
|
||||||
|
#define SDL_keycode_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_scancode.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SDL virtual key representation.
|
||||||
|
*
|
||||||
|
* Values of this type are used to represent keyboard keys using the current
|
||||||
|
* layout of the keyboard. These values include Unicode values representing
|
||||||
|
* the unmodified character that would be generated by pressing the key, or an
|
||||||
|
* `SDLK_*` constant for those keys that do not generate characters.
|
||||||
|
*
|
||||||
|
* A special exception is the number keys at the top of the keyboard which map
|
||||||
|
* to SDLK_0...SDLK_9 on AZERTY layouts.
|
||||||
|
*
|
||||||
|
* Keys with the `SDLK_EXTENDED_MASK` bit set do not map to a scancode or
|
||||||
|
* unicode code point.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_Keycode;
|
||||||
|
|
||||||
|
#define SDLK_EXTENDED_MASK (1u << 29)
|
||||||
|
#define SDLK_SCANCODE_MASK (1u << 30)
|
||||||
|
#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK)
|
||||||
|
#define SDLK_UNKNOWN 0x00000000u /**< 0 */
|
||||||
|
#define SDLK_RETURN 0x0000000du /**< '\r' */
|
||||||
|
#define SDLK_ESCAPE 0x0000001bu /**< '\x1B' */
|
||||||
|
#define SDLK_BACKSPACE 0x00000008u /**< '\b' */
|
||||||
|
#define SDLK_TAB 0x00000009u /**< '\t' */
|
||||||
|
#define SDLK_SPACE 0x00000020u /**< ' ' */
|
||||||
|
#define SDLK_EXCLAIM 0x00000021u /**< '!' */
|
||||||
|
#define SDLK_DBLAPOSTROPHE 0x00000022u /**< '"' */
|
||||||
|
#define SDLK_HASH 0x00000023u /**< '#' */
|
||||||
|
#define SDLK_DOLLAR 0x00000024u /**< '$' */
|
||||||
|
#define SDLK_PERCENT 0x00000025u /**< '%' */
|
||||||
|
#define SDLK_AMPERSAND 0x00000026u /**< '&' */
|
||||||
|
#define SDLK_APOSTROPHE 0x00000027u /**< '\'' */
|
||||||
|
#define SDLK_LEFTPAREN 0x00000028u /**< '(' */
|
||||||
|
#define SDLK_RIGHTPAREN 0x00000029u /**< ')' */
|
||||||
|
#define SDLK_ASTERISK 0x0000002au /**< '*' */
|
||||||
|
#define SDLK_PLUS 0x0000002bu /**< '+' */
|
||||||
|
#define SDLK_COMMA 0x0000002cu /**< ',' */
|
||||||
|
#define SDLK_MINUS 0x0000002du /**< '-' */
|
||||||
|
#define SDLK_PERIOD 0x0000002eu /**< '.' */
|
||||||
|
#define SDLK_SLASH 0x0000002fu /**< '/' */
|
||||||
|
#define SDLK_0 0x00000030u /**< '0' */
|
||||||
|
#define SDLK_1 0x00000031u /**< '1' */
|
||||||
|
#define SDLK_2 0x00000032u /**< '2' */
|
||||||
|
#define SDLK_3 0x00000033u /**< '3' */
|
||||||
|
#define SDLK_4 0x00000034u /**< '4' */
|
||||||
|
#define SDLK_5 0x00000035u /**< '5' */
|
||||||
|
#define SDLK_6 0x00000036u /**< '6' */
|
||||||
|
#define SDLK_7 0x00000037u /**< '7' */
|
||||||
|
#define SDLK_8 0x00000038u /**< '8' */
|
||||||
|
#define SDLK_9 0x00000039u /**< '9' */
|
||||||
|
#define SDLK_COLON 0x0000003au /**< ':' */
|
||||||
|
#define SDLK_SEMICOLON 0x0000003bu /**< ';' */
|
||||||
|
#define SDLK_LESS 0x0000003cu /**< '<' */
|
||||||
|
#define SDLK_EQUALS 0x0000003du /**< '=' */
|
||||||
|
#define SDLK_GREATER 0x0000003eu /**< '>' */
|
||||||
|
#define SDLK_QUESTION 0x0000003fu /**< '?' */
|
||||||
|
#define SDLK_AT 0x00000040u /**< '@' */
|
||||||
|
#define SDLK_LEFTBRACKET 0x0000005bu /**< '[' */
|
||||||
|
#define SDLK_BACKSLASH 0x0000005cu /**< '\\' */
|
||||||
|
#define SDLK_RIGHTBRACKET 0x0000005du /**< ']' */
|
||||||
|
#define SDLK_CARET 0x0000005eu /**< '^' */
|
||||||
|
#define SDLK_UNDERSCORE 0x0000005fu /**< '_' */
|
||||||
|
#define SDLK_GRAVE 0x00000060u /**< '`' */
|
||||||
|
#define SDLK_A 0x00000061u /**< 'a' */
|
||||||
|
#define SDLK_B 0x00000062u /**< 'b' */
|
||||||
|
#define SDLK_C 0x00000063u /**< 'c' */
|
||||||
|
#define SDLK_D 0x00000064u /**< 'd' */
|
||||||
|
#define SDLK_E 0x00000065u /**< 'e' */
|
||||||
|
#define SDLK_F 0x00000066u /**< 'f' */
|
||||||
|
#define SDLK_G 0x00000067u /**< 'g' */
|
||||||
|
#define SDLK_H 0x00000068u /**< 'h' */
|
||||||
|
#define SDLK_I 0x00000069u /**< 'i' */
|
||||||
|
#define SDLK_J 0x0000006au /**< 'j' */
|
||||||
|
#define SDLK_K 0x0000006bu /**< 'k' */
|
||||||
|
#define SDLK_L 0x0000006cu /**< 'l' */
|
||||||
|
#define SDLK_M 0x0000006du /**< 'm' */
|
||||||
|
#define SDLK_N 0x0000006eu /**< 'n' */
|
||||||
|
#define SDLK_O 0x0000006fu /**< 'o' */
|
||||||
|
#define SDLK_P 0x00000070u /**< 'p' */
|
||||||
|
#define SDLK_Q 0x00000071u /**< 'q' */
|
||||||
|
#define SDLK_R 0x00000072u /**< 'r' */
|
||||||
|
#define SDLK_S 0x00000073u /**< 's' */
|
||||||
|
#define SDLK_T 0x00000074u /**< 't' */
|
||||||
|
#define SDLK_U 0x00000075u /**< 'u' */
|
||||||
|
#define SDLK_V 0x00000076u /**< 'v' */
|
||||||
|
#define SDLK_W 0x00000077u /**< 'w' */
|
||||||
|
#define SDLK_X 0x00000078u /**< 'x' */
|
||||||
|
#define SDLK_Y 0x00000079u /**< 'y' */
|
||||||
|
#define SDLK_Z 0x0000007au /**< 'z' */
|
||||||
|
#define SDLK_LEFTBRACE 0x0000007bu /**< '{' */
|
||||||
|
#define SDLK_PIPE 0x0000007cu /**< '|' */
|
||||||
|
#define SDLK_RIGHTBRACE 0x0000007du /**< '}' */
|
||||||
|
#define SDLK_TILDE 0x0000007eu /**< '~' */
|
||||||
|
#define SDLK_DELETE 0x0000007fu /**< '\x7F' */
|
||||||
|
#define SDLK_PLUSMINUS 0x000000b1u /**< '\xB1' */
|
||||||
|
#define SDLK_CAPSLOCK 0x40000039u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK) */
|
||||||
|
#define SDLK_F1 0x4000003au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1) */
|
||||||
|
#define SDLK_F2 0x4000003bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2) */
|
||||||
|
#define SDLK_F3 0x4000003cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3) */
|
||||||
|
#define SDLK_F4 0x4000003du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4) */
|
||||||
|
#define SDLK_F5 0x4000003eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5) */
|
||||||
|
#define SDLK_F6 0x4000003fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6) */
|
||||||
|
#define SDLK_F7 0x40000040u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7) */
|
||||||
|
#define SDLK_F8 0x40000041u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8) */
|
||||||
|
#define SDLK_F9 0x40000042u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9) */
|
||||||
|
#define SDLK_F10 0x40000043u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10) */
|
||||||
|
#define SDLK_F11 0x40000044u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11) */
|
||||||
|
#define SDLK_F12 0x40000045u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12) */
|
||||||
|
#define SDLK_PRINTSCREEN 0x40000046u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN) */
|
||||||
|
#define SDLK_SCROLLLOCK 0x40000047u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK) */
|
||||||
|
#define SDLK_PAUSE 0x40000048u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE) */
|
||||||
|
#define SDLK_INSERT 0x40000049u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT) */
|
||||||
|
#define SDLK_HOME 0x4000004au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME) */
|
||||||
|
#define SDLK_PAGEUP 0x4000004bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP) */
|
||||||
|
#define SDLK_END 0x4000004du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END) */
|
||||||
|
#define SDLK_PAGEDOWN 0x4000004eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN) */
|
||||||
|
#define SDLK_RIGHT 0x4000004fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT) */
|
||||||
|
#define SDLK_LEFT 0x40000050u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT) */
|
||||||
|
#define SDLK_DOWN 0x40000051u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN) */
|
||||||
|
#define SDLK_UP 0x40000052u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP) */
|
||||||
|
#define SDLK_NUMLOCKCLEAR 0x40000053u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR) */
|
||||||
|
#define SDLK_KP_DIVIDE 0x40000054u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE) */
|
||||||
|
#define SDLK_KP_MULTIPLY 0x40000055u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY) */
|
||||||
|
#define SDLK_KP_MINUS 0x40000056u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS) */
|
||||||
|
#define SDLK_KP_PLUS 0x40000057u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS) */
|
||||||
|
#define SDLK_KP_ENTER 0x40000058u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER) */
|
||||||
|
#define SDLK_KP_1 0x40000059u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1) */
|
||||||
|
#define SDLK_KP_2 0x4000005au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2) */
|
||||||
|
#define SDLK_KP_3 0x4000005bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3) */
|
||||||
|
#define SDLK_KP_4 0x4000005cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4) */
|
||||||
|
#define SDLK_KP_5 0x4000005du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5) */
|
||||||
|
#define SDLK_KP_6 0x4000005eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6) */
|
||||||
|
#define SDLK_KP_7 0x4000005fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7) */
|
||||||
|
#define SDLK_KP_8 0x40000060u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8) */
|
||||||
|
#define SDLK_KP_9 0x40000061u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9) */
|
||||||
|
#define SDLK_KP_0 0x40000062u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0) */
|
||||||
|
#define SDLK_KP_PERIOD 0x40000063u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD) */
|
||||||
|
#define SDLK_APPLICATION 0x40000065u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION) */
|
||||||
|
#define SDLK_POWER 0x40000066u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER) */
|
||||||
|
#define SDLK_KP_EQUALS 0x40000067u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS) */
|
||||||
|
#define SDLK_F13 0x40000068u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13) */
|
||||||
|
#define SDLK_F14 0x40000069u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14) */
|
||||||
|
#define SDLK_F15 0x4000006au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15) */
|
||||||
|
#define SDLK_F16 0x4000006bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16) */
|
||||||
|
#define SDLK_F17 0x4000006cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17) */
|
||||||
|
#define SDLK_F18 0x4000006du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18) */
|
||||||
|
#define SDLK_F19 0x4000006eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19) */
|
||||||
|
#define SDLK_F20 0x4000006fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20) */
|
||||||
|
#define SDLK_F21 0x40000070u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21) */
|
||||||
|
#define SDLK_F22 0x40000071u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22) */
|
||||||
|
#define SDLK_F23 0x40000072u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23) */
|
||||||
|
#define SDLK_F24 0x40000073u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24) */
|
||||||
|
#define SDLK_EXECUTE 0x40000074u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE) */
|
||||||
|
#define SDLK_HELP 0x40000075u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP) */
|
||||||
|
#define SDLK_MENU 0x40000076u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU) */
|
||||||
|
#define SDLK_SELECT 0x40000077u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT) */
|
||||||
|
#define SDLK_STOP 0x40000078u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP) */
|
||||||
|
#define SDLK_AGAIN 0x40000079u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN) */
|
||||||
|
#define SDLK_UNDO 0x4000007au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO) */
|
||||||
|
#define SDLK_CUT 0x4000007bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT) */
|
||||||
|
#define SDLK_COPY 0x4000007cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY) */
|
||||||
|
#define SDLK_PASTE 0x4000007du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE) */
|
||||||
|
#define SDLK_FIND 0x4000007eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND) */
|
||||||
|
#define SDLK_MUTE 0x4000007fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE) */
|
||||||
|
#define SDLK_VOLUMEUP 0x40000080u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP) */
|
||||||
|
#define SDLK_VOLUMEDOWN 0x40000081u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN) */
|
||||||
|
#define SDLK_KP_COMMA 0x40000085u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA) */
|
||||||
|
#define SDLK_KP_EQUALSAS400 0x40000086u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400) */
|
||||||
|
#define SDLK_ALTERASE 0x40000099u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE) */
|
||||||
|
#define SDLK_SYSREQ 0x4000009au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ) */
|
||||||
|
#define SDLK_CANCEL 0x4000009bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL) */
|
||||||
|
#define SDLK_CLEAR 0x4000009cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR) */
|
||||||
|
#define SDLK_PRIOR 0x4000009du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR) */
|
||||||
|
#define SDLK_RETURN2 0x4000009eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2) */
|
||||||
|
#define SDLK_SEPARATOR 0x4000009fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR) */
|
||||||
|
#define SDLK_OUT 0x400000a0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT) */
|
||||||
|
#define SDLK_OPER 0x400000a1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER) */
|
||||||
|
#define SDLK_CLEARAGAIN 0x400000a2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN) */
|
||||||
|
#define SDLK_CRSEL 0x400000a3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL) */
|
||||||
|
#define SDLK_EXSEL 0x400000a4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL) */
|
||||||
|
#define SDLK_KP_00 0x400000b0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00) */
|
||||||
|
#define SDLK_KP_000 0x400000b1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000) */
|
||||||
|
#define SDLK_THOUSANDSSEPARATOR 0x400000b2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR) */
|
||||||
|
#define SDLK_DECIMALSEPARATOR 0x400000b3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR) */
|
||||||
|
#define SDLK_CURRENCYUNIT 0x400000b4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT) */
|
||||||
|
#define SDLK_CURRENCYSUBUNIT 0x400000b5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT) */
|
||||||
|
#define SDLK_KP_LEFTPAREN 0x400000b6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN) */
|
||||||
|
#define SDLK_KP_RIGHTPAREN 0x400000b7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN) */
|
||||||
|
#define SDLK_KP_LEFTBRACE 0x400000b8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE) */
|
||||||
|
#define SDLK_KP_RIGHTBRACE 0x400000b9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE) */
|
||||||
|
#define SDLK_KP_TAB 0x400000bau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB) */
|
||||||
|
#define SDLK_KP_BACKSPACE 0x400000bbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE) */
|
||||||
|
#define SDLK_KP_A 0x400000bcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A) */
|
||||||
|
#define SDLK_KP_B 0x400000bdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B) */
|
||||||
|
#define SDLK_KP_C 0x400000beu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C) */
|
||||||
|
#define SDLK_KP_D 0x400000bfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D) */
|
||||||
|
#define SDLK_KP_E 0x400000c0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E) */
|
||||||
|
#define SDLK_KP_F 0x400000c1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F) */
|
||||||
|
#define SDLK_KP_XOR 0x400000c2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR) */
|
||||||
|
#define SDLK_KP_POWER 0x400000c3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER) */
|
||||||
|
#define SDLK_KP_PERCENT 0x400000c4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT) */
|
||||||
|
#define SDLK_KP_LESS 0x400000c5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS) */
|
||||||
|
#define SDLK_KP_GREATER 0x400000c6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER) */
|
||||||
|
#define SDLK_KP_AMPERSAND 0x400000c7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND) */
|
||||||
|
#define SDLK_KP_DBLAMPERSAND 0x400000c8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND) */
|
||||||
|
#define SDLK_KP_VERTICALBAR 0x400000c9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR) */
|
||||||
|
#define SDLK_KP_DBLVERTICALBAR 0x400000cau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR) */
|
||||||
|
#define SDLK_KP_COLON 0x400000cbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON) */
|
||||||
|
#define SDLK_KP_HASH 0x400000ccu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH) */
|
||||||
|
#define SDLK_KP_SPACE 0x400000cdu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE) */
|
||||||
|
#define SDLK_KP_AT 0x400000ceu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT) */
|
||||||
|
#define SDLK_KP_EXCLAM 0x400000cfu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM) */
|
||||||
|
#define SDLK_KP_MEMSTORE 0x400000d0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE) */
|
||||||
|
#define SDLK_KP_MEMRECALL 0x400000d1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL) */
|
||||||
|
#define SDLK_KP_MEMCLEAR 0x400000d2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR) */
|
||||||
|
#define SDLK_KP_MEMADD 0x400000d3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD) */
|
||||||
|
#define SDLK_KP_MEMSUBTRACT 0x400000d4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT) */
|
||||||
|
#define SDLK_KP_MEMMULTIPLY 0x400000d5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY) */
|
||||||
|
#define SDLK_KP_MEMDIVIDE 0x400000d6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE) */
|
||||||
|
#define SDLK_KP_PLUSMINUS 0x400000d7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS) */
|
||||||
|
#define SDLK_KP_CLEAR 0x400000d8u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR) */
|
||||||
|
#define SDLK_KP_CLEARENTRY 0x400000d9u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY) */
|
||||||
|
#define SDLK_KP_BINARY 0x400000dau /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY) */
|
||||||
|
#define SDLK_KP_OCTAL 0x400000dbu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL) */
|
||||||
|
#define SDLK_KP_DECIMAL 0x400000dcu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL) */
|
||||||
|
#define SDLK_KP_HEXADECIMAL 0x400000ddu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL) */
|
||||||
|
#define SDLK_LCTRL 0x400000e0u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL) */
|
||||||
|
#define SDLK_LSHIFT 0x400000e1u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT) */
|
||||||
|
#define SDLK_LALT 0x400000e2u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT) */
|
||||||
|
#define SDLK_LGUI 0x400000e3u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI) */
|
||||||
|
#define SDLK_RCTRL 0x400000e4u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL) */
|
||||||
|
#define SDLK_RSHIFT 0x400000e5u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT) */
|
||||||
|
#define SDLK_RALT 0x400000e6u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT) */
|
||||||
|
#define SDLK_RGUI 0x400000e7u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI) */
|
||||||
|
#define SDLK_MODE 0x40000101u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE) */
|
||||||
|
#define SDLK_SLEEP 0x40000102u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) */
|
||||||
|
#define SDLK_WAKE 0x40000103u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE) */
|
||||||
|
#define SDLK_CHANNEL_INCREMENT 0x40000104u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT) */
|
||||||
|
#define SDLK_CHANNEL_DECREMENT 0x40000105u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT) */
|
||||||
|
#define SDLK_MEDIA_PLAY 0x40000106u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY) */
|
||||||
|
#define SDLK_MEDIA_PAUSE 0x40000107u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE) */
|
||||||
|
#define SDLK_MEDIA_RECORD 0x40000108u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD) */
|
||||||
|
#define SDLK_MEDIA_FAST_FORWARD 0x40000109u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD) */
|
||||||
|
#define SDLK_MEDIA_REWIND 0x4000010au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND) */
|
||||||
|
#define SDLK_MEDIA_NEXT_TRACK 0x4000010bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK) */
|
||||||
|
#define SDLK_MEDIA_PREVIOUS_TRACK 0x4000010cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) */
|
||||||
|
#define SDLK_MEDIA_STOP 0x4000010du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP) */
|
||||||
|
#define SDLK_MEDIA_EJECT 0x4000010eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT) */
|
||||||
|
#define SDLK_MEDIA_PLAY_PAUSE 0x4000010fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE) */
|
||||||
|
#define SDLK_MEDIA_SELECT 0x40000110u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT) */
|
||||||
|
#define SDLK_AC_NEW 0x40000111u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW) */
|
||||||
|
#define SDLK_AC_OPEN 0x40000112u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN) */
|
||||||
|
#define SDLK_AC_CLOSE 0x40000113u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE) */
|
||||||
|
#define SDLK_AC_EXIT 0x40000114u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT) */
|
||||||
|
#define SDLK_AC_SAVE 0x40000115u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE) */
|
||||||
|
#define SDLK_AC_PRINT 0x40000116u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT) */
|
||||||
|
#define SDLK_AC_PROPERTIES 0x40000117u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES) */
|
||||||
|
#define SDLK_AC_SEARCH 0x40000118u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH) */
|
||||||
|
#define SDLK_AC_HOME 0x40000119u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME) */
|
||||||
|
#define SDLK_AC_BACK 0x4000011au /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK) */
|
||||||
|
#define SDLK_AC_FORWARD 0x4000011bu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD) */
|
||||||
|
#define SDLK_AC_STOP 0x4000011cu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP) */
|
||||||
|
#define SDLK_AC_REFRESH 0x4000011du /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH) */
|
||||||
|
#define SDLK_AC_BOOKMARKS 0x4000011eu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS) */
|
||||||
|
#define SDLK_SOFTLEFT 0x4000011fu /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT) */
|
||||||
|
#define SDLK_SOFTRIGHT 0x40000120u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT) */
|
||||||
|
#define SDLK_CALL 0x40000121u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL) */
|
||||||
|
#define SDLK_ENDCALL 0x40000122u /**< SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) */
|
||||||
|
#define SDLK_LEFT_TAB 0x20000001u /**< Extended key Left Tab */
|
||||||
|
#define SDLK_LEVEL5_SHIFT 0x20000002u /**< Extended key Level 5 Shift */
|
||||||
|
#define SDLK_MULTI_KEY_COMPOSE 0x20000003u /**< Extended key Multi-key Compose */
|
||||||
|
#define SDLK_LMETA 0x20000004u /**< Extended key Left Meta */
|
||||||
|
#define SDLK_RMETA 0x20000005u /**< Extended key Right Meta */
|
||||||
|
#define SDLK_LHYPER 0x20000006u /**< Extended key Left Hyper */
|
||||||
|
#define SDLK_RHYPER 0x20000007u /**< Extended key Right Hyper */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valid key modifiers (possibly OR'd together).
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint16 SDL_Keymod;
|
||||||
|
|
||||||
|
#define SDL_KMOD_NONE 0x0000u /**< no modifier is applicable. */
|
||||||
|
#define SDL_KMOD_LSHIFT 0x0001u /**< the left Shift key is down. */
|
||||||
|
#define SDL_KMOD_RSHIFT 0x0002u /**< the right Shift key is down. */
|
||||||
|
#define SDL_KMOD_LEVEL5 0x0004u /**< the Level 5 Shift key is down. */
|
||||||
|
#define SDL_KMOD_LCTRL 0x0040u /**< the left Ctrl (Control) key is down. */
|
||||||
|
#define SDL_KMOD_RCTRL 0x0080u /**< the right Ctrl (Control) key is down. */
|
||||||
|
#define SDL_KMOD_LALT 0x0100u /**< the left Alt key is down. */
|
||||||
|
#define SDL_KMOD_RALT 0x0200u /**< the right Alt key is down. */
|
||||||
|
#define SDL_KMOD_LGUI 0x0400u /**< the left GUI key (often the Windows key) is down. */
|
||||||
|
#define SDL_KMOD_RGUI 0x0800u /**< the right GUI key (often the Windows key) is down. */
|
||||||
|
#define SDL_KMOD_NUM 0x1000u /**< the Num Lock key (may be located on an extended keypad) is down. */
|
||||||
|
#define SDL_KMOD_CAPS 0x2000u /**< the Caps Lock key is down. */
|
||||||
|
#define SDL_KMOD_MODE 0x4000u /**< the !AltGr key is down. */
|
||||||
|
#define SDL_KMOD_SCROLL 0x8000u /**< the Scroll Lock key is down. */
|
||||||
|
#define SDL_KMOD_CTRL (SDL_KMOD_LCTRL | SDL_KMOD_RCTRL) /**< Any Ctrl key is down. */
|
||||||
|
#define SDL_KMOD_SHIFT (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT) /**< Any Shift key is down. */
|
||||||
|
#define SDL_KMOD_ALT (SDL_KMOD_LALT | SDL_KMOD_RALT) /**< Any Alt key is down. */
|
||||||
|
#define SDL_KMOD_GUI (SDL_KMOD_LGUI | SDL_KMOD_RGUI) /**< Any GUI key is down. */
|
||||||
|
|
||||||
|
#endif /* SDL_keycode_h_ */
|
||||||
Vendored
+145
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: SharedObject */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategorySharedObject
|
||||||
|
*
|
||||||
|
* System-dependent library loading routines.
|
||||||
|
*
|
||||||
|
* Shared objects are code that is programmatically loadable at runtime.
|
||||||
|
* Windows calls these "DLLs", Linux calls them "shared libraries", etc.
|
||||||
|
*
|
||||||
|
* To use them, build such a library, then call SDL_LoadObject() on it. Once
|
||||||
|
* loaded, you can use SDL_LoadFunction() on that object to find the address
|
||||||
|
* of its exported symbols. When done with the object, call SDL_UnloadObject()
|
||||||
|
* to dispose of it.
|
||||||
|
*
|
||||||
|
* Some things to keep in mind:
|
||||||
|
*
|
||||||
|
* - These functions only work on C function names. Other languages may have
|
||||||
|
* name mangling and intrinsic language support that varies from compiler to
|
||||||
|
* compiler.
|
||||||
|
* - Make sure you declare your function pointers with the same calling
|
||||||
|
* convention as the actual library function. Your code will crash
|
||||||
|
* mysteriously if you do not do this.
|
||||||
|
* - Avoid namespace collisions. If you load a symbol from the library, it is
|
||||||
|
* not defined whether or not it goes into the global symbol namespace for
|
||||||
|
* the application. If it does and it conflicts with symbols in your code or
|
||||||
|
* other shared libraries, you will not get the results you expect. :)
|
||||||
|
* - Once a library is unloaded, all pointers into it obtained through
|
||||||
|
* SDL_LoadFunction() become invalid, even if the library is later reloaded.
|
||||||
|
* Don't unload a library if you plan to use these pointers in the future.
|
||||||
|
* Notably: beware of giving one of these pointers to atexit(), since it may
|
||||||
|
* call that pointer after the library unloads.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_loadso_h_
|
||||||
|
#define SDL_loadso_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An opaque datatype that represents a loaded shared object.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LoadObject
|
||||||
|
* \sa SDL_LoadFunction
|
||||||
|
* \sa SDL_UnloadObject
|
||||||
|
*/
|
||||||
|
typedef struct SDL_SharedObject SDL_SharedObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dynamically load a shared object.
|
||||||
|
*
|
||||||
|
* \param sofile a system-dependent name of the object file.
|
||||||
|
* \returns an opaque pointer to the object handle or NULL on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LoadFunction
|
||||||
|
* \sa SDL_UnloadObject
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_SharedObject * SDLCALL SDL_LoadObject(const char *sofile);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Look up the address of the named function in a shared object.
|
||||||
|
*
|
||||||
|
* This function pointer is no longer valid after calling SDL_UnloadObject().
|
||||||
|
*
|
||||||
|
* This function can only look up C function names. Other languages may have
|
||||||
|
* name mangling and intrinsic language support that varies from compiler to
|
||||||
|
* compiler.
|
||||||
|
*
|
||||||
|
* Make sure you declare your function pointers with the same calling
|
||||||
|
* convention as the actual library function. Your code will crash
|
||||||
|
* mysteriously if you do not do this.
|
||||||
|
*
|
||||||
|
* If the requested function doesn't exist, NULL is returned.
|
||||||
|
*
|
||||||
|
* \param handle a valid shared object handle returned by SDL_LoadObject().
|
||||||
|
* \param name the name of the function to look up.
|
||||||
|
* \returns a pointer to the function or NULL on failure; call SDL_GetError()
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LoadObject
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_FunctionPointer SDLCALL SDL_LoadFunction(SDL_SharedObject *handle, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unload a shared object from memory.
|
||||||
|
*
|
||||||
|
* Note that any pointers from this object looked up through
|
||||||
|
* SDL_LoadFunction() will no longer be valid.
|
||||||
|
*
|
||||||
|
* \param handle a valid shared object handle returned by SDL_LoadObject().
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LoadObject
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_UnloadObject(SDL_SharedObject *handle);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_loadso_h_ */
|
||||||
Vendored
+117
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryLocale
|
||||||
|
*
|
||||||
|
* SDL locale services.
|
||||||
|
*
|
||||||
|
* This provides a way to get a list of preferred locales (language plus
|
||||||
|
* country) for the user. There is exactly one function:
|
||||||
|
* SDL_GetPreferredLocales(), which handles all the heavy lifting, and offers
|
||||||
|
* documentation on all the strange ways humans might have configured their
|
||||||
|
* language settings.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_locale_h
|
||||||
|
#define SDL_locale_h
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
extern "C" {
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A struct to provide locale data.
|
||||||
|
*
|
||||||
|
* Locale data is split into a spoken language, like English, and an optional
|
||||||
|
* country, like Canada. The language will be in ISO-639 format (so English
|
||||||
|
* would be "en"), and the country, if not NULL, will be an ISO-3166 country
|
||||||
|
* code (so Canada would be "CA").
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetPreferredLocales
|
||||||
|
*/
|
||||||
|
typedef struct SDL_Locale
|
||||||
|
{
|
||||||
|
const char *language; /**< A language name, like "en" for English. */
|
||||||
|
const char *country; /**< A country, like "US" for America. Can be NULL. */
|
||||||
|
} SDL_Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report the user's preferred locale.
|
||||||
|
*
|
||||||
|
* Returned language strings are in the format xx, where 'xx' is an ISO-639
|
||||||
|
* language specifier (such as "en" for English, "de" for German, etc).
|
||||||
|
* Country strings are in the format YY, where "YY" is an ISO-3166 country
|
||||||
|
* code (such as "US" for the United States, "CA" for Canada, etc). Country
|
||||||
|
* might be NULL if there's no specific guidance on them (so you might get {
|
||||||
|
* "en", "US" } for American English, but { "en", NULL } means "English
|
||||||
|
* language, generically"). Language strings are never NULL, except to
|
||||||
|
* terminate the array.
|
||||||
|
*
|
||||||
|
* Please note that not all of these strings are 2 characters; some are three
|
||||||
|
* or more.
|
||||||
|
*
|
||||||
|
* The returned list of locales are in the order of the user's preference. For
|
||||||
|
* example, a German citizen that is fluent in US English and knows enough
|
||||||
|
* Japanese to navigate around Tokyo might have a list like: { "de", "en_US",
|
||||||
|
* "jp", NULL }. Someone from England might prefer British English (where
|
||||||
|
* "color" is spelled "colour", etc), but will settle for anything like it: {
|
||||||
|
* "en_GB", "en", NULL }.
|
||||||
|
*
|
||||||
|
* This function returns NULL on error, including when the platform does not
|
||||||
|
* supply this information at all.
|
||||||
|
*
|
||||||
|
* This might be a "slow" call that has to query the operating system. It's
|
||||||
|
* best to ask for this once and save the results. However, this list can
|
||||||
|
* change, usually because the user has changed a system preference outside of
|
||||||
|
* your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case,
|
||||||
|
* if possible, and you can call this function again to get an updated copy of
|
||||||
|
* preferred locales.
|
||||||
|
*
|
||||||
|
* \param count a pointer filled in with the number of locales returned, may
|
||||||
|
* be NULL.
|
||||||
|
* \returns a NULL terminated array of locale pointers, or NULL on failure;
|
||||||
|
* call SDL_GetError() for more information. This is a single
|
||||||
|
* allocation that should be freed with SDL_free() when it is no
|
||||||
|
* longer needed.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Locale ** SDLCALL SDL_GetPreferredLocales(int *count);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
}
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_locale_h */
|
||||||
Vendored
+529
@@ -0,0 +1,529 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryLog
|
||||||
|
*
|
||||||
|
* Simple log messages with priorities and categories. A message's
|
||||||
|
* SDL_LogPriority signifies how important the message is. A message's
|
||||||
|
* SDL_LogCategory signifies from what domain it belongs to. Every category
|
||||||
|
* has a minimum priority specified: when a message belongs to that category,
|
||||||
|
* it will only be sent out if it has that minimum priority or higher.
|
||||||
|
*
|
||||||
|
* SDL's own logs are sent below the default priority threshold, so they are
|
||||||
|
* quiet by default.
|
||||||
|
*
|
||||||
|
* You can change the log verbosity programmatically using
|
||||||
|
* SDL_SetLogPriority() or with SDL_SetHint(SDL_HINT_LOGGING, ...), or with
|
||||||
|
* the "SDL_LOGGING" environment variable. This variable is a comma separated
|
||||||
|
* set of category=level tokens that define the default logging levels for SDL
|
||||||
|
* applications.
|
||||||
|
*
|
||||||
|
* The category can be a numeric category, one of "app", "error", "assert",
|
||||||
|
* "system", "audio", "video", "render", "input", "test", or `*` for any
|
||||||
|
* unspecified category.
|
||||||
|
*
|
||||||
|
* The level can be a numeric level, one of "verbose", "debug", "info",
|
||||||
|
* "warn", "error", "critical", or "quiet" to disable that category.
|
||||||
|
*
|
||||||
|
* You can omit the category if you want to set the logging level for all
|
||||||
|
* categories.
|
||||||
|
*
|
||||||
|
* If this hint isn't set, the default log levels are equivalent to:
|
||||||
|
*
|
||||||
|
* `app=info,assert=warn,test=verbose,*=error`
|
||||||
|
*
|
||||||
|
* Here's where the messages go on different platforms:
|
||||||
|
*
|
||||||
|
* - Windows: debug output stream
|
||||||
|
* - Android: log output
|
||||||
|
* - Others: standard error output (stderr)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_log_h_
|
||||||
|
#define SDL_log_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predefined log categories
|
||||||
|
*
|
||||||
|
* By default the application and gpu categories are enabled at the INFO
|
||||||
|
* level, the assert category is enabled at the WARN level, test is enabled at
|
||||||
|
* the VERBOSE level and all other categories are enabled at the ERROR level.
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_LogCategory
|
||||||
|
{
|
||||||
|
SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
SDL_LOG_CATEGORY_ERROR,
|
||||||
|
SDL_LOG_CATEGORY_ASSERT,
|
||||||
|
SDL_LOG_CATEGORY_SYSTEM,
|
||||||
|
SDL_LOG_CATEGORY_AUDIO,
|
||||||
|
SDL_LOG_CATEGORY_VIDEO,
|
||||||
|
SDL_LOG_CATEGORY_RENDER,
|
||||||
|
SDL_LOG_CATEGORY_INPUT,
|
||||||
|
SDL_LOG_CATEGORY_TEST,
|
||||||
|
SDL_LOG_CATEGORY_GPU,
|
||||||
|
|
||||||
|
/* Reserved for future SDL library use */
|
||||||
|
SDL_LOG_CATEGORY_RESERVED2,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED3,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED4,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED5,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED6,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED7,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED8,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED9,
|
||||||
|
SDL_LOG_CATEGORY_RESERVED10,
|
||||||
|
|
||||||
|
/* Beyond this point is reserved for application use, e.g.
|
||||||
|
enum {
|
||||||
|
MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM,
|
||||||
|
MYAPP_CATEGORY_AWESOME2,
|
||||||
|
MYAPP_CATEGORY_AWESOME3,
|
||||||
|
...
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
SDL_LOG_CATEGORY_CUSTOM
|
||||||
|
} SDL_LogCategory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The predefined log priorities
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_LogPriority
|
||||||
|
{
|
||||||
|
SDL_LOG_PRIORITY_INVALID,
|
||||||
|
SDL_LOG_PRIORITY_TRACE,
|
||||||
|
SDL_LOG_PRIORITY_VERBOSE,
|
||||||
|
SDL_LOG_PRIORITY_DEBUG,
|
||||||
|
SDL_LOG_PRIORITY_INFO,
|
||||||
|
SDL_LOG_PRIORITY_WARN,
|
||||||
|
SDL_LOG_PRIORITY_ERROR,
|
||||||
|
SDL_LOG_PRIORITY_CRITICAL,
|
||||||
|
SDL_LOG_PRIORITY_COUNT
|
||||||
|
} SDL_LogPriority;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the priority of all log categories.
|
||||||
|
*
|
||||||
|
* \param priority the SDL_LogPriority to assign.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ResetLogPriorities
|
||||||
|
* \sa SDL_SetLogPriority
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriorities(SDL_LogPriority priority);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the priority of a particular log category.
|
||||||
|
*
|
||||||
|
* \param category the category to assign a priority to.
|
||||||
|
* \param priority the SDL_LogPriority to assign.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetLogPriority
|
||||||
|
* \sa SDL_ResetLogPriorities
|
||||||
|
* \sa SDL_SetLogPriorities
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetLogPriority(int category, SDL_LogPriority priority);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the priority of a particular log category.
|
||||||
|
*
|
||||||
|
* \param category the category to query.
|
||||||
|
* \returns the SDL_LogPriority for the requested category.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetLogPriority
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_LogPriority SDLCALL SDL_GetLogPriority(int category);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset all priorities to default.
|
||||||
|
*
|
||||||
|
* This is called by SDL_Quit().
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetLogPriorities
|
||||||
|
* \sa SDL_SetLogPriority
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_ResetLogPriorities(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the text prepended to log messages of a given priority.
|
||||||
|
*
|
||||||
|
* By default SDL_LOG_PRIORITY_INFO and below have no prefix, and
|
||||||
|
* SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g.
|
||||||
|
* "WARNING: ".
|
||||||
|
*
|
||||||
|
* \param priority the SDL_LogPriority to modify.
|
||||||
|
* \param prefix the prefix to use for that log priority, or NULL to use no
|
||||||
|
* prefix.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetLogPriorities
|
||||||
|
* \sa SDL_SetLogPriority
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetLogPriorityPrefix(SDL_LogPriority priority, const char *prefix);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO.
|
||||||
|
*
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the `fmt` string, if
|
||||||
|
* any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_TRACE.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogTrace(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_VERBOSE.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_DEBUG.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_INFO.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_WARN.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_ERROR.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with SDL_LOG_PRIORITY_CRITICAL.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with the specified category and priority.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param priority the priority of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ... additional parameters matching % tokens in the **fmt** string,
|
||||||
|
* if any.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessageV
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogMessage(int category,
|
||||||
|
SDL_LogPriority priority,
|
||||||
|
SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log a message with the specified category and priority.
|
||||||
|
*
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param priority the priority of the message.
|
||||||
|
* \param fmt a printf() style message format string.
|
||||||
|
* \param ap a variable argument list.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Log
|
||||||
|
* \sa SDL_LogCritical
|
||||||
|
* \sa SDL_LogDebug
|
||||||
|
* \sa SDL_LogError
|
||||||
|
* \sa SDL_LogInfo
|
||||||
|
* \sa SDL_LogMessage
|
||||||
|
* \sa SDL_LogTrace
|
||||||
|
* \sa SDL_LogVerbose
|
||||||
|
* \sa SDL_LogWarn
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_LogMessageV(int category,
|
||||||
|
SDL_LogPriority priority,
|
||||||
|
SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The prototype for the log output callback function.
|
||||||
|
*
|
||||||
|
* This function is called by SDL when there is new text to be logged. A mutex
|
||||||
|
* is held so that this function is never called by more than one thread at
|
||||||
|
* once.
|
||||||
|
*
|
||||||
|
* \param userdata what was passed as `userdata` to
|
||||||
|
* SDL_SetLogOutputFunction().
|
||||||
|
* \param category the category of the message.
|
||||||
|
* \param priority the priority of the message.
|
||||||
|
* \param message the message being output.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default log output function.
|
||||||
|
*
|
||||||
|
* \returns the default log output callback.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetLogOutputFunction
|
||||||
|
* \sa SDL_GetLogOutputFunction
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_LogOutputFunction SDLCALL SDL_GetDefaultLogOutputFunction(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current log output function.
|
||||||
|
*
|
||||||
|
* \param callback an SDL_LogOutputFunction filled in with the current log
|
||||||
|
* callback.
|
||||||
|
* \param userdata a pointer filled in with the pointer that is passed to
|
||||||
|
* `callback`.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetDefaultLogOutputFunction
|
||||||
|
* \sa SDL_SetLogOutputFunction
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_GetLogOutputFunction(SDL_LogOutputFunction *callback, void **userdata);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace the default log output function with one of your own.
|
||||||
|
*
|
||||||
|
* \param callback an SDL_LogOutputFunction to call instead of the default.
|
||||||
|
* \param userdata a pointer that is passed to `callback`.
|
||||||
|
*
|
||||||
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetDefaultLogOutputFunction
|
||||||
|
* \sa SDL_GetLogOutputFunction
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetLogOutputFunction(SDL_LogOutputFunction callback, void *userdata);
|
||||||
|
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_log_h_ */
|
||||||
Vendored
+672
@@ -0,0 +1,672 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryMain
|
||||||
|
*
|
||||||
|
* Redefine main() if necessary so that it is called by SDL.
|
||||||
|
*
|
||||||
|
* In order to make this consistent on all platforms, the application's main()
|
||||||
|
* should look like this:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* int main(int argc, char *argv[])
|
||||||
|
* {
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* SDL will take care of platform specific details on how it gets called.
|
||||||
|
*
|
||||||
|
* This is also where an app can be configured to use the main callbacks, via
|
||||||
|
* the SDL_MAIN_USE_CALLBACKS macro.
|
||||||
|
*
|
||||||
|
* This is a "single-header library," which is to say that including this
|
||||||
|
* header inserts code into your program, and you should only include it once
|
||||||
|
* in most cases. SDL.h does not include this header automatically.
|
||||||
|
*
|
||||||
|
* For more information, see:
|
||||||
|
*
|
||||||
|
* https://wiki.libsdl.org/SDL3/README/main-functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_main_h_
|
||||||
|
#define SDL_main_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_platform_defines.h>
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_events.h>
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inform SDL that the app is providing an entry point instead of SDL.
|
||||||
|
*
|
||||||
|
* SDL does not define this macro, but will check if it is defined when
|
||||||
|
* including `SDL_main.h`. If defined, SDL will expect the app to provide the
|
||||||
|
* proper entry point for the platform, and all the other magic details
|
||||||
|
* needed, like manually calling SDL_SetMainReady.
|
||||||
|
*
|
||||||
|
* Please see [README/main-functions](README/main-functions), (or
|
||||||
|
* docs/README-main-functions.md in the source tree) for a more detailed
|
||||||
|
* explanation.
|
||||||
|
*
|
||||||
|
* \since This macro is used by the headers since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_HANDLED 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inform SDL to use the main callbacks instead of main.
|
||||||
|
*
|
||||||
|
* SDL does not define this macro, but will check if it is defined when
|
||||||
|
* including `SDL_main.h`. If defined, SDL will expect the app to provide
|
||||||
|
* several functions: SDL_AppInit, SDL_AppEvent, SDL_AppIterate, and
|
||||||
|
* SDL_AppQuit. The app should not provide a `main` function in this case, and
|
||||||
|
* doing so will likely cause the build to fail.
|
||||||
|
*
|
||||||
|
* Please see [README/main-functions](README/main-functions), (or
|
||||||
|
* docs/README-main-functions.md in the source tree) for a more detailed
|
||||||
|
* explanation.
|
||||||
|
*
|
||||||
|
* \since This macro is used by the headers since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AppInit
|
||||||
|
* \sa SDL_AppEvent
|
||||||
|
* \sa SDL_AppIterate
|
||||||
|
* \sa SDL_AppQuit
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_USE_CALLBACKS 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if the target platform offers a special mainline through SDL.
|
||||||
|
*
|
||||||
|
* This won't be defined otherwise. If defined, SDL's headers will redefine
|
||||||
|
* `main` to `SDL_main`.
|
||||||
|
*
|
||||||
|
* This macro is defined by `SDL_main.h`, which is not automatically included
|
||||||
|
* by `SDL.h`.
|
||||||
|
*
|
||||||
|
* Even if available, an app can define SDL_MAIN_HANDLED and provide their
|
||||||
|
* own, if they know what they're doing.
|
||||||
|
*
|
||||||
|
* This macro is used internally by SDL, and apps probably shouldn't rely on it.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defined if the target platform _requires_ a special mainline through SDL.
|
||||||
|
*
|
||||||
|
* This won't be defined otherwise. If defined, SDL's headers will redefine
|
||||||
|
* `main` to `SDL_main`.
|
||||||
|
*
|
||||||
|
* This macro is defined by `SDL_main.h`, which is not automatically included
|
||||||
|
* by `SDL.h`.
|
||||||
|
*
|
||||||
|
* Even if required, an app can define SDL_MAIN_HANDLED and provide their
|
||||||
|
* own, if they know what they're doing.
|
||||||
|
*
|
||||||
|
* This macro is used internally by SDL, and apps probably shouldn't rely on it.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_NEEDED
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__has_include)
|
||||||
|
#if __has_include("SDL_main_private.h") && __has_include("SDL_main_impl_private.h")
|
||||||
|
#define SDL_PLATFORM_PRIVATE_MAIN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDL_MAIN_HANDLED
|
||||||
|
#if defined(SDL_PLATFORM_PRIVATE_MAIN)
|
||||||
|
/* Private platforms may have their own ideas about entry points. */
|
||||||
|
#include "SDL_main_private.h"
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_WIN32)
|
||||||
|
/* On Windows SDL provides WinMain(), which parses the command line and passes
|
||||||
|
the arguments to your main function.
|
||||||
|
|
||||||
|
If you provide your own WinMain(), you may define SDL_MAIN_HANDLED
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_GDK)
|
||||||
|
/* On GDK, SDL provides a main function that initializes the game runtime.
|
||||||
|
|
||||||
|
If you prefer to write your own WinMain-function instead of having SDL
|
||||||
|
provide one that calls your main() function,
|
||||||
|
#define SDL_MAIN_HANDLED before #include'ing SDL_main.h
|
||||||
|
and call the SDL_RunApp function from your entry point.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_NEEDED
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_IOS)
|
||||||
|
/* On iOS SDL provides a main function that creates an application delegate
|
||||||
|
and starts the iOS application run loop.
|
||||||
|
|
||||||
|
To use it, just #include SDL_main.h in the source file that contains your
|
||||||
|
main() function.
|
||||||
|
|
||||||
|
See src/video/uikit/SDL_uikitappdelegate.m for more details.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_NEEDED
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_ANDROID)
|
||||||
|
/* On Android SDL provides a Java class in SDLActivity.java that is the
|
||||||
|
main activity entry point.
|
||||||
|
|
||||||
|
See docs/README-android.md for more details on extending that class.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_NEEDED
|
||||||
|
|
||||||
|
/* As this is launched from Java, the real entry point (main() function)
|
||||||
|
is outside of the the binary built from this code.
|
||||||
|
This define makes sure that, unlike on other platforms, SDL_main.h
|
||||||
|
and SDL_main_impl.h export an `SDL_main()` function (to be called
|
||||||
|
from Java), but don't implement a native `int main(int argc, char* argv[])`
|
||||||
|
or similar.
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_EXPORTED
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_EMSCRIPTEN)
|
||||||
|
/* On Emscripten, SDL provides a main function that converts URL
|
||||||
|
parameters that start with "SDL_" to environment variables, so
|
||||||
|
they can be used as SDL hints, etc.
|
||||||
|
|
||||||
|
This is 100% optional, so if you don't want this to happen, you may
|
||||||
|
define SDL_MAIN_HANDLED
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_PSP)
|
||||||
|
/* On PSP SDL provides a main function that sets the module info,
|
||||||
|
activates the GPU and starts the thread required to be able to exit
|
||||||
|
the software.
|
||||||
|
|
||||||
|
If you provide this yourself, you may define SDL_MAIN_HANDLED
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_PS2)
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
#define SDL_PS2_SKIP_IOP_RESET() \
|
||||||
|
void reset_IOP(); \
|
||||||
|
void reset_IOP() {}
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_3DS)
|
||||||
|
/*
|
||||||
|
On N3DS, SDL provides a main function that sets up the screens
|
||||||
|
and storage.
|
||||||
|
|
||||||
|
If you provide this yourself, you may define SDL_MAIN_HANDLED
|
||||||
|
*/
|
||||||
|
#define SDL_MAIN_AVAILABLE
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif /* SDL_MAIN_HANDLED */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SDL_WIKI_DOCUMENTATION_SECTION
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A macro to tag a main entry point function as exported.
|
||||||
|
*
|
||||||
|
* Most platforms don't need this, and the macro will be defined to nothing.
|
||||||
|
* Some, like Android, keep the entry points in a shared library and need to
|
||||||
|
* explicitly export the symbols.
|
||||||
|
*
|
||||||
|
* External code rarely needs this, and if it needs something, it's almost
|
||||||
|
* always SDL_DECLSPEC instead.
|
||||||
|
*
|
||||||
|
* \since This macro is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DECLSPEC
|
||||||
|
*/
|
||||||
|
#define SDLMAIN_DECLSPEC
|
||||||
|
|
||||||
|
#elif defined(SDL_MAIN_EXPORTED)
|
||||||
|
/* We need to export SDL_main so it can be launched from external code,
|
||||||
|
like SDLActivity.java on Android */
|
||||||
|
#define SDLMAIN_DECLSPEC SDL_DECLSPEC
|
||||||
|
#else
|
||||||
|
/* usually this is empty */
|
||||||
|
#define SDLMAIN_DECLSPEC
|
||||||
|
#endif /* SDL_MAIN_EXPORTED */
|
||||||
|
|
||||||
|
#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) || defined(SDL_MAIN_USE_CALLBACKS)
|
||||||
|
#define main SDL_main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <SDL3/SDL_init.h>
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can (optionally!) define SDL_MAIN_USE_CALLBACKS before including
|
||||||
|
* SDL_main.h, and then your application will _not_ have a standard
|
||||||
|
* "main" entry point. Instead, it will operate as a collection of
|
||||||
|
* functions that are called as necessary by the system. On some
|
||||||
|
* platforms, this is just a layer where SDL drives your program
|
||||||
|
* instead of your program driving SDL, on other platforms this might
|
||||||
|
* hook into the OS to manage the lifecycle. Programs on most platforms
|
||||||
|
* can use whichever approach they prefer, but the decision boils down
|
||||||
|
* to:
|
||||||
|
*
|
||||||
|
* - Using a standard "main" function: this works like it always has for
|
||||||
|
* the past 50+ years in C programming, and your app is in control.
|
||||||
|
* - Using the callback functions: this might clean up some code,
|
||||||
|
* avoid some #ifdef blocks in your program for some platforms, be more
|
||||||
|
* resource-friendly to the system, and possibly be the primary way to
|
||||||
|
* access some future platforms (but none require this at the moment).
|
||||||
|
*
|
||||||
|
* This is up to the app; both approaches are considered valid and supported
|
||||||
|
* ways to write SDL apps.
|
||||||
|
*
|
||||||
|
* If using the callbacks, don't define a "main" function. Instead, implement
|
||||||
|
* the functions listed below in your program.
|
||||||
|
*/
|
||||||
|
#ifdef SDL_MAIN_USE_CALLBACKS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App-implemented initial entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||||
|
*
|
||||||
|
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a
|
||||||
|
* standard "main" function, you should not supply this.
|
||||||
|
*
|
||||||
|
* This function is called by SDL once, at startup. The function should
|
||||||
|
* initialize whatever is necessary, possibly create windows and open audio
|
||||||
|
* devices, etc. The `argc` and `argv` parameters work like they would with a
|
||||||
|
* standard "main" function.
|
||||||
|
*
|
||||||
|
* This function should not go into an infinite mainloop; it should do any
|
||||||
|
* one-time setup it requires and then return.
|
||||||
|
*
|
||||||
|
* The app may optionally assign a pointer to `*appstate`. This pointer will
|
||||||
|
* be provided on every future call to the other entry points, to allow
|
||||||
|
* application state to be preserved between functions without the app needing
|
||||||
|
* to use a global variable. If this isn't set, the pointer will be NULL in
|
||||||
|
* future entry points.
|
||||||
|
*
|
||||||
|
* If this function returns SDL_APP_CONTINUE, the app will proceed to normal
|
||||||
|
* operation, and will begin receiving repeated calls to SDL_AppIterate and
|
||||||
|
* SDL_AppEvent for the life of the program. If this function returns
|
||||||
|
* SDL_APP_FAILURE, SDL will call SDL_AppQuit and terminate the process with
|
||||||
|
* an exit code that reports an error to the platform. If it returns
|
||||||
|
* SDL_APP_SUCCESS, SDL calls SDL_AppQuit and terminates with an exit code
|
||||||
|
* that reports success to the platform.
|
||||||
|
*
|
||||||
|
* This function is called by SDL on the main thread.
|
||||||
|
*
|
||||||
|
* \param appstate a place where the app can optionally store a pointer for
|
||||||
|
* future use.
|
||||||
|
* \param argc the standard ANSI C main's argc; number of elements in `argv`.
|
||||||
|
* \param argv the standard ANSI C main's argv; array of command line
|
||||||
|
* arguments.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AppIterate
|
||||||
|
* \sa SDL_AppEvent
|
||||||
|
* \sa SDL_AppQuit
|
||||||
|
*/
|
||||||
|
extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int argc, char *argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App-implemented iteration entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||||
|
*
|
||||||
|
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a
|
||||||
|
* standard "main" function, you should not supply this.
|
||||||
|
*
|
||||||
|
* This function is called repeatedly by SDL after SDL_AppInit returns 0. The
|
||||||
|
* function should operate as a single iteration the program's primary loop;
|
||||||
|
* it should update whatever state it needs and draw a new frame of video,
|
||||||
|
* usually.
|
||||||
|
*
|
||||||
|
* On some platforms, this function will be called at the refresh rate of the
|
||||||
|
* display (which might change during the life of your app!). There are no
|
||||||
|
* promises made about what frequency this function might run at. You should
|
||||||
|
* use SDL's timer functions if you need to see how much time has passed since
|
||||||
|
* the last iteration.
|
||||||
|
*
|
||||||
|
* There is no need to process the SDL event queue during this function; SDL
|
||||||
|
* will send events as they arrive in SDL_AppEvent, and in most cases the
|
||||||
|
* event queue will be empty when this function runs anyhow.
|
||||||
|
*
|
||||||
|
* This function should not go into an infinite mainloop; it should do one
|
||||||
|
* iteration of whatever the program does and return.
|
||||||
|
*
|
||||||
|
* The `appstate` parameter is an optional pointer provided by the app during
|
||||||
|
* SDL_AppInit(). If the app never provided a pointer, this will be NULL.
|
||||||
|
*
|
||||||
|
* If this function returns SDL_APP_CONTINUE, the app will continue normal
|
||||||
|
* operation, receiving repeated calls to SDL_AppIterate and SDL_AppEvent for
|
||||||
|
* the life of the program. If this function returns SDL_APP_FAILURE, SDL will
|
||||||
|
* call SDL_AppQuit and terminate the process with an exit code that reports
|
||||||
|
* an error to the platform. If it returns SDL_APP_SUCCESS, SDL calls
|
||||||
|
* SDL_AppQuit and terminates with an exit code that reports success to the
|
||||||
|
* platform.
|
||||||
|
*
|
||||||
|
* This function is called by SDL on the main thread.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \threadsafety This function may get called concurrently with SDL_AppEvent()
|
||||||
|
* for events not pushed on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AppInit
|
||||||
|
* \sa SDL_AppEvent
|
||||||
|
*/
|
||||||
|
extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppIterate(void *appstate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App-implemented event entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||||
|
*
|
||||||
|
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a
|
||||||
|
* standard "main" function, you should not supply this.
|
||||||
|
*
|
||||||
|
* This function is called as needed by SDL after SDL_AppInit returns
|
||||||
|
* SDL_APP_CONTINUE. It is called once for each new event.
|
||||||
|
*
|
||||||
|
* There is (currently) no guarantee about what thread this will be called
|
||||||
|
* from; whatever thread pushes an event onto SDL's queue will trigger this
|
||||||
|
* function. SDL is responsible for pumping the event queue between each call
|
||||||
|
* to SDL_AppIterate, so in normal operation one should only get events in a
|
||||||
|
* serial fashion, but be careful if you have a thread that explicitly calls
|
||||||
|
* SDL_PushEvent. SDL itself will push events to the queue on the main thread.
|
||||||
|
*
|
||||||
|
* Events sent to this function are not owned by the app; if you need to save
|
||||||
|
* the data, you should copy it.
|
||||||
|
*
|
||||||
|
* This function should not go into an infinite mainloop; it should handle the
|
||||||
|
* provided event appropriately and return.
|
||||||
|
*
|
||||||
|
* The `appstate` parameter is an optional pointer provided by the app during
|
||||||
|
* SDL_AppInit(). If the app never provided a pointer, this will be NULL.
|
||||||
|
*
|
||||||
|
* If this function returns SDL_APP_CONTINUE, the app will continue normal
|
||||||
|
* operation, receiving repeated calls to SDL_AppIterate and SDL_AppEvent for
|
||||||
|
* the life of the program. If this function returns SDL_APP_FAILURE, SDL will
|
||||||
|
* call SDL_AppQuit and terminate the process with an exit code that reports
|
||||||
|
* an error to the platform. If it returns SDL_APP_SUCCESS, SDL calls
|
||||||
|
* SDL_AppQuit and terminates with an exit code that reports success to the
|
||||||
|
* platform.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \param event the new event for the app to examine.
|
||||||
|
* \returns SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to
|
||||||
|
* terminate with success, SDL_APP_CONTINUE to continue.
|
||||||
|
*
|
||||||
|
* \threadsafety This function may get called concurrently with
|
||||||
|
* SDL_AppIterate() or SDL_AppQuit() for events not pushed from
|
||||||
|
* the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AppInit
|
||||||
|
* \sa SDL_AppIterate
|
||||||
|
*/
|
||||||
|
extern SDLMAIN_DECLSPEC SDL_AppResult SDLCALL SDL_AppEvent(void *appstate, SDL_Event *event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* App-implemented deinit entry point for SDL_MAIN_USE_CALLBACKS apps.
|
||||||
|
*
|
||||||
|
* Apps implement this function when using SDL_MAIN_USE_CALLBACKS. If using a
|
||||||
|
* standard "main" function, you should not supply this.
|
||||||
|
*
|
||||||
|
* This function is called once by SDL before terminating the program.
|
||||||
|
*
|
||||||
|
* This function will be called no matter what, even if SDL_AppInit requests
|
||||||
|
* termination.
|
||||||
|
*
|
||||||
|
* This function should not go into an infinite mainloop; it should
|
||||||
|
* deinitialize any resources necessary, perform whatever shutdown activities,
|
||||||
|
* and return.
|
||||||
|
*
|
||||||
|
* You do not need to call SDL_Quit() in this function, as SDL will call it
|
||||||
|
* after this function returns and before the process terminates, but it is
|
||||||
|
* safe to do so.
|
||||||
|
*
|
||||||
|
* The `appstate` parameter is an optional pointer provided by the app during
|
||||||
|
* SDL_AppInit(). If the app never provided a pointer, this will be NULL. This
|
||||||
|
* function call is the last time this pointer will be provided, so any
|
||||||
|
* resources to it should be cleaned up here.
|
||||||
|
*
|
||||||
|
* This function is called by SDL on the main thread.
|
||||||
|
*
|
||||||
|
* \param appstate an optional pointer, provided by the app in SDL_AppInit.
|
||||||
|
* \param result the result code that terminated the app (success or failure).
|
||||||
|
*
|
||||||
|
* \threadsafety SDL_AppEvent() may get called concurrently with this function
|
||||||
|
* if other threads that push events are still active.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_AppInit
|
||||||
|
*/
|
||||||
|
extern SDLMAIN_DECLSPEC void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result);
|
||||||
|
|
||||||
|
#endif /* SDL_MAIN_USE_CALLBACKS */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The prototype for the application's main() function
|
||||||
|
*
|
||||||
|
* \param argc an ANSI-C style main function's argc.
|
||||||
|
* \param argv an ANSI-C style main function's argv.
|
||||||
|
* \returns an ANSI-C main return code; generally 0 is considered successful
|
||||||
|
* program completion, and small non-zero values are considered
|
||||||
|
* errors.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef int (SDLCALL *SDL_main_func)(int argc, char *argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An app-supplied function for program entry.
|
||||||
|
*
|
||||||
|
* Apps do not directly create this function; they should create a standard
|
||||||
|
* ANSI-C `main` function instead. If SDL needs to insert some startup code
|
||||||
|
* before `main` runs, or the platform doesn't actually _use_ a function
|
||||||
|
* called "main", SDL will do some macro magic to redefine `main` to
|
||||||
|
* `SDL_main` and provide its own `main`.
|
||||||
|
*
|
||||||
|
* Apps should include `SDL_main.h` in the same file as their `main` function,
|
||||||
|
* and they should not use that symbol for anything else in that file, as it
|
||||||
|
* might get redefined.
|
||||||
|
*
|
||||||
|
* This function is only provided by the app if it isn't using
|
||||||
|
* SDL_MAIN_USE_CALLBACKS.
|
||||||
|
*
|
||||||
|
* Program startup is a surprisingly complex topic. Please see
|
||||||
|
* [README/main-functions](README/main-functions), (or
|
||||||
|
* docs/README-main-functions.md in the source tree) for a more detailed
|
||||||
|
* explanation.
|
||||||
|
*
|
||||||
|
* \param argc an ANSI-C style main function's argc.
|
||||||
|
* \param argv an ANSI-C style main function's argv.
|
||||||
|
* \returns an ANSI-C main return code; generally 0 is considered successful
|
||||||
|
* program completion, and small non-zero values are considered
|
||||||
|
* errors.
|
||||||
|
*
|
||||||
|
* \threadsafety This is the program entry point.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDLMAIN_DECLSPEC int SDLCALL SDL_main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Circumvent failure of SDL_Init() when not using SDL_main() as an entry
|
||||||
|
* point.
|
||||||
|
*
|
||||||
|
* This function is defined in SDL_main.h, along with the preprocessor rule to
|
||||||
|
* redefine main() as SDL_main(). Thus to ensure that your main() function
|
||||||
|
* will not be changed it is necessary to define SDL_MAIN_HANDLED before
|
||||||
|
* including SDL.h.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Init
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_SetMainReady(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes and launches an SDL application, by doing platform-specific
|
||||||
|
* initialization before calling your mainFunction and cleanups after it
|
||||||
|
* returns, if that is needed for a specific platform, otherwise it just calls
|
||||||
|
* mainFunction.
|
||||||
|
*
|
||||||
|
* You can use this if you want to use your own main() implementation without
|
||||||
|
* using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do
|
||||||
|
* *not* need SDL_SetMainReady().
|
||||||
|
*
|
||||||
|
* \param argc the argc parameter from the application's main() function, or 0
|
||||||
|
* if the platform's main-equivalent has no argc.
|
||||||
|
* \param argv the argv parameter from the application's main() function, or
|
||||||
|
* NULL if the platform's main-equivalent has no argv.
|
||||||
|
* \param mainFunction your SDL app's C-style main(). NOT the function you're
|
||||||
|
* calling this from! Its name doesn't matter; it doesn't
|
||||||
|
* literally have to be `main`.
|
||||||
|
* \param reserved should be NULL (reserved for future use, will probably be
|
||||||
|
* platform-specific then).
|
||||||
|
* \returns the return value from mainFunction: 0 on success, otherwise
|
||||||
|
* failure; SDL_GetError() might have more information on the
|
||||||
|
* failure.
|
||||||
|
*
|
||||||
|
* \threadsafety Generally this is called once, near startup, from the
|
||||||
|
* process's initial thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_RunApp(int argc, char *argv[], SDL_main_func mainFunction, void *reserved);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An entry point for SDL's use in SDL_MAIN_USE_CALLBACKS.
|
||||||
|
*
|
||||||
|
* Generally, you should not call this function directly. This only exists to
|
||||||
|
* hand off work into SDL as soon as possible, where it has a lot more control
|
||||||
|
* and functionality available, and make the inline code in SDL_main.h as
|
||||||
|
* small as possible.
|
||||||
|
*
|
||||||
|
* Not all platforms use this, it's actual use is hidden in a magic
|
||||||
|
* header-only library, and you should not call this directly unless you
|
||||||
|
* _really_ know what you're doing.
|
||||||
|
*
|
||||||
|
* \param argc standard Unix main argc.
|
||||||
|
* \param argv standard Unix main argv.
|
||||||
|
* \param appinit the application's SDL_AppInit function.
|
||||||
|
* \param appiter the application's SDL_AppIterate function.
|
||||||
|
* \param appevent the application's SDL_AppEvent function.
|
||||||
|
* \param appquit the application's SDL_AppQuit function.
|
||||||
|
* \returns standard Unix main return value.
|
||||||
|
*
|
||||||
|
* \threadsafety It is not safe to call this anywhere except as the only
|
||||||
|
* function call in SDL_main.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC int SDLCALL SDL_EnterAppMainCallbacks(int argc, char *argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(SDL_PLATFORM_WINDOWS)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a win32 window class for SDL's use.
|
||||||
|
*
|
||||||
|
* This can be called to set the application window class at startup. It is
|
||||||
|
* safe to call this multiple times, as long as every call is eventually
|
||||||
|
* paired with a call to SDL_UnregisterApp, but a second registration attempt
|
||||||
|
* while a previous registration is still active will be ignored, other than
|
||||||
|
* to increment a counter.
|
||||||
|
*
|
||||||
|
* Most applications do not need to, and should not, call this directly; SDL
|
||||||
|
* will call it when initializing the video subsystem.
|
||||||
|
*
|
||||||
|
* \param name the window class name, in UTF-8 encoding. If NULL, SDL
|
||||||
|
* currently uses "SDL_app" but this isn't guaranteed.
|
||||||
|
* \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL
|
||||||
|
* currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of
|
||||||
|
* what is specified here.
|
||||||
|
* \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL
|
||||||
|
* will use `GetModuleHandle(NULL)` instead.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deregister the win32 window class from an SDL_RegisterApp call.
|
||||||
|
*
|
||||||
|
* This can be called to undo the effects of SDL_RegisterApp.
|
||||||
|
*
|
||||||
|
* Most applications do not need to, and should not, call this directly; SDL
|
||||||
|
* will call it when deinitializing the video subsystem.
|
||||||
|
*
|
||||||
|
* It is safe to call this multiple times, as long as every call is eventually
|
||||||
|
* paired with a prior call to SDL_RegisterApp. The window class will only be
|
||||||
|
* deregistered when the registration counter in SDL_RegisterApp decrements to
|
||||||
|
* zero through calls to this function.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_UnregisterApp(void);
|
||||||
|
|
||||||
|
#endif /* defined(SDL_PLATFORM_WINDOWS) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback from the application to let the suspend continue.
|
||||||
|
*
|
||||||
|
* This function is only needed for Xbox GDK support; all other platforms will
|
||||||
|
* do nothing and set an "unsupported" error message.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendComplete(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
|
||||||
|
/* include header-only SDL_main implementations */
|
||||||
|
#if defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE)
|
||||||
|
/* platforms which main (-equivalent) can be implemented in plain C */
|
||||||
|
#include <SDL3/SDL_main_impl.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* SDL_main_h_ */
|
||||||
Vendored
+151
@@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* WIKI CATEGORY: Main */
|
||||||
|
|
||||||
|
#ifndef SDL_main_impl_h_
|
||||||
|
#define SDL_main_impl_h_
|
||||||
|
|
||||||
|
#ifndef SDL_main_h_
|
||||||
|
#error "This header should not be included directly, but only via SDL_main.h!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* if someone wants to include SDL_main.h but doesn't want the main handing magic,
|
||||||
|
(maybe to call SDL_RegisterApp()) they can #define SDL_MAIN_HANDLED first.
|
||||||
|
SDL_MAIN_NOIMPL is for SDL-internal usage (only affects implementation,
|
||||||
|
not definition of SDL_MAIN_AVAILABLE etc in SDL_main.h) and if the user wants
|
||||||
|
to have the SDL_main implementation (from this header) in another source file
|
||||||
|
than their main() function, for example if SDL_main requires C++
|
||||||
|
and main() is implemented in plain C */
|
||||||
|
#if !defined(SDL_MAIN_HANDLED) && !defined(SDL_MAIN_NOIMPL)
|
||||||
|
|
||||||
|
/* the implementations below must be able to use the implement real main(), nothing renamed
|
||||||
|
(the user's main() will be renamed to SDL_main so it can be called from here) */
|
||||||
|
#ifdef main
|
||||||
|
#undef main
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDL_MAIN_USE_CALLBACKS
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* currently there are no platforms that _need_ a magic entry point here
|
||||||
|
for callbacks, but if one shows up, implement it here. */
|
||||||
|
|
||||||
|
#else /* use a standard SDL_main, which the app SHOULD NOT ALSO SUPPLY. */
|
||||||
|
|
||||||
|
/* this define makes the normal SDL_main entry point stuff work...we just provide SDL_main() instead of the app. */
|
||||||
|
#define SDL_MAIN_CALLBACK_STANDARD 1
|
||||||
|
|
||||||
|
int SDL_main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
return SDL_EnterAppMainCallbacks(argc, argv, SDL_AppInit, SDL_AppIterate, SDL_AppEvent, SDL_AppQuit);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* platform-specific tests */
|
||||||
|
|
||||||
|
#endif /* SDL_MAIN_USE_CALLBACKS */
|
||||||
|
|
||||||
|
|
||||||
|
/* set up the usual SDL_main stuff if we're not using callbacks or if we are but need the normal entry point,
|
||||||
|
unless the real entry point needs to be somewhere else entirely, like Android where it's in Java code */
|
||||||
|
#if (!defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD)) && !defined(SDL_MAIN_EXPORTED)
|
||||||
|
|
||||||
|
#if defined(SDL_PLATFORM_PRIVATE_MAIN)
|
||||||
|
/* Private platforms may have their own ideas about entry points. */
|
||||||
|
#include "SDL_main_impl_private.h"
|
||||||
|
|
||||||
|
#elif defined(SDL_PLATFORM_WINDOWS)
|
||||||
|
|
||||||
|
/* these defines/typedefs are needed for the WinMain() definition */
|
||||||
|
#ifndef WINAPI
|
||||||
|
#define WINAPI __stdcall
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct HINSTANCE__ * HINSTANCE;
|
||||||
|
typedef char *LPSTR;
|
||||||
|
typedef wchar_t *PWSTR;
|
||||||
|
|
||||||
|
/* The VC++ compiler needs main/wmain defined, but not for GDK */
|
||||||
|
#if defined(_MSC_VER) && !defined(SDL_PLATFORM_GDK)
|
||||||
|
|
||||||
|
/* This is where execution begins [console apps] */
|
||||||
|
#if defined(UNICODE) && UNICODE
|
||||||
|
int wmain(int argc, wchar_t *wargv[], wchar_t *wenvp)
|
||||||
|
{
|
||||||
|
(void)argc;
|
||||||
|
(void)wargv;
|
||||||
|
(void)wenvp;
|
||||||
|
return SDL_RunApp(0, NULL, SDL_main, NULL);
|
||||||
|
}
|
||||||
|
#else /* ANSI */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
(void)argc;
|
||||||
|
(void)argv;
|
||||||
|
return SDL_RunApp(0, NULL, SDL_main, NULL);
|
||||||
|
}
|
||||||
|
#endif /* UNICODE */
|
||||||
|
|
||||||
|
#endif /* _MSC_VER && ! SDL_PLATFORM_GDK */
|
||||||
|
|
||||||
|
/* This is where execution begins [windowed apps and GDK] */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(UNICODE) && UNICODE
|
||||||
|
int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrev, PWSTR szCmdLine, int sw)
|
||||||
|
#else /* ANSI */
|
||||||
|
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
(void)hInst;
|
||||||
|
(void)hPrev;
|
||||||
|
(void)szCmdLine;
|
||||||
|
(void)sw;
|
||||||
|
return SDL_RunApp(0, NULL, SDL_main, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* end of SDL_PLATFORM_WINDOWS impls */
|
||||||
|
|
||||||
|
#else /* platforms that use a standard main() and just call SDL_RunApp(), like iOS and 3DS */
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return SDL_RunApp(argc, argv, SDL_main, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end of impls for standard-conforming platforms */
|
||||||
|
|
||||||
|
#endif /* SDL_PLATFORM_WIN32 etc */
|
||||||
|
|
||||||
|
#endif /* !defined(SDL_MAIN_USE_CALLBACKS) || defined(SDL_MAIN_CALLBACK_STANDARD) */
|
||||||
|
|
||||||
|
/* rename users main() function to SDL_main() so it can be called from the wrappers above */
|
||||||
|
#define main SDL_main
|
||||||
|
|
||||||
|
#endif /* SDL_MAIN_HANDLED */
|
||||||
|
|
||||||
|
#endif /* SDL_main_impl_h_ */
|
||||||
Vendored
+226
@@ -0,0 +1,226 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryMessagebox
|
||||||
|
*
|
||||||
|
* SDL offers a simple message box API, which is useful for simple alerts,
|
||||||
|
* such as informing the user when something fatal happens at startup without
|
||||||
|
* the need to build a UI for it (or informing the user _before_ your UI is
|
||||||
|
* ready).
|
||||||
|
*
|
||||||
|
* These message boxes are native system dialogs where possible.
|
||||||
|
*
|
||||||
|
* There is both a customizable function (SDL_ShowMessageBox()) that offers
|
||||||
|
* lots of options for what to display and reports on what choice the user
|
||||||
|
* made, and also a much-simplified version (SDL_ShowSimpleMessageBox()),
|
||||||
|
* merely takes a text message and title, and waits until the user presses a
|
||||||
|
* single "OK" UI button. Often, this is all that is necessary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_messagebox_h_
|
||||||
|
#define SDL_messagebox_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_video.h> /* For SDL_Window */
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Message box flags.
|
||||||
|
*
|
||||||
|
* If supported will display warning icon, etc.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_MessageBoxFlags;
|
||||||
|
|
||||||
|
#define SDL_MESSAGEBOX_ERROR 0x00000010u /**< error dialog */
|
||||||
|
#define SDL_MESSAGEBOX_WARNING 0x00000020u /**< warning dialog */
|
||||||
|
#define SDL_MESSAGEBOX_INFORMATION 0x00000040u /**< informational dialog */
|
||||||
|
#define SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT 0x00000080u /**< buttons placed left to right */
|
||||||
|
#define SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT 0x00000100u /**< buttons placed right to left */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SDL_MessageBoxButtonData flags.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_MessageBoxButtonFlags;
|
||||||
|
|
||||||
|
#define SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT 0x00000001u /**< Marks the default button when return is hit */
|
||||||
|
#define SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT 0x00000002u /**< Marks the default button when escape is hit */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Individual button data.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_MessageBoxButtonData
|
||||||
|
{
|
||||||
|
SDL_MessageBoxButtonFlags flags;
|
||||||
|
int buttonID; /**< User defined button id (value returned via SDL_ShowMessageBox) */
|
||||||
|
const char *text; /**< The UTF-8 button text */
|
||||||
|
} SDL_MessageBoxButtonData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RGB value used in a message box color scheme
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_MessageBoxColor
|
||||||
|
{
|
||||||
|
Uint8 r, g, b;
|
||||||
|
} SDL_MessageBoxColor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An enumeration of indices inside the colors array of
|
||||||
|
* SDL_MessageBoxColorScheme.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_MessageBoxColorType
|
||||||
|
{
|
||||||
|
SDL_MESSAGEBOX_COLOR_BACKGROUND,
|
||||||
|
SDL_MESSAGEBOX_COLOR_TEXT,
|
||||||
|
SDL_MESSAGEBOX_COLOR_BUTTON_BORDER,
|
||||||
|
SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,
|
||||||
|
SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,
|
||||||
|
SDL_MESSAGEBOX_COLOR_COUNT /**< Size of the colors array of SDL_MessageBoxColorScheme. */
|
||||||
|
} SDL_MessageBoxColorType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A set of colors to use for message box dialogs
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_MessageBoxColorScheme
|
||||||
|
{
|
||||||
|
SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_COUNT];
|
||||||
|
} SDL_MessageBoxColorScheme;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MessageBox structure containing title, text, window, etc.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_MessageBoxData
|
||||||
|
{
|
||||||
|
SDL_MessageBoxFlags flags;
|
||||||
|
SDL_Window *window; /**< Parent window, can be NULL */
|
||||||
|
const char *title; /**< UTF-8 title */
|
||||||
|
const char *message; /**< UTF-8 message text */
|
||||||
|
|
||||||
|
int numbuttons;
|
||||||
|
const SDL_MessageBoxButtonData *buttons;
|
||||||
|
|
||||||
|
const SDL_MessageBoxColorScheme *colorScheme; /**< SDL_MessageBoxColorScheme, can be NULL to use system settings */
|
||||||
|
} SDL_MessageBoxData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a modal message box.
|
||||||
|
*
|
||||||
|
* If your needs aren't complex, it might be easier to use
|
||||||
|
* SDL_ShowSimpleMessageBox.
|
||||||
|
*
|
||||||
|
* This function should be called on the thread that created the parent
|
||||||
|
* window, or on the main thread if the messagebox has no parent. It will
|
||||||
|
* block execution of that thread until the user clicks a button or closes the
|
||||||
|
* messagebox.
|
||||||
|
*
|
||||||
|
* This function may be called at any time, even before SDL_Init(). This makes
|
||||||
|
* it useful for reporting errors like a failure to create a renderer or
|
||||||
|
* OpenGL context.
|
||||||
|
*
|
||||||
|
* On X11, SDL rolls its own dialog box with X11 primitives instead of a
|
||||||
|
* formal toolkit like GTK+ or Qt.
|
||||||
|
*
|
||||||
|
* Note that if SDL_Init() would fail because there isn't any available video
|
||||||
|
* target, this function is likely to fail for the same reasons. If this is a
|
||||||
|
* concern, check the return value from this function and fall back to writing
|
||||||
|
* to stderr if you can.
|
||||||
|
*
|
||||||
|
* \param messageboxdata the SDL_MessageBoxData structure with title, text and
|
||||||
|
* other options.
|
||||||
|
* \param buttonid the pointer to which user id of hit button should be
|
||||||
|
* copied.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ShowSimpleMessageBox
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display a simple modal message box.
|
||||||
|
*
|
||||||
|
* If your needs aren't complex, this function is preferred over
|
||||||
|
* SDL_ShowMessageBox.
|
||||||
|
*
|
||||||
|
* `flags` may be any of the following:
|
||||||
|
*
|
||||||
|
* - `SDL_MESSAGEBOX_ERROR`: error dialog
|
||||||
|
* - `SDL_MESSAGEBOX_WARNING`: warning dialog
|
||||||
|
* - `SDL_MESSAGEBOX_INFORMATION`: informational dialog
|
||||||
|
*
|
||||||
|
* This function should be called on the thread that created the parent
|
||||||
|
* window, or on the main thread if the messagebox has no parent. It will
|
||||||
|
* block execution of that thread until the user clicks a button or closes the
|
||||||
|
* messagebox.
|
||||||
|
*
|
||||||
|
* This function may be called at any time, even before SDL_Init(). This makes
|
||||||
|
* it useful for reporting errors like a failure to create a renderer or
|
||||||
|
* OpenGL context.
|
||||||
|
*
|
||||||
|
* On X11, SDL rolls its own dialog box with X11 primitives instead of a
|
||||||
|
* formal toolkit like GTK+ or Qt.
|
||||||
|
*
|
||||||
|
* Note that if SDL_Init() would fail because there isn't any available video
|
||||||
|
* target, this function is likely to fail for the same reasons. If this is a
|
||||||
|
* concern, check the return value from this function and fall back to writing
|
||||||
|
* to stderr if you can.
|
||||||
|
*
|
||||||
|
* \param flags an SDL_MessageBoxFlags value.
|
||||||
|
* \param title UTF-8 title text.
|
||||||
|
* \param message UTF-8 message text.
|
||||||
|
* \param window the parent window, or NULL for no parent.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_ShowMessageBox
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags flags, const char *title, const char *message, SDL_Window *window);
|
||||||
|
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_messagebox_h_ */
|
||||||
Vendored
+107
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryMetal
|
||||||
|
*
|
||||||
|
* Functions to creating Metal layers and views on SDL windows.
|
||||||
|
*
|
||||||
|
* This provides some platform-specific glue for Apple platforms. Most macOS
|
||||||
|
* and iOS apps can use SDL without these functions, but this API they can be
|
||||||
|
* useful for specific OS-level integration tasks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_metal_h_
|
||||||
|
#define SDL_metal_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_video.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS).
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef void *SDL_MetalView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name Metal support functions
|
||||||
|
*/
|
||||||
|
/* @{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a CAMetalLayer-backed NSView/UIView and attach it to the specified
|
||||||
|
* window.
|
||||||
|
*
|
||||||
|
* On macOS, this does *not* associate a MTLDevice with the CAMetalLayer on
|
||||||
|
* its own. It is up to user code to do that.
|
||||||
|
*
|
||||||
|
* The returned handle can be casted directly to a NSView or UIView. To access
|
||||||
|
* the backing CAMetalLayer, call SDL_Metal_GetLayer().
|
||||||
|
*
|
||||||
|
* \param window the window.
|
||||||
|
* \returns handle NSView or UIView.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Metal_DestroyView
|
||||||
|
* \sa SDL_Metal_GetLayer
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy an existing SDL_MetalView object.
|
||||||
|
*
|
||||||
|
* This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was
|
||||||
|
* called after SDL_CreateWindow.
|
||||||
|
*
|
||||||
|
* \param view the SDL_MetalView object.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_Metal_CreateView
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a pointer to the backing CAMetalLayer for the given view.
|
||||||
|
*
|
||||||
|
* \param view the SDL_MetalView object.
|
||||||
|
* \returns a pointer.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void * SDLCALL SDL_Metal_GetLayer(SDL_MetalView view);
|
||||||
|
|
||||||
|
/* @} *//* Metal support functions */
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_metal_h_ */
|
||||||
Vendored
+78
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryMisc
|
||||||
|
*
|
||||||
|
* SDL API functions that don't fit elsewhere.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_misc_h_
|
||||||
|
#define SDL_misc_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open a URL/URI in the browser or other appropriate external application.
|
||||||
|
*
|
||||||
|
* Open a URL in a separate, system-provided application. How this works will
|
||||||
|
* vary wildly depending on the platform. This will likely launch what makes
|
||||||
|
* sense to handle a specific URL's protocol (a web browser for `http://`,
|
||||||
|
* etc), but it might also be able to launch file managers for directories and
|
||||||
|
* other things.
|
||||||
|
*
|
||||||
|
* What happens when you open a URL varies wildly as well: your game window
|
||||||
|
* may lose focus (and may or may not lose focus if your game was fullscreen
|
||||||
|
* or grabbing input at the time). On mobile devices, your app will likely
|
||||||
|
* move to the background or your process might be paused. Any given platform
|
||||||
|
* may or may not handle a given URL.
|
||||||
|
*
|
||||||
|
* If this is unimplemented (or simply unavailable) for a platform, this will
|
||||||
|
* fail with an error. A successful result does not mean the URL loaded, just
|
||||||
|
* that we launched _something_ to handle it (or at least believe we did).
|
||||||
|
*
|
||||||
|
* All this to say: this function can be useful, but you should definitely
|
||||||
|
* test it on every platform you target.
|
||||||
|
*
|
||||||
|
* \param url a valid URL/URI to open. Use `file:///full/path/to/file` for
|
||||||
|
* local files, if supported.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_OpenURL(const char *url);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_misc_h_ */
|
||||||
Vendored
+689
@@ -0,0 +1,689 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* # CategoryMouse
|
||||||
|
*
|
||||||
|
* Any GUI application has to deal with the mouse, and SDL provides functions
|
||||||
|
* to manage mouse input and the displayed cursor.
|
||||||
|
*
|
||||||
|
* Most interactions with the mouse will come through the event subsystem.
|
||||||
|
* Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button
|
||||||
|
* generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the
|
||||||
|
* current state of the mouse at any time with SDL_GetMouseState().
|
||||||
|
*
|
||||||
|
* For certain games, it's useful to disassociate the mouse cursor from mouse
|
||||||
|
* input. An FPS, for example, would not want the player's motion to stop as
|
||||||
|
* the mouse hits the edge of the window. For these scenarios, use
|
||||||
|
* SDL_SetWindowRelativeMouseMode(), which hides the cursor, grabs mouse input
|
||||||
|
* to the window, and reads mouse input no matter how far it moves.
|
||||||
|
*
|
||||||
|
* Games that want the system to track the mouse but want to draw their own
|
||||||
|
* cursor can use SDL_HideCursor() and SDL_ShowCursor(). It might be more
|
||||||
|
* efficient to let the system manage the cursor, if possible, using
|
||||||
|
* SDL_SetCursor() with a custom image made through SDL_CreateColorCursor(),
|
||||||
|
* or perhaps just a specific system cursor from SDL_CreateSystemCursor().
|
||||||
|
*
|
||||||
|
* SDL can, on many platforms, differentiate between multiple connected mice,
|
||||||
|
* allowing for interesting input scenarios and multiplayer games. They can be
|
||||||
|
* enumerated with SDL_GetMice(), and SDL will send SDL_EVENT_MOUSE_ADDED and
|
||||||
|
* SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged.
|
||||||
|
*
|
||||||
|
* Since many apps only care about basic mouse input, SDL offers a virtual
|
||||||
|
* mouse device for touch and pen input, which often can make a desktop
|
||||||
|
* application work on a touchscreen phone without any code changes. Apps that
|
||||||
|
* care about touch/pen separately from mouse input should filter out events
|
||||||
|
* with a `which` field of SDL_TOUCH_MOUSEID/SDL_PEN_MOUSEID.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SDL_mouse_h_
|
||||||
|
#define SDL_mouse_h_
|
||||||
|
|
||||||
|
#include <SDL3/SDL_stdinc.h>
|
||||||
|
#include <SDL3/SDL_error.h>
|
||||||
|
#include <SDL3/SDL_surface.h>
|
||||||
|
#include <SDL3/SDL_video.h>
|
||||||
|
|
||||||
|
#include <SDL3/SDL_begin_code.h>
|
||||||
|
/* Set up for C function definitions, even when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a unique ID for a mouse for the time it is connected to the system,
|
||||||
|
* and is never reused for the lifetime of the application.
|
||||||
|
*
|
||||||
|
* If the mouse is disconnected and reconnected, it will get a new ID.
|
||||||
|
*
|
||||||
|
* The value 0 is an invalid ID.
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_MouseID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The structure used to identify an SDL cursor.
|
||||||
|
*
|
||||||
|
* This is opaque data.
|
||||||
|
*
|
||||||
|
* \since This struct is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef struct SDL_Cursor SDL_Cursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cursor types for SDL_CreateSystemCursor().
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_SystemCursor
|
||||||
|
{
|
||||||
|
SDL_SYSTEM_CURSOR_DEFAULT, /**< Default cursor. Usually an arrow. */
|
||||||
|
SDL_SYSTEM_CURSOR_TEXT, /**< Text selection. Usually an I-beam. */
|
||||||
|
SDL_SYSTEM_CURSOR_WAIT, /**< Wait. Usually an hourglass or watch or spinning ball. */
|
||||||
|
SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair. */
|
||||||
|
SDL_SYSTEM_CURSOR_PROGRESS, /**< Program is busy but still interactive. Usually it's WAIT with an arrow. */
|
||||||
|
SDL_SYSTEM_CURSOR_NWSE_RESIZE, /**< Double arrow pointing northwest and southeast. */
|
||||||
|
SDL_SYSTEM_CURSOR_NESW_RESIZE, /**< Double arrow pointing northeast and southwest. */
|
||||||
|
SDL_SYSTEM_CURSOR_EW_RESIZE, /**< Double arrow pointing west and east. */
|
||||||
|
SDL_SYSTEM_CURSOR_NS_RESIZE, /**< Double arrow pointing north and south. */
|
||||||
|
SDL_SYSTEM_CURSOR_MOVE, /**< Four pointed arrow pointing north, south, east, and west. */
|
||||||
|
SDL_SYSTEM_CURSOR_NOT_ALLOWED, /**< Not permitted. Usually a slashed circle or crossbones. */
|
||||||
|
SDL_SYSTEM_CURSOR_POINTER, /**< Pointer that indicates a link. Usually a pointing hand. */
|
||||||
|
SDL_SYSTEM_CURSOR_NW_RESIZE, /**< Window resize top-left. This may be a single arrow or a double arrow like NWSE_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_N_RESIZE, /**< Window resize top. May be NS_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_NE_RESIZE, /**< Window resize top-right. May be NESW_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_E_RESIZE, /**< Window resize right. May be EW_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_SE_RESIZE, /**< Window resize bottom-right. May be NWSE_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_S_RESIZE, /**< Window resize bottom. May be NS_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_SW_RESIZE, /**< Window resize bottom-left. May be NESW_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_W_RESIZE, /**< Window resize left. May be EW_RESIZE. */
|
||||||
|
SDL_SYSTEM_CURSOR_COUNT
|
||||||
|
} SDL_SystemCursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scroll direction types for the Scroll event
|
||||||
|
*
|
||||||
|
* \since This enum is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
typedef enum SDL_MouseWheelDirection
|
||||||
|
{
|
||||||
|
SDL_MOUSEWHEEL_NORMAL, /**< The scroll direction is normal */
|
||||||
|
SDL_MOUSEWHEEL_FLIPPED /**< The scroll direction is flipped / natural */
|
||||||
|
} SDL_MouseWheelDirection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A bitmask of pressed mouse buttons, as reported by SDL_GetMouseState, etc.
|
||||||
|
*
|
||||||
|
* - Button 1: Left mouse button
|
||||||
|
* - Button 2: Middle mouse button
|
||||||
|
* - Button 3: Right mouse button
|
||||||
|
* - Button 4: Side mouse button 1
|
||||||
|
* - Button 5: Side mouse button 2
|
||||||
|
*
|
||||||
|
* \since This datatype is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetMouseState
|
||||||
|
* \sa SDL_GetGlobalMouseState
|
||||||
|
* \sa SDL_GetRelativeMouseState
|
||||||
|
*/
|
||||||
|
typedef Uint32 SDL_MouseButtonFlags;
|
||||||
|
|
||||||
|
#define SDL_BUTTON_LEFT 1
|
||||||
|
#define SDL_BUTTON_MIDDLE 2
|
||||||
|
#define SDL_BUTTON_RIGHT 3
|
||||||
|
#define SDL_BUTTON_X1 4
|
||||||
|
#define SDL_BUTTON_X2 5
|
||||||
|
|
||||||
|
#define SDL_BUTTON_MASK(X) (1u << ((X)-1))
|
||||||
|
#define SDL_BUTTON_LMASK SDL_BUTTON_MASK(SDL_BUTTON_LEFT)
|
||||||
|
#define SDL_BUTTON_MMASK SDL_BUTTON_MASK(SDL_BUTTON_MIDDLE)
|
||||||
|
#define SDL_BUTTON_RMASK SDL_BUTTON_MASK(SDL_BUTTON_RIGHT)
|
||||||
|
#define SDL_BUTTON_X1MASK SDL_BUTTON_MASK(SDL_BUTTON_X1)
|
||||||
|
#define SDL_BUTTON_X2MASK SDL_BUTTON_MASK(SDL_BUTTON_X2)
|
||||||
|
|
||||||
|
|
||||||
|
/* Function prototypes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether a mouse is currently connected.
|
||||||
|
*
|
||||||
|
* \returns true if a mouse is connected, false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetMice
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HasMouse(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of currently connected mice.
|
||||||
|
*
|
||||||
|
* Note that this will include any device or virtual driver that includes
|
||||||
|
* mouse functionality, including some game controllers, KVM switches, etc.
|
||||||
|
* You should wait for input from a device before you consider it actively in
|
||||||
|
* use.
|
||||||
|
*
|
||||||
|
* \param count a pointer filled in with the number of mice returned, may be
|
||||||
|
* NULL.
|
||||||
|
* \returns a 0 terminated array of mouse instance IDs or NULL on failure;
|
||||||
|
* call SDL_GetError() for more information. This should be freed
|
||||||
|
* with SDL_free() when it is no longer needed.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetMouseNameForID
|
||||||
|
* \sa SDL_HasMouse
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_MouseID * SDLCALL SDL_GetMice(int *count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of a mouse.
|
||||||
|
*
|
||||||
|
* This function returns "" if the mouse doesn't have a name.
|
||||||
|
*
|
||||||
|
* \param instance_id the mouse instance ID.
|
||||||
|
* \returns the name of the selected mouse, or NULL on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetMice
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC const char * SDLCALL SDL_GetMouseNameForID(SDL_MouseID instance_id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the window which currently has mouse focus.
|
||||||
|
*
|
||||||
|
* \returns the window with mouse focus.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query SDL's cache for the synchronous mouse button state and the
|
||||||
|
* window-relative SDL-cursor position.
|
||||||
|
*
|
||||||
|
* This function returns the cached synchronous state as SDL understands it
|
||||||
|
* from the last pump of the event queue.
|
||||||
|
*
|
||||||
|
* To query the platform for immediate asynchronous state, use
|
||||||
|
* SDL_GetGlobalMouseState.
|
||||||
|
*
|
||||||
|
* Passing non-NULL pointers to `x` or `y` will write the destination with
|
||||||
|
* respective x or y coordinates relative to the focused window.
|
||||||
|
*
|
||||||
|
* In Relative Mode, the SDL-cursor's position usually contradicts the
|
||||||
|
* platform-cursor's position as manually calculated from
|
||||||
|
* SDL_GetGlobalMouseState() and SDL_GetWindowPosition.
|
||||||
|
*
|
||||||
|
* \param x a pointer to receive the SDL-cursor's x-position from the focused
|
||||||
|
* window's top left corner, can be NULL if unused.
|
||||||
|
* \param y a pointer to receive the SDL-cursor's y-position from the focused
|
||||||
|
* window's top left corner, can be NULL if unused.
|
||||||
|
* \returns a 32-bit bitmask of the button state that can be bitwise-compared
|
||||||
|
* against the SDL_BUTTON_MASK(X) macro.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetGlobalMouseState
|
||||||
|
* \sa SDL_GetRelativeMouseState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetMouseState(float *x, float *y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the platform for the asynchronous mouse button state and the
|
||||||
|
* desktop-relative platform-cursor position.
|
||||||
|
*
|
||||||
|
* This function immediately queries the platform for the most recent
|
||||||
|
* asynchronous state, more costly than retrieving SDL's cached state in
|
||||||
|
* SDL_GetMouseState().
|
||||||
|
*
|
||||||
|
* Passing non-NULL pointers to `x` or `y` will write the destination with
|
||||||
|
* respective x or y coordinates relative to the desktop.
|
||||||
|
*
|
||||||
|
* In Relative Mode, the platform-cursor's position usually contradicts the
|
||||||
|
* SDL-cursor's position as manually calculated from SDL_GetMouseState() and
|
||||||
|
* SDL_GetWindowPosition.
|
||||||
|
*
|
||||||
|
* This function can be useful if you need to track the mouse outside of a
|
||||||
|
* specific window and SDL_CaptureMouse() doesn't fit your needs. For example,
|
||||||
|
* it could be useful if you need to track the mouse while dragging a window,
|
||||||
|
* where coordinates relative to a window might not be in sync at all times.
|
||||||
|
*
|
||||||
|
* \param x a pointer to receive the platform-cursor's x-position from the
|
||||||
|
* desktop's top left corner, can be NULL if unused.
|
||||||
|
* \param y a pointer to receive the platform-cursor's y-position from the
|
||||||
|
* desktop's top left corner, can be NULL if unused.
|
||||||
|
* \returns a 32-bit bitmask of the button state that can be bitwise-compared
|
||||||
|
* against the SDL_BUTTON_MASK(X) macro.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CaptureMouse
|
||||||
|
* \sa SDL_GetMouseState
|
||||||
|
* \sa SDL_GetGlobalMouseState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetGlobalMouseState(float *x, float *y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query SDL's cache for the synchronous mouse button state and accumulated
|
||||||
|
* mouse delta since last call.
|
||||||
|
*
|
||||||
|
* This function returns the cached synchronous state as SDL understands it
|
||||||
|
* from the last pump of the event queue.
|
||||||
|
*
|
||||||
|
* To query the platform for immediate asynchronous state, use
|
||||||
|
* SDL_GetGlobalMouseState.
|
||||||
|
*
|
||||||
|
* Passing non-NULL pointers to `x` or `y` will write the destination with
|
||||||
|
* respective x or y deltas accumulated since the last call to this function
|
||||||
|
* (or since event initialization).
|
||||||
|
*
|
||||||
|
* This function is useful for reducing overhead by processing relative mouse
|
||||||
|
* inputs in one go per-frame instead of individually per-event, at the
|
||||||
|
* expense of losing the order between events within the frame (e.g. quickly
|
||||||
|
* pressing and releasing a button within the same frame).
|
||||||
|
*
|
||||||
|
* \param x a pointer to receive the x mouse delta accumulated since last
|
||||||
|
* call, can be NULL if unused.
|
||||||
|
* \param y a pointer to receive the y mouse delta accumulated since last
|
||||||
|
* call, can be NULL if unused.
|
||||||
|
* \returns a 32-bit bitmask of the button state that can be bitwise-compared
|
||||||
|
* against the SDL_BUTTON_MASK(X) macro.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetMouseState
|
||||||
|
* \sa SDL_GetGlobalMouseState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_MouseButtonFlags SDLCALL SDL_GetRelativeMouseState(float *x, float *y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move the mouse cursor to the given position within the window.
|
||||||
|
*
|
||||||
|
* This function generates a mouse motion event if relative mode is not
|
||||||
|
* enabled. If relative mode is enabled, you can force mouse events for the
|
||||||
|
* warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
|
||||||
|
*
|
||||||
|
* Note that this function will appear to succeed, but not actually move the
|
||||||
|
* mouse when used over Microsoft Remote Desktop.
|
||||||
|
*
|
||||||
|
* \param window the window to move the mouse into, or NULL for the current
|
||||||
|
* mouse focus.
|
||||||
|
* \param x the x coordinate within the window.
|
||||||
|
* \param y the y coordinate within the window.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_WarpMouseGlobal
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window,
|
||||||
|
float x, float y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move the mouse to the given position in global screen space.
|
||||||
|
*
|
||||||
|
* This function generates a mouse motion event.
|
||||||
|
*
|
||||||
|
* A failure of this function usually means that it is unsupported by a
|
||||||
|
* platform.
|
||||||
|
*
|
||||||
|
* Note that this function will appear to succeed, but not actually move the
|
||||||
|
* mouse when used over Microsoft Remote Desktop.
|
||||||
|
*
|
||||||
|
* \param x the x coordinate.
|
||||||
|
* \param y the y coordinate.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_WarpMouseInWindow
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_WarpMouseGlobal(float x, float y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set relative mouse mode for a window.
|
||||||
|
*
|
||||||
|
* While the window has focus and relative mouse mode is enabled, the cursor
|
||||||
|
* is hidden, the mouse position is constrained to the window, and SDL will
|
||||||
|
* report continuous relative mouse motion even if the mouse is at the edge of
|
||||||
|
* the window.
|
||||||
|
*
|
||||||
|
* If you'd like to keep the mouse position fixed while in relative mode you
|
||||||
|
* can use SDL_SetWindowMouseRect(). If you'd like the cursor to be at a
|
||||||
|
* specific location when relative mode ends, you should use
|
||||||
|
* SDL_WarpMouseInWindow() before disabling relative mode.
|
||||||
|
*
|
||||||
|
* This function will flush any pending mouse motion for this window.
|
||||||
|
*
|
||||||
|
* \param window the window to change.
|
||||||
|
* \param enabled true to enable relative mode, false to disable.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetWindowRelativeMouseMode
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetWindowRelativeMouseMode(SDL_Window *window, bool enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query whether relative mouse mode is enabled for a window.
|
||||||
|
*
|
||||||
|
* \param window the window to query.
|
||||||
|
* \returns true if relative mode is enabled for a window or false otherwise.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetWindowRelativeMouseMode
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_GetWindowRelativeMouseMode(SDL_Window *window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Capture the mouse and to track input outside an SDL window.
|
||||||
|
*
|
||||||
|
* Capturing enables your app to obtain mouse events globally, instead of just
|
||||||
|
* within your window. Not all video targets support this function. When
|
||||||
|
* capturing is enabled, the current window will get all mouse events, but
|
||||||
|
* unlike relative mode, no change is made to the cursor and it is not
|
||||||
|
* restrained to your window.
|
||||||
|
*
|
||||||
|
* This function may also deny mouse input to other windows--both those in
|
||||||
|
* your application and others on the system--so you should use this function
|
||||||
|
* sparingly, and in small bursts. For example, you might want to track the
|
||||||
|
* mouse while the user is dragging something, until the user releases a mouse
|
||||||
|
* button. It is not recommended that you capture the mouse for long periods
|
||||||
|
* of time, such as the entire time your app is running. For that, you should
|
||||||
|
* probably use SDL_SetWindowRelativeMouseMode() or SDL_SetWindowMouseGrab(),
|
||||||
|
* depending on your goals.
|
||||||
|
*
|
||||||
|
* While captured, mouse events still report coordinates relative to the
|
||||||
|
* current (foreground) window, but those coordinates may be outside the
|
||||||
|
* bounds of the window (including negative values). Capturing is only allowed
|
||||||
|
* for the foreground window. If the window loses focus while capturing, the
|
||||||
|
* capture will be disabled automatically.
|
||||||
|
*
|
||||||
|
* While capturing is enabled, the current window will have the
|
||||||
|
* `SDL_WINDOW_MOUSE_CAPTURE` flag set.
|
||||||
|
*
|
||||||
|
* Please note that SDL will attempt to "auto capture" the mouse while the
|
||||||
|
* user is pressing a button; this is to try and make mouse behavior more
|
||||||
|
* consistent between platforms, and deal with the common case of a user
|
||||||
|
* dragging the mouse outside of the window. This means that if you are
|
||||||
|
* calling SDL_CaptureMouse() only to deal with this situation, you do not
|
||||||
|
* have to (although it is safe to do so). If this causes problems for your
|
||||||
|
* app, you can disable auto capture by setting the
|
||||||
|
* `SDL_HINT_MOUSE_AUTO_CAPTURE` hint to zero.
|
||||||
|
*
|
||||||
|
* \param enabled true to enable capturing, false to disable.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetGlobalMouseState
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CaptureMouse(bool enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a cursor using the specified bitmap data and mask (in MSB format).
|
||||||
|
*
|
||||||
|
* `mask` has to be in MSB (Most Significant Bit) format.
|
||||||
|
*
|
||||||
|
* The cursor width (`w`) must be a multiple of 8 bits.
|
||||||
|
*
|
||||||
|
* The cursor is created in black and white according to the following:
|
||||||
|
*
|
||||||
|
* - data=0, mask=1: white
|
||||||
|
* - data=1, mask=1: black
|
||||||
|
* - data=0, mask=0: transparent
|
||||||
|
* - data=1, mask=0: inverted color if possible, black if not.
|
||||||
|
*
|
||||||
|
* Cursors created with this function must be freed with SDL_DestroyCursor().
|
||||||
|
*
|
||||||
|
* If you want to have a color cursor, or create your cursor from an
|
||||||
|
* SDL_Surface, you should use SDL_CreateColorCursor(). Alternately, you can
|
||||||
|
* hide the cursor and draw your own as part of your game's rendering, but it
|
||||||
|
* will be bound to the framerate.
|
||||||
|
*
|
||||||
|
* Also, SDL_CreateSystemCursor() is available, which provides several
|
||||||
|
* readily-available system cursors to pick from.
|
||||||
|
*
|
||||||
|
* \param data the color value for each pixel of the cursor.
|
||||||
|
* \param mask the mask value for each pixel of the cursor.
|
||||||
|
* \param w the width of the cursor.
|
||||||
|
* \param h the height of the cursor.
|
||||||
|
* \param hot_x the x-axis offset from the left of the cursor image to the
|
||||||
|
* mouse x position, in the range of 0 to `w` - 1.
|
||||||
|
* \param hot_y the y-axis offset from the top of the cursor image to the
|
||||||
|
* mouse y position, in the range of 0 to `h` - 1.
|
||||||
|
* \returns a new cursor with the specified parameters on success or NULL on
|
||||||
|
* failure; call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CreateColorCursor
|
||||||
|
* \sa SDL_CreateSystemCursor
|
||||||
|
* \sa SDL_DestroyCursor
|
||||||
|
* \sa SDL_SetCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateCursor(const Uint8 * data,
|
||||||
|
const Uint8 * mask,
|
||||||
|
int w, int h, int hot_x,
|
||||||
|
int hot_y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a color cursor.
|
||||||
|
*
|
||||||
|
* If this function is passed a surface with alternate representations, the
|
||||||
|
* surface will be interpreted as the content to be used for 100% display
|
||||||
|
* scale, and the alternate representations will be used for high DPI
|
||||||
|
* situations. For example, if the original surface is 32x32, then on a 2x
|
||||||
|
* macOS display or 200% display scale on Windows, a 64x64 version of the
|
||||||
|
* image will be used, if available. If a matching version of the image isn't
|
||||||
|
* available, the closest larger size image will be downscaled to the
|
||||||
|
* appropriate size and be used instead, if available. Otherwise, the closest
|
||||||
|
* smaller image will be upscaled and be used instead.
|
||||||
|
*
|
||||||
|
* \param surface an SDL_Surface structure representing the cursor image.
|
||||||
|
* \param hot_x the x position of the cursor hot spot.
|
||||||
|
* \param hot_y the y position of the cursor hot spot.
|
||||||
|
* \returns the new cursor on success or NULL on failure; call SDL_GetError()
|
||||||
|
* for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CreateCursor
|
||||||
|
* \sa SDL_CreateSystemCursor
|
||||||
|
* \sa SDL_DestroyCursor
|
||||||
|
* \sa SDL_SetCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateColorCursor(SDL_Surface *surface,
|
||||||
|
int hot_x,
|
||||||
|
int hot_y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a system cursor.
|
||||||
|
*
|
||||||
|
* \param id an SDL_SystemCursor enum value.
|
||||||
|
* \returns a cursor on success or NULL on failure; call SDL_GetError() for
|
||||||
|
* more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_DestroyCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the active cursor.
|
||||||
|
*
|
||||||
|
* This function sets the currently active cursor to the specified one. If the
|
||||||
|
* cursor is currently visible, the change will be immediately represented on
|
||||||
|
* the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if
|
||||||
|
* this is desired for any reason.
|
||||||
|
*
|
||||||
|
* \param cursor a cursor to make active.
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_GetCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_SetCursor(SDL_Cursor *cursor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the active cursor.
|
||||||
|
*
|
||||||
|
* This function returns a pointer to the current cursor which is owned by the
|
||||||
|
* library. It is not necessary to free the cursor with SDL_DestroyCursor().
|
||||||
|
*
|
||||||
|
* \returns the active cursor or NULL if there is no mouse.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_SetCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetCursor(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the default cursor.
|
||||||
|
*
|
||||||
|
* You do not have to call SDL_DestroyCursor() on the return value, but it is
|
||||||
|
* safe to do so.
|
||||||
|
*
|
||||||
|
* \returns the default cursor on success or NULL on failuree; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC SDL_Cursor * SDLCALL SDL_GetDefaultCursor(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a previously-created cursor.
|
||||||
|
*
|
||||||
|
* Use this function to free cursor resources created with SDL_CreateCursor(),
|
||||||
|
* SDL_CreateColorCursor() or SDL_CreateSystemCursor().
|
||||||
|
*
|
||||||
|
* \param cursor the cursor to free.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CreateColorCursor
|
||||||
|
* \sa SDL_CreateCursor
|
||||||
|
* \sa SDL_CreateSystemCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC void SDLCALL SDL_DestroyCursor(SDL_Cursor *cursor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the cursor.
|
||||||
|
*
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CursorVisible
|
||||||
|
* \sa SDL_HideCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_ShowCursor(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the cursor.
|
||||||
|
*
|
||||||
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_CursorVisible
|
||||||
|
* \sa SDL_ShowCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_HideCursor(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether the cursor is currently being shown.
|
||||||
|
*
|
||||||
|
* \returns `true` if the cursor is being shown, or `false` if the cursor is
|
||||||
|
* hidden.
|
||||||
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 3.2.0.
|
||||||
|
*
|
||||||
|
* \sa SDL_HideCursor
|
||||||
|
* \sa SDL_ShowCursor
|
||||||
|
*/
|
||||||
|
extern SDL_DECLSPEC bool SDLCALL SDL_CursorVisible(void);
|
||||||
|
|
||||||
|
/* Ends C function definitions when using C++ */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#include <SDL3/SDL_close_code.h>
|
||||||
|
|
||||||
|
#endif /* SDL_mouse_h_ */
|
||||||
Vendored
+1073
File diff suppressed because it is too large
Load Diff
Vendored
+1327
File diff suppressed because it is too large
Load Diff
Vendored
+3101
File diff suppressed because it is too large
Load Diff
+13213
File diff suppressed because it is too large
Load Diff
Vendored
+38
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a simple file to encapsulate the OpenGL ES 1.X API headers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SDL3/SDL_platform_defines.h>
|
||||||
|
|
||||||
|
#ifdef SDL_PLATFORM_IOS
|
||||||
|
#include <OpenGLES/ES1/gl.h>
|
||||||
|
#include <OpenGLES/ES1/glext.h>
|
||||||
|
#else
|
||||||
|
#include <GLES/gl.h>
|
||||||
|
#include <GLES/glext.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef APIENTRY
|
||||||
|
#define APIENTRY
|
||||||
|
#endif
|
||||||
Vendored
+51
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a simple file to encapsulate the OpenGL ES 2.0 API headers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <SDL3/SDL_platform_defines.h>
|
||||||
|
|
||||||
|
#if !defined(_MSC_VER) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS)
|
||||||
|
|
||||||
|
#ifdef SDL_PLATFORM_IOS
|
||||||
|
#include <OpenGLES/ES2/gl.h>
|
||||||
|
#include <OpenGLES/ES2/glext.h>
|
||||||
|
#else
|
||||||
|
#include <GLES2/gl2platform.h>
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
#include <GLES2/gl2ext.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* _MSC_VER */
|
||||||
|
|
||||||
|
/* OpenGL ES2 headers for Visual Studio */
|
||||||
|
#include <SDL3/SDL_opengles2_khrplatform.h>
|
||||||
|
#include <SDL3/SDL_opengles2_gl2platform.h>
|
||||||
|
#include <SDL3/SDL_opengles2_gl2.h>
|
||||||
|
#include <SDL3/SDL_opengles2_gl2ext.h>
|
||||||
|
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
#ifndef APIENTRY
|
||||||
|
#define APIENTRY GL_APIENTRY
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user