From f2b367f421a420ae5b15a4e10c170b2346561ac1 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 8 Sep 2025 09:09:42 -0500 Subject: [PATCH 001/212] [core-image/tga] implement Option.do_not_expand_grayscale --- core/image/tga/tga.odin | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/image/tga/tga.odin b/core/image/tga/tga.odin index 5fda803c5..c20201d6a 100644 --- a/core/image/tga/tga.odin +++ b/core/image/tga/tga.odin @@ -153,7 +153,7 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a // Intentionally blank case .Uncompressed_Black_White: black_white = true - dest_depth = 24 + dest_depth = 8 if .do_not_expand_grayscale in options else 24 case .Uncompressed_Color_Mapped: color_mapped = true case .Compressed_Color_Mapped: @@ -162,7 +162,7 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a case .Compressed_Black_White: black_white = true rle_encoding = true - dest_depth = 24 + dest_depth = 8 if .do_not_expand_grayscale in options else 24 case: return nil, .Unsupported_Format @@ -181,6 +181,9 @@ load_from_context :: proc(ctx: ^$C, options := Options{}, allocator := context.a } switch dest_depth { + case 8: // R8 + src_channels = 1 + dest_channels = 1 case 15: // B5G5R5 src_channels = 2 dest_channels = 3 From 4b9e15786d8db44741cd6fd5c89a033e18548d66 Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Fri, 24 Oct 2025 00:49:33 +0200 Subject: [PATCH 002/212] encoding/json: custom json (un)marshalling --- core/encoding/json/marshal.odin | 49 +++++++++++++++---------- core/encoding/json/unmarshal.odin | 61 ++++++++++++++++++------------- 2 files changed, 66 insertions(+), 44 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index e563c326a..81884b71b 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,7 +62,10 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { +User_Marshaller :: #type proc(w: io.Writer, v: any) +User_Marshaller_Map :: map[typeid]User_Marshaller + +marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { b := strings.builder_make(allocator, loc) defer if err != nil { strings.builder_destroy(&b) @@ -72,7 +75,7 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocato runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) opt := opt - marshal_to_builder(&b, v, &opt) or_return + marshal_to_builder(&b, v, &opt, user_marshallers) or_return if len(b.buf) != 0 { data = b.buf[:] @@ -81,16 +84,24 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocato return data, nil } -marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options) -> Marshal_Error { - return marshal_to_writer(strings.to_writer(b), v, opt) +marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> Marshal_Error { + return marshal_to_writer(strings.to_writer(b), v, opt, user_marshallers) } -marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { +marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> (err: Marshal_Error) { if v == nil { io.write_string(w, "null") or_return return } + if user_marshallers != nil { + marshaller := user_marshallers[v.id] + if marshaller != nil { + marshaller(w, v) + return + } + } + ti := runtime.type_info_base(type_info_of(v.id)) a := any{v.data, ti.id} @@ -208,7 +219,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for i in 0.. (err: 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) - marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt) or_return + marshal_to_writer(w, any{rawptr(data), info.elem.id}, opt, user_marshallers) or_return } opt_write_end(w, opt, '}') or_return @@ -237,7 +248,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for i in 0.. (err: for i in 0.. (err: } } - marshal_to_writer(w, any{value, info.value.id}, opt) or_return + marshal_to_writer(w, any{value, info.value.id}, opt, user_marshallers) or_return } } else { Entry :: struct { @@ -340,7 +351,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: for s, i in sorted { opt_write_iteration(w, opt, i == 0) or_return opt_write_key(w, opt, s.key) or_return - marshal_to_writer(w, s.value, opt) or_return + marshal_to_writer(w, s.value, opt, user_marshallers) or_return } } } @@ -384,7 +395,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: return false } - marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { + marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map) -> (err: Marshal_Error) { ti := runtime.type_info_base(type_info_of(v.id)) info := ti.variant.(runtime.Type_Info_Struct) first_iteration := true @@ -419,7 +430,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } else { // Marshal the fields of 'using _: T' fields directly into the parent struct if info.usings[i] && name == "_" { - marshal_struct_fields(w, the_value, opt) or_return + marshal_struct_fields(w, the_value, opt, user_marshallers) or_return continue } else { opt_write_key(w, opt, name) or_return @@ -427,13 +438,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } - marshal_to_writer(w, the_value, opt) or_return + marshal_to_writer(w, the_value, opt, user_marshallers) or_return } return } opt_write_start(w, opt, '{') or_return - marshal_struct_fields(w, v, opt) or_return + marshal_struct_fields(w, v, opt, user_marshallers) or_return opt_write_end(w, opt, '}') or_return case runtime.Type_Info_Union: @@ -466,17 +477,17 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: tag -= 1 } id := info.variants[tag].id - return marshal_to_writer(w, any{v.data, id}, opt) + return marshal_to_writer(w, any{v.data, id}, opt, user_marshallers) case runtime.Type_Info_Enum: if !opt.use_enum_names || len(info.names) == 0 { - return marshal_to_writer(w, any{v.data, info.base.id}, opt) + return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) } else { name, found := reflect.enum_name_from_value_any(v) if found { - return marshal_to_writer(w, name, opt) + return marshal_to_writer(w, name, opt, user_marshallers) } else { - return marshal_to_writer(w, any{v.data, info.base.id}, opt) + return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 3cdc6429d..c1a2725a4 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,7 +26,10 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { +User_Unmarshaller :: #type proc(p: ^Parser, v: any) +User_Unmarshaller_Map :: map[typeid]User_Unmarshaller + +unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { v := v if v == nil || v.id == nil { return .Invalid_Parameter @@ -53,20 +56,20 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, alloc if p.spec == .MJSON { #partial switch p.curr_token.kind { case .Ident, .String: - return unmarshal_object(&p, data, .EOF) + return unmarshal_object(&p, data, .EOF, user_unmarshallers) } } - return unmarshal_value(&p, data) + return unmarshal_value(&p, data, user_unmarshallers) } -unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(data, ptr, spec, allocator) +unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(data, ptr, spec, user_unmarshallers, allocator) } -unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(transmute([]byte)data, ptr, spec, allocator) +unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(transmute([]byte)data, ptr, spec, user_unmarshallers, allocator) } @@ -267,10 +270,18 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. @(private) -unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { +unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} token := p.curr_token + if user_unmarshallers != nil { + unmarshaller := user_unmarshallers[v.id] + if unmarshaller != nil { + unmarshaller(p, v) + return + } + } + v := v ti := reflect.type_info_base(type_info_of(v.id)) if u, ok := ti.variant.(reflect.Type_Info_Union); ok && token.kind != .Null { @@ -287,7 +298,7 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { for variant, i in u.variants { variant_any := any{v.data, variant.id} variant_p := p^ - if err = unmarshal_value(&variant_p, variant_any); err == nil { + if err = unmarshal_value(&variant_p, variant_any, user_unmarshallers); err == nil { p^ = variant_p raw_tag := i @@ -363,10 +374,10 @@ unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE case .Open_Brace: - return unmarshal_object(p, v, .Close_Brace) + return unmarshal_object(p, v, .Close_Brace, user_unmarshallers) case .Open_Bracket: - return unmarshal_array(p, v) + return unmarshal_array(p, v, user_unmarshallers) case: if p.spec != .JSON { @@ -423,7 +434,7 @@ json_name_from_tag_value :: proc(value: string) -> (json_name, extra: string) { @(private) -unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unmarshal_Error) { +unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} if end_token == .Close_Brace { @@ -522,7 +533,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm field_ptr := rawptr(uintptr(v.data) + offset) field := any{field_ptr, type.id} - unmarshal_value(p, field) or_return + unmarshal_value(p, field, user_unmarshallers) or_return if parse_comma(p) { break struct_loop @@ -564,7 +575,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm mem.zero_slice(elem_backing) - if uerr := unmarshal_value(p, map_backing_value); uerr != nil { + if uerr := unmarshal_value(p, map_backing_value, user_unmarshallers); uerr != nil { delete(key, p.allocator) return uerr } @@ -626,7 +637,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm index_ptr := rawptr(uintptr(v.data) + uintptr(index*t.elem_size)) index_any := any{index_ptr, t.elem.id} - unmarshal_value(p, index_any) or_return + unmarshal_value(p, index_any, user_unmarshallers) or_return if parse_comma(p) { break enumerated_array_loop @@ -662,8 +673,8 @@ unmarshal_count_array :: proc(p: ^Parser) -> (length: uintptr) { } @(private) -unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { - assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr) -> Unmarshal_Error { +unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { + assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr, user_unmarshallers: User_Unmarshaller_Map = nil) -> Unmarshal_Error { unmarshal_expect_token(p, .Open_Bracket) for idx: uintptr = 0; p.curr_token.kind != .Close_Bracket; idx += 1 { @@ -672,7 +683,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { elem_ptr := rawptr(uintptr(base) + idx*uintptr(elem.size)) elem := any{elem_ptr, elem.id} - unmarshal_value(p, elem) or_return + unmarshal_value(p, elem, user_unmarshallers) or_return if parse_comma(p) { break @@ -698,7 +709,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { raw.data = raw_data(data) raw.len = int(length) - return assign_array(p, raw.data, t.elem, length) + return assign_array(p, raw.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Dynamic_Array: raw := (^mem.Raw_Dynamic_Array)(v.data) @@ -708,7 +719,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { raw.cap = int(length) raw.allocator = p.allocator - return assign_array(p, raw.data, t.elem, length) + return assign_array(p, raw.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -716,7 +727,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length) + return assign_array(p, v.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Enumerated_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -724,7 +735,7 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length) + return assign_array(p, v.data, t.elem, length, user_unmarshallers) case reflect.Type_Info_Complex: // NOTE(bill): Allow lengths which are less than the dst array @@ -733,9 +744,9 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { } switch ti.id { - case complex32: return assign_array(p, v.data, type_info_of(f16), 2) - case complex64: return assign_array(p, v.data, type_info_of(f32), 2) - case complex128: return assign_array(p, v.data, type_info_of(f64), 2) + case complex32: return assign_array(p, v.data, type_info_of(f16), 2, user_unmarshallers) + case complex64: return assign_array(p, v.data, type_info_of(f32), 2, user_unmarshallers) + case complex128: return assign_array(p, v.data, type_info_of(f64), 2, user_unmarshallers) } return UNSUPPORTED_TYPE From 72d65603eb513d6788a21f02bc211b662c6102e8 Mon Sep 17 00:00:00 2001 From: Hisham Aburaqibah Date: Thu, 6 Nov 2025 09:02:05 +0200 Subject: [PATCH 003/212] encoding/json: error handling for custom (un)marshallers --- core/encoding/json/marshal.odin | 4 ++-- core/encoding/json/unmarshal.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 81884b71b..58fbbd852 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,7 +62,7 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -User_Marshaller :: #type proc(w: io.Writer, v: any) +User_Marshaller :: #type proc(w: io.Writer, v: any) -> Marshal_Error User_Marshaller_Map :: map[typeid]User_Marshaller marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { @@ -97,7 +97,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars if user_marshallers != nil { marshaller := user_marshallers[v.id] if marshaller != nil { - marshaller(w, v) + marshaller(w, v) or_return return } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index c1a2725a4..564b84842 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,7 +26,7 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -User_Unmarshaller :: #type proc(p: ^Parser, v: any) +User_Unmarshaller :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error User_Unmarshaller_Map :: map[typeid]User_Unmarshaller unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { @@ -277,7 +277,7 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle if user_unmarshallers != nil { unmarshaller := user_unmarshallers[v.id] if unmarshaller != nil { - unmarshaller(p, v) + unmarshaller(p, v) or_return return } } From 83fb7ba9523bc67b9f3d72ba961abd3a55dffda0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 10 Dec 2025 17:54:12 +0100 Subject: [PATCH 004/212] Make custom JSON (un)marshalers more like core:fmt's --- core/encoding/json/marshal.odin | 120 +++++++++++++++++++------ core/encoding/json/unmarshal.odin | 141 ++++++++++++++++++++++-------- 2 files changed, 200 insertions(+), 61 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index 58fbbd852..93d0b523e 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -62,10 +62,79 @@ Marshal_Options :: struct { mjson_skipped_first_braces_end: bool, } -User_Marshaller :: #type proc(w: io.Writer, v: any) -> Marshal_Error -User_Marshaller_Map :: map[typeid]User_Marshaller +User_Marshaler :: #type proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> Marshal_Error -marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marshaller_Map = nil, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { +Register_User_Marshaler_Error :: enum { + None, + No_User_Marshaler, + Marshaler_Previously_Found, +} + +// Example User Marshaler: +// Custom Marshaler for `int` +// Some_Marshaler :: proc(w: io.Writer, v: any, opt: ^json.Marshal_Options) -> json.Marshal_Error { +// io.write_string(w, fmt.tprintf("%b", v)) +// return json.Marshal_Data_Error.None +// } +// +// main :: proc() { +// // Ensure the json._user_marshaler map is initialized +// json.set_user_marshalers(new(map[typeid]json.User_Marshaler)) +// reg_err := json.register_user_marshaler(type_info_of(int).id, Some_Marshaler) +// assert(reg_err == .None) +// +// +// // Use the custom marshaler +// SomeType :: struct { +// value: int, +// } +// +// x := SomeType{42} +// data, marshal_err := json.marshal(x) +// assert(marshal_err == nil) +// defer delete(data) +// +// fmt.println("Custom output:", string(data)) // Custom output: {"value":101010} +// } + +// NOTE(Jeroen): This is a pointer to prevent accidental additions +// it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary +_user_marshalers: ^map[typeid]User_Marshaler + +// Sets user-defined marshalers for custom json marshaling of specific types +// +// Inputs: +// - m: A pointer to a map of typeids to User_Marshaler procs. +// +// NOTE: Must be called before using register_user_marshaler. +// +set_user_marshalers :: proc(m: ^map[typeid]User_Marshaler) { + assert(_user_marshalers == nil, "set_user_marshalers must not be called more than once.") + _user_marshalers = m +} + +// Registers a user-defined marshaler for a specific typeid +// +// Inputs: +// - id: The typeid of the custom type. +// - formatter: The User_Marshaler function for the custom type. +// +// Returns: A Register_User_Marshaler_Error value indicating the success or failure of the operation. +// +// WARNING: set_user_marshalers must be called before using this procedure. +// +register_user_marshaler :: proc(id: typeid, marshaler: User_Marshaler) -> Register_User_Marshaler_Error { + if _user_marshalers == nil { + return .No_User_Marshaler + } + if prev, found := _user_marshalers[id]; found && prev != nil { + return .Marshaler_Previously_Found + } + _user_marshalers[id] = marshaler + return .None +} + +marshal :: proc(v: any, opt: Marshal_Options = {}, allocator := context.allocator, loc := #caller_location) -> (data: []byte, err: Marshal_Error) { b := strings.builder_make(allocator, loc) defer if err != nil { strings.builder_destroy(&b) @@ -75,7 +144,7 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marsha runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) opt := opt - marshal_to_builder(&b, v, &opt, user_marshallers) or_return + marshal_to_builder(&b, v, &opt) or_return if len(b.buf) != 0 { data = b.buf[:] @@ -84,21 +153,20 @@ marshal :: proc(v: any, opt: Marshal_Options = {}, user_marshallers: User_Marsha return data, nil } -marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> Marshal_Error { - return marshal_to_writer(strings.to_writer(b), v, opt, user_marshallers) +marshal_to_builder :: proc(b: ^strings.Builder, v: any, opt: ^Marshal_Options) -> Marshal_Error { + return marshal_to_writer(strings.to_writer(b), v, opt) } -marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_marshallers: User_Marshaller_Map = nil) -> (err: Marshal_Error) { +marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { if v == nil { io.write_string(w, "null") or_return return } - if user_marshallers != nil { - marshaller := user_marshallers[v.id] - if marshaller != nil { - marshaller(w, v) or_return - return + if _user_marshalers != nil { + marshaler := _user_marshalers[v.id] + if marshaler != nil { + return marshaler(w, v, opt) } } @@ -219,7 +287,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars for i in 0.. (err: Marshal_Error) { + marshal_struct_fields :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: Marshal_Error) { ti := runtime.type_info_base(type_info_of(v.id)) info := ti.variant.(runtime.Type_Info_Struct) first_iteration := true @@ -430,7 +498,7 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars } else { // Marshal the fields of 'using _: T' fields directly into the parent struct if info.usings[i] && name == "_" { - marshal_struct_fields(w, the_value, opt, user_marshallers) or_return + marshal_struct_fields(w, the_value, opt) or_return continue } else { opt_write_key(w, opt, name) or_return @@ -438,13 +506,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars } - marshal_to_writer(w, the_value, opt, user_marshallers) or_return + marshal_to_writer(w, the_value, opt) or_return } return } opt_write_start(w, opt, '{') or_return - marshal_struct_fields(w, v, opt, user_marshallers) or_return + marshal_struct_fields(w, v, opt) or_return opt_write_end(w, opt, '}') or_return case runtime.Type_Info_Union: @@ -477,17 +545,17 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options, user_mars tag -= 1 } id := info.variants[tag].id - return marshal_to_writer(w, any{v.data, id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, id}, opt) case runtime.Type_Info_Enum: if !opt.use_enum_names || len(info.names) == 0 { - return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, info.base.id}, opt) } else { name, found := reflect.enum_name_from_value_any(v) if found { - return marshal_to_writer(w, name, opt, user_marshallers) + return marshal_to_writer(w, name, opt) } else { - return marshal_to_writer(w, any{v.data, info.base.id}, opt, user_marshallers) + return marshal_to_writer(w, any{v.data, info.base.id}, opt) } } diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 564b84842..25209439f 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -26,10 +26,81 @@ Unmarshal_Error :: union { Unsupported_Type_Error, } -User_Unmarshaller :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error -User_Unmarshaller_Map :: map[typeid]User_Unmarshaller +User_Unmarshaler :: #type proc(p: ^Parser, v: any) -> Unmarshal_Error -unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map, allocator := context.allocator) -> Unmarshal_Error { +Register_User_Unmarshaler_Error :: enum { + None, + No_User_Unmarshaler, + Unmarshaler_Previously_Found, +} + +// Example User Unmarshaler: +// Custom Unmarshaler for `int` +// Some_Unmarshaler :: proc(p: ^json.Parser, v: any) -> json.Unmarshal_Error { +// token := p.curr_token.text +// i, ok := strconv.parse_i64_of_base(token, 2) +// if !ok { +// return .Invalid_Data +// +// } +// (^int)(v.data)^ = int(i) +// return .None +// } +// +// _main :: proc() { +// // Ensure the json._user_unmarshaler map is initialized +// json.set_user_unmarshalers(new(map[typeid]json.User_Unmarshaler)) +// reg_err := json.register_user_unmarshaler(type_info_of(int).id, Some_Unmarshaler) +// assert(reg_err == .None) +// +// data := `{"value":101010}` +// SomeType :: struct { +// value: int, +// } +// y: SomeType +// +// unmarshal_err := json.unmarshal(transmute([]byte)data, &y) +// fmt.println(y, unmarshal_err) +// } + +// NOTE(Jeroen): This is a pointer to prevent accidental additions +// it is prefixed with `_` rather than marked with a private attribute so that users can access it if necessary +_user_unmarshalers: ^map[typeid]User_Unmarshaler + +// Sets user-defined unmarshalers for custom json unmarshaling of specific types +// +// Inputs: +// - m: A pointer to a map of typeids to User_Unmarshaler procs. +// +// NOTE: Must be called before using register_user_unmarshaler. +// +set_user_unmarshalers :: proc(m: ^map[typeid]User_Unmarshaler) { + assert(_user_unmarshalers == nil, "set_user_unmarshalers must not be called more than once.") + _user_unmarshalers = m +} + +// Registers a user-defined unmarshaler for a specific typeid +// +// Inputs: +// - id: The typeid of the custom type. +// - unmarshaler: The User_Unmarshaler function for the custom type. +// +// Returns: A Register_User_Unmarshaler_Error value indicating the success or failure of the operation. +// +// WARNING: set_user_unmarshalers must be called before using this procedure. +// +register_user_unmarshaler :: proc(id: typeid, unmarshaler: User_Unmarshaler) -> Register_User_Unmarshaler_Error { + if _user_unmarshalers == nil { + return .No_User_Unmarshaler + } + if prev, found := _user_unmarshalers[id]; found && prev != nil { + return .Unmarshaler_Previously_Found + } + _user_unmarshalers[id] = unmarshaler + return .None +} + +unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { v := v if v == nil || v.id == nil { return .Invalid_Parameter @@ -40,8 +111,10 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_ return .Non_Pointer_Parameter } PARSE_INTEGERS :: true - - if !is_valid(data, spec, PARSE_INTEGERS) { + + // If we have custom unmarshalers, we skip validation in case the custom data is not quite up to spec. + have_custom := _user_unmarshalers != nil && len(_user_unmarshalers) > 0 + if !have_custom && !is_valid(data, spec, PARSE_INTEGERS) { return .Invalid_Data } p := make_parser(data, spec, PARSE_INTEGERS, allocator) @@ -56,20 +129,20 @@ unmarshal_any :: proc(data: []byte, v: any, spec := DEFAULT_SPECIFICATION, user_ if p.spec == .MJSON { #partial switch p.curr_token.kind { case .Ident, .String: - return unmarshal_object(&p, data, .EOF, user_unmarshallers) + return unmarshal_object(&p, data, .EOF) } } - return unmarshal_value(&p, data, user_unmarshallers) + return unmarshal_value(&p, data) } -unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(data, ptr, spec, user_unmarshallers, allocator) +unmarshal :: proc(data: []byte, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(data, ptr, spec, allocator) } -unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, user_unmarshallers: User_Unmarshaller_Map = nil, allocator := context.allocator) -> Unmarshal_Error { - return unmarshal_any(transmute([]byte)data, ptr, spec, user_unmarshallers, allocator) +unmarshal_string :: proc(data: string, ptr: ^$T, spec := DEFAULT_SPECIFICATION, allocator := context.allocator) -> Unmarshal_Error { + return unmarshal_any(transmute([]byte)data, ptr, spec, allocator) } @@ -268,17 +341,15 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. return false, nil } - @(private) -unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { +unmarshal_value :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} token := p.curr_token - if user_unmarshallers != nil { - unmarshaller := user_unmarshallers[v.id] - if unmarshaller != nil { - unmarshaller(p, v) or_return - return + if _user_unmarshalers != nil { + unmarshaler := _user_unmarshalers[v.id] + if unmarshaler != nil { + return unmarshaler(p, v) } } @@ -298,7 +369,7 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle for variant, i in u.variants { variant_any := any{v.data, variant.id} variant_p := p^ - if err = unmarshal_value(&variant_p, variant_any, user_unmarshallers); err == nil { + if err = unmarshal_value(&variant_p, variant_any); err == nil { p^ = variant_p raw_tag := i @@ -374,10 +445,10 @@ unmarshal_value :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE case .Open_Brace: - return unmarshal_object(p, v, .Close_Brace, user_unmarshallers) + return unmarshal_object(p, v, .Close_Brace) case .Open_Bracket: - return unmarshal_array(p, v, user_unmarshallers) + return unmarshal_array(p, v) case: if p.spec != .JSON { @@ -434,7 +505,7 @@ json_name_from_tag_value :: proc(value: string) -> (json_name, extra: string) { @(private) -unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { +unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unmarshal_Error) { UNSUPPORTED_TYPE := Unsupported_Type_Error{v.id, p.curr_token} if end_token == .Close_Brace { @@ -533,7 +604,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh field_ptr := rawptr(uintptr(v.data) + offset) field := any{field_ptr, type.id} - unmarshal_value(p, field, user_unmarshallers) or_return + unmarshal_value(p, field) or_return if parse_comma(p) { break struct_loop @@ -575,7 +646,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh mem.zero_slice(elem_backing) - if uerr := unmarshal_value(p, map_backing_value, user_unmarshallers); uerr != nil { + if uerr := unmarshal_value(p, map_backing_value); uerr != nil { delete(key, p.allocator) return uerr } @@ -637,7 +708,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind, user_unmarsh index_ptr := rawptr(uintptr(v.data) + uintptr(index*t.elem_size)) index_any := any{index_ptr, t.elem.id} - unmarshal_value(p, index_any, user_unmarshallers) or_return + unmarshal_value(p, index_any) or_return if parse_comma(p) { break enumerated_array_loop @@ -673,8 +744,8 @@ unmarshal_count_array :: proc(p: ^Parser) -> (length: uintptr) { } @(private) -unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshaller_Map = nil) -> (err: Unmarshal_Error) { - assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr, user_unmarshallers: User_Unmarshaller_Map = nil) -> Unmarshal_Error { +unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { + assign_array :: proc(p: ^Parser, base: rawptr, elem: ^reflect.Type_Info, length: uintptr) -> Unmarshal_Error { unmarshal_expect_token(p, .Open_Bracket) for idx: uintptr = 0; p.curr_token.kind != .Close_Bracket; idx += 1 { @@ -683,7 +754,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle elem_ptr := rawptr(uintptr(base) + idx*uintptr(elem.size)) elem := any{elem_ptr, elem.id} - unmarshal_value(p, elem, user_unmarshallers) or_return + unmarshal_value(p, elem) or_return if parse_comma(p) { break @@ -709,7 +780,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle raw.data = raw_data(data) raw.len = int(length) - return assign_array(p, raw.data, t.elem, length, user_unmarshallers) + return assign_array(p, raw.data, t.elem, length) case reflect.Type_Info_Dynamic_Array: raw := (^mem.Raw_Dynamic_Array)(v.data) @@ -719,7 +790,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle raw.cap = int(length) raw.allocator = p.allocator - return assign_array(p, raw.data, t.elem, length, user_unmarshallers) + return assign_array(p, raw.data, t.elem, length) case reflect.Type_Info_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -727,7 +798,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length, user_unmarshallers) + return assign_array(p, v.data, t.elem, length) case reflect.Type_Info_Enumerated_Array: // NOTE(bill): Allow lengths which are less than the dst array @@ -735,7 +806,7 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle return UNSUPPORTED_TYPE } - return assign_array(p, v.data, t.elem, length, user_unmarshallers) + return assign_array(p, v.data, t.elem, length) case reflect.Type_Info_Complex: // NOTE(bill): Allow lengths which are less than the dst array @@ -744,9 +815,9 @@ unmarshal_array :: proc(p: ^Parser, v: any, user_unmarshallers: User_Unmarshalle } switch ti.id { - case complex32: return assign_array(p, v.data, type_info_of(f16), 2, user_unmarshallers) - case complex64: return assign_array(p, v.data, type_info_of(f32), 2, user_unmarshallers) - case complex128: return assign_array(p, v.data, type_info_of(f64), 2, user_unmarshallers) + case complex32: return assign_array(p, v.data, type_info_of(f16), 2) + case complex64: return assign_array(p, v.data, type_info_of(f32), 2) + case complex128: return assign_array(p, v.data, type_info_of(f64), 2) } return UNSUPPORTED_TYPE From a5809d0185dfeb2473f2a3947459b889c4dd5098 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Thu, 18 Dec 2025 15:04:22 +0100 Subject: [PATCH 005/212] Fix #packed #all_or_none --- src/parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index 06703d643..de5655ce1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2803,7 +2803,7 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { } is_packed = true; } else if (tag.string == "all_or_none") { - if (is_packed) { + if (is_all_or_none) { syntax_error(tag, "Duplicate struct tag '#%.*s'", LIT(tag.string)); } is_all_or_none = true; From c06fc7da98237f00e1a2905bd5c7039f34199edf Mon Sep 17 00:00:00 2001 From: Xotchkass <78706300+Xotchkass@users.noreply.github.com> Date: Thu, 18 Dec 2025 20:14:31 +0200 Subject: [PATCH 006/212] [core:io/utils] fix buffer size in write_* procs --- core/io/util.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/io/util.odin b/core/io/util.odin index 86a89cfb1..a82a80be0 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -21,12 +21,12 @@ write_ptr_at :: proc(w: Writer_At, p: rawptr, byte_size: int, offset: i64, n_wri } write_u64 :: proc(w: Writer, i: u64, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [32]byte + buf: [64]byte s := strconv.write_bits(buf[:], i, base, false, 64, strconv.digits, nil) return write_string(w, s, n_written) } write_i64 :: proc(w: Writer, i: i64, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [32]byte + buf: [65]byte s := strconv.write_bits(buf[:], u64(i), base, true, 64, strconv.digits, nil) return write_string(w, s, n_written) } @@ -39,12 +39,12 @@ write_int :: proc(w: Writer, i: int, base: int = 10, n_written: ^int = nil) -> ( } write_u128 :: proc(w: Writer, i: u128, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [39]byte + buf: [128]byte s := strconv.write_bits_128(buf[:], i, base, false, 128, strconv.digits, nil) return write_string(w, s, n_written) } write_i128 :: proc(w: Writer, i: i128, base: int = 10, n_written: ^int = nil) -> (n: int, err: Error) { - buf: [40]byte + buf: [129]byte s := strconv.write_bits_128(buf[:], u128(i), base, true, 128, strconv.digits, nil) return write_string(w, s, n_written) } From ca20a9c8e78df9e0d483589ec58300d05d92b425 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 15:21:26 +0000 Subject: [PATCH 007/212] Pre`reserve` the memory needed for `strings.builder_replace` --- core/strings/builder.odin | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/strings/builder.odin b/core/strings/builder.odin index da9b6df27..ce636a2a1 100644 --- a/core/strings/builder.odin +++ b/core/strings/builder.odin @@ -880,6 +880,20 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo } if len(old) == 0 { + // NOTE(bill): reserve the necessary memory + found := 0 + for i := 0; i <= len(b.buf); i += len(new)+1 { + if n > 0 && found == n { + break + } + found += 1 + } + if found == 0 { + return + } + reserve(&b.buf, len(b.buf) + len(new)*found) or_return + + for i := 0; i <= len(b.buf); i += len(new)+1 { if n > 0 && replaced == n { break @@ -891,6 +905,27 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo replaced += 1 } } else { + if len(new) > len(old) { + // NOTE(bill): reserve the necessary memory + found := 0 + for i := 0; i < len(b.buf); /**/ { + if n > 0 && found == n { + break + } + + j := index(string(b.buf[i:]), old) + if j < 0 { + break + } + i += j+len(old) + found += 1 + } + if found == 0 { + return + } + reserve(&b.buf, len(b.buf) + (len(new)-len(old))*found) or_return + } + for i := 0; i < len(b.buf); /**/ { if n > 0 && replaced == n { break @@ -901,7 +936,7 @@ builder_replace :: proc(b: ^Builder, old, new: string, n: int, loc := #caller_lo break } - if len(new) >= len(old) { + if len(new) > len(old) { resize(&b.buf, len(b.buf) + len(new)-len(old)) or_return } From 06076e02c0acd0559eeefb32a1a420e4d7243aa7 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 21 Dec 2025 17:02:41 +0100 Subject: [PATCH 008/212] js: improve warning about conflicting memory strategies --- core/sys/wasm/js/odin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 43a6b002a..ef203e24d 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -2107,7 +2107,7 @@ async function runWasm(wasmPath, consoleElement, extraForeignImports, wasmMemory if (exports.memory) { if (wasmMemoryInterface.memory) { - console.warn("WASM module exports memory, but `runWasm` was given an interface with existing memory too"); + console.warn('WASM module exports memory, but `runWasm` was given an interface with existing memory too. Did you mean to use `-extra-linker-flags:"--import-memory"` to tell the compiler not to export memory?'); } wasmMemoryInterface.setMemory(exports.memory); } From 998da2c2da72853cff9ceeb86d07ad20bb81a8c6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 17:09:22 +0000 Subject: [PATCH 009/212] Add `reflect.default_map_hash_by_ptr` --- core/reflect/reflect.odin | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 5fbff08c2..378c50ff0 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -2003,4 +2003,14 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ runtime.print_typeid(a.id) runtime.print_string("\n") return true +} + + +@(require_results) +default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = runtime.INITIAL_HASH_SEED) -> uintptr where intrinsics.type_is_comparable(T) { + assert(ptr != nil) + + info := intrinsics.type_map_info(map[T]struct{}) + + return info.key_hasher(ptr, seed) } \ No newline at end of file From cb2f3aca8b63ca59f63cf794c767096860990f6e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Dec 2025 17:13:59 +0000 Subject: [PATCH 010/212] Change seed logic --- core/reflect/reflect.odin | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 378c50ff0..b39c6ac6b 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -2007,10 +2007,12 @@ equal :: proc(a, b: any, including_indirect_array_recursion := false, recursion_ @(require_results) -default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = runtime.INITIAL_HASH_SEED) -> uintptr where intrinsics.type_is_comparable(T) { +default_map_hash_by_ptr :: proc(ptr: ^$T, seed: uintptr = 0) -> uintptr where intrinsics.type_is_comparable(T) { assert(ptr != nil) - info := intrinsics.type_map_info(map[T]struct{}) - return info.key_hasher(ptr, seed) + h := u64(seed) + runtime.INITIAL_HASH_SEED + actual_seed := uintptr(h) | uintptr(uintptr(h) == 0) + + return info.key_hasher(ptr, actual_seed) } \ No newline at end of file From 8ca7fc481fad1a335b5ca46b9f997396df9be1aa Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 21 Dec 2025 18:59:21 +0100 Subject: [PATCH 011/212] Fix misleading error messages for init, fini and test attributes These look like copy-pasta from the private attribute. --- src/checker.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 4d5482933..33121b453 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3581,7 +3581,7 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { return true; } else if (name == "test") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->test = true; return true; @@ -3629,13 +3629,13 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { return true; } else if (name == "init") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->init = true; return true; } else if (name == "fini") { if (value != nullptr) { - error(value, "'%.*s' expects no parameter, or a string literal containing \"file\" or \"package\"", LIT(name)); + error(value, "Expected no value for '%.*s'", LIT(name)); } ac->fini = true; return true; From 9cace192776656d2237c25e402fd321f05ae1aeb Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 21 Dec 2025 18:01:50 +0100 Subject: [PATCH 012/212] net(docs): recv of 0 bytes with no error is a graceful close --- core/net/errors.odin | 8 ++++--- core/net/socket.odin | 19 +++++++++++++++-- tests/core/net/test_core_net.odin | 35 +++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/core/net/errors.odin b/core/net/errors.odin index 4853327b0..de53640fc 100644 --- a/core/net/errors.odin +++ b/core/net/errors.odin @@ -149,7 +149,8 @@ TCP_Recv_Error :: enum i32 { Invalid_Argument, // The socket is not connected. Not_Connected, - // Connection was closed/broken/shutdown while receiving data. + // Connection was closed due to an error or shutdown. + // NOTE: a graceful close is indicated by a `0, nil` (0 bytes received and no error) return. Connection_Closed, // Timed out before being able to receive any data. Timeout, @@ -170,7 +171,8 @@ UDP_Recv_Error :: enum i32 { Insufficient_Resources, // Invalid socket or buffer given. Invalid_Argument, - // "Connection" was refused by remote, or closed/broken/shutdown while receiving data. + // "Connection" was refused, or closed due to an error. + // NOTE: a graceful close is indicated by a `0, nil` (0 bytes received and no error) return. Connection_Refused, // Timed out before being able to receive any data. Timeout, @@ -193,7 +195,7 @@ TCP_Send_Error :: enum i32 { Insufficient_Resources, // Invalid socket or buffer given. Invalid_Argument, - // Connection was closed/broken/shutdown while receiving data. + // Connection was closed/broken/shutdown while sending data. Connection_Closed, // The socket is not connected. Not_Connected, diff --git a/core/net/socket.odin b/core/net/socket.odin index 7e96ba2b2..edb47cd0b 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -193,21 +193,36 @@ close :: proc(socket: Any_Socket) { _close(socket) } +/* + Receive data into a buffer from a TCP socket. + + If no error occurs, `recv_tcp` returns the number of bytes received and `buf` will contain this data received. + If the connection has been gracefully closed, the return value is `0, nil` (0 bytes read and no error). +*/ recv_tcp :: proc(socket: TCP_Socket, buf: []byte) -> (bytes_read: int, err: TCP_Recv_Error) { return _recv_tcp(socket, buf) } +/* + Receive data into a buffer from a UDP socket. + + If no error occurs, `recv_udp` returns the number of bytes received and `buf` will contain this data received. + If the "connection" has been gracefully closed, the return value is `0, nil` (0 bytes read and no error). +*/ recv_udp :: proc(socket: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_endpoint: Endpoint, err: UDP_Recv_Error) { return _recv_udp(socket, buf) } /* - Receive data from into a buffer from any socket. + Receive data into a buffer from any socket. Note: `remote_endpoint` parameter is non-nil only if the socket type is UDP. On TCP sockets it will always return `nil`. - Errors that can be returned: `TCP_Recv_Error`, or `UDP_Recv_Error` + Errors that can be returned: `TCP_Recv_Error`, or `UDP_Recv_Error`. + + If no error occurs, `recv_any` returns the number of bytes received and `buf` will contain this data received. + If the connection has been gracefully closed, the return value is `0, nil, nil` (0 bytes read and no error). */ recv_any :: proc(socket: Any_Socket, buf: []byte) -> ( bytes_read: int, diff --git a/tests/core/net/test_core_net.odin b/tests/core/net/test_core_net.odin index ec45744f3..9b3973a60 100644 --- a/tests/core/net/test_core_net.odin +++ b/tests/core/net/test_core_net.odin @@ -624,6 +624,41 @@ test_nonblocking_option :: proc(t: ^testing.T) { } } +// Test that when the server closes it's connection, the client's next receive is `0, nil` to indicate a correct close. +@(test) +test_connection_close :: proc(t: ^testing.T) { + server, listen_err := net.listen_tcp({address=net.IP4_Address{127, 0, 0, 1}, port=0}) + testing.expect_value(t, listen_err, nil) + defer net.close(server) + + server_ep, bound_endpoint_err := net.bound_endpoint(server) + testing.expect_value(t, bound_endpoint_err, nil) + + client, dial_err := net.dial_tcp(server_ep) + testing.expect_value(t, dial_err, nil) + defer net.close(client) + + server_client, _, accept_err := net.accept_tcp(server) + testing.expect_value(t, accept_err, nil) + + send_buf: [512]byte = 1 + sent, send_err := net.send(server_client, send_buf[:]) + testing.expect_value(t, sent, 512) + testing.expect_value(t, send_err, nil) + net.close(server_client) + + recv_buf: [512]byte = --- + received, recv_err := net.recv(client, recv_buf[:]) + testing.expect_value(t, received, 512) + testing.expect_value(t, recv_err, nil) + + testing.expect_value(t, recv_buf, send_buf) + + received, recv_err = net.recv(client, recv_buf[:]) + testing.expect_value(t, received, 0) + testing.expect_value(t, recv_err, nil) +} + @(private) address_to_binstr :: proc(address: net.Address) -> (binstr: string) { switch t in address { From 8ce30dbb72ebb8162b1e36f29bb7a71abc8ad6de Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 22 Dec 2025 16:56:10 +0100 Subject: [PATCH 013/212] sys/wasm/js: fix vet error --- core/sys/wasm/js/dom.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/wasm/js/dom.odin b/core/sys/wasm/js/dom.odin index 902dfc941..a4f8d7687 100644 --- a/core/sys/wasm/js/dom.odin +++ b/core/sys/wasm/js/dom.odin @@ -15,7 +15,7 @@ foreign dom_lib { get_element_value_string_length :: proc(id: string) -> int --- set_element_key_string :: proc(id: string, key: string, value: string) --- - get_element_key_string_length :: proc(id: string, key: string, ) -> int --- + get_element_key_string_length :: proc(id: string, key: string) -> int --- device_pixel_ratio :: proc() -> f64 --- From b53ee3dba3f21bf5a22b9cf211ae49ff92b3e08b Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 22 Dec 2025 16:57:58 +0100 Subject: [PATCH 014/212] container/xar: fix undeclared `n` assignment --- core/container/xar/xar.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 616a05e06..71fc13a27 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -323,7 +323,6 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #cal } x.chunks[chunk_idx][elem_idx] = value x.len += 1 - n = 1 ptr = &x.chunks[chunk_idx][elem_idx] return } From 7062f89bcd1d98275e4a1977207b1c7993c90f41 Mon Sep 17 00:00:00 2001 From: Wrath Date: Mon, 22 Dec 2025 16:10:51 -0500 Subject: [PATCH 015/212] core:math/rand small documentation fix --- core/math/rand/rand.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 41b066255..2ed2c9e70 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -260,7 +260,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) @@ -301,7 +301,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) @@ -342,7 +342,7 @@ Example: Possible Output: 6 - 500 + 13 */ @(require_results) From cb98a83f77ca7a3eb0f43c013cdce1f8ee65deb5 Mon Sep 17 00:00:00 2001 From: Dusty Miller Date: Mon, 22 Dec 2025 20:16:24 -0600 Subject: [PATCH 016/212] Update letter.odin Fix MAX_RUNE to include planes up to 16. --- core/unicode/letter.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/unicode/letter.odin b/core/unicode/letter.odin index a1024dd6c..5191dd900 100644 --- a/core/unicode/letter.odin +++ b/core/unicode/letter.odin @@ -2,7 +2,7 @@ package unicode import "base:runtime" -MAX_RUNE :: '\U00010fff' // Maximum valid unicode code point +MAX_RUNE :: '\U0010ffff' // Maximum valid unicode code point REPLACEMENT_CHAR :: '\ufffd' // Represented an invalid code point MAX_ASCII :: '\u007f' // Maximum ASCII value MAX_LATIN1 :: '\u00ff' // Maximum Latin-1 value From ab74b8283d48ca96ea800298ae0f227a9cc0eb99 Mon Sep 17 00:00:00 2001 From: StudebakerGuy <> Date: Tue, 23 Dec 2025 09:35:09 -0500 Subject: [PATCH 017/212] Address issue identifying of CDATA The XML library wasn't identifying CDATA and skipping over it. This was found when CDATA contained a <. This patch addresses that issue. --- core/encoding/xml/xml_reader.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/encoding/xml/xml_reader.odin b/core/encoding/xml/xml_reader.odin index 0e773fd8a..99d73670b 100644 --- a/core/encoding/xml/xml_reader.odin +++ b/core/encoding/xml/xml_reader.odin @@ -308,6 +308,7 @@ parse_bytes :: proc(data: []u8, options := DEFAULT_OPTIONS, path := "", error_ha case .Open_Bracket: // This could be a CDATA tag part of a tag's body. Unread the ` (id: Element_ID) { cur := doc.element_count doc.element_count += 1 return cur -} \ No newline at end of file +} From 2e6554b8c85c904eb1eb010f0312641be800823f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 26 Dec 2025 11:49:46 +0000 Subject: [PATCH 018/212] Disallow importing directories with an `.odin` extension/suffix --- src/parser.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/parser.cpp b/src/parser.cpp index de5655ce1..b2ff55396 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5818,6 +5818,11 @@ gb_internal AstPackage *try_add_import_path(Parser *p, String path, String const return nullptr; } + if (string_ends_with(path, str_lit(".odin"))) { + error(pos, "'import' declarations cannot import directories with a .odin extension/suffix"); + return nullptr; + } + isize files_with_ext = 0; isize files_to_reserve = 1; // always reserve 1 for (FileInfo fi : list) { From 7e39239907885447b73c8c03648a85554552f1bc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 26 Dec 2025 23:02:35 +0100 Subject: [PATCH 019/212] WebGL: Add GetActiveAttrib binding --- core/sys/wasm/js/odin.js | 21 +++++++++++++++++ vendor/wasm/WebGL/webgl.odin | 44 +++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index ef203e24d..ca4af18b8 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -625,6 +625,26 @@ class WebGLInterface { this.ctx.generateMipmap(target); }, + GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + let info = this.ctx.getActiveAttrib(program, index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if name_buf_ptr && name_buf_len > 0 { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if name_len_ptr { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, GetAttribLocation: (program, name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); @@ -1840,6 +1860,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { return false; }, + // Writes a struct of type `Gamepad_State`, see `core/sys/wasm/js/events.odin` get_gamepad_state: (gamepad_id, ep) => { let index = gamepad_id; let gps = navigator.getGamepads(); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 5616f3660..1c3bda2e6 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -3,6 +3,7 @@ package webgl foreign import "webgl" import glm "core:math/linalg/glsl" +import "base:runtime" Enum :: distinct u32 @@ -25,6 +26,12 @@ ContextAttribute :: enum u32 { } ContextAttributes :: distinct bit_set[ContextAttribute; u32] +ActiveInfo :: struct { + size: int, + type: Enum, + name: string, +} + DEFAULT_CONTEXT_ATTRIBUTES :: ContextAttributes{} @(default_calling_convention="contextless") @@ -260,7 +267,6 @@ UniformMatrix4fv :: proc "contextless" (location: i32, m: glm.mat4) { value := transmute([4*4]f32)m _UniformMatrix4fv(location, &value[0]) } - GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) { foreign webgl { @(link_name="GetShaderiv") @@ -270,6 +276,42 @@ GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) { return } +GetActiveAttribBuf :: proc "contextless" (program: Program, index: u32, name_buf: []byte) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveAttrib") + _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + name_len: int + _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len) + info.name = string(name_buf[:name_len]) + return +} + +GetActiveAttribAlloc :: proc(program: Program, index: u32, allocator: runtime.Allocator, loc := #caller_location) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveAttrib") + _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + + name_len: int + + // Passing {} to the buf but giving it a name_len ptr will write the needed len into that int + _GetActiveAttrib(program, index, &info.size, &info.type, {}, &name_len) + + if name_len > 0 { + name_buf := make([]byte, name_len, allocator, loc) + _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len) + assert(name_len == len(name_buf)) + info.name = string(name_buf[:name_len]) + } + + return +} + +GetActiveAttrib :: proc { + GetActiveAttribBuf, + GetActiveAttribAlloc, +} GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string { foreign webgl { From 7dee25bdcc069bbb0ceb5d4a1ac1a9e3009bfb83 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Fri, 26 Dec 2025 23:34:45 +0100 Subject: [PATCH 020/212] More allocator-aware webgl bindings and added more missing bindings. --- core/sys/wasm/js/odin.js | 21 ++++++++++++++++++++ vendor/wasm/WebGL/webgl.odin | 37 +++++++++++++++++++++++++++++++++++ vendor/wasm/WebGL/webgl2.odin | 25 ++++++++++++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index ca4af18b8..b0a01f66c 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -646,6 +646,27 @@ class WebGLInterface { } }, + GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { + let info = this.ctx.getActiveUniform(program, index); + + if (size_ptr) { + this.mem.storeInt(size_ptr, info.size); + } + + if (type_ptr) { + this.mem.storeI32(type_ptr, info.type); + } + + if name_buf_ptr && name_buf_len > 0 { + let n = Math.min(name_buf_len, info.name.length); + let name = info.name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_len_ptr, n); + } else if name_len_ptr { + this.mem.storeInt(name_len_ptr, info.name.length); + } + }, + GetAttribLocation: (program, name_ptr, name_len) => { let name = this.mem.loadString(name_ptr, name_len); return this.ctx.getAttribLocation(this.programs[program], name); diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 1c3bda2e6..601071c3a 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -313,6 +313,43 @@ GetActiveAttrib :: proc { GetActiveAttribAlloc, } +GetActiveUniformBuf :: proc "contextless" (program: Program, index: u32, name_buf: []byte) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveUniform") + _GetActiveUniform :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + name_len: int + _GetActiveUniform(program, index, &info.size, &info.type, name_buf, &name_len) + info.name = string(name_buf[:name_len]) + return +} + +GetActiveUniformAlloc :: proc(program: Program, index: u32, allocator: runtime.Allocator, loc := #caller_location) -> (info: ActiveInfo) { + foreign webgl { + @(link_name="GetActiveUniform") + _GetActiveUniform :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) --- + } + + name_len: int + + // Passing {} to the buf but giving it a name_len ptr will write the needed len into that int + _GetActiveUniform(program, index, &info.size, &info.type, {}, &name_len) + + if name_len > 0 { + name_buf := make([]byte, name_len, allocator, loc) + _GetActiveUniform(program, index, &info.size, &info.type, name_buf, &name_len) + assert(name_len == len(name_buf)) + info.name = string(name_buf[:name_len]) + } + + return +} + +GetActiveUniform :: proc { + GetActiveUniformBuf, + GetActiveUniformAlloc, +} + GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string { foreign webgl { @(link_name="GetProgramInfoLog") diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 66a739303..3494559a5 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -3,6 +3,7 @@ package webgl foreign import "webgl2" import "base:intrinsics" +import "base:runtime" import glm "core:math/linalg/glsl" Query :: distinct u32 @@ -109,7 +110,7 @@ foreign webgl2 { BindVertexArray :: proc(vertexArray: VertexArrayObject) --- } -GetActiveUniformBlockName :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { +GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { foreign webgl2 { _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } @@ -118,6 +119,28 @@ GetActiveUniformBlockName :: proc(program: Program, uniformBlockIndex: i32, buf: return string(buf[:n]) } +GetActiveUniformBlockNameAlloc :: proc(program: Program, uniformBlockIndex: i32, allocator: runtime.Allocator, loc := #caller_location) -> string { + foreign webgl2 { + _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- + } + n: int + _GetActiveUniformBlockName(program, uniformBlockIndex, {}, &n) + + if n > 0 { + buf := make([]byte, n, allocator, loc) + _GetActiveUniformBlockName(program, uniformBlockIndex, buf, &n) + assert(n == len(buf)) + return string(buf[:n]) + } + + return "" +} + +GetActiveUniformBlockName :: proc { + GetActiveUniformBlockNameBuf, + GetActiveUniformBlockNameAlloc, +} + Uniform1uiv :: proc "contextless" (location: i32, v: u32) { Uniform1ui(location, v) From 159eab133b4b6dc9df6896d003134c1f0ccfde92 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 27 Dec 2025 01:41:59 +0100 Subject: [PATCH 021/212] More webgl bindings and fixes --- core/sys/wasm/js/odin.js | 29 ++++++++++++++++++++++------- vendor/wasm/WebGL/webgl2.odin | 15 ++++++++++++++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index b0a01f66c..0c617dd8e 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -626,7 +626,7 @@ class WebGLInterface { }, GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { - let info = this.ctx.getActiveAttrib(program, index); + const info = this.ctx.getActiveAttrib(this.programs[program], index); if (size_ptr) { this.mem.storeInt(size_ptr, info.size); @@ -636,18 +636,18 @@ class WebGLInterface { this.mem.storeI32(type_ptr, info.type); } - if name_buf_ptr && name_buf_len > 0 { + if (name_buf_ptr && name_buf_len > 0) { let n = Math.min(name_buf_len, info.name.length); let name = info.name.substring(0, n); this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); this.mem.storeInt(name_len_ptr, n); - } else if name_len_ptr { + } else if (name_len_ptr) { this.mem.storeInt(name_len_ptr, info.name.length); } }, GetActiveUniform: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => { - let info = this.ctx.getActiveUniform(program, index); + let info = this.ctx.getActiveUniform(this.programs[program], index); if (size_ptr) { this.mem.storeInt(size_ptr, info.size); @@ -657,12 +657,12 @@ class WebGLInterface { this.mem.storeI32(type_ptr, info.type); } - if name_buf_ptr && name_buf_len > 0 { + if (name_buf_ptr && name_buf_len > 0) { let n = Math.min(name_buf_len, info.name.length); let name = info.name.substring(0, n); this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); this.mem.storeInt(name_len_ptr, n); - } else if name_len_ptr { + } else if (name_len_ptr) { this.mem.storeInt(name_len_ptr, info.name.length); } }, @@ -1301,7 +1301,6 @@ class WebGLInterface { this.assertWebGL2(); return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len)); }, - // any getActiveUniformBlockParameter(WebGLProgram program, GLuint uniformBlockIndex, GLenum pname); GetActiveUniformBlockName: (program, uniformBlockIndex, buf_ptr, buf_len, length_ptr) => { this.assertWebGL2(); let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex); @@ -1311,6 +1310,22 @@ class WebGLInterface { this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(name)) this.mem.storeInt(length_ptr, n); }, + GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => { + thid.assertWebGL2(); + let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len); + this.ctx.getActiveUniforms(this.programs[program], indices, pname) + this.mem.loadI32Array(res_ptr, indices.length).set(indices) + }, + GetActiveUniformBlockParameter: (program, uniformBlockIndex, pname, params_ptr) => { + this.assertWebGL2(); + let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname); + + if (e instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES + this.mem.loadU32Array(params_ptr, res.length).set(res) + } else { + this.mem.storeI32(params_ptr, res) + } + }, UniformBlockBinding: (program, uniformBlockIndex, uniformBlockBinding) => { this.assertWebGL2(); this.ctx.uniformBlockBinding(this.programs[program], uniformBlockIndex, uniformBlockBinding); diff --git a/vendor/wasm/WebGL/webgl2.odin b/vendor/wasm/WebGL/webgl2.odin index 3494559a5..1e36fd0fd 100644 --- a/vendor/wasm/WebGL/webgl2.odin +++ b/vendor/wasm/WebGL/webgl2.odin @@ -104,6 +104,12 @@ foreign webgl2 { GetUniformBlockIndex :: proc(program: Program, uniformBlockName: string) -> i32 --- UniformBlockBinding :: proc(program: Program, uniformBlockIndex: i32, uniformBlockBinding: i32) --- + // if `pname` is `UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES` then an array will be written at + // `params`, in that case the length `params` need to have is given first querying using `pname` + // `UNIFORM_BLOCK_ACTIVE_UNIFORMS`. + GetActiveUniformBlockParameter :: proc(program: Program, uniformBlockIndex: i32, pname: Enum, params: [^]i32) --- + GetActiveUniforms :: proc(program: Program, uniformIndices: []u32, pname: Enum, res: [^]i32) --- + CreateVertexArray :: proc() -> VertexArrayObject --- DeleteVertexArray :: proc(vertexArray: VertexArrayObject) --- IsVertexArray :: proc(vertexArray: VertexArrayObject) -> bool --- @@ -112,6 +118,7 @@ foreign webgl2 { GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string { foreign webgl2 { + @(link_name="GetActiveUniformBlockName") _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } n: int @@ -121,6 +128,7 @@ GetActiveUniformBlockNameBuf :: proc(program: Program, uniformBlockIndex: i32, b GetActiveUniformBlockNameAlloc :: proc(program: Program, uniformBlockIndex: i32, allocator: runtime.Allocator, loc := #caller_location) -> string { foreign webgl2 { + @(link_name="GetActiveUniformBlockName") _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) --- } n: int @@ -141,7 +149,6 @@ GetActiveUniformBlockName :: proc { GetActiveUniformBlockNameAlloc, } - Uniform1uiv :: proc "contextless" (location: i32, v: u32) { Uniform1ui(location, v) } @@ -157,6 +164,7 @@ Uniform4uiv :: proc "contextless" (location: i32, v: glm.uvec4) { UniformMatrix3x2fv :: proc "contextless" (location: i32, m: glm.mat3x2) { foreign webgl2 { + @(link_name="UniformMatrix3x2fv") _UniformMatrix3x2fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -164,6 +172,7 @@ UniformMatrix3x2fv :: proc "contextless" (location: i32, m: glm.mat3x2) { } UniformMatrix4x2fv :: proc "contextless" (location: i32, m: glm.mat4x2) { foreign webgl2 { + @(link_name="UniformMatrix4x2fv") _UniformMatrix4x2fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -171,6 +180,7 @@ UniformMatrix4x2fv :: proc "contextless" (location: i32, m: glm.mat4x2) { } UniformMatrix2x3fv :: proc "contextless" (location: i32, m: glm.mat2x3) { foreign webgl2 { + @(link_name="UniformMatrix2x3fv") _UniformMatrix2x3fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -178,6 +188,7 @@ UniformMatrix2x3fv :: proc "contextless" (location: i32, m: glm.mat2x3) { } UniformMatrix4x3fv :: proc "contextless" (location: i32, m: glm.mat4x3) { foreign webgl2 { + @(link_name="UniformMatrix4x3fv") _UniformMatrix4x3fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -185,6 +196,7 @@ UniformMatrix4x3fv :: proc "contextless" (location: i32, m: glm.mat4x3) { } UniformMatrix2x4fv :: proc "contextless" (location: i32, m: glm.mat2x4) { foreign webgl2 { + @(link_name="UniformMatrix2x4fv") _UniformMatrix2x4fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) @@ -192,6 +204,7 @@ UniformMatrix2x4fv :: proc "contextless" (location: i32, m: glm.mat2x4) { } UniformMatrix3x4fv :: proc "contextless" (location: i32, m: glm.mat3x4) { foreign webgl2 { + @(link_name="UniformMatrix3x4fv") _UniformMatrix3x4fv :: proc "contextless" (location: i32, addr: [^]f32) --- } array := intrinsics.matrix_flatten(m) From d802a4e9fa412e1234a5970b8545994293946409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Sat, 27 Dec 2025 04:30:37 +0100 Subject: [PATCH 022/212] encoding/base32: Fix padding validation for malformed input Fix a bug where padding characters in the middle of input were not detected when there was no trailing padding. The "verify no padding in middle" check was inside `if padding_count > 0`, so inputs like "MZ===YTBMZXW6YTB" would incorrectly pass validation. Test case added for this edge case. --- core/encoding/base32/base32.odin | 14 +++++++------- tests/core/encoding/base32/base32.odin | 14 +++++++++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 34de2ff53..d272b32b8 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -153,15 +153,15 @@ decode :: proc( padding_count += 1 } + // Verify no padding in the middle + for i := 0; i < data_len - padding_count; i += 1 { + if data[i] == byte(PADDING) { + return nil, .Malformed_Input + } + } + // Check for proper padding and length combinations if padding_count > 0 { - // Verify no padding in the middle - for i := 0; i < data_len - padding_count; i += 1 { - if data[i] == byte(PADDING) { - return nil, .Malformed_Input - } - } - content_len := data_len - padding_count mod8 := content_len % 8 required_padding: int diff --git a/tests/core/encoding/base32/base32.odin b/tests/core/encoding/base32/base32.odin index f757e99e5..2abb244ca 100644 --- a/tests/core/encoding/base32/base32.odin +++ b/tests/core/encoding/base32/base32.odin @@ -1,4 +1,3 @@ -#+test package test_encoding_base32 import "core:testing" @@ -83,7 +82,16 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { // Section 3.2 - Padding requirements { - // Padding must only be at end + // Padding in middle without trailing padding + input := "MZ===YTBMZXW6YTB" // '===' in middle, no trailing padding + output, err := base32.decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Padding must only be at end (with trailing padding) input := "MZ=Q====" output, err := base32.decode(input) if output != nil { @@ -228,4 +236,4 @@ test_base32_custom_alphabet :: proc(t: ^testing.T) { } testing.expect_value(t, err, Error.Invalid_Character) } -} \ No newline at end of file +} From 40eab9991efbd090d2b473f5f121859c544f5d6b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 11:35:13 +0000 Subject: [PATCH 023/212] Split some procedures up --- core/fmt/fmt.odin | 661 ++++++++++++++++++++++++---------------------- 1 file changed, 345 insertions(+), 316 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index c958c2d2e..27168d6c2 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2142,6 +2142,108 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. return false } +@(private) +fmt_soa_struct_internal :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime.Type_Info_Struct, type_name: string, hash: bool, indent: int) { + is_empty := info.field_count == 0 + + fi.indent += 1 + defer fi.indent -= 1 + + base_type_name: string + if v, ok := info.soa_base_type.variant.(runtime.Type_Info_Named); ok { + base_type_name = v.name + } + + actual_field_count := info.field_count + + n := uintptr(info.soa_len) + + if info.soa_kind == .Slice { + actual_field_count = info.field_count-1 // len + + n = uintptr((^int)(uintptr(v.data) + info.offsets[actual_field_count])^) + + } else if info.soa_kind == .Dynamic { + actual_field_count = info.field_count-3 // len, cap, allocator + + n = uintptr((^int)(uintptr(v.data) + info.offsets[actual_field_count])^) + } + + if hash && n > 0 { + io.write_byte(fi.writer, '\n', &fi.n) + } + + for index in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + + field_count := -1 + + if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) } + + if hash { + fi.indent -= 1 + fmt_write_indent(fi) + fi.indent += 1 + } + io.write_string(fi.writer, base_type_name, &fi.n) + io.write_byte(fi.writer, '{', &fi.n) + if hash && !is_empty { io.write_byte(fi.writer, '\n', &fi.n) } + defer { + if hash && !is_empty { + fi.indent -= 1 + fmt_write_indent(fi) + fi.indent += 1 + } + io.write_byte(fi.writer, '}', &fi.n) + if hash { io.write_string(fi.writer, ",\n", &fi.n) } + } + fi.record_level += 1 + defer fi.record_level -= 1 + + for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + if hash { + fmt_write_indent(fi) + } + + io.write_string(fi.writer, name, &fi.n) + io.write_string(fi.writer, " = ", &fi.n) + + if info.soa_kind == .Fixed { + t := info.types[i].variant.(runtime.Type_Info_Array).elem + t_size := uintptr(t.size) + if reflect.is_any(t) { + io.write_string(fi.writer, "any{}", &fi.n) + } else { + data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size) + fmt_arg(fi, any{data, t.id}, verb) + } + } else { + t := info.types[i].variant.(runtime.Type_Info_Multi_Pointer).elem + t_size := uintptr(t.size) + if reflect.is_any(t) { + io.write_string(fi.writer, "any{}", &fi.n) + } else { + field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^ + data := rawptr(uintptr(field_ptr) + index*t_size) + fmt_arg(fi, any{data, t.id}, verb) + } + } + + if hash { io.write_string(fi.writer, ",\n", &fi.n) } + } + } + + if hash && n > 0 { + for _ in 0.. 0 { - io.write_byte(fi.writer, '\n', &fi.n) - } - - for index in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - - field_count := -1 - - if !hash && field_count > 0 { io.write_string(fi.writer, ", ", &fi.n) } - - if hash { - fi.indent -= 1 - fmt_write_indent(fi) - fi.indent += 1 - } - io.write_string(fi.writer, base_type_name, &fi.n) - io.write_byte(fi.writer, '{', &fi.n) - if hash && !is_empty { io.write_byte(fi.writer, '\n', &fi.n) } - defer { - if hash && !is_empty { - fi.indent -= 1 - fmt_write_indent(fi) - fi.indent += 1 - } - io.write_byte(fi.writer, '}', &fi.n) - if hash { io.write_string(fi.writer, ",\n", &fi.n) } - } - fi.record_level += 1 - defer fi.record_level -= 1 - - for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - if hash { - fmt_write_indent(fi) - } - - io.write_string(fi.writer, name, &fi.n) - io.write_string(fi.writer, " = ", &fi.n) - - if info.soa_kind == .Fixed { - t := info.types[i].variant.(runtime.Type_Info_Array).elem - t_size := uintptr(t.size) - if reflect.is_any(t) { - io.write_string(fi.writer, "any{}", &fi.n) - } else { - data := rawptr(uintptr(v.data) + info.offsets[i] + index*t_size) - fmt_arg(fi, any{data, t.id}, verb) - } - } else { - t := info.types[i].variant.(runtime.Type_Info_Multi_Pointer).elem - t_size := uintptr(t.size) - if reflect.is_any(t) { - io.write_string(fi.writer, "any{}", &fi.n) - } else { - field_ptr := (^^byte)(uintptr(v.data) + info.offsets[i])^ - data := rawptr(uintptr(field_ptr) + index*t_size) - fmt_arg(fi, any{data, t.id}, verb) - } - } - - if hash { io.write_string(fi.writer, ",\n", &fi.n) } - } - } - - if hash && n > 0 { - for _ in 0..", &fi.n) + return + } + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&') + fmt_value(fi, a, verb) + return + } + + case runtime.Type_Info_Struct, + runtime.Type_Info_Union, + runtime.Type_Info_Bit_Field: + if ptr == nil { + io.write_string(fi.writer, "", &fi.n) + return + } + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + } + } + } + fmt_pointer(fi, ptr, verb) + } +} + +@(private) +fmt_multi_pointer :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Multi_Pointer, verb: rune) { + ptr := (^rawptr)(v.data)^ + if ptr == nil { + io.write_string(fi.writer, "", &fi.n) + return + } + if verb != 'p' && info.elem != nil { + a := any{ptr, info.elem.id} + + elem := runtime.type_info_base(info.elem) + if elem != nil { + if n, ok := fi.optional_len.?; ok { + fi.optional_len = nil + fmt_array(fi, ptr, n, elem.size, elem, verb) + return + } else if fi.use_nul_termination { + fi.use_nul_termination = false + fmt_array_nul_terminated(fi, ptr, -1, elem.size, elem, verb) + return + } + + #partial switch &e in elem.variant { + case runtime.Type_Info_Integer: + switch verb { + case 's', 'q': + switch elem.id { + case u8: + fmt_cstring(fi, cstring(ptr), verb) + return + case u16, u32, rune: + n := search_nul_termination(ptr, elem.size, -1) + fmt_array(fi, ptr, n, elem.size, elem, verb) + return + } + } + + case runtime.Type_Info_Array, + runtime.Type_Info_Slice, + runtime.Type_Info_Dynamic_Array, + runtime.Type_Info_Map: + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + + case runtime.Type_Info_Struct, + runtime.Type_Info_Union: + if fi.indirection_level < 1 { + fi.indirection_level += 1 + defer fi.indirection_level -= 1 + io.write_byte(fi.writer, '&', &fi.n) + fmt_value(fi, a, verb) + return + } + } + } + } + fmt_pointer(fi, ptr, verb) +} + +fmt_enumerated_array :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Enumerated_Array, verb: rune) { + fi.record_level += 1 + defer fi.record_level -= 1 + + if fi.hash { + io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) + io.write_byte(fi.writer, '\n', &fi.n) + defer { + fmt_write_indent(fi) + io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) + } + indent := fi.indent + fi.indent += 1 + defer fi.indent = indent + + for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } + + idx, ok := stored_enum_value_to_string(info.index, info.min_value, i) + if ok { + io.write_byte(fi.writer, '.', &fi.n) + io.write_string(fi.writer, idx, &fi.n) + } else { + io.write_i64(fi.writer, i64(info.min_value)+i64(i), 10, &fi.n) + } + io.write_string(fi.writer, " = ", &fi.n) + + data := uintptr(v.data) + uintptr(i*info.elem_size) + fmt_arg(fi, any{rawptr(data), info.elem.id}, verb) + } + } +} + +fmt_map :: proc(fi: ^Info, v: any, info: runtime.Type_Info_Map, verb: rune) { + switch verb { + case: + fmt_bad_verb(fi, verb) + case 'v', 'w': + if verb == 'v' { + io.write_string(fi.writer, "map", &fi.n) + } + io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) + defer io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) + + + hash := fi.hash; defer fi.hash = hash + indent := fi.indent; defer fi.indent -= 1 + do_trailing_comma := hash + + fi.indent += 1 + if hash { + io.write_byte(fi.writer, '\n', &fi.n) + } + defer { + if hash { + for _ in 0.. 0 { io.write_string(fi.writer, ", ") } + if hash { + fmt_write_indent(fi) + } + j += 1 + + key := runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index) + value := runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index) + + fmt_arg(&Info{writer = fi.writer}, any{rawptr(key), info.key.id}, verb) + if hash { + io.write_string(fi.writer, " = ", &fi.n) + } else { + io.write_string(fi.writer, "=", &fi.n) + } + fmt_arg(fi, any{rawptr(value), info.value.id}, verb) + + if do_trailing_comma { io.write_string(fi.writer, ",\n", &fi.n) } + } + } + } + +} // Formats a value based on its type and formatting verb // @@ -2872,184 +3106,35 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { type_info := type_info_of(v.id) switch &info in type_info.variant { - case runtime.Type_Info_Any: // Ignore - case runtime.Type_Info_Parameters: // Ignore + case runtime.Type_Info_Any: + // Ignore + case runtime.Type_Info_Parameters: + // Ignore case runtime.Type_Info_Named: fmt_named(fi, v, verb, info) - case runtime.Type_Info_Boolean: fmt_arg(fi, v, verb) - case runtime.Type_Info_Integer: fmt_arg(fi, v, verb) - case runtime.Type_Info_Rune: fmt_arg(fi, v, verb) - case runtime.Type_Info_Float: fmt_arg(fi, v, verb) - case runtime.Type_Info_Complex: fmt_arg(fi, v, verb) - case runtime.Type_Info_Quaternion: fmt_arg(fi, v, verb) - case runtime.Type_Info_String: fmt_arg(fi, v, verb) + case runtime.Type_Info_Boolean, + runtime.Type_Info_Integer, + runtime.Type_Info_Rune, + runtime.Type_Info_Float, + runtime.Type_Info_Complex, + runtime.Type_Info_Quaternion, + runtime.Type_Info_String: + fmt_arg(fi, v, verb) case runtime.Type_Info_Pointer: - if v.id == typeid_of(^runtime.Type_Info) { - reflect.write_type(fi.writer, (^^runtime.Type_Info)(v.data)^, &fi.n) - } else { - ptr := (^rawptr)(v.data)^ - if verb != 'p' && info.elem != nil { - a := any{ptr, info.elem.id} - - elem := runtime.type_info_base(info.elem) - if elem != nil { - #partial switch &e in elem.variant { - case runtime.Type_Info_Array, - runtime.Type_Info_Slice, - runtime.Type_Info_Dynamic_Array, - runtime.Type_Info_Map: - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&') - fmt_value(fi, a, verb) - return - } - - case runtime.Type_Info_Struct, - runtime.Type_Info_Union, - runtime.Type_Info_Bit_Field: - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - } - } - } - fmt_pointer(fi, ptr, verb) - } + fmt_pointer_from_value(fi, v, info, verb) case runtime.Type_Info_Soa_Pointer: ptr := (^runtime.Raw_Soa_Pointer)(v.data)^ fmt_soa_pointer(fi, ptr, verb) case runtime.Type_Info_Multi_Pointer: - ptr := (^rawptr)(v.data)^ - if ptr == nil { - io.write_string(fi.writer, "", &fi.n) - return - } - if verb != 'p' && info.elem != nil { - a := any{ptr, info.elem.id} - - elem := runtime.type_info_base(info.elem) - if elem != nil { - if n, ok := fi.optional_len.?; ok { - fi.optional_len = nil - fmt_array(fi, ptr, n, elem.size, elem, verb) - return - } else if fi.use_nul_termination { - fi.use_nul_termination = false - fmt_array_nul_terminated(fi, ptr, -1, elem.size, elem, verb) - return - } - - #partial switch &e in elem.variant { - case runtime.Type_Info_Integer: - switch verb { - case 's', 'q': - switch elem.id { - case u8: - fmt_cstring(fi, cstring(ptr), verb) - return - case u16, u32, rune: - n := search_nul_termination(ptr, elem.size, -1) - fmt_array(fi, ptr, n, elem.size, elem, verb) - return - } - } - - case runtime.Type_Info_Array, - runtime.Type_Info_Slice, - runtime.Type_Info_Dynamic_Array, - runtime.Type_Info_Map: - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - - case runtime.Type_Info_Struct, - runtime.Type_Info_Union: - if fi.indirection_level < 1 { - fi.indirection_level += 1 - defer fi.indirection_level -= 1 - io.write_byte(fi.writer, '&', &fi.n) - fmt_value(fi, a, verb) - return - } - } - } - } - fmt_pointer(fi, ptr, verb) + fmt_multi_pointer(fi, v, info, verb) case runtime.Type_Info_Enumerated_Array: - fi.record_level += 1 - defer fi.record_level -= 1 - - if fi.hash { - io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) - io.write_byte(fi.writer, '\n', &fi.n) - defer { - fmt_write_indent(fi) - io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) - } - indent := fi.indent - fi.indent += 1 - defer fi.indent = indent - - for i in 0.. 0 { io.write_string(fi.writer, ", ", &fi.n) } - - idx, ok := stored_enum_value_to_string(info.index, info.min_value, i) - if ok { - io.write_byte(fi.writer, '.', &fi.n) - io.write_string(fi.writer, idx, &fi.n) - } else { - io.write_i64(fi.writer, i64(info.min_value)+i64(i), 10, &fi.n) - } - io.write_string(fi.writer, " = ", &fi.n) - - data := uintptr(v.data) + uintptr(i*info.elem_size) - fmt_arg(fi, any{rawptr(data), info.elem.id}, verb) - } - } + fmt_enumerated_array(fi, v, info, verb) case runtime.Type_Info_Array: n := info.count @@ -3104,63 +3189,7 @@ fmt_value :: proc(fi: ^Info, v: any, verb: rune) { case runtime.Type_Info_Map: - switch verb { - case: - fmt_bad_verb(fi, verb) - case 'v', 'w': - if verb == 'v' { - io.write_string(fi.writer, "map", &fi.n) - } - io.write_byte(fi.writer, '[' if verb != 'w' else '{', &fi.n) - defer io.write_byte(fi.writer, ']' if verb != 'w' else '}', &fi.n) - - - hash := fi.hash; defer fi.hash = hash - indent := fi.indent; defer fi.indent -= 1 - do_trailing_comma := hash - - fi.indent += 1 - if hash { - io.write_byte(fi.writer, '\n', &fi.n) - } - defer { - if hash { - for _ in 0.. 0 { io.write_string(fi.writer, ", ") } - if hash { - fmt_write_indent(fi) - } - j += 1 - - key := runtime.map_cell_index_dynamic(ks, info.map_info.ks, bucket_index) - value := runtime.map_cell_index_dynamic(vs, info.map_info.vs, bucket_index) - - fmt_arg(&Info{writer = fi.writer}, any{rawptr(key), info.key.id}, verb) - if hash { - io.write_string(fi.writer, " = ", &fi.n) - } else { - io.write_string(fi.writer, "=", &fi.n) - } - fmt_arg(fi, any{rawptr(value), info.value.id}, verb) - - if do_trailing_comma { io.write_string(fi.writer, ",\n", &fi.n) } - } - } - } + fmt_map(fi, v, info, verb) case runtime.Type_Info_Struct: fmt_struct(fi, v, verb, info, "") From de761cbdd39ed4ba036fc42c4b572abdd9da88d3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 11:53:01 +0000 Subject: [PATCH 024/212] Remove temporary tuple fix alloca instructions if they are never used --- src/llvm_backend_opt.cpp | 10 +++++++++- src/llvm_backend_proc.cpp | 9 --------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 4971b1f10..4131f32bf 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -309,7 +309,15 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) { // NOTE(bill): Explicit instructions are set here because some instructions could have side effects switch (LLVMGetInstructionOpcode(curr_instr)) { - // case LLVMAlloca: + case LLVMAlloca: + if (map_get(&p->tuple_fix_map, curr_instr) != nullptr) { + // NOTE(bill, 2025-12-27): Remove temporary tuple fix alloca instructions + // if they are never used + removal_count += 1; + LLVMInstructionEraseFromParent(curr_instr); + was_dead_instructions = true; + } + break; case LLVMLoad: if (LLVMGetVolatile(curr_instr)) { break; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 27167aefd..216d600da 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1212,15 +1212,6 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } tuple_fix_values[ret_count-1] = result; - #if 0 - for (isize j = 0; j < ret_count; j++) { - tuple_geps[j] = lb_emit_struct_ep(p, result_ptr, cast(i32)j); - } - for (isize j = 0; j < ret_count; j++) { - lb_emit_store(p, tuple_geps[j], tuple_fix_values[j]); - } - #endif - result = lb_emit_load(p, result_ptr); lbTupleFix tf = {tuple_fix_values}; From 4e40b808c4ab5f29fe6c50c9dccbf4acd99c8c45 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 12:42:52 +0000 Subject: [PATCH 025/212] Split of the built-in custom formatters to improve code generation --- core/fmt/fmt.odin | 314 ++++++++++++++++++++++++---------------------- 1 file changed, 162 insertions(+), 152 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 27168d6c2..059413787 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2447,6 +2447,166 @@ fmt_array :: proc(fi: ^Info, data: rawptr, n: int, elem_size: int, elem: ^reflec fmt_write_array(fi, data, n, elem_size, elem.id, verb) } } + + +@(private) +fmt_named_buitlin_custom_formatters :: proc(fi: ^Info, v: any, verb: rune, info: runtime.Type_Info_Named) -> bool { + switch a in v { + case runtime.Source_Code_Location: + io.write_string(fi.writer, a.file_path, &fi.n) + + when ODIN_ERROR_POS_STYLE == .Default { + io.write_byte(fi.writer, '(', &fi.n) + io.write_int(fi.writer, int(a.line), 10, &fi.n) + if a.column != 0 { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.column), 10, &fi.n) + } + io.write_byte(fi.writer, ')', &fi.n) + } else when ODIN_ERROR_POS_STYLE == .Unix { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.line), 10, &fi.n) + if a.column != 0 { + io.write_byte(fi.writer, ':', &fi.n) + io.write_int(fi.writer, int(a.column), 10, &fi.n) + } + io.write_byte(fi.writer, ':', &fi.n) + } else { + #panic("Unhandled ODIN_ERROR_POS_STYLE") + } + return true + + case time.Duration: + ffrac :: proc(buf: []byte, v: u64, prec: int) -> (nw: int, nv: u64) { + v := v + w := len(buf) + print := false + for _ in 0.. int { + v := v + w := len(buf) + if v == 0 { + w -= 1 + buf[w] = '0' + } else { + for v > 0 { + w -= 1 + buf[w] = byte(v%10) + '0' + v /= 10 + } + } + return w + } + + buf: [32]byte + w := len(buf) + u := u64(a) + neg := a < 0 + if neg { + u = -u + } + + if u < u64(time.Second) { + prec: int + w -= 1 + buf[w] = 's' + w -= 1 + switch { + case u == 0: + io.write_string(fi.writer, "0s", &fi.n) + return true + case u < u64(time.Microsecond): + prec = 0 + buf[w] = 'n' + case u < u64(time.Millisecond): + prec = 3 + // U+00B5 'µ' micro sign == 0xC2 0xB5 + w -= 1 // Need room for two bytes + copy(buf[w:], "µ") + case: + prec = 6 + buf[w] = 'm' + } + w, u = ffrac(buf[:w], u, prec) + w = fint(buf[:w], u) + } else { + w -= 1 + buf[w] = 's' + w, u = ffrac(buf[:w], u, 9) + w = fint(buf[:w], u%60) + u /= 60 + if u > 0 { + w -= 1 + buf[w] = 'm' + w = fint(buf[:w], u%60) + u /= 60 + if u > 0 { + w -= 1 + buf[w] = 'h' + w = fint(buf[:w], u) + } + } + } + + if neg { + w -= 1 + buf[w] = '-' + } + io.write_string(fi.writer, string(buf[w:]), &fi.n) + return true + + case time.Time: + write_padded_number :: proc(fi: ^Info, i: i64, width: int) { + n := width-1 + for x := i; x >= 10; x /= 10 { + n -= 1 + } + for _ in 0..= 10; x /= 10 { - n -= 1 - } - for _ in 0.. (nw: int, nv: u64) { - v := v - w := len(buf) - print := false - for _ in 0.. int { - v := v - w := len(buf) - if v == 0 { - w -= 1 - buf[w] = '0' - } else { - for v > 0 { - w -= 1 - buf[w] = byte(v%10) + '0' - v /= 10 - } - } - return w - } - - buf: [32]byte - w := len(buf) - u := u64(a) - neg := a < 0 - if neg { - u = -u - } - - if u < u64(time.Second) { - prec: int - w -= 1 - buf[w] = 's' - w -= 1 - switch { - case u == 0: - io.write_string(fi.writer, "0s", &fi.n) - return - case u < u64(time.Microsecond): - prec = 0 - buf[w] = 'n' - case u < u64(time.Millisecond): - prec = 3 - // U+00B5 'µ' micro sign == 0xC2 0xB5 - w -= 1 // Need room for two bytes - copy(buf[w:], "µ") - case: - prec = 6 - buf[w] = 'm' - } - w, u = ffrac(buf[:w], u, prec) - w = fint(buf[:w], u) - } else { - w -= 1 - buf[w] = 's' - w, u = ffrac(buf[:w], u, 9) - w = fint(buf[:w], u%60) - u /= 60 - if u > 0 { - w -= 1 - buf[w] = 'm' - w = fint(buf[:w], u%60) - u /= 60 - if u > 0 { - w -= 1 - buf[w] = 'h' - w = fint(buf[:w], u) - } - } - } - - if neg { - w -= 1 - buf[w] = '-' - } - io.write_string(fi.writer, string(buf[w:]), &fi.n) - return - - case time.Time: - t := a - y, mon, d := time.date(t) - h, min, s := time.clock(t) - ns := (t._nsec - (t._nsec/1e9 + time.UNIX_TO_ABSOLUTE)*1e9) % 1e9 - write_padded_number(fi, i64(y), 4) - io.write_byte(fi.writer, '-', &fi.n) - write_padded_number(fi, i64(mon), 2) - io.write_byte(fi.writer, '-', &fi.n) - write_padded_number(fi, i64(d), 2) - io.write_byte(fi.writer, ' ', &fi.n) - - write_padded_number(fi, i64(h), 2) - io.write_byte(fi.writer, ':', &fi.n) - write_padded_number(fi, i64(min), 2) - io.write_byte(fi.writer, ':', &fi.n) - write_padded_number(fi, i64(s), 2) - io.write_byte(fi.writer, '.', &fi.n) - write_padded_number(fi, (ns), 9) - io.write_string(fi.writer, " +0000 UTC", &fi.n) - return - } + if verb != 'w' && fmt_named_buitlin_custom_formatters(fi, v, verb, info) { + return } #partial switch &b in info.base.variant { From 14a60adefe005d09066f420b1a24f11e365d9cec Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 27 Dec 2025 12:48:25 +0000 Subject: [PATCH 026/212] LLVM IR: Improve type switch case names for better debuggability when generating LLVM IR --- src/llvm_backend_stmt.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 3dbcea4fb..a8cc459c3 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1962,7 +1962,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss num_cases += cc->list.count; if (cc->list.count == 0) { GB_ASSERT(default_block == nullptr); - default_block = lb_create_block(p, "typeswitch.default.body"); + default_block = lb_create_block(p, "typeswitch.case.default"); else_block = default_block; } } @@ -2042,7 +2042,16 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss continue; } - lbBlock *body = lb_create_block(p, "typeswitch.body"); + char const *body_name = "typeswitch.case"; + + if (!are_types_identical(case_entity->type, parent_base_type)) { + gbString canonical_name = temp_canonical_string(case_entity->type); + gbString bn = gb_string_make(heap_allocator(), "typeswitch.case."); + bn = gb_string_append_length(bn, canonical_name, gb_string_length(canonical_name)); + body_name = cast(char const *)bn; + } + + lbBlock *body = lb_create_block(p, body_name); if (p->debug_info != nullptr) { LLVMSetCurrentDebugLocation2(p->builder, lb_debug_location_from_ast(p, clause)); } From 33352ed6cb15904021ff60c6e44fcb374a660400 Mon Sep 17 00:00:00 2001 From: bplu4t2f Date: Sat, 27 Dec 2025 17:04:30 +0100 Subject: [PATCH 027/212] Add user32 scroll bar related bindings, and FrameRect --- core/sys/windows/user32.odin | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 76826f80b..11c01db25 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -279,6 +279,7 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- @@ -321,6 +322,11 @@ foreign user32 { SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- EmptyClipboard :: proc() -> BOOL --- + + SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- + GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- + ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- + EnableScrollBar :: proc(hwnd: HWND, wSBflags: UINT, wArrows: UINT) -> BOOL --- } CreateWindowW :: #force_inline proc "system" ( @@ -874,3 +880,56 @@ LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW LWA_COLORKEY :: 0x1 LWA_ALPHA :: 0x2 + +SCROLLINFO :: struct { + cbSize: UINT, + fMask: UINT, + nMin: c_int, + nMax: c_int, + nPage: UINT, + nPos: c_int, + nTrackPos: c_int, +} +LPSCROLLINFO :: ^SCROLLINFO + +// Scroll Bar Constants +SB_MIN :: 0 +SB_HORZ :: 0 +SB_VERT :: 1 +SB_CTL :: 2 +SB_BOTH :: 3 + +// Scroll Bar Commands +SB_LINEUP :: 0 +SB_LINELEFT :: 0 +SB_LINEDOWN :: 1 +SB_LINERIGHT :: 1 +SB_PAGEUP :: 2 +SB_PAGELEFT :: 2 +SB_PAGEDOWN :: 3 +SB_PAGERIGHT :: 3 +SB_THUMBPOSITION :: 4 +SB_THUMBTRACK :: 5 +SB_TOP :: 6 +SB_LEFT :: 6 +SB_BOTTOM :: 7 +SB_RIGHT :: 7 +SB_ENDSCROLL :: 8 + +// Constants for SCROLLINFO.fMask +SIF_RANGE :: 0x0001 +SIF_PAGE :: 0x0002 +SIF_POS :: 0x0004 +SIF_DISABLENOSCROLL :: 0x0008 +SIF_TRACKPOS :: 0x0010 +SIF_ALL :: (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS) + +// EnableScrollBar() flags +ESB_ENABLE_BOTH :: 0x0000 +ESB_DISABLE_BOTH :: 0x0003 +ESB_DISABLE_LEFT :: 0x0001 +ESB_DISABLE_RIGHT :: 0x0002 +ESB_DISABLE_UP :: 0x0001 +ESB_DISABLE_DOWN :: 0x0002 +ESB_DISABLE_LTUP :: ESB_DISABLE_LEFT +ESB_DISABLE_RTDN :: ESB_DISABLE_RIGHT From 39fa1b72015d25e738c6228b438e965cff7eef72 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 28 Dec 2025 11:52:31 +0000 Subject: [PATCH 028/212] LLVM IR: Improve basic block names for trivial switch statements for debuggability --- src/llvm_backend_stmt.cpp | 41 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index a8cc459c3..90b9c0204 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1720,7 +1720,46 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * Ast *clause = body->stmts[i]; ast_node(cc, CaseClause, clause); - body_blocks[i] = lb_create_block(p, cc->list.count == 0 ? "switch.default.body" : "switch.case.body"); + char const *block_name = cc->list.count == 0 ? "switch.default.body" : "switch.case.body"; + + if (is_trivial && cc->list.count >= 1) { + gbString bn = gb_string_make(heap_allocator(), "switch.case."); + + Ast *first = cc->list[0]; + if (first->tav.mode == Addressing_Type) { + bn = gb_string_appendc(bn, "type."); + } else if (is_type_rune(first->tav.type)) { + bn = gb_string_appendc(bn, "rune."); + } else { + bn = gb_string_appendc(bn, "value."); + } + + for_array(i, cc->list) { + if (i > 0) { + bn = gb_string_appendc(bn, ".."); + } + + Ast *expr = cc->list[i]; + if (expr->tav.mode == Addressing_Type) { + bn = write_type_to_string(bn, expr->tav.type, false); + } else { + ExactValue value = expr->tav.value; + if (is_type_rune(expr->tav.type) && value.kind == ExactValue_Integer) { + + Rune r = cast(Rune)exact_value_to_i64(value); + u8 rune_temp[6] = {}; + isize size = gb_utf8_encode_rune(rune_temp, r); + bn = gb_string_append_length(bn, rune_temp, size); + } else { + bn = write_exact_value_to_string(bn, value, 1024); + } + } + } + + block_name = cast(char const *)bn; + } + + body_blocks[i] = lb_create_block(p, block_name); if (cc->list.count == 0) { default_block = body_blocks[i]; } From f1e29fadabc9168206938a8ff3c58d7cfc0b8cbb Mon Sep 17 00:00:00 2001 From: DarathDev Date: Sun, 28 Dec 2025 14:46:45 -0700 Subject: [PATCH 029/212] Add missing 'caller_location' to several procedures in 'slice' package --- core/slice/map.odin | 16 ++++++++-------- core/slice/permute.odin | 3 ++- core/slice/slice.odin | 32 ++++++++++++++++---------------- core/slice/sort.odin | 16 ++++++++-------- 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/core/slice/map.odin b/core/slice/map.odin index c68488d26..fafbb55ee 100644 --- a/core/slice/map.odin +++ b/core/slice/map.odin @@ -6,8 +6,8 @@ import "base:runtime" _ :: intrinsics _ :: runtime -map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K, err: runtime.Allocator_Error) { - keys = make(type_of(keys), len(m), allocator) or_return +map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (keys: []K, err: runtime.Allocator_Error) { + keys = make(type_of(keys), len(m), allocator, loc) or_return i := 0 for key in m { keys[i] = key @@ -15,8 +15,8 @@ map_keys :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (keys: []K, } return } -map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (values: []V, err: runtime.Allocator_Error) { - values = make(type_of(values), len(m), allocator) or_return +map_values :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (values: []V, err: runtime.Allocator_Error) { + values = make(type_of(values), len(m), allocator, loc) or_return i := 0 for _, value in m { values[i] = value @@ -37,8 +37,8 @@ Map_Entry_Info :: struct($Key, $Value: typeid) { } -map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) { - entries = make(type_of(entries), len(m), allocator) or_return +map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry(K, V), err: runtime.Allocator_Error) { + entries = make(type_of(entries), len(m), allocator, loc) or_return i := 0 for key, value in m { entries[i].key = key @@ -48,13 +48,13 @@ map_entries :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries return } -map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check { +map_entry_infos :: proc(m: $M/map[$K]$V, allocator := context.allocator, loc := #caller_location) -> (entries: []Map_Entry_Info(K, V), err: runtime.Allocator_Error) #no_bounds_check { m := m rm := (^runtime.Raw_Map)(&m) info := runtime.type_info_base(type_info_of(M)).variant.(runtime.Type_Info_Map) if info.map_info != nil { - entries = make(type_of(entries), len(m), allocator) or_return + entries = make(type_of(entries), len(m), allocator, loc) or_return map_cap := uintptr(cap(m)) ks, vs, hs, _, _ := runtime.map_kvh_data_dynamic(rm^, info.map_info) diff --git a/core/slice/permute.odin b/core/slice/permute.odin index 42b6d4129..280989e47 100644 --- a/core/slice/permute.odin +++ b/core/slice/permute.odin @@ -29,12 +29,13 @@ Returns: make_permutation_iterator :: proc( slice: []$T, allocator := context.allocator, + loc := #caller_location, ) -> ( iter: Permutation_Iterator(T), error: runtime.Allocator_Error, ) #optional_allocator_error { iter.slice = slice - iter.counters = make([]int, len(iter.slice), allocator) or_return + iter.counters = make([]int, len(iter.slice), allocator, loc) or_return return } diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 4e3289321..58d35b9f0 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -454,7 +454,7 @@ swap_with_slice :: proc(a, b: $T/[]$E, loc := #caller_location) { } @(require_results) -concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error { +concatenate :: proc(a: []$T/[]$E, allocator := context.allocator, loc := #caller_location) -> (res: T, err: runtime.Allocator_Error) #optional_allocator_error { if len(a) == 0 { return } @@ -462,7 +462,7 @@ concatenate :: proc(a: []$T/[]$E, allocator := context.allocator) -> (res: T, er for s in a { n += len(s) } - res = make(T, n, allocator) or_return + res = make(T, n, allocator, loc) or_return i := 0 for s in a { i += copy(res[i:], s) @@ -584,8 +584,8 @@ as_ptr :: proc "contextless" (array: $T/[]$E) -> [^]E { @(require_results) -mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error { - r = make([]V, len(s), allocator) or_return +mapper :: proc(s: $S/[]$U, f: proc(U) -> $V, allocator := context.allocator, loc := #caller_location) -> (r: []V, err: runtime.Allocator_Error) #optional_allocator_error { + r = make([]V, len(s), allocator, loc) or_return for v, i in s { r[i] = f(v) } @@ -611,33 +611,33 @@ reduce_reverse :: proc(s: $S/[]$U, initializer: $V, f: proc(V, U) -> V) -> V { } @(require_results) -filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { - r := make([dynamic]U, 0, 0, allocator) or_return +filter :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { + r := make([dynamic]U, 0, 0, allocator, loc) or_return for v in s { if f(v) { - append(&r, v) + append(&r, v, loc) } } return r[:], nil } @(require_results) -filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { - r := make([dynamic]U, 0, 0, allocator) or_return +filter_reverse :: proc(s: $S/[]$U, f: proc(U) -> bool, allocator := context.allocator, loc := #caller_location) -> (res: S, err: runtime.Allocator_Error) #optional_allocator_error { + r := make([dynamic]U, 0, 0, allocator, loc) or_return for i := len(s)-1; i >= 0; i -= 1 { #no_bounds_check v := s[i] if f(v) { - append(&r, v) + append(&r, v, loc) } } return r[:], nil } @(require_results) -scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error { +scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := context.allocator, loc := #caller_location) -> (res: []V, err: runtime.Allocator_Error) #optional_allocator_error { if len(s) == 0 { return } - res = make([]V, len(s), allocator) or_return + res = make([]V, len(s), allocator, loc) or_return p := as_ptr(s) q := as_ptr(res) r := initializer @@ -654,14 +654,14 @@ scanner :: proc (s: $S/[]$U, initializer: $V, f: proc(V, U) -> V, allocator := c @(require_results) -repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error { +repeat :: proc(s: $S/[]$U, count: int, allocator := context.allocator, loc := #caller_location) -> (b: S, err: runtime.Allocator_Error) #optional_allocator_error { if count < 0 { panic("slice: negative repeat count") } else if count > 0 && (len(s)*count)/count != len(s) { panic("slice: repeat count will cause an overflow") } - b = make(S, len(s)*count, allocator) or_return + b = make(S, len(s)*count, allocator, loc) or_return i := copy(b, s) for i < len(b) { // 2^N trick to reduce the need to copy copy(b[i:], b[:i]) @@ -918,8 +918,8 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher // e.g.: // sl := slice.bitset_to_enum_slice(bs) @(require_results) -bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { - buf := make([]E, card(bs), allocator) +bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator, loc := #caller_location) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { + buf := make([]E, card(bs), allocator, loc) return bitset_to_enum_slice(buf, bs) } diff --git a/core/slice/sort.odin b/core/slice/sort.odin index a9f8c1067..d438cfc1b 100644 --- a/core/slice/sort.odin +++ b/core/slice/sort.odin @@ -54,9 +54,9 @@ sort :: proc(data: $T/[]$E) where ORD(E) { sort_by_indices :: proc{ sort_by_indices_allocate, _sort_by_indices} -sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator) -> (sorted: T) { +sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator, loc := #caller_location) -> (sorted: T) { assert(len(data) == len(indices)) - sorted = make(T, len(data), allocator) + sorted = make(T, len(data), allocator, loc) for v, i in indices { sorted[i] = data[v] } @@ -100,8 +100,8 @@ sort_from_permutation_indices :: proc(data: $T/[]$E, indices: []int) { // sort sorts a slice and returns a slice of the original indices // This sort is not guaranteed to be stable -sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator) -> (indices: []int) where ORD(E) { - indices = make([]int, len(data), allocator) +sort_with_indices :: proc(data: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> (indices: []int) where ORD(E) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { @@ -173,8 +173,8 @@ sort_by_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) // sort_by sorts a slice with a given procedure to test whether two values are ordered "i < j" // This sort is not guaranteed to be stable -sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator) -> (indices : []int) { - indices = make([]int, len(data), allocator) +sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocator := context.allocator, loc := #caller_location) -> (indices : []int) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { @@ -205,8 +205,8 @@ sort_by_with_indices :: proc(data: $T/[]$E, less: proc(i, j: E) -> bool, allocat return indices } -sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator) -> (indices : []int) { - indices = make([]int, len(data), allocator) +sort_by_with_indices_with_data :: proc(data: $T/[]$E, less: proc(i, j: E, user_data: rawptr) -> bool, user_data: rawptr, allocator := context.allocator, loc := #caller_location) -> (indices : []int) { + indices = make([]int, len(data), allocator, loc) when size_of(E) != 0 { if n := len(data); n > 1 { for _, idx in indices { From 6441fc09e0c540260cfad3f3a271811fe8423fc4 Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Mon, 29 Dec 2025 15:27:58 +0100 Subject: [PATCH 030/212] Fix standard json parsing / unmarshalling issue for pure arrays --- core/encoding/json/parser.odin | 14 +++++++------- core/encoding/json/validator.odin | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin index d6c3df7c6..cd6518955 100644 --- a/core/encoding/json/parser.odin +++ b/core/encoding/json/parser.odin @@ -38,7 +38,7 @@ parse_string :: proc(data: string, spec := DEFAULT_SPECIFICATION, parse_integers switch p.spec { case .JSON: - return parse_object(&p, loc) + return parse_value(&p, loc) case .JSON5: return parse_value(&p, loc) case .SJSON: @@ -84,7 +84,7 @@ expect_token :: proc(p: ^Parser, kind: Token_Kind) -> Error { parse_colon :: proc(p: ^Parser) -> (err: Error) { - colon_err := expect_token(p, .Colon) + colon_err := expect_token(p, .Colon) if colon_err == nil { return nil } @@ -133,13 +133,13 @@ parse_value :: proc(p: ^Parser, loc := #caller_location) -> (value: Value, err: f, _ := strconv.parse_f64(token.text) value = Float(f) return - + case .Ident: if p.spec == .MJSON { advance_token(p) return clone_string(token.text, p.allocator, loc) } - + case .String: advance_token(p) return unquote_string(token, p.spec, p.allocator, loc) @@ -192,7 +192,7 @@ parse_array :: proc(p: ^Parser, loc := #caller_location) -> (value: Value, err: for p.curr_token.kind != .Close_Bracket { elem := parse_value(p, loc) or_return append(&array, elem, loc) - + if parse_comma(p) { break } @@ -278,7 +278,7 @@ parse_object_body :: proc(p: ^Parser, end_token: Token_Kind, loc := #caller_loca if parse_comma(p) { break } - } + } return obj, .None } @@ -481,4 +481,4 @@ unquote_string :: proc(token: Token, spec: Specification, allocator := context.a } return string(b[:w]), nil -} \ No newline at end of file +} diff --git a/core/encoding/json/validator.odin b/core/encoding/json/validator.odin index a6873319d..e90270335 100644 --- a/core/encoding/json/validator.odin +++ b/core/encoding/json/validator.odin @@ -5,10 +5,10 @@ import "core:mem" // NOTE(bill): is_valid will not check for duplicate keys is_valid :: proc(data: []byte, spec := DEFAULT_SPECIFICATION, parse_integers := false) -> bool { p := make_parser(data, spec, parse_integers, mem.nil_allocator()) - + switch p.spec { case .JSON: - return validate_object(&p) + return validate_value(&p) case .JSON5: return validate_value(&p) case .MJSON: @@ -52,7 +52,7 @@ validate_object :: proc(p: ^Parser) -> bool { if err := expect_token(p, .Open_Brace); err != .None { return false } - + validate_object_body(p, .Close_Brace) or_return if err := expect_token(p, .Close_Brace); err != .None { @@ -102,7 +102,7 @@ validate_value :: proc(p: ^Parser) -> bool { case .Open_Bracket: return validate_array(p) - + case .Ident: if p.spec == .MJSON { advance_token(p) From 3f9aefda202f9677987d72c0be52417772315edc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 17:34:01 +0100 Subject: [PATCH 031/212] Added CheckFramebufferStatus to WebGL bindings --- core/sys/wasm/js/odin.js | 3 +++ vendor/wasm/WebGL/webgl.odin | 1 + 2 files changed, 4 insertions(+) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 0c617dd8e..e90ccc124 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -616,6 +616,9 @@ class WebGLInterface { FramebufferTexture2D: (target, attachment, textarget, texture, level) => { this.ctx.framebufferTexture2D(target, attachment, textarget, this.textures[texture], level); }, + CheckFramebufferStatus: (target) => { + return this.ctx.checkFramebufferStatus(target) + }, FrontFace: (mode) => { this.ctx.frontFace(mode); }, diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin index 601071c3a..d607ec743 100644 --- a/vendor/wasm/WebGL/webgl.odin +++ b/vendor/wasm/WebGL/webgl.odin @@ -113,6 +113,7 @@ foreign webgl { Flush :: proc() --- FramebufferRenderbuffer :: proc(target, attachment, renderbufertarget: Enum, renderbuffer: Renderbuffer) --- FramebufferTexture2D :: proc(target, attachment, textarget: Enum, texture: Texture, level: i32) --- + CheckFramebufferStatus :: proc(target: Enum) -> Enum --- FrontFace :: proc(mode: Enum) --- GenerateMipmap :: proc(target: Enum) --- From fb52238e369dc5c1712d2eca2c787473af59bca3 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 17:42:19 +0100 Subject: [PATCH 032/212] Fix bugs in odin.js:GetActiveUniformBlockName --- core/sys/wasm/js/odin.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index e90ccc124..063fd990c 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -1304,17 +1304,21 @@ class WebGLInterface { this.assertWebGL2(); return this.ctx.getUniformBlockIndex(this.programs[program], this.mem.loadString(uniformBlockName_ptr, uniformBlockName_len)); }, - GetActiveUniformBlockName: (program, uniformBlockIndex, buf_ptr, buf_len, length_ptr) => { + GetActiveUniformBlockName: (program, uniformBlockIndex, name_buf_ptr, name_buf_len, name_length_ptr) => { this.assertWebGL2(); let name = this.ctx.getActiveUniformBlockName(this.programs[program], uniformBlockIndex); - let n = Math.min(buf_len, name.length); - name = name.substring(0, n); - this.mem.loadBytes(buf_ptr, buf_len).set(new TextEncoder().encode(name)) - this.mem.storeInt(length_ptr, n); + if (name_buf_ptr && name_buf_len > 0) { + let n = Math.min(name_buf_len, name.length); + name = name.substring(0, n); + this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name)); + this.mem.storeInt(name_length_ptr, n); + } else if (name_length_ptr) { + this.mem.storeInt(name_length_ptr, name.length); + } }, GetActiveUniforms: (program, uniformIndices_ptr, uniformIndices_len, pname, res_ptr) => { - thid.assertWebGL2(); + this.assertWebGL2(); let indices = this.mem.loadU32Array(uniformIndices_ptr, uniformIndices_len); this.ctx.getActiveUniforms(this.programs[program], indices, pname) this.mem.loadI32Array(res_ptr, indices.length).set(indices) @@ -1323,7 +1327,7 @@ class WebGLInterface { this.assertWebGL2(); let res = this.ctx.getActiveUniformBlockParameter(this.programs[program], uniformBlockIndex, pname); - if (e instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES + if (res instanceof Uint32Array) { // for pname GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES this.mem.loadU32Array(params_ptr, res.length).set(res) } else { this.mem.storeI32(params_ptr, res) From 23984dc11019674aa00f08c533547d3c690425ac Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 29 Dec 2025 18:57:42 +0100 Subject: [PATCH 033/212] Fix NetBSD CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc5e4f592..e6219f370 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: name: NetBSD Build, Check, and Test runs-on: ubuntu-latest env: - PKGSRC_BRANCH: 2025Q2 + PKGSRC_BRANCH: 2025Q4 steps: - uses: actions/checkout@v4 - name: Build, Check, and Test From 47f20c0ffb1d9e48e437c92e3312b4a14d3b8443 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Mon, 29 Dec 2025 20:57:25 +0100 Subject: [PATCH 034/212] Added 'set_document_title' to be able to rename the tab --- core/sys/wasm/js/dom.odin | 2 ++ core/sys/wasm/js/odin.js | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/core/sys/wasm/js/dom.odin b/core/sys/wasm/js/dom.odin index a4f8d7687..6dd9dbf45 100644 --- a/core/sys/wasm/js/dom.odin +++ b/core/sys/wasm/js/dom.odin @@ -22,6 +22,8 @@ foreign dom_lib { window_set_scroll :: proc(x, y: f64) --- set_element_style :: proc(id: string, key: string, value: string) --- + + set_document_title :: proc(title: string) --- } get_element_value_string :: proc "contextless" (id: string, buf: []byte) -> string { diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js index 063fd990c..19ac3093e 100644 --- a/core/sys/wasm/js/odin.js +++ b/core/sys/wasm/js/odin.js @@ -2050,6 +2050,11 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) { } }, + set_document_title: (title_ptr, title_len) => { + let title = wasmMemoryInterface.loadString(title_ptr, title_len); + document.title = title; + }, + get_element_key_f64: (id_ptr, id_len, key_ptr, key_len) => { let id = wasmMemoryInterface.loadString(id_ptr, id_len); let key = wasmMemoryInterface.loadString(key_ptr, key_len); From ba68d75c6ff163c8c09793c9f42bab8229b6f490 Mon Sep 17 00:00:00 2001 From: dozn Date: Mon, 29 Dec 2025 12:23:54 -0800 Subject: [PATCH 035/212] Add JSON5/SJSON Comments When Marshalling Allows user-facing JSON5/SJSON to have comments explaining field usage. `json.Marshal_Options.pretty` must be enabled since we only use single-line comments (not to mention it wouldn't be terribly useful without `pretty` set anyways). We don't escape anything, so `\n` will display as "\n", but you're still able to enter in a proper newline character and it'll be displayed on multiple lines. --- core/encoding/json/marshal.odin | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index e563c326a..bed2018e3 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -413,6 +413,12 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_iteration(w, opt, first_iteration) or_return + + if opt.pretty { + comment := reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "jsoncomment") + opt_write_comment(w, opt, &comment) or_return + } + first_iteration = false if json_name != "" { opt_write_key(w, opt, json_name) or_return @@ -533,6 +539,26 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: return } +// Newlines are split into multiple comment lines +opt_write_comment :: proc(w: io.Writer, opt: ^Marshal_Options, comment: ^string) -> (err: io.Error) { + if comment^ == "" { + return nil + } + + switch opt.spec { + case .JSON5, .MJSON: + for line in strings.split_iterator(comment, "\n") { + io.write_string(w, "// ") or_return + io.write_string(w, line) or_return + io.write_rune(w, '\n') or_return + opt_write_indentation(w, opt) or_return + } + case .JSON: return nil + } + + return nil +} + // write key as quoted string or with optional quotes in mjson opt_write_key :: proc(w: io.Writer, opt: ^Marshal_Options, name: string) -> (err: io.Error) { switch opt.spec { From ef33e551825258b51f095d3e52945b57fc795c4e Mon Sep 17 00:00:00 2001 From: Harold Brenes Date: Mon, 29 Dec 2025 15:31:12 -0500 Subject: [PATCH 036/212] Fix auto objc_msgSend incorrectly treating certain class methods as instance methods. --- src/check_expr.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 2fe6c0251..3b32d734a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8172,13 +8172,7 @@ gb_internal void check_objc_call_expr(CheckerContext *c, Operand *operand, Ast * Type *return_type = proc.result_count == 0 ? nullptr : proc.results->Tuple.variables[0]->type; bool is_return_instancetype = return_type != nullptr && return_type == t_objc_instancetype; - if (params.count == 0 || !is_type_objc_ptr_to_object(params[0]->type)) { - if (!proc_entity->Procedure.is_objc_class_method) { - // Not a class method, invalid call - error(call, "Invalid Objective-C call: The Objective-C method is not a class method but this first parameter is not an Objective-C object pointer."); - return; - } - + if (proc_entity->Procedure.is_objc_class_method) { if (is_return_instancetype) { if (ce->proc->kind == Ast_SelectorExpr) { ast_node(se, SelectorExpr, ce->proc); @@ -8194,7 +8188,8 @@ gb_internal void check_objc_call_expr(CheckerContext *c, Operand *operand, Ast * self_type = t_objc_Class; params_start = 0; - } else if (ce->args.count > 0) { + } else { + GB_ASSERT(ce->args.count > 0); GB_ASSERT(is_type_objc_ptr_to_object(params[0]->type)); if (ce->args[0]->tav.objc_super_target) { From 0bf4ffe46943f8f8bfe2f4f077c92be1512d117a Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 29 Dec 2025 18:39:31 +0100 Subject: [PATCH 037/212] Fix handling of #force_inline --- src/parser.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index b2ff55396..823021e04 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2183,7 +2183,7 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { return expr; } if (e->kind != Ast_ProcLit && e->kind != Ast_CallExpr) { - syntax_error(expr, "%.*s must be followed by a procedure literal or call, got %.*s", LIT(token.string), LIT(ast_strings[expr->kind])); + syntax_error(expr, "%.*s must be followed by a procedure literal or call, got %.*s", LIT(token.string), LIT(ast_strings[e->kind])); return ast_bad_expr(f, token, f->curr_token); } ProcInlining pi = ProcInlining_none; @@ -2197,17 +2197,17 @@ gb_internal Ast *parse_force_inlining_operand(AstFile *f, Token token) { if (pi != ProcInlining_none) { if (e->kind == Ast_ProcLit) { - if (expr->ProcLit.inlining != ProcInlining_none && - expr->ProcLit.inlining != pi) { + if (e->ProcLit.inlining != ProcInlining_none && + e->ProcLit.inlining != pi) { syntax_error(expr, "Cannot apply both '#force_inline' and '#force_no_inline' to a procedure literal"); } - expr->ProcLit.inlining = pi; + e->ProcLit.inlining = pi; } else if (e->kind == Ast_CallExpr) { - if (expr->CallExpr.inlining != ProcInlining_none && - expr->CallExpr.inlining != pi) { + if (e->CallExpr.inlining != ProcInlining_none && + e->CallExpr.inlining != pi) { syntax_error(expr, "Cannot apply both '#force_inline' and '#force_no_inline' to a procedure call"); } - expr->CallExpr.inlining = pi; + e->CallExpr.inlining = pi; } } From affaefc13ace1ac95b97c043314da13d4587eb44 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 04:42:06 -0800 Subject: [PATCH 038/212] Moved `first_iteration` up a couple lines so it makes sense readability-wise. --- core/encoding/json/marshal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index bed2018e3..acf12331a 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -413,13 +413,13 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: } opt_write_iteration(w, opt, first_iteration) or_return + first_iteration = false if opt.pretty { comment := reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "jsoncomment") opt_write_comment(w, opt, &comment) or_return } - first_iteration = false if json_name != "" { opt_write_key(w, opt, json_name) or_return } else { From f1c6c52c215c8087a4fb82b68dcf03741cb8821b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 30 Dec 2025 12:58:37 +0000 Subject: [PATCH 039/212] Fix `@(static, rodata)` for slices --- src/llvm_backend_stmt.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 90b9c0204..b3b5f4251 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -1745,7 +1745,6 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * } else { ExactValue value = expr->tav.value; if (is_type_rune(expr->tav.type) && value.kind == ExactValue_Integer) { - Rune r = cast(Rune)exact_value_to_i64(value); u8 rune_temp[6] = {}; isize size = gb_utf8_encode_rune(rune_temp, r); @@ -2170,14 +2169,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { for_array(i, vd->names) { lbValue value = {}; - if (vd->values.count > 0) { - GB_ASSERT(vd->names.count == vd->values.count); - Ast *ast_value = vd->values[i]; - GB_ASSERT(ast_value->tav.mode == Addressing_Constant || - ast_value->tav.mode == Addressing_Invalid); - value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, LB_CONST_CONTEXT_DEFAULT_NO_LOCAL); - } Ast *ident = vd->names[i]; GB_ASSERT(!is_blank_ident(ident)); @@ -2185,6 +2177,19 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { GB_ASSERT(e->flags & EntityFlag_Static); String name = e->token.string; + if (vd->values.count > 0) { + GB_ASSERT(vd->names.count == vd->values.count); + Ast *ast_value = vd->values[i]; + GB_ASSERT(ast_value->tav.mode == Addressing_Constant || + ast_value->tav.mode == Addressing_Invalid); + + auto cc = LB_CONST_CONTEXT_DEFAULT_NO_LOCAL; + if (e->Variable.is_rodata) { + cc.is_rodata = true; + } + value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, cc); + } + String mangled_name = {}; { gbString str = gb_string_make_length(permanent_allocator(), p->name.text, p->name.len); From 93d7e2a4526bc1075f6eef26b3e1ba6345450f05 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 30 Dec 2025 13:08:30 +0000 Subject: [PATCH 040/212] Add `globaldynamic` `thread_local` model (same as the current `default`) --- src/checker.cpp | 2 ++ src/llvm_backend_general.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/checker.cpp b/src/checker.cpp index 33121b453..13d02c512 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4027,6 +4027,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) { } else if (ev.kind == ExactValue_String) { String model = ev.value_string; if (model == "default" || + model == "globaldynamic" || model == "localdynamic" || model == "initialexec" || model == "localexec") { @@ -4035,6 +4036,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) { ERROR_BLOCK(); error(elem, "Invalid thread local model '%.*s'. Valid models:", LIT(model)); error_line("\tdefault\n"); + error_line("\tglobaldynamic\n"); error_line("\tlocaldynamic\n"); error_line("\tinitialexec\n"); error_line("\tlocalexec\n"); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 4ebb40d96..c0e57143d 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2628,6 +2628,8 @@ gb_internal bool lb_apply_thread_local_model(LLVMValueRef value, String model) { LLVMThreadLocalMode mode = LLVMGeneralDynamicTLSModel; if (model == "default") { mode = LLVMGeneralDynamicTLSModel; + } else if (model == "globaldynamic") { + mode = LLVMGeneralDynamicTLSModel; } else if (model == "localdynamic") { mode = LLVMLocalDynamicTLSModel; } else if (model == "initialexec") { From 589dbbddd20f444786e1d71258faf2f692450c49 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 17:02:06 -0800 Subject: [PATCH 041/212] [encoding/json] Fix Escapes When Marshalling Fixes https://github.com/odin-lang/Odin/issues/6060 and https://github.com/odin-lang/Odin/issues/6075 The boolean "true" was setting `html_safe` instead of `for_json`. Chalk one up for the "use enums instead of booleans" crowd. --- core/encoding/json/marshal.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/encoding/json/marshal.odin b/core/encoding/json/marshal.odin index acf12331a..c4e348aa8 100644 --- a/core/encoding/json/marshal.odin +++ b/core/encoding/json/marshal.odin @@ -122,9 +122,9 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err: case runtime.Type_Info_Rune: r := a.(rune) - io.write_byte(w, '"') or_return - io.write_escaped_rune(w, r, '"', true) or_return - io.write_byte(w, '"') or_return + io.write_byte(w, '"') or_return + io.write_escaped_rune(w, r, '"', for_json = true) or_return + io.write_byte(w, '"') or_return case runtime.Type_Info_Float: switch f in a { From e4bf5476c3cc218b1265b2cb90c3b4fe3c9d3df8 Mon Sep 17 00:00:00 2001 From: ske Date: Tue, 30 Dec 2025 22:08:40 -0300 Subject: [PATCH 042/212] Fix literal endianness (fix #6068) --- src/llvm_backend_const.cpp | 23 ++++++-- tests/issues/run.bat | 1 + tests/issues/run.sh | 1 + tests/issues/test_issue_6068.odin | 92 +++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 tests/issues/test_issue_6068.odin diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 22e124792..9c407be00 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -498,6 +498,13 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi if (big_int_is_zero(a)) { return LLVMConstNull(lb_type(m, original_type)); } + + BigInt val = {}; + big_int_init(&val, a); + + if (big_int_is_neg(&val)) { + mp_incr(&val); + } size_t sz = cast(size_t)type_size_of(original_type); u64 rop64[4] = {}; // 2 u64 is the maximum we will ever need, so doubling it will be fine :P @@ -509,7 +516,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi size_t nails = 0; mp_endian endian = MP_LITTLE_ENDIAN; - max_count = mp_pack_count(a, nails, size); + max_count = mp_pack_count(&val, nails, size); if (sz < max_count) { debug_print_big_int(a); gb_printf_err("%s -> %tu\n", type_to_string(original_type), sz); @@ -520,7 +527,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi mp_err err = mp_pack(rop, sz, &written, MP_LSB_FIRST, size, endian, nails, - a); + &val); GB_ASSERT(err == MP_OKAY); if (!is_type_endian_little(original_type)) { @@ -531,12 +538,18 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi } } + if (big_int_is_neg(a)) { + // sizeof intead of sz for sign extend to work properly + for (size_t i = 0; i < sizeof rop64; i++) { + rop[i] = ~rop[i]; + } + } + + big_int_dealloc(&val); + GB_ASSERT(!is_type_array(original_type)); LLVMValueRef value = LLVMConstIntOfArbitraryPrecision(lb_type(m, original_type), cast(unsigned)((sz+7)/8), cast(u64 *)rop); - if (big_int_is_neg(a)) { - value = LLVMConstNeg(value); - } return value; } diff --git a/tests/issues/run.bat b/tests/issues/run.bat index bbd7cbc90..0ceaf554c 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -26,6 +26,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin build ..\test_issue_5097-2.odin %COMMON% || exit /b ..\..\..\odin build ..\test_issue_5265.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_5699.odin %COMMON% || exit /b +..\..\..\odin test ..\test_issue_6068.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index a9a4bb88d..ce02ba20a 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -33,6 +33,7 @@ $ODIN build ../test_issue_5097.odin $COMMON $ODIN build ../test_issue_5097-2.odin $COMMON $ODIN build ../test_issue_5265.odin $COMMON $ODIN test ../test_issue_5699.odin $COMMON +$ODIN test ../test_issue_6068.odin $COMMON set +x diff --git a/tests/issues/test_issue_6068.odin b/tests/issues/test_issue_6068.odin new file mode 100644 index 000000000..011c95442 --- /dev/null +++ b/tests/issues/test_issue_6068.odin @@ -0,0 +1,92 @@ +// Tests issue #6068 https://github.com/odin-lang/Odin/issues/6068 +package test_issues + +import "core:testing" + +@test +test_issue_6068 :: proc(t: ^testing.T) { + { + check_be : i128be = -1 + check_le : i128le = -1 + value := -1 + reverse := i128be(value) + + // test variable + testing.expect(t, i128be(value) == check_be) + testing.expect(t, i128be(-1) == check_be) + testing.expect(t, cast(i128be)value == check_be) + testing.expect(t, cast(i128be)-1 == check_be) + testing.expect(t, i128be(int(-1)) == check_be) + testing.expect(t, cast(i128be)int(-1) == check_be) + testing.expect(t, i128le(value) == check_le) + testing.expect(t, i128le(-1) == check_le) + testing.expect(t, cast(i128le)value == check_le) + testing.expect(t, cast(i128le)-1 == check_le) + testing.expect(t, i128le(int(-1)) == check_le) + testing.expect(t, cast(i128le)int(-1) == check_le) + testing.expect(t, i128le(reverse) == check_le) + testing.expect(t, cast(i128le)reverse == check_le) + + // test literal + testing.expect(t, i128be(value) == -1) + testing.expect(t, i128be(-1) == -1) + testing.expect(t, cast(i128be)value == -1) + testing.expect(t, cast(i128be)-1 == -1) + testing.expect(t, i128be(int(-1)) == -1) + testing.expect(t, cast(i128be)int(-1) == -1) + testing.expect(t, i128le(value) == -1) + testing.expect(t, i128le(-1) == -1) + testing.expect(t, cast(i128le)value == -1) + testing.expect(t, cast(i128le)-1 == -1) + testing.expect(t, i128le(int(-1)) == -1) + testing.expect(t, cast(i128le)int(-1) == -1) + testing.expect(t, i128le(reverse) == -1) + testing.expect(t, cast(i128le)reverse == -1) + } + + // NOTE(ske): [llvm_backend_const.cpp:lb_big_int_to_llvm] + // floats behaved wonky when I tested because I forgot to sign extend whole + // rop so I added more tests here to be safe + { + check_be : f64be = -1.234 + check_le : f64le = -1.234 + value : f64 = -1.234 + reverse := f64be(value) + + // test variable + testing.expect(t, f64be(value) == check_be) + testing.expect(t, f64be(-1.234) == check_be) + testing.expect(t, cast(f64be)value == check_be) + testing.expect(t, cast(f64be)-1.234 == check_be) + testing.expect(t, f64be(int(-1.234)) == check_be) + testing.expect(t, cast(f64be)int(-1.234) == check_be) + testing.expect(t, f64le(value) == check_le) + testing.expect(t, f64le(-1.234) == check_le) + testing.expect(t, cast(f64le)value == check_le) + testing.expect(t, cast(f64le)-1.234 == check_le) + testing.expect(t, f64le(int(-1.234)) == check_le) + testing.expect(t, cast(f64le)int(-1.234) == check_le) + testing.expect(t, f64le(reverse) == check_le) + testing.expect(t, cast(f64le)reverse == check_le) + + // test literal + testing.expect(t, f64be(value) == -1.234) + testing.expect(t, f64be(-1.234) == -1.234) + testing.expect(t, cast(f64be)value == -1.234) + testing.expect(t, cast(f64be)-1.234 == -1.234) + testing.expect(t, f64be(int(-1.234)) == -1.234) + testing.expect(t, cast(f64be)int(-1.234) == -1.234) + testing.expect(t, f64le(value) == -1.234) + testing.expect(t, f64le(-1.234) == -1.234) + testing.expect(t, cast(f64le)value == -1.234) + testing.expect(t, cast(f64le)-1.234 == -1.234) + testing.expect(t, f64le(int(-1.234)) == -1.234) + testing.expect(t, cast(f64le)int(-1.234) == -1.234) + testing.expect(t, f64le(reverse) == -1.234) + testing.expect(t, cast(f64le)reverse == -1.234) + } + + testing.expect(t, i64be(-1) + i64be(1) == 0) + testing.expect(t, i64le(-1) + i64le(i64be(1)) == 0) + testing.expect(t, i64be(-7) * i64be(7) == -49) +} From 2700fa86d647ed27f4f7f008ef7d15299bfd6671 Mon Sep 17 00:00:00 2001 From: ske Date: Tue, 30 Dec 2025 22:24:10 -0300 Subject: [PATCH 043/212] fix typo --- src/llvm_backend_const.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 9c407be00..8ce2137ab 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -539,7 +539,7 @@ gb_internal LLVMValueRef lb_big_int_to_llvm(lbModule *m, Type *original_type, Bi } if (big_int_is_neg(a)) { - // sizeof intead of sz for sign extend to work properly + // sizeof instead of sz for sign extend to work properly for (size_t i = 0; i < sizeof rop64; i++) { rop[i] = ~rop[i]; } From 8fea2b783c8f35dc6cd5963a2ed30cb176cc9889 Mon Sep 17 00:00:00 2001 From: dozn Date: Tue, 30 Dec 2025 18:10:07 -0800 Subject: [PATCH 044/212] [encoding/json] Allow Unmarshalling to `rune` Fixes https://github.com/odin-lang/Odin/issues/6061 --- core/encoding/json/types.odin | 1 + core/encoding/json/unmarshal.odin | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/core/encoding/json/types.odin b/core/encoding/json/types.odin index 1da17a0db..77cc7db85 100644 --- a/core/encoding/json/types.odin +++ b/core/encoding/json/types.odin @@ -76,6 +76,7 @@ Error :: enum { Invalid_Number, String_Not_Terminated, Invalid_String, + Invalid_Rune, // Parsing Errors diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 3cdc6429d..58365b684 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -225,6 +225,15 @@ unmarshal_string_token :: proc(p: ^Parser, val: any, token: Token, ti: ^reflect. } ok = true return + case rune: + for rne, i in str { + if i > 0 { + dst = {} + return false, .Invalid_Rune + } + dst = rne + } + return true, nil } #partial switch variant in ti.variant { From 6f396ac49b159e5741579d3b5bb50318e8e75851 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 31 Dec 2025 15:01:03 +0000 Subject: [PATCH 045/212] Rename `xar.Xar` to `xar.Array` --- core/container/xar/xar.odin | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin index 71fc13a27..8ed5bc3e4 100644 --- a/core/container/xar/xar.odin +++ b/core/container/xar/xar.odin @@ -12,7 +12,7 @@ import "core:container/xar" example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -38,7 +38,7 @@ MAX_SHIFT :: PLATFORM_BITS>>1 /* An Exponential Array with stable element addresses. - Unlike `[dynamic]T` which reallocates and moves elements when growing, `Xar` + Unlike `[dynamic]T` which reallocates and moves elements when growing, `Array` allocates separate chunks of exponentially increasing size. This guarantees that pointers to elements remain valid for the lifetime of the container. @@ -66,11 +66,11 @@ MAX_SHIFT :: PLATFORM_BITS>>1 example :: proc() { // Xar with initial chunk size of 16 (1 << 4) - x: xar.Xar(My_Struct, 4) + x: xar.Array(My_Struct, 4) defer xar.destroy(&x) } */ -Xar :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { +Array :: struct($T: typeid, $SHIFT: uint) where 0 < SHIFT, SHIFT <= MAX_SHIFT { chunks: [(1 << (_LOG2_PLATFORM_BITS - intrinsics.constant_log2(SHIFT))) + 1][^]T, len: int, allocator: mem.Allocator, @@ -84,7 +84,7 @@ Initializes an exponential array with the given allocator. - `x`: Pointer to the exponential array to initialize - `allocator`: Allocator to use for chunk allocations (defaults to context.allocator) */ -init :: proc(x: ^$X/Xar($T, $SHIFT), allocator := context.allocator) { +init :: proc(x: ^$X/Array($T, $SHIFT), allocator := context.allocator) { x^ = {allocator = allocator} } @@ -94,7 +94,7 @@ Frees all allocated chunks and resets the exponential array. **Inputs** - `x`: Pointer to the exponential array to destroy */ -destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { +destroy :: proc(x: ^$X/Array($T, $SHIFT)) { #reverse for c, i in x.chunks { if c != nil { n := 1 << (SHIFT + uint(i if i > 0 else 1) - 1) @@ -109,19 +109,19 @@ destroy :: proc(x: ^$X/Xar($T, $SHIFT)) { Resets the array's length to zero without freeing memory. Allocated chunks are retained for reuse. */ -clear :: proc(x: ^$X/Xar($T, $SHIFT)) { +clear :: proc(x: ^$X/Array($T, $SHIFT)) { x.len = 0 } // Returns the length of the exponential-array @(require_results) -len :: proc(x: $X/Xar($T, $SHIFT)) -> int { +len :: proc(x: $X/Array($T, $SHIFT)) -> int { return x.len } // Returns the number of allocated elements @(require_results) -cap :: proc(x: $X/Xar($T, $SHIFT)) -> int { +cap :: proc(x: $X/Array($T, $SHIFT)) -> int { #reverse for c, i in x.chunks { if c != nil { return 1 << (SHIFT + uint(i if i > 0 else 1)) @@ -161,7 +161,7 @@ Get a copy of the element at the specified index. - a copy of the element */ @(require_results) -get :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { +get :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return x.chunks[chunk_idx][elem_idx] @@ -185,7 +185,7 @@ Example: import "core:container/xar" get_ptr_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 100) @@ -200,7 +200,7 @@ Example: } */ @(require_results) -get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { +get_ptr :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) -> (val: ^T) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) return &x.chunks[chunk_idx][elem_idx] @@ -214,7 +214,7 @@ Set the element at the specified index to the given value. - `index`: Position of the element (0-indexed) - `value`: The value to set */ -set :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { +set :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, value: T, loc := #caller_location) #no_bounds_check { runtime.bounds_check_error_loc(loc, index, x.len) chunk_idx, elem_idx, _ := _meta_get(SHIFT, uint(index)) x.chunks[chunk_idx][elem_idx] = value @@ -240,7 +240,7 @@ Example: import "core:container/xar" push_back_example :: proc() { - x: xar.Xar(string, 4) + x: xar.Array(string, 4) defer xar.destroy(&x) xar.push_back(&x, "hello") @@ -250,7 +250,7 @@ Example: fmt.println(xar.get(&x, 1)) // world } */ -push_back_elem :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elem :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -277,7 +277,7 @@ Append multiple elements to the end of the exponential array. - number of elements successfully added - allocation error if chunk allocation failed (partial append possible) */ -push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { +push_back_elems :: proc(x: ^$X/Array($T, $SHIFT), values: ..T, loc := #caller_location) -> (n: int, err: mem.Allocator_Error) { for value in values { n += push_back_elem(x, value, loc) or_return } @@ -303,7 +303,7 @@ Example: import "core:container/xar" push_back_and_get_ptr_example :: proc() { - x: xar.Xar(My_Struct, 4) + x: xar.Array(My_Struct, 4) defer xar.destroy(&x) ptr := xar.push_back_elem_and_get_ptr(&x, My_Struct{}) or_else panic("alloc failed") @@ -311,7 +311,7 @@ Example: } */ @(require_results) -push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { +push_back_elem_and_get_ptr :: proc(x: ^$X/Array($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) { if x.allocator.procedure == nil { // to minic `[dynamic]T` behaviour x.allocator = context.allocator @@ -330,7 +330,7 @@ push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #cal // `pop` will remove and return the end value of an exponential array `x` and reduces the length of the array by 1. // // Note: If the exponential array has no elements (`xar.len(x) == 0`), this procedure will panic. -pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { +pop :: proc(x: ^$X/Array($T, $SHIFT), loc := #caller_location) -> (val: T) { assert(x.len > 0, loc=loc) index := uint(x.len-1) chunk_idx, elem_idx, _ := _meta_get(SHIFT, index) @@ -341,7 +341,7 @@ pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) { // `pop_safe` trys to remove and return the end value of dynamic array `x` and reduces the length of the array by 1. // If the operation is not possible, it will return false. @(require_results) -pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { +pop_safe :: proc(x: ^$X/Array($T, $SHIFT)) -> (val: T, ok: bool) { if x.len == 0 { return } @@ -369,7 +369,7 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { import "core:encoding/xar" unordered_remove_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -383,7 +383,7 @@ pop_safe :: proc(x: ^$X/Xar($T, $SHIFT)) -> (val: T, ok: bool) { fmt.println(xar.get(&x, 1)) // 20 } */ -unordered_remove :: proc(x: ^$X/Xar($T, $SHIFT), #any_int index: int, loc := #caller_location) { +unordered_remove :: proc(x: ^$X/Array($T, $SHIFT), #any_int index: int, loc := #caller_location) { runtime.bounds_check_error_loc(loc, index, x.len) n := x.len-1 if index != n { @@ -402,7 +402,7 @@ Fields: - `idx`: Current iteration index */ Iterator :: struct($T: typeid, $SHIFT: uint) { - xar: ^Xar(T, SHIFT), + xar: ^Array(T, SHIFT), idx: int, } @@ -420,7 +420,7 @@ Example: import "lib:xar" iteration_example :: proc() { - x: xar.Xar(int, 4) + x: xar.Array(int, 4) defer xar.destroy(&x) xar.push_back(&x, 10) @@ -439,7 +439,7 @@ Output: 20 30 */ -iterator :: proc(xar: ^$X/Xar($T, $SHIFT)) -> Iterator(T, SHIFT) { +iterator :: proc(xar: ^$X/Array($T, $SHIFT)) -> Iterator(T, SHIFT) { return {xar = auto_cast xar, idx = 0} } From c6ca64cd4aa860e070130da661bb37b187ff5fa4 Mon Sep 17 00:00:00 2001 From: Neirokan Date: Thu, 1 Jan 2026 10:52:18 +0300 Subject: [PATCH 046/212] fix map_to_ip6 offset --- core/net/addr.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/addr.odin b/core/net/addr.odin index fad0eddc4..6e2881ac8 100644 --- a/core/net/addr.odin +++ b/core/net/addr.odin @@ -495,8 +495,8 @@ map_to_ip6 :: proc(addr: Address) -> Address { addr4 := addr.(IP4_Address) addr4_u16 := transmute([2]u16be) addr4 addr6: IP6_Address - addr6[4] = 0xffff - copy(addr6[5:], addr4_u16[:]) + addr6[5] = 0xffff + copy(addr6[6:], addr4_u16[:]) return addr6 } From 94146e4fe77c180bc74183cc7b29748698fc435e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:40:43 +0000 Subject: [PATCH 047/212] fix printing dozenal numbers `0z` from `0o` --- core/fmt/fmt.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 059413787..6a67843bb 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1086,7 +1086,7 @@ _fmt_int :: proc(fi: ^Info, u: u64, base: int, is_signed: bool, bit_size: int, d case 12: io.write_byte(fi.writer, '0', &fi.n) - io.write_byte(fi.writer, 'o', &fi.n) + io.write_byte(fi.writer, 'z', &fi.n) start = 2 case 16: @@ -1171,7 +1171,7 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i case 12: io.write_byte(fi.writer, '0', &fi.n) - io.write_byte(fi.writer, 'o', &fi.n) + io.write_byte(fi.writer, 'z', &fi.n) start = 2 case 16: From 70697fa00fdda2dc651d41b60f5f6dbed46998a1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:41:56 +0000 Subject: [PATCH 048/212] When using `fmt_write_padding`, remove the need to restore `fi.zero` since it is not used. --- core/fmt/fmt.odin | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 6a67843bb..0d20071e6 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1100,10 +1100,7 @@ _fmt_int :: proc(fi: ^Info, u: u64, base: int, is_signed: bool, bit_size: int, d if fi.prec_set { prec = fi.prec if prec == 0 && u == 0 { - prev_zero := fi.zero - fi.zero = false fmt_write_padding(fi, fi.width) - fi.zero = prev_zero return } } else if fi.zero && fi.width_set { @@ -1185,10 +1182,7 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i if fi.prec_set { prec = fi.prec if prec == 0 && u == 0 { - prev_zero := fi.zero - fi.zero = false fmt_write_padding(fi, fi.width) - fi.zero = prev_zero return } } else if fi.zero && fi.width_set { From b446b91251af00d4d648b5e178bc4f4e7a735bb9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 1 Jan 2026 13:42:40 +0000 Subject: [PATCH 049/212] Add `@(rodata)` to global constants --- core/fmt/fmt.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 0d20071e6..a87529174 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1225,8 +1225,8 @@ _fmt_int_128 :: proc(fi: ^Info, u: u128, base: int, is_signed: bool, bit_size: i _pad(fi, s) } // Units of measurements: -__MEMORY_LOWER := " b kib mib gib tib pib eib" -__MEMORY_UPPER := " B KiB MiB GiB TiB PiB EiB" +@(rodata) __MEMORY_LOWER := " b kib mib gib tib pib eib" +@(rodata) __MEMORY_UPPER := " B KiB MiB GiB TiB PiB EiB" // Formats an integer value as bytes with the best representation. // // Inputs: @@ -1284,8 +1284,8 @@ _fmt_memory :: proc(fi: ^Info, u: u64, is_signed: bool, bit_size: int, units: st _pad(fi, str) } // Hex Values: -__DIGITS_LOWER := "0123456789abcdefx" -__DIGITS_UPPER := "0123456789ABCDEFX" +@(rodata) __DIGITS_LOWER := "0123456789abcdefx" +@(rodata) __DIGITS_UPPER := "0123456789ABCDEFX" // Formats a rune value according to the specified formatting verb. // // Inputs: From b9a170b117d6db89eb824c3faf5edc874b3f7ec4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:46:50 +0000 Subject: [PATCH 050/212] Fix `GetSystemMetricsForDpi` signature --- core/sys/windows/user32.odin | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 11c01db25..94d03d6b4 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -2,7 +2,6 @@ package sys_windows import "base:intrinsics" -import "core:c" foreign import user32 "system:User32.lib" @(default_calling_convention="system") @@ -33,7 +32,7 @@ foreign user32 { RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM --- UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL --- - RegisterHotKey :: proc(hnwd: HWND, id: c.int, fsModifiers: UINT, vk: UINT) -> BOOL --- + RegisterHotKey :: proc(hnwd: HWND, id: c_int, fsModifiers: UINT, vk: UINT) -> BOOL --- CreateWindowExW :: proc( dwExStyle: DWORD, @@ -295,7 +294,7 @@ foreign user32 { SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> int --- CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- - GetSystemMetricsForDpi :: proc(nIndex: int, dpi: UINT) -> int --- + GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- From 45aa89cf0235a72412dece20b6e5b12556591d49 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:47:45 +0000 Subject: [PATCH 051/212] Replace uses of `c.int` with `c_int` for consistency --- core/sys/windows/hidpi.odin | 3 +-- core/sys/windows/types.odin | 2 +- core/sys/windows/wgl.odin | 20 +++++++++----------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/sys/windows/hidpi.odin b/core/sys/windows/hidpi.odin index 5e9787527..6f1e888cc 100644 --- a/core/sys/windows/hidpi.odin +++ b/core/sys/windows/hidpi.odin @@ -1,6 +1,5 @@ #+build windows package sys_windows -import "core:c" HIDD_CONFIGURATION :: struct { cookie: PVOID, @@ -152,7 +151,7 @@ PHIDP_LINK_COLLECTION_NODE :: ^HIDP_LINK_COLLECTION_NODE HIDP_PREPARSED_DATA :: rawptr PHIDP_PREPARSED_DATA :: ^HIDP_PREPARSED_DATA -HIDP_REPORT_TYPE :: enum c.int { +HIDP_REPORT_TYPE :: enum c_int { Input, Output, Feature, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 904970589..d4afe971e 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -2234,7 +2234,7 @@ SHELLEXECUTEINFOW :: struct { lpFile: LPCWSTR, // in, either this value or lpIDList must be specified lpParameters: LPCWSTR, // in, optional lpDirectory: LPCWSTR, // in, optional - nShow: c.int, // in, required + nShow: c_int, // in, required hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified diff --git a/core/sys/windows/wgl.odin b/core/sys/windows/wgl.odin index f50f06939..436a96329 100644 --- a/core/sys/windows/wgl.odin +++ b/core/sys/windows/wgl.odin @@ -1,8 +1,6 @@ #+build windows package sys_windows -import "core:c" - foreign import "system:Opengl32.lib" CONTEXT_MAJOR_VERSION_ARB :: 0x2091 @@ -54,9 +52,9 @@ GLYPHMETRICSFLOAT :: struct { gmfCellIncY: f32, } -CreateContextAttribsARBType :: #type proc "c" (hdc: HDC, hShareContext: rawptr, attribList: [^]c.int) -> HGLRC -ChoosePixelFormatARBType :: #type proc "c" (hdc: HDC, attribIList: [^]c.int, attribFList: [^]f32, maxFormats: DWORD, formats: [^]c.int, numFormats: [^]DWORD) -> BOOL -SwapIntervalEXTType :: #type proc "c" (interval: c.int) -> bool +CreateContextAttribsARBType :: #type proc "c" (hdc: HDC, hShareContext: rawptr, attribList: [^]c_int) -> HGLRC +ChoosePixelFormatARBType :: #type proc "c" (hdc: HDC, attribIList: [^]c_int, attribFList: [^]f32, maxFormats: DWORD, formats: [^]c_int, numFormats: [^]DWORD) -> BOOL +SwapIntervalEXTType :: #type proc "c" (interval: c_int) -> bool GetExtensionsStringARBType :: #type proc "c" (HDC) -> cstring // Procedures @@ -73,18 +71,18 @@ foreign Opengl32 { wglGetProcAddress :: proc(c_str: cstring) -> rawptr --- wglDeleteContext :: proc(HGLRC: HGLRC) -> BOOL --- wglCopyContext :: proc(src, dst: HGLRC, mask: UINT) -> BOOL --- - wglCreateLayerContext :: proc(hdc: HDC, layer_plane: c.int) -> HGLRC --- - wglDescribeLayerPlane :: proc(hdc: HDC, pixel_format, layer_plane: c.int, bytes: UINT, pd: LPLAYERPLANEDESCRIPTOR) -> BOOL --- + wglCreateLayerContext :: proc(hdc: HDC, layer_plane: c_int) -> HGLRC --- + wglDescribeLayerPlane :: proc(hdc: HDC, pixel_format, layer_plane: c_int, bytes: UINT, pd: LPLAYERPLANEDESCRIPTOR) -> BOOL --- wglGetCurrentContext :: proc() -> HGLRC --- wglGetCurrentDC :: proc() -> HDC --- - wglGetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c.int, cr: ^COLORREF) -> c.int --- - wglRealizeLayerPalette :: proc(hdc: HDC, layer_plane: c.int, realize: BOOL) -> BOOL --- - wglSetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c.int, cr: ^COLORREF) -> c.int --- + wglGetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c_int, cr: ^COLORREF) -> c_int --- + wglRealizeLayerPalette :: proc(hdc: HDC, layer_plane: c_int, realize: BOOL) -> BOOL --- + wglSetLayerPaletteEntries :: proc(hdc: HDC, layer_plane, start, entries: c_int, cr: ^COLORREF) -> c_int --- wglShareLists :: proc(HGLRC1, HGLRC2: HGLRC) -> BOOL --- wglSwapLayerBuffers :: proc(hdc: HDC, planes: DWORD) -> BOOL --- wglUseFontBitmapsA :: proc(hdc: HDC, first, count, list_base: DWORD) -> BOOL --- wglUseFontBitmapsW :: proc(hdc: HDC, first, count, list_base: DWORD) -> BOOL --- - wglUseFontOutlines :: proc(hdc: HDC, first, count, list_base: DWORD, deviation, extrusion: f32, format: c.int, gmf: LPGLYPHMETRICSFLOAT) -> BOOL --- + wglUseFontOutlines :: proc(hdc: HDC, first, count, list_base: DWORD, deviation, extrusion: f32, format: c_int, gmf: LPGLYPHMETRICSFLOAT) -> BOOL --- } // Used by vendor:OpenGL From 37458a4bebed996b1fca222ac348eeffdcad7d41 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:53:50 +0000 Subject: [PATCH 052/212] Fix some return types in core:sys/windows --- core/sys/windows/gdi32.odin | 2 +- core/sys/windows/user32.odin | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 141429483..1a23b4c8f 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -52,7 +52,7 @@ foreign gdi32 { CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH --- - GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> int --- + GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 94d03d6b4..e42f1adce 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -277,8 +277,8 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- - FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> int --- + FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_inct --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- @@ -292,9 +292,9 @@ foreign user32 { GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> int --- + SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- - GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> int --- + GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> c_int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- From 747ecc69115d35ab99be3b27e27f751288f12a77 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 09:55:56 +0000 Subject: [PATCH 053/212] Fix typo --- core/sys/windows/user32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index e42f1adce..cd73f80e6 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -278,7 +278,7 @@ foreign user32 { SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_inct --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- From 111ed21e7e5f7ca4cb4358073ab060d138fc782f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:02:23 +0000 Subject: [PATCH 054/212] Change usage of `i32` to `c_int` where appropriate --- core/sys/windows/advapi32.odin | 4 +- core/sys/windows/comctl32.odin | 66 ++++++++++++++++----------------- core/sys/windows/icu.odin | 3 ++ core/sys/windows/ip_helper.odin | 14 +++---- core/sys/windows/types.odin | 2 +- core/sys/windows/user32.odin | 20 +++++----- core/sys/windows/util.odin | 16 ++++---- core/sys/windows/ux_theme.odin | 11 ++++-- 8 files changed, 72 insertions(+), 64 deletions(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index 22cb27863..cf12a078f 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -228,7 +228,7 @@ foreign advapi32 { } PTOKEN_INFORMATION_CLASS :: ^TOKEN_INFORMATION_CLASS -TOKEN_INFORMATION_CLASS :: enum i32 { +TOKEN_INFORMATION_CLASS :: enum c_int { TokenUser = 1, TokenGroups, TokenPrivileges, @@ -282,7 +282,7 @@ TOKEN_INFORMATION_CLASS :: enum i32 { } PSID_NAME_USE :: ^SID_NAME_USE -SID_NAME_USE :: enum i32 { +SID_NAME_USE :: enum c_int { SidTypeUser = 1, SidTypeGroup, SidTypeDomain, diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index c7a166634..c2b4362d9 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -157,14 +157,14 @@ ILP_DOWNLEVEL :: 1 IMAGELISTDRAWPARAMS :: struct { cbSize: DWORD, himl: HIMAGELIST, - i: i32, + i: c_int, hdcDst: HDC, - x: i32, - y: i32, - cx: i32, - cy: i32, - xBitmap: i32, - yBitmap: i32, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, + xBitmap: c_int, + yBitmap: c_int, rgbBk: COLORREF, rgbFg: COLORREF, fStyle: UINT, @@ -178,62 +178,62 @@ LPIMAGELISTDRAWPARAMS :: ^IMAGELISTDRAWPARAMS IMAGEINFO :: struct { hbmImage: HBITMAP, hbmMask: HBITMAP, - Unused1: i32, - Unused2: i32, + Unused1: c_int, + Unused2: c_int, rcImage: RECT, } LPIMAGEINFO :: ^IMAGEINFO @(default_calling_convention="system") foreign Comctl32 { - ImageList_Create :: proc(cx, cy: i32, flags: UINT, cInitial, cGrow: i32) -> HIMAGELIST --- + ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- - ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> i32 --- + ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- - ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> i32 --- - ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: i32, hicon: HICON) -> i32 --- + ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- + ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- - ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: i32, iOverlay: i32) -> BOOL --- - ImageList_Draw :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y: i32, fStyle: UINT) -> BOOL --- - ImageList_Replace :: proc(himl: HIMAGELIST, i: i32, hbmImage, hbmMask: HBITMAP) -> BOOL --- - ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> i32 --- - ImageList_DrawEx :: proc(himl: HIMAGELIST, i: i32, hdcDst: HDC, x, y, dx, dy: i32, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- + ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- + ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- + ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- + ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- + ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- - ImageList_Remove :: proc(himl: HIMAGELIST, i: i32) -> BOOL --- - ImageList_GetIcon :: proc(himl: HIMAGELIST, i: i32, flags: UINT) -> HICON --- - ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: i32, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- - ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: i32, himlSrc: HIMAGELIST, iSrc: i32, uFlags: UINT) -> BOOL --- - ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: i32) -> BOOL --- + ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- + ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- + ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- + ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- + ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- ImageList_EndDrag :: proc() --- - ImageList_DragEnter :: proc(hwndLock: HWND, x, y: i32) -> BOOL --- + ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- - ImageList_DragMove :: proc(x, y: i32) -> BOOL --- - ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: i32) -> BOOL --- + ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- + ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: c_int) -> BOOL --- ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- - ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^i32) -> BOOL --- - ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: i32) -> BOOL --- - ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: i32, pImageInfo: ^IMAGEINFO) -> BOOL --- - ImageList_Merge :: proc(himl1: HIMAGELIST, i1: i32, himl2: HIMAGELIST, i2: i32, dx, dy: i32) -> HIMAGELIST --- + ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- + ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- + ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- + ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- } -ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> i32 { +ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> c_int { return ImageList_ReplaceIcon(himl, -1, hicon) } ImageList_RemoveAll :: #force_inline proc "system" (himl: HIMAGELIST) -> BOOL { return ImageList_Remove(himl, -1) } -ImageList_ExtractIcon :: #force_inline proc "system" (hi: HINSTANCE, himl: HIMAGELIST, i: i32) -> HICON { +ImageList_ExtractIcon :: #force_inline proc "system" (hi: HINSTANCE, himl: HIMAGELIST, i: c_int) -> HICON { return ImageList_GetIcon(himl, i, 0) } -ImageList_LoadBitmap :: #force_inline proc "system" (hi: HINSTANCE, lpbmp: LPCWSTR, cx, cGrow: i32, crMask: COLORREF) -> HIMAGELIST { +ImageList_LoadBitmap :: #force_inline proc "system" (hi: HINSTANCE, lpbmp: LPCWSTR, cx, cGrow: c_int, crMask: COLORREF) -> HIMAGELIST { return ImageList_LoadImageW(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0) } diff --git a/core/sys/windows/icu.odin b/core/sys/windows/icu.odin index 6ed8c9b40..b481a05a9 100644 --- a/core/sys/windows/icu.odin +++ b/core/sys/windows/icu.odin @@ -12,3 +12,6 @@ foreign icu { ucal_getWindowsTimeZoneID :: proc(id: wstring, len: i32, winid: wstring, winidCapacity: i32, status: ^UError) -> i32 --- ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- } + + +// NOTE(bill): all of these types actually do use `i32` and not `c_int` diff --git a/core/sys/windows/ip_helper.odin b/core/sys/windows/ip_helper.odin index d2e75d531..da23a064f 100644 --- a/core/sys/windows/ip_helper.odin +++ b/core/sys/windows/ip_helper.odin @@ -141,7 +141,7 @@ IP_ADAPTER_DNS_SERVER_ADDRESS_XP :: struct { Address: SOCKET_ADDRESS, } -IF_OPER_STATUS :: enum i32 { +IF_OPER_STATUS :: enum c_int { Up = 1, Down = 2, Testing = 3, @@ -160,17 +160,17 @@ NET_LUID_LH :: struct #raw_union { SOCKET_ADDRESS :: struct { lpSockaddr: ^SOCKADDR, - iSockaddrLength: i32, + iSockaddrLength: INT, } -NET_IF_CONNECTION_TYPE :: enum i32 { +NET_IF_CONNECTION_TYPE :: enum c_int { NET_IF_CONNECTION_DEDICATED = 1, NET_IF_CONNECTION_PASSIVE = 2, NET_IF_CONNECTION_DEMAND = 3, NET_IF_CONNECTION_MAXIMUM = 4, } -TUNNEL_TYPE :: enum i32 { +TUNNEL_TYPE :: enum c_int { TUNNEL_TYPE_NONE = 0, TUNNEL_TYPE_OTHER = 1, TUNNEL_TYPE_DIRECT = 2, @@ -179,7 +179,7 @@ TUNNEL_TYPE :: enum i32 { TUNNEL_TYPE_TEREDO = 14, TUNNEL_TYPE_IPHTTPS = 15, } -NL_PREFIX_ORIGIN :: enum i32 { +NL_PREFIX_ORIGIN :: enum c_int { IpPrefixOriginOther = 0, IpPrefixOriginManual = 1, IpPrefixOriginWellKnown = 2, @@ -188,7 +188,7 @@ NL_PREFIX_ORIGIN :: enum i32 { IpPrefixOriginUnchanged = 16, } -NL_SUFFIX_ORIGIN :: enum i32 { +NL_SUFFIX_ORIGIN :: enum c_int { NlsoOther = 0, NlsoManual = 1, NlsoWellKnown = 2, @@ -204,7 +204,7 @@ NL_SUFFIX_ORIGIN :: enum i32 { IpSuffixOriginUnchanged = 16, } -NL_DAD_STATE :: enum i32 { +NL_DAD_STATE :: enum c_int { NldsInvalid = 0, NldsTentative = 1, NldsDuplicate = 2, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index d4afe971e..75e9fc695 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -274,7 +274,7 @@ PROTECTED_SACL_SECURITY_INFORMATION :: 0x40000000 UNPROTECTED_DACL_SECURITY_INFORMATION :: 0x20000000 UNPROTECTED_SACL_SECURITY_INFORMATION :: 0x10000000 -GET_FILEEX_INFO_LEVELS :: distinct i32 +GET_FILEEX_INFO_LEVELS :: distinct c_int GetFileExInfoStandard: GET_FILEEX_INFO_LEVELS : 0 GetFileExMaxInfoLevel: GET_FILEEX_INFO_LEVELS : 1 diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index cd73f80e6..287ed59e7 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -859,21 +859,21 @@ FKF_CLICKON :: 0x40 NONCLIENTMETRICSW :: struct { cbSize: UINT, - iBorderWidth: i32, - iScrollWidth: i32, - iScrollHeight: i32, - iCaptionWidth: i32, - iCaptionHeight: i32, + iBorderWidth: c_int, + iScrollWidth: c_int, + iScrollHeight: c_int, + iCaptionWidth: c_int, + iCaptionHeight: c_int, lfCaptionFont: LOGFONTW, - iSmCaptionWidth: i32, - iSmCaptionHeight: i32, + iSmCaptionWidth: c_int, + iSmCaptionHeight: c_int, lfSmCaptionFont: LOGFONTW, - iMenuWidth: i32, - iMenuHeight: i32, + iMenuWidth: c_int, + iMenuHeight: c_int, lfMenuFont: LOGFONTW, lfStatusFont: LOGFONTW, lfMessageFont: LOGFONTW, - iPaddedBorderWidth: i32, + iPaddedBorderWidth: c_int, } LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 125038ac4..4729d5c72 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -82,14 +82,14 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ b := transmute([]byte)s cstr := raw_data(b) - n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, i32(len(s)), nil, 0) + n := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), nil, 0) if n == 0 { return nil } text := make([]u16, n+1, allocator) - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, i32(len(s)), raw_data(text), n) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, cstr, c_int(len(s)), raw_data(text), n) if n1 == 0 { delete(text, allocator) return nil @@ -103,14 +103,14 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ } utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { - n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), nil, 0) + n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) if n1 == 0 { return nil } else if int(n1) > len(buf) { return nil } - n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), i32(len(s)), raw_data(buf[:]), n1) + n1 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), raw_data(buf[:]), n1) if n1 == 0 { return nil } else if int(n1) > len(buf) { @@ -143,7 +143,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo return } - n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N) if N > 0 else -1, nil, 0, nil, nil) + n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N) if N > 0 else -1, nil, 0, nil, nil) if n == 0 { return } @@ -155,7 +155,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo // will not be null terminated. text := make([]byte, n) or_return - n1 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), raw_data(text), n, nil, nil) + n1 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), raw_data(text), n, nil, nil) if n1 == 0 { delete(text, allocator) return @@ -171,14 +171,14 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo } wstring_to_utf8_buf :: proc(buf: []u8, s: wstring, N := -1) -> (res: string) { - n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), nil, 0, nil, nil) + n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), nil, 0, nil, nil) if n == 0 { return } else if int(n) > len(buf) { return } - n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), raw_data(buf), n, nil, nil) + n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), raw_data(buf), n, nil, nil) if n2 == 0 { return } else if int(n2) > len(buf) { diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 679d9998f..47a0049b2 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -3,11 +3,16 @@ package sys_windows foreign import uxtheme "system:UxTheme.lib" -MARGINS :: distinct [4]i32 +MARGINS :: struct { + cxLeftWidth: c_int, + cxRightWidth: c_int, + cyTopHeight: c_int, + cyBottomHeight: c_int, +} PMARGINS :: ^MARGINS @(default_calling_convention="system") foreign uxtheme { - IsThemeActive :: proc() -> BOOL --- - SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- + IsThemeActive :: proc() -> BOOL --- + SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- } From 25daf520001d4fbf14d610fa8e0bfb4fd8bdc3b6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:13:31 +0000 Subject: [PATCH 055/212] Add support to `raw_union_tag` for integers --- core/fmt/fmt.odin | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index a87529174..72fe6fdf0 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2131,6 +2131,34 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. } } } + case reflect.Type_Info_Integer: + tag_value := reflect.as_i64(tag) or_break + + for tag, index in info.tags[:info.field_count] { + rut_list := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + + for rut in strings.split_iterator(&rut_list, ",") { + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } + + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + tail_value := strconv.parse_i64(tail_name) or_continue + + if tail_value == tag_value { + io.write_string(fi.writer, "#raw_union(.", &fi.n) + io.write_i64(fi.writer, tag_value, 10, &fi.n) + io.write_string(fi.writer, ") ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } + } + } } return false From 49687069ef79aa297ad9bd575241aafe2bf1dea0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:14:24 +0000 Subject: [PATCH 056/212] Minor formatting improvements --- core/sys/windows/advapi32.odin | 52 +++++++-------- core/sys/windows/comctl32.odin | 114 ++++++++++++++++----------------- 2 files changed, 83 insertions(+), 83 deletions(-) diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index cf12a078f..d4b86b875 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -303,35 +303,35 @@ TOKEN_USER :: struct { PSID_AND_ATTRIBUTES :: ^SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES :: struct { - Sid: rawptr, + Sid: rawptr, Attributes: ULONG, } PTOKEN_TYPE :: ^TOKEN_TYPE TOKEN_TYPE :: enum { - TokenPrimary = 1, + TokenPrimary = 1, TokenImpersonation = 2, } PTOKEN_STATISTICS :: ^TOKEN_STATISTICS TOKEN_STATISTICS :: struct { - TokenId: LUID, - AuthenticationId: LUID, - ExpirationTime: LARGE_INTEGER, - TokenType: TOKEN_TYPE, + TokenId: LUID, + AuthenticationId: LUID, + ExpirationTime: LARGE_INTEGER, + TokenType: TOKEN_TYPE, ImpersonationLevel: SECURITY_IMPERSONATION_LEVEL, - DynamicCharged: DWORD, - DynamicAvailable: DWORD, - GroupCount: DWORD, - PrivilegeCount: DWORD, - ModifiedId: LUID, + DynamicCharged: DWORD, + DynamicAvailable: DWORD, + GroupCount: DWORD, + PrivilegeCount: DWORD, + ModifiedId: LUID, } TOKEN_SOURCE_LENGTH :: 8 PTOKEN_SOURCE :: ^TOKEN_SOURCE TOKEN_SOURCE :: struct { - SourceName: [TOKEN_SOURCE_LENGTH]CHAR, + SourceName: [TOKEN_SOURCE_LENGTH]CHAR, SourceIdentifier: LUID, } @@ -339,7 +339,7 @@ TOKEN_SOURCE :: struct { PTOKEN_PRIVILEGES :: ^TOKEN_PRIVILEGES TOKEN_PRIVILEGES :: struct { PrivilegeCount: DWORD, - Privileges: [0]LUID_AND_ATTRIBUTES, + Privileges: [0]LUID_AND_ATTRIBUTES, } PTOKEN_PRIMARY_GROUP :: ^TOKEN_PRIMARY_GROUP @@ -354,16 +354,16 @@ TOKEN_OWNER :: struct { PTOKEN_GROUPS_AND_PRIVILEGES :: ^TOKEN_GROUPS_AND_PRIVILEGES TOKEN_GROUPS_AND_PRIVILEGES :: struct { - SidCount: DWORD, - SidLength: DWORD, - Sids: PSID_AND_ATTRIBUTES, - RestrictedSidCount: DWORD, + SidCount: DWORD, + SidLength: DWORD, + Sids: PSID_AND_ATTRIBUTES, + RestrictedSidCount: DWORD, RestrictedSidLength: DWORD, - RestrictedSids: PSID_AND_ATTRIBUTES, - PrivilegeCount: DWORD, - PrivilegeLength: DWORD, - Privileges: PLUID_AND_ATTRIBUTES, - AuthenticationId: LUID, + RestrictedSids: PSID_AND_ATTRIBUTES, + PrivilegeCount: DWORD, + PrivilegeLength: DWORD, + Privileges: PLUID_AND_ATTRIBUTES, + AuthenticationId: LUID, } PTOKEN_DEFAULT_DACL :: ^TOKEN_DEFAULT_DACL @@ -374,8 +374,8 @@ TOKEN_DEFAULT_DACL :: struct { PACL :: ^ACL ACL :: struct { AclRevision: BYTE, - Sbz1: BYTE, - AclSize: WORD, - AceCount: WORD, - Sbz2: WORD, + Sbz1: BYTE, + AclSize: WORD, + AceCount: WORD, + Sbz2: WORD, } diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index c2b4362d9..3418c7649 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -5,9 +5,9 @@ foreign import "system:Comctl32.lib" @(default_calling_convention="system") foreign Comctl32 { - InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- + InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT --- - SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- + SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- } ICC_LISTVIEW_CLASSES :: 0x00000001 @@ -155,73 +155,73 @@ ILP_NORMAL :: 0 ILP_DOWNLEVEL :: 1 IMAGELISTDRAWPARAMS :: struct { - cbSize: DWORD, - himl: HIMAGELIST, - i: c_int, - hdcDst: HDC, - x: c_int, - y: c_int, - cx: c_int, - cy: c_int, - xBitmap: c_int, - yBitmap: c_int, - rgbBk: COLORREF, - rgbFg: COLORREF, - fStyle: UINT, - dwRop: DWORD, - fState: DWORD, - Frame: DWORD, + cbSize: DWORD, + himl: HIMAGELIST, + i: c_int, + hdcDst: HDC, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, + xBitmap: c_int, + yBitmap: c_int, + rgbBk: COLORREF, + rgbFg: COLORREF, + fStyle: UINT, + dwRop: DWORD, + fState: DWORD, + Frame: DWORD, crEffect: COLORREF, } LPIMAGELISTDRAWPARAMS :: ^IMAGELISTDRAWPARAMS IMAGEINFO :: struct { hbmImage: HBITMAP, - hbmMask: HBITMAP, - Unused1: c_int, - Unused2: c_int, - rcImage: RECT, + hbmMask: HBITMAP, + Unused1: c_int, + Unused2: c_int, + rcImage: RECT, } LPIMAGEINFO :: ^IMAGEINFO @(default_calling_convention="system") foreign Comctl32 { - ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- - ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- - ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- - ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- - ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- - ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- - ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- - ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- - ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- - ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- - ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- - ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- - ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- - ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- - ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- - ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- - ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- - ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- - ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- - ImageList_EndDrag :: proc() --- - ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- - ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- - ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- + ImageList_Create :: proc(cx, cy: c_int, flags: UINT, cInitial, cGrow: c_int) -> HIMAGELIST --- + ImageList_Destroy :: proc(himl: HIMAGELIST) -> BOOL --- + ImageList_GetImageCount :: proc(himl: HIMAGELIST) -> c_int --- + ImageList_SetImageCount :: proc(himl: HIMAGELIST, uNewCount: UINT) -> BOOL --- + ImageList_Add :: proc(himl: HIMAGELIST, hbmImage, hbmMask: HBITMAP) -> c_int --- + ImageList_ReplaceIcon :: proc(himl: HIMAGELIST, i: c_int, hicon: HICON) -> c_int --- + ImageList_SetBkColor :: proc(himl: HIMAGELIST, clrBk: COLORREF) -> COLORREF --- + ImageList_GetBkColor :: proc(himl: HIMAGELIST) -> COLORREF --- + ImageList_SetOverlayImage :: proc(himl: HIMAGELIST, iImage: c_int, iOverlay: c_int) -> BOOL --- + ImageList_Draw :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y: c_int, fStyle: UINT) -> BOOL --- + ImageList_Replace :: proc(himl: HIMAGELIST, i: c_int, hbmImage, hbmMask: HBITMAP) -> BOOL --- + ImageList_AddMasked :: proc(himl: HIMAGELIST, hbmImage: HBITMAP, crMask: COLORREF) -> c_int --- + ImageList_DrawEx :: proc(himl: HIMAGELIST, i: c_int, hdcDst: HDC, x, y, dx, dy: c_int, rgbBk, rgbFg: COLORREF, fStyle: UINT) -> BOOL --- + ImageList_DrawIndirect :: proc(pimldp: ^IMAGELISTDRAWPARAMS) -> BOOL --- + ImageList_Remove :: proc(himl: HIMAGELIST, i: c_int) -> BOOL --- + ImageList_GetIcon :: proc(himl: HIMAGELIST, i: c_int, flags: UINT) -> HICON --- + ImageList_LoadImageW :: proc(hi: HINSTANCE, lpbmp: LPCWSTR, cx, cgrow: c_int, crMask: COLORREF, uType, uFlags: UINT) -> HIMAGELIST --- + ImageList_Copy :: proc(himlDst: HIMAGELIST, iDst: c_int, himlSrc: HIMAGELIST, iSrc: c_int, uFlags: UINT) -> BOOL --- + ImageList_BeginDrag :: proc(himlTrack: HIMAGELIST, iTrack, dxHotspot, dyHotspot: c_int) -> BOOL --- + ImageList_EndDrag :: proc() --- + ImageList_DragEnter :: proc(hwndLock: HWND, x, y: c_int) -> BOOL --- + ImageList_DragLeave :: proc(hwndLock: HWND) -> BOOL --- + ImageList_DragMove :: proc(x, y: c_int) -> BOOL --- ImageList_SetDragCursorImage :: proc(himlDrag: HIMAGELIST, iDrag, dxHotspot, dyHotspot: c_int) -> BOOL --- - ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- - ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- - ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- - ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- - ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- - ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- - ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- - ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- - ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- - ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- - ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- - HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- + ImageList_DragShowNolock :: proc(fShow: BOOL) -> BOOL --- + ImageList_GetDragImage :: proc(ppt, pptHotspot: ^POINT) -> HIMAGELIST --- + ImageList_Read :: proc(pstm: ^IStream) -> HIMAGELIST --- + ImageList_Write :: proc(himl: HIMAGELIST, pstm: ^IStream) -> BOOL --- + ImageList_ReadEx :: proc(dwFlags: DWORD, pstm: ^IStream, riid: REFIID, ppv: PVOID) -> HRESULT --- + ImageList_WriteEx :: proc(himl: HIMAGELIST, dwFlags: DWORD, pstm: ^IStream) -> HRESULT --- + ImageList_GetIconSize :: proc(himl: HIMAGELIST, cx, cy: ^c_int) -> BOOL --- + ImageList_SetIconSize :: proc(himl: HIMAGELIST, cx, cy: c_int) -> BOOL --- + ImageList_GetImageInfo :: proc(himl: HIMAGELIST, i: c_int, pImageInfo: ^IMAGEINFO) -> BOOL --- + ImageList_Merge :: proc(himl1: HIMAGELIST, i1: c_int, himl2: HIMAGELIST, i2: c_int, dx, dy: c_int) -> HIMAGELIST --- + ImageList_Duplicate :: proc(himl: HIMAGELIST) -> HIMAGELIST --- + HIMAGELIST_QueryInterface :: proc(himl: HIMAGELIST, riid: REFIID, ppv: rawptr) -> HRESULT --- } ImageList_AddIcon :: #force_inline proc "system" (himl: HIMAGELIST, hicon: HICON) -> c_int { From c49a645d34483ef29eb2f9d583154169146e7317 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:14:39 +0000 Subject: [PATCH 057/212] Add `raw_union_tag` support to `MINIDUMP_CALLBACK_INPUT` --- core/sys/windows/dbghelp.odin | 57 +++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/core/sys/windows/dbghelp.odin b/core/sys/windows/dbghelp.odin index e32b4c874..4904c5fb4 100644 --- a/core/sys/windows/dbghelp.odin +++ b/core/sys/windows/dbghelp.odin @@ -55,23 +55,54 @@ MINIDUMP_CALLBACK_INFORMATION :: struct { CallbackParam: PVOID, } +MINIDUMP_CALLBACK_TYPE :: enum ULONG { + ModuleCallback, + ThreadCallback, + ThreadExCallback, + IncludeThreadCallback, + IncludeModuleCallback, + MemoryCallback, + CancelCallback, + WriteKernelMinidumpCallback, + KernelMinidumpStatusCallback, + RemoveMemoryCallback, + IncludeVmRegionCallback, + IoStartCallback, + IoWriteAllCallback, + IoFinishCallback, + ReadMemoryFailureCallback, + SecondaryFlagsCallback, + IsProcessSnapshotCallback, + VmStartCallback, + VmQueryCallback, + VmPreReadCallback, + VmPostReadCallback, +} + +MINIDUMP_SECONDARY_FLAG :: enum ULONG { + WithoutPowerInfo = 0, +} +MINIDUMP_SECONDARY_FLAGS :: distinct bit_set[MINIDUMP_SECONDARY_FLAG; ULONG] +MiniSecondaryWithoutPowerInfo :: MINIDUMP_SECONDARY_FLAGS{.WithoutPowerInfo} +MiniSecondaryValidFlags :: MINIDUMP_SECONDARY_FLAGS{.WithoutPowerInfo} + MINIDUMP_CALLBACK_INPUT :: struct { ProcessId: ULONG, ProcessHandle: HANDLE, - CallbackType: ULONG, + CallbackType: MINIDUMP_CALLBACK_TYPE, using _: struct #raw_union { - Status: HRESULT, - Thread: MINIDUMP_THREAD_CALLBACK, - ThreadEx: MINIDUMP_THREAD_EX_CALLBACK, - Module: MINIDUMP_MODULE_CALLBACK, - IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK, - IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK, - Io: MINIDUMP_IO_CALLBACK, - ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK, - SecondaryFlags: ULONG, - VmQuery: MINIDUMP_VM_QUERY_CALLBACK, - VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK, - VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK, + Status: HRESULT `raw_union_tag:"KernelMinidumpStatusCallback"`, + Thread: MINIDUMP_THREAD_CALLBACK `raw_union_tag:"ThreadCallback"`, + ThreadEx: MINIDUMP_THREAD_EX_CALLBACK `raw_union_tag:"ThreadExCallback"`, + Module: MINIDUMP_MODULE_CALLBACK `raw_union_tag:"ModuleCallback"`, + IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK `raw_union_tag:"IncludeThreadCallback"`, + IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK `raw_union_tag:"IncludeModuleCallback"`, + Io: MINIDUMP_IO_CALLBACK `raw_union_tag:"IoStartCallback,IoWriteAllCallback,IoFinishCallback"`, + ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK `raw_union_tag:"ReadMemoryFailureCallback"`, + SecondaryFlags: MINIDUMP_SECONDARY_FLAGS `raw_union_tag:"SecondaryFlagsCallback"`, + VmQuery: MINIDUMP_VM_QUERY_CALLBACK `raw_union_tag:"VmQueryCallback"`, + VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK `raw_union_tag:"VmPreReadCallback"`, + VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK `raw_union_tag:"VmPostReadCallback"`, }, } From bfe75d5c2cfce94b989431ddb2b186a0d877ffe9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:19:23 +0000 Subject: [PATCH 058/212] Add boolean support for `raw_union_tag` --- core/fmt/fmt.odin | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 72fe6fdf0..04211b8a9 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -2159,6 +2159,35 @@ __handle_raw_union_tag :: proc(fi: ^Info, v: any, the_verb: rune, info: runtime. } } } + + case reflect.Type_Info_Boolean: + tag_value := reflect.as_bool(tag) or_break + + for tag, index in info.tags[:info.field_count] { + rut_list := reflect.struct_tag_lookup(reflect.Struct_Tag(tag), "raw_union_tag") or_continue + + for rut in strings.split_iterator(&rut_list, ",") { + head_tag, match, tail_name := strings.partition(string(rut), "=") + if head_tag != tag_name || match != "=" { + continue + } + + // just ignore the `A.` prefix for `A.B` stuff entirely + if _, _, try_tail_name := strings.partition(string(rut), "."); try_tail_name != "" { + tail_name = try_tail_name + } + + tail_value := strconv.parse_bool(tail_name) or_continue + + if tail_value == tag_value { + io.write_string(fi.writer, "#raw_union(.", &fi.n) + io.write_string(fi.writer, "true" if tag_value else "false", &fi.n) + io.write_string(fi.writer, ") ", &fi.n) + fmt_arg(fi, any{v.data, info.types[index].id}, the_verb) + return true + } + } + } } return false From b86627ba3725b5cdf4b7ac0a4cb7f17f2eab08fb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 10:39:46 +0000 Subject: [PATCH 059/212] Improve formatting and `#raw_union` logic in `core:sys/windows` --- core/sys/windows/dnsapi.odin | 4 +- core/sys/windows/dwmapi.odin | 8 +- core/sys/windows/gdi32.odin | 106 +-- core/sys/windows/hidpi.odin | 272 ++++---- core/sys/windows/hidusage.odin | 1076 +++++++++++++++---------------- core/sys/windows/icu.odin | 2 +- core/sys/windows/ip_helper.odin | 4 +- core/sys/windows/kernel32.odin | 661 ++++++++++--------- 8 files changed, 1065 insertions(+), 1068 deletions(-) diff --git a/core/sys/windows/dnsapi.odin b/core/sys/windows/dnsapi.odin index 728813696..73e565118 100644 --- a/core/sys/windows/dnsapi.odin +++ b/core/sys/windows/dnsapi.odin @@ -5,6 +5,6 @@ foreign import "system:Dnsapi.lib" @(default_calling_convention="system") foreign Dnsapi { - DnsQuery_UTF8 :: proc(name: cstring, type: u16, options: DNS_QUERY_OPTIONS, extra: PVOID, results: ^^DNS_RECORD, reserved: PVOID) -> DNS_STATUS --- - DnsRecordListFree :: proc(list: ^DNS_RECORD, options: DWORD) --- + DnsQuery_UTF8 :: proc(name: cstring, type: u16, options: DNS_QUERY_OPTIONS, extra: PVOID, results: ^^DNS_RECORD, reserved: PVOID) -> DNS_STATUS --- + DnsRecordListFree :: proc(list: ^DNS_RECORD, options: DWORD) --- } diff --git a/core/sys/windows/dwmapi.odin b/core/sys/windows/dwmapi.odin index e86730660..0980c2e94 100644 --- a/core/sys/windows/dwmapi.odin +++ b/core/sys/windows/dwmapi.odin @@ -47,9 +47,9 @@ DWM_WINDOW_CORNER_PREFERENCE :: enum c_int { @(default_calling_convention="system") foreign dwmapi { - DwmFlush :: proc() -> HRESULT --- - DwmIsCompositionEnabled :: proc(pfEnabled: ^BOOL) -> HRESULT --- + DwmFlush :: proc() -> HRESULT --- + DwmIsCompositionEnabled :: proc(pfEnabled: ^BOOL) -> HRESULT --- DwmExtendFrameIntoClientArea :: proc(hWnd: HWND, pMarInset: PMARGINS) -> HRESULT --- - DwmGetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: PVOID, cbAttribute: DWORD) -> HRESULT --- - DwmSetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: LPCVOID, cbAttribute: DWORD) -> HRESULT --- + DwmGetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: PVOID, cbAttribute: DWORD) -> HRESULT --- + DwmSetWindowAttribute :: proc(hWnd: HWND, dwAttribute: DWORD, pvAttribute: LPCVOID, cbAttribute: DWORD) -> HRESULT --- } diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 1a23b4c8f..756ec5011 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -7,85 +7,88 @@ foreign import gdi32 "system:Gdi32.lib" @(default_calling_convention="system") foreign gdi32 { - GetDeviceCaps :: proc(hdc: HDC, index: INT) -> INT --- + GetDeviceCaps :: proc(hdc: HDC, index: INT) -> INT --- GetStockObject :: proc(i: INT) -> HGDIOBJ --- - SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ --- - DeleteObject :: proc(ho: HGDIOBJ) -> BOOL --- - SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - SetBkMode :: proc(hdc: HDC, mode: BKMODE) -> INT --- + SelectObject :: proc(hdc: HDC, h: HGDIOBJ) -> HGDIOBJ --- + DeleteObject :: proc(ho: HGDIOBJ) -> BOOL --- + SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- + SetBkMode :: proc(hdc: HDC, mode: BKMODE) -> INT --- CreateCompatibleDC :: proc(hdc: HDC) -> HDC --- - DeleteDC :: proc(hdc: HDC) -> BOOL --- - CancelDC :: proc(hdc: HDC) -> BOOL --- - SaveDC :: proc(hdc: HDC) -> INT --- - RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL --- + DeleteDC :: proc(hdc: HDC) -> BOOL --- + CancelDC :: proc(hdc: HDC) -> BOOL --- + SaveDC :: proc(hdc: HDC) -> INT --- + RestoreDC :: proc(hdc: HDC, nSavedDC: INT) -> BOOL --- CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- - CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- - CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- - StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- - StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- + CreateDIBitmap :: proc(hdc: HDC, pbmih: ^BITMAPINFOHEADER, flInit: DWORD, pjBits: VOID, pbmi: ^BITMAPINFO, iUsage: UINT) -> HBITMAP --- + CreateDIBSection :: proc(hdc: HDC, pbmi: ^BITMAPINFO, usage: UINT, ppvBits: ^^VOID, hSection: HANDLE, offset: DWORD) -> HBITMAP --- + StretchDIBits :: proc(hdc: HDC, xDest, yDest, DestWidth, DestHeight, xSrc, ySrc, SrcWidth, SrcHeight: INT, lpBits: VOID, lpbmi: ^BITMAPINFO, iUsage: UINT, rop: DWORD) -> INT --- + StretchBlt :: proc(hdcDest: HDC, xDest, yDest, wDest, hDest: INT, hdcSrc: HDC, xSrc, ySrc, wSrc, hSrc: INT, rop: DWORD) -> BOOL --- - SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- - ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- + SetPixelFormat :: proc(hdc: HDC, format: INT, ppfd: ^PIXELFORMATDESCRIPTOR) -> BOOL --- + ChoosePixelFormat :: proc(hdc: HDC, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- DescribePixelFormat :: proc(hdc: HDC, iPixelFormat: INT, nBytes: UINT, ppfd: ^PIXELFORMATDESCRIPTOR) -> INT --- - SwapBuffers :: proc(hdc: HDC) -> BOOL --- + SwapBuffers :: proc(hdc: HDC) -> BOOL --- SetDCBrushColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- GetDCBrushColor :: proc(hdc: HDC) -> COLORREF --- - PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL --- - Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL --- + PatBlt :: proc(hdc: HDC, x, y, w, h: INT, rop: DWORD) -> BOOL --- + Rectangle :: proc(hdc: HDC, left, top, right, bottom: INT) -> BOOL --- - CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT --- - CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT --- + CreateFontW :: proc(cHeight, cWidth, cEscapement, cOrientation, cWeight: INT, bItalic, bUnderline, bStrikeOut, iCharSet, iOutPrecision: DWORD, iClipPrecision, iQuality, iPitchAndFamily: DWORD, pszFaceName: LPCWSTR) -> HFONT --- + CreateFontIndirectW :: proc(lplf: ^LOGFONTW) -> HFONT --- CreateFontIndirectExW :: proc(unnamedParam1: ^ENUMLOGFONTEXDVW) -> HFONT --- - AddFontResourceW :: proc(unnamedParam1: LPCWSTR) -> INT --- - AddFontResourceExW :: proc(name: LPCWSTR, fl: DWORD, res: PVOID) -> INT --- - AddFontMemResourceEx :: proc(pFileView: PVOID, cjSize: DWORD, pvResrved: PVOID, pNumFonts: ^DWORD) -> HANDLE --- - EnumFontsW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- - EnumFontFamiliesW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- - EnumFontFamiliesExW :: proc(hdc: HDC, lpLogfont: LPLOGFONTW, lpProc: FONTENUMPROCW, lParam: LPARAM, dwFlags: DWORD) -> INT --- + AddFontResourceW :: proc(unnamedParam1: LPCWSTR) -> INT --- + AddFontResourceExW :: proc(name: LPCWSTR, fl: DWORD, res: PVOID) -> INT --- + AddFontMemResourceEx :: proc(pFileView: PVOID, cjSize: DWORD, pvResrved: PVOID, pNumFonts: ^DWORD) -> HANDLE --- + EnumFontsW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- + EnumFontFamiliesW :: proc(hdc: HDC, lpLogfont: LPCWSTR, lpProc: FONTENUMPROCW, lParam: LPARAM) -> INT --- + EnumFontFamiliesExW :: proc(hdc: HDC, lpLogfont: LPLOGFONTW, lpProc: FONTENUMPROCW, lParam: LPARAM, dwFlags: DWORD) -> INT --- - TextOutW :: proc(hdc: HDC, x, y: INT, lpString: LPCWSTR, c: INT) -> BOOL --- + TextOutW :: proc(hdc: HDC, x, y: INT, lpString: LPCWSTR, c: INT) -> BOOL --- GetTextExtentPoint32W :: proc(hdc: HDC, lpString: LPCWSTR, c: INT, psizl: LPSIZE) -> BOOL --- - GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- + GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH --- - GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- + GetObjectW :: proc(h: HANDLE, c: INT, pv: LPVOID) -> c_int --- CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: INT) -> HBITMAP --- - BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- - GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- - SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- - SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- - GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- + BitBlt :: proc(hdc: HDC, x, y, cx, cy: INT, hdcSrc: HDC, x1, y1: INT, rop: DWORD) -> BOOL --- + GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> INT --- + SetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start: UINT, cLines: UINT, lpBits: VOID, lpbmi: ^BITMAPINFO, ColorUse: UINT) -> INT --- + SetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- + GetDIBColorTable :: proc(hdc: HDC, iStart: UINT, cEntries: UINT, prgbq: ^RGBQUAD) -> UINT --- - CreatePen :: proc(iStyle, cWidth: INT, color: COLORREF) -> HPEN --- - ExtCreatePen :: proc(iPenStyle, cWidth: DWORD, plbrush: ^LOGBRUSH, cStyle: DWORD, pstyle: ^DWORD) -> HPEN --- + CreatePen :: proc(iStyle, cWidth: INT, color: COLORREF) -> HPEN --- + ExtCreatePen :: proc(iPenStyle, cWidth: DWORD, plbrush: ^LOGBRUSH, cStyle: DWORD, pstyle: ^DWORD) -> HPEN --- SetDCPenColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- GetDCPenColor :: proc(hdc: HDC) -> COLORREF --- - CreatePalette :: proc(plpal: ^LOGPALETTE) -> HPALETTE --- - SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE --- + CreatePalette :: proc(plpal: ^LOGPALETTE) -> HPALETTE --- + SelectPalette :: proc(hdc: HDC, hPal: HPALETTE, bForceBkgd: BOOL) -> HPALETTE --- RealizePalette :: proc(hdc: HDC) -> UINT --- SetTextColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- - RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL --- - SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF --- + RoundRect :: proc(hdc: HDC, left: INT, top: INT, right: INT, bottom: INT, width: INT, height: INT) -> BOOL --- + SetPixel :: proc(hdc: HDC, x: INT, y: INT, color: COLORREF) -> COLORREF --- GdiTransparentBlt :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, crTransparent: UINT) -> BOOL --- - GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL --- - GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL --- + GdiGradientFill :: proc(hdc: HDC, pVertex: PTRIVERTEX, nVertex: ULONG, pMesh: PVOID, nCount: ULONG, ulMode: ULONG) -> BOOL --- + GdiAlphaBlend :: proc(hdcDest: HDC, xoriginDest, yoriginDest, wDest, hDest: INT, hdcSrc: HDC, xoriginSrc, yoriginSrc, wSrc, hSrc: INT, ftn: BLENDFUNCTION) -> BOOL --- } +@(require_results) RGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF { return COLORREF(DWORD(BYTE(r)) | (DWORD(BYTE(g)) << 8) | (DWORD(BYTE(b)) << 16)) } +@(require_results) PALETTERGB :: #force_inline proc "contextless" (#any_int r, g, b: int) -> COLORREF { return 0x02000000 | RGB(r, g, b) } +@(require_results) PALETTEINDEX :: #force_inline proc "contextless" (#any_int i: int) -> COLORREF { return COLORREF(DWORD(0x01000000) | DWORD(WORD(i))) } @@ -154,17 +157,21 @@ ICONINFOEXW :: struct { } PICONINFOEXW :: ^ICONINFOEXW -AC_SRC_OVER :: 0x00 +AC_SRC_OVER :: 0x00 AC_SRC_ALPHA :: 0x01 TransparentBlt :: GdiTransparentBlt -GradientFill :: GdiGradientFill -AlphaBlend :: GdiAlphaBlend +GradientFill :: GdiGradientFill +AlphaBlend :: GdiAlphaBlend COLOR16 :: USHORT TRIVERTEX :: struct { - x, y: LONG, - Red, Green, Blue, Alpha: COLOR16, + x: LONG, + y: LONG, + Red: COLOR16, + Green: COLOR16, + Blue: COLOR16, + Alpha: COLOR16, } PTRIVERTEX :: ^TRIVERTEX @@ -179,7 +186,10 @@ GRADIENT_RECT :: struct { PGRADIENT_RECT :: ^GRADIENT_RECT BLENDFUNCTION :: struct { - BlendOp, BlendFlags, SourceConstantAlpha, AlphaFormat: BYTE, + BlendOp: BYTE, + BlendFlags: BYTE, + SourceConstantAlpha: BYTE, + AlphaFormat: BYTE, } GRADIENT_FILL_RECT_H : ULONG : 0x00000000 diff --git a/core/sys/windows/hidpi.odin b/core/sys/windows/hidpi.odin index 6f1e888cc..2cf2b2f34 100644 --- a/core/sys/windows/hidpi.odin +++ b/core/sys/windows/hidpi.odin @@ -2,149 +2,149 @@ package sys_windows HIDD_CONFIGURATION :: struct { - cookie: PVOID, - size: ULONG, + cookie: PVOID, + size: ULONG, RingBufferSize: ULONG, } PHIDD_CONFIGURATION :: ^HIDD_CONFIGURATION HIDD_ATTRIBUTES :: struct { - Size: ULONG, - VendorID: USHORT, - ProductID: USHORT, + Size: ULONG, + VendorID: USHORT, + ProductID: USHORT, VersionNumber: USHORT, } PHIDD_ATTRIBUTES :: ^HIDD_ATTRIBUTES HIDP_CAPS :: struct { - Usage: USAGE, - UsagePage: USAGE, - InputReportByteLength: USHORT, - OutputReportByteLength: USHORT, - FeatureReportByteLength: USHORT, - Reserved: [17]USHORT, + Usage: USAGE, + UsagePage: USAGE, + InputReportByteLength: USHORT, + OutputReportByteLength: USHORT, + FeatureReportByteLength: USHORT, + Reserved: [17]USHORT, NumberLinkCollectionNodes: USHORT, - NumberInputButtonCaps: USHORT, - NumberInputValueCaps: USHORT, - NumberInputDataIndices: USHORT, - NumberOutputButtonCaps: USHORT, - NumberOutputValueCaps: USHORT, - NumberOutputDataIndices: USHORT, - NumberFeatureButtonCaps: USHORT, - NumberFeatureValueCaps: USHORT, - NumberFeatureDataIndices: USHORT, + NumberInputButtonCaps: USHORT, + NumberInputValueCaps: USHORT, + NumberInputDataIndices: USHORT, + NumberOutputButtonCaps: USHORT, + NumberOutputValueCaps: USHORT, + NumberOutputDataIndices: USHORT, + NumberFeatureButtonCaps: USHORT, + NumberFeatureValueCaps: USHORT, + NumberFeatureDataIndices: USHORT, } PHIDP_CAPS :: ^HIDP_CAPS HIDP_BUTTON_CAPS :: struct { - UsagePage: USAGE, - ReportID: UCHAR, - IsAlias: BOOLEAN, - BitField: USHORT, - LinkCollection: USHORT, - LinkUsage: USAGE, - LinkUsagePage: USAGE, - IsRange: BOOLEAN, - IsStringRange: BOOLEAN, + UsagePage: USAGE, + ReportID: UCHAR, + IsAlias: BOOLEAN, + BitField: USHORT, + LinkCollection: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + IsRange: BOOLEAN, + IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, - IsAbsolute: BOOLEAN, - ReportCount: USHORT, - Reserved2: USHORT, - Reserved: [9]ULONG, + IsAbsolute: BOOLEAN, + ReportCount: USHORT, + Reserved2: USHORT, + Reserved: [9]ULONG, using _: struct #raw_union { Range: struct { - UsageMin: USAGE, - UsageMax: USAGE, - StringMin: USHORT, - StringMax: USHORT, + UsageMin: USAGE, + UsageMax: USAGE, + StringMin: USHORT, + StringMax: USHORT, DesignatorMin: USHORT, DesignatorMax: USHORT, - DataIndexMin: USHORT, - DataIndexMax: USHORT, - }, + DataIndexMin: USHORT, + DataIndexMax: USHORT, + } `raw_union_tag:"IsRange=true"`, NotRange: struct { - Usage: USAGE, - Reserved1: USAGE, - StringIndex: USHORT, - Reserved2: USHORT, + Usage: USAGE, + Reserved1: USAGE, + StringIndex: USHORT, + Reserved2: USHORT, DesignatorIndex: USHORT, - Reserved3: USHORT, - DataIndex: USHORT, - Reserved4: USHORT, - }, + Reserved3: USHORT, + DataIndex: USHORT, + Reserved4: USHORT, + } `raw_union_tag:"IsRange=false"`, }, } PHIDP_BUTTON_CAPS :: ^HIDP_BUTTON_CAPS HIDP_VALUE_CAPS :: struct { - UsagePage: USAGE, - ReportID: UCHAR, - IsAlias: BOOLEAN, - BitField: USHORT, - LinkCollection: USHORT, - LinkUsage: USAGE, - LinkUsagePage: USAGE, - IsRange: BOOLEAN, - IsStringRange: BOOLEAN, + UsagePage: USAGE, + ReportID: UCHAR, + IsAlias: BOOLEAN, + BitField: USHORT, + LinkCollection: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + IsRange: BOOLEAN, + IsStringRange: BOOLEAN, IsDesignatorRange: BOOLEAN, - IsAbsolute: BOOLEAN, - HasNull: BOOLEAN, - Reserved: UCHAR, - BitSize: USHORT, - ReportCount: USHORT, - Reserved2: [5]USHORT, - UnitsExp: ULONG, - Units: ULONG, - LogicalMin: LONG, - LogicalMax: LONG, - PhysicalMin: LONG, - PhysicalMax: LONG, + IsAbsolute: BOOLEAN, + HasNull: BOOLEAN, + Reserved: UCHAR, + BitSize: USHORT, + ReportCount: USHORT, + Reserved2: [5]USHORT, + UnitsExp: ULONG, + Units: ULONG, + LogicalMin: LONG, + LogicalMax: LONG, + PhysicalMin: LONG, + PhysicalMax: LONG, using _: struct #raw_union { Range: struct { - UsageMin: USAGE, - UsageMax: USAGE, - StringMin: USHORT, - StringMax: USHORT, + UsageMin: USAGE, + UsageMax: USAGE, + StringMin: USHORT, + StringMax: USHORT, DesignatorMin: USHORT, DesignatorMax: USHORT, - DataIndexMin: USHORT, - DataIndexMax: USHORT, - }, + DataIndexMin: USHORT, + DataIndexMax: USHORT, + } `raw_union_tag:"IsRange=true"`, NotRange: struct { - Usage: USAGE, - Reserved1: USAGE, - StringIndex: USHORT, - Reserved2: USHORT, + Usage: USAGE, + Reserved1: USAGE, + StringIndex: USHORT, + Reserved2: USHORT, DesignatorIndex: USHORT, - Reserved3: USHORT, - DataIndex: USHORT, - Reserved4: USHORT, - }, + Reserved3: USHORT, + DataIndex: USHORT, + Reserved4: USHORT, + } `raw_union_tag:"IsRange=false"`, }, } PHIDP_VALUE_CAPS :: ^HIDP_VALUE_CAPS HIDP_DATA :: struct { DataIndex: USHORT, - Reserved: USHORT, + Reserved: USHORT, using _ : struct #raw_union { RawValue: ULONG, - On: BOOLEAN, + On: BOOLEAN, }, } PHIDP_DATA :: ^HIDP_DATA HIDP_LINK_COLLECTION_NODE :: struct { - LinkUsage: USAGE, - LinkUsagePage: USAGE, - Parent: USHORT, + LinkUsage: USAGE, + LinkUsagePage: USAGE, + Parent: USHORT, NumberOfChildren: USHORT, - NextSibling: USHORT, - FirstChild: USHORT, - CollectionType: [8]ULONG, - IsAlias: [1]ULONG, - Reserved: [23]ULONG, - UserContext: PVOID, + NextSibling: USHORT, + FirstChild: USHORT, + CollectionType: [8]ULONG, + IsAlias: [1]ULONG, + Reserved: [23]ULONG, + UserContext: PVOID, } PHIDP_LINK_COLLECTION_NODE :: ^HIDP_LINK_COLLECTION_NODE @@ -157,56 +157,56 @@ HIDP_REPORT_TYPE :: enum c_int { Feature, } -HIDP_STATUS_SUCCESS : NTSTATUS : 0x110000 -HIDP_STATUS_NULL : NTSTATUS : -2146369535 //0x80110001 -HIDP_STATUS_INVALID_PREPARSED_DATA : NTSTATUS : -1072627711 //0xC0110001 -HIDP_STATUS_INVALID_REPORT_TYPE : NTSTATUS : -1072627710 //0xC0110002 -HIDP_STATUS_INVALID_REPORT_LENGTH : NTSTATUS : -1072627709 //0xC0110003 -HIDP_STATUS_USAGE_NOT_FOUND : NTSTATUS : -1072627708 //0xC0110004 -HIDP_STATUS_VALUE_OUT_OF_RANGE : NTSTATUS : -1072627707 //0xC0110005 -HIDP_STATUS_BAD_LOG_PHY_VALUES : NTSTATUS : -1072627706 //0xC0100006 -HIDP_STATUS_BUFFER_TOO_SMALL : NTSTATUS : -1072627705 //0xC0110007 -HIDP_STATUS_INTERNAL_ERROR : NTSTATUS : -1072627704 //0xC0110008 -HIDP_STATUS_I8042_TRANS_UNKNOWN : NTSTATUS : -1072627703 //0xC0110009 -HIDP_STATUS_INCOMPATIBLE_REPORT_ID : NTSTATUS : -1072627702 //0xC011000A -HIDP_STATUS_NOT_VALUE_ARRAY : NTSTATUS : -1072627701 //0xC011000B -HIDP_STATUS_IS_VALUE_ARRAY : NTSTATUS : -1072627700 //0xC011000C -HIDP_STATUS_DATA_INDEX_NOT_FOUND : NTSTATUS : -1072627699 //0xC011000D +HIDP_STATUS_SUCCESS : NTSTATUS : 0x110000 +HIDP_STATUS_NULL : NTSTATUS : -2146369535 //0x80110001 +HIDP_STATUS_INVALID_PREPARSED_DATA : NTSTATUS : -1072627711 //0xC0110001 +HIDP_STATUS_INVALID_REPORT_TYPE : NTSTATUS : -1072627710 //0xC0110002 +HIDP_STATUS_INVALID_REPORT_LENGTH : NTSTATUS : -1072627709 //0xC0110003 +HIDP_STATUS_USAGE_NOT_FOUND : NTSTATUS : -1072627708 //0xC0110004 +HIDP_STATUS_VALUE_OUT_OF_RANGE : NTSTATUS : -1072627707 //0xC0110005 +HIDP_STATUS_BAD_LOG_PHY_VALUES : NTSTATUS : -1072627706 //0xC0100006 +HIDP_STATUS_BUFFER_TOO_SMALL : NTSTATUS : -1072627705 //0xC0110007 +HIDP_STATUS_INTERNAL_ERROR : NTSTATUS : -1072627704 //0xC0110008 +HIDP_STATUS_I8042_TRANS_UNKNOWN : NTSTATUS : -1072627703 //0xC0110009 +HIDP_STATUS_INCOMPATIBLE_REPORT_ID : NTSTATUS : -1072627702 //0xC011000A +HIDP_STATUS_NOT_VALUE_ARRAY : NTSTATUS : -1072627701 //0xC011000B +HIDP_STATUS_IS_VALUE_ARRAY : NTSTATUS : -1072627700 //0xC011000C +HIDP_STATUS_DATA_INDEX_NOT_FOUND : NTSTATUS : -1072627699 //0xC011000D HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE : NTSTATUS : -1072627698 //0xC011000E -HIDP_STATUS_BUTTON_NOT_PRESSED : NTSTATUS : -1072627697 //0xC011000F -HIDP_STATUS_REPORT_DOES_NOT_EXIST : NTSTATUS : -1072627696 //0xC0110010 -HIDP_STATUS_NOT_IMPLEMENTED : NTSTATUS : -1072627680 //0xC0110020 -HIDP_STATUS_NOT_BUTTON_ARRAY : NTSTATUS : -1072627679 //0xC0110021 +HIDP_STATUS_BUTTON_NOT_PRESSED : NTSTATUS : -1072627697 //0xC011000F +HIDP_STATUS_REPORT_DOES_NOT_EXIST : NTSTATUS : -1072627696 //0xC0110010 +HIDP_STATUS_NOT_IMPLEMENTED : NTSTATUS : -1072627680 //0xC0110020 +HIDP_STATUS_NOT_BUTTON_ARRAY : NTSTATUS : -1072627679 //0xC0110021 HIDP_STATUS_I8242_TRANS_UNKNOWN :: HIDP_STATUS_I8042_TRANS_UNKNOWN foreign import hid "system:hid.lib" @(default_calling_convention="system") foreign hid { - HidP_GetCaps :: proc(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS --- - HidP_GetButtonCaps :: proc(ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidP_GetValueCaps :: proc(ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidP_GetUsages :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- - HidP_GetUsageValue :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- - HidP_GetData :: proc(ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetCaps :: proc(PreparsedData: PHIDP_PREPARSED_DATA, Capabilities: PHIDP_CAPS) -> NTSTATUS --- + HidP_GetButtonCaps :: proc(ReportType: HIDP_REPORT_TYPE, ButtonCaps: PHIDP_BUTTON_CAPS, ButtonCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- + HidP_GetValueCaps :: proc(ReportType: HIDP_REPORT_TYPE, ValueCaps: PHIDP_VALUE_CAPS, ValueCapsLength: PUSHORT, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- + HidP_GetUsages :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, UsageList: PUSAGE, UsageLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetUsageValue :: proc(ReportType: HIDP_REPORT_TYPE, UsagePage: USAGE, LinkCollection: USHORT, Usage: USAGE, UsageValue: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- + HidP_GetData :: proc(ReportType: HIDP_REPORT_TYPE, DataList: PHIDP_DATA, DataLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA, Report: PCHAR, ReportLength: ULONG) -> NTSTATUS --- HidP_GetLinkCollectionNodes :: proc(LinkCollectionNodes: PHIDP_LINK_COLLECTION_NODE, LinkCollectionNodesLength: PULONG, PreparsedData: PHIDP_PREPARSED_DATA) -> NTSTATUS --- - HidD_GetAttributes :: proc(HidDeviceObject: HANDLE, Attributes: PHIDD_ATTRIBUTES) -> BOOLEAN --- - HidD_GetHidGuid :: proc(HidGuid: LPGUID) --- - HidD_GetPreparsedData :: proc(HidDeviceObject: HANDLE, PreparsedData: ^PHIDP_PREPARSED_DATA) -> BOOLEAN --- - HidD_FreePreparsedData :: proc(PreparsedData: PHIDP_PREPARSED_DATA) -> BOOLEAN --- - HidD_FlushQueue :: proc(HidDeviceObject: HANDLE) -> BOOLEAN --- - HidD_GetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- - HidD_SetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- - HidD_GetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_SetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_GetInputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_SetOutputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- - HidD_GetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: PULONG) -> BOOLEAN --- - HidD_SetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: ULONG) -> BOOLEAN --- + HidD_GetAttributes :: proc(HidDeviceObject: HANDLE, Attributes: PHIDD_ATTRIBUTES) -> BOOLEAN --- + HidD_GetHidGuid :: proc(HidGuid: LPGUID) --- + HidD_GetPreparsedData :: proc(HidDeviceObject: HANDLE, PreparsedData: ^PHIDP_PREPARSED_DATA) -> BOOLEAN --- + HidD_FreePreparsedData :: proc(PreparsedData: PHIDP_PREPARSED_DATA) -> BOOLEAN --- + HidD_FlushQueue :: proc(HidDeviceObject: HANDLE) -> BOOLEAN --- + HidD_GetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- + HidD_SetConfiguration :: proc(HidDeviceObject: HANDLE, Configuration: PHIDD_CONFIGURATION, ConfigurationLength: ULONG) -> BOOLEAN --- + HidD_GetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_SetFeature :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_GetInputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_SetOutputReport :: proc(HidDeviceObject: HANDLE, ReportBuffer: PVOID, ReportBufferLength: ULONG) -> BOOLEAN --- + HidD_GetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: PULONG) -> BOOLEAN --- + HidD_SetNumInputBuffers :: proc(HidDeviceObject: HANDLE, NumberBuffers: ULONG) -> BOOLEAN --- HidD_GetPhysicalDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- HidD_GetManufacturerString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetProductString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetIndexedString :: proc(HidDeviceObject: HANDLE, StringIndex: ULONG, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetProductString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetIndexedString :: proc(HidDeviceObject: HANDLE, StringIndex: ULONG, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- HidD_GetSerialNumberString :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- - HidD_GetMsGenreDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- + HidD_GetMsGenreDescriptor :: proc(HidDeviceObject: HANDLE, Buffer: PVOID, BufferLength: ULONG) -> BOOLEAN --- } diff --git a/core/sys/windows/hidusage.odin b/core/sys/windows/hidusage.odin index eb2a85f2e..5f87bea2d 100644 --- a/core/sys/windows/hidusage.odin +++ b/core/sys/windows/hidusage.odin @@ -4,260 +4,260 @@ package sys_windows USAGE :: distinct USHORT PUSAGE :: ^USAGE -HID_USAGE_PAGE_UNDEFINED :: 0x00 -HID_USAGE_PAGE_GENERIC :: 0x01 -HID_USAGE_PAGE_SIMULATION :: 0x02 -HID_USAGE_PAGE_VR :: 0x03 -HID_USAGE_PAGE_SPORT :: 0x04 -HID_USAGE_PAGE_GAME :: 0x05 -HID_USAGE_PAGE_GENERIC_DEVICE :: 0x06 -HID_USAGE_PAGE_KEYBOARD :: 0x07 -HID_USAGE_PAGE_LED :: 0x08 -HID_USAGE_PAGE_BUTTON :: 0x09 -HID_USAGE_PAGE_ORDINAL :: 0x0A -HID_USAGE_PAGE_TELEPHONY :: 0x0B -HID_USAGE_PAGE_CONSUMER :: 0x0C -HID_USAGE_PAGE_DIGITIZER :: 0x0D -HID_USAGE_PAGE_HAPTICS :: 0x0E -HID_USAGE_PAGE_PID :: 0x0F -HID_USAGE_PAGE_UNICODE :: 0x10 -HID_USAGE_PAGE_ALPHANUMERIC :: 0x14 -HID_USAGE_PAGE_SENSOR :: 0x20 -HID_USAGE_PAGE_LIGHTING_ILLUMINATION :: 0x59 -HID_USAGE_PAGE_BARCODE_SCANNER :: 0x8C -HID_USAGE_PAGE_WEIGHING_DEVICE :: 0x8D -HID_USAGE_PAGE_MAGNETIC_STRIPE_READER :: 0x8E -HID_USAGE_PAGE_CAMERA_CONTROL :: 0x90 -HID_USAGE_PAGE_ARCADE :: 0x91 +HID_USAGE_PAGE_UNDEFINED :: 0x00 +HID_USAGE_PAGE_GENERIC :: 0x01 +HID_USAGE_PAGE_SIMULATION :: 0x02 +HID_USAGE_PAGE_VR :: 0x03 +HID_USAGE_PAGE_SPORT :: 0x04 +HID_USAGE_PAGE_GAME :: 0x05 +HID_USAGE_PAGE_GENERIC_DEVICE :: 0x06 +HID_USAGE_PAGE_KEYBOARD :: 0x07 +HID_USAGE_PAGE_LED :: 0x08 +HID_USAGE_PAGE_BUTTON :: 0x09 +HID_USAGE_PAGE_ORDINAL :: 0x0A +HID_USAGE_PAGE_TELEPHONY :: 0x0B +HID_USAGE_PAGE_CONSUMER :: 0x0C +HID_USAGE_PAGE_DIGITIZER :: 0x0D +HID_USAGE_PAGE_HAPTICS :: 0x0E +HID_USAGE_PAGE_PID :: 0x0F +HID_USAGE_PAGE_UNICODE :: 0x10 +HID_USAGE_PAGE_ALPHANUMERIC :: 0x14 +HID_USAGE_PAGE_SENSOR :: 0x20 +HID_USAGE_PAGE_LIGHTING_ILLUMINATION :: 0x59 +HID_USAGE_PAGE_BARCODE_SCANNER :: 0x8C +HID_USAGE_PAGE_WEIGHING_DEVICE :: 0x8D +HID_USAGE_PAGE_MAGNETIC_STRIPE_READER :: 0x8E +HID_USAGE_PAGE_CAMERA_CONTROL :: 0x90 +HID_USAGE_PAGE_ARCADE :: 0x91 HID_USAGE_PAGE_MICROSOFT_BLUETOOTH_HANDSFREE :: 0xFFF3 -HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN :: 0xFF00 -HID_USAGE_PAGE_VENDOR_DEFINED_END :: 0xFFFF +HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN :: 0xFF00 +HID_USAGE_PAGE_VENDOR_DEFINED_END :: 0xFFFF -HID_USAGE_GENERIC_POINTER :: 0x01 -HID_USAGE_GENERIC_MOUSE :: 0x02 -HID_USAGE_GENERIC_JOYSTICK :: 0x04 -HID_USAGE_GENERIC_GAMEPAD :: 0x05 -HID_USAGE_GENERIC_KEYBOARD :: 0x06 -HID_USAGE_GENERIC_KEYPAD :: 0x07 -HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER :: 0x08 -HID_USAGE_GENERIC_TABLET_PC_SYSTEM_CTL :: 0x09 +HID_USAGE_GENERIC_POINTER :: 0x01 +HID_USAGE_GENERIC_MOUSE :: 0x02 +HID_USAGE_GENERIC_JOYSTICK :: 0x04 +HID_USAGE_GENERIC_GAMEPAD :: 0x05 +HID_USAGE_GENERIC_KEYBOARD :: 0x06 +HID_USAGE_GENERIC_KEYPAD :: 0x07 +HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER :: 0x08 +HID_USAGE_GENERIC_TABLET_PC_SYSTEM_CTL :: 0x09 HID_USAGE_GENERIC_PORTABLE_DEVICE_CONTROL :: 0x0D -HID_USAGE_GENERIC_INTERACTIVE_CONTROL :: 0x0E -HID_USAGE_GENERIC_SYSTEM_CTL :: 0x80 +HID_USAGE_GENERIC_INTERACTIVE_CONTROL :: 0x0E +HID_USAGE_GENERIC_SYSTEM_CTL :: 0x80 -HID_USAGE_GENERIC_X :: 0x30 -HID_USAGE_GENERIC_Y :: 0x31 -HID_USAGE_GENERIC_Z :: 0x32 -HID_USAGE_GENERIC_RX :: 0x33 -HID_USAGE_GENERIC_RY :: 0x34 -HID_USAGE_GENERIC_RZ :: 0x35 -HID_USAGE_GENERIC_SLIDER :: 0x36 -HID_USAGE_GENERIC_DIAL :: 0x37 -HID_USAGE_GENERIC_WHEEL :: 0x38 -HID_USAGE_GENERIC_HATSWITCH :: 0x39 -HID_USAGE_GENERIC_COUNTED_BUFFER :: 0x3A -HID_USAGE_GENERIC_BYTE_COUNT :: 0x3B -HID_USAGE_GENERIC_MOTION_WAKEUP :: 0x3C -HID_USAGE_GENERIC_START :: 0x3D -HID_USAGE_GENERIC_SELECT :: 0x3E -HID_USAGE_GENERIC_VX :: 0x40 -HID_USAGE_GENERIC_VY :: 0x41 -HID_USAGE_GENERIC_VZ :: 0x42 -HID_USAGE_GENERIC_VBRX :: 0x43 -HID_USAGE_GENERIC_VBRY :: 0x44 -HID_USAGE_GENERIC_VBRZ :: 0x45 -HID_USAGE_GENERIC_VNO :: 0x46 -HID_USAGE_GENERIC_FEATURE_NOTIFICATION :: 0x47 -HID_USAGE_GENERIC_RESOLUTION_MULTIPLIER :: 0x48 -HID_USAGE_GENERIC_SYSCTL_POWER :: 0x81 -HID_USAGE_GENERIC_SYSCTL_SLEEP :: 0x82 -HID_USAGE_GENERIC_SYSCTL_WAKE :: 0x83 -HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU :: 0x84 -HID_USAGE_GENERIC_SYSCTL_MAIN_MENU :: 0x85 -HID_USAGE_GENERIC_SYSCTL_APP_MENU :: 0x86 -HID_USAGE_GENERIC_SYSCTL_HELP_MENU :: 0x87 -HID_USAGE_GENERIC_SYSCTL_MENU_EXIT :: 0x88 -HID_USAGE_GENERIC_SYSCTL_MENU_SELECT :: 0x89 -HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT :: 0x8A -HID_USAGE_GENERIC_SYSCTL_MENU_LEFT :: 0x8B -HID_USAGE_GENERIC_SYSCTL_MENU_UP :: 0x8C -HID_USAGE_GENERIC_SYSCTL_MENU_DOWN :: 0x8D -HID_USAGE_GENERIC_SYSCTL_COLD_RESTART :: 0x8E -HID_USAGE_GENERIC_SYSCTL_WARM_RESTART :: 0x8F -HID_USAGE_GENERIC_DPAD_UP :: 0x90 -HID_USAGE_GENERIC_DPAD_DOWN :: 0x91 -HID_USAGE_GENERIC_DPAD_RIGHT :: 0x92 -HID_USAGE_GENERIC_DPAD_LEFT :: 0x93 -HID_USAGE_GENERIC_SYSCTL_FN :: 0x97 -HID_USAGE_GENERIC_SYSCTL_FN_LOCK :: 0x98 -HID_USAGE_GENERIC_SYSCTL_FN_LOCK_INDICATOR :: 0x99 -HID_USAGE_GENERIC_SYSCTL_DISMISS_NOTIFICATION :: 0x9A -HID_USAGE_GENERIC_SYSCTL_DOCK :: 0xA0 -HID_USAGE_GENERIC_SYSCTL_UNDOCK :: 0xA1 -HID_USAGE_GENERIC_SYSCTL_SETUP :: 0xA2 -HID_USAGE_GENERIC_SYSCTL_SYS_BREAK :: 0xA3 -HID_USAGE_GENERIC_SYSCTL_SYS_DBG_BREAK :: 0xA4 -HID_USAGE_GENERIC_SYSCTL_APP_BREAK :: 0xA5 -HID_USAGE_GENERIC_SYSCTL_APP_DBG_BREAK :: 0xA6 -HID_USAGE_GENERIC_SYSCTL_MUTE :: 0xA7 -HID_USAGE_GENERIC_SYSCTL_HIBERNATE :: 0xA8 -HID_USAGE_GENERIC_SYSCTL_DISP_INVERT :: 0xB0 -HID_USAGE_GENERIC_SYSCTL_DISP_INTERNAL :: 0xB1 -HID_USAGE_GENERIC_SYSCTL_DISP_EXTERNAL :: 0xB2 -HID_USAGE_GENERIC_SYSCTL_DISP_BOTH :: 0xB3 -HID_USAGE_GENERIC_SYSCTL_DISP_DUAL :: 0xB4 -HID_USAGE_GENERIC_SYSCTL_DISP_TOGGLE :: 0xB5 -HID_USAGE_GENERIC_SYSCTL_DISP_SWAP :: 0xB6 -HID_USAGE_GENERIC_SYSCTL_DISP_AUTOSCALE :: 0xB7 -HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_BUTTON :: 0xC9 +HID_USAGE_GENERIC_X :: 0x30 +HID_USAGE_GENERIC_Y :: 0x31 +HID_USAGE_GENERIC_Z :: 0x32 +HID_USAGE_GENERIC_RX :: 0x33 +HID_USAGE_GENERIC_RY :: 0x34 +HID_USAGE_GENERIC_RZ :: 0x35 +HID_USAGE_GENERIC_SLIDER :: 0x36 +HID_USAGE_GENERIC_DIAL :: 0x37 +HID_USAGE_GENERIC_WHEEL :: 0x38 +HID_USAGE_GENERIC_HATSWITCH :: 0x39 +HID_USAGE_GENERIC_COUNTED_BUFFER :: 0x3A +HID_USAGE_GENERIC_BYTE_COUNT :: 0x3B +HID_USAGE_GENERIC_MOTION_WAKEUP :: 0x3C +HID_USAGE_GENERIC_START :: 0x3D +HID_USAGE_GENERIC_SELECT :: 0x3E +HID_USAGE_GENERIC_VX :: 0x40 +HID_USAGE_GENERIC_VY :: 0x41 +HID_USAGE_GENERIC_VZ :: 0x42 +HID_USAGE_GENERIC_VBRX :: 0x43 +HID_USAGE_GENERIC_VBRY :: 0x44 +HID_USAGE_GENERIC_VBRZ :: 0x45 +HID_USAGE_GENERIC_VNO :: 0x46 +HID_USAGE_GENERIC_FEATURE_NOTIFICATION :: 0x47 +HID_USAGE_GENERIC_RESOLUTION_MULTIPLIER :: 0x48 +HID_USAGE_GENERIC_SYSCTL_POWER :: 0x81 +HID_USAGE_GENERIC_SYSCTL_SLEEP :: 0x82 +HID_USAGE_GENERIC_SYSCTL_WAKE :: 0x83 +HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU :: 0x84 +HID_USAGE_GENERIC_SYSCTL_MAIN_MENU :: 0x85 +HID_USAGE_GENERIC_SYSCTL_APP_MENU :: 0x86 +HID_USAGE_GENERIC_SYSCTL_HELP_MENU :: 0x87 +HID_USAGE_GENERIC_SYSCTL_MENU_EXIT :: 0x88 +HID_USAGE_GENERIC_SYSCTL_MENU_SELECT :: 0x89 +HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT :: 0x8A +HID_USAGE_GENERIC_SYSCTL_MENU_LEFT :: 0x8B +HID_USAGE_GENERIC_SYSCTL_MENU_UP :: 0x8C +HID_USAGE_GENERIC_SYSCTL_MENU_DOWN :: 0x8D +HID_USAGE_GENERIC_SYSCTL_COLD_RESTART :: 0x8E +HID_USAGE_GENERIC_SYSCTL_WARM_RESTART :: 0x8F +HID_USAGE_GENERIC_DPAD_UP :: 0x90 +HID_USAGE_GENERIC_DPAD_DOWN :: 0x91 +HID_USAGE_GENERIC_DPAD_RIGHT :: 0x92 +HID_USAGE_GENERIC_DPAD_LEFT :: 0x93 +HID_USAGE_GENERIC_SYSCTL_FN :: 0x97 +HID_USAGE_GENERIC_SYSCTL_FN_LOCK :: 0x98 +HID_USAGE_GENERIC_SYSCTL_FN_LOCK_INDICATOR :: 0x99 +HID_USAGE_GENERIC_SYSCTL_DISMISS_NOTIFICATION :: 0x9A +HID_USAGE_GENERIC_SYSCTL_DOCK :: 0xA0 +HID_USAGE_GENERIC_SYSCTL_UNDOCK :: 0xA1 +HID_USAGE_GENERIC_SYSCTL_SETUP :: 0xA2 +HID_USAGE_GENERIC_SYSCTL_SYS_BREAK :: 0xA3 +HID_USAGE_GENERIC_SYSCTL_SYS_DBG_BREAK :: 0xA4 +HID_USAGE_GENERIC_SYSCTL_APP_BREAK :: 0xA5 +HID_USAGE_GENERIC_SYSCTL_APP_DBG_BREAK :: 0xA6 +HID_USAGE_GENERIC_SYSCTL_MUTE :: 0xA7 +HID_USAGE_GENERIC_SYSCTL_HIBERNATE :: 0xA8 +HID_USAGE_GENERIC_SYSCTL_DISP_INVERT :: 0xB0 +HID_USAGE_GENERIC_SYSCTL_DISP_INTERNAL :: 0xB1 +HID_USAGE_GENERIC_SYSCTL_DISP_EXTERNAL :: 0xB2 +HID_USAGE_GENERIC_SYSCTL_DISP_BOTH :: 0xB3 +HID_USAGE_GENERIC_SYSCTL_DISP_DUAL :: 0xB4 +HID_USAGE_GENERIC_SYSCTL_DISP_TOGGLE :: 0xB5 +HID_USAGE_GENERIC_SYSCTL_DISP_SWAP :: 0xB6 +HID_USAGE_GENERIC_SYSCTL_DISP_AUTOSCALE :: 0xB7 +HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_BUTTON :: 0xC9 HID_USAGE_GENERIC_SYSTEM_DISPLAY_ROTATION_LOCK_SLIDER_SWITCH :: 0xCA -HID_USAGE_GENERIC_CONTROL_ENABLE :: 0xCB +HID_USAGE_GENERIC_CONTROL_ENABLE :: 0xCB -HID_USAGE_SIMULATION_FLIGHT_SIMULATION_DEVICE :: 0x01 -HID_USAGE_SIMULATION_AUTOMOBILE_SIMULATION_DEVICE :: 0x02 -HID_USAGE_SIMULATION_TANK_SIMULATION_DEVICE :: 0x03 -HID_USAGE_SIMULATION_SPACESHIP_SIMULATION_DEVICE :: 0x04 -HID_USAGE_SIMULATION_SUBMARINE_SIMULATION_DEVICE :: 0x05 -HID_USAGE_SIMULATION_SAILING_SIMULATION_DEVICE :: 0x06 -HID_USAGE_SIMULATION_MOTORCYCLE_SIMULATION_DEVICE :: 0x07 -HID_USAGE_SIMULATION_SPORTS_SIMULATION_DEVICE :: 0x08 -HID_USAGE_SIMULATION_AIRPLANE_SIMULATION_DEVICE :: 0x09 -HID_USAGE_SIMULATION_HELICOPTER_SIMULATION_DEVICE :: 0x0A +HID_USAGE_SIMULATION_FLIGHT_SIMULATION_DEVICE :: 0x01 +HID_USAGE_SIMULATION_AUTOMOBILE_SIMULATION_DEVICE :: 0x02 +HID_USAGE_SIMULATION_TANK_SIMULATION_DEVICE :: 0x03 +HID_USAGE_SIMULATION_SPACESHIP_SIMULATION_DEVICE :: 0x04 +HID_USAGE_SIMULATION_SUBMARINE_SIMULATION_DEVICE :: 0x05 +HID_USAGE_SIMULATION_SAILING_SIMULATION_DEVICE :: 0x06 +HID_USAGE_SIMULATION_MOTORCYCLE_SIMULATION_DEVICE :: 0x07 +HID_USAGE_SIMULATION_SPORTS_SIMULATION_DEVICE :: 0x08 +HID_USAGE_SIMULATION_AIRPLANE_SIMULATION_DEVICE :: 0x09 +HID_USAGE_SIMULATION_HELICOPTER_SIMULATION_DEVICE :: 0x0A HID_USAGE_SIMULATION_MAGIC_CARPET_SIMULATION_DEVICE :: 0x0B -HID_USAGE_SIMULATION_BICYCLE_SIMULATION_DEVICE :: 0x0C -HID_USAGE_SIMULATION_FLIGHT_CONTROL_STICK :: 0x20 -HID_USAGE_SIMULATION_FLIGHT_STICK :: 0x21 -HID_USAGE_SIMULATION_CYCLIC_CONTROL :: 0x22 -HID_USAGE_SIMULATION_CYCLIC_TRIM :: 0x23 -HID_USAGE_SIMULATION_FLIGHT_YOKE :: 0x24 -HID_USAGE_SIMULATION_TRACK_CONTROL :: 0x25 +HID_USAGE_SIMULATION_BICYCLE_SIMULATION_DEVICE :: 0x0C +HID_USAGE_SIMULATION_FLIGHT_CONTROL_STICK :: 0x20 +HID_USAGE_SIMULATION_FLIGHT_STICK :: 0x21 +HID_USAGE_SIMULATION_CYCLIC_CONTROL :: 0x22 +HID_USAGE_SIMULATION_CYCLIC_TRIM :: 0x23 +HID_USAGE_SIMULATION_FLIGHT_YOKE :: 0x24 +HID_USAGE_SIMULATION_TRACK_CONTROL :: 0x25 -HID_USAGE_SIMULATION_AILERON :: 0xB0 -HID_USAGE_SIMULATION_AILERON_TRIM :: 0xB1 -HID_USAGE_SIMULATION_ANTI_TORQUE_CONTROL :: 0xB2 -HID_USAGE_SIMULATION_AUTOPIOLOT_ENABLE :: 0xB3 -HID_USAGE_SIMULATION_CHAFF_RELEASE :: 0xB4 -HID_USAGE_SIMULATION_COLLECTIVE_CONTROL :: 0xB5 -HID_USAGE_SIMULATION_DIVE_BRAKE :: 0xB6 +HID_USAGE_SIMULATION_AILERON :: 0xB0 +HID_USAGE_SIMULATION_AILERON_TRIM :: 0xB1 +HID_USAGE_SIMULATION_ANTI_TORQUE_CONTROL :: 0xB2 +HID_USAGE_SIMULATION_AUTOPIOLOT_ENABLE :: 0xB3 +HID_USAGE_SIMULATION_CHAFF_RELEASE :: 0xB4 +HID_USAGE_SIMULATION_COLLECTIVE_CONTROL :: 0xB5 +HID_USAGE_SIMULATION_DIVE_BRAKE :: 0xB6 HID_USAGE_SIMULATION_ELECTRONIC_COUNTERMEASURES :: 0xB7 -HID_USAGE_SIMULATION_ELEVATOR :: 0xB8 -HID_USAGE_SIMULATION_ELEVATOR_TRIM :: 0xB9 -HID_USAGE_SIMULATION_RUDDER :: 0xBA -HID_USAGE_SIMULATION_THROTTLE :: 0xBB -HID_USAGE_SIMULATION_FLIGHT_COMMUNICATIONS :: 0xBC -HID_USAGE_SIMULATION_FLARE_RELEASE :: 0xBD -HID_USAGE_SIMULATION_LANDING_GEAR :: 0xBE -HID_USAGE_SIMULATION_TOE_BRAKE :: 0xBF -HID_USAGE_SIMULATION_TRIGGER :: 0xC0 -HID_USAGE_SIMULATION_WEAPONS_ARM :: 0xC1 -HID_USAGE_SIMULATION_WEAPONS_SELECT :: 0xC2 -HID_USAGE_SIMULATION_WING_FLAPS :: 0xC3 -HID_USAGE_SIMULATION_ACCELLERATOR :: 0xC4 -HID_USAGE_SIMULATION_BRAKE :: 0xC5 -HID_USAGE_SIMULATION_CLUTCH :: 0xC6 -HID_USAGE_SIMULATION_SHIFTER :: 0xC7 -HID_USAGE_SIMULATION_STEERING :: 0xC8 -HID_USAGE_SIMULATION_TURRET_DIRECTION :: 0xC9 -HID_USAGE_SIMULATION_BARREL_ELEVATION :: 0xCA -HID_USAGE_SIMULATION_DIVE_PLANE :: 0xCB -HID_USAGE_SIMULATION_BALLAST :: 0xCC -HID_USAGE_SIMULATION_BICYCLE_CRANK :: 0xCD -HID_USAGE_SIMULATION_HANDLE_BARS :: 0xCE -HID_USAGE_SIMULATION_FRONT_BRAKE :: 0xCF -HID_USAGE_SIMULATION_REAR_BRAKE :: 0xD0 +HID_USAGE_SIMULATION_ELEVATOR :: 0xB8 +HID_USAGE_SIMULATION_ELEVATOR_TRIM :: 0xB9 +HID_USAGE_SIMULATION_RUDDER :: 0xBA +HID_USAGE_SIMULATION_THROTTLE :: 0xBB +HID_USAGE_SIMULATION_FLIGHT_COMMUNICATIONS :: 0xBC +HID_USAGE_SIMULATION_FLARE_RELEASE :: 0xBD +HID_USAGE_SIMULATION_LANDING_GEAR :: 0xBE +HID_USAGE_SIMULATION_TOE_BRAKE :: 0xBF +HID_USAGE_SIMULATION_TRIGGER :: 0xC0 +HID_USAGE_SIMULATION_WEAPONS_ARM :: 0xC1 +HID_USAGE_SIMULATION_WEAPONS_SELECT :: 0xC2 +HID_USAGE_SIMULATION_WING_FLAPS :: 0xC3 +HID_USAGE_SIMULATION_ACCELLERATOR :: 0xC4 +HID_USAGE_SIMULATION_BRAKE :: 0xC5 +HID_USAGE_SIMULATION_CLUTCH :: 0xC6 +HID_USAGE_SIMULATION_SHIFTER :: 0xC7 +HID_USAGE_SIMULATION_STEERING :: 0xC8 +HID_USAGE_SIMULATION_TURRET_DIRECTION :: 0xC9 +HID_USAGE_SIMULATION_BARREL_ELEVATION :: 0xCA +HID_USAGE_SIMULATION_DIVE_PLANE :: 0xCB +HID_USAGE_SIMULATION_BALLAST :: 0xCC +HID_USAGE_SIMULATION_BICYCLE_CRANK :: 0xCD +HID_USAGE_SIMULATION_HANDLE_BARS :: 0xCE +HID_USAGE_SIMULATION_FRONT_BRAKE :: 0xCF +HID_USAGE_SIMULATION_REAR_BRAKE :: 0xD0 -HID_USAGE_VR_BELT :: 0x01 -HID_USAGE_VR_BODY_SUIT :: 0x02 -HID_USAGE_VR_FLEXOR :: 0x03 -HID_USAGE_VR_GLOVE :: 0x04 -HID_USAGE_VR_HEAD_TRACKER :: 0x05 +HID_USAGE_VR_BELT :: 0x01 +HID_USAGE_VR_BODY_SUIT :: 0x02 +HID_USAGE_VR_FLEXOR :: 0x03 +HID_USAGE_VR_GLOVE :: 0x04 +HID_USAGE_VR_HEAD_TRACKER :: 0x05 HID_USAGE_VR_HEAD_MOUNTED_DISPLAY :: 0x06 -HID_USAGE_VR_HAND_TRACKER :: 0x07 -HID_USAGE_VR_OCULOMETER :: 0x08 -HID_USAGE_VR_VEST :: 0x09 -HID_USAGE_VR_ANIMATRONIC_DEVICE :: 0x0A +HID_USAGE_VR_HAND_TRACKER :: 0x07 +HID_USAGE_VR_OCULOMETER :: 0x08 +HID_USAGE_VR_VEST :: 0x09 +HID_USAGE_VR_ANIMATRONIC_DEVICE :: 0x0A -HID_USAGE_VR_STEREO_ENABLE :: 0x20 +HID_USAGE_VR_STEREO_ENABLE :: 0x20 HID_USAGE_VR_DISPLAY_ENABLE :: 0x21 -HID_USAGE_SPORT_BASEBALL_BAT :: 0x01 -HID_USAGE_SPORT_GOLF_CLUB :: 0x02 +HID_USAGE_SPORT_BASEBALL_BAT :: 0x01 +HID_USAGE_SPORT_GOLF_CLUB :: 0x02 HID_USAGE_SPORT_ROWING_MACHINE :: 0x03 -HID_USAGE_SPORT_TREADMILL :: 0x04 -HID_USAGE_SPORT_STICK_TYPE :: 0x38 +HID_USAGE_SPORT_TREADMILL :: 0x04 +HID_USAGE_SPORT_STICK_TYPE :: 0x38 -HID_USAGE_SPORT_OAR :: 0x30 -HID_USAGE_SPORT_SLOPE :: 0x31 -HID_USAGE_SPORT_RATE :: 0x32 -HID_USAGE_SPORT_STICK_SPEED :: 0x33 +HID_USAGE_SPORT_OAR :: 0x30 +HID_USAGE_SPORT_SLOPE :: 0x31 +HID_USAGE_SPORT_RATE :: 0x32 +HID_USAGE_SPORT_STICK_SPEED :: 0x33 HID_USAGE_SPORT_STICK_FACE_ANGLE :: 0x34 -HID_USAGE_SPORT_HEEL_TOE :: 0x35 -HID_USAGE_SPORT_FOLLOW_THROUGH :: 0x36 -HID_USAGE_SPORT_TEMPO :: 0x37 -HID_USAGE_SPORT_HEIGHT :: 0x39 -HID_USAGE_SPORT_PUTTER :: 0x50 -HID_USAGE_SPORT_1_IRON :: 0x51 -HID_USAGE_SPORT_2_IRON :: 0x52 -HID_USAGE_SPORT_3_IRON :: 0x53 -HID_USAGE_SPORT_4_IRON :: 0x54 -HID_USAGE_SPORT_5_IRON :: 0x55 -HID_USAGE_SPORT_6_IRON :: 0x56 -HID_USAGE_SPORT_7_IRON :: 0x57 -HID_USAGE_SPORT_8_IRON :: 0x58 -HID_USAGE_SPORT_9_IRON :: 0x59 -HID_USAGE_SPORT_10_IRON :: 0x5A -HID_USAGE_SPORT_11_IRON :: 0x5B -HID_USAGE_SPORT_SAND_WEDGE :: 0x5C -HID_USAGE_SPORT_LOFT_WEDGE :: 0x5D -HID_USAGE_SPORT_POWER_WEDGE :: 0x5E -HID_USAGE_SPORT_1_WOOD :: 0x5F -HID_USAGE_SPORT_3_WOOD :: 0x60 -HID_USAGE_SPORT_5_WOOD :: 0x61 -HID_USAGE_SPORT_7_WOOD :: 0x62 -HID_USAGE_SPORT_9_WOOD :: 0x63 +HID_USAGE_SPORT_HEEL_TOE :: 0x35 +HID_USAGE_SPORT_FOLLOW_THROUGH :: 0x36 +HID_USAGE_SPORT_TEMPO :: 0x37 +HID_USAGE_SPORT_HEIGHT :: 0x39 +HID_USAGE_SPORT_PUTTER :: 0x50 +HID_USAGE_SPORT_1_IRON :: 0x51 +HID_USAGE_SPORT_2_IRON :: 0x52 +HID_USAGE_SPORT_3_IRON :: 0x53 +HID_USAGE_SPORT_4_IRON :: 0x54 +HID_USAGE_SPORT_5_IRON :: 0x55 +HID_USAGE_SPORT_6_IRON :: 0x56 +HID_USAGE_SPORT_7_IRON :: 0x57 +HID_USAGE_SPORT_8_IRON :: 0x58 +HID_USAGE_SPORT_9_IRON :: 0x59 +HID_USAGE_SPORT_10_IRON :: 0x5A +HID_USAGE_SPORT_11_IRON :: 0x5B +HID_USAGE_SPORT_SAND_WEDGE :: 0x5C +HID_USAGE_SPORT_LOFT_WEDGE :: 0x5D +HID_USAGE_SPORT_POWER_WEDGE :: 0x5E +HID_USAGE_SPORT_1_WOOD :: 0x5F +HID_USAGE_SPORT_3_WOOD :: 0x60 +HID_USAGE_SPORT_5_WOOD :: 0x61 +HID_USAGE_SPORT_7_WOOD :: 0x62 +HID_USAGE_SPORT_9_WOOD :: 0x63 HID_USAGE_GAME_3D_GAME_CONTROLLER :: 0x01 -HID_USAGE_GAME_PINBALL_DEVICE :: 0x02 -HID_USAGE_GAME_GUN_DEVICE :: 0x03 -HID_USAGE_GAME_POINT_OF_VIEW :: 0x20 -HID_USAGE_GAME_GUN_SELECTOR :: 0x32 -HID_USAGE_GAME_GAMEPAD_FIRE_JUMP :: 0x37 -HID_USAGE_GAME_GAMEPAD_TRIGGER :: 0x39 +HID_USAGE_GAME_PINBALL_DEVICE :: 0x02 +HID_USAGE_GAME_GUN_DEVICE :: 0x03 +HID_USAGE_GAME_POINT_OF_VIEW :: 0x20 +HID_USAGE_GAME_GUN_SELECTOR :: 0x32 +HID_USAGE_GAME_GAMEPAD_FIRE_JUMP :: 0x37 +HID_USAGE_GAME_GAMEPAD_TRIGGER :: 0x39 -HID_USAGE_GAME_TURN_RIGHT_LEFT :: 0x21 +HID_USAGE_GAME_TURN_RIGHT_LEFT :: 0x21 HID_USAGE_GAME_PITCH_FORWARD_BACK :: 0x22 -HID_USAGE_GAME_ROLL_RIGHT_LEFT :: 0x23 -HID_USAGE_GAME_MOVE_RIGHT_LEFT :: 0x24 -HID_USAGE_GAME_MOVE_FORWARD_BACK :: 0x25 -HID_USAGE_GAME_MOVE_UP_DOWN :: 0x26 -HID_USAGE_GAME_LEAN_RIGHT_LEFT :: 0x27 -HID_USAGE_GAME_LEAN_FORWARD_BACK :: 0x28 -HID_USAGE_GAME_POV_HEIGHT :: 0x29 -HID_USAGE_GAME_FLIPPER :: 0x2A -HID_USAGE_GAME_SECONDARY_FLIPPER :: 0x2B -HID_USAGE_GAME_BUMP :: 0x2C -HID_USAGE_GAME_NEW_GAME :: 0x2D -HID_USAGE_GAME_SHOOT_BALL :: 0x2E -HID_USAGE_GAME_PLAYER :: 0x2F -HID_USAGE_GAME_GUN_BOLT :: 0x30 -HID_USAGE_GAME_GUN_CLIP :: 0x31 -HID_USAGE_GAME_GUN_SINGLE_SHOT :: 0x33 -HID_USAGE_GAME_GUN_BURST :: 0x34 -HID_USAGE_GAME_GUN_AUTOMATIC :: 0x35 -HID_USAGE_GAME_GUN_SAFETY :: 0x36 +HID_USAGE_GAME_ROLL_RIGHT_LEFT :: 0x23 +HID_USAGE_GAME_MOVE_RIGHT_LEFT :: 0x24 +HID_USAGE_GAME_MOVE_FORWARD_BACK :: 0x25 +HID_USAGE_GAME_MOVE_UP_DOWN :: 0x26 +HID_USAGE_GAME_LEAN_RIGHT_LEFT :: 0x27 +HID_USAGE_GAME_LEAN_FORWARD_BACK :: 0x28 +HID_USAGE_GAME_POV_HEIGHT :: 0x29 +HID_USAGE_GAME_FLIPPER :: 0x2A +HID_USAGE_GAME_SECONDARY_FLIPPER :: 0x2B +HID_USAGE_GAME_BUMP :: 0x2C +HID_USAGE_GAME_NEW_GAME :: 0x2D +HID_USAGE_GAME_SHOOT_BALL :: 0x2E +HID_USAGE_GAME_PLAYER :: 0x2F +HID_USAGE_GAME_GUN_BOLT :: 0x30 +HID_USAGE_GAME_GUN_CLIP :: 0x31 +HID_USAGE_GAME_GUN_SINGLE_SHOT :: 0x33 +HID_USAGE_GAME_GUN_BURST :: 0x34 +HID_USAGE_GAME_GUN_AUTOMATIC :: 0x35 +HID_USAGE_GAME_GUN_SAFETY :: 0x36 -HID_USAGE_GENERIC_DEVICE_BATTERY_STRENGTH :: 0x20 -HID_USAGE_GENERIC_DEVICE_WIRELESS_CHANNEL :: 0x21 -HID_USAGE_GENERIC_DEVICE_WIRELESS_ID :: 0x22 -HID_USAGE_GENERIC_DEVICE_DISCOVER_WIRELESS_CONTROL :: 0x23 +HID_USAGE_GENERIC_DEVICE_BATTERY_STRENGTH :: 0x20 +HID_USAGE_GENERIC_DEVICE_WIRELESS_CHANNEL :: 0x21 +HID_USAGE_GENERIC_DEVICE_WIRELESS_ID :: 0x22 +HID_USAGE_GENERIC_DEVICE_DISCOVER_WIRELESS_CONTROL :: 0x23 HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ENTERED :: 0x24 -HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ERASED :: 0x25 -HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CLEARED :: 0x26 +HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CHAR_ERASED :: 0x25 +HID_USAGE_GENERIC_DEVICE_SECURITY_CODE_CLEARED :: 0x26 // Error "keys" -HID_USAGE_KEYBOARD_NOEVENT :: 0x00 -HID_USAGE_KEYBOARD_ROLLOVER :: 0x01 -HID_USAGE_KEYBOARD_POSTFAIL :: 0x02 +HID_USAGE_KEYBOARD_NOEVENT :: 0x00 +HID_USAGE_KEYBOARD_ROLLOVER :: 0x01 +HID_USAGE_KEYBOARD_POSTFAIL :: 0x02 HID_USAGE_KEYBOARD_UNDEFINED :: 0x03 // Letters @@ -265,32 +265,32 @@ HID_USAGE_KEYBOARD_aA :: 0x04 HID_USAGE_KEYBOARD_zZ :: 0x1D // Numbers -HID_USAGE_KEYBOARD_ONE :: 0x1E +HID_USAGE_KEYBOARD_ONE :: 0x1E HID_USAGE_KEYBOARD_ZERO :: 0x27 // Modifier Keys -HID_USAGE_KEYBOARD_LCTRL :: 0xE0 -HID_USAGE_KEYBOARD_LSHFT :: 0xE1 -HID_USAGE_KEYBOARD_LALT :: 0xE2 -HID_USAGE_KEYBOARD_LGUI :: 0xE3 -HID_USAGE_KEYBOARD_RCTRL :: 0xE4 -HID_USAGE_KEYBOARD_RSHFT :: 0xE5 -HID_USAGE_KEYBOARD_RALT :: 0xE6 -HID_USAGE_KEYBOARD_RGUI :: 0xE7 +HID_USAGE_KEYBOARD_LCTRL :: 0xE0 +HID_USAGE_KEYBOARD_LSHFT :: 0xE1 +HID_USAGE_KEYBOARD_LALT :: 0xE2 +HID_USAGE_KEYBOARD_LGUI :: 0xE3 +HID_USAGE_KEYBOARD_RCTRL :: 0xE4 +HID_USAGE_KEYBOARD_RSHFT :: 0xE5 +HID_USAGE_KEYBOARD_RALT :: 0xE6 +HID_USAGE_KEYBOARD_RGUI :: 0xE7 HID_USAGE_KEYBOARD_SCROLL_LOCK :: 0x47 -HID_USAGE_KEYBOARD_NUM_LOCK :: 0x53 -HID_USAGE_KEYBOARD_CAPS_LOCK :: 0x39 +HID_USAGE_KEYBOARD_NUM_LOCK :: 0x53 +HID_USAGE_KEYBOARD_CAPS_LOCK :: 0x39 // Function keys -HID_USAGE_KEYBOARD_F1 :: 0x3A -HID_USAGE_KEYBOARD_F2 :: 0x3B -HID_USAGE_KEYBOARD_F3 :: 0x3C -HID_USAGE_KEYBOARD_F4 :: 0x3D -HID_USAGE_KEYBOARD_F5 :: 0x3E -HID_USAGE_KEYBOARD_F6 :: 0x3F -HID_USAGE_KEYBOARD_F7 :: 0x40 -HID_USAGE_KEYBOARD_F8 :: 0x41 -HID_USAGE_KEYBOARD_F9 :: 0x42 +HID_USAGE_KEYBOARD_F1 :: 0x3A +HID_USAGE_KEYBOARD_F2 :: 0x3B +HID_USAGE_KEYBOARD_F3 :: 0x3C +HID_USAGE_KEYBOARD_F4 :: 0x3D +HID_USAGE_KEYBOARD_F5 :: 0x3E +HID_USAGE_KEYBOARD_F6 :: 0x3F +HID_USAGE_KEYBOARD_F7 :: 0x40 +HID_USAGE_KEYBOARD_F8 :: 0x41 +HID_USAGE_KEYBOARD_F9 :: 0x42 HID_USAGE_KEYBOARD_F10 :: 0x43 HID_USAGE_KEYBOARD_F11 :: 0x44 HID_USAGE_KEYBOARD_F12 :: 0x45 @@ -315,103 +315,103 @@ HID_USAGE_KEYBOARD_PRINT_SCREEN :: 0x46 HID_USAGE_KEYBOARD_DELETE_FORWARD :: 0x4C // Numeric Keypad -HID_USAGE_KEYBOARD_KEYPAD_1_AND_END :: 0x59 +HID_USAGE_KEYBOARD_KEYPAD_1_AND_END :: 0x59 HID_USAGE_KEYBOARD_KEYPAD_0_AND_INSERT :: 0x62 -HID_USAGE_LED_NUM_LOCK :: 0x01 -HID_USAGE_LED_CAPS_LOCK :: 0x02 -HID_USAGE_LED_SCROLL_LOCK :: 0x03 -HID_USAGE_LED_COMPOSE :: 0x04 -HID_USAGE_LED_KANA :: 0x05 -HID_USAGE_LED_POWER :: 0x06 -HID_USAGE_LED_SHIFT :: 0x07 -HID_USAGE_LED_DO_NOT_DISTURB :: 0x08 -HID_USAGE_LED_MUTE :: 0x09 -HID_USAGE_LED_TONE_ENABLE :: 0x0A -HID_USAGE_LED_HIGH_CUT_FILTER :: 0x0B -HID_USAGE_LED_LOW_CUT_FILTER :: 0x0C -HID_USAGE_LED_EQUALIZER_ENABLE :: 0x0D -HID_USAGE_LED_SOUND_FIELD_ON :: 0x0E -HID_USAGE_LED_SURROUND_FIELD_ON :: 0x0F -HID_USAGE_LED_REPEAT :: 0x10 -HID_USAGE_LED_STEREO :: 0x11 +HID_USAGE_LED_NUM_LOCK :: 0x01 +HID_USAGE_LED_CAPS_LOCK :: 0x02 +HID_USAGE_LED_SCROLL_LOCK :: 0x03 +HID_USAGE_LED_COMPOSE :: 0x04 +HID_USAGE_LED_KANA :: 0x05 +HID_USAGE_LED_POWER :: 0x06 +HID_USAGE_LED_SHIFT :: 0x07 +HID_USAGE_LED_DO_NOT_DISTURB :: 0x08 +HID_USAGE_LED_MUTE :: 0x09 +HID_USAGE_LED_TONE_ENABLE :: 0x0A +HID_USAGE_LED_HIGH_CUT_FILTER :: 0x0B +HID_USAGE_LED_LOW_CUT_FILTER :: 0x0C +HID_USAGE_LED_EQUALIZER_ENABLE :: 0x0D +HID_USAGE_LED_SOUND_FIELD_ON :: 0x0E +HID_USAGE_LED_SURROUND_FIELD_ON :: 0x0F +HID_USAGE_LED_REPEAT :: 0x10 +HID_USAGE_LED_STEREO :: 0x11 HID_USAGE_LED_SAMPLING_RATE_DETECT :: 0x12 -HID_USAGE_LED_SPINNING :: 0x13 -HID_USAGE_LED_CAV :: 0x14 -HID_USAGE_LED_CLV :: 0x15 +HID_USAGE_LED_SPINNING :: 0x13 +HID_USAGE_LED_CAV :: 0x14 +HID_USAGE_LED_CLV :: 0x15 HID_USAGE_LED_RECORDING_FORMAT_DET :: 0x16 -HID_USAGE_LED_OFF_HOOK :: 0x17 -HID_USAGE_LED_RING :: 0x18 -HID_USAGE_LED_MESSAGE_WAITING :: 0x19 -HID_USAGE_LED_DATA_MODE :: 0x1A -HID_USAGE_LED_BATTERY_OPERATION :: 0x1B -HID_USAGE_LED_BATTERY_OK :: 0x1C -HID_USAGE_LED_BATTERY_LOW :: 0x1D -HID_USAGE_LED_SPEAKER :: 0x1E -HID_USAGE_LED_HEAD_SET :: 0x1F -HID_USAGE_LED_HOLD :: 0x20 -HID_USAGE_LED_MICROPHONE :: 0x21 -HID_USAGE_LED_COVERAGE :: 0x22 -HID_USAGE_LED_NIGHT_MODE :: 0x23 -HID_USAGE_LED_SEND_CALLS :: 0x24 -HID_USAGE_LED_CALL_PICKUP :: 0x25 -HID_USAGE_LED_CONFERENCE :: 0x26 -HID_USAGE_LED_STAND_BY :: 0x27 -HID_USAGE_LED_CAMERA_ON :: 0x28 -HID_USAGE_LED_CAMERA_OFF :: 0x29 -HID_USAGE_LED_ON_LINE :: 0x2A -HID_USAGE_LED_OFF_LINE :: 0x2B -HID_USAGE_LED_BUSY :: 0x2C -HID_USAGE_LED_READY :: 0x2D -HID_USAGE_LED_PAPER_OUT :: 0x2E -HID_USAGE_LED_PAPER_JAM :: 0x2F -HID_USAGE_LED_REMOTE :: 0x30 -HID_USAGE_LED_FORWARD :: 0x31 -HID_USAGE_LED_REVERSE :: 0x32 -HID_USAGE_LED_STOP :: 0x33 -HID_USAGE_LED_REWIND :: 0x34 -HID_USAGE_LED_FAST_FORWARD :: 0x35 -HID_USAGE_LED_PLAY :: 0x36 -HID_USAGE_LED_PAUSE :: 0x37 -HID_USAGE_LED_RECORD :: 0x38 -HID_USAGE_LED_ERROR :: 0x39 -HID_USAGE_LED_SELECTED_INDICATOR :: 0x3A -HID_USAGE_LED_IN_USE_INDICATOR :: 0x3B +HID_USAGE_LED_OFF_HOOK :: 0x17 +HID_USAGE_LED_RING :: 0x18 +HID_USAGE_LED_MESSAGE_WAITING :: 0x19 +HID_USAGE_LED_DATA_MODE :: 0x1A +HID_USAGE_LED_BATTERY_OPERATION :: 0x1B +HID_USAGE_LED_BATTERY_OK :: 0x1C +HID_USAGE_LED_BATTERY_LOW :: 0x1D +HID_USAGE_LED_SPEAKER :: 0x1E +HID_USAGE_LED_HEAD_SET :: 0x1F +HID_USAGE_LED_HOLD :: 0x20 +HID_USAGE_LED_MICROPHONE :: 0x21 +HID_USAGE_LED_COVERAGE :: 0x22 +HID_USAGE_LED_NIGHT_MODE :: 0x23 +HID_USAGE_LED_SEND_CALLS :: 0x24 +HID_USAGE_LED_CALL_PICKUP :: 0x25 +HID_USAGE_LED_CONFERENCE :: 0x26 +HID_USAGE_LED_STAND_BY :: 0x27 +HID_USAGE_LED_CAMERA_ON :: 0x28 +HID_USAGE_LED_CAMERA_OFF :: 0x29 +HID_USAGE_LED_ON_LINE :: 0x2A +HID_USAGE_LED_OFF_LINE :: 0x2B +HID_USAGE_LED_BUSY :: 0x2C +HID_USAGE_LED_READY :: 0x2D +HID_USAGE_LED_PAPER_OUT :: 0x2E +HID_USAGE_LED_PAPER_JAM :: 0x2F +HID_USAGE_LED_REMOTE :: 0x30 +HID_USAGE_LED_FORWARD :: 0x31 +HID_USAGE_LED_REVERSE :: 0x32 +HID_USAGE_LED_STOP :: 0x33 +HID_USAGE_LED_REWIND :: 0x34 +HID_USAGE_LED_FAST_FORWARD :: 0x35 +HID_USAGE_LED_PLAY :: 0x36 +HID_USAGE_LED_PAUSE :: 0x37 +HID_USAGE_LED_RECORD :: 0x38 +HID_USAGE_LED_ERROR :: 0x39 +HID_USAGE_LED_SELECTED_INDICATOR :: 0x3A +HID_USAGE_LED_IN_USE_INDICATOR :: 0x3B HID_USAGE_LED_MULTI_MODE_INDICATOR :: 0x3C -HID_USAGE_LED_INDICATOR_ON :: 0x3D -HID_USAGE_LED_INDICATOR_FLASH :: 0x3E +HID_USAGE_LED_INDICATOR_ON :: 0x3D +HID_USAGE_LED_INDICATOR_FLASH :: 0x3E HID_USAGE_LED_INDICATOR_SLOW_BLINK :: 0x3F HID_USAGE_LED_INDICATOR_FAST_BLINK :: 0x40 -HID_USAGE_LED_INDICATOR_OFF :: 0x41 -HID_USAGE_LED_FLASH_ON_TIME :: 0x42 -HID_USAGE_LED_SLOW_BLINK_ON_TIME :: 0x43 -HID_USAGE_LED_SLOW_BLINK_OFF_TIME :: 0x44 -HID_USAGE_LED_FAST_BLINK_ON_TIME :: 0x45 -HID_USAGE_LED_FAST_BLINK_OFF_TIME :: 0x46 -HID_USAGE_LED_INDICATOR_COLOR :: 0x47 -HID_USAGE_LED_RED :: 0x48 -HID_USAGE_LED_GREEN :: 0x49 -HID_USAGE_LED_AMBER :: 0x4A -HID_USAGE_LED_GENERIC_INDICATOR :: 0x4B -HID_USAGE_LED_SYSTEM_SUSPEND :: 0x4C -HID_USAGE_LED_EXTERNAL_POWER :: 0x4D +HID_USAGE_LED_INDICATOR_OFF :: 0x41 +HID_USAGE_LED_FLASH_ON_TIME :: 0x42 +HID_USAGE_LED_SLOW_BLINK_ON_TIME :: 0x43 +HID_USAGE_LED_SLOW_BLINK_OFF_TIME :: 0x44 +HID_USAGE_LED_FAST_BLINK_ON_TIME :: 0x45 +HID_USAGE_LED_FAST_BLINK_OFF_TIME :: 0x46 +HID_USAGE_LED_INDICATOR_COLOR :: 0x47 +HID_USAGE_LED_RED :: 0x48 +HID_USAGE_LED_GREEN :: 0x49 +HID_USAGE_LED_AMBER :: 0x4A +HID_USAGE_LED_GENERIC_INDICATOR :: 0x4B +HID_USAGE_LED_SYSTEM_SUSPEND :: 0x4C +HID_USAGE_LED_EXTERNAL_POWER :: 0x4D -HID_USAGE_TELEPHONY_PHONE :: 0x01 -HID_USAGE_TELEPHONY_ANSWERING_MACHINE :: 0x02 -HID_USAGE_TELEPHONY_MESSAGE_CONTROLS :: 0x03 -HID_USAGE_TELEPHONY_HANDSET :: 0x04 -HID_USAGE_TELEPHONY_HEADSET :: 0x05 -HID_USAGE_TELEPHONY_KEYPAD :: 0x06 +HID_USAGE_TELEPHONY_PHONE :: 0x01 +HID_USAGE_TELEPHONY_ANSWERING_MACHINE :: 0x02 +HID_USAGE_TELEPHONY_MESSAGE_CONTROLS :: 0x03 +HID_USAGE_TELEPHONY_HANDSET :: 0x04 +HID_USAGE_TELEPHONY_HEADSET :: 0x05 +HID_USAGE_TELEPHONY_KEYPAD :: 0x06 HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON :: 0x07 -HID_USAGE_TELEPHONY_REDIAL :: 0x24 -HID_USAGE_TELEPHONY_TRANSFER :: 0x25 -HID_USAGE_TELEPHONY_DROP :: 0x26 -HID_USAGE_TELEPHONY_LINE :: 0x2A -HID_USAGE_TELEPHONY_RING_ENABLE :: 0x2D -HID_USAGE_TELEPHONY_SEND :: 0x31 -HID_USAGE_TELEPHONY_KEYPAD_0 :: 0xB0 -HID_USAGE_TELEPHONY_KEYPAD_D :: 0xBF -HID_USAGE_TELEPHONY_HOST_AVAILABLE :: 0xF1 +HID_USAGE_TELEPHONY_REDIAL :: 0x24 +HID_USAGE_TELEPHONY_TRANSFER :: 0x25 +HID_USAGE_TELEPHONY_DROP :: 0x26 +HID_USAGE_TELEPHONY_LINE :: 0x2A +HID_USAGE_TELEPHONY_RING_ENABLE :: 0x2D +HID_USAGE_TELEPHONY_SEND :: 0x31 +HID_USAGE_TELEPHONY_KEYPAD_0 :: 0xB0 +HID_USAGE_TELEPHONY_KEYPAD_D :: 0xBF +HID_USAGE_TELEPHONY_HOST_AVAILABLE :: 0xF1 HID_USAGE_CONSUMERCTRL :: 0x01 @@ -420,271 +420,271 @@ HID_USAGE_CONSUMER_CHANNEL_INCREMENT :: 0x9C HID_USAGE_CONSUMER_CHANNEL_DECREMENT :: 0x9D // transport control -HID_USAGE_CONSUMER_PLAY :: 0xB0 -HID_USAGE_CONSUMER_PAUSE :: 0xB1 -HID_USAGE_CONSUMER_RECORD :: 0xB2 -HID_USAGE_CONSUMER_FAST_FORWARD :: 0xB3 -HID_USAGE_CONSUMER_REWIND :: 0xB4 +HID_USAGE_CONSUMER_PLAY :: 0xB0 +HID_USAGE_CONSUMER_PAUSE :: 0xB1 +HID_USAGE_CONSUMER_RECORD :: 0xB2 +HID_USAGE_CONSUMER_FAST_FORWARD :: 0xB3 +HID_USAGE_CONSUMER_REWIND :: 0xB4 HID_USAGE_CONSUMER_SCAN_NEXT_TRACK :: 0xB5 HID_USAGE_CONSUMER_SCAN_PREV_TRACK :: 0xB6 -HID_USAGE_CONSUMER_STOP :: 0xB7 -HID_USAGE_CONSUMER_PLAY_PAUSE :: 0xCD +HID_USAGE_CONSUMER_STOP :: 0xB7 +HID_USAGE_CONSUMER_PLAY_PAUSE :: 0xCD // GameDVR -HID_USAGE_CONSUMER_GAMEDVR_OPEN_GAMEBAR :: 0xD0 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_RECORD :: 0xD1 -HID_USAGE_CONSUMER_GAMEDVR_RECORD_CLIP :: 0xD2 -HID_USAGE_CONSUMER_GAMEDVR_SCREENSHOT :: 0xD3 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_INDICATOR :: 0xD4 +HID_USAGE_CONSUMER_GAMEDVR_OPEN_GAMEBAR :: 0xD0 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_RECORD :: 0xD1 +HID_USAGE_CONSUMER_GAMEDVR_RECORD_CLIP :: 0xD2 +HID_USAGE_CONSUMER_GAMEDVR_SCREENSHOT :: 0xD3 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_INDICATOR :: 0xD4 HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_MICROPHONE :: 0xD5 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_CAMERA :: 0xD6 -HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_BROADCAST :: 0xD7 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_CAMERA :: 0xD6 +HID_USAGE_CONSUMER_GAMEDVR_TOGGLE_BROADCAST :: 0xD7 // audio -HID_USAGE_CONSUMER_VOLUME :: 0xE0 -HID_USAGE_CONSUMER_BALANCE :: 0xE1 -HID_USAGE_CONSUMER_MUTE :: 0xE2 -HID_USAGE_CONSUMER_BASS :: 0xE3 -HID_USAGE_CONSUMER_TREBLE :: 0xE4 -HID_USAGE_CONSUMER_BASS_BOOST :: 0xE5 -HID_USAGE_CONSUMER_SURROUND_MODE :: 0xE6 -HID_USAGE_CONSUMER_LOUDNESS :: 0xE7 -HID_USAGE_CONSUMER_MPX :: 0xE8 +HID_USAGE_CONSUMER_VOLUME :: 0xE0 +HID_USAGE_CONSUMER_BALANCE :: 0xE1 +HID_USAGE_CONSUMER_MUTE :: 0xE2 +HID_USAGE_CONSUMER_BASS :: 0xE3 +HID_USAGE_CONSUMER_TREBLE :: 0xE4 +HID_USAGE_CONSUMER_BASS_BOOST :: 0xE5 +HID_USAGE_CONSUMER_SURROUND_MODE :: 0xE6 +HID_USAGE_CONSUMER_LOUDNESS :: 0xE7 +HID_USAGE_CONSUMER_MPX :: 0xE8 HID_USAGE_CONSUMER_VOLUME_INCREMENT :: 0xE9 HID_USAGE_CONSUMER_VOLUME_DECREMENT :: 0xEA // supplementary audio -HID_USAGE_CONSUMER_BASS_INCREMENT :: 0x152 -HID_USAGE_CONSUMER_BASS_DECREMENT :: 0x153 +HID_USAGE_CONSUMER_BASS_INCREMENT :: 0x152 +HID_USAGE_CONSUMER_BASS_DECREMENT :: 0x153 HID_USAGE_CONSUMER_TREBLE_INCREMENT :: 0x154 HID_USAGE_CONSUMER_TREBLE_DECREMENT :: 0x155 // Application Launch HID_USAGE_CONSUMER_AL_CONFIGURATION :: 0x183 -HID_USAGE_CONSUMER_AL_EMAIL :: 0x18A -HID_USAGE_CONSUMER_AL_CALCULATOR :: 0x192 -HID_USAGE_CONSUMER_AL_BROWSER :: 0x194 -HID_USAGE_CONSUMER_AL_SEARCH :: 0x1C6 +HID_USAGE_CONSUMER_AL_EMAIL :: 0x18A +HID_USAGE_CONSUMER_AL_CALCULATOR :: 0x192 +HID_USAGE_CONSUMER_AL_BROWSER :: 0x194 +HID_USAGE_CONSUMER_AL_SEARCH :: 0x1C6 // Application Control -HID_USAGE_CONSUMER_AC_SEARCH :: 0x221 -HID_USAGE_CONSUMER_AC_GOTO :: 0x222 -HID_USAGE_CONSUMER_AC_HOME :: 0x223 -HID_USAGE_CONSUMER_AC_BACK :: 0x224 -HID_USAGE_CONSUMER_AC_FORWARD :: 0x225 -HID_USAGE_CONSUMER_AC_STOP :: 0x226 -HID_USAGE_CONSUMER_AC_REFRESH :: 0x227 -HID_USAGE_CONSUMER_AC_PREVIOUS :: 0x228 -HID_USAGE_CONSUMER_AC_NEXT :: 0x229 +HID_USAGE_CONSUMER_AC_SEARCH :: 0x221 +HID_USAGE_CONSUMER_AC_GOTO :: 0x222 +HID_USAGE_CONSUMER_AC_HOME :: 0x223 +HID_USAGE_CONSUMER_AC_BACK :: 0x224 +HID_USAGE_CONSUMER_AC_FORWARD :: 0x225 +HID_USAGE_CONSUMER_AC_STOP :: 0x226 +HID_USAGE_CONSUMER_AC_REFRESH :: 0x227 +HID_USAGE_CONSUMER_AC_PREVIOUS :: 0x228 +HID_USAGE_CONSUMER_AC_NEXT :: 0x229 HID_USAGE_CONSUMER_AC_BOOKMARKS :: 0x22A -HID_USAGE_CONSUMER_AC_PAN :: 0x238 +HID_USAGE_CONSUMER_AC_PAN :: 0x238 // Keyboard Extended Attributes (defined on consumer page in HUTRR42) -HID_USAGE_CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION :: 0x2C0 -HID_USAGE_CONSUMER_KEYBOARD_FORM_FACTOR :: 0x2C1 -HID_USAGE_CONSUMER_KEYBOARD_KEY_TYPE :: 0x2C2 -HID_USAGE_CONSUMER_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C3 -HID_USAGE_CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C4 -HID_USAGE_CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX :: 0x2C5 +HID_USAGE_CONSUMER_EXTENDED_KEYBOARD_ATTRIBUTES_COLLECTION :: 0x2C0 +HID_USAGE_CONSUMER_KEYBOARD_FORM_FACTOR :: 0x2C1 +HID_USAGE_CONSUMER_KEYBOARD_KEY_TYPE :: 0x2C2 +HID_USAGE_CONSUMER_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C3 +HID_USAGE_CONSUMER_VENDOR_SPECIFIC_KEYBOARD_PHYSICAL_LAYOUT :: 0x2C4 +HID_USAGE_CONSUMER_KEYBOARD_IETF_LANGUAGE_TAG_INDEX :: 0x2C5 HID_USAGE_CONSUMER_IMPLEMENTED_KEYBOARD_INPUT_ASSIST_CONTROLS :: 0x2C6 -HID_USAGE_DIGITIZER_DIGITIZER :: 0x01 -HID_USAGE_DIGITIZER_PEN :: 0x02 -HID_USAGE_DIGITIZER_LIGHT_PEN :: 0x03 -HID_USAGE_DIGITIZER_TOUCH_SCREEN :: 0x04 -HID_USAGE_DIGITIZER_TOUCH_PAD :: 0x05 -HID_USAGE_DIGITIZER_WHITE_BOARD :: 0x06 -HID_USAGE_DIGITIZER_COORD_MEASURING :: 0x07 -HID_USAGE_DIGITIZER_3D_DIGITIZER :: 0x08 -HID_USAGE_DIGITIZER_STEREO_PLOTTER :: 0x09 -HID_USAGE_DIGITIZER_ARTICULATED_ARM :: 0x0A -HID_USAGE_DIGITIZER_ARMATURE :: 0x0B -HID_USAGE_DIGITIZER_MULTI_POINT :: 0x0C -HID_USAGE_DIGITIZER_FREE_SPACE_WAND :: 0x0D -HID_USAGE_DIGITIZER_HEAT_MAP :: 0x0F -HID_USAGE_DIGITIZER_STYLUS :: 0x20 -HID_USAGE_DIGITIZER_PUCK :: 0x21 -HID_USAGE_DIGITIZER_FINGER :: 0x22 +HID_USAGE_DIGITIZER_DIGITIZER :: 0x01 +HID_USAGE_DIGITIZER_PEN :: 0x02 +HID_USAGE_DIGITIZER_LIGHT_PEN :: 0x03 +HID_USAGE_DIGITIZER_TOUCH_SCREEN :: 0x04 +HID_USAGE_DIGITIZER_TOUCH_PAD :: 0x05 +HID_USAGE_DIGITIZER_WHITE_BOARD :: 0x06 +HID_USAGE_DIGITIZER_COORD_MEASURING :: 0x07 +HID_USAGE_DIGITIZER_3D_DIGITIZER :: 0x08 +HID_USAGE_DIGITIZER_STEREO_PLOTTER :: 0x09 +HID_USAGE_DIGITIZER_ARTICULATED_ARM :: 0x0A +HID_USAGE_DIGITIZER_ARMATURE :: 0x0B +HID_USAGE_DIGITIZER_MULTI_POINT :: 0x0C +HID_USAGE_DIGITIZER_FREE_SPACE_WAND :: 0x0D +HID_USAGE_DIGITIZER_HEAT_MAP :: 0x0F +HID_USAGE_DIGITIZER_STYLUS :: 0x20 +HID_USAGE_DIGITIZER_PUCK :: 0x21 +HID_USAGE_DIGITIZER_FINGER :: 0x22 HID_USAGE_DIGITIZER_TABLET_FUNC_KEYS :: 0x39 HID_USAGE_DIGITIZER_PROG_CHANGE_KEYS :: 0x3A -HID_USAGE_DIGITIZER_TIP_PRESSURE :: 0x30 -HID_USAGE_DIGITIZER_BARREL_PRESSURE :: 0x31 -HID_USAGE_DIGITIZER_IN_RANGE :: 0x32 -HID_USAGE_DIGITIZER_TOUCH :: 0x33 -HID_USAGE_DIGITIZER_UNTOUCH :: 0x34 -HID_USAGE_DIGITIZER_TAP :: 0x35 -HID_USAGE_DIGITIZER_QUALITY :: 0x36 -HID_USAGE_DIGITIZER_DATA_VALID :: 0x37 -HID_USAGE_DIGITIZER_TRANSDUCER_INDEX :: 0x38 -HID_USAGE_DIGITIZER_BATTERY_STRENGTH :: 0x3B -HID_USAGE_DIGITIZER_INVERT :: 0x3C -HID_USAGE_DIGITIZER_X_TILT :: 0x3D -HID_USAGE_DIGITIZER_Y_TILT :: 0x3E -HID_USAGE_DIGITIZER_AZIMUTH :: 0x3F -HID_USAGE_DIGITIZER_ALTITUDE :: 0x40 -HID_USAGE_DIGITIZER_TWIST :: 0x41 -HID_USAGE_DIGITIZER_TIP_SWITCH :: 0x42 -HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH :: 0x43 -HID_USAGE_DIGITIZER_BARREL_SWITCH :: 0x44 -HID_USAGE_DIGITIZER_ERASER :: 0x45 -HID_USAGE_DIGITIZER_TABLET_PICK :: 0x46 -HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL :: 0x5B +HID_USAGE_DIGITIZER_TIP_PRESSURE :: 0x30 +HID_USAGE_DIGITIZER_BARREL_PRESSURE :: 0x31 +HID_USAGE_DIGITIZER_IN_RANGE :: 0x32 +HID_USAGE_DIGITIZER_TOUCH :: 0x33 +HID_USAGE_DIGITIZER_UNTOUCH :: 0x34 +HID_USAGE_DIGITIZER_TAP :: 0x35 +HID_USAGE_DIGITIZER_QUALITY :: 0x36 +HID_USAGE_DIGITIZER_DATA_VALID :: 0x37 +HID_USAGE_DIGITIZER_TRANSDUCER_INDEX :: 0x38 +HID_USAGE_DIGITIZER_BATTERY_STRENGTH :: 0x3B +HID_USAGE_DIGITIZER_INVERT :: 0x3C +HID_USAGE_DIGITIZER_X_TILT :: 0x3D +HID_USAGE_DIGITIZER_Y_TILT :: 0x3E +HID_USAGE_DIGITIZER_AZIMUTH :: 0x3F +HID_USAGE_DIGITIZER_ALTITUDE :: 0x40 +HID_USAGE_DIGITIZER_TWIST :: 0x41 +HID_USAGE_DIGITIZER_TIP_SWITCH :: 0x42 +HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH :: 0x43 +HID_USAGE_DIGITIZER_BARREL_SWITCH :: 0x44 +HID_USAGE_DIGITIZER_ERASER :: 0x45 +HID_USAGE_DIGITIZER_TABLET_PICK :: 0x46 +HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL :: 0x5B HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VENDOR_ID :: 0x6A -HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VERSION :: 0x6B -HID_USAGE_DIGITIZER_HEAT_MAP_FRAME_DATA :: 0x6C -HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_PART2 :: 0x6E -HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR :: 0x91 -HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT :: 0x92 -HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED :: 0xA2 +HID_USAGE_DIGITIZER_HEAT_MAP_PROTOCOL_VERSION :: 0x6B +HID_USAGE_DIGITIZER_HEAT_MAP_FRAME_DATA :: 0x6C +HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_PART2 :: 0x6E +HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR :: 0x91 +HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT :: 0x92 +HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED :: 0xA2 HID_USAGE_HAPTICS_SIMPLE_CONTROLLER :: 0x01 HID_USAGE_HAPTICS_WAVEFORM_LIST :: 0x10 HID_USAGE_HAPTICS_DURATION_LIST :: 0x11 -HID_USAGE_HAPTICS_AUTO_TRIGGER :: 0x20 -HID_USAGE_HAPTICS_MANUAL_TRIGGER :: 0x21 +HID_USAGE_HAPTICS_AUTO_TRIGGER :: 0x20 +HID_USAGE_HAPTICS_MANUAL_TRIGGER :: 0x21 HID_USAGE_HAPTICS_AUTO_ASSOCIATED_CONTROL :: 0x22 -HID_USAGE_HAPTICS_INTENSITY :: 0x23 -HID_USAGE_HAPTICS_REPEAT_COUNT :: 0x24 -HID_USAGE_HAPTICS_RETRIGGER_PERIOD :: 0x25 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_PAGE :: 0x26 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_ID :: 0x27 -HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME :: 0x28 +HID_USAGE_HAPTICS_INTENSITY :: 0x23 +HID_USAGE_HAPTICS_REPEAT_COUNT :: 0x24 +HID_USAGE_HAPTICS_RETRIGGER_PERIOD :: 0x25 +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_PAGE :: 0x26 +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_ID :: 0x27 +HID_USAGE_HAPTICS_WAVEFORM_CUTOFF_TIME :: 0x28 // Waveform types -HID_USAGE_HAPTICS_WAVEFORM_BEGIN :: 0x1000 -HID_USAGE_HAPTICS_WAVEFORM_STOP :: 0x1001 -HID_USAGE_HAPTICS_WAVEFORM_NULL :: 0x1002 -HID_USAGE_HAPTICS_WAVEFORM_CLICK :: 0x1003 -HID_USAGE_HAPTICS_WAVEFORM_BUZZ :: 0x1004 -HID_USAGE_HAPTICS_WAVEFORM_RUMBLE :: 0x1005 -HID_USAGE_HAPTICS_WAVEFORM_PRESS :: 0x1006 +HID_USAGE_HAPTICS_WAVEFORM_BEGIN :: 0x1000 +HID_USAGE_HAPTICS_WAVEFORM_STOP :: 0x1001 +HID_USAGE_HAPTICS_WAVEFORM_NULL :: 0x1002 +HID_USAGE_HAPTICS_WAVEFORM_CLICK :: 0x1003 +HID_USAGE_HAPTICS_WAVEFORM_BUZZ :: 0x1004 +HID_USAGE_HAPTICS_WAVEFORM_RUMBLE :: 0x1005 +HID_USAGE_HAPTICS_WAVEFORM_PRESS :: 0x1006 HID_USAGE_HAPTICS_WAVEFORM_RELEASE :: 0x1007 -HID_USAGE_HAPTICS_WAVEFORM_END :: 0x1FFF +HID_USAGE_HAPTICS_WAVEFORM_END :: 0x1FFF HID_USAGE_HAPTICS_WAVEFORM_VENDOR_BEGIN :: 0x2000 -HID_USAGE_HAPTICS_WAVEFORM_VENDOR_END :: 0x2FFF +HID_USAGE_HAPTICS_WAVEFORM_VENDOR_END :: 0x2FFF -HID_USAGE_ALPHANUMERIC_ALPHANUMERIC_DISPLAY :: 0x01 -HID_USAGE_ALPHANUMERIC_BITMAPPED_DISPLAY :: 0x02 +HID_USAGE_ALPHANUMERIC_ALPHANUMERIC_DISPLAY :: 0x01 +HID_USAGE_ALPHANUMERIC_BITMAPPED_DISPLAY :: 0x02 HID_USAGE_ALPHANUMERIC_DISPLAY_ATTRIBUTES_REPORT :: 0x20 -HID_USAGE_ALPHANUMERIC_DISPLAY_CONTROL_REPORT :: 0x24 -HID_USAGE_ALPHANUMERIC_CHARACTER_REPORT :: 0x2B -HID_USAGE_ALPHANUMERIC_DISPLAY_STATUS :: 0x2D -HID_USAGE_ALPHANUMERIC_CURSOR_POSITION_REPORT :: 0x32 -HID_USAGE_ALPHANUMERIC_FONT_REPORT :: 0x3B -HID_USAGE_ALPHANUMERIC_FONT_DATA :: 0x3C -HID_USAGE_ALPHANUMERIC_CHARACTER_ATTRIBUTE :: 0x48 -HID_USAGE_ALPHANUMERIC_PALETTE_REPORT :: 0x85 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA :: 0x88 -HID_USAGE_ALPHANUMERIC_BLIT_REPORT :: 0x8A -HID_USAGE_ALPHANUMERIC_BLIT_DATA :: 0x8F -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON :: 0x90 +HID_USAGE_ALPHANUMERIC_DISPLAY_CONTROL_REPORT :: 0x24 +HID_USAGE_ALPHANUMERIC_CHARACTER_REPORT :: 0x2B +HID_USAGE_ALPHANUMERIC_DISPLAY_STATUS :: 0x2D +HID_USAGE_ALPHANUMERIC_CURSOR_POSITION_REPORT :: 0x32 +HID_USAGE_ALPHANUMERIC_FONT_REPORT :: 0x3B +HID_USAGE_ALPHANUMERIC_FONT_DATA :: 0x3C +HID_USAGE_ALPHANUMERIC_CHARACTER_ATTRIBUTE :: 0x48 +HID_USAGE_ALPHANUMERIC_PALETTE_REPORT :: 0x85 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA :: 0x88 +HID_USAGE_ALPHANUMERIC_BLIT_REPORT :: 0x8A +HID_USAGE_ALPHANUMERIC_BLIT_DATA :: 0x8F +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON :: 0x90 -HID_USAGE_ALPHANUMERIC_ASCII_CHARACTER_SET :: 0x21 -HID_USAGE_ALPHANUMERIC_DATA_READ_BACK :: 0x22 -HID_USAGE_ALPHANUMERIC_FONT_READ_BACK :: 0x23 -HID_USAGE_ALPHANUMERIC_CLEAR_DISPLAY :: 0x25 -HID_USAGE_ALPHANUMERIC_DISPLAY_ENABLE :: 0x26 -HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_DELAY :: 0x27 -HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_ENABLE :: 0x28 -HID_USAGE_ALPHANUMERIC_VERTICAL_SCROLL :: 0x29 -HID_USAGE_ALPHANUMERIC_HORIZONTAL_SCROLL :: 0x2A -HID_USAGE_ALPHANUMERIC_DISPLAY_DATA :: 0x2C -HID_USAGE_ALPHANUMERIC_STATUS_NOT_READY :: 0x2E -HID_USAGE_ALPHANUMERIC_STATUS_READY :: 0x2F +HID_USAGE_ALPHANUMERIC_ASCII_CHARACTER_SET :: 0x21 +HID_USAGE_ALPHANUMERIC_DATA_READ_BACK :: 0x22 +HID_USAGE_ALPHANUMERIC_FONT_READ_BACK :: 0x23 +HID_USAGE_ALPHANUMERIC_CLEAR_DISPLAY :: 0x25 +HID_USAGE_ALPHANUMERIC_DISPLAY_ENABLE :: 0x26 +HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_DELAY :: 0x27 +HID_USAGE_ALPHANUMERIC_SCREEN_SAVER_ENABLE :: 0x28 +HID_USAGE_ALPHANUMERIC_VERTICAL_SCROLL :: 0x29 +HID_USAGE_ALPHANUMERIC_HORIZONTAL_SCROLL :: 0x2A +HID_USAGE_ALPHANUMERIC_DISPLAY_DATA :: 0x2C +HID_USAGE_ALPHANUMERIC_STATUS_NOT_READY :: 0x2E +HID_USAGE_ALPHANUMERIC_STATUS_READY :: 0x2F HID_USAGE_ALPHANUMERIC_ERR_NOT_A_LOADABLE_CHARACTER :: 0x30 HID_USAGE_ALPHANUMERIC_ERR_FONT_DATA_CANNOT_BE_READ :: 0x31 -HID_USAGE_ALPHANUMERIC_ROW :: 0x33 -HID_USAGE_ALPHANUMERIC_COLUMN :: 0x34 -HID_USAGE_ALPHANUMERIC_ROWS :: 0x35 -HID_USAGE_ALPHANUMERIC_COLUMNS :: 0x36 -HID_USAGE_ALPHANUMERIC_CURSOR_PIXEL_POSITIONING :: 0x37 -HID_USAGE_ALPHANUMERIC_CURSOR_MODE :: 0x38 -HID_USAGE_ALPHANUMERIC_CURSOR_ENABLE :: 0x39 -HID_USAGE_ALPHANUMERIC_CURSOR_BLINK :: 0x3A -HID_USAGE_ALPHANUMERIC_CHAR_WIDTH :: 0x3D -HID_USAGE_ALPHANUMERIC_CHAR_HEIGHT :: 0x3E -HID_USAGE_ALPHANUMERIC_CHAR_SPACING_HORIZONTAL :: 0x3F -HID_USAGE_ALPHANUMERIC_CHAR_SPACING_VERTICAL :: 0x40 -HID_USAGE_ALPHANUMERIC_UNICODE_CHAR_SET :: 0x41 -HID_USAGE_ALPHANUMERIC_FONT_7_SEGMENT :: 0x42 -HID_USAGE_ALPHANUMERIC_7_SEGMENT_DIRECT_MAP :: 0x43 -HID_USAGE_ALPHANUMERIC_FONT_14_SEGMENT :: 0x44 -HID_USAGE_ALPHANUMERIC_14_SEGMENT_DIRECT_MAP :: 0x45 -HID_USAGE_ALPHANUMERIC_DISPLAY_BRIGHTNESS :: 0x46 -HID_USAGE_ALPHANUMERIC_DISPLAY_CONTRAST :: 0x47 -HID_USAGE_ALPHANUMERIC_ATTRIBUTE_READBACK :: 0x49 -HID_USAGE_ALPHANUMERIC_ATTRIBUTE_DATA :: 0x4A -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_ENHANCE :: 0x4B -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_UNDERLINE :: 0x4C -HID_USAGE_ALPHANUMERIC_CHAR_ATTR_BLINK :: 0x4D -HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_X :: 0x80 -HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_Y :: 0x81 -HID_USAGE_ALPHANUMERIC_BIT_DEPTH_FORMAT :: 0x83 -HID_USAGE_ALPHANUMERIC_DISPLAY_ORIENTATION :: 0x84 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA_SIZE :: 0x86 -HID_USAGE_ALPHANUMERIC_PALETTE_DATA_OFFSET :: 0x87 -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X1 :: 0x8B -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y1 :: 0x8C -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X2 :: 0x8D -HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y2 :: 0x8E -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_ID :: 0x91 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_SIDE :: 0x92 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET1 :: 0x93 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET2 :: 0x94 -HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_REPORT :: 0x95 +HID_USAGE_ALPHANUMERIC_ROW :: 0x33 +HID_USAGE_ALPHANUMERIC_COLUMN :: 0x34 +HID_USAGE_ALPHANUMERIC_ROWS :: 0x35 +HID_USAGE_ALPHANUMERIC_COLUMNS :: 0x36 +HID_USAGE_ALPHANUMERIC_CURSOR_PIXEL_POSITIONING :: 0x37 +HID_USAGE_ALPHANUMERIC_CURSOR_MODE :: 0x38 +HID_USAGE_ALPHANUMERIC_CURSOR_ENABLE :: 0x39 +HID_USAGE_ALPHANUMERIC_CURSOR_BLINK :: 0x3A +HID_USAGE_ALPHANUMERIC_CHAR_WIDTH :: 0x3D +HID_USAGE_ALPHANUMERIC_CHAR_HEIGHT :: 0x3E +HID_USAGE_ALPHANUMERIC_CHAR_SPACING_HORIZONTAL :: 0x3F +HID_USAGE_ALPHANUMERIC_CHAR_SPACING_VERTICAL :: 0x40 +HID_USAGE_ALPHANUMERIC_UNICODE_CHAR_SET :: 0x41 +HID_USAGE_ALPHANUMERIC_FONT_7_SEGMENT :: 0x42 +HID_USAGE_ALPHANUMERIC_7_SEGMENT_DIRECT_MAP :: 0x43 +HID_USAGE_ALPHANUMERIC_FONT_14_SEGMENT :: 0x44 +HID_USAGE_ALPHANUMERIC_14_SEGMENT_DIRECT_MAP :: 0x45 +HID_USAGE_ALPHANUMERIC_DISPLAY_BRIGHTNESS :: 0x46 +HID_USAGE_ALPHANUMERIC_DISPLAY_CONTRAST :: 0x47 +HID_USAGE_ALPHANUMERIC_ATTRIBUTE_READBACK :: 0x49 +HID_USAGE_ALPHANUMERIC_ATTRIBUTE_DATA :: 0x4A +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_ENHANCE :: 0x4B +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_UNDERLINE :: 0x4C +HID_USAGE_ALPHANUMERIC_CHAR_ATTR_BLINK :: 0x4D +HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_X :: 0x80 +HID_USAGE_ALPHANUMERIC_BITMAP_SIZE_Y :: 0x81 +HID_USAGE_ALPHANUMERIC_BIT_DEPTH_FORMAT :: 0x83 +HID_USAGE_ALPHANUMERIC_DISPLAY_ORIENTATION :: 0x84 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA_SIZE :: 0x86 +HID_USAGE_ALPHANUMERIC_PALETTE_DATA_OFFSET :: 0x87 +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X1 :: 0x8B +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y1 :: 0x8C +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_X2 :: 0x8D +HID_USAGE_ALPHANUMERIC_BLIT_RECTANGLE_Y2 :: 0x8E +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_ID :: 0x91 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_SIDE :: 0x92 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET1 :: 0x93 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_OFFSET2 :: 0x94 +HID_USAGE_ALPHANUMERIC_SOFT_BUTTON_REPORT :: 0x95 -HID_USAGE_LAMPARRAY :: 0x01 -HID_USAGE_LAMPARRAY_ATTRBIUTES_REPORT :: 0x02 -HID_USAGE_LAMPARRAY_LAMP_COUNT :: 0x03 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_WIDTH_IN_MICROMETERS :: 0x04 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_HEIGHT_IN_MICROMETERS :: 0x05 -HID_USAGE_LAMPARRAY_BOUNDING_BOX_DEPTH_IN_MICROMETERS :: 0x06 -HID_USAGE_LAMPARRAY_KIND :: 0x07 +HID_USAGE_LAMPARRAY :: 0x01 +HID_USAGE_LAMPARRAY_ATTRBIUTES_REPORT :: 0x02 +HID_USAGE_LAMPARRAY_LAMP_COUNT :: 0x03 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_WIDTH_IN_MICROMETERS :: 0x04 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_HEIGHT_IN_MICROMETERS :: 0x05 +HID_USAGE_LAMPARRAY_BOUNDING_BOX_DEPTH_IN_MICROMETERS :: 0x06 +HID_USAGE_LAMPARRAY_KIND :: 0x07 HID_USAGE_LAMPARRAY_MIN_UPDATE_INTERVAL_IN_MICROSECONDS :: 0x08 // 0x09 - 0x1F Reserved -HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_REQUEST_REPORT :: 0x20 -HID_USAGE_LAMPARRAY_LAMP_ID :: 0x21 +HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_REQUEST_REPORT :: 0x20 +HID_USAGE_LAMPARRAY_LAMP_ID :: 0x21 HID_USAGE_LAMPARRAY_LAMP_ATTRIBUTES_RESPONSE_REPORT :: 0x22 -HID_USAGE_LAMPARRAY_POSITION_X_IN_MICROMETERS :: 0x23 -HID_USAGE_LAMPARRAY_POSITION_Y_IN_MICROMETERS :: 0x24 -HID_USAGE_LAMPARRAY_POSITION_Z_IN_MICROMETERS :: 0x25 -HID_USAGE_LAMPARRAY_LAMP_PURPOSES :: 0x26 -HID_USAGE_LAMPARRAY_UPDATE_LATENCY_IN_MICROSECONDS :: 0x27 -HID_USAGE_LAMPARRAY_RED_LEVEL_COUNT :: 0x28 -HID_USAGE_LAMPARRAY_GREEN_LEVEL_COUNT :: 0x29 -HID_USAGE_LAMPARRAY_BLUE_LEVEL_COUNT :: 0x2A -HID_USAGE_LAMPARRAY_INTENSITY_LEVEL_COUNT :: 0x2B -HID_USAGE_LAMPARRAY_IS_PROGRAMMABLE :: 0x2C -HID_USAGE_LAMPARRAY_INPUT_BINDING :: 0x2D +HID_USAGE_LAMPARRAY_POSITION_X_IN_MICROMETERS :: 0x23 +HID_USAGE_LAMPARRAY_POSITION_Y_IN_MICROMETERS :: 0x24 +HID_USAGE_LAMPARRAY_POSITION_Z_IN_MICROMETERS :: 0x25 +HID_USAGE_LAMPARRAY_LAMP_PURPOSES :: 0x26 +HID_USAGE_LAMPARRAY_UPDATE_LATENCY_IN_MICROSECONDS :: 0x27 +HID_USAGE_LAMPARRAY_RED_LEVEL_COUNT :: 0x28 +HID_USAGE_LAMPARRAY_GREEN_LEVEL_COUNT :: 0x29 +HID_USAGE_LAMPARRAY_BLUE_LEVEL_COUNT :: 0x2A +HID_USAGE_LAMPARRAY_INTENSITY_LEVEL_COUNT :: 0x2B +HID_USAGE_LAMPARRAY_IS_PROGRAMMABLE :: 0x2C +HID_USAGE_LAMPARRAY_INPUT_BINDING :: 0x2D // 0x2E - 0x4F Reserved -HID_USAGE_LAMPARRAY_LAMP_MULTI_UPDATE_REPORT :: 0x50 -HID_USAGE_LAMPARRAY_LAMP_RED_UPDATE_CHANNEL :: 0x51 -HID_USAGE_LAMPARRAY_LAMP_GREEN_UPDATE_CHANNEL :: 0x52 -HID_USAGE_LAMPARRAY_LAMP_BLUE_UPDATE_CHANNEL :: 0x53 +HID_USAGE_LAMPARRAY_LAMP_MULTI_UPDATE_REPORT :: 0x50 +HID_USAGE_LAMPARRAY_LAMP_RED_UPDATE_CHANNEL :: 0x51 +HID_USAGE_LAMPARRAY_LAMP_GREEN_UPDATE_CHANNEL :: 0x52 +HID_USAGE_LAMPARRAY_LAMP_BLUE_UPDATE_CHANNEL :: 0x53 HID_USAGE_LAMPARRAY_LAMP_INTENSITY_UPDATE_CHANNEL :: 0x54 -HID_USAGE_LAMPARRAY_LAMP_UPDATE_FLAGS :: 0x55 +HID_USAGE_LAMPARRAY_LAMP_UPDATE_FLAGS :: 0x55 // 0x55 - 0x5F Reserved HID_USAGE_LAMPARRAY_LAMP_RANGE_UPDATE_REPORT :: 0x60 -HID_USAGE_LAMPARRAY_LAMP_ID_START :: 0x61 -HID_USAGE_LAMPARRAY_LAMP_ID_END :: 0x62 +HID_USAGE_LAMPARRAY_LAMP_ID_START :: 0x61 +HID_USAGE_LAMPARRAY_LAMP_ID_END :: 0x62 // 0x63 - 0x6F Reserved -HID_USAGE_LAMPARRAY_CONTROL_REPORT :: 0x70 +HID_USAGE_LAMPARRAY_CONTROL_REPORT :: 0x70 HID_USAGE_LAMPARRAY_AUTONOMOUS_MODE :: 0x71 HID_USAGE_CAMERA_AUTO_FOCUS :: 0x20 -HID_USAGE_CAMERA_SHUTTER :: 0x21 +HID_USAGE_CAMERA_SHUTTER :: 0x21 HID_USAGE_MS_BTH_HF_DIALNUMBER :: 0x21 HID_USAGE_MS_BTH_HF_DIALMEMORY :: 0x22 diff --git a/core/sys/windows/icu.odin b/core/sys/windows/icu.odin index b481a05a9..7be9ce4c6 100644 --- a/core/sys/windows/icu.odin +++ b/core/sys/windows/icu.odin @@ -10,7 +10,7 @@ UError :: enum i32 { @(default_calling_convention="system") foreign icu { ucal_getWindowsTimeZoneID :: proc(id: wstring, len: i32, winid: wstring, winidCapacity: i32, status: ^UError) -> i32 --- - ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- + ucal_getDefaultTimeZone :: proc(result: wstring, cap: i32, status: ^UError) -> i32 --- } diff --git a/core/sys/windows/ip_helper.odin b/core/sys/windows/ip_helper.odin index da23a064f..74ffa95b9 100644 --- a/core/sys/windows/ip_helper.odin +++ b/core/sys/windows/ip_helper.odin @@ -223,7 +223,7 @@ foreign iphlpapi { The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer. See: https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses */ - @(link_name="GetAdaptersAddresses") get_adapters_addresses :: proc( + GetAdaptersAddresses :: proc( family: Address_Family, flags: GAA_Flags, _reserved: rawptr, @@ -232,3 +232,5 @@ foreign iphlpapi { ) -> ULONG --- } + +get_adapters_addresses :: GetAdaptersAddresses \ No newline at end of file diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index e5163bac7..0ad11121e 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -60,15 +60,15 @@ foreign kernel32 { // https://learn.microsoft.com/en-us/windows/console/getnumberofconsoleinputevents GetNumberOfConsoleInputEvents :: proc(hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> BOOL --- - GetConsoleMode :: proc(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL --- - SetConsoleMode :: proc(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL --- + GetConsoleMode :: proc(hConsoleHandle: HANDLE, lpMode: LPDWORD) -> BOOL --- + SetConsoleMode :: proc(hConsoleHandle: HANDLE, dwMode: DWORD) -> BOOL --- SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE, dwCursorPosition: COORD) -> BOOL --- - SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL --- - GetConsoleCP :: proc() -> CODEPAGE --- - SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- - GetConsoleOutputCP :: proc() -> CODEPAGE --- - SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- - FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL --- + SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL --- + GetConsoleCP :: proc() -> CODEPAGE --- + SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- + GetConsoleOutputCP :: proc() -> CODEPAGE --- + SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL --- + FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL --- GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL --- @@ -82,11 +82,11 @@ foreign kernel32 { dwBufferSize: DWORD) -> BOOL --- - AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- - AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- + AddVectoredExceptionHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- + AddVectoredContinueHandler :: proc(FirstHandler: ULONG, VectoredHandler: PVECTORED_EXCEPTION_HANDLER) -> LPVOID --- RemoveVectoredExceptionHandler :: proc(Handle: LPVOID) -> DWORD --- - RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD --- - RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! --- + RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD --- + RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! --- SetUnhandledExceptionFilter :: proc(lpTopLevelExceptionFilter: LPTOP_LEVEL_EXCEPTION_FILTER) -> LPTOP_LEVEL_EXCEPTION_FILTER --- @@ -103,31 +103,31 @@ foreign kernel32 { lpFileInformation: LPVOID, dwBufferSize: DWORD) -> BOOL --- - InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + InitializeCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- InitializeCriticalSectionAndSpinCount :: proc(CriticalSection: ^CRITICAL_SECTION, dwSpinCount: DWORD) -> BOOL --- - EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN --- - LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + EnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + TryEnterCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) -> BOOLEAN --- + LeaveCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- + DeleteCriticalSection :: proc(CriticalSection: ^CRITICAL_SECTION) --- - RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- - SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL --- - SetLastError :: proc(dwErrCode: DWORD) --- - GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- - SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- - ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL --- - GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- - SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- - SetCommMask :: proc(handle: HANDLE, dwEvtMap: DWORD) -> BOOL --- - GetCommMask :: proc(handle: HANDLE, lpEvtMask: LPDWORD) -> BOOL --- - WaitCommEvent :: proc(handle: HANDLE, lpEvtMask: LPDWORD, lpOverlapped: LPOVERLAPPED) -> BOOL --- - GetCommandLineW :: proc() -> LPCWSTR --- - GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD --- - GetTempFileNameW :: proc(lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: c_int, lpTempFileName: LPWSTR) -> c_uint --- - GetCurrentProcess :: proc() -> HANDLE --- + RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- + SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL --- + SetLastError :: proc(dwErrCode: DWORD) --- + GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- + SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL --- + ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL --- + GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- + SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL --- + SetCommMask :: proc(handle: HANDLE, dwEvtMap: DWORD) -> BOOL --- + GetCommMask :: proc(handle: HANDLE, lpEvtMask: LPDWORD) -> BOOL --- + WaitCommEvent :: proc(handle: HANDLE, lpEvtMask: LPDWORD, lpOverlapped: LPOVERLAPPED) -> BOOL --- + GetCommandLineW :: proc() -> LPCWSTR --- + GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD --- + GetTempFileNameW :: proc(lpPathName: LPCWSTR, lpPrefixString: LPCWSTR, uUnique: c_int, lpTempFileName: LPWSTR) -> c_uint --- + GetCurrentProcess :: proc() -> HANDLE --- GetCurrentProcessId :: proc() -> DWORD --- - GetCurrentThread :: proc() -> HANDLE --- - GetCurrentThreadId :: proc() -> DWORD --- + GetCurrentThread :: proc() -> HANDLE --- + GetCurrentThreadId :: proc() -> DWORD --- GetProcessTimes :: proc( hProcess: HANDLE, lpCreationTime: LPFILETIME, @@ -136,7 +136,7 @@ foreign kernel32 { lpUserTime: LPFILETIME, ) -> BOOL --- GetStdHandle :: proc(which: DWORD) -> HANDLE --- - ExitProcess :: proc(uExitCode: c_uint) -> ! --- + ExitProcess :: proc(uExitCode: c_uint) -> ! --- DeviceIoControl :: proc( hDevice: HANDLE, dwIoControlCode: DWORD, @@ -164,15 +164,15 @@ foreign kernel32 { dwCreationFlags: DWORD, lpThreadId: LPDWORD, ) -> HANDLE --- - SwitchToThread :: proc() -> BOOL --- - ResumeThread :: proc(thread: HANDLE) -> DWORD --- - GetThreadPriority :: proc(thread: HANDLE) -> c_int --- - SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL --- + SwitchToThread :: proc() -> BOOL --- + ResumeThread :: proc(thread: HANDLE) -> DWORD --- + GetThreadPriority :: proc(thread: HANDLE) -> c_int --- + SetThreadPriority :: proc(thread: HANDLE, priority: c_int) -> BOOL --- GetThreadDescription :: proc(hThread: HANDLE, ppszThreadDescription: ^PCWSTR) -> HRESULT --- SetThreadDescription :: proc(hThread: HANDLE, lpThreadDescription: PCWSTR) -> HRESULT --- - GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL --- - TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL --- - SuspendThread :: proc(hThread: HANDLE) -> DWORD --- + GetExitCodeThread :: proc(thread: HANDLE, exit_code: ^DWORD) -> BOOL --- + TerminateThread :: proc(thread: HANDLE, exit_code: DWORD) -> BOOL --- + SuspendThread :: proc(hThread: HANDLE) -> DWORD --- GetProcessAffinityMask :: proc( hProcess: HANDLE, @@ -237,17 +237,17 @@ foreign kernel32 { nsize: DWORD, args: rawptr, ) -> DWORD --- - TlsAlloc :: proc() -> DWORD --- - TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL --- - TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID --- - TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL --- - GetLastError :: proc() -> DWORD --- + TlsAlloc :: proc() -> DWORD --- + TlsFree :: proc(dwTlsIndex: DWORD) -> BOOL --- + TlsGetValue :: proc(dwTlsIndex: DWORD) -> LPVOID --- + TlsSetValue :: proc(dwTlsIndex: DWORD, lpTlsvalue: LPVOID) -> BOOL --- + GetLastError :: proc() -> DWORD --- QueryPerformanceFrequency :: proc(lpFrequency: ^LARGE_INTEGER) -> BOOL --- - QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL --- - GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL --- - TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL --- - OpenProcess :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE --- - OpenThread :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE --- + QueryPerformanceCounter :: proc(lpPerformanceCount: ^LARGE_INTEGER) -> BOOL --- + GetExitCodeProcess :: proc(hProcess: HANDLE, lpExitCode: LPDWORD) -> BOOL --- + TerminateProcess :: proc(hProcess: HANDLE, uExitCode: UINT) -> BOOL --- + OpenProcess :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE --- + OpenThread :: proc(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwThreadId: DWORD) -> HANDLE --- GetThreadContext :: proc( hThread: HANDLE, lpContext: LPCONTEXT, @@ -366,14 +366,14 @@ foreign kernel32 { ) -> BOOL --- CompareFileTime :: proc(lpFileTime1: LPFILETIME, lpFileTime2: LPFILETIME) -> LONG --- - FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE --- - FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL --- - FindClose :: proc(findFile: HANDLE) -> BOOL --- - GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE --- - GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE --- - GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- - GetSystemTimePreciseAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- - FileTimeToSystemTime :: proc(lpFileTime: ^FILETIME, lpSystemTime: ^SYSTEMTIME) -> BOOL --- + FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE --- + FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL --- + FindClose :: proc(findFile: HANDLE) -> BOOL --- + GetModuleHandleW :: proc(lpModuleName: LPCWSTR) -> HMODULE --- + GetModuleHandleA :: proc(lpModuleName: LPCSTR) -> HMODULE --- + GetSystemTimeAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- + GetSystemTimePreciseAsFileTime :: proc(lpSystemTimeAsFileTime: LPFILETIME) --- + FileTimeToSystemTime :: proc(lpFileTime: ^FILETIME, lpSystemTime: ^SYSTEMTIME) -> BOOL --- SystemTimeToTzSpecificLocalTime :: proc( lpTimeZoneInformation: ^TIME_ZONE_INFORMATION, lpUniversalTime: ^SYSTEMTIME, @@ -428,7 +428,7 @@ foreign kernel32 { lpTotalBytesAvail: ^u32, lpBytesLeftThisMessage: ^u32, ) -> BOOL --- - CancelIo :: proc(handle: HANDLE) -> BOOL --- + CancelIo :: proc(handle: HANDLE) -> BOOL --- CancelIoEx :: proc(hFile: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- GetOverlappedResult :: proc( hFile: HANDLE, @@ -437,19 +437,19 @@ foreign kernel32 { bWait: BOOL, ) -> BOOL --- GetProcessHeap :: proc() -> HANDLE --- - HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID --- - HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID --- - HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL --- + HeapAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID --- + HeapReAlloc :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID --- + HeapFree :: proc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL --- - LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- + LocalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- LocalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- - LocalFree :: proc(mem: LPVOID) -> LPVOID --- + LocalFree :: proc(mem: LPVOID) -> LPVOID --- - GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- + GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- GlobalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- - GlobalFree :: proc(mem: LPVOID) -> LPVOID --- + GlobalFree :: proc(mem: LPVOID) -> LPVOID --- - GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID --- + GlobalLock :: proc(hMem: HGLOBAL) -> LPVOID --- GlobalUnlock :: proc(hMem: HGLOBAL) -> BOOL --- ReadDirectoryChangesW :: proc( @@ -467,16 +467,16 @@ foreign kernel32 { bWatchSubtree: BOOL, dwNotifyFilter: DWORD, ) -> HANDLE --- - FindNextChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- + FindNextChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- FindCloseChangeNotification :: proc(hChangeHandle: HANDLE) -> BOOL --- InitializeSRWLock :: proc(SRWLock: ^SRWLOCK) --- AcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) --- TryAcquireSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- ReleaseSRWLockExclusive :: proc(SRWLock: ^SRWLOCK) --- - AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- - TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- - ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- + AcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- + TryAcquireSRWLockShared :: proc(SRWLock: ^SRWLOCK) -> BOOLEAN --- + ReleaseSRWLockShared :: proc(SRWLock: ^SRWLOCK) --- InitializeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) --- WakeConditionVariable :: proc(ConditionVariable: ^CONDITION_VARIABLE) --- @@ -485,42 +485,42 @@ foreign kernel32 { SleepConditionVariableSRW :: proc(ConditionVariable: ^CONDITION_VARIABLE, SRWLock: ^SRWLOCK, dwMilliseconds: DWORD, Flags: LONG) -> BOOL --- - GetFileType :: proc(file_handle: HANDLE) -> DWORD --- - SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD --- - GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL --- - GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD --- - GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL --- - GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) --- - GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) --- - GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - GetSystemDefaultLangID :: proc() -> LANGID --- - GetSystemDefaultLCID :: proc() -> LCID --- + GetFileType :: proc(file_handle: HANDLE) -> DWORD --- + SetFilePointer :: proc(file_handle: HANDLE, distance_to_move: LONG, distance_to_move_high: ^LONG, move_method: DWORD) -> DWORD --- + GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^LARGE_INTEGER) -> BOOL --- + GetFileAttributesW :: proc(lpFileName: LPCWSTR) -> DWORD --- + GetFileAttributesExW :: proc(lpFileName: LPCWSTR, fInfoLevelId: GET_FILEEX_INFO_LEVELS, lpFileInformation: LPVOID) -> BOOL --- + GetSystemInfo :: proc(system_info: ^SYSTEM_INFO) --- + GetVersionExW :: proc(osvi: ^OSVERSIONINFOEXW) --- + GetSystemDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + GetWindowsDirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + GetSystemDefaultLangID :: proc() -> LANGID --- + GetSystemDefaultLCID :: proc() -> LCID --- GetSystemDefaultLocaleName :: proc(lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT --- - LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT --- - LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID --- - SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- - AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr --- - RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL --- - LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- - LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- - FreeLibrary :: proc(h: HMODULE) -> BOOL --- - FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- - GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- + LCIDToLocaleName :: proc(Locale: LCID, lpName: LPWSTR, cchName: INT, dwFlags: DWORD) -> INT --- + LocaleNameToLCID :: proc(lpName: LPCWSTR, dwFlags: DWORD) -> LCID --- + SetDllDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL --- + AddDllDirectory :: proc(NewDirectory: PCWSTR) -> rawptr --- + RemoveDllDirectory :: proc(Cookie: rawptr) -> BOOL --- + LoadLibraryW :: proc(c_str: LPCWSTR) -> HMODULE --- + LoadLibraryExW :: proc(c_str: LPCWSTR, hFile: HANDLE, dwFlags: LoadLibraryEx_Flags) -> HMODULE --- + FreeLibrary :: proc(h: HMODULE) -> BOOL --- + FreeLibraryAndExitThread :: proc(hLibModule: HMODULE, dwExitCode: DWORD) -> VOID --- + GetProcAddress :: proc(h: HMODULE, c_str: LPCSTR) -> rawptr --- - LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- - FreeResource :: proc(hResData: HGLOBAL) -> BOOL --- - LockResource :: proc(hResData: HGLOBAL) -> LPVOID --- - SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD --- - FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC --- - FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC --- - EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL --- - EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- - LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT --- + LoadResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> HGLOBAL --- + FreeResource :: proc(hResData: HGLOBAL) -> BOOL --- + LockResource :: proc(hResData: HGLOBAL) -> LPVOID --- + SizeofResource :: proc(hModule: HMODULE, hResInfo: HRSRC) -> DWORD --- + FindResourceW :: proc(hModule: HMODULE, lpName: LPCWSTR, lpType: LPCWSTR) -> HRSRC --- + FindResourceExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, wLanguage: LANGID) -> HRSRC --- + EnumResourceNamesW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR) -> BOOL --- + EnumResourceNamesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpEnumFunc: ENUMRESNAMEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + EnumResourceTypesExW :: proc(hModule: HMODULE, lpEnumFunc: ENUMRESTYPEPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + EnumResourceLanguagesExW :: proc(hModule: HMODULE, lpType: LPCWSTR, lpName: LPCWSTR, lpEnumFunc: ENUMRESLANGPROCW, lParam: LONG_PTR, dwFlags: DWORD, LangId: LANGID) -> BOOL --- + LookupIconIdFromDirectory :: proc(presbits: PBYTE, fIcon: BOOL) -> INT --- LookupIconIdFromDirectoryEx :: proc(presbits: PBYTE, fIcon: BOOL, cxDesired: INT, cyDesired: INT, Flags: UINT) -> INT --- - CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON --- + CreateIconFromResourceEx :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD, cxDesired: INT, cyDesired: INT, Flags: UINT) -> HICON --- GetFullPathNameW :: proc(filename: LPCWSTR, buffer_length: DWORD, buffer: LPCWSTR, file_part: ^LPCWSTR) -> DWORD --- GetLongPathNameW :: proc(short, long: LPCWSTR, len: DWORD) -> DWORD --- @@ -533,21 +533,21 @@ foreign kernel32 { CreatePipe :: proc(hReadPipe, hWritePipe: ^HANDLE, lpPipeAttributes: LPSECURITY_ATTRIBUTES, nSize: DWORD) -> BOOL --- - ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- + ConnectNamedPipe :: proc(hNamedPipe: HANDLE, lpOverlapped: LPOVERLAPPED) -> BOOL --- DisconnectNamedPipe :: proc(hNamedPipe: HANDLE) -> BOOL --- - WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL --- + WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL --- - AllocConsole :: proc() -> BOOL --- - AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- - SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- - GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- - FreeConsole :: proc() -> BOOL --- - GetConsoleWindow :: proc() -> HWND --- + AllocConsole :: proc() -> BOOL --- + AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- + SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- + GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- + FreeConsole :: proc() -> BOOL --- + GetConsoleWindow :: proc() -> HWND --- GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL --- SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL --- - SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- - GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- - SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- + GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- GetDiskFreeSpaceExW :: proc( lpDirectoryName: LPCWSTR, @@ -561,15 +561,15 @@ foreign kernel32 { // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setfilecompletionnotificationmodes) SetFileCompletionNotificationModes :: proc(FileHandle: HANDLE, Flags: u8) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport) - CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) -> HANDLE --- + CreateIoCompletionPort :: proc(FileHandle: HANDLE, ExistingCompletionPort: HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) -> HANDLE --- //[MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus) - GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: PULONG_PTR, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL --- + GetQueuedCompletionStatus :: proc(CompletionPort: HANDLE, lpNumberOfBytesTransferred: ^DWORD, lpCompletionKey: PULONG_PTR, lpOverlapped: ^^OVERLAPPED, dwMilliseconds: DWORD) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex) - GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL --- + GetQueuedCompletionStatusEx :: proc(CompletionPort: HANDLE, lpCompletionPortEntries: ^OVERLAPPED_ENTRY, ulCount: c_ulong, ulNumEntriesRemoved: ^c_ulong, dwMilliseconds: DWORD, fAlertable: BOOL) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus) - PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL --- + PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation) - GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL --- + GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL --- RtlCaptureStackBackTrace :: proc(FramesToSkip: ULONG, FramesToCapture: ULONG, BackTrace: [^]PVOID, BackTraceHash: PULONG) -> USHORT --- RtlNtStatusToDosError :: proc(status: NTSTATUS) -> ULONG --- @@ -625,44 +625,44 @@ THREAD_PRIORITY_IDLE :: THREAD_BASE_PRIORITY_IDLE THREAD_MODE_BACKGROUND_BEGIN :: 0x00010000 THREAD_MODE_BACKGROUND_END :: 0x00020000 -PROCESS_ALL_ACCESS :: 0x000F0000 | SYNCHRONIZE | 0xFFFF -PROCESS_CREATE_PROCESS :: 0x0080 -PROCESS_CREATE_THREAD :: 0x0002 -PROCESS_DUP_HANDLE :: 0x0040 -PROCESS_QUERY_INFORMATION :: 0x0400 +PROCESS_ALL_ACCESS :: 0x000F0000 | SYNCHRONIZE | 0xFFFF +PROCESS_CREATE_PROCESS :: 0x0080 +PROCESS_CREATE_THREAD :: 0x0002 +PROCESS_DUP_HANDLE :: 0x0040 +PROCESS_QUERY_INFORMATION :: 0x0400 PROCESS_QUERY_LIMITED_INFORMATION :: 0x1000 -PROCESS_SET_INFORMATION :: 0x0200 -PROCESS_SET_QUOTA :: 0x0100 -PROCESS_SUSPEND_RESUME :: 0x0800 -PROCESS_TERMINATE :: 0x0001 -PROCESS_VM_OPERATION :: 0x0008 -PROCESS_VM_READ :: 0x0010 -PROCESS_VM_WRITE :: 0x0020 +PROCESS_SET_INFORMATION :: 0x0200 +PROCESS_SET_QUOTA :: 0x0100 +PROCESS_SUSPEND_RESUME :: 0x0800 +PROCESS_TERMINATE :: 0x0001 +PROCESS_VM_OPERATION :: 0x0008 +PROCESS_VM_READ :: 0x0010 +PROCESS_VM_WRITE :: 0x0020 THREAD_ALL_ACCESS :: \ - THREAD_DIRECT_IMPERSONATION | - THREAD_GET_CONTEXT | - THREAD_IMPERSONATE | - THREAD_QUERY_INFORMATION | + THREAD_DIRECT_IMPERSONATION | + THREAD_GET_CONTEXT | + THREAD_IMPERSONATE | + THREAD_QUERY_INFORMATION | THREAD_QUERY_LIMITED_INFORMATION | - THREAD_SET_CONTEXT | - THREAD_SET_INFORMATION | - THREAD_SET_LIMITED_INFORMATION | - THREAD_SET_THREAD_TOKEN | - THREAD_SUSPEND_RESUME | - THREAD_TERMINATE | + THREAD_SET_CONTEXT | + THREAD_SET_INFORMATION | + THREAD_SET_LIMITED_INFORMATION | + THREAD_SET_THREAD_TOKEN | + THREAD_SUSPEND_RESUME | + THREAD_TERMINATE | SYNCHRONIZE -THREAD_DIRECT_IMPERSONATION :: 0x0200 -THREAD_GET_CONTEXT :: 0x0008 -THREAD_IMPERSONATE :: 0x0100 -THREAD_QUERY_INFORMATION :: 0x0040 +THREAD_DIRECT_IMPERSONATION :: 0x0200 +THREAD_GET_CONTEXT :: 0x0008 +THREAD_IMPERSONATE :: 0x0100 +THREAD_QUERY_INFORMATION :: 0x0040 THREAD_QUERY_LIMITED_INFORMATION :: 0x0800 -THREAD_SET_CONTEXT :: 0x0010 -THREAD_SET_INFORMATION :: 0x0020 -THREAD_SET_LIMITED_INFORMATION :: 0x0400 -THREAD_SET_THREAD_TOKEN :: 0x0080 -THREAD_SUSPEND_RESUME :: 0x0002 -THREAD_TERMINATE :: 0x0001 +THREAD_SET_CONTEXT :: 0x0010 +THREAD_SET_INFORMATION :: 0x0020 +THREAD_SET_LIMITED_INFORMATION :: 0x0400 +THREAD_SET_THREAD_TOKEN :: 0x0080 +THREAD_SUSPEND_RESUME :: 0x0002 +THREAD_TERMINATE :: 0x0001 COPY_FILE_FAIL_IF_EXISTS :: 0x00000001 COPY_FILE_RESTARTABLE :: 0x00000002 @@ -701,7 +701,7 @@ FILE_MAP_TARGETS_INVALID :: DWORD(0x40000000) FILE_MAP_LARGE_PAGES :: DWORD(0x20000000) LOCKFILE_FAIL_IMMEDIATELY :: DWORD (0x00000001) -LOCKFILE_EXCLUSIVE_LOCK :: DWORD(0x00000002) +LOCKFILE_EXCLUSIVE_LOCK :: DWORD(0x00000002) // Flags for `SetFileCompletionNotificationModes`. FILE_SKIP_COMPLETION_PORT_ON_SUCCESS :: 0x1 @@ -720,16 +720,16 @@ PAGE_NOCACHE :: 0x200 PAGE_WRITECOMBINE :: 0x400 MEMORY_BASIC_INFORMATION :: struct { - BaseAddress: PVOID, - AllocationBase: PVOID, + BaseAddress: PVOID, + AllocationBase: PVOID, AllocationProtect: DWORD, - PartitionId: WORD, - RegionSize: SIZE_T, - State: DWORD, - Protect: DWORD, - Type: DWORD, + PartitionId: WORD, + RegionSize: SIZE_T, + State: DWORD, + Protect: DWORD, + Type: DWORD, } -PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION +PMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION LPMEMORY_BASIC_INFORMATION :: ^MEMORY_BASIC_INFORMATION MEM_COMMIT :: 0x1000 @@ -747,97 +747,97 @@ MEM_4MB_PAGES :: 0x80000000 @(default_calling_convention="system") foreign kernel32 { VirtualAlloc :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, + flProtect: DWORD, ) -> LPVOID --- VirtualProtect :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, - flNewProtect: DWORD, + lpAddress: LPVOID, + dwSize: SIZE_T, + flNewProtect: DWORD, lpflOldProtect: PDWORD, ) -> BOOL --- VirtualFree :: proc( - lpAddress: LPVOID, - dwSize: SIZE_T, + lpAddress: LPVOID, + dwSize: SIZE_T, dwFreeType: DWORD, ) -> BOOL --- VirtualQuery :: proc( lpAddress: LPCVOID, - lpBuffer: PMEMORY_BASIC_INFORMATION, - dwLength: SIZE_T, + lpBuffer: PMEMORY_BASIC_INFORMATION, + dwLength: SIZE_T, ) -> SIZE_T --- VirtualAllocEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, + flProtect: DWORD, ) -> LPVOID --- VirtualFreeEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, dwFreeType: DWORD, ) -> BOOL --- VirtualProtectEx :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, - flNewProtect: DWORD, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, + flNewProtect: DWORD, lpflOldProtect: PDWORD, ) -> BOOL --- VirtualQueryEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, lpAddress: LPCVOID, - lpBuffer: PMEMORY_BASIC_INFORMATION, - dwLength: SIZE_T, + lpBuffer: PMEMORY_BASIC_INFORMATION, + dwLength: SIZE_T, ) -> SIZE_T --- ReadProcessMemory :: proc( - hProcess: HANDLE, - lpBaseAddress: LPCVOID, - lpBuffer: LPVOID, - nSize: SIZE_T, + hProcess: HANDLE, + lpBaseAddress: LPCVOID, + lpBuffer: LPVOID, + nSize: SIZE_T, lpNumberOfBytesRead: ^SIZE_T, ) -> BOOL --- WriteProcessMemory :: proc( - hProcess: HANDLE, - lpBaseAddress: LPVOID, - lpBuffer: LPCVOID, - nSize: SIZE_T, + hProcess: HANDLE, + lpBaseAddress: LPVOID, + lpBuffer: LPCVOID, + nSize: SIZE_T, lpNumberOfBytesWritten: ^SIZE_T, ) -> BOOL --- CreateFileMappingW :: proc( - hFile: HANDLE, + hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, - flProtect: DWORD, - dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, - lpName: LPCWSTR, + flProtect: DWORD, + dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, + lpName: LPCWSTR, ) -> HANDLE --- OpenFileMappingW :: proc( dwDesiredAccess: DWORD, - bInheritHandle: BOOL, - lpName: LPCWSTR, + bInheritHandle: BOOL, + lpName: LPCWSTR, ) -> HANDLE --- MapViewOfFile :: proc( - hFileMappingObject: HANDLE, - dwDesiredAccess: DWORD, - dwFileOffsetHigh: DWORD, - dwFileOffsetLow: DWORD, + hFileMappingObject: HANDLE, + dwDesiredAccess: DWORD, + dwFileOffsetHigh: DWORD, + dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, ) -> LPVOID --- MapViewOfFileEx :: proc( - hFileMappingObject: HANDLE, - dwDesiredAccess: DWORD, - dwFileOffsetHigh: DWORD, - dwFileOffsetLow: DWORD, + hFileMappingObject: HANDLE, + dwDesiredAccess: DWORD, + dwFileOffsetHigh: DWORD, + dwFileOffsetLow: DWORD, dwNumberOfBytesToMap: SIZE_T, - lpBaseAddress: LPVOID, + lpBaseAddress: LPVOID, ) -> LPVOID --- FlushViewOfFile :: proc( - lpBaseAddress: LPCVOID, + lpBaseAddress: LPCVOID, dwNumberOfBytesToFlush: SIZE_T, ) -> BOOL --- UnmapViewOfFile :: proc( @@ -845,36 +845,36 @@ foreign kernel32 { ) -> BOOL --- GetLargePageMinimum :: proc() -> SIZE_T --- GetProcessWorkingSetSizeEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, lpMinimumWorkingSetSize: PSIZE_T, lpMaximumWorkingSetSize: PSIZE_T, - Flags: PDWORD, + Flags: PDWORD, ) -> BOOL --- SetProcessWorkingSetSizeEx :: proc( - hProcess: HANDLE, + hProcess: HANDLE, dwMinimumWorkingSetSize: SIZE_T, dwMaximumWorkingSetSize: SIZE_T, - Flags: DWORD, + Flags: DWORD, ) -> BOOL --- VirtualLock :: proc( lpAddress: LPVOID, - dwSize: SIZE_T, + dwSize: SIZE_T, ) -> BOOL --- VirtualUnlock :: proc( lpAddress: LPVOID, - dwSize: SIZE_T, + dwSize: SIZE_T, ) -> BOOL --- GetWriteWatch :: proc( - dwFlags: DWORD, - lpBaseAddress: PVOID, - dwRegionSize: SIZE_T, - lpAddresses: ^PVOID, - lpdwCount: ^ULONG_PTR, + dwFlags: DWORD, + lpBaseAddress: PVOID, + dwRegionSize: SIZE_T, + lpAddresses: ^PVOID, + lpdwCount: ^ULONG_PTR, lpdwGranularity: LPDWORD, ) -> UINT --- ResetWriteWatch :: proc( lpBaseAddress: LPVOID, - dwRegionSize: SIZE_T, + dwRegionSize: SIZE_T, ) -> UINT --- } @@ -907,27 +907,27 @@ foreign kernel32 { GetSystemFileCacheSize :: proc( lpMinimumFileCacheSize: PSIZE_T, lpMaximumFileCacheSize: PSIZE_T, - lpFlags: PDWORD, + lpFlags: PDWORD, ) -> BOOL --- SetSystemFileCacheSize :: proc( MinimumFileCacheSize: SIZE_T, MaximumFileCacheSize: SIZE_T, - Flags: DWORD, + Flags: DWORD, ) -> BOOL --- CreateFileMappingNumaW :: proc( - hFile: HANDLE, + hFile: HANDLE, lpFileMappingAttributes: LPSECURITY_ATTRIBUTES, - flProtect: DWORD, - dwMaximumSizeHigh: DWORD, - dwMaximumSizeLow: DWORD, - lpName: LPCWSTR, - nndPreferred: DWORD, + flProtect: DWORD, + dwMaximumSizeHigh: DWORD, + dwMaximumSizeLow: DWORD, + lpName: LPCWSTR, + nndPreferred: DWORD, ) -> HANDLE --- } WIN32_MEMORY_RANGE_ENTRY :: struct { VirtualAddress: PVOID, - NumberOfBytes: SIZE_T, + NumberOfBytes: SIZE_T, } PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY @@ -935,56 +935,56 @@ PWIN32_MEMORY_RANGE_ENTRY :: ^WIN32_MEMORY_RANGE_ENTRY @(default_calling_convention="system") foreign kernel32 { PrefetchVirtualMemory :: proc( - hProcess: HANDLE, - NumberOfEntries: ULONG_PTR, + hProcess: HANDLE, + NumberOfEntries: ULONG_PTR, VirtualAddresses: PWIN32_MEMORY_RANGE_ENTRY, - Flags: ULONG, + Flags: ULONG, ) -> BOOL --- CreateFileMappingFromApp :: proc( - hFile: HANDLE, + hFile: HANDLE, SecurityAttributes: PSECURITY_ATTRIBUTES, - PageProtection: ULONG, - MaximumSize: ULONG64, - Name: PCWSTR, + PageProtection: ULONG, + MaximumSize: ULONG64, + Name: PCWSTR, ) -> HANDLE --- MapViewOfFileFromApp :: proc( hFileMappingObject: HANDLE, - DesiredAccess: ULONG, - FileOffset: ULONG64, + DesiredAccess: ULONG, + FileOffset: ULONG64, NumberOfBytesToMap: SIZE_T, ) -> PVOID --- UnmapViewOfFileEx :: proc( BaseAddress: PVOID, - UnmapFlags: ULONG, + UnmapFlags: ULONG, ) -> BOOL --- AllocateUserPhysicalPages :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- FreeUserPhysicalPages :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- MapUserPhysicalPages :: proc( VirtualAddress: PVOID, - NumberOfPages: ULONG_PTR, - PageArray: PULONG_PTR, + NumberOfPages: ULONG_PTR, + PageArray: PULONG_PTR, ) -> BOOL --- AllocateUserPhysicalPagesNuma :: proc( - hProcess: HANDLE, + hProcess: HANDLE, NumberOfPages: PULONG_PTR, - PageArray: PULONG_PTR, - nndPreferred: DWORD, + PageArray: PULONG_PTR, + nndPreferred: DWORD, ) -> BOOL --- VirtualAllocExNuma :: proc( - hProcess: HANDLE, - lpAddress: LPVOID, - dwSize: SIZE_T, + hProcess: HANDLE, + lpAddress: LPVOID, + dwSize: SIZE_T, flAllocationType: DWORD, - flProtect: DWORD, - nndPreferred: DWORD, + flProtect: DWORD, + nndPreferred: DWORD, ) -> LPVOID --- } @@ -992,28 +992,20 @@ MEHC_PATROL_SCRUBBER_PRESENT :: ULONG(0x1) @(default_calling_convention="system") foreign kernel32 { - GetMemoryErrorHandlingCapabilities :: proc( - Capabilities: PULONG, - ) -> BOOL --- + GetMemoryErrorHandlingCapabilities :: proc(Capabilities: PULONG) -> BOOL --- } @(default_calling_convention="system") foreign kernel32 { - GlobalMemoryStatusEx :: proc( - lpBuffer: ^MEMORYSTATUSEX, - ) -> BOOL --- + GlobalMemoryStatusEx :: proc(lpBuffer: ^MEMORYSTATUSEX) -> BOOL --- } PBAD_MEMORY_CALLBACK_ROUTINE :: #type proc "system" () @(default_calling_convention="system") foreign kernel32 { - RegisterBadMemoryNotification :: proc( - Callback: PBAD_MEMORY_CALLBACK_ROUTINE, - ) -> PVOID --- - UnregisterBadMemoryNotification :: proc( - RegistrationHandle: PVOID, - ) -> BOOL --- + RegisterBadMemoryNotification :: proc(Callback: PBAD_MEMORY_CALLBACK_ROUTINE) -> PVOID --- + UnregisterBadMemoryNotification :: proc(RegistrationHandle: PVOID) -> BOOL --- } OFFER_PRIORITY :: enum c_int { @@ -1031,33 +1023,33 @@ VmOfferPriorityNormal :: OFFER_PRIORITY.VmOfferPriorityNormal foreign kernel32 { OfferVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, - Priority: OFFER_PRIORITY, + Size: SIZE_T, + Priority: OFFER_PRIORITY, ) -> DWORD --- ReclaimVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, + Size: SIZE_T, ) -> DWORD --- DiscardVirtualMemory :: proc( VirtualAddress: PVOID, - Size: SIZE_T, + Size: SIZE_T, ) -> DWORD --- VirtualAllocFromApp :: proc( - BaseAddress: PVOID, - Size: SIZE_T, + BaseAddress: PVOID, + Size: SIZE_T, AllocationType: ULONG, - Protection: ULONG, + Protection: ULONG, ) -> PVOID --- VirtualProtectFromApp :: proc( - Address: PVOID, - Size: SIZE_T, + Address: PVOID, + Size: SIZE_T, NewProtection: ULONG, OldProtection: PULONG, ) -> BOOL --- OpenFileMappingFromApp :: proc( DesiredAccess: ULONG, InheritHandle: BOOL, - Name: PCWSTR, + Name: PCWSTR, ) -> HANDLE --- } @@ -1067,54 +1059,48 @@ WIN32_MEMORY_INFORMATION_CLASS :: enum c_int { MemoryRegionInfo :: WIN32_MEMORY_INFORMATION_CLASS.MemoryRegionInfo WIN32_MEMORY_REGION_INFORMATION :: struct { - AllocationBase: PVOID, + AllocationBase: PVOID, AllocationProtect: ULONG, - u: WIN32_MEMORY_REGION_INFORMATION_u, + using DUMMYUNIONNAME: struct #raw_union { + _: [1]u32, + Flags: ULONG, + using DUMMYSTRUCTNAME: bit_field ULONG { + Private: ULONG | 1, + MappedDataFile: ULONG | 1, + MappedImage: ULONG | 1, + MappedPageFile: ULONG | 1, + MappedPhysical: ULONG | 1, + DirectMapped: ULONG | 1, + Reserved: ULONG | 26, + }, + }, RegionSize: SIZE_T, CommitSize: SIZE_T, } -WIN32_MEMORY_REGION_INFORMATION_u :: struct #raw_union { - u: [1]u32, - Flags: ULONG, - s: WIN32_MEMORY_REGION_INFORMATION_u_s, -} -WIN32_MEMORY_REGION_INFORMATION_u_s :: struct { - Bitfield: ULONG, -} -WIN32_MEMORY_REGION_INFORMATION_u_s_Bitfield :: distinct ULONG -/*bit_field #align(align_of(ULONG)) { - Private : 1-0, - MappedDataFile : 2-1, - MappedImage : 3-2, - MappedPageFile : 4-3, - MappedPhysical : 5-4, - DirectMapped : 6-5, - Reserved : 32-6, -}*/ @(default_calling_convention="system") foreign one_core { QueryVirtualMemoryInformation :: proc( - Process: HANDLE, - VirtualAddress: PVOID, + Process: HANDLE, + VirtualAddress: PVOID, MemoryInformationClass: WIN32_MEMORY_INFORMATION_CLASS, - MemoryInformation: PVOID, - MemoryInformationSize: SIZE_T, - ReturnSize: PSIZE_T, + MemoryInformation: PVOID, + MemoryInformationSize: SIZE_T, + ReturnSize: PSIZE_T, ) -> BOOL --- MapViewOfFileNuma2 :: proc( FileMappingHandle: HANDLE, - ProcessHandle: HANDLE, - Offset: ULONG64, - BaseAddress: PVOID, - ViewSize: SIZE_T, - AllocationType: ULONG, - PageProtection: ULONG, - PreferredNode: ULONG, + ProcessHandle: HANDLE, + Offset: ULONG64, + BaseAddress: PVOID, + ViewSize: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, + PreferredNode: ULONG, ) -> PVOID --- GetCommPorts :: proc( - lpPortNumbers: PULONG, - uPortNumbersCount: ULONG, + lpPortNumbers: PULONG, + uPortNumbersCount: ULONG, puPortNumbersFound: PULONG, ) -> ULONG --- } @@ -1124,12 +1110,12 @@ NUMA_NO_PREFERRED_NODE :: 0xffffffff MapViewOfFile2 :: #force_inline proc "system" ( FileMappingHandle: HANDLE, - ProcessHandle: HANDLE, - Offset: ULONG64, - BaseAddress: PVOID, - ViewSize: SIZE_T, - AllocationType: ULONG, - PageProtection: ULONG, + ProcessHandle: HANDLE, + Offset: ULONG64, + BaseAddress: PVOID, + ViewSize: SIZE_T, + AllocationType: ULONG, + PageProtection: ULONG, ) -> PVOID { return MapViewOfFileNuma2( FileMappingHandle, @@ -1147,8 +1133,8 @@ MapViewOfFile2 :: #force_inline proc "system" ( foreign kernel32 { UnmapViewOfFile2 :: proc( ProcessHandle: HANDLE, - BaseAddress: PVOID, - UnmapFlags: ULONG, + BaseAddress: PVOID, + UnmapFlags: ULONG, ) -> BOOL --- } @@ -1159,7 +1145,7 @@ foreign kernel32 { OSMinorVersion: DWORD, SpMajorVersion: DWORD, SpMinorVersion: DWORD, - product_type: ^Windows_Product_Type, + product_type: ^Windows_Product_Type, ) -> BOOL --- } @@ -1173,10 +1159,10 @@ LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID) @(default_calling_convention = "system") foreign kernel32 { - CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID --- - DeleteFiber :: proc(lpFiber: LPVOID) --- + CreateFiber :: proc(dwStackSize: SIZE_T, lpStartAddress: LPFIBER_START_ROUTINE, lpParameter: LPVOID) -> LPVOID --- + DeleteFiber :: proc(lpFiber: LPVOID) --- ConvertThreadToFiber :: proc(lpParameter: LPVOID) -> LPVOID --- - SwitchToFiber :: proc(lpFiber: LPVOID) --- + SwitchToFiber :: proc(lpFiber: LPVOID) --- } LOGICAL_PROCESSOR_RELATIONSHIP :: enum c_int { @@ -1199,11 +1185,11 @@ PROCESSOR_CACHE_TYPE :: enum c_int { } CACHE_DESCRIPTOR :: struct { - Level: BYTE, + Level: BYTE, Associativity: BYTE, - LineSize: WORD, - Size: DWORD, - Type: PROCESSOR_CACHE_TYPE, + LineSize: WORD, + Size: DWORD, + Type: PROCESSOR_CACHE_TYPE, } ProcessorCore :: struct { @@ -1212,17 +1198,16 @@ ProcessorCore :: struct { NumaNode :: struct { NodeNumber: DWORD, } -DUMMYUNIONNAME_u :: struct #raw_union { - Core: ProcessorCore, - Node: NumaNode, - Cache: CACHE_DESCRIPTOR, - Reserved: [2]ULONGLONG, -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: struct { ProcessorMask: ULONG_PTR, - Relationship: LOGICAL_PROCESSOR_RELATIONSHIP, - using DummyUnion: DUMMYUNIONNAME_u, + Relationship: LOGICAL_PROCESSOR_RELATIONSHIP, + using DUMMYUNIONNAME: struct #raw_union { + ProcessorCore: ProcessorCore `raw_union_tag:"Relationship=RelationProcessorCore"`, + NumaNode: NumaNode `raw_union_tag:"Relationship=RelationNumaNode"`, + Cache: CACHE_DESCRIPTOR `raw_union_tag:"Relationship=RelationCache"`, + Reserved: [2]ULONGLONG, + }, } SYSTEM_POWER_STATUS :: struct { @@ -1294,6 +1279,6 @@ ACTCTX_FLAG_HMODULE_VALID :: 0x080 @(default_calling_convention="system") foreign kernel32 { - CreateActCtxW :: proc(pActCtx: ^ACTCTXW) -> HANDLE --- + CreateActCtxW :: proc(pActCtx: ^ACTCTXW) -> HANDLE --- ActivateActCtx :: proc(hActCtx: HANDLE, lpCookie: ^ULONG_PTR) -> BOOL --- } From 006681ec2240d46b977f04ab7d7c8e280ad2cb67 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:18:48 +0000 Subject: [PATCH 060/212] Improve formatting; fix types; add struct field tags --- core/sys/windows/key_codes.odin | 8 +- core/sys/windows/netapi32.odin | 30 +- core/sys/windows/ole32.odin | 32 +- core/sys/windows/shcore.odin | 10 +- core/sys/windows/shell32.odin | 26 +- core/sys/windows/tlhelp.odin | 102 +- core/sys/windows/types.odin | 2413 ++++++++++++++++--------------- 7 files changed, 1315 insertions(+), 1306 deletions(-) diff --git a/core/sys/windows/key_codes.odin b/core/sys/windows/key_codes.odin index 0991ca4b3..a2910ecd1 100644 --- a/core/sys/windows/key_codes.odin +++ b/core/sys/windows/key_codes.odin @@ -3,11 +3,11 @@ package sys_windows // https://docs.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input KF_EXTENDED :: 0x0100 -KF_DLGMODE :: 0x0800 +KF_DLGMODE :: 0x0800 KF_MENUMODE :: 0x1000 -KF_ALTDOWN :: 0x2000 -KF_REPEAT :: 0x4000 -KF_UP :: 0x8000 +KF_ALTDOWN :: 0x2000 +KF_REPEAT :: 0x4000 +KF_UP :: 0x8000 // https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes // Virtual Keys, Standard Set diff --git a/core/sys/windows/netapi32.odin b/core/sys/windows/netapi32.odin index 9442193ca..759c5847a 100644 --- a/core/sys/windows/netapi32.odin +++ b/core/sys/windows/netapi32.odin @@ -7,32 +7,32 @@ foreign import netapi32 "system:Netapi32.lib" foreign netapi32 { NetUserAdd :: proc( servername: wstring, - level: DWORD, - user_info: ^USER_INFO_1, // Perhaps make this a #raw_union with USER_INFO1..4 when we need the other levels. - parm_err: ^DWORD, + level: DWORD, + user_info: ^USER_INFO_1, // Perhaps make this a #raw_union with USER_INFO1..4 when we need the other levels. + parm_err: ^DWORD, ) -> NET_API_STATUS --- NetUserDel :: proc( servername: wstring, - username: wstring, + username: wstring, ) -> NET_API_STATUS --- NetUserGetInfo :: proc( servername: wstring, - username: wstring, - level: DWORD, - user_info: ^USER_INFO_1, + username: wstring, + level: DWORD, + user_info: ^USER_INFO_1, ) -> NET_API_STATUS --- NetLocalGroupAddMembers :: proc( - servername: wstring, - groupname: wstring, - level: DWORD, + servername: wstring, + groupname: wstring, + level: DWORD, group_members_info: ^LOCALGROUP_MEMBERS_INFO_0, // Actually a variably sized array of these. - totalentries: DWORD, + totalentries: DWORD, ) -> NET_API_STATUS --- NetLocalGroupDelMembers :: proc( - servername: wstring, - groupname: wstring, - level: DWORD, + servername: wstring, + groupname: wstring, + level: DWORD, group_members_info: ^LOCALGROUP_MEMBERS_INFO_0, // Actually a variably sized array of these. - totalentries: DWORD, + totalentries: DWORD, ) -> NET_API_STATUS --- } \ No newline at end of file diff --git a/core/sys/windows/ole32.odin b/core/sys/windows/ole32.odin index 32cb6fd60..12cf40b81 100644 --- a/core/sys/windows/ole32.odin +++ b/core/sys/windows/ole32.odin @@ -41,32 +41,32 @@ LPUNKNOWN :: ^IUnknown @(default_calling_convention="system") foreign Ole32 { - CoInitialize :: proc(reserved: rawptr = nil) -> HRESULT --- + CoInitialize :: proc(reserved: rawptr = nil) -> HRESULT --- CoInitializeEx :: proc(reserved: rawptr = nil, co_init: COINIT = .APARTMENTTHREADED) -> HRESULT --- CoUninitialize :: proc() --- CoCreateInstance :: proc( - rclsid: REFCLSID, - pUnkOuter: LPUNKNOWN, + rclsid: REFCLSID, + pUnkOuter: LPUNKNOWN, dwClsContext: DWORD, - riid: REFIID, - ppv: ^LPVOID, + riid: REFIID, + ppv: ^LPVOID, ) -> HRESULT --- - CoTaskMemAlloc :: proc(cb: SIZE_T) -> rawptr --- + CoTaskMemAlloc :: proc(cb: SIZE_T) -> rawptr --- CoTaskMemRealloc :: proc(pv: rawptr, cb: SIZE_T) -> rawptr --- - CoTaskMemFree :: proc(pv: rawptr) --- + CoTaskMemFree :: proc(pv: rawptr) --- - CLSIDFromProgID :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- + CLSIDFromProgID :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- CLSIDFromProgIDEx :: proc(lpszProgID: LPCOLESTR, lpclsid: LPCLSID) -> HRESULT --- - CLSIDFromString :: proc(lpsz: LPOLESTR, pclsid: LPCLSID) -> HRESULT --- - IIDFromString :: proc(lpsz: LPOLESTR, lpiid: LPIID) -> HRESULT --- - ProgIDFromCLSID :: proc(clsid: REFCLSID, lplpszProgID: ^LPOLESTR) -> HRESULT --- - StringFromCLSID :: proc(rclsid: REFCLSID, lplpsz: ^LPOLESTR) -> HRESULT --- - StringFromGUID2 :: proc(rclsid: REFCLSID, lplpsz: LPOLESTR, cchMax: INT) -> INT --- - StringFromIID :: proc(rclsid: REFIID, lplpsz: ^LPOLESTR) -> HRESULT --- + CLSIDFromString :: proc(lpsz: LPOLESTR, pclsid: LPCLSID) -> HRESULT --- + IIDFromString :: proc(lpsz: LPOLESTR, lpiid: LPIID) -> HRESULT --- + ProgIDFromCLSID :: proc(clsid: REFCLSID, lplpszProgID: ^LPOLESTR) -> HRESULT --- + StringFromCLSID :: proc(rclsid: REFCLSID, lplpsz: ^LPOLESTR) -> HRESULT --- + StringFromGUID2 :: proc(rclsid: REFCLSID, lplpsz: LPOLESTR, cchMax: INT) -> INT --- + StringFromIID :: proc(rclsid: REFIID, lplpsz: ^LPOLESTR) -> HRESULT --- - PropVariantClear :: proc(pvar: ^PROPVARIANT) -> HRESULT --- - PropVariantCopy :: proc(pvarDest: ^PROPVARIANT, pvarSrc: ^PROPVARIANT) -> HRESULT --- + PropVariantClear :: proc(pvar: ^PROPVARIANT) -> HRESULT --- + PropVariantCopy :: proc(pvarDest: ^PROPVARIANT, pvarSrc: ^PROPVARIANT) -> HRESULT --- FreePropVariantArray :: proc(cVariants: ULONG, rgvars: ^PROPVARIANT) -> HRESULT --- } diff --git a/core/sys/windows/shcore.odin b/core/sys/windows/shcore.odin index 08a76ebe6..c7d784fe8 100644 --- a/core/sys/windows/shcore.odin +++ b/core/sys/windows/shcore.odin @@ -8,18 +8,18 @@ foreign import shcore "system:Shcore.lib" foreign shcore { GetProcessDpiAwareness :: proc(hprocess: HANDLE, value: ^PROCESS_DPI_AWARENESS) -> HRESULT --- SetProcessDpiAwareness :: proc(value: PROCESS_DPI_AWARENESS) -> HRESULT --- - GetDpiForMonitor :: proc(hmonitor: HMONITOR, dpiType: MONITOR_DPI_TYPE, dpiX: ^UINT, dpiY: ^UINT) -> HRESULT --- + GetDpiForMonitor :: proc(hmonitor: HMONITOR, dpiType: MONITOR_DPI_TYPE, dpiX: ^UINT, dpiY: ^UINT) -> HRESULT --- } PROCESS_DPI_AWARENESS :: enum DWORD { - PROCESS_DPI_UNAWARE = 0, - PROCESS_SYSTEM_DPI_AWARE = 1, + PROCESS_DPI_UNAWARE = 0, + PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2, } MONITOR_DPI_TYPE :: enum DWORD { MDT_EFFECTIVE_DPI = 0, - MDT_ANGULAR_DPI = 1, - MDT_RAW_DPI = 2, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, MDT_DEFAULT, } diff --git a/core/sys/windows/shell32.odin b/core/sys/windows/shell32.odin index 54cee718c..c7d83f9f6 100644 --- a/core/sys/windows/shell32.odin +++ b/core/sys/windows/shell32.odin @@ -22,29 +22,29 @@ foreign shell32 { ) -> c_int --- SHFileOperationW :: proc(lpFileOp: LPSHFILEOPSTRUCTW) -> c_int --- SHGetFolderPathW :: proc(hwnd: HWND, csidl: c_int, hToken: HANDLE, dwFlags: DWORD, pszPath: LPWSTR) -> HRESULT --- - SHAppBarMessage :: proc(dwMessage: DWORD, pData: PAPPBARDATA) -> UINT_PTR --- + SHAppBarMessage :: proc(dwMessage: DWORD, pData: PAPPBARDATA) -> UINT_PTR --- Shell_NotifyIconW :: proc(dwMessage: DWORD, lpData: ^NOTIFYICONDATAW) -> BOOL --- - SHChangeNotify :: proc(wEventId: LONG, uFlags: UINT, dwItem1: LPCVOID, dwItem2: LPCVOID) --- + SHChangeNotify :: proc(wEventId: LONG, uFlags: UINT, dwItem1: LPCVOID, dwItem2: LPCVOID) --- SHGetKnownFolderIDList :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppidl: rawptr) -> HRESULT --- - SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT --- - SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT --- + SHSetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, pszPath: PCWSTR ) -> HRESULT --- + SHGetKnownFolderPath :: proc(rfid: REFKNOWNFOLDERID, dwFlags: /* KNOWN_FOLDER_FLAG */ DWORD, hToken: HANDLE, ppszPath: ^LPWSTR) -> HRESULT --- - ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT --- + ExtractIconExW :: proc(pszFile: LPCWSTR, nIconIndex: INT, phiconLarge: ^HICON, phiconSmall: ^HICON, nIcons: UINT) -> UINT --- DragAcceptFiles :: proc(hWnd: HWND, fAccept: BOOL) --- - DragQueryPoint :: proc(hDrop: HDROP, ppt: ^POINT) -> BOOL --- - DragQueryFileW :: proc(hDrop: HDROP, iFile: UINT, lpszFile: LPWSTR, cch: UINT) -> UINT --- - DragFinish :: proc(hDrop: HDROP) --- // @New + DragQueryPoint :: proc(hDrop: HDROP, ppt: ^POINT) -> BOOL --- + DragQueryFileW :: proc(hDrop: HDROP, iFile: UINT, lpszFile: LPWSTR, cch: UINT) -> UINT --- + DragFinish :: proc(hDrop: HDROP) --- // @New } APPBARDATA :: struct { - cbSize: DWORD, - hWnd: HWND, + cbSize: DWORD, + hWnd: HWND, uCallbackMessage: UINT, - uEdge: UINT, - rc: RECT, - lParam: LPARAM, + uEdge: UINT, + rc: RECT, + lParam: LPARAM, } PAPPBARDATA :: ^APPBARDATA diff --git a/core/sys/windows/tlhelp.odin b/core/sys/windows/tlhelp.odin index 006c9c330..b23b4b06a 100644 --- a/core/sys/windows/tlhelp.odin +++ b/core/sys/windows/tlhelp.odin @@ -5,22 +5,22 @@ foreign import kernel32 "system:Kernel32.lib" @(default_calling_convention="system") foreign kernel32 { - CreateToolhelp32Snapshot :: proc (dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE --- - Process32FirstW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- - Process32NextW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- - Thread32First :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- - Thread32Next :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- - Module32FirstW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- - Module32NextW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- - Heap32ListFirst :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- - Heap32ListNext :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- - Heap32First :: proc (lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL --- - Heap32Next :: proc (lphe: LPHEAPENTRY32) -> BOOL --- - Toolhelp32ReadProcessMemory :: proc ( - th32ProcessID: DWORD, - lpBaseAddress: LPCVOID, - lpBuffer: LPVOID, - cbRead: SIZE_T, + CreateToolhelp32Snapshot :: proc(dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE --- + Process32FirstW :: proc(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- + Process32NextW :: proc(hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL --- + Thread32First :: proc(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- + Thread32Next :: proc(hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL --- + Module32FirstW :: proc(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- + Module32NextW :: proc(hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL --- + Heap32ListFirst :: proc(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- + Heap32ListNext :: proc(hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL --- + Heap32First :: proc(lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL --- + Heap32Next :: proc(lphe: LPHEAPENTRY32) -> BOOL --- + Toolhelp32ReadProcessMemory :: proc( + th32ProcessID: DWORD, + lpBaseAddress: LPCVOID, + lpBuffer: LPVOID, + cbRead: SIZE_T, lpNumberOfBytesRead: ^SIZE_T, ) -> BOOL --- } @@ -36,66 +36,66 @@ TH32CS_SNAPMODULE32 :: 0x00000010 TH32CS_SNAPALL :: TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE PROCESSENTRY32W :: struct { - dwSize: DWORD, - cntUsage: DWORD, - th32ProcessID: DWORD, - th32DefaultHeapID: ULONG_PTR, - th32ModuleID: DWORD, - cntThreads: DWORD, + dwSize: DWORD, + cntUsage: DWORD, + th32ProcessID: DWORD, + th32DefaultHeapID: ULONG_PTR, + th32ModuleID: DWORD, + cntThreads: DWORD, th32ParentProcessID: DWORD, - pcPriClassBase: LONG, - dwFlags: DWORD, - szExeFile: [MAX_PATH]WCHAR, + pcPriClassBase: LONG, + dwFlags: DWORD, + szExeFile: [MAX_PATH]WCHAR, } LPPROCESSENTRY32W :: ^PROCESSENTRY32W THREADENTRY32 :: struct { - dwSize: DWORD, - cntUsage: DWORD, - th32ThreadID: DWORD, + dwSize: DWORD, + cntUsage: DWORD, + th32ThreadID: DWORD, th32OwnerProcessID: DWORD, - tpBasePri: LONG, - tpDeltaPri: LONG, - dwFlags: DWORD, + tpBasePri: LONG, + tpDeltaPri: LONG, + dwFlags: DWORD, } LPTHREADENTRY32 :: ^THREADENTRY32 MODULEENTRY32W :: struct { - dwSize: DWORD, - th32ModuleID: DWORD, + dwSize: DWORD, + th32ModuleID: DWORD, th32ProcessID: DWORD, - GlblcntUsage: DWORD, - ProccntUsage: DWORD, - modBaseAddr: ^BYTE, - modBaseSize: DWORD, - hModule: HMODULE, - szModule: [MAX_MODULE_NAME32 + 1]WCHAR, - szExePath: [MAX_PATH]WCHAR, + GlblcntUsage: DWORD, + ProccntUsage: DWORD, + modBaseAddr: ^BYTE, + modBaseSize: DWORD, + hModule: HMODULE, + szModule: [MAX_MODULE_NAME32 + 1]WCHAR, + szExePath: [MAX_PATH]WCHAR, } LPMODULEENTRY32W :: ^MODULEENTRY32W HEAPLIST32 :: struct { - dwSize: SIZE_T, + dwSize: SIZE_T, th32ProcessID: DWORD, - th32HeapID: ULONG_PTR, - dwFlags: DWORD, + th32HeapID: ULONG_PTR, + dwFlags: DWORD, } LPHEAPLIST32 :: ^HEAPLIST32 HEAPENTRY32 :: struct { - dwSize: SIZE_T, - hHandle: HANDLE, - dwAddress: ULONG_PTR, - dwBlockSize: SIZE_T, - dwFlags: DWORD, - dwLockCount: DWORD, - dwResvd: DWORD, + dwSize: SIZE_T, + hHandle: HANDLE, + dwAddress: ULONG_PTR, + dwBlockSize: SIZE_T, + dwFlags: DWORD, + dwLockCount: DWORD, + dwResvd: DWORD, th32ProcessID: DWORD, - th32HeapID: ULONG_PTR, + th32HeapID: ULONG_PTR, } LPHEAPENTRY32 :: ^HEAPENTRY32 diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index 75e9fc695..21bb2c5c1 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -15,75 +15,75 @@ c_ushort :: c.ushort size_t :: c.size_t wchar_t :: c.wchar_t -DWORD :: c_ulong -DWORDLONG :: c.ulonglong -QWORD :: c.ulonglong -HANDLE :: distinct LPVOID -PHANDLE :: ^HANDLE -HINSTANCE :: HANDLE -HMODULE :: distinct HINSTANCE -HRESULT :: distinct LONG -HWND :: distinct HANDLE -HDC :: distinct HANDLE -HMONITOR :: distinct HANDLE -HICON :: distinct HANDLE -HCURSOR :: distinct HANDLE -HMENU :: distinct HANDLE -HBRUSH :: distinct HANDLE -HPEN :: distinct HANDLE -HGDIOBJ :: distinct HANDLE -HBITMAP :: distinct HANDLE -HPALETTE :: distinct HANDLE -HGLOBAL :: distinct HANDLE -HHOOK :: distinct HANDLE -HWINEVENTHOOK :: distinct HANDLE -HKEY :: distinct HANDLE -HDESK :: distinct HANDLE -HFONT :: distinct HANDLE -HRGN :: distinct HANDLE -HRSRC :: distinct HANDLE -HWINSTA :: distinct HANDLE -HACCEL :: distinct HANDLE -BOOL :: distinct b32 -BYTE :: distinct u8 -BOOLEAN :: distinct b8 -GROUP :: distinct c_uint -LARGE_INTEGER :: distinct c_longlong -ULARGE_INTEGER :: distinct c_ulonglong +DWORD :: c_ulong +DWORDLONG :: c.ulonglong +QWORD :: c.ulonglong +HANDLE :: distinct LPVOID +PHANDLE :: ^HANDLE +HINSTANCE :: HANDLE +HMODULE :: distinct HINSTANCE +HRESULT :: distinct LONG +HWND :: distinct HANDLE +HDC :: distinct HANDLE +HMONITOR :: distinct HANDLE +HICON :: distinct HANDLE +HCURSOR :: distinct HANDLE +HMENU :: distinct HANDLE +HBRUSH :: distinct HANDLE +HPEN :: distinct HANDLE +HGDIOBJ :: distinct HANDLE +HBITMAP :: distinct HANDLE +HPALETTE :: distinct HANDLE +HGLOBAL :: distinct HANDLE +HHOOK :: distinct HANDLE +HWINEVENTHOOK :: distinct HANDLE +HKEY :: distinct HANDLE +HDESK :: distinct HANDLE +HFONT :: distinct HANDLE +HRGN :: distinct HANDLE +HRSRC :: distinct HANDLE +HWINSTA :: distinct HANDLE +HACCEL :: distinct HANDLE +BOOL :: distinct b32 +BYTE :: distinct u8 +BOOLEAN :: distinct b8 +GROUP :: distinct c_uint +LARGE_INTEGER :: distinct c_longlong +ULARGE_INTEGER :: distinct c_ulonglong PULARGE_INTEGER :: ^ULARGE_INTEGER -LONG :: c_long -UINT :: c_uint -INT :: c_int -SHORT :: c_short -USHORT :: c_ushort -WCHAR :: wchar_t -SIZE_T :: uint -PSIZE_T :: ^SIZE_T -WORD :: u16 -CHAR :: c_char -ULONG_PTR :: uint -PULONG_PTR :: ^ULONG_PTR -LPULONG_PTR :: ^ULONG_PTR -DWORD_PTR :: ULONG_PTR -LONG_PTR :: int -INT_PTR :: int -UINT_PTR :: uintptr -ULONG :: c_ulong -ULONGLONG :: c_ulonglong -LONGLONG :: c_longlong -UCHAR :: BYTE -NTSTATUS :: c.long -COLORREF :: DWORD -LPCOLORREF :: ^COLORREF -LPARAM :: LONG_PTR -WPARAM :: UINT_PTR -LRESULT :: LONG_PTR -LPRECT :: ^RECT -LPPOINT :: ^POINT -LSTATUS :: LONG -PHKEY :: ^HKEY -PUSHORT :: ^USHORT -PCHAR :: ^CHAR +LONG :: c_long +UINT :: c_uint +INT :: c_int +SHORT :: c_short +USHORT :: c_ushort +WCHAR :: wchar_t +SIZE_T :: uint +PSIZE_T :: ^SIZE_T +WORD :: u16 +CHAR :: c_char +ULONG_PTR :: uint +PULONG_PTR :: ^ULONG_PTR +LPULONG_PTR :: ^ULONG_PTR +DWORD_PTR :: ULONG_PTR +LONG_PTR :: int +INT_PTR :: int +UINT_PTR :: uintptr +ULONG :: c_ulong +ULONGLONG :: c_ulonglong +LONGLONG :: c_longlong +UCHAR :: BYTE +NTSTATUS :: c.long +COLORREF :: DWORD +LPCOLORREF :: ^COLORREF +LPARAM :: LONG_PTR +WPARAM :: UINT_PTR +LRESULT :: LONG_PTR +LPRECT :: ^RECT +LPPOINT :: ^POINT +LSTATUS :: LONG +PHKEY :: ^HKEY +PUSHORT :: ^USHORT +PCHAR :: ^CHAR UINT8 :: u8 UINT16 :: u16 @@ -101,68 +101,71 @@ LONG32 :: i32 ULONG64 :: u64 LONG64 :: i64 -DWORD64 :: u64 +DWORD64 :: u64 PDWORD64 :: ^DWORD64 PDWORD_PTR :: ^DWORD_PTR -ATOM :: distinct WORD +ATOM :: distinct WORD wstring :: cstring16 PWSTR :: cstring16 -PBYTE :: ^BYTE -LPBYTE :: ^BYTE -PBOOL :: ^BOOL -LPBOOL :: ^BOOL -LPCSTR :: cstring -LPCWSTR :: wstring -LPCTSTR :: wstring -LPDWORD :: ^DWORD -PCSTR :: cstring -PCWSTR :: wstring -PDWORD :: ^DWORD -LPHANDLE :: ^HANDLE -LPOVERLAPPED :: ^OVERLAPPED +PBYTE :: ^BYTE +LPBYTE :: ^BYTE +PBOOL :: ^BOOL +LPBOOL :: ^BOOL +LPCSTR :: cstring +LPCWSTR :: wstring +LPCTSTR :: wstring +LPDWORD :: ^DWORD +PCSTR :: cstring +PCWSTR :: wstring +PDWORD :: ^DWORD +LPHANDLE :: ^HANDLE +LPOVERLAPPED :: ^OVERLAPPED LPPROCESS_INFORMATION :: ^PROCESS_INFORMATION -PSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES +PSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES LPSECURITY_ATTRIBUTES :: ^SECURITY_ATTRIBUTES -LPSTARTUPINFOW :: ^STARTUPINFOW -LPTRACKMOUSEEVENT :: ^TRACKMOUSEEVENT -VOID :: rawptr -PVOID :: rawptr -LPVOID :: rawptr -PINT :: ^INT -LPINT :: ^INT -PUINT :: ^UINT -LPUINT :: ^UINT -LPWCH :: ^WCHAR -LPWORD :: ^WORD -PULONG :: ^ULONG -LPWIN32_FIND_DATAW :: ^WIN32_FIND_DATAW -LPWSADATA :: ^WSADATA -LPWSAPROTOCOL_INFO :: ^WSAPROTOCOL_INFO -LPSTR :: ^CHAR -LPWSTR :: ^WCHAR -OLECHAR :: WCHAR -BSTR :: ^OLECHAR -LPOLESTR :: cstring16 -LPCOLESTR :: LPCSTR +LPSTARTUPINFOW :: ^STARTUPINFOW +LPTRACKMOUSEEVENT :: ^TRACKMOUSEEVENT +VOID :: rawptr +PVOID :: rawptr +LPVOID :: rawptr +PINT :: ^INT +LPINT :: ^INT +PUINT :: ^UINT +LPUINT :: ^UINT +LPWCH :: ^WCHAR +LPWORD :: ^WORD +PULONG :: ^ULONG +LPWIN32_FIND_DATAW :: ^WIN32_FIND_DATAW +LPWSADATA :: ^WSADATA +LPWSAPROTOCOL_INFO :: ^WSAPROTOCOL_INFO +LPSTR :: ^CHAR +LPWSTR :: ^WCHAR +OLECHAR :: WCHAR +BSTR :: ^OLECHAR + +LPOLESTR :: cstring16 +LPCOLESTR :: LPCSTR LPFILETIME :: ^FILETIME -LPWSABUF :: ^WSABUF +LPWSABUF :: ^WSABUF + LPWSAOVERLAPPED :: distinct rawptr LPWSAOVERLAPPED_COMPLETION_ROUTINE :: distinct rawptr -LPCVOID :: rawptr -SCODE :: LONG -PSCODE :: ^SCODE -PACCESS_TOKEN :: PVOID +LPCVOID :: rawptr +SCODE :: LONG +PSCODE :: ^SCODE + +PACCESS_TOKEN :: PVOID PSECURITY_DESCRIPTOR :: PVOID -PSID :: PVOID -PCLAIMS_BLOB :: PVOID +PSID :: PVOID +PCLAIMS_BLOB :: PVOID PCONDITION_VARIABLE :: ^CONDITION_VARIABLE -PLARGE_INTEGER :: ^LARGE_INTEGER -PSRWLOCK :: ^SRWLOCK +PLARGE_INTEGER :: ^LARGE_INTEGER +PSRWLOCK :: ^SRWLOCK CREATE_WAITABLE_TIMER_MANUAL_RESET :: 0x00000001 CREATE_WAITABLE_TIMER_HIGH_RESOLUTION :: 0x00000002 @@ -183,28 +186,28 @@ LPSIZE :: ^SIZE MAXLONG :: 0x7fffffff -FILE_ATTRIBUTE_READONLY: DWORD : 0x00000001 -FILE_ATTRIBUTE_HIDDEN: DWORD : 0x00000002 -FILE_ATTRIBUTE_SYSTEM: DWORD : 0x00000004 -FILE_ATTRIBUTE_DIRECTORY: DWORD : 0x00000010 -FILE_ATTRIBUTE_ARCHIVE: DWORD : 0x00000020 -FILE_ATTRIBUTE_DEVICE: DWORD : 0x00000040 -FILE_ATTRIBUTE_NORMAL: DWORD : 0x00000080 -FILE_ATTRIBUTE_TEMPORARY: DWORD : 0x00000100 -FILE_ATTRIBUTE_SPARSE_FILE: DWORD : 0x00000200 -FILE_ATTRIBUTE_REPARSE_Point: DWORD : 0x00000400 -FILE_ATTRIBUTE_REPARSE_POINT: DWORD : 0x00000400 -FILE_ATTRIBUTE_COMPRESSED: DWORD : 0x00000800 -FILE_ATTRIBUTE_OFFLINE: DWORD : 0x00001000 -FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: DWORD : 0x00002000 -FILE_ATTRIBUTE_ENCRYPTED: DWORD : 0x00004000 +FILE_ATTRIBUTE_READONLY : DWORD : 0x00000001 +FILE_ATTRIBUTE_HIDDEN : DWORD : 0x00000002 +FILE_ATTRIBUTE_SYSTEM : DWORD : 0x00000004 +FILE_ATTRIBUTE_DIRECTORY : DWORD : 0x00000010 +FILE_ATTRIBUTE_ARCHIVE : DWORD : 0x00000020 +FILE_ATTRIBUTE_DEVICE : DWORD : 0x00000040 +FILE_ATTRIBUTE_NORMAL : DWORD : 0x00000080 +FILE_ATTRIBUTE_TEMPORARY : DWORD : 0x00000100 +FILE_ATTRIBUTE_SPARSE_FILE : DWORD : 0x00000200 +FILE_ATTRIBUTE_REPARSE_Point : DWORD : 0x00000400 +FILE_ATTRIBUTE_REPARSE_POINT : DWORD : 0x00000400 +FILE_ATTRIBUTE_COMPRESSED : DWORD : 0x00000800 +FILE_ATTRIBUTE_OFFLINE : DWORD : 0x00001000 +FILE_ATTRIBUTE_NOT_CONTENT_INDEXED : DWORD : 0x00002000 +FILE_ATTRIBUTE_ENCRYPTED : DWORD : 0x00004000 -FILE_SHARE_READ: DWORD : 0x00000001 -FILE_SHARE_WRITE: DWORD : 0x00000002 -FILE_SHARE_DELETE: DWORD : 0x00000004 -FILE_GENERIC_ALL: DWORD : 0x10000000 -FILE_GENERIC_EXECUTE: DWORD : 0x20000000 -FILE_GENERIC_READ: DWORD : 0x80000000 +FILE_SHARE_READ : DWORD : 0x00000001 +FILE_SHARE_WRITE : DWORD : 0x00000002 +FILE_SHARE_DELETE : DWORD : 0x00000004 +FILE_GENERIC_ALL : DWORD : 0x10000000 +FILE_GENERIC_EXECUTE : DWORD : 0x20000000 +FILE_GENERIC_READ : DWORD : 0x80000000 FILE_ALL_ACCESS :: STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF FILE_ACTION_ADDED :: 0x00000001 @@ -222,11 +225,11 @@ FILE_NOTIFY_CHANGE_LAST_ACCESS :: 0x00000020 FILE_NOTIFY_CHANGE_CREATION :: 0x00000040 FILE_NOTIFY_CHANGE_SECURITY :: 0x00000100 -CREATE_NEW: DWORD : 1 -CREATE_ALWAYS: DWORD : 2 -OPEN_ALWAYS: DWORD : 4 -OPEN_EXISTING: DWORD : 3 -TRUNCATE_EXISTING: DWORD : 5 +CREATE_NEW : DWORD : 1 +CREATE_ALWAYS : DWORD : 2 +OPEN_ALWAYS : DWORD : 4 +OPEN_EXISTING : DWORD : 3 +TRUNCATE_EXISTING : DWORD : 5 FILE_READ_DATA : DWORD : 0x00000001 FILE_LIST_DIRECTORY : DWORD : 0x00000001 @@ -248,11 +251,12 @@ GENERIC_WRITE : DWORD : 0x40000000 GENERIC_EXECUTE : DWORD : 0x20000000 GENERIC_ALL : DWORD : 0x10000000 -FILE_GENERIC_WRITE: DWORD : STANDARD_RIGHTS_WRITE | - FILE_WRITE_DATA | +FILE_GENERIC_WRITE : DWORD : \ + STANDARD_RIGHTS_WRITE | + FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | - FILE_WRITE_EA | - FILE_APPEND_DATA | + FILE_WRITE_EA | + FILE_APPEND_DATA | SYNCHRONIZE SECURITY_SQOS_PRESENT: DWORD : 0x00100000 @@ -297,13 +301,13 @@ POWER_REQUEST_CONTEXT_DETAILED_STRING :: DIAGNOSTIC_REASON_DETAILED_STRING REASON_CONTEXT :: struct { Version: ULONG, - Flags: DWORD, + Flags: DWORD, Reason: struct #raw_union { Detailed: struct { LocalizedReasonModule: HMODULE, - LocalizedReasonId: ULONG, - ReasonStringCount: ULONG, - ReasonStrings: ^LPWSTR, + LocalizedReasonId: ULONG, + ReasonStringCount: ULONG, + ReasonStrings: [^]LPWSTR `fmt:"v,ReasonStringCount"`, }, SimpleReasonString: LPWSTR, }, @@ -324,9 +328,9 @@ RRF_RT_ANY :: 0x0000ffff RRF_NOEXPAND :: 0x10000000 RRF_ZEROONFAILURE :: 0x20000000 -ACCESS_MASK :: DWORD +ACCESS_MASK :: DWORD PACCESS_MASK :: ^ACCESS_MASK -REGSAM :: ACCESS_MASK +REGSAM :: ACCESS_MASK // Reserved Key Handles. HKEY_CLASSES_ROOT :: HKEY(uintptr(0x80000000)) @@ -368,12 +372,13 @@ KEY_WOW64_RES :: 0x0300 KEY_READ :: (STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE) KEY_WRITE :: (STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE) KEY_EXECUTE :: (KEY_READ) & (~SYNCHRONIZE) -KEY_ALL_ACCESS :: (STANDARD_RIGHTS_ALL | - KEY_QUERY_VALUE | - KEY_SET_VALUE | - KEY_CREATE_SUB_KEY | +KEY_ALL_ACCESS :: ( + STANDARD_RIGHTS_ALL | + KEY_QUERY_VALUE | + KEY_SET_VALUE | + KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | - KEY_NOTIFY | + KEY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE) // Open/Create Options @@ -385,17 +390,19 @@ REG_OPTION_BACKUP_RESTORE :: 0x00000004 REG_OPTION_OPEN_LINK :: 0x00000008 REG_OPTION_DONT_VIRTUALIZE :: 0x00000010 -REG_LEGAL_OPTION :: REG_OPTION_RESERVED | - REG_OPTION_NON_VOLATILE | - REG_OPTION_VOLATILE | - REG_OPTION_CREATE_LINK | +REG_LEGAL_OPTION :: \ + REG_OPTION_RESERVED | + REG_OPTION_NON_VOLATILE | + REG_OPTION_VOLATILE | + REG_OPTION_CREATE_LINK | REG_OPTION_BACKUP_RESTORE | - REG_OPTION_OPEN_LINK | + REG_OPTION_OPEN_LINK | REG_OPTION_DONT_VIRTUALIZE -REG_OPEN_LEGAL_OPTION :: REG_OPTION_RESERVED | +REG_OPEN_LEGAL_OPTION :: \ + REG_OPTION_RESERVED | REG_OPTION_BACKUP_RESTORE | - REG_OPTION_OPEN_LINK | + REG_OPTION_OPEN_LINK | REG_OPTION_DONT_VIRTUALIZE // Key creation/open disposition @@ -437,10 +444,11 @@ REG_NOTIFY_CHANGE_LAST_SET :: 0x00000004 REG_NOTIFY_CHANGE_SECURITY :: 0x00000008 REG_NOTIFY_THREAD_AGNOSTIC :: 0x10000000 -REG_LEGAL_CHANGE_FILTER :: REG_NOTIFY_CHANGE_NAME | +REG_LEGAL_CHANGE_FILTER :: \ + REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES | - REG_NOTIFY_CHANGE_LAST_SET | - REG_NOTIFY_CHANGE_SECURITY | + REG_NOTIFY_CHANGE_LAST_SET | + REG_NOTIFY_CHANGE_SECURITY | REG_NOTIFY_THREAD_AGNOSTIC // Predefined Value Types. @@ -461,9 +469,9 @@ REG_QWORD_LITTLE_ENDIAN :: 11 BSMINFO :: struct { cbSize: UINT, - hdesk: HDESK, - hwnd: HWND, - luid: LUID, + hdesk: HDESK, + hwnd: HWND, + luid: LUID, } PBSMINFO :: ^BSMINFO @@ -545,37 +553,37 @@ 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) +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) @@ -1255,61 +1263,61 @@ HOOKPROC :: #type proc "system" (code: c_int, wParam: WPARAM, lParam: LPARAM) -> WINEVENTPROC :: #type proc "system" ( hWinEventHook: HWINEVENTHOOK, - event: DWORD, - hwnd: HWND, - idObject, idChild: LONG, + event: DWORD, + hwnd: HWND, + idObject, idChild: LONG, idEventThread, dwmsEventTime: DWORD, ) CWPRETSTRUCT :: struct { lResult: LRESULT, - lParam: LPARAM, - wParam: WPARAM, + lParam: LPARAM, + wParam: WPARAM, message: UINT, - hwnd: HWND, + hwnd: HWND, } MSLLHOOKSTRUCT :: struct { - pt: POINT, - mouseData: DWORD, - flags: DWORD, - time: DWORD, + pt: POINT, + mouseData: DWORD, + flags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } KBDLLHOOKSTRUCT :: struct { - vkCode: DWORD, - scanCode: DWORD, - flags: DWORD, - time: DWORD, + vkCode: DWORD, + scanCode: DWORD, + flags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } MOUSEINPUT :: struct { - dx: LONG, - dy: LONG, - mouseData: DWORD, - dwFlags: DWORD, - time: DWORD, + dx: LONG, + dy: LONG, + mouseData: DWORD, + dwFlags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } KEYBDINPUT :: struct { - wVk: WORD, - wScan: WORD, - dwFlags: DWORD, - time: DWORD, + wVk: WORD, + wScan: WORD, + dwFlags: DWORD, + time: DWORD, dwExtraInfo: ULONG_PTR, } HARDWAREINPUT :: struct { - uMsg: DWORD, + uMsg: DWORD, wParamL: WORD, wParamH: WORD, } INPUT_TYPE :: enum DWORD { - MOUSE = 0, + MOUSE = 0, KEYBOARD = 1, HARDWARE = 2, } @@ -1317,128 +1325,128 @@ INPUT_TYPE :: enum DWORD { INPUT :: struct { type: INPUT_TYPE, using _: struct #raw_union { - mi: MOUSEINPUT, - ki: KEYBDINPUT, - hi: HARDWAREINPUT, + mi: MOUSEINPUT `raw_union_tag:"type=MOUSE"`, + ki: KEYBDINPUT `raw_union_tag:"type=KEYBOARD"`, + hi: HARDWAREINPUT `raw_union_tag:"type=HARDWARE"`, }, } -MOUSEEVENTF_MOVE :: 0x0001 -MOUSEEVENTF_LEFTDOWN :: 0x0002 -MOUSEEVENTF_LEFTUP :: 0x0004 -MOUSEEVENTF_RIGHTDOWN :: 0x0008 -MOUSEEVENTF_RIGHTUP :: 0x0010 -MOUSEEVENTF_MIDDLEDOWN :: 0x0020 -MOUSEEVENTF_MIDDLEUP :: 0x0040 -MOUSEEVENTF_XDOWN :: 0x0080 -MOUSEEVENTF_XUP :: 0x0100 -MOUSEEVENTF_WHEEL :: 0x0800 -MOUSEEVENTF_HWHEEL :: 0x1000 +MOUSEEVENTF_MOVE :: 0x0001 +MOUSEEVENTF_LEFTDOWN :: 0x0002 +MOUSEEVENTF_LEFTUP :: 0x0004 +MOUSEEVENTF_RIGHTDOWN :: 0x0008 +MOUSEEVENTF_RIGHTUP :: 0x0010 +MOUSEEVENTF_MIDDLEDOWN :: 0x0020 +MOUSEEVENTF_MIDDLEUP :: 0x0040 +MOUSEEVENTF_XDOWN :: 0x0080 +MOUSEEVENTF_XUP :: 0x0100 +MOUSEEVENTF_WHEEL :: 0x0800 +MOUSEEVENTF_HWHEEL :: 0x1000 MOUSEEVENTF_MOVE_NOCOALESCE :: 0x2000 -MOUSEEVENTF_VIRTUALDESK :: 0x4000 -MOUSEEVENTF_ABSOLUTE :: 0x8000 +MOUSEEVENTF_VIRTUALDESK :: 0x4000 +MOUSEEVENTF_ABSOLUTE :: 0x8000 WNDCLASSA :: struct { - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCSTR, + lpszMenuName: LPCSTR, lpszClassName: LPCSTR, } WNDCLASSW :: struct { - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCWSTR, + lpszMenuName: LPCWSTR, lpszClassName: LPCWSTR, } WNDCLASSEXA :: struct { - cbSize: UINT, - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + cbSize: UINT, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCSTR, + lpszMenuName: LPCSTR, lpszClassName: LPCSTR, - hIconSm: HICON, + hIconSm: HICON, } WNDCLASSEXW :: struct { - cbSize: UINT, - style: UINT, - lpfnWndProc: WNDPROC, - cbClsExtra: c_int, - cbWndExtra: c_int, - hInstance: HINSTANCE, - hIcon: HICON, - hCursor: HCURSOR, + cbSize: UINT, + style: UINT, + lpfnWndProc: WNDPROC, + cbClsExtra: c_int, + cbWndExtra: c_int, + hInstance: HINSTANCE, + hIcon: HICON, + hCursor: HCURSOR, hbrBackground: HBRUSH, - lpszMenuName: LPCWSTR, + lpszMenuName: LPCWSTR, lpszClassName: LPCWSTR, - hIconSm: HICON, + hIconSm: HICON, } MSG :: struct { - hwnd: HWND, + hwnd: HWND, message: UINT, - wParam: WPARAM, - lParam: LPARAM, - time: DWORD, - pt: POINT, + wParam: WPARAM, + lParam: LPARAM, + time: DWORD, + pt: POINT, } LPMSG :: ^MSG NOTIFYICONDATAW :: struct { - cbSize: DWORD, - hWnd: HWND, - uID: UINT, - uFlags: UINT, + cbSize: DWORD, + hWnd: HWND, + uID: UINT, + uFlags: UINT, uCallbackMessage: UINT, - hIcon: HICON, - szTip: [128]WCHAR, - dwState: DWORD, - dwStateMask: DWORD, - szInfo: [256]WCHAR, + hIcon: HICON, + szTip: [128]WCHAR, + dwState: DWORD, + dwStateMask: DWORD, + szInfo: [256]WCHAR, using _: struct #raw_union { uTimeout: UINT, uVersion: UINT, }, - szInfoTitle: [64]WCHAR, - dwInfoFlags: DWORD, - guidItem: GUID, + szInfoTitle: [64]WCHAR, + dwInfoFlags: DWORD, + guidItem: GUID, hBalloonIcon: HICON, } -NIF_MESSAGE :: 0x00000001 -NIF_ICON :: 0x00000002 -NIF_TIP :: 0x00000004 -NIF_STATE :: 0x00000008 -NIF_INFO :: 0x00000010 -NIF_GUID :: 0x00000020 +NIF_MESSAGE :: 0x00000001 +NIF_ICON :: 0x00000002 +NIF_TIP :: 0x00000004 +NIF_STATE :: 0x00000008 +NIF_INFO :: 0x00000010 +NIF_GUID :: 0x00000020 NIF_REALTIME :: 0x00000040 -NIF_SHOWTIP :: 0x00000080 +NIF_SHOWTIP :: 0x00000080 -NIM_ADD :: 0x00000000 -NIM_MODIFY :: 0x00000001 -NIM_DELETE :: 0x00000002 -NIM_SETFOCUS :: 0x00000003 +NIM_ADD :: 0x00000000 +NIM_MODIFY :: 0x00000001 +NIM_DELETE :: 0x00000002 +NIM_SETFOCUS :: 0x00000003 NIM_SETVERSION :: 0x00000004 // Menu flags for Add/Check/EnableMenuItem() @@ -1448,37 +1456,37 @@ MF_APPEND :: 0x00000100 MF_DELETE :: 0x00000200 MF_REMOVE :: 0x00001000 -MF_BYCOMMAND :: 0x00000000 +MF_BYCOMMAND :: 0x00000000 MF_BYPOSITION :: 0x00000400 MF_SEPARATOR :: 0x00000800 -MF_ENABLED :: 0x00000000 -MF_GRAYED :: 0x00000001 +MF_ENABLED :: 0x00000000 +MF_GRAYED :: 0x00000001 MF_DISABLED :: 0x00000002 -MF_UNCHECKED :: 0x00000000 -MF_CHECKED :: 0x00000008 +MF_UNCHECKED :: 0x00000000 +MF_CHECKED :: 0x00000008 MF_USECHECKBITMAPS :: 0x00000200 -MF_STRING :: 0x00000000 -MF_BITMAP :: 0x00000004 +MF_STRING :: 0x00000000 +MF_BITMAP :: 0x00000004 MF_OWNERDRAW :: 0x00000100 -MF_POPUP :: 0x00000010 +MF_POPUP :: 0x00000010 MF_MENUBARBREAK :: 0x00000020 -MF_MENUBREAK :: 0x00000040 +MF_MENUBREAK :: 0x00000040 MF_UNHILITE :: 0x00000000 -MF_HILITE :: 0x00000080 +MF_HILITE :: 0x00000080 -MF_DEFAULT :: 0x00001000 -MF_SYSMENU :: 0x00002000 -MF_HELP :: 0x00004000 +MF_DEFAULT :: 0x00001000 +MF_SYSMENU :: 0x00002000 +MF_HELP :: 0x00004000 MF_RIGHTJUSTIFY :: 0x00004000 MF_MOUSESELECT :: 0x00008000 -MF_END :: 0x00000080 // Obsolete -- only used by old RES files +MF_END :: 0x00000080 // Obsolete -- only used by old RES files // Menu flags for Add/Check/EnableMenuItem() MFS_GRAYED :: 0x00000003 @@ -1491,27 +1499,27 @@ MFS_UNHILITE :: MF_UNHILITE MFS_DEFAULT :: MF_DEFAULT // Flags for TrackPopupMenu -TPM_LEFTBUTTON :: 0x0000 -TPM_RIGHTBUTTON :: 0x0002 -TPM_LEFTALIGN :: 0x0000 -TPM_CENTERALIGN :: 0x0004 -TPM_RIGHTALIGN :: 0x0008 -TPM_TOPALIGN :: 0x0000 +TPM_LEFTBUTTON :: 0x0000 +TPM_RIGHTBUTTON :: 0x0002 +TPM_LEFTALIGN :: 0x0000 +TPM_CENTERALIGN :: 0x0004 +TPM_RIGHTALIGN :: 0x0008 +TPM_TOPALIGN :: 0x0000 TPM_VCENTERALIGN :: 0x0010 -TPM_BOTTOMALIGN :: 0x0020 +TPM_BOTTOMALIGN :: 0x0020 -TPM_HORIZONTAL :: 0x0000 /* Horz alignment matters more */ -TPM_VERTICAL :: 0x0040 /* Vert alignment matters more */ -TPM_NONOTIFY :: 0x0080 /* Don't send any notification msgs */ -TPM_RETURNCMD :: 0x0100 -TPM_RECURSE :: 0x0001 +TPM_HORIZONTAL :: 0x0000 /* Horz alignment matters more */ +TPM_VERTICAL :: 0x0040 /* Vert alignment matters more */ +TPM_NONOTIFY :: 0x0080 /* Don't send any notification msgs */ +TPM_RETURNCMD :: 0x0100 +TPM_RECURSE :: 0x0001 TPM_HORPOSANIMATION :: 0x0400 TPM_HORNEGANIMATION :: 0x0800 TPM_VERPOSANIMATION :: 0x1000 TPM_VERNEGANIMATION :: 0x2000 -TPM_NOANIMATION :: 0x4000 -TPM_LAYOUTRTL :: 0x8000 -TPM_WORKAREA :: 0x10000 +TPM_NOANIMATION :: 0x4000 +TPM_LAYOUTRTL :: 0x8000 +TPM_WORKAREA :: 0x10000 // WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes HTERROR :: -2 @@ -1545,42 +1553,42 @@ HTCLOSE :: 20 HTHELP :: 21 TEXTMETRICW :: struct { - tmHeight: LONG, - tmAscent: LONG, - tmDescent: LONG, - tmInternalLeading: LONG, - tmExternalLeading: LONG, - tmAveCharWidth: LONG, - tmMaxCharWidth: LONG, - tmWeight: LONG, - tmOverhang: LONG, + tmHeight: LONG, + tmAscent: LONG, + tmDescent: LONG, + tmInternalLeading: LONG, + tmExternalLeading: LONG, + tmAveCharWidth: LONG, + tmMaxCharWidth: LONG, + tmWeight: LONG, + tmOverhang: LONG, tmDigitizedAspectX: LONG, tmDigitizedAspectY: LONG, - tmFirstChar: WCHAR, - tmLastChar: WCHAR, - tmDefaultChar: WCHAR, - tmBreakChar: WCHAR, - tmItalic: BYTE, - tmUnderlined: BYTE, - tmStruckOut: BYTE, - tmPitchAndFamily: BYTE, - tmCharSet: BYTE, + tmFirstChar: WCHAR, + tmLastChar: WCHAR, + tmDefaultChar: WCHAR, + tmBreakChar: WCHAR, + tmItalic: BYTE, + tmUnderlined: BYTE, + tmStruckOut: BYTE, + tmPitchAndFamily: BYTE, + tmCharSet: BYTE, } LPTEXTMETRICW :: ^TEXTMETRICW PAINTSTRUCT :: struct { - hdc: HDC, - fErase: BOOL, - rcPaint: RECT, - fRestore: BOOL, - fIncUpdate: BOOL, + hdc: HDC, + fErase: BOOL, + rcPaint: RECT, + fRestore: BOOL, + fIncUpdate: BOOL, rgbReserved: [32]BYTE, } TRACKMOUSEEVENT :: struct { - cbSize: DWORD, - dwFlags: DWORD, - hwndTrack: HWND, + cbSize: DWORD, + dwFlags: DWORD, + hwndTrack: HWND, dwHoverTime: DWORD, } @@ -1640,16 +1648,16 @@ MAX_LINKID_TEXT :: 48 L_MAX_URL_LENGTH :: 2048 + 32 + len("://") LITEM :: struct { - mask: UINT, - iLink: c_int, - state: UINT, + mask: UINT, + iLink: c_int, + state: UINT, stateMask: UINT, - szID: [MAX_LINKID_TEXT]WCHAR, - szUrl: [L_MAX_URL_LENGTH]WCHAR, + szID: [MAX_LINKID_TEXT]WCHAR, + szUrl: [L_MAX_URL_LENGTH]WCHAR, } NMLINK :: struct { - hdr: NMHDR, + hdr: NMHDR, item: LITEM, } @@ -1660,12 +1668,12 @@ NMHDR :: struct { } NMCUSTOMDRAW :: struct { - hdr: NMHDR, + hdr: NMHDR, dwDrawStage: DWORD, - hdc: HDC, - rc: RECT, - dwItemSpec: DWORD_PTR, - uItemState: UINT, + hdc: HDC, + rc: RECT, + dwItemSpec: DWORD_PTR, + uItemState: UINT, lItemlParam: LPARAM, } @@ -1701,14 +1709,14 @@ NM_TVSTATEIMAGECHANGING :: NM_OUTOFMEMORY-23 // uses NMTVSTATEIMAGECHANGING stru PCZZWSTR :: cstring16 SHFILEOPSTRUCTW :: struct { - hwnd: HWND, - wFunc: UINT, - pFrom: PCZZWSTR, - pTo: PCZZWSTR, - fFlags: FILEOP_FLAGS, + hwnd: HWND, + wFunc: UINT, + pFrom: PCZZWSTR, + pTo: PCZZWSTR, + fFlags: FILEOP_FLAGS, fAnyOperationsAborted: BOOL, - hNameMappings: LPVOID, - lpszProgressTitle: PCWSTR, // only used if FOF_SIMPLEPROGRESS + hNameMappings: LPVOID, + lpszProgressTitle: PCWSTR, // only used if FOF_SIMPLEPROGRESS } LPSHFILEOPSTRUCTW :: ^SHFILEOPSTRUCTW @@ -1741,7 +1749,7 @@ FOF_NO_UI :: (FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FILEOP_FLAGS :: WORD DEVMODEW :: struct { - dmDeviceName: [32]wchar_t, + dmDeviceName: [32]wchar_t, dmSpecVersion: WORD, dmDriverVersion: WORD, dmSize: WORD, @@ -1887,7 +1895,7 @@ WS_MINIMIZE : UINT : 0x2000_0000 WS_MINIMIZEBOX : UINT : 0x0002_0000 WS_OVERLAPPED : UINT : 0x0000_0000 WS_OVERLAPPEDWINDOW : UINT : WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX -WS_POPUP : UINT : 0x8000_0000 +WS_POPUP : UINT : 0x8000_0000 WS_POPUPWINDOW : UINT : WS_POPUP | WS_BORDER | WS_SYSMENU WS_SIZEBOX : UINT : 0x0004_0000 WS_SYSMENU : UINT : 0x0008_0000 @@ -2227,24 +2235,24 @@ SEE_MASK_FLAG_LOG_USAGE :: 0x04000000 SEE_MASK_FLAG_HINST_IS_SITE :: 0x08000000 SHELLEXECUTEINFOW :: struct { - cbSize: DWORD, // in, required, sizeof of this structure - fMask: ULONG, // in, SEE_MASK_XXX values - hwnd: HWND, // in, optional - lpVerb: LPCWSTR, // in, optional when unspecified the default verb is choosen - lpFile: LPCWSTR, // in, either this value or lpIDList must be specified - lpParameters: LPCWSTR, // in, optional - lpDirectory: LPCWSTR, // in, optional - nShow: c_int, // in, required - hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified - lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST - lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified - hkeyClass: HKEY, // in, valid when SEE_MASK_CLASSKEY is specified - dwHotKey: DWORD, // in, valid when SEE_MASK_HOTKEY is specified - DUMMYUNIONNAME: struct #raw_union { - hIcon: HANDLE, // not used - hMonitor: HANDLE, // in, valid when SEE_MASK_HMONITOR specified + cbSize: DWORD, // in, required, sizeof of this structure + fMask: ULONG, // in, SEE_MASK_XXX values + hwnd: HWND, // in, optional + lpVerb: LPCWSTR, // in, optional when unspecified the default verb is choosen + lpFile: LPCWSTR, // in, either this value or lpIDList must be specified + lpParameters: LPCWSTR, // in, optional + lpDirectory: LPCWSTR, // in, optional + nShow: c_int, // in, required + hInstApp: HINSTANCE, // out when SEE_MASK_NOCLOSEPROCESS is specified + lpIDList: rawptr, // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST + lpClass: LPCWSTR, // in, valid when SEE_MASK_CLASSNAME is specified + hkeyClass: HKEY, // in, valid when SEE_MASK_CLASSKEY is specified + dwHotKey: DWORD, // in, valid when SEE_MASK_HOTKEY is specified + using DUMMYUNIONNAME: struct #raw_union { + hIcon: HANDLE, // not used + hMonitor: HANDLE, // in, valid when SEE_MASK_HMONITOR specified }, - hProcess: HANDLE, // out, valid when SEE_MASK_NOCLOSEPROCESS specified + hProcess: HANDLE, // out, valid when SEE_MASK_NOCLOSEPROCESS specified } LPSHELLEXECUTEINFOW :: ^SHELLEXECUTEINFOW @@ -2291,9 +2299,9 @@ WA_CLICKACTIVE :: 2 // Struct pointed to by WM_GETMINMAXINFO lParam MINMAXINFO :: struct { - ptReserved: POINT, - ptMaxSize: POINT, - ptMaxPosition: POINT, + ptReserved: POINT, + ptMaxSize: POINT, + ptMaxPosition: POINT, ptMinTrackSize: POINT, ptMaxTrackSize: POINT, } @@ -2514,53 +2522,53 @@ STOCK_LAST :: 19 CLR_INVALID :: 0xFFFFFFFF RGBQUAD :: struct { - rgbBlue: BYTE, - rgbGreen: BYTE, - rgbRed: BYTE, + rgbBlue: BYTE, + rgbGreen: BYTE, + rgbRed: BYTE, rgbReserved: BYTE, } PIXELFORMATDESCRIPTOR :: struct { - nSize: WORD, - nVersion: WORD, - dwFlags: DWORD, - iPixelType: BYTE, - cColorBits: BYTE, - cRedBits: BYTE, - cRedShift: BYTE, - cGreenBits: BYTE, - cGreenShift: BYTE, - cBlueBits: BYTE, - cBlueShift: BYTE, - cAlphaBits: BYTE, - cAlphaShift: BYTE, - cAccumBits: BYTE, - cAccumRedBits: BYTE, + nSize: WORD, + nVersion: WORD, + dwFlags: DWORD, + iPixelType: BYTE, + cColorBits: BYTE, + cRedBits: BYTE, + cRedShift: BYTE, + cGreenBits: BYTE, + cGreenShift: BYTE, + cBlueBits: BYTE, + cBlueShift: BYTE, + cAlphaBits: BYTE, + cAlphaShift: BYTE, + cAccumBits: BYTE, + cAccumRedBits: BYTE, cAccumGreenBits: BYTE, - cAccumBlueBits: BYTE, + cAccumBlueBits: BYTE, cAccumAlphaBits: BYTE, - cDepthBits: BYTE, - cStencilBits: BYTE, - cAuxBuffers: BYTE, - iLayerType: BYTE, - bReserved: BYTE, - dwLayerMask: DWORD, - dwVisibleMask: DWORD, - dwDamageMask: DWORD, + cDepthBits: BYTE, + cStencilBits: BYTE, + cAuxBuffers: BYTE, + iLayerType: BYTE, + bReserved: BYTE, + dwLayerMask: DWORD, + dwVisibleMask: DWORD, + dwDamageMask: DWORD, } BITMAPINFOHEADER :: struct { - biSize: DWORD, - biWidth: LONG, - biHeight: LONG, - biPlanes: WORD, - biBitCount: WORD, - biCompression: DWORD, - biSizeImage: DWORD, + biSize: DWORD, + biWidth: LONG, + biHeight: LONG, + biPlanes: WORD, + biBitCount: WORD, + biCompression: DWORD, + biSizeImage: DWORD, biXPelsPerMeter: LONG, biYPelsPerMeter: LONG, - biClrUsed: DWORD, - biClrImportant: DWORD, + biClrUsed: DWORD, + biClrImportant: DWORD, } BITMAPINFO :: struct { @@ -2668,64 +2676,64 @@ CONDITION_VARIABLE_INIT :: CONDITION_VARIABLE{} 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_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 // WINVER >= 0x400 -STARTF_USEHOTKEY: DWORD : 0x00000200 -STARTF_TITLEISLINKNAME: DWORD : 0x00000800 -STARTF_TITLEISAPPID: DWORD : 0x00001000 -STARTF_PREVENTPINNING: DWORD : 0x00002000 +STARTF_USEHOTKEY : DWORD : 0x00000200 +STARTF_TITLEISLINKNAME : DWORD : 0x00000800 +STARTF_TITLEISAPPID : DWORD : 0x00001000 +STARTF_PREVENTPINNING : DWORD : 0x00002000 // WINVER >= 0x600 -STARTF_UNTRUSTEDSOURCE: DWORD : 0x00008000 +STARTF_UNTRUSTEDSOURCE : DWORD : 0x00008000 VOLUME_NAME_DOS: DWORD : 0x0 -MOVEFILE_COPY_ALLOWED: DWORD: 0x2 -MOVEFILE_CREATE_HARDLINK: DWORD: 0x10 -MOVEFILE_DELAY_UNTIL_REBOOT: DWORD: 0x4 -MOVEFILE_FAIL_IF_NOT_TRACKABLE: DWORD: 0x20 -MOVEFILE_REPLACE_EXISTING: DWORD : 0x1 -MOVEFILE_WRITE_THROUGH: DWORD: 0x8 +MOVEFILE_COPY_ALLOWED : DWORD : 0x2 +MOVEFILE_CREATE_HARDLINK : DWORD : 0x10 +MOVEFILE_DELAY_UNTIL_REBOOT : DWORD : 0x4 +MOVEFILE_FAIL_IF_NOT_TRACKABLE : DWORD : 0x20 +MOVEFILE_REPLACE_EXISTING : DWORD : 0x1 +MOVEFILE_WRITE_THROUGH : DWORD : 0x8 -FILE_BEGIN: DWORD : 0 -FILE_CURRENT: DWORD : 1 -FILE_END: DWORD : 2 +FILE_BEGIN : DWORD : 0 +FILE_CURRENT : DWORD : 1 +FILE_END : DWORD : 2 -WAIT_OBJECT_0: DWORD : 0x00000000 -WAIT_TIMEOUT: DWORD : 258 -WAIT_FAILED: DWORD : 0xFFFFFFFF +WAIT_OBJECT_0 : DWORD : 0x00000000 +WAIT_TIMEOUT : DWORD : 258 +WAIT_FAILED : DWORD : 0xFFFFFFFF -FILE_FLAG_WRITE_THROUGH: DWORD : 0x80000000 -FILE_FLAG_OVERLAPPED: DWORD : 0x40000000 -FILE_FLAG_NO_BUFFERING: DWORD : 0x20000000 -FILE_FLAG_RANDOM_ACCESS: DWORD : 0x10000000 -FILE_FLAG_SEQUENTIAL_SCAN: DWORD : 0x08000000 -FILE_FLAG_DELETE_ON_CLOSE: DWORD : 0x04000000 -FILE_FLAG_BACKUP_SEMANTICS: DWORD : 0x02000000 -FILE_FLAG_POSIX_SEMANTICS: DWORD : 0x01000000 -FILE_FLAG_SESSION_AWARE: DWORD : 0x00800000 -FILE_FLAG_OPEN_REPARSE_POINT: DWORD : 0x00200000 -FILE_FLAG_OPEN_NO_RECALL: DWORD : 0x00100000 -FILE_FLAG_FIRST_PIPE_INSTANCE: DWORD : 0x00080000 +FILE_FLAG_WRITE_THROUGH : DWORD : 0x80000000 +FILE_FLAG_OVERLAPPED : DWORD : 0x40000000 +FILE_FLAG_NO_BUFFERING : DWORD : 0x20000000 +FILE_FLAG_RANDOM_ACCESS : DWORD : 0x10000000 +FILE_FLAG_SEQUENTIAL_SCAN : DWORD : 0x08000000 +FILE_FLAG_DELETE_ON_CLOSE : DWORD : 0x04000000 +FILE_FLAG_BACKUP_SEMANTICS : DWORD : 0x02000000 +FILE_FLAG_POSIX_SEMANTICS : DWORD : 0x01000000 +FILE_FLAG_SESSION_AWARE : DWORD : 0x00800000 +FILE_FLAG_OPEN_REPARSE_POINT : DWORD : 0x00200000 +FILE_FLAG_OPEN_NO_RECALL : DWORD : 0x00100000 +FILE_FLAG_FIRST_PIPE_INSTANCE : DWORD : 0x00080000 -PIPE_ACCESS_INBOUND: DWORD : 0x00000001 -PIPE_ACCESS_OUTBOUND: DWORD : 0x00000002 -PIPE_ACCESS_DUPLEX: DWORD : 0x00000003 -PIPE_WAIT: DWORD : 0x00000000 -PIPE_TYPE_BYTE: DWORD : 0x00000000 -PIPE_TYPE_MESSAGE: DWORD : 0x00000004 -PIPE_REJECT_REMOTE_CLIENTS: DWORD : 0x00000008 -PIPE_READMODE_BYTE: DWORD : 0x00000000 -PIPE_READMODE_MESSAGE: DWORD : 0x00000002 -PIPE_ACCEPT_REMOTE_CLIENTS: DWORD : 0x00000000 +PIPE_ACCESS_INBOUND : DWORD : 0x00000001 +PIPE_ACCESS_OUTBOUND : DWORD : 0x00000002 +PIPE_ACCESS_DUPLEX : DWORD : 0x00000003 +PIPE_WAIT : DWORD : 0x00000000 +PIPE_TYPE_BYTE : DWORD : 0x00000000 +PIPE_TYPE_MESSAGE : DWORD : 0x00000004 +PIPE_REJECT_REMOTE_CLIENTS : DWORD : 0x00000008 +PIPE_READMODE_BYTE : DWORD : 0x00000000 +PIPE_READMODE_MESSAGE : DWORD : 0x00000002 +PIPE_ACCEPT_REMOTE_CLIENTS : DWORD : 0x00000000 FD_SETSIZE :: 64 @@ -2739,10 +2747,10 @@ HANDLE_FLAG_INHERIT: DWORD : 0x00000001 HANDLE_FLAG_PROTECT_FROM_CLOSE :: 0x00000002 GENERIC_MAPPING :: struct { - GenericRead: ACCESS_MASK, - GenericWrite: ACCESS_MASK, + GenericRead: ACCESS_MASK, + GenericWrite: ACCESS_MASK, GenericExecute: ACCESS_MASK, - GenericAll: ACCESS_MASK, + GenericAll: ACCESS_MASK, } PGENERIC_MAPPING :: ^GENERIC_MAPPING @@ -2758,14 +2766,14 @@ ANYSIZE_ARRAY :: 1 PLUID_AND_ATTRIBUTES :: ^LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES :: struct { - Luid: LUID, + Luid: LUID, Attributes: DWORD, } PRIVILEGE_SET :: struct { PrivilegeCount: DWORD, - Control: DWORD, - Privilege: [ANYSIZE_ARRAY]LUID_AND_ATTRIBUTES, + Control: DWORD, + Privilege: [ANYSIZE_ARRAY]LUID_AND_ATTRIBUTES `fmt:"v,PrivilegeCount"`, } PPRIVILEGE_SET :: ^PRIVILEGE_SET @@ -2780,7 +2788,8 @@ TOKEN_ADJUST_GROUPS :: 0x0040 TOKEN_ADJUST_DEFAULT :: 0x0080 TOKEN_ADJUST_SESSIONID :: 0x0100 -TOKEN_ALL_ACCESS_P :: STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY |\ +TOKEN_ALL_ACCESS_P :: \ + STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT TOKEN_ALL_ACCESS :: TOKEN_ALL_ACCESS_P | TOKEN_ADJUST_SESSIONID @@ -2803,8 +2812,8 @@ CP_UTF8 :: 65001 // UTF-8 translation LCID :: DWORD LANGID :: WORD -LANG_NEUTRAL :: 0x00 -LANG_INVARIANT :: 0x7f +LANG_NEUTRAL :: 0x00 +LANG_INVARIANT :: 0x7f SUBLANG_NEUTRAL :: 0x00 // language neutral SUBLANG_DEFAULT :: 0x01 // user default @@ -2815,7 +2824,7 @@ WC_ERR_INVALID_CHARS :: 128 MAX_PATH :: 0x00000104 MAX_PATH_WIDE :: 0x8000 -INVALID_FILE_ATTRIBUTES :: DWORD(0xffff_ffff) +INVALID_FILE_ATTRIBUTES :: DWORD(0xffff_ffff) FILE_TYPE_DISK :: 0x0001 FILE_TYPE_CHAR :: 0x0002 @@ -2826,33 +2835,33 @@ POINT :: struct {x, y: LONG} PWINDOWPOS :: ^WINDOWPOS WINDOWPOS :: struct { - hwnd: HWND, + hwnd: HWND, hwndInsertAfter: HWND, - x: c_int, - y: c_int, - cx: c_int, - cy: c_int, + x: c_int, + y: c_int, + cx: c_int, + cy: c_int, flags: UINT, } when size_of(uintptr) == 4 { WSADATA :: struct { - wVersion: WORD, - wHighVersion: WORD, - szDescription: [WSADESCRIPTION_LEN + 1]u8, + wVersion: WORD, + wHighVersion: WORD, + szDescription: [WSADESCRIPTION_LEN + 1]u8, szSystemStatus: [WSASYS_STATUS_LEN + 1]u8, - iMaxSockets: u16, - iMaxUdpDg: u16, - lpVendorInfo: ^u8, + iMaxSockets: u16, + iMaxUdpDg: u16, + lpVendorInfo: [^]u8, } } else when size_of(uintptr) == 8 { WSADATA :: struct { - wVersion: WORD, - wHighVersion: WORD, - iMaxSockets: u16, - iMaxUdpDg: u16, - lpVendorInfo: ^u8, - szDescription: [WSADESCRIPTION_LEN + 1]u8, + wVersion: WORD, + wHighVersion: WORD, + iMaxSockets: u16, + iMaxUdpDg: u16, + lpVendorInfo: ^u8, + szDescription: [WSADESCRIPTION_LEN + 1]u8, szSystemStatus: [WSASYS_STATUS_LEN + 1]u8, } } else { @@ -2861,71 +2870,71 @@ when size_of(uintptr) == 4 { WSABUF :: struct { len: ULONG, - buf: ^CHAR, + buf: [^]CHAR `fmt"q,len"`, } WSAPROTOCOL_INFO :: struct { - dwServiceFlags1: DWORD, - dwServiceFlags2: DWORD, - dwServiceFlags3: DWORD, - dwServiceFlags4: DWORD, - dwProviderFlags: DWORD, - ProviderId: GUID, - dwCatalogEntryId: DWORD, - ProtocolChain: WSAPROTOCOLCHAIN, - iVersion: c_int, - iAddressFamily: c_int, - iMaxSockAddr: c_int, - iMinSockAddr: c_int, - iSocketType: c_int, - iProtocol: c_int, + dwServiceFlags1: DWORD, + dwServiceFlags2: DWORD, + dwServiceFlags3: DWORD, + dwServiceFlags4: DWORD, + dwProviderFlags: DWORD, + ProviderId: GUID, + dwCatalogEntryId: DWORD, + ProtocolChain: WSAPROTOCOLCHAIN, + iVersion: c_int, + iAddressFamily: c_int, + iMaxSockAddr: c_int, + iMinSockAddr: c_int, + iSocketType: c_int, + iProtocol: c_int, iProtocolMaxOffset: c_int, - iNetworkByteOrder: c_int, - iSecurityScheme: c_int, - dwMessageSize: DWORD, + iNetworkByteOrder: c_int, + iSecurityScheme: c_int, + dwMessageSize: DWORD, dwProviderReserved: DWORD, - szProtocol: [WSAPROTOCOL_LEN + 1]u16, + szProtocol: [WSAPROTOCOL_LEN + 1]u16, } WIN32_FILE_ATTRIBUTE_DATA :: struct { dwFileAttributes: DWORD, - ftCreationTime: FILETIME, + ftCreationTime: FILETIME, ftLastAccessTime: FILETIME, - ftLastWriteTime: FILETIME, - nFileSizeHigh: DWORD, - nFileSizeLow: DWORD, + ftLastWriteTime: FILETIME, + nFileSizeHigh: DWORD, + nFileSizeLow: DWORD, } FILE_INFO_BY_HANDLE_CLASS :: enum c_int { - FileBasicInfo = 0, - FileStandardInfo = 1, - FileNameInfo = 2, - FileRenameInfo = 3, - FileDispositionInfo = 4, - FileAllocationInfo = 5, - FileEndOfFileInfo = 6, - FileStreamInfo = 7, - FileCompressionInfo = 8, - FileAttributeTagInfo = 9, - FileIdBothDirectoryInfo = 10, // 0xA + FileBasicInfo = 0, + FileStandardInfo = 1, + FileNameInfo = 2, + FileRenameInfo = 3, + FileDispositionInfo = 4, + FileAllocationInfo = 5, + FileEndOfFileInfo = 6, + FileStreamInfo = 7, + FileCompressionInfo = 8, + FileAttributeTagInfo = 9, + FileIdBothDirectoryInfo = 10, // 0xA FileIdBothDirectoryRestartInfo = 11, // 0xB - FileIoPriorityHintInfo = 12, // 0xC - FileRemoteProtocolInfo = 13, // 0xD - FileFullDirectoryInfo = 14, // 0xE - FileFullDirectoryRestartInfo = 15, // 0xF - FileStorageInfo = 16, // 0x10 - FileAlignmentInfo = 17, // 0x11 - FileIdInfo = 18, // 0x12 - FileIdExtdDirectoryInfo = 19, // 0x13 + FileIoPriorityHintInfo = 12, // 0xC + FileRemoteProtocolInfo = 13, // 0xD + FileFullDirectoryInfo = 14, // 0xE + FileFullDirectoryRestartInfo = 15, // 0xF + FileStorageInfo = 16, // 0x10 + FileAlignmentInfo = 17, // 0x11 + FileIdInfo = 18, // 0x12 + FileIdExtdDirectoryInfo = 19, // 0x13 FileIdExtdDirectoryRestartInfo = 20, // 0x14 MaximumFileInfoByHandlesClass, } FILE_BASIC_INFO :: struct { - CreationTime: LARGE_INTEGER, + CreationTime: LARGE_INTEGER, LastAccessTime: LARGE_INTEGER, - LastWriteTime: LARGE_INTEGER, - ChangeTime: LARGE_INTEGER, + LastWriteTime: LARGE_INTEGER, + ChangeTime: LARGE_INTEGER, FileAttributes: DWORD, } @@ -2941,39 +2950,39 @@ FILE_NOTIFY_INFORMATION :: struct { } REPARSE_DATA_BUFFER :: struct { - ReparseTag: c_uint, + ReparseTag: c_uint, ReparseDataLength: c_ushort, - Reserved: c_ushort, - rest: [0]byte, + Reserved: c_ushort, + rest: [0]byte, } SYMBOLIC_LINK_REPARSE_BUFFER :: struct { SubstituteNameOffset: c_ushort, SubstituteNameLength: c_ushort, - PrintNameOffset: c_ushort, - PrintNameLength: c_ushort, - Flags: c_ulong, - PathBuffer: WCHAR, + PrintNameOffset: c_ushort, + PrintNameLength: c_ushort, + Flags: c_ulong, + PathBuffer: WCHAR, } MOUNT_POINT_REPARSE_BUFFER :: struct { SubstituteNameOffset: c_ushort, SubstituteNameLength: c_ushort, - PrintNameOffset: c_ushort, - PrintNameLength: c_ushort, - PathBuffer: WCHAR, + PrintNameOffset: c_ushort, + PrintNameLength: c_ushort, + PathBuffer: WCHAR, } LPPROGRESS_ROUTINE :: #type proc "system" ( - TotalFileSize: LARGE_INTEGER, - TotalBytesTransferred: LARGE_INTEGER, - StreamSize: LARGE_INTEGER, + TotalFileSize: LARGE_INTEGER, + TotalBytesTransferred: LARGE_INTEGER, + StreamSize: LARGE_INTEGER, StreamBytesTransferred: LARGE_INTEGER, - dwStreamNumber: DWORD, - dwCallbackReason: DWORD, - hSourceFile: HANDLE, - hDestinationFile: HANDLE, - lpData: LPVOID, + dwStreamNumber: DWORD, + dwCallbackReason: DWORD, + hSourceFile: HANDLE, + hDestinationFile: HANDLE, + lpData: LPVOID, ) -> DWORD CONDITION_VARIABLE :: struct { @@ -2984,21 +2993,21 @@ SRWLOCK :: struct { } CRITICAL_SECTION :: struct { CriticalSectionDebug: LPVOID, - LockCount: LONG, - RecursionCount: LONG, - OwningThread: HANDLE, - LockSemaphore: HANDLE, - SpinCount: ULONG_PTR, + LockCount: LONG, + RecursionCount: LONG, + OwningThread: HANDLE, + LockSemaphore: HANDLE, + SpinCount: ULONG_PTR, } REPARSE_MOUNTPOINT_DATA_BUFFER :: struct { - ReparseTag: DWORD, - ReparseDataLength: DWORD, - Reserved: WORD, - ReparseTargetLength: WORD, + ReparseTag: DWORD, + ReparseDataLength: DWORD, + Reserved: WORD, + ReparseTargetLength: WORD, ReparseTargetMaximumLength: WORD, - Reserved1: WORD, - ReparseTarget: WCHAR, + Reserved1: WORD, + ReparseTarget: WCHAR, } GUID :: struct { @@ -3021,12 +3030,12 @@ LPGUID :: ^GUID LPCGUID :: ^GUID REFIID :: ^GUID -REFGUID :: GUID -IID :: GUID -LPIID :: ^IID -CLSID :: GUID +REFGUID :: GUID +IID :: GUID +LPIID :: ^IID +CLSID :: GUID REFCLSID :: ^CLSID -LPCLSID :: ^CLSID +LPCLSID :: ^CLSID CLSCTX_INPROC_SERVER :: 0x1 CLSCTX_INPROC_HANDLER :: 0x2 @@ -3059,46 +3068,46 @@ CLSCTX_PS_DLL :: 0x80000000 CLSCTX_ALL :: CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER WSAPROTOCOLCHAIN :: struct { - ChainLen: c_int, - ChainEntries: [MAX_PROTOCOL_CHAIN]DWORD, + ChainLen: c_int, + ChainEntries: [MAX_PROTOCOL_CHAIN]DWORD `fmt:"v,ChainLen"`, } SECURITY_ATTRIBUTES :: struct { - nLength: DWORD, + nLength: DWORD, lpSecurityDescriptor: LPVOID, - bInheritHandle: BOOL, + bInheritHandle: BOOL, } PROCESS_INFORMATION :: struct { - hProcess: HANDLE, - hThread: HANDLE, + hProcess: HANDLE, + hThread: HANDLE, dwProcessId: DWORD, - dwThreadId: DWORD, + dwThreadId: DWORD, } STARTUPINFOW :: struct { - cb: DWORD, - lpReserved: LPWSTR, - lpDesktop: LPWSTR, - lpTitle: LPWSTR, - dwX: DWORD, - dwY: DWORD, - dwXSize: DWORD, - dwYSize: DWORD, - dwXCountChars: DWORD, - dwYCountChars: DWORD, + cb: DWORD, + lpReserved: LPWSTR, + lpDesktop: LPWSTR, + lpTitle: LPWSTR, + dwX: DWORD, + dwY: DWORD, + dwXSize: DWORD, + dwYSize: DWORD, + dwXCountChars: DWORD, + dwYCountChars: DWORD, dwFillAttribute: DWORD, - dwFlags: DWORD, - wShowWindow: WORD, - cbReserved2: WORD, - lpReserved2: LPBYTE, - hStdInput: HANDLE, - hStdOutput: HANDLE, - hStdError: HANDLE, + dwFlags: DWORD, + wShowWindow: WORD, + cbReserved2: WORD, + lpReserved2: LPBYTE, + hStdInput: HANDLE, + hStdOutput: HANDLE, + hStdError: HANDLE, } FILETIME :: struct { - dwLowDateTime: DWORD, + dwLowDateTime: DWORD, dwHighDateTime: DWORD, } @@ -3124,11 +3133,11 @@ UNICODE_STRING :: struct { } OVERLAPPED :: struct { - Internal: ^c_ulong, + Internal: ^c_ulong, InternalHigh: ^c_ulong, - Offset: DWORD, - OffsetHigh: DWORD, - hEvent: HANDLE, + Offset: DWORD, + OffsetHigh: DWORD, + hEvent: HANDLE, } OVERLAPPED_ENTRY :: struct { @@ -3139,9 +3148,9 @@ OVERLAPPED_ENTRY :: struct { } LPOVERLAPPED_COMPLETION_ROUTINE :: #type proc "system" ( - dwErrorCode: DWORD, + dwErrorCode: DWORD, dwNumberOfBytesTransfered: DWORD, - lpOverlapped: LPOVERLAPPED, + lpOverlapped: LPOVERLAPPED, ) ADDRESS_MODE :: enum c_int { @@ -3164,7 +3173,7 @@ fd_set :: struct { } timeval :: struct { - tv_sec: c_long, + tv_sec: c_long, tv_usec: c_long, } @@ -3199,145 +3208,145 @@ STATUS_PRIVILEGED_INSTRUCTION :: 0xC0000096 EXCEPTION_RECORD :: struct { - ExceptionCode: DWORD, - ExceptionFlags: DWORD, - ExceptionRecord: ^EXCEPTION_RECORD, - ExceptionAddress: LPVOID, - NumberParameters: DWORD, - ExceptionInformation: [EXCEPTION_MAXIMUM_PARAMETERS]LPVOID, + ExceptionCode: DWORD, + ExceptionFlags: DWORD, + ExceptionRecord: ^EXCEPTION_RECORD, + ExceptionAddress: LPVOID, + NumberParameters: DWORD, + ExceptionInformation: [EXCEPTION_MAXIMUM_PARAMETERS]LPVOID `fmt:"v,NumberParameters"`, } CONTEXT :: struct { - P1Home: DWORD64, - P2Home: DWORD64, - P3Home: DWORD64, - P4Home: DWORD64, - P5Home: DWORD64, - P6Home: DWORD64, + P1Home: DWORD64, + P2Home: DWORD64, + P3Home: DWORD64, + P4Home: DWORD64, + P5Home: DWORD64, + P6Home: DWORD64, ContextFlags: DWORD, - MxCsr: DWORD, - SegCs: WORD, - SegDs: WORD, - SegEs: WORD, - SegFs: WORD, - SegGs: WORD, - SegSs: WORD, - EFlags: DWORD, - Dr0: DWORD64, - Dr1: DWORD64, - Dr2: DWORD64, - Dr3: DWORD64, - Dr6: DWORD64, - Dr7: DWORD64, - Rax: DWORD64, - Rcx: DWORD64, - Rdx: DWORD64, - Rbx: DWORD64, - Rsp: DWORD64, - Rbp: DWORD64, - Rsi: DWORD64, - Rdi: DWORD64, - R8: DWORD64, - R9: DWORD64, - R10: DWORD64, - R11: DWORD64, - R12: DWORD64, - R13: DWORD64, - R14: DWORD64, - R15: DWORD64, - Rip: DWORD64, - _: struct #raw_union { + MxCsr: DWORD, + SegCs: WORD, + SegDs: WORD, + SegEs: WORD, + SegFs: WORD, + SegGs: WORD, + SegSs: WORD, + EFlags: DWORD, + Dr0: DWORD64, + Dr1: DWORD64, + Dr2: DWORD64, + Dr3: DWORD64, + Dr6: DWORD64, + Dr7: DWORD64, + Rax: DWORD64, + Rcx: DWORD64, + Rdx: DWORD64, + Rbx: DWORD64, + Rsp: DWORD64, + Rbp: DWORD64, + Rsi: DWORD64, + Rdi: DWORD64, + R8: DWORD64, + R9: DWORD64, + R10: DWORD64, + R11: DWORD64, + R12: DWORD64, + R13: DWORD64, + R14: DWORD64, + R15: DWORD64, + Rip: DWORD64, + using _: struct #raw_union { FltSave: XMM_SAVE_AREA32, - Q: [16]NEON128, - D: [32]ULONGLONG, - _: struct { + Q: [16]NEON128, + D: [32]ULONGLONG, + using _: struct { Header: [2]M128A, Legacy: [8]M128A, - Xmm0: M128A, - Xmm1: M128A, - Xmm2: M128A, - Xmm3: M128A, - Xmm4: M128A, - Xmm5: M128A, - Xmm6: M128A, - Xmm7: M128A, - Xmm8: M128A, - Xmm9: M128A, - Xmm10: M128A, - Xmm11: M128A, - Xmm12: M128A, - Xmm13: M128A, - Xmm14: M128A, - Xmm15: M128A, + Xmm0: M128A, + Xmm1: M128A, + Xmm2: M128A, + Xmm3: M128A, + Xmm4: M128A, + Xmm5: M128A, + Xmm6: M128A, + Xmm7: M128A, + Xmm8: M128A, + Xmm9: M128A, + Xmm10: M128A, + Xmm11: M128A, + Xmm12: M128A, + Xmm13: M128A, + Xmm14: M128A, + Xmm15: M128A, }, S: [32]DWORD, }, - VectorRegister: [26]M128A, - VectorControl: DWORD64, - DebugControl: DWORD64, - LastBranchToRip: DWORD64, - LastBranchFromRip: DWORD64, - LastExceptionToRip: DWORD64, + VectorRegister: [26]M128A, + VectorControl: DWORD64, + DebugControl: DWORD64, + LastBranchToRip: DWORD64, + LastBranchFromRip: DWORD64, + LastExceptionToRip: DWORD64, LastExceptionFromRip: DWORD64, } -PCONTEXT :: ^CONTEXT +PCONTEXT :: ^CONTEXT LPCONTEXT :: ^CONTEXT when size_of(uintptr) == 32 { XSAVE_FORMAT :: struct #align(16) { - ControlWord: WORD, - StatusWord: WORD, - TagWord: BYTE, - Reserved1: BYTE, - ErrorOpcode: WORD, - ErrorOffset: DWORD, - ErrorSelector: WORD, - Reserved2: WORD, - DataOffset: DWORD, - DataSelector: WORD, - Reserved3: WORD, - MxCsr: DWORD, - MxCsr_Mask: DWORD, + ControlWord: WORD, + StatusWord: WORD, + TagWord: BYTE, + Reserved1: BYTE, + ErrorOpcode: WORD, + ErrorOffset: DWORD, + ErrorSelector: WORD, + Reserved2: WORD, + DataOffset: DWORD, + DataSelector: WORD, + Reserved3: WORD, + MxCsr: DWORD, + MxCsr_Mask: DWORD, FloatRegisters: [8]M128A, // 32-bit specific - XmmRegisters: [8]M128A, - Reserved4: [192]BYTE, - StackControl: [7]DWORD, - Cr0NpxState: DWORD, + XmmRegisters: [8]M128A, + Reserved4: [192]BYTE, + StackControl: [7]DWORD, + Cr0NpxState: DWORD, } } else { XSAVE_FORMAT :: struct #align(16) { - ControlWord: WORD, - StatusWord: WORD, - TagWord: BYTE, - Reserved1: BYTE, - ErrorOpcode: WORD, - ErrorOffset: DWORD, - ErrorSelector: WORD, - Reserved2: WORD, - DataOffset: DWORD, - DataSelector: WORD, - Reserved3: WORD, - MxCsr: DWORD, - MxCsr_Mask: DWORD, + ControlWord: WORD, + StatusWord: WORD, + TagWord: BYTE, + Reserved1: BYTE, + ErrorOpcode: WORD, + ErrorOffset: DWORD, + ErrorSelector: WORD, + Reserved2: WORD, + DataOffset: DWORD, + DataSelector: WORD, + Reserved3: WORD, + MxCsr: DWORD, + MxCsr_Mask: DWORD, FloatRegisters: [8]M128A, // 64-bit specific - XmmRegisters: [16]M128A, - Reserved4: [96]BYTE, + XmmRegisters: [16]M128A, + Reserved4: [96]BYTE, } } XMM_SAVE_AREA32 :: XSAVE_FORMAT M128A :: struct { - Low: ULONGLONG, + Low: ULONGLONG, High: LONGLONG, } NEON128 :: struct { - Low: ULONGLONG, + Low: ULONGLONG, High: LONGLONG, } @@ -3386,17 +3395,17 @@ FILE_ATTRIBUTE_TAG_INFO :: struct { } // getaddrinfo flags https://learn.microsoft.com/en-us/windows/win32/api/ws2def/ns-ws2def-addrinfoa -AI_PASSIVE :: 0x01 -AI_CANONNAME :: 0x02 -AI_NUMERICHOST :: 0x04 -AI_ALL :: 0x0100 -AI_ADDRCONFIG :: 0x0400 -AI_V4MAPPED :: 0x0800 -AI_NON_AUTHORITATIVE :: 0x04000 -AI_SECURE :: 0x08000 +AI_PASSIVE :: 0x01 +AI_CANONNAME :: 0x02 +AI_NUMERICHOST :: 0x04 +AI_ALL :: 0x0100 +AI_ADDRCONFIG :: 0x0400 +AI_V4MAPPED :: 0x0800 +AI_NON_AUTHORITATIVE :: 0x04000 +AI_SECURE :: 0x08000 AI_RETURN_PREFERRED_NAMES :: 0x010000 -AI_FQDN :: 0x00020000 -AI_FILESERVER :: 0x00040000 +AI_FQDN :: 0x00020000 +AI_FILESERVER :: 0x00040000 PADDRINFOEXW :: ^ADDRINFOEXW LPADDRINFOEXW :: ^ADDRINFOEXW @@ -3415,9 +3424,9 @@ ADDRINFOEXW :: struct { } LPLOOKUPSERVICE_COMPLETION_ROUTINE :: #type proc "system" ( - dwErrorCode: DWORD, + dwErrorCode: DWORD, dwNumberOfBytesTransfered: DWORD, - lpOverlapped: LPOVERLAPPED, + lpOverlapped: LPOVERLAPPED, ) @@ -3427,18 +3436,18 @@ SYSTEM_INFO :: struct { dwOemID: DWORD, using _: struct #raw_union { wProcessorArchitecture: WORD, - wReserved: WORD, // reserved + wReserved: WORD, // reserved }, }, - dwPageSize: DWORD, + dwPageSize: DWORD, lpMinimumApplicationAddress: LPVOID, lpMaximumApplicationAddress: LPVOID, - dwActiveProcessorMask: DWORD_PTR, - dwNumberOfProcessors: DWORD, - dwProcessorType: DWORD, - dwAllocationGranularity: DWORD, - wProcessorLevel: WORD, - wProcessorRevision: WORD, + dwActiveProcessorMask: DWORD_PTR, + dwNumberOfProcessors: DWORD, + dwProcessorType: DWORD, + dwAllocationGranularity: DWORD, + wProcessorLevel: WORD, + wProcessorRevision: WORD, } // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw @@ -3475,12 +3484,12 @@ LoadLibraryEx_Flags :: distinct bit_set[LoadLibraryEx_Flag] // https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-quota_limits // Used in LogonUserExW PQUOTA_LIMITS :: struct { - PagedPoolLimit: SIZE_T, - NonPagedPoolLimit: SIZE_T, + PagedPoolLimit: SIZE_T, + NonPagedPoolLimit: SIZE_T, MinimumWorkingSetSize: SIZE_T, MaximumWorkingSetSize: SIZE_T, - PagefileLimit: SIZE_T, - TimeLimit: LARGE_INTEGER, + PagefileLimit: SIZE_T, + TimeLimit: LARGE_INTEGER, } Logon32_Type :: enum DWORD { @@ -3505,14 +3514,14 @@ Logon32_Provider :: enum DWORD { // Used in LoadUserProfileW PROFILEINFOW :: struct { - dwSize: DWORD, - dwFlags: DWORD, - lpUserName: LPWSTR, + dwSize: DWORD, + dwFlags: DWORD, + lpUserName: LPWSTR, lpProfilePath: LPWSTR, lpDefaultPath: LPWSTR, - lpServerName: LPWSTR, - lpPolicyPath: LPWSTR, - hProfile: HANDLE, + lpServerName: LPWSTR, + lpPolicyPath: LPWSTR, + hProfile: HANDLE, } SECURITY_MAX_SID_SIZE :: 68 @@ -3569,14 +3578,14 @@ USER_INFO_FLAG :: enum DWORD { USER_INFO_FLAGS :: distinct bit_set[USER_INFO_FLAG] USER_INFO_1 :: struct #packed { - name: LPWSTR, - password: LPWSTR, // Max password length is defined in LM20_PWLEN. + name: LPWSTR, + password: LPWSTR, // Max password length is defined in LM20_PWLEN. password_age: DWORD, - priv: USER_PRIV, - home_dir: LPWSTR, - comment: LPWSTR, - flags: USER_INFO_FLAGS, - script_path: LPWSTR, + priv: USER_PRIV, + home_dir: LPWSTR, + comment: LPWSTR, + flags: USER_INFO_FLAGS, + script_path: LPWSTR, } // #assert(size_of(USER_INFO_1) == 50) @@ -3585,320 +3594,320 @@ LOCALGROUP_MEMBERS_INFO_0 :: struct #packed { } NET_API_STATUS :: enum DWORD { - Success = 0, - ERROR_ACCESS_DENIED = 5, - MemberInAlias = 1378, - NetNotStarted = 2102, - UnknownServer = 2103, - ShareMem = 2104, - NoNetworkResource = 2105, - RemoteOnly = 2106, - DevNotRedirected = 2107, - ServerNotStarted = 2114, - ItemNotFound = 2115, - UnknownDevDir = 2116, - RedirectedPath = 2117, - DuplicateShare = 2118, - NoRoom = 2119, - TooManyItems = 2121, - InvalidMaxUsers = 2122, - BufTooSmall = 2123, - RemoteErr = 2127, - LanmanIniError = 2131, - NetworkError = 2136, - WkstaInconsistentState = 2137, - WkstaNotStarted = 2138, - BrowserNotStarted = 2139, - InternalError = 2140, - BadTransactConfig = 2141, - InvalidAPI = 2142, - BadEventName = 2143, - DupNameReboot = 2144, - CfgCompNotFound = 2146, - CfgParamNotFound = 2147, - LineTooLong = 2149, - QNotFound = 2150, - JobNotFound = 2151, - DestNotFound = 2152, - DestExists = 2153, - QExists = 2154, - QNoRoom = 2155, - JobNoRoom = 2156, - DestNoRoom = 2157, - DestIdle = 2158, - DestInvalidOp = 2159, - ProcNoRespond = 2160, - SpoolerNotLoaded = 2161, - DestInvalidState = 2162, - QInvalidState = 2163, - JobInvalidState = 2164, - SpoolNoMemory = 2165, - DriverNotFound = 2166, - DataTypeInvalid = 2167, - ProcNotFound = 2168, - ServiceTableLocked = 2180, - ServiceTableFull = 2181, - ServiceInstalled = 2182, - ServiceEntryLocked = 2183, - ServiceNotInstalled = 2184, - BadServiceName = 2185, - ServiceCtlTimeout = 2186, - ServiceCtlBusy = 2187, - BadServiceProgName = 2188, - ServiceNotCtrl = 2189, - ServiceKillProc = 2190, - ServiceCtlNotValid = 2191, - NotInDispatchTbl = 2192, - BadControlRecv = 2193, - ServiceNotStarting = 2194, - AlreadyLoggedOn = 2200, - NotLoggedOn = 2201, - BadUsername = 2202, - BadPassword = 2203, - UnableToAddName_W = 2204, - UnableToAddName_F = 2205, - UnableToDelName_W = 2206, - UnableToDelName_F = 2207, - LogonsPaused = 2209, - LogonServerConflict = 2210, - LogonNoUserPath = 2211, - LogonScriptError = 2212, - StandaloneLogon = 2214, - LogonServerNotFound = 2215, - LogonDomainExists = 2216, - NonValidatedLogon = 2217, - ACFNotFound = 2219, - GroupNotFound = 2220, - UserNotFound = 2221, - ResourceNotFound = 2222, - GroupExists = 2223, - UserExists = 2224, - ResourceExists = 2225, - NotPrimary = 2226, - ACFNotLoaded = 2227, - ACFNoRoom = 2228, - ACFFileIOFail = 2229, - ACFTooManyLists = 2230, - UserLogon = 2231, - ACFNoParent = 2232, - CanNotGrowSegment = 2233, - SpeGroupOp = 2234, - NotInCache = 2235, - UserInGroup = 2236, - UserNotInGroup = 2237, - AccountUndefined = 2238, - AccountExpired = 2239, - InvalidWorkstation = 2240, - InvalidLogonHours = 2241, - PasswordExpired = 2242, - PasswordCantChange = 2243, - PasswordHistConflict = 2244, - PasswordTooShort = 2245, - PasswordTooRecent = 2246, - InvalidDatabase = 2247, - DatabaseUpToDate = 2248, - SyncRequired = 2249, - UseNotFound = 2250, - BadAsgType = 2251, - DeviceIsShared = 2252, - SameAsComputerName = 2253, - NoComputerName = 2270, - MsgAlreadyStarted = 2271, - MsgInitFailed = 2272, - NameNotFound = 2273, - AlreadyForwarded = 2274, - AddForwarded = 2275, - AlreadyExists = 2276, - TooManyNames = 2277, - DelComputerName = 2278, - LocalForward = 2279, - GrpMsgProcessor = 2280, - PausedRemote = 2281, - BadReceive = 2282, - NameInUse = 2283, - MsgNotStarted = 2284, - NotLocalName = 2285, - NoForwardName = 2286, - RemoteFull = 2287, - NameNotForwarded = 2288, - TruncatedBroadcast = 2289, - InvalidDevice = 2294, - WriteFault = 2295, - DuplicateName = 2297, - DeleteLater = 2298, - IncompleteDel = 2299, - MultipleNets = 2300, - NetNameNotFound = 2310, - DeviceNotShared = 2311, - ClientNameNotFound = 2312, - FileIdNotFound = 2314, - ExecFailure = 2315, - TmpFile = 2316, - TooMuchData = 2317, - DeviceShareConflict = 2318, - BrowserTableIncomplete = 2319, - NotLocalDomain = 2320, - IsDfsShare = 2321, - DevInvalidOpCode = 2331, - DevNotFound = 2332, - DevNotOpen = 2333, - BadQueueDevString = 2334, - BadQueuePriority = 2335, - NoCommDevs = 2337, - QueueNotFound = 2338, - BadDevString = 2340, - BadDev = 2341, - InUseBySpooler = 2342, - CommDevInUse = 2343, - InvalidComputer = 2351, - MaxLenExceeded = 2354, - BadComponent = 2356, - CantType = 2357, - TooManyEntries = 2362, - ProfileFileTooBig = 2370, - ProfileOffset = 2371, - ProfileCleanup = 2372, - ProfileUnknownCmd = 2373, - ProfileLoadErr = 2374, - ProfileSaveErr = 2375, - LogOverflow = 2377, - LogFileChanged = 2378, - LogFileCorrupt = 2379, - SourceIsDir = 2380, - BadSource = 2381, - BadDest = 2382, - DifferentServers = 2383, - RunSrvPaused = 2385, - ErrCommRunSrv = 2389, - ErrorExecingGhost = 2391, - ShareNotFound = 2392, - InvalidLana = 2400, - OpenFiles = 2401, - ActiveConns = 2402, - BadPasswordCore = 2403, - DevInUse = 2404, - LocalDrive = 2405, - AlertExists = 2430, - TooManyAlerts = 2431, - NoSuchAlert = 2432, - BadRecipient = 2433, - AcctLimitExceeded = 2434, - InvalidLogSeek = 2440, - BadUasConfig = 2450, - InvalidUASOp = 2451, - LastAdmin = 2452, - DCNotFound = 2453, - LogonTrackingError = 2454, - NetlogonNotStarted = 2455, - CanNotGrowUASFile = 2456, - TimeDiffAtDC = 2457, - PasswordMismatch = 2458, - NoSuchServer = 2460, - NoSuchSession = 2461, - NoSuchConnection = 2462, - TooManyServers = 2463, - TooManySessions = 2464, - TooManyConnections = 2465, - TooManyFiles = 2466, - NoAlternateServers = 2467, - TryDownLevel = 2470, - UPSDriverNotStarted = 2480, - UPSInvalidConfig = 2481, - UPSInvalidCommPort = 2482, - UPSSignalAsserted = 2483, - UPSShutdownFailed = 2484, - BadDosRetCode = 2500, - ProgNeedsExtraMem = 2501, - BadDosFunction = 2502, - RemoteBootFailed = 2503, - BadFileCheckSum = 2504, - NoRplBootSystem = 2505, - RplLoadrNetBiosErr = 2506, - RplLoadrDiskErr = 2507, - ImageParamErr = 2508, - TooManyImageParams = 2509, - NonDosFloppyUsed = 2510, - RplBootRestart = 2511, - RplSrvrCallFailed = 2512, - CantConnectRplSrvr = 2513, - CantOpenImageFile = 2514, - CallingRplSrvr = 2515, - StartingRplBoot = 2516, - RplBootServiceTerm = 2517, - RplBootStartFailed = 2518, - RPL_CONNECTED = 2519, - BrowserConfiguredToNotRun = 2550, - RplNoAdaptersStarted = 2610, - RplBadRegistry = 2611, - RplBadDatabase = 2612, - RplRplfilesShare = 2613, - RplNotRplServer = 2614, - RplCannotEnum = 2615, - RplWkstaInfoCorrupted = 2616, - RplWkstaNotFound = 2617, - RplWkstaNameUnavailable = 2618, - RplProfileInfoCorrupted = 2619, - RplProfileNotFound = 2620, - RplProfileNameUnavailable = 2621, - RplProfileNotEmpty = 2622, - RplConfigInfoCorrupted = 2623, - RplConfigNotFound = 2624, - RplAdapterInfoCorrupted = 2625, - RplInternal = 2626, - RplVendorInfoCorrupted = 2627, - RplBootInfoCorrupted = 2628, - RplWkstaNeedsUserAcct = 2629, - RplNeedsRPLUSERAcct = 2630, - RplBootNotFound = 2631, - RplIncompatibleProfile = 2632, - RplAdapterNameUnavailable = 2633, - RplConfigNotEmpty = 2634, - RplBootInUse = 2635, - RplBackupDatabase = 2636, - RplAdapterNotFound = 2637, - RplVendorNotFound = 2638, - RplVendorNameUnavailable = 2639, - RplBootNameUnavailable = 2640, - RplConfigNameUnavailable = 2641, - DfsInternalCorruption = 2660, - DfsVolumeDataCorrupt = 2661, - DfsNoSuchVolume = 2662, - DfsVolumeAlreadyExists = 2663, - DfsAlreadyShared = 2664, - DfsNoSuchShare = 2665, - DfsNotALeafVolume = 2666, - DfsLeafVolume = 2667, - DfsVolumeHasMultipleServers = 2668, - DfsCantCreateJunctionPoint = 2669, - DfsServerNotDfsAware = 2670, - DfsBadRenamePath = 2671, - DfsVolumeIsOffline = 2672, - DfsNoSuchServer = 2673, - DfsCyclicalName = 2674, - DfsNotSupportedInServerDfs = 2675, - DfsDuplicateService = 2676, + Success = 0, + ERROR_ACCESS_DENIED = 5, + MemberInAlias = 1378, + NetNotStarted = 2102, + UnknownServer = 2103, + ShareMem = 2104, + NoNetworkResource = 2105, + RemoteOnly = 2106, + DevNotRedirected = 2107, + ServerNotStarted = 2114, + ItemNotFound = 2115, + UnknownDevDir = 2116, + RedirectedPath = 2117, + DuplicateShare = 2118, + NoRoom = 2119, + TooManyItems = 2121, + InvalidMaxUsers = 2122, + BufTooSmall = 2123, + RemoteErr = 2127, + LanmanIniError = 2131, + NetworkError = 2136, + WkstaInconsistentState = 2137, + WkstaNotStarted = 2138, + BrowserNotStarted = 2139, + InternalError = 2140, + BadTransactConfig = 2141, + InvalidAPI = 2142, + BadEventName = 2143, + DupNameReboot = 2144, + CfgCompNotFound = 2146, + CfgParamNotFound = 2147, + LineTooLong = 2149, + QNotFound = 2150, + JobNotFound = 2151, + DestNotFound = 2152, + DestExists = 2153, + QExists = 2154, + QNoRoom = 2155, + JobNoRoom = 2156, + DestNoRoom = 2157, + DestIdle = 2158, + DestInvalidOp = 2159, + ProcNoRespond = 2160, + SpoolerNotLoaded = 2161, + DestInvalidState = 2162, + QInvalidState = 2163, + JobInvalidState = 2164, + SpoolNoMemory = 2165, + DriverNotFound = 2166, + DataTypeInvalid = 2167, + ProcNotFound = 2168, + ServiceTableLocked = 2180, + ServiceTableFull = 2181, + ServiceInstalled = 2182, + ServiceEntryLocked = 2183, + ServiceNotInstalled = 2184, + BadServiceName = 2185, + ServiceCtlTimeout = 2186, + ServiceCtlBusy = 2187, + BadServiceProgName = 2188, + ServiceNotCtrl = 2189, + ServiceKillProc = 2190, + ServiceCtlNotValid = 2191, + NotInDispatchTbl = 2192, + BadControlRecv = 2193, + ServiceNotStarting = 2194, + AlreadyLoggedOn = 2200, + NotLoggedOn = 2201, + BadUsername = 2202, + BadPassword = 2203, + UnableToAddName_W = 2204, + UnableToAddName_F = 2205, + UnableToDelName_W = 2206, + UnableToDelName_F = 2207, + LogonsPaused = 2209, + LogonServerConflict = 2210, + LogonNoUserPath = 2211, + LogonScriptError = 2212, + StandaloneLogon = 2214, + LogonServerNotFound = 2215, + LogonDomainExists = 2216, + NonValidatedLogon = 2217, + ACFNotFound = 2219, + GroupNotFound = 2220, + UserNotFound = 2221, + ResourceNotFound = 2222, + GroupExists = 2223, + UserExists = 2224, + ResourceExists = 2225, + NotPrimary = 2226, + ACFNotLoaded = 2227, + ACFNoRoom = 2228, + ACFFileIOFail = 2229, + ACFTooManyLists = 2230, + UserLogon = 2231, + ACFNoParent = 2232, + CanNotGrowSegment = 2233, + SpeGroupOp = 2234, + NotInCache = 2235, + UserInGroup = 2236, + UserNotInGroup = 2237, + AccountUndefined = 2238, + AccountExpired = 2239, + InvalidWorkstation = 2240, + InvalidLogonHours = 2241, + PasswordExpired = 2242, + PasswordCantChange = 2243, + PasswordHistConflict = 2244, + PasswordTooShort = 2245, + PasswordTooRecent = 2246, + InvalidDatabase = 2247, + DatabaseUpToDate = 2248, + SyncRequired = 2249, + UseNotFound = 2250, + BadAsgType = 2251, + DeviceIsShared = 2252, + SameAsComputerName = 2253, + NoComputerName = 2270, + MsgAlreadyStarted = 2271, + MsgInitFailed = 2272, + NameNotFound = 2273, + AlreadyForwarded = 2274, + AddForwarded = 2275, + AlreadyExists = 2276, + TooManyNames = 2277, + DelComputerName = 2278, + LocalForward = 2279, + GrpMsgProcessor = 2280, + PausedRemote = 2281, + BadReceive = 2282, + NameInUse = 2283, + MsgNotStarted = 2284, + NotLocalName = 2285, + NoForwardName = 2286, + RemoteFull = 2287, + NameNotForwarded = 2288, + TruncatedBroadcast = 2289, + InvalidDevice = 2294, + WriteFault = 2295, + DuplicateName = 2297, + DeleteLater = 2298, + IncompleteDel = 2299, + MultipleNets = 2300, + NetNameNotFound = 2310, + DeviceNotShared = 2311, + ClientNameNotFound = 2312, + FileIdNotFound = 2314, + ExecFailure = 2315, + TmpFile = 2316, + TooMuchData = 2317, + DeviceShareConflict = 2318, + BrowserTableIncomplete = 2319, + NotLocalDomain = 2320, + IsDfsShare = 2321, + DevInvalidOpCode = 2331, + DevNotFound = 2332, + DevNotOpen = 2333, + BadQueueDevString = 2334, + BadQueuePriority = 2335, + NoCommDevs = 2337, + QueueNotFound = 2338, + BadDevString = 2340, + BadDev = 2341, + InUseBySpooler = 2342, + CommDevInUse = 2343, + InvalidComputer = 2351, + MaxLenExceeded = 2354, + BadComponent = 2356, + CantType = 2357, + TooManyEntries = 2362, + ProfileFileTooBig = 2370, + ProfileOffset = 2371, + ProfileCleanup = 2372, + ProfileUnknownCmd = 2373, + ProfileLoadErr = 2374, + ProfileSaveErr = 2375, + LogOverflow = 2377, + LogFileChanged = 2378, + LogFileCorrupt = 2379, + SourceIsDir = 2380, + BadSource = 2381, + BadDest = 2382, + DifferentServers = 2383, + RunSrvPaused = 2385, + ErrCommRunSrv = 2389, + ErrorExecingGhost = 2391, + ShareNotFound = 2392, + InvalidLana = 2400, + OpenFiles = 2401, + ActiveConns = 2402, + BadPasswordCore = 2403, + DevInUse = 2404, + LocalDrive = 2405, + AlertExists = 2430, + TooManyAlerts = 2431, + NoSuchAlert = 2432, + BadRecipient = 2433, + AcctLimitExceeded = 2434, + InvalidLogSeek = 2440, + BadUasConfig = 2450, + InvalidUASOp = 2451, + LastAdmin = 2452, + DCNotFound = 2453, + LogonTrackingError = 2454, + NetlogonNotStarted = 2455, + CanNotGrowUASFile = 2456, + TimeDiffAtDC = 2457, + PasswordMismatch = 2458, + NoSuchServer = 2460, + NoSuchSession = 2461, + NoSuchConnection = 2462, + TooManyServers = 2463, + TooManySessions = 2464, + TooManyConnections = 2465, + TooManyFiles = 2466, + NoAlternateServers = 2467, + TryDownLevel = 2470, + UPSDriverNotStarted = 2480, + UPSInvalidConfig = 2481, + UPSInvalidCommPort = 2482, + UPSSignalAsserted = 2483, + UPSShutdownFailed = 2484, + BadDosRetCode = 2500, + ProgNeedsExtraMem = 2501, + BadDosFunction = 2502, + RemoteBootFailed = 2503, + BadFileCheckSum = 2504, + NoRplBootSystem = 2505, + RplLoadrNetBiosErr = 2506, + RplLoadrDiskErr = 2507, + ImageParamErr = 2508, + TooManyImageParams = 2509, + NonDosFloppyUsed = 2510, + RplBootRestart = 2511, + RplSrvrCallFailed = 2512, + CantConnectRplSrvr = 2513, + CantOpenImageFile = 2514, + CallingRplSrvr = 2515, + StartingRplBoot = 2516, + RplBootServiceTerm = 2517, + RplBootStartFailed = 2518, + RPL_CONNECTED = 2519, + BrowserConfiguredToNotRun = 2550, + RplNoAdaptersStarted = 2610, + RplBadRegistry = 2611, + RplBadDatabase = 2612, + RplRplfilesShare = 2613, + RplNotRplServer = 2614, + RplCannotEnum = 2615, + RplWkstaInfoCorrupted = 2616, + RplWkstaNotFound = 2617, + RplWkstaNameUnavailable = 2618, + RplProfileInfoCorrupted = 2619, + RplProfileNotFound = 2620, + RplProfileNameUnavailable = 2621, + RplProfileNotEmpty = 2622, + RplConfigInfoCorrupted = 2623, + RplConfigNotFound = 2624, + RplAdapterInfoCorrupted = 2625, + RplInternal = 2626, + RplVendorInfoCorrupted = 2627, + RplBootInfoCorrupted = 2628, + RplWkstaNeedsUserAcct = 2629, + RplNeedsRPLUSERAcct = 2630, + RplBootNotFound = 2631, + RplIncompatibleProfile = 2632, + RplAdapterNameUnavailable = 2633, + RplConfigNotEmpty = 2634, + RplBootInUse = 2635, + RplBackupDatabase = 2636, + RplAdapterNotFound = 2637, + RplVendorNotFound = 2638, + RplVendorNameUnavailable = 2639, + RplBootNameUnavailable = 2640, + RplConfigNameUnavailable = 2641, + DfsInternalCorruption = 2660, + DfsVolumeDataCorrupt = 2661, + DfsNoSuchVolume = 2662, + DfsVolumeAlreadyExists = 2663, + DfsAlreadyShared = 2664, + DfsNoSuchShare = 2665, + DfsNotALeafVolume = 2666, + DfsLeafVolume = 2667, + DfsVolumeHasMultipleServers = 2668, + DfsCantCreateJunctionPoint = 2669, + DfsServerNotDfsAware = 2670, + DfsBadRenamePath = 2671, + DfsVolumeIsOffline = 2672, + DfsNoSuchServer = 2673, + DfsCyclicalName = 2674, + DfsNotSupportedInServerDfs = 2675, + DfsDuplicateService = 2676, DfsCantRemoveLastServerShare = 2677, - DfsVolumeIsInterDfs = 2678, - DfsInconsistent = 2679, - DfsServerUpgraded = 2680, - DfsDataIsIdentical = 2681, - DfsCantRemoveDfsRoot = 2682, - DfsChildOrParentInDfs = 2683, - DfsInternalError = 2690, - SetupAlreadyJoined = 2691, - SetupNotJoined = 2692, - SetupDomainController = 2693, - DefaultJoinRequired = 2694, - InvalidWorkgroupName = 2695, + DfsVolumeIsInterDfs = 2678, + DfsInconsistent = 2679, + DfsServerUpgraded = 2680, + DfsDataIsIdentical = 2681, + DfsCantRemoveDfsRoot = 2682, + DfsChildOrParentInDfs = 2683, + DfsInternalError = 2690, + SetupAlreadyJoined = 2691, + SetupNotJoined = 2692, + SetupDomainController = 2693, + DefaultJoinRequired = 2694, + InvalidWorkgroupName = 2695, NameUsesIncompatibleCodePage = 2696, - ComputerAccountNotFound = 2697, - PersonalSku = 2698, - SetupCheckDNSConfig = 2699, - PasswordMustChange = 2701, - AccountLockedOut = 2702, - PasswordTooLong = 2703, - PasswordNotComplexEnough = 2704, - PasswordFilterError = 2705, + ComputerAccountNotFound = 2697, + PersonalSku = 2698, + SetupCheckDNSConfig = 2699, + PasswordMustChange = 2701, + AccountLockedOut = 2702, + PasswordTooLong = 2703, + PasswordNotComplexEnough = 2704, + PasswordFilterError = 2705, } @@ -4053,12 +4062,12 @@ IMAGE_DEBUG_DIRECTORY :: struct { IMAGE_DEBUG_TYPE_CODEVIEW :: 2 -SICHINTF :: DWORD -SHCONTF :: DWORD -SFGAOF :: ULONG +SICHINTF :: DWORD +SHCONTF :: DWORD +SFGAOF :: ULONG FILEOPENDIALOGOPTIONS :: DWORD -REFPROPERTYKEY :: ^PROPERTYKEY -REFPROPVARIANT :: ^PROPVARIANT +REFPROPERTYKEY :: ^PROPERTYKEY +REFPROPVARIANT :: ^PROPVARIANT SIGDN :: enum c_int { NORMALDISPLAY = 0, @@ -4083,57 +4092,57 @@ SIATTRIBFLAGS :: enum c_int { FDAP :: enum c_int { BOTTOM = 0, - TOP = 1, + TOP = 1, } FDE_SHAREVIOLATION_RESPONSE :: enum c_int { DEFAULT = 0, - ACCEPT = 1, - REFUSE = 2, + ACCEPT = 1, + REFUSE = 2, } GETPROPERTYSTOREFLAGS :: enum c_int { - DEFAULT = 0, - HANDLERPROPERTIESONLY = 0x1, - READWRITE = 0x2, - TEMPORARY = 0x4, - FASTPROPERTIESONLY = 0x8, - OPENSLOWITEM = 0x10, - DELAYCREATION = 0x20, - BESTEFFORT = 0x40, - NO_OPLOCK = 0x80, - PREFERQUERYPROPERTIES = 0x100, - EXTRINSICPROPERTIES = 0x200, - EXTRINSICPROPERTIESONLY = 0x400, - VOLATILEPROPERTIES = 0x800, - VOLATILEPROPERTIESONLY = 0x1000, - MASK_VALID = 0x1fff, + DEFAULT = 0, + HANDLERPROPERTIESONLY = 0x1, + READWRITE = 0x2, + TEMPORARY = 0x4, + FASTPROPERTIESONLY = 0x8, + OPENSLOWITEM = 0x10, + DELAYCREATION = 0x20, + BESTEFFORT = 0x40, + NO_OPLOCK = 0x80, + PREFERQUERYPROPERTIES = 0x100, + EXTRINSICPROPERTIES = 0x200, + EXTRINSICPROPERTIESONLY = 0x400, + VOLATILEPROPERTIES = 0x800, + VOLATILEPROPERTIESONLY = 0x1000, + MASK_VALID = 0x1fff, } PROPERTYKEY :: struct { fmtid: GUID, - pid: DWORD, + pid: DWORD, } BIND_OPTS :: struct { - cbStruct: DWORD, - grfFlags: DWORD, - grfMode: DWORD, + cbStruct: DWORD, + grfFlags: DWORD, + grfMode: DWORD, dwTickCountDeadline: DWORD, } STATSTG :: struct { - pwcsName: LPOLESTR, - type: DWORD, - cbSize: ULARGE_INTEGER, - mtime: FILETIME, - ctime: FILETIME, - atime: FILETIME, - grfMode: DWORD, + pwcsName: LPOLESTR, + type: DWORD, + cbSize: ULARGE_INTEGER, + mtime: FILETIME, + ctime: FILETIME, + atime: FILETIME, + grfMode: DWORD, grfLocksSupported: DWORD, - clsid: CLSID, - grfStateBits: DWORD, - reserved: DWORD, + clsid: CLSID, + grfStateBits: DWORD, + reserved: DWORD, } COMDLG_FILTERSPEC :: struct { @@ -4142,15 +4151,15 @@ COMDLG_FILTERSPEC :: struct { DECIMAL :: struct { wReserved: USHORT, - _: struct #raw_union { - _: struct { + using _: struct #raw_union { + using _: struct { scale, sign: BYTE, }, signscale: USHORT, }, Hi32: ULONG, - _: struct #raw_union { - _: struct { + using _: struct #raw_union { + using _: struct { Lo32, Mid32: ULONG, }, Lo64: ULONGLONG, @@ -4223,14 +4232,14 @@ LWSTDAPI :: HRESULT CLSID_FileOpenDialog := &GUID{0xDC1C5A9C, 0xE88A, 0x4DDE, {0xA5, 0xA1, 0x60, 0xF8, 0x2A, 0x20, 0xAE, 0xF7}} CLSID_FileSaveDialog := &GUID{0xC0B4E2F3, 0xBA21, 0x4773, {0x8D, 0xBA, 0x33, 0x5E, 0xC9, 0x46, 0xEB, 0x8B}} -CLSID_TaskbarList := &GUID{0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} +CLSID_TaskbarList := &GUID{0x56FDF344, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} -IID_IFileDialog := &GUID{0x42F85136, 0xDB7E, 0x439C, {0x85, 0xF1, 0xE4, 0x07, 0x5D, 0x13, 0x5F, 0xC8}} -IID_IFileSaveDialog := &GUID{0x84BCCD23, 0x5FDE, 0x4CDB, {0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB}} -IID_IFileOpenDialog := &GUID{0xD57C7288, 0xD4AD, 0x4768, {0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60}} -IID_ITaskbarList := &GUID{0x56FDF342, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} -IID_ITaskbarList2 := &GUID{0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17}} -IID_ITaskbarList3 := &GUID{0xea1afb91, 0x9e28, 0x4b86, {0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf}} +IID_IFileDialog := &GUID{0x42F85136, 0xDB7E, 0x439C, {0x85, 0xF1, 0xE4, 0x07, 0x5D, 0x13, 0x5F, 0xC8}} +IID_IFileSaveDialog := &GUID{0x84BCCD23, 0x5FDE, 0x4CDB, {0xAE, 0xA4, 0xAF, 0x64, 0xB8, 0x3D, 0x78, 0xAB}} +IID_IFileOpenDialog := &GUID{0xD57C7288, 0xD4AD, 0x4768, {0xBE, 0x02, 0x9D, 0x96, 0x95, 0x32, 0xD9, 0x60}} +IID_ITaskbarList := &GUID{0x56FDF342, 0xFD6D, 0x11d0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90}} +IID_ITaskbarList2 := &GUID{0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17}} +IID_ITaskbarList3 := &GUID{0xea1afb91, 0x9e28, 0x4b86, {0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf}} IModalWindow :: struct #raw_union { #subtype IUnknown: IUnknown, @@ -4726,24 +4735,24 @@ Windows_Product_Type :: enum DWORD { WEB_SERVER_CORE = 0x0000001D, // Web Server (core installation) } -ENABLE_ECHO_INPUT : DWORD : 0x0004 -ENABLE_INSERT_MODE : DWORD : 0x0020 -ENABLE_LINE_INPUT : DWORD : 0x0002 -ENABLE_MOUSE_INPUT : DWORD : 0x0010 -ENABLE_PROCESSED_INPUT : DWORD : 0x0001 -ENABLE_QUICK_EDIT_MODE : DWORD : 0x0040 -ENABLE_WINDOW_INPUT : DWORD : 0x0008 -ENABLE_VIRTUAL_TERMINAL_INPUT : DWORD : 0x0200 -ENABLE_PROCESSED_OUTPUT : DWORD : 0x0001 -ENABLE_WRAP_AT_EOL_OUTPUT : DWORD : 0x0002 +ENABLE_ECHO_INPUT : DWORD : 0x0004 +ENABLE_INSERT_MODE : DWORD : 0x0020 +ENABLE_LINE_INPUT : DWORD : 0x0002 +ENABLE_MOUSE_INPUT : DWORD : 0x0010 +ENABLE_PROCESSED_INPUT : DWORD : 0x0001 +ENABLE_QUICK_EDIT_MODE : DWORD : 0x0040 +ENABLE_WINDOW_INPUT : DWORD : 0x0008 +ENABLE_VIRTUAL_TERMINAL_INPUT : DWORD : 0x0200 +ENABLE_PROCESSED_OUTPUT : DWORD : 0x0001 +ENABLE_WRAP_AT_EOL_OUTPUT : DWORD : 0x0002 ENABLE_VIRTUAL_TERMINAL_PROCESSING : DWORD : 0x0004 -DISABLE_NEWLINE_AUTO_RETURN : DWORD : 0x0008 -ENABLE_LVB_GRID_WORLDWIDE : DWORD : 0x0010 +DISABLE_NEWLINE_AUTO_RETURN : DWORD : 0x0008 +ENABLE_LVB_GRID_WORLDWIDE : DWORD : 0x0010 -CTRL_C_EVENT : DWORD : 0 -CTRL_BREAK_EVENT : DWORD : 1 -CTRL_CLOSE_EVENT : DWORD : 2 -CTRL_LOGOFF_EVENT : DWORD : 5 +CTRL_C_EVENT : DWORD : 0 +CTRL_BREAK_EVENT : DWORD : 1 +CTRL_CLOSE_EVENT : DWORD : 2 +CTRL_LOGOFF_EVENT : DWORD : 5 CTRL_SHUTDOWN_EVENT : DWORD : 6 COORD :: struct { @@ -4752,45 +4761,45 @@ COORD :: struct { } SMALL_RECT :: struct { - Left: SHORT, - Top: SHORT, - Right: SHORT, + Left: SHORT, + Top: SHORT, + Right: SHORT, Bottom: SHORT, } CONSOLE_SCREEN_BUFFER_INFO :: struct { - dwSize: COORD, - dwCursorPosition: COORD, - wAttributes: WORD, - srWindow: SMALL_RECT, + dwSize: COORD, + dwCursorPosition: COORD, + wAttributes: WORD, + srWindow: SMALL_RECT, dwMaximumWindowSize: COORD, } CONSOLE_CURSOR_INFO :: struct { - dwSize: DWORD, + dwSize: DWORD, bVisible: BOOL, } PCONSOLE_SCREEN_BUFFER_INFO :: ^CONSOLE_SCREEN_BUFFER_INFO -PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO +PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO Event_Type :: enum WORD { - KEY_EVENT = 0x0001, - MOUSE_EVENT = 0x0002, + KEY_EVENT = 0x0001, + MOUSE_EVENT = 0x0002, WINDOW_BUFFER_SIZE_EVENT = 0x0004, - MENU_EVENT = 0x0008, - FOCUS_EVENT = 0x0010, + MENU_EVENT = 0x0008, + FOCUS_EVENT = 0x0010, } INPUT_RECORD :: struct { EventType: Event_Type, Event: struct #raw_union { - KeyEvent: KEY_EVENT_RECORD, - MouseEvent: MOUSE_EVENT_RECORD, - WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD, - MenuEvent: MENU_EVENT_RECORD, - FocusEvent: FOCUS_EVENT_RECORD, + KeyEvent: KEY_EVENT_RECORD `raw_union_tag:"EventType=KEY_EVENT"`, + MouseEvent: MOUSE_EVENT_RECORD `raw_union_tag:"EventType=MOUSE_EVENT"`, + WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD `raw_union_tag:"EventType=WINDOW_BUFFER_SIZE_EVENT"`, + MenuEvent: MENU_EVENT_RECORD `raw_union_tag:"EventType=MENU_EVENT"`, + FocusEvent: FOCUS_EVENT_RECORD `raw_union_tag:"EventType=FOCUS_EVENT"`, }, } @@ -4820,10 +4829,10 @@ KEY_EVENT_RECORD :: struct { } MOUSE_EVENT_RECORD :: struct { - dwMousePosition: COORD, - dwButtonState: DWORD, + dwMousePosition: COORD, + dwButtonState: DWORD, dwControlKeyState: DWORD, - dwEventFlags: DWORD, + dwEventFlags: DWORD, } WINDOW_BUFFER_SIZE_RECORD :: struct { @@ -4949,16 +4958,16 @@ SO_SNDBUF : c_int : 0x1001 SO_ERROR : c_int : 0x1007 SO_BROADCAST : c_int : 0x0020 -TCP_NODELAY: c_int : 0x0001 -IP_TTL: c_int : 4 -IPV6_V6ONLY: c_int : 27 -IP_MULTICAST_LOOP: c_int : 11 -IPV6_MULTICAST_LOOP: c_int : 11 -IP_MULTICAST_TTL: c_int : 10 -IP_ADD_MEMBERSHIP: c_int : 12 +TCP_NODELAY : c_int : 0x0001 +IP_TTL : c_int : 4 +IPV6_V6ONLY : c_int : 27 +IP_MULTICAST_LOOP : c_int : 11 +IPV6_MULTICAST_LOOP : c_int : 11 +IP_MULTICAST_TTL : c_int : 10 +IP_ADD_MEMBERSHIP : c_int : 12 -IPV6_ADD_MEMBERSHIP: c_int : 12 -IPV6_DROP_MEMBERSHIP: c_int : 13 +IPV6_ADD_MEMBERSHIP : c_int : 12 +IPV6_DROP_MEMBERSHIP : c_int : 13 MAX_PROTOCOL_CHAIN: DWORD : 7 @@ -4972,8 +4981,8 @@ MSG_OOB : c_int : 1 // `send`/`recv` should process out-of-band data. MSG_PEEK : c_int : 2 // `recv` should not remove the data from the buffer. Only valid for non-overlapped operations. -SOCKET :: distinct uintptr // TODO -socklen_t :: c_int +SOCKET :: distinct uintptr // TODO +socklen_t :: c_int ADDRESS_FAMILY :: USHORT ip_mreq :: struct { @@ -4999,7 +5008,7 @@ ADDRINFOA :: struct { ai_socktype: c_int, ai_protocol: c_int, ai_addrlen: size_t, - ai_canonname: ^c_char, + ai_canonname: [^]c_char `fmt:"q,ai_addrlen"`, ai_addr: ^SOCKADDR, ai_next: ^ADDRINFOA, } @@ -5032,18 +5041,18 @@ in6_addr :: struct { } -DNS_STATUS :: distinct DWORD // zero is success -DNS_INFO_NO_RECORDS :: 9501 +DNS_STATUS :: distinct DWORD // zero is success +DNS_INFO_NO_RECORDS :: 9501 DNS_QUERY_NO_RECURSION :: 0x00000004 DNS_RECORD :: struct { // aka DNS_RECORDA - pNext: ^DNS_RECORD, - pName: cstring, - wType: WORD, + pNext: ^DNS_RECORD, + pName: cstring, + wType: WORD, wDataLength: USHORT, - Flags: DWORD, - dwTtl: DWORD, - _: DWORD, + Flags: DWORD, + dwTtl: DWORD, + _: DWORD, Data: struct #raw_union #align(4) { CNAME: DNS_PTR_DATAA, A: u32be, // Ipv4 Address @@ -5064,8 +5073,8 @@ DNS_PTR_DATAA :: cstring DNS_MX_DATAA :: struct { pNameExchange: cstring, // the hostname - wPreference: WORD, // lower values preferred - _: WORD, // padding. + wPreference: WORD, // lower values preferred + _: WORD, // padding. } DNS_SRV_DATAA :: struct { pNameTarget: cstring, @@ -5110,8 +5119,8 @@ ENUMRESTYPEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lParam: LONG_ ENUMRESLANGPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, wIDLanguage: LANGID, lParam: LONG_PTR)-> BOOL DTR_Control :: enum byte { - Disable = 0, - Enable = 1, + Disable = 0, + Enable = 1, Handshake = 2, } RTS_Control :: enum byte { @@ -5128,9 +5137,9 @@ Parity :: enum byte { Space = 4, } Stop_Bits :: enum byte { - One = 0, + One = 0, One_And_A_Half = 1, - Two = 2, + Two = 2, } DCB :: struct { @@ -5166,34 +5175,34 @@ DCB :: struct { } COMMTIMEOUTS :: struct { - ReadIntervalTimeout: DWORD, - ReadTotalTimeoutMultiplier: DWORD, - ReadTotalTimeoutConstant: DWORD, + ReadIntervalTimeout: DWORD, + ReadTotalTimeoutMultiplier: DWORD, + ReadTotalTimeoutConstant: DWORD, WriteTotalTimeoutMultiplier: DWORD, - WriteTotalTimeoutConstant: DWORD, + WriteTotalTimeoutConstant: DWORD, } -Com_Stat_Bits :: enum { - fCtsHold, - fDsrHold, - fRlsdHold, - fXoffHold, - fXoffSent, - fEof, - fTxim, -} COMSTAT :: struct { - bits: bit_set[Com_Stat_Bits; DWORD], - cbInQue: DWORD, + using _: bit_field DWORD { + fCtsHold: BOOL | 1, + fDsrHold: BOOL | 1, + fRlsdHol: BOOL | 1, + fXoffHol: BOOL | 1, + fXoffSen: BOOL | 1, + fEof: BOOL | 1, + fTxim: BOOL | 1, + fReserved: DWORD | 25, + }, + cbInQue: DWORD, cbOutQue: DWORD, } -Com_Error_Bits :: enum { +Com_Error_Bits :: enum DWORD { RXOVER, OVERRUN, RXPARITY, FRAME, BREAK, } -Com_Error :: bit_set[Com_Error_Bits; DWORD] +Com_Error :: distinct bit_set[Com_Error_Bits; DWORD] From 274e7e7e5848ec63d6c817151591b02281e2aa66 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:25:53 +0000 Subject: [PATCH 061/212] Improve the formatting of user32.odin --- core/sys/windows/user32.odin | 637 ++++++++++++++++++----------------- 1 file changed, 322 insertions(+), 315 deletions(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 287ed59e7..cd3efdeb7 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -6,7 +6,7 @@ foreign import user32 "system:User32.lib" @(default_calling_convention="system") foreign user32 { - GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassName: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL --- + GetClassInfoW :: proc(hInstance: HINSTANCE, lpClassName: LPCWSTR, lpWndClass: ^WNDCLASSW) -> BOOL --- GetClassInfoExW :: proc(hInstance: HINSTANCE, lpszClass: LPCWSTR, lpwcx: ^WNDCLASSEXW) -> BOOL --- GetClassLongW :: proc(hWnd: HWND, nIndex: INT) -> DWORD --- @@ -19,67 +19,67 @@ foreign user32 { GetParent :: proc(hWnd: HWND) -> HWND --- SetWinEventHook :: proc( - eventMin, eventMax: DWORD, - hmodWinEventProc: HMODULE, - pfnWinEvenProc: WINEVENTPROC, + eventMin, eventMax: DWORD, + hmodWinEventProc: HMODULE, + pfnWinEvenProc: WINEVENTPROC, idProcess, idThread: DWORD, - dwFlags: WinEventFlags, + dwFlags: WinEventFlags, ) -> HWINEVENTHOOK --- IsChild :: proc(hWndParent, hWnd: HWND) -> BOOL --- - RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM --- + RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM --- RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM --- UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL --- RegisterHotKey :: proc(hnwd: HWND, id: c_int, fsModifiers: UINT, vk: UINT) -> BOOL --- CreateWindowExW :: proc( - dwExStyle: DWORD, - lpClassName: LPCWSTR, - lpWindowName: LPCWSTR, - dwStyle: DWORD, + dwExStyle: DWORD, + lpClassName: LPCWSTR, + lpWindowName: LPCWSTR, + dwStyle: DWORD, X, Y, nWidth, nHeight: INT, - hWndParent: HWND, - hMenu: HMENU, - hInstance: HINSTANCE, - lpParam: LPVOID, + hWndParent: HWND, + hMenu: HMENU, + hInstance: HINSTANCE, + lpParam: LPVOID, ) -> HWND --- GetWindowThreadProcessId :: proc(hwnd: HWND, lpdwProcessId: LPDWORD) -> DWORD --- DestroyWindow :: proc(hWnd: HWND) -> BOOL --- - ShowWindow :: proc(hWnd: HWND, nCmdShow: INT) -> BOOL --- - IsWindow :: proc(hWnd: HWND) -> BOOL --- - IsWindowVisible :: proc(hwnd: HWND) -> BOOL --- - IsWindowEnabled :: proc(hwnd: HWND) -> BOOL --- - IsIconic :: proc(hwnd: HWND) -> BOOL --- - IsZoomed :: proc(hwnd: HWND) -> BOOL --- - BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- - GetTopWindow :: proc(hWnd: HWND) -> HWND --- + ShowWindow :: proc(hWnd: HWND, nCmdShow: INT) -> BOOL --- + IsWindow :: proc(hWnd: HWND) -> BOOL --- + IsWindowVisible :: proc(hwnd: HWND) -> BOOL --- + IsWindowEnabled :: proc(hwnd: HWND) -> BOOL --- + IsIconic :: proc(hwnd: HWND) -> BOOL --- + IsZoomed :: proc(hwnd: HWND) -> BOOL --- + BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- + GetTopWindow :: proc(hWnd: HWND) -> HWND --- SetForegroundWindow :: proc(hWnd: HWND) -> BOOL --- GetForegroundWindow :: proc() -> HWND --- - GetDesktopWindow :: proc() -> HWND --- - UpdateWindow :: proc(hWnd: HWND) -> BOOL --- - SetActiveWindow :: proc(hWnd: HWND) -> HWND --- - GetActiveWindow :: proc() -> HWND --- - SetFocus :: proc(hWnd: HWND) -> HWND --- - GetFocus :: proc() -> HWND --- - RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL --- - SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND --- - SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL --- - GetPropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- - RemovePropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- - EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT --- - EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT --- - GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> INT --- + GetDesktopWindow :: proc() -> HWND --- + UpdateWindow :: proc(hWnd: HWND) -> BOOL --- + SetActiveWindow :: proc(hWnd: HWND) -> HWND --- + GetActiveWindow :: proc() -> HWND --- + SetFocus :: proc(hWnd: HWND) -> HWND --- + GetFocus :: proc() -> HWND --- + RedrawWindow :: proc(hwnd: HWND, lprcUpdate: LPRECT, hrgnUpdate: HRGN, flags: RedrawWindowFlags) -> BOOL --- + SetParent :: proc(hWndChild: HWND, hWndNewParent: HWND) -> HWND --- + SetPropW :: proc(hWnd: HWND, lpString: LPCWSTR, hData: HANDLE) -> BOOL --- + GetPropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- + RemovePropW :: proc(hWnd: HWND, lpString: LPCWSTR) -> HANDLE --- + EnumPropsW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW) -> INT --- + EnumPropsExW :: proc(hWnd: HWND, lpEnumFunc: PROPENUMPROCW, lParam: LPARAM) -> INT --- + GetMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT) -> INT --- TranslateMessage :: proc(lpMsg: ^MSG) -> BOOL --- DispatchMessageW :: proc(lpMsg: ^MSG) -> LRESULT --- - WaitMessage :: proc() -> BOOL --- - MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: ^HANDLE, fWaitAll: BOOL, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD --- + WaitMessage :: proc() -> BOOL --- + MsgWaitForMultipleObjects :: proc(nCount: DWORD, pHandles: [^]HANDLE, fWaitAll: BOOL, dwMilliseconds: DWORD, dwWakeMask: DWORD) -> DWORD --- PeekMessageA :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL --- PeekMessageW :: proc(lpMsg: ^MSG, hWnd: HWND, wMsgFilterMin: UINT, wMsgFilterMax: UINT, wRemoveMsg: UINT) -> BOOL --- @@ -99,97 +99,97 @@ foreign user32 { DefWindowProcA :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- DefWindowProcW :: proc(hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - FindWindowA :: proc(lpClassName: LPCSTR, lpWindowName: LPCSTR) -> HWND --- - FindWindowW :: proc(lpClassName: LPCWSTR, lpWindowName: LPCWSTR) -> HWND --- + FindWindowA :: proc(lpClassName: LPCSTR, lpWindowName: LPCSTR) -> HWND --- + FindWindowW :: proc(lpClassName: LPCWSTR, lpWindowName: LPCWSTR) -> HWND --- FindWindowExA :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCSTR, lpszWindow: LPCSTR) -> HWND --- FindWindowExW :: proc(hWndParent: HWND, hWndChildAfter: HWND, lpszClass: LPCWSTR, lpszWindow: LPCWSTR) -> HWND --- - LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON --- - LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON --- + LoadIconA :: proc(hInstance: HINSTANCE, lpIconName: LPCSTR) -> HICON --- + LoadIconW :: proc(hInstance: HINSTANCE, lpIconName: LPCWSTR) -> HICON --- GetIconInfoExW :: proc(hIcon: HICON, piconinfo: PICONINFOEXW) -> BOOL --- - LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- - LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- - LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE --- + LoadCursorA :: proc(hInstance: HINSTANCE, lpCursorName: LPCSTR) -> HCURSOR --- + LoadCursorW :: proc(hInstance: HINSTANCE, lpCursorName: LPCWSTR) -> HCURSOR --- + LoadImageW :: proc(hInst: HINSTANCE, name: LPCWSTR, type: UINT, cx, cy: INT, fuLoad: UINT) -> HANDLE --- - CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON --- + CreateIcon :: proc(hInstance: HINSTANCE, nWidth, nHeight: INT, cPlanes: BYTE, cBitsPixel: BYTE, lpbANDbits: PBYTE, lpbXORbits: PBYTE) -> HICON --- CreateIconFromResource :: proc(presbits: PBYTE, dwResSize: DWORD, fIcon: BOOL, dwVer: DWORD) -> HICON --- - DestroyIcon :: proc(hIcon: HICON) -> BOOL --- - DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL --- + DestroyIcon :: proc(hIcon: HICON) -> BOOL --- + DrawIcon :: proc(hDC: HDC, X, Y: INT, hIcon: HICON) -> BOOL --- - CreateCursor :: proc(hInst: HINSTANCE, xHotSpot, yHotSpot, nWidth, nHeight: INT, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR --- + CreateCursor :: proc(hInst: HINSTANCE, xHotSpot, yHotSpot, nWidth, nHeight: INT, pvANDPlane: PVOID, pvXORPlane: PVOID) -> HCURSOR --- DestroyCursor :: proc(hCursor: HCURSOR) -> BOOL --- - GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- - GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- - ClientToScreen :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- - ScreenToClient :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- - SetWindowPos :: proc(hWnd: HWND, hWndInsertAfter: HWND, X, Y, cx, cy: INT, uFlags: UINT) -> BOOL --- - MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: INT, bRepaint: BOOL) -> BOOL --- - GetSystemMetrics :: proc(nIndex: INT) -> INT --- - AdjustWindowRect :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL) -> BOOL --- - AdjustWindowRectEx :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD) -> BOOL --- + GetWindowRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- + GetClientRect :: proc(hWnd: HWND, lpRect: LPRECT) -> BOOL --- + ClientToScreen :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- + ScreenToClient :: proc(hWnd: HWND, lpPoint: LPPOINT) -> BOOL --- + SetWindowPos :: proc(hWnd: HWND, hWndInsertAfter: HWND, X, Y, cx, cy: INT, uFlags: UINT) -> BOOL --- + MoveWindow :: proc(hWnd: HWND, X, Y, hWidth, hHeight: INT, bRepaint: BOOL) -> BOOL --- + GetSystemMetrics :: proc(nIndex: INT) -> INT --- + AdjustWindowRect :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL) -> BOOL --- + AdjustWindowRectEx :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD) -> BOOL --- AdjustWindowRectExForDpi :: proc(lpRect: LPRECT, dwStyle: DWORD, bMenu: BOOL, dwExStyle: DWORD, dpi: UINT) -> BOOL --- SystemParametersInfoW :: proc(uiAction, uiParam: UINT, pvParam: PVOID, fWinIni: UINT) -> BOOL --- - GetMonitorInfoW :: proc(hMonitor: HMONITOR, lpmi: LPMONITORINFO) -> BOOL --- + GetMonitorInfoW :: proc(hMonitor: HMONITOR, lpmi: LPMONITORINFO) -> BOOL --- GetWindowDC :: proc(hWnd: HWND) -> HDC --- - GetDC :: proc(hWnd: HWND) -> HDC --- - GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC --- - ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT --- + GetDC :: proc(hWnd: HWND) -> HDC --- + GetDCEx :: proc(hWnd: HWND, hrgnClip: HRGN, flags: DWORD) -> HDC --- + ReleaseDC :: proc(hWnd: HWND, hDC: HDC) -> INT --- GetDlgCtrlID :: proc(hWnd: HWND) -> INT --- - GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND --- + GetDlgItem :: proc(hDlg: HWND, nIDDlgItem: INT) -> HWND --- - CreateMenu :: proc() -> HMENU --- - CreatePopupMenu :: proc() -> HMENU --- - DeleteMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL --- - DestroyMenu :: proc(hMenu: HMENU) -> BOOL --- - InsertMenuW :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- - AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- - GetMenu :: proc(hWnd: HWND) -> HMENU --- - SetMenu :: proc(hWnd: HWND, hMenu: HMENU) -> BOOL --- - TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> INT --- + CreateMenu :: proc() -> HMENU --- + CreatePopupMenu :: proc() -> HMENU --- + DeleteMenu :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT) -> BOOL --- + DestroyMenu :: proc(hMenu: HMENU) -> BOOL --- + InsertMenuW :: proc(hMenu: HMENU, uPosition: UINT, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- + AppendMenuW :: proc(hMenu: HMENU, uFlags: UINT, uIDNewItem: UINT_PTR, lpNewItem: LPCWSTR) -> BOOL --- + GetMenu :: proc(hWnd: HWND) -> HMENU --- + SetMenu :: proc(hWnd: HWND, hMenu: HMENU) -> BOOL --- + TrackPopupMenu :: proc(hMenu: HMENU, uFlags: UINT, x, y: INT, nReserved: INT, hWnd: HWND, prcRect: ^RECT) -> INT --- RegisterWindowMessageW :: proc(lpString: LPCWSTR) -> UINT --- CreateAcceleratorTableW :: proc(paccel: LPACCEL, cAccel: INT) -> HACCEL --- DestroyAcceleratorTable :: proc(hAccel: HACCEL) -> BOOL --- - LoadAcceleratorsW :: proc(hInstance: HINSTANCE, lpTableName: LPCWSTR) -> HACCEL --- - TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> INT --- - CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> INT --- + LoadAcceleratorsW :: proc(hInstance: HINSTANCE, lpTableName: LPCWSTR) -> HACCEL --- + TranslateAcceleratorW :: proc(hWnd: HWND, hAccTable: HACCEL, lpMsg: LPMSG) -> INT --- + CopyAcceleratorTableW :: proc(hAccelSrc: HACCEL, lpAccelDst: LPACCEL, cAccelEntries: INT) -> INT --- - InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL --- - GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- - SetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPositon: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- + InsertMenuItemW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmi: LPMENUITEMINFOW) -> BOOL --- + GetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPosition: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- + SetMenuItemInfoW :: proc(hmenu: HMENU, item: UINT, fByPositon: BOOL, lpmii: LPMENUITEMINFOW) -> BOOL --- GetMenuDefaultItem :: proc(hMenu: HMENU, fByPos: UINT, gmdiFlags: UINT) -> UINT --- SetMenuDefaultItem :: proc(hMenu: HMENU, uItem: UINT, fByPos: UINT) -> BOOL --- - GetMenuItemRect :: proc(hWnd: HWND, hMenu: HMENU, uItem: UINT, lprcItem: LPRECT) -> c_int --- + GetMenuItemRect :: proc(hWnd: HWND, hMenu: HMENU, uItem: UINT, lprcItem: LPRECT) -> c_int --- - GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL --- - ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL --- + GetUpdateRect :: proc(hWnd: HWND, lpRect: LPRECT, bErase: BOOL) -> BOOL --- + ValidateRect :: proc(hWnd: HWND, lpRect: ^RECT) -> BOOL --- InvalidateRect :: proc(hWnd: HWND, lpRect: ^RECT, bErase: BOOL) -> BOOL --- BeginPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> HDC --- - EndPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> BOOL --- + EndPaint :: proc(hWnd: HWND, lpPaint: ^PAINTSTRUCT) -> BOOL --- - GetCapture :: proc() -> HWND --- - SetCapture :: proc(hWnd: HWND) -> HWND --- - ReleaseCapture :: proc() -> BOOL --- + GetCapture :: proc() -> HWND --- + SetCapture :: proc(hWnd: HWND) -> HWND --- + ReleaseCapture :: proc() -> BOOL --- TrackMouseEvent :: proc(lpEventTrack: LPTRACKMOUSEEVENT) -> BOOL --- - GetKeyState :: proc(nVirtKey: INT) -> SHORT --- + GetKeyState :: proc(nVirtKey: INT) -> SHORT --- GetAsyncKeyState :: proc(vKey: INT) -> SHORT --- GetKeyboardState :: proc(lpKeyState: PBYTE) -> BOOL --- MapVirtualKeyW :: proc(uCode: UINT, uMapType: UINT) -> UINT --- - ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: INT, wFlags: UINT) -> INT --- + ToUnicode :: proc(nVirtKey: UINT, wScanCode: UINT, lpKeyState: ^BYTE, pwszBuff: LPWSTR, cchBuff: INT, wFlags: UINT) -> INT --- - SetWindowsHookExW :: proc(idHook: INT, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK --- + SetWindowsHookExW :: proc(idHook: INT, lpfn: HOOKPROC, hmod: HINSTANCE, dwThreadId: DWORD) -> HHOOK --- UnhookWindowsHookEx :: proc(hhk: HHOOK) -> BOOL --- - CallNextHookEx :: proc(hhk: HHOOK, nCode: INT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + CallNextHookEx :: proc(hhk: HHOOK, nCode: INT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - SetTimer :: proc(hWnd: HWND, nIDEvent: UINT_PTR, uElapse: UINT, lpTimerFunc: TIMERPROC) -> UINT_PTR --- + SetTimer :: proc(hWnd: HWND, nIDEvent: UINT_PTR, uElapse: UINT, lpTimerFunc: TIMERPROC) -> UINT_PTR --- KillTimer :: proc(hWnd: HWND, uIDEvent: UINT_PTR) -> BOOL --- // MessageBoxA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT) -> INT --- @@ -197,149 +197,149 @@ foreign user32 { // MessageBoxExA :: proc(hWnd: HWND, lpText: LPCSTR, lpCaption: LPCSTR, uType: UINT, wLanguageId: WORD) -> INT --- MessageBoxExW :: proc(hWnd: HWND, lpText: LPCWSTR, lpCaption: LPCWSTR, uType: UINT, wLanguageId: WORD) -> INT --- - ClipCursor :: proc(lpRect: LPRECT) -> BOOL --- + ClipCursor :: proc(lpRect: LPRECT) -> BOOL --- GetCursorPos :: proc(lpPoint: LPPOINT) -> BOOL --- SetCursorPos :: proc(X, Y: INT) -> BOOL --- - SetCursor :: proc(hCursor: HCURSOR) -> HCURSOR --- + SetCursor :: proc(hCursor: HCURSOR) -> HCURSOR --- when !intrinsics.is_package_imported("raylib") { ShowCursor :: proc(bShow: BOOL) -> INT --- } - EnumDisplayDevicesW :: proc (lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL --- + EnumDisplayDevicesW :: proc(lpDevice: LPCWSTR, iDevNum: DWORD, lpDisplayDevice: PDISPLAY_DEVICEW, dwFlags: DWORD) -> BOOL --- EnumDisplaySettingsW :: proc(lpszDeviceName: LPCWSTR, iModeNum: DWORD, lpDevMode: ^DEVMODEW) -> BOOL --- - MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR --- - MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- - MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromPoint :: proc(pt: POINT, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- + MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- 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 --- - SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT --- - GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT --- - GetWindowDpiAwarenessContext :: proc(hwnd: HWND) -> DPI_AWARENESS_CONTEXT --- + SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT --- + GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT --- + GetWindowDpiAwarenessContext :: proc(hwnd: HWND) -> DPI_AWARENESS_CONTEXT --- GetDpiFromDpiAwarenessContext :: proc(value: DPI_AWARENESS_CONTEXT) -> UINT --- - GetDpiForWindow :: proc(hwnd: HWND) -> UINT --- + GetDpiForWindow :: proc(hwnd: HWND) -> UINT --- SetProcessDpiAwarenessContext :: proc(value: DPI_AWARENESS_CONTEXT) -> BOOL --- BroadcastSystemMessageW :: proc( - flags: DWORD, + flags: DWORD, lpInfo: LPDWORD, - Msg: UINT, + Msg: UINT, wParam: WPARAM, lParam: LPARAM, ) -> c_long --- BroadcastSystemMessageExW :: proc( - flags: DWORD, - lpInfo: LPDWORD, - Msg: UINT, - wParam: WPARAM, - lParam: LPARAM, + flags: DWORD, + lpInfo: LPDWORD, + Msg: UINT, + wParam: WPARAM, + lParam: LPARAM, pbsmInfo: PBSMINFO, ) -> c_long --- SendMessageTimeoutW :: proc( - hWnd: HWND, - Msg: UINT, - wParam: WPARAM, - lParam: LPARAM, - fuFlags: UINT, - uTimeout: UINT, + hWnd: HWND, + Msg: UINT, + wParam: WPARAM, + lParam: LPARAM, + fuFlags: UINT, + uTimeout: UINT, lpdwResult: PDWORD_PTR, ) -> LRESULT --- - GetSysColor :: proc(nIndex: INT) -> DWORD --- + GetSysColor :: proc(nIndex: INT) -> DWORD --- GetSysColorBrush :: proc(nIndex: INT) -> HBRUSH --- - SetSysColors :: proc(cElements: INT, lpaElements: ^INT, lpaRgbValues: ^COLORREF) -> BOOL --- - MessageBeep :: proc(uType: UINT) -> BOOL --- + SetSysColors :: proc(cElements: INT, lpaElements: [^]INT, lpaRgbValues: ^COLORREF) -> BOOL --- + MessageBeep :: proc(uType: UINT) -> BOOL --- - IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL --- + IsDialogMessageW :: proc(hDlg: HWND, lpMsg: LPMSG) -> BOOL --- GetWindowTextLengthW :: proc(hWnd: HWND) -> INT --- - GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT --- - SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL --- - CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- - EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL --- + GetWindowTextW :: proc(hWnd: HWND, lpString: LPWSTR, nMaxCount: INT) -> INT --- + SetWindowTextW :: proc(hWnd: HWND, lpString: LPCWSTR) -> BOOL --- + CallWindowProcW :: proc(lpPrevWndFunc: WNDPROC, hWnd: HWND, Msg: UINT, wParam: WPARAM, lParam: LPARAM) -> LRESULT --- + EnableWindow :: proc(hWnd: HWND, bEnable: BOOL) -> BOOL --- - DefRawInputProc :: proc(paRawInput: ^PRAWINPUT, nInput: INT, cbSizeHeader: UINT) -> LRESULT --- - GetRawInputBuffer :: proc(pRawInput: PRAWINPUT, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- - GetRawInputData :: proc(hRawInput: HRAWINPUT, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- - GetRawInputDeviceInfoW :: proc(hDevice: HANDLE, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT) -> UINT --- - GetRawInputDeviceList :: proc(pRawInputDeviceList: PRAWINPUTDEVICELIST, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- + DefRawInputProc :: proc(paRawInput: ^PRAWINPUT, nInput: INT, cbSizeHeader: UINT) -> LRESULT --- + GetRawInputBuffer :: proc(pRawInput: PRAWINPUT, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- + GetRawInputData :: proc(hRawInput: HRAWINPUT, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT, cbSizeHeader: UINT) -> UINT --- + GetRawInputDeviceInfoW :: proc(hDevice: HANDLE, uiCommand: UINT, pData: LPVOID, pcbSize: PUINT) -> UINT --- + GetRawInputDeviceList :: proc(pRawInputDeviceList: PRAWINPUTDEVICELIST, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- GetRegisteredRawInputDevices :: proc(pRawInputDevices: PRAWINPUTDEVICE, puiNumDevices: PUINT, cbSize: UINT) -> UINT --- - RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL --- + RegisterRawInputDevices :: proc(pRawInputDevices: PCRAWINPUTDEVICE, uiNumDevices: UINT, cbSize: UINT) -> BOOL --- SendInput :: proc(cInputs: UINT, pInputs: [^]INPUT, cbSize: INT) -> UINT --- SetLayeredWindowAttributes :: proc(hWnd: HWND, crKey: COLORREF, bAlpha: BYTE, dwFlags: DWORD) -> BOOL --- - FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- - EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- - OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- - InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- + FillRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + FrameRect :: proc(hDC: HDC, lprc: ^RECT, hbr: HBRUSH) -> c_int --- + EqualRect :: proc(lprc1, lprc2: ^RECT) -> BOOL --- + OffsetRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- + InflateRect :: proc(lprc1: ^RECT, dx, dy: INT) -> BOOL --- IntersectRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - SubtractRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - UnionRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- - IsRectEmpty :: proc(lprc: ^RECT) -> BOOL --- - SetRectEmpty :: proc(lprc: ^RECT) -> BOOL --- - CopyRect :: proc(lprcDst, lprcSrc: ^RECT) -> BOOL --- + SubtractRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- + UnionRect :: proc(lprcDst, lprcSrc1, lprcSrc2: ^RECT) -> BOOL --- + IsRectEmpty :: proc(lprc: ^RECT) -> BOOL --- + SetRectEmpty :: proc(lprc: ^RECT) -> BOOL --- + CopyRect :: proc(lprcDst, lprcSrc: ^RECT) -> BOOL --- - GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- - GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- - SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- - CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- + GetWindowInfo :: proc(hwnd: HWND, pwi: PWINDOWINFO) -> BOOL --- + GetWindowPlacement :: proc(hWnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- + SetWindowPlacement :: proc(hwnd: HWND, lpwndpl: ^WINDOWPLACEMENT) -> BOOL --- + SetWindowRgn :: proc(hWnd: HWND, hRgn: HRGN, bRedraw: BOOL) -> c_int --- + CreateRectRgnIndirect :: proc(lprect: ^RECT) -> HRGN --- GetSystemMetricsForDpi :: proc(nIndex: c_int, dpi: UINT) -> c_int --- GetCursorInfo :: proc(pci: PCURSORINFO) -> BOOL --- - GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- - EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- + GetSystemMenu :: proc(hWnd: HWND, bRevert: BOOL) -> HMENU --- + EnableMenuItem :: proc(hMenu: HMENU, uIDEnableItem: UINT, uEnable: UINT) -> BOOL --- MenuItemFromPoint :: proc(hWnd: HWND, hMenu: HMENU, ptScreen: POINT) -> INT --- - DrawTextW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat) -> INT --- + DrawTextW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat) -> INT --- DrawTextExW :: proc(hdc: HDC, lpchText: LPCWSTR, cchText: INT, lprc: LPRECT, format: DrawTextFormat, lpdtp: PDRAWTEXTPARAMS) -> INT --- - GetLocaleInfoEx :: proc(lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: INT) -> INT --- + GetLocaleInfoEx :: proc(lpLocaleName: LPCWSTR, LCType: LCTYPE, lpLCData: LPWSTR, cchData: INT) -> INT --- IsValidLocaleName :: proc(lpLocaleName: LPCWSTR) -> BOOL --- ResolveLocaleName :: proc(lpNameToResolve: LPCWSTR, lpLocaleName: LPWSTR, cchLocaleName: INT) -> INT --- - IsValidCodePage :: proc(CodePage: UINT) -> BOOL --- - GetACP :: proc() -> CODEPAGE --- - GetCPInfoExW :: proc(CodePage: CODEPAGE, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL --- + IsValidCodePage :: proc(CodePage: UINT) -> BOOL --- + GetACP :: proc() -> CODEPAGE --- + GetCPInfoExW :: proc(CodePage: CODEPAGE, dwFlags: DWORD, lpCPInfoEx: LPCPINFOEXW) -> BOOL --- - GetProcessWindowStation :: proc() -> HWINSTA --- + GetProcessWindowStation :: proc() -> HWINSTA --- GetUserObjectInformationW :: proc(hObj: HANDLE, nIndex: GetUserObjectInformationFlags, pvInfo: PVOID, nLength: DWORD, lpnLengthNeeded: LPDWORD) -> BOOL --- - OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- - CloseClipboard :: proc() -> BOOL --- - GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- - SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- + OpenClipboard :: proc(hWndNewOwner: HWND) -> BOOL --- + CloseClipboard :: proc() -> BOOL --- + GetClipboardData :: proc(uFormat: UINT) -> HANDLE --- + SetClipboardData :: proc(uFormat: UINT, hMem: HANDLE) -> HANDLE --- IsClipboardFormatAvailable :: proc(format: UINT) -> BOOL --- - EmptyClipboard :: proc() -> BOOL --- + EmptyClipboard :: proc() -> BOOL --- - SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- - GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- - ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- + SetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO, redraw: BOOL) -> c_int --- + GetScrollInfo :: proc(hwnd: HWND, nBar: c_int, lpsi: ^SCROLLINFO) -> BOOL --- + ShowScrollBar :: proc(hwnd: HWND, nBar: c_int, bShow: BOOL) -> BOOL --- EnableScrollBar :: proc(hwnd: HWND, wSBflags: UINT, wArrows: UINT) -> BOOL --- } CreateWindowW :: #force_inline proc "system" ( - lpClassName: LPCTSTR, + lpClassName: LPCTSTR, lpWindowName: LPCTSTR, - dwStyle: DWORD, - X: INT, - Y: INT, - nWidth: INT, - nHeight: INT, - hWndParent: HWND, - hMenu: HMENU, - hInstance: HINSTANCE, - lpParam: LPVOID, + dwStyle: DWORD, + X: INT, + Y: INT, + nWidth: INT, + nHeight: INT, + hWndParent: HWND, + hMenu: HMENU, + hInstance: HINSTANCE, + lpParam: LPVOID, ) -> HWND { return CreateWindowExW( 0, @@ -374,31 +374,38 @@ when ODIN_ARCH == .amd64 { SetWindowLongPtrW :: SetWindowLongW } +@(require_results) GET_SC_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> INT { return INT(wParam) & 0xFFF0 } +@(require_results) GET_WHEEL_DELTA_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_short { return cast(c_short)HIWORD(cast(DWORD)wParam) } +@(require_results) GET_KEYSTATE_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> WORD { return LOWORD(cast(DWORD)wParam) } +@(require_results) GET_NCHITTEST_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> c_short { return cast(c_short)LOWORD(cast(DWORD)wParam) } +@(require_results) GET_XBUTTON_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> WORD { return HIWORD(cast(DWORD)wParam) } // Retrieves the input code from wParam in WM_INPUT message. +@(require_results) GET_RAWINPUT_CODE_WPARAM :: #force_inline proc "contextless" (wParam: WPARAM) -> RAWINPUT_CODE { return RAWINPUT_CODE(wParam & 0xFF) } +@(require_results) MAKEINTRESOURCEW :: #force_inline proc "contextless" (#any_int i: int) -> LPWSTR { return cast(LPWSTR)uintptr(WORD(i)) } @@ -410,7 +417,7 @@ Monitor_From_Flags :: enum DWORD { } Monitor_Enum_Proc :: #type proc "system" (HMONITOR, HDC, LPRECT, LPARAM) -> BOOL -Window_Enum_Proc :: #type proc "system" (HWND, LPARAM) -> BOOL +Window_Enum_Proc :: #type proc "system" (HWND, LPARAM) -> BOOL USER_DEFAULT_SCREEN_DPI :: 96 DPI_AWARENESS_CONTEXT :: distinct HANDLE @@ -420,7 +427,7 @@ DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE :: DPI_AWARENESS_CONTEXT(~uintptr(2)) DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 :: DPI_AWARENESS_CONTEXT(~uintptr(3)) // -4 DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED :: DPI_AWARENESS_CONTEXT(~uintptr(4)) // -5 -RAWINPUT_CODE :: enum { +RAWINPUT_CODE :: enum DWORD { // The input is in the regular message flow, // the app is required to call DefWindowProc // so that the system can perform clean ups. @@ -431,16 +438,16 @@ RAWINPUT_CODE :: enum { } RAWINPUTHEADER :: struct { - dwType: DWORD, - dwSize: DWORD, + dwType: DWORD, + dwSize: DWORD, hDevice: HANDLE, - wParam: WPARAM, + wParam: WPARAM, } RAWHID :: struct { dwSizeHid: DWORD, - dwCount: DWORD, - bRawData: [1]BYTE, + dwCount: DWORD, + bRawData: [1]BYTE, } RAWMOUSE :: struct { @@ -452,27 +459,27 @@ RAWMOUSE :: struct { usButtonData: USHORT, }, }, - ulRawButtons: ULONG, - lLastX: LONG, - lLastY: LONG, + ulRawButtons: ULONG, + lLastX: LONG, + lLastY: LONG, ulExtraInformation: ULONG, } RAWKEYBOARD :: struct { - MakeCode: USHORT, - Flags: USHORT, - Rserved: USHORT, - VKey: USHORT, - Message: UINT, + MakeCode: USHORT, + Flags: USHORT, + Rserved: USHORT, + VKey: USHORT, + Message: UINT, ExtraInformation: ULONG, } RAWINPUT :: struct { header: RAWINPUTHEADER, data: struct #raw_union { - mouse: RAWMOUSE, + mouse: RAWMOUSE, keyboard: RAWKEYBOARD, - hid: RAWHID, + hid: RAWHID, }, } @@ -481,42 +488,42 @@ HRAWINPUT :: distinct LPARAM RAWINPUTDEVICE :: struct { usUsagePage: USHORT, - usUsage: USHORT, - dwFlags: DWORD, - hwndTarget: HWND, + usUsage: USHORT, + dwFlags: DWORD, + hwndTarget: HWND, } -PRAWINPUTDEVICE :: ^RAWINPUTDEVICE +PRAWINPUTDEVICE :: ^RAWINPUTDEVICE PCRAWINPUTDEVICE :: PRAWINPUTDEVICE RAWINPUTDEVICELIST :: struct { hDevice: HANDLE, - dwType: DWORD, + dwType: DWORD, } PRAWINPUTDEVICELIST :: ^RAWINPUTDEVICELIST RID_DEVICE_INFO_HID :: struct { - dwVendorId: DWORD, - dwProductId: DWORD, + dwVendorId: DWORD, + dwProductId: DWORD, dwVersionNumber: DWORD, - usUsagePage: USHORT, - usUsage: USHORT, + usUsagePage: USHORT, + usUsage: USHORT, } RID_DEVICE_INFO_KEYBOARD :: struct { - dwType: DWORD, - dwSubType: DWORD, - dwKeyboardMode: DWORD, + dwType: DWORD, + dwSubType: DWORD, + dwKeyboardMode: DWORD, dwNumberOfFunctionKeys: DWORD, - dwNumberOfIndicators: DWORD, - dwNumberOfKeysTotal: DWORD, + dwNumberOfIndicators: DWORD, + dwNumberOfKeysTotal: DWORD, } RID_DEVICE_INFO_MOUSE :: struct { - dwId: DWORD, - dwNumberOfButtons: DWORD, - dwSampleRate: DWORD, + dwId: DWORD, + dwNumberOfButtons: DWORD, + dwSampleRate: DWORD, fHasHorizontalWheel: BOOL, } @@ -524,103 +531,103 @@ RID_DEVICE_INFO :: struct { cbSize: DWORD, dwType: DWORD, using DUMMYUNIONNAME: struct #raw_union { - mouse: RID_DEVICE_INFO_MOUSE, - keyboard: RID_DEVICE_INFO_KEYBOARD, - hid: RID_DEVICE_INFO_HID, + mouse: RID_DEVICE_INFO_MOUSE `raw_union_tag:"dwType=0"`, + keyboard: RID_DEVICE_INFO_KEYBOARD `raw_union_tag:"dwType=1"`, + hid: RID_DEVICE_INFO_HID `raw_union_tag:"dwType=2"`, }, } -RIDEV_REMOVE :: 0x00000001 -RIDEV_EXCLUDE :: 0x00000010 -RIDEV_PAGEONLY :: 0x00000020 -RIDEV_NOLEGACY :: 0x00000030 -RIDEV_INPUTSINK :: 0x00000100 +RIDEV_REMOVE :: 0x00000001 +RIDEV_EXCLUDE :: 0x00000010 +RIDEV_PAGEONLY :: 0x00000020 +RIDEV_NOLEGACY :: 0x00000030 +RIDEV_INPUTSINK :: 0x00000100 RIDEV_CAPTUREMOUSE :: 0x00000200 -RIDEV_NOHOTKEYS :: 0x00000200 -RIDEV_APPKEYS :: 0x00000400 -RIDEV_EXINPUTSINK :: 0x00001000 -RIDEV_DEVNOTIFY :: 0x00002000 +RIDEV_NOHOTKEYS :: 0x00000200 +RIDEV_APPKEYS :: 0x00000400 +RIDEV_EXINPUTSINK :: 0x00001000 +RIDEV_DEVNOTIFY :: 0x00002000 RID_HEADER :: 0x10000005 -RID_INPUT :: 0x10000003 +RID_INPUT :: 0x10000003 RIDI_PREPARSEDDATA :: 0x20000005 -RIDI_DEVICENAME :: 0x20000007 -RIDI_DEVICEINFO :: 0x2000000b +RIDI_DEVICENAME :: 0x20000007 +RIDI_DEVICEINFO :: 0x2000000b -RIM_TYPEMOUSE :: 0 +RIM_TYPEMOUSE :: 0 RIM_TYPEKEYBOARD :: 1 -RIM_TYPEHID :: 2 +RIM_TYPEHID :: 2 -RI_KEY_MAKE :: 0 -RI_KEY_BREAK :: 1 -RI_KEY_E0 :: 2 -RI_KEY_E1 :: 4 +RI_KEY_MAKE :: 0 +RI_KEY_BREAK :: 1 +RI_KEY_E0 :: 2 +RI_KEY_E1 :: 4 RI_KEY_TERMSRV_SET_LED :: 8 -RI_KEY_TERMSRV_SHADOW :: 0x10 +RI_KEY_TERMSRV_SHADOW :: 0x10 -MOUSE_MOVE_RELATIVE :: 0x00 -MOUSE_MOVE_ABSOLUTE :: 0x01 -MOUSE_VIRTUAL_DESKTOP :: 0x02 +MOUSE_MOVE_RELATIVE :: 0x00 +MOUSE_MOVE_ABSOLUTE :: 0x01 +MOUSE_VIRTUAL_DESKTOP :: 0x02 MOUSE_ATTRIBUTES_CHANGED :: 0x04 -MOUSE_MOVE_NOCOALESCE :: 0x08 +MOUSE_MOVE_NOCOALESCE :: 0x08 -RI_MOUSE_BUTTON_1_DOWN :: 0x0001 -RI_MOUSE_LEFT_BUTTON_DOWN :: RI_MOUSE_BUTTON_1_DOWN -RI_MOUSE_BUTTON_1_UP :: 0x0002 -RI_MOUSE_LEFT_BUTTON_UP :: RI_MOUSE_BUTTON_1_UP -RI_MOUSE_BUTTON_2_DOWN :: 0x0004 -RI_MOUSE_RIGHT_BUTTON_DOWN :: RI_MOUSE_BUTTON_2_DOWN -RI_MOUSE_BUTTON_2_UP :: 0x0008 -RI_MOUSE_RIGHT_BUTTON_UP :: RI_MOUSE_BUTTON_2_UP -RI_MOUSE_BUTTON_3_DOWN :: 0x0010 +RI_MOUSE_BUTTON_1_DOWN :: 0x0001 +RI_MOUSE_LEFT_BUTTON_DOWN :: RI_MOUSE_BUTTON_1_DOWN +RI_MOUSE_BUTTON_1_UP :: 0x0002 +RI_MOUSE_LEFT_BUTTON_UP :: RI_MOUSE_BUTTON_1_UP +RI_MOUSE_BUTTON_2_DOWN :: 0x0004 +RI_MOUSE_RIGHT_BUTTON_DOWN :: RI_MOUSE_BUTTON_2_DOWN +RI_MOUSE_BUTTON_2_UP :: 0x0008 +RI_MOUSE_RIGHT_BUTTON_UP :: RI_MOUSE_BUTTON_2_UP +RI_MOUSE_BUTTON_3_DOWN :: 0x0010 RI_MOUSE_MIDDLE_BUTTON_DOWN :: RI_MOUSE_BUTTON_3_DOWN -RI_MOUSE_BUTTON_3_UP :: 0x0020 -RI_MOUSE_MIDDLE_BUTTON_UP :: RI_MOUSE_BUTTON_3_UP -RI_MOUSE_BUTTON_4_DOWN :: 0x0040 -RI_MOUSE_BUTTON_4_UP :: 0x0080 -RI_MOUSE_BUTTON_5_DOWN :: 0x0100 -RI_MOUSE_BUTTON_5_UP :: 0x0200 -RI_MOUSE_WHEEL :: 0x0400 -RI_MOUSE_HWHEEL :: 0x0800 +RI_MOUSE_BUTTON_3_UP :: 0x0020 +RI_MOUSE_MIDDLE_BUTTON_UP :: RI_MOUSE_BUTTON_3_UP +RI_MOUSE_BUTTON_4_DOWN :: 0x0040 +RI_MOUSE_BUTTON_4_UP :: 0x0080 +RI_MOUSE_BUTTON_5_DOWN :: 0x0100 +RI_MOUSE_BUTTON_5_UP :: 0x0200 +RI_MOUSE_WHEEL :: 0x0400 +RI_MOUSE_HWHEEL :: 0x0800 WINDOWPLACEMENT :: struct { - length: UINT, - flags: UINT, - showCmd: UINT, - ptMinPosition: POINT, - ptMaxPosition: POINT, + length: UINT, + flags: UINT, + showCmd: UINT, + ptMinPosition: POINT, + ptMaxPosition: POINT, rcNormalPosition: RECT, } WINDOWINFO :: struct { - cbSize: DWORD, - rcWindow: RECT, - rcClient: RECT, - dwStyle: DWORD, - dwExStyle: DWORD, - dwWindowStatus: DWORD, + cbSize: DWORD, + rcWindow: RECT, + rcClient: RECT, + dwStyle: DWORD, + dwExStyle: DWORD, + dwWindowStatus: DWORD, cxWindowBorders: UINT, cyWindowBorders: UINT, - atomWindowType: ATOM, + atomWindowType: ATOM, wCreatorVersion: WORD, } PWINDOWINFO :: ^WINDOWINFO CURSORINFO :: struct { - cbSize: DWORD, - flags: DWORD, - hCursor: HCURSOR, + cbSize: DWORD, + flags: DWORD, + hCursor: HCURSOR, ptScreenPos: POINT, } PCURSORINFO :: ^CURSORINFO DRAWTEXTPARAMS :: struct { - cbSize: UINT, - iTabLength: INT, - iLeftMargin: INT, - iRightMargin: INT, + cbSize: UINT, + iTabLength: INT, + iLeftMargin: INT, + iRightMargin: INT, uiLengthDrawn: UINT, } PDRAWTEXTPARAMS :: ^DRAWTEXTPARAMS @@ -678,12 +685,12 @@ GetUserObjectInformationFlags :: enum INT { } USEROBJECTFLAGS :: struct { - fInherit: BOOL, + fInherit: BOOL, fReserved: BOOL, - dwFlags: DWORD, + dwFlags: DWORD, } -PROPENUMPROCW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE) -> BOOL +PROPENUMPROCW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE) -> BOOL PROPENUMPROCEXW :: #type proc(unnamedParam1: HWND, unnamedParam2: LPCWSTR, unnamedParam3: HANDLE, unnamedParam4: ULONG_PTR) -> BOOL RT_CURSOR :: LPWSTR(uintptr(0x00000001)) @@ -718,8 +725,8 @@ MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID :: LPWSTR(uintptr(0x00000010) ACCEL :: struct { /* Also called the flags field */ fVirt: BYTE, - key: WORD, - cmd: WORD, + key: WORD, + cmd: WORD, } LPACCEL :: ^ACCEL @@ -735,32 +742,32 @@ MIIM_BITMAP :: 0x00000080 MIIM_FTYPE :: 0x00000100 MENUITEMINFOW :: struct { - cbSize: UINT, - fMask: UINT, - fType: UINT, // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) - fState: UINT, // used if MIIM_STATE - wID: UINT, // used if MIIM_ID - hSubMenu: HMENU, // used if MIIM_SUBMENU - hbmpChecked: HBITMAP, // used if MIIM_CHECKMARKS + cbSize: UINT, + fMask: UINT, + fType: UINT, // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) + fState: UINT, // used if MIIM_STATE + wID: UINT, // used if MIIM_ID + hSubMenu: HMENU, // used if MIIM_SUBMENU + hbmpChecked: HBITMAP, // used if MIIM_CHECKMARKS hbmpUnchecked: HBITMAP, // used if MIIM_CHECKMARKS - dwItemData: ULONG_PTR, // used if MIIM_DATA - dwTypeData: LPWSTR, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) - cch: UINT, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) - hbmpItem: HBITMAP, // used if MIIM_BITMAP + dwItemData: ULONG_PTR, // used if MIIM_DATA + dwTypeData: LPWSTR, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) + cch: UINT, // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) + hbmpItem: HBITMAP, // used if MIIM_BITMAP } LPMENUITEMINFOW :: ^MENUITEMINFOW DISPLAY_DEVICEW :: struct { - cb: DWORD, - DeviceName: [32]WCHAR, + cb: DWORD, + DeviceName: [32]WCHAR, DeviceString: [128]WCHAR, - StateFlags: DWORD, - DeviceID: [128]WCHAR, - DeviceKey: [128]WCHAR, + StateFlags: DWORD, + DeviceID: [128]WCHAR, + DeviceKey: [128]WCHAR, } PDISPLAY_DEVICEW :: ^DISPLAY_DEVICEW // OUTOFCONTEXT is the zero value, use {} -WinEventFlags :: bit_set[WinEventFlag; DWORD] +WinEventFlags :: distinct bit_set[WinEventFlag; DWORD] WinEventFlag :: enum DWORD { SKIPOWNTHREAD = 0, @@ -797,7 +804,7 @@ CF_PRIVATEFIRST :: 0x0200 CF_PRIVATELAST :: 0x02FF STICKYKEYS :: struct { - cbSize: UINT, + cbSize: UINT, dwFlags: DWORD, } LPSTICKYKEYS :: ^STICKYKEYS @@ -827,7 +834,7 @@ SKF_LALTLATCHED :: 0x10000000 SKF_RALTLATCHED :: 0x20000000 TOGGLEKEYS :: struct { - cbSize: UINT, + cbSize: UINT, dwFlags: DWORD, } LPTOGGLEKEYS :: ^TOGGLEKEYS @@ -840,10 +847,10 @@ TKF_HOTKEYSOUND :: 0x10 TKF_INDICATOR :: 0x20 FILTERKEYS :: struct { - cbSize: UINT, - dwFlags: DWORD, - iWaitMSec: DWORD, - iDelayMSec: DWORD, + cbSize: UINT, + dwFlags: DWORD, + iWaitMSec: DWORD, + iDelayMSec: DWORD, iRepeatMSec: DWORD, iBounceMSec: DWORD, } @@ -858,21 +865,21 @@ FKF_INDICATOR :: 0x20 FKF_CLICKON :: 0x40 NONCLIENTMETRICSW :: struct { - cbSize: UINT, - iBorderWidth: c_int, - iScrollWidth: c_int, - iScrollHeight: c_int, - iCaptionWidth: c_int, - iCaptionHeight: c_int, - lfCaptionFont: LOGFONTW, - iSmCaptionWidth: c_int, - iSmCaptionHeight: c_int, - lfSmCaptionFont: LOGFONTW, - iMenuWidth: c_int, - iMenuHeight: c_int, - lfMenuFont: LOGFONTW, - lfStatusFont: LOGFONTW, - lfMessageFont: LOGFONTW, + cbSize: UINT, + iBorderWidth: c_int, + iScrollWidth: c_int, + iScrollHeight: c_int, + iCaptionWidth: c_int, + iCaptionHeight: c_int, + lfCaptionFont: LOGFONTW, + iSmCaptionWidth: c_int, + iSmCaptionHeight: c_int, + lfSmCaptionFont: LOGFONTW, + iMenuWidth: c_int, + iMenuHeight: c_int, + lfMenuFont: LOGFONTW, + lfStatusFont: LOGFONTW, + lfMessageFont: LOGFONTW, iPaddedBorderWidth: c_int, } LPNONCLIENTMETRICSW :: ^NONCLIENTMETRICSW @@ -881,12 +888,12 @@ LWA_COLORKEY :: 0x1 LWA_ALPHA :: 0x2 SCROLLINFO :: struct { - cbSize: UINT, - fMask: UINT, - nMin: c_int, - nMax: c_int, - nPage: UINT, - nPos: c_int, + cbSize: UINT, + fMask: UINT, + nMin: c_int, + nMax: c_int, + nPage: UINT, + nPos: c_int, nTrackPos: c_int, } LPSCROLLINFO :: ^SCROLLINFO From e154489f013c66627975a6ba0d8d4c67b8ea33f9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:32:39 +0000 Subject: [PATCH 062/212] More formatting improvements --- core/sys/windows/userenv.odin | 21 ++--- core/sys/windows/util.odin | 34 ++++++-- core/sys/windows/ux_theme.odin | 2 +- core/sys/windows/wgl.odin | 2 +- core/sys/windows/winmm.odin | 53 +++++++------ core/sys/windows/winnls.odin | 14 ++-- core/sys/windows/winver.odin | 10 +-- core/sys/windows/wow64_apiset.odin | 96 +++++++++++------------ core/sys/windows/ws2_32.odin | 122 ++++++++++++++--------------- core/sys/windows/xinput.odin | 14 ++-- 10 files changed, 198 insertions(+), 170 deletions(-) diff --git a/core/sys/windows/userenv.odin b/core/sys/windows/userenv.odin index 2a2209d2c..1ed731407 100644 --- a/core/sys/windows/userenv.odin +++ b/core/sys/windows/userenv.odin @@ -5,19 +5,22 @@ foreign import userenv "system:Userenv.lib" @(default_calling_convention="system") foreign userenv { - GetUserProfileDirectoryW :: proc(hToken: HANDLE, - lpProfileDir: LPWSTR, - lpcchSize: ^DWORD) -> BOOL --- + GetUserProfileDirectoryW :: proc( + hToken: HANDLE, + lpProfileDir: LPWSTR, + lpcchSize: ^DWORD, + ) -> BOOL --- + LoadUserProfileW :: proc( - hToken: HANDLE, + hToken: HANDLE, lpProfileInfo: ^PROFILEINFOW, ) -> BOOL --- // https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-createprofile // The caller must have administrator privileges to call this function. CreateProfile :: proc( - pszUserSid: LPCWSTR, - pszUserName: LPCWSTR, + pszUserSid: LPCWSTR, + pszUserName: LPCWSTR, pszProfilePath: wstring, cchProfilePath: DWORD, ) -> u32 --- @@ -25,15 +28,15 @@ foreign userenv { // https://docs.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-deleteprofilew // The caller must have administrative privileges to delete a user's profile. DeleteProfileW :: proc( - lpSidString: LPCWSTR, - lpProfilePath: LPCWSTR, + lpSidString: LPCWSTR, + lpProfilePath: LPCWSTR, lpComputerName: LPCWSTR, ) -> BOOL --- // https://docs.microsoft.com/en-us/windows/win32/api/sddl/nf-sddl-convertsidtostringsida // To turn a SID into a string SID to use with CreateProfile & DeleteProfileW. ConvertSidToStringSidW :: proc( - Sid: ^SID, + Sid: ^SID, StringSid: ^LPCWSTR, ) -> BOOL --- } diff --git a/core/sys/windows/util.odin b/core/sys/windows/util.odin index 4729d5c72..8cabdeb04 100644 --- a/core/sys/windows/util.odin +++ b/core/sys/windows/util.odin @@ -7,74 +7,89 @@ import "base:intrinsics" L :: intrinsics.constant_utf16_cstring // https://learn.microsoft.com/en-us/windows/win32/winmsg/makeword +@(require_results) MAKEWORD :: #force_inline proc "contextless" (#any_int a, b: int) -> WORD { return WORD(BYTE(DWORD_PTR(a) & 0xff)) | (WORD(BYTE(DWORD_PTR(b) & 0xff)) << 8) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/makelong +@(require_results) MAKELONG :: #force_inline proc "contextless" (#any_int a, b: int) -> LONG { return LONG(WORD(DWORD_PTR(a) & 0xffff)) | (LONG(WORD(DWORD_PTR(b) & 0xffff)) << 16) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/loword +@(require_results) LOWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD { return WORD(x & 0xffff) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/hiword +@(require_results) HIWORD :: #force_inline proc "contextless" (#any_int x: int) -> WORD { return WORD(x >> 16) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/lobyte +@(require_results) LOBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE { return BYTE((DWORD_PTR(w)) & 0xff) } // https://learn.microsoft.com/en-us/windows/win32/winmsg/hibyte +@(require_results) HIBYTE :: #force_inline proc "contextless" (w: WORD) -> BYTE { return BYTE(((DWORD_PTR(w)) >> 8) & 0xff) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makewparam +@(require_results) MAKEWPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> WPARAM { return WPARAM(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelparam +@(require_results) MAKELPARAM :: #force_inline proc "contextless" (#any_int l, h: int) -> LPARAM { return LPARAM(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-makelresult +@(require_results) MAKELRESULT :: #force_inline proc "contextless" (#any_int l, h: int) -> LRESULT { return LRESULT(MAKELONG(l, h)) } // https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_x_lparam +@(require_results) GET_X_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int { return cast(c_int)cast(c_short)LOWORD(cast(DWORD)lp) } // https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_y_lparam +@(require_results) GET_Y_LPARAM :: #force_inline proc "contextless" (lp: LPARAM) -> c_int { return cast(c_int)cast(c_short)HIWORD(cast(DWORD)lp) } // https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelcid +@(require_results) MAKELCID :: #force_inline proc "contextless" (lgid, srtid: WORD) -> LCID { return (DWORD(WORD(srtid)) << 16) | DWORD(WORD(lgid)) } // https://learn.microsoft.com/en-us/windows/win32/api/winnt/nf-winnt-makelangid +@(require_results) MAKELANGID :: #force_inline proc "contextless" (p, s: WORD) -> DWORD { return DWORD(WORD(s)) << 10 | DWORD(WORD(p)) } +@(require_results) LANGIDFROMLCID :: #force_inline proc "contextless" (lcid: LCID) -> LANGID { return LANGID(lcid) } +@(require_results) utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> []u16 { if len(s) < 1 { return nil @@ -102,6 +117,7 @@ utf8_to_utf16_alloc :: proc(s: string, allocator := context.temp_allocator) -> [ return text[:n] } +@(require_results) utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { n1 := MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, raw_data(s), c_int(len(s)), nil, 0) if n1 == 0 { @@ -120,6 +136,7 @@ utf8_to_utf16_buf :: proc(buf: []u16, s: string) -> []u16 { } utf8_to_utf16 :: proc{utf8_to_utf16_alloc, utf8_to_utf16_buf} +@(require_results) utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> wstring { if res := utf8_to_utf16(s, allocator); len(res) > 0 { return wstring(raw_data(res)) @@ -127,6 +144,7 @@ utf8_to_wstring_alloc :: proc(s: string, allocator := context.temp_allocator) -> return nil } +@(require_results) utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { if res := utf8_to_utf16(buf, s); len(res) > 0 { return wstring(raw_data(res)) @@ -136,6 +154,7 @@ utf8_to_wstring_buf :: proc(buf: []u16, s: string) -> wstring { utf8_to_wstring :: proc{utf8_to_wstring_alloc, utf8_to_wstring_buf} +@(require_results) wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) { context.allocator = allocator @@ -170,6 +189,7 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo return string(text[:n]), nil } +@(require_results) wstring_to_utf8_buf :: proc(buf: []u8, s: wstring, N := -1) -> (res: string) { n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, c_int(N), nil, 0, nil, nil) if n == 0 { @@ -211,6 +231,7 @@ Returns: - res: A cloned and converted string - err: An optional allocator error if one occured, `nil` otherwise */ +@(require_results) utf16_to_utf8_alloc :: proc(s: []u16, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) { if len(s) == 0 { return "", nil @@ -232,6 +253,7 @@ Inputs: Returns: - res: A converted string, backed byu `buf` */ +@(require_results) utf16_to_utf8_buf :: proc(buf: []u8, s: []u16) -> (res: string) { if len(s) == 0 { return @@ -244,8 +266,9 @@ utf16_to_utf8 :: proc{utf16_to_utf8_alloc, utf16_to_utf8_buf} // AdvAPI32, NetAPI32 and UserENV helpers. -allowed_username :: proc(username: string) -> bool { - contains_any :: proc(s, chars: string) -> bool { +@(require_results) +allowed_username :: proc "contextless" (username: string) -> bool { + contains_any :: proc "contextless" (s, chars: string) -> bool { if chars == "" { return false } @@ -287,8 +310,8 @@ allowed_username :: proc(username: string) -> bool { } // Returns .Success on success. +@(require_results) _add_user :: proc(servername: string, username: string, password: string) -> (ok: NET_API_STATUS) { - servername_w: wstring username_w: []u16 password_w: []u16 @@ -339,8 +362,8 @@ _add_user :: proc(servername: string, username: string, password: string) -> (ok return } +@(require_results) get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: string, sid := SID{}, ok: bool) { - username_w := utf8_to_utf16(username, context.temp_allocator) cbsid: DWORD computer_name_size: DWORD @@ -381,8 +404,8 @@ get_computer_name_and_account_sid :: proc(username: string) -> (computer_name: s return } +@(require_results) get_sid :: proc(username: string, sid: ^SID) -> (ok: bool) { - username_w := utf8_to_utf16(username, context.temp_allocator) cbsid: DWORD computer_name_size: DWORD @@ -451,6 +474,7 @@ add_del_from_group :: proc(sid: ^SID, group: string) -> (ok: NET_API_STATUS) { return } +@(require_results) add_user_profile :: proc(username: string) -> (ok: bool, profile_path: string) { username_w := utf8_to_utf16(username, context.temp_allocator) diff --git a/core/sys/windows/ux_theme.odin b/core/sys/windows/ux_theme.odin index 47a0049b2..4ce126c73 100644 --- a/core/sys/windows/ux_theme.odin +++ b/core/sys/windows/ux_theme.odin @@ -13,6 +13,6 @@ PMARGINS :: ^MARGINS @(default_calling_convention="system") foreign uxtheme { - IsThemeActive :: proc() -> BOOL --- + IsThemeActive :: proc() -> BOOL --- SetWindowTheme :: proc(hWnd: HWND, pszSubAppName, pszSubIdList: LPCWSTR) -> HRESULT --- } diff --git a/core/sys/windows/wgl.odin b/core/sys/windows/wgl.odin index 436a96329..532a987eb 100644 --- a/core/sys/windows/wgl.odin +++ b/core/sys/windows/wgl.odin @@ -91,7 +91,7 @@ gl_set_proc_address :: proc(p: rawptr, name: cstring) { func := wglGetProcAddress(name) switch uintptr(func) { case 0, 1, 2, 3, ~uintptr(0): - module := LoadLibraryW(L("opengl32.dll")) + module := LoadLibraryW("opengl32.dll") func = GetProcAddress(module, name) } (^rawptr)(p)^ = func diff --git a/core/sys/windows/winmm.odin b/core/sys/windows/winmm.odin index b85548b85..d1848cb7b 100644 --- a/core/sys/windows/winmm.odin +++ b/core/sys/windows/winmm.odin @@ -12,28 +12,28 @@ foreign winmm { timeEndPeriod :: proc(uPeriod: UINT) -> MMRESULT --- timeGetTime :: proc() -> DWORD --- - waveOutGetNumDevs :: proc() -> UINT --- - waveOutGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwoc: LPWAVEOUTCAPSW, cbwoc: UINT) -> MMRESULT --- - waveOutGetVolume :: proc(hwo: HWAVEOUT, pdwVolume: LPDWORD) -> MMRESULT --- - waveOutSetVolume :: proc(hwo: HWAVEOUT, dwVolume: DWORD) -> MMRESULT --- - waveOutGetErrorTextW :: proc(mmrError: MMRESULT, pszText: LPWSTR, cchText: UINT) -> MMRESULT --- - waveOutOpen :: proc(phwo: LPHWAVEOUT, uDeviceID: UINT, pwfx: LPCWAVEFORMATEX, dwCallback: DWORD_PTR, dwInstance: DWORD_PTR, fdwOpen: DWORD) -> MMRESULT --- - waveOutClose :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutPrepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- + waveOutGetNumDevs :: proc() -> UINT --- + waveOutGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwoc: LPWAVEOUTCAPSW, cbwoc: UINT) -> MMRESULT --- + waveOutGetVolume :: proc(hwo: HWAVEOUT, pdwVolume: LPDWORD) -> MMRESULT --- + waveOutSetVolume :: proc(hwo: HWAVEOUT, dwVolume: DWORD) -> MMRESULT --- + waveOutGetErrorTextW :: proc(mmrError: MMRESULT, pszText: LPWSTR, cchText: UINT) -> MMRESULT --- + waveOutOpen :: proc(phwo: LPHWAVEOUT, uDeviceID: UINT, pwfx: LPCWAVEFORMATEX, dwCallback: DWORD_PTR, dwInstance: DWORD_PTR, fdwOpen: DWORD) -> MMRESULT --- + waveOutClose :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutPrepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- waveOutUnprepareHeader :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- - waveOutWrite :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- - waveOutPause :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutRestart :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutReset :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutBreakLoop :: proc(hwo: HWAVEOUT) -> MMRESULT --- - waveOutGetPosition :: proc(hwo: HWAVEOUT, pmmt: LPMMTIME, cbmmt: UINT) -> MMRESULT --- - waveOutGetPitch :: proc(hwo: HWAVEOUT, pdwPitch: LPDWORD) -> MMRESULT --- - waveOutSetPitch :: proc(hwo: HWAVEOUT, pdwPitch: DWORD) -> MMRESULT --- + waveOutWrite :: proc(hwo: HWAVEOUT, pwh: LPWAVEHDR, cbwh: UINT) -> MMRESULT --- + waveOutPause :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutRestart :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutReset :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutBreakLoop :: proc(hwo: HWAVEOUT) -> MMRESULT --- + waveOutGetPosition :: proc(hwo: HWAVEOUT, pmmt: LPMMTIME, cbmmt: UINT) -> MMRESULT --- + waveOutGetPitch :: proc(hwo: HWAVEOUT, pdwPitch: LPDWORD) -> MMRESULT --- + waveOutSetPitch :: proc(hwo: HWAVEOUT, pdwPitch: DWORD) -> MMRESULT --- waveOutGetPlaybackRate :: proc(hwo: HWAVEOUT, pdwRate: LPDWORD) -> MMRESULT --- waveOutSetPlaybackRate :: proc(hwo: HWAVEOUT, pdwRate: DWORD) -> MMRESULT --- - waveOutGetID :: proc(hwo: HWAVEOUT, puDeviceID: LPUINT) -> MMRESULT --- + waveOutGetID :: proc(hwo: HWAVEOUT, puDeviceID: LPUINT) -> MMRESULT --- - waveInGetNumDevs :: proc() -> UINT --- + waveInGetNumDevs :: proc() -> UINT --- waveInGetDevCapsW :: proc(uDeviceID: UINT_PTR, pwic: LPWAVEINCAPSW, cbwic: UINT) -> MMRESULT --- PlaySoundW :: proc(pszSound: LPCWSTR, hmod: HMODULE, fdwSound: DWORD) -> BOOL --- @@ -272,10 +272,10 @@ LPHWAVEOUT :: ^HWAVEOUT MMTIME :: struct { wType: MMTIME_TYPE, u: struct #raw_union { - ms: DWORD, - sample: DWORD, - cb: DWORD, - ticks: DWORD, + ms: DWORD `raw_union_tag:"wType=TIME_MS"`, + sample: DWORD `raw_union_tag:"wType=TIME_SAMPLES"`, + cb: DWORD `raw_union_tag:"wType=TIME_BYTES"`, + ticks: DWORD `raw_union_tag:"wType=TIME_TICKS"`, smpte: struct { hour: BYTE, min: BYTE, @@ -284,10 +284,10 @@ MMTIME :: struct { fps: BYTE, dummy: BYTE, pad: [2]BYTE, - }, + } `raw_union_tag:"wType=TIME_SMPTE"`, midi: struct { songptrpos: DWORD, - }, + } `raw_union_tag:"wType=TIME_MIDI"`, }, } LPMMTIME :: ^MMTIME @@ -307,12 +307,13 @@ MMTIME_TYPE :: enum UINT { TIME_TICKS = 0x0020, } -MAXPNAMELEN :: 32 +MAXPNAMELEN :: 32 MAXERRORLENGTH :: 256 -MMVERSION :: UINT +MMVERSION :: UINT // Input is four characters string // Output is little-endian u32 representation +@(require_results) MAKEFOURCC :: #force_inline proc "contextless" (s: [4]byte) -> DWORD { return (DWORD(s[0])) | (DWORD(s[1]) << 8) | (DWORD(s[2]) << 16) | (DWORD(s[3]) << 24 ) } diff --git a/core/sys/windows/winnls.odin b/core/sys/windows/winnls.odin index ffb2638d5..9c2c219ef 100644 --- a/core/sys/windows/winnls.odin +++ b/core/sys/windows/winnls.odin @@ -5,8 +5,8 @@ LCTYPE :: distinct DWORD LOCALE_NAME_MAX_LENGTH :: 85 LOCALE_NAME_USER_DEFAULT :: 0 -LOCALE_NAME_INVARIANT : wstring = L("") -LOCALE_NAME_SYSTEM_DEFAULT : wstring = L("!x-sys-default-locale") +LOCALE_NAME_INVARIANT : wstring = "" +LOCALE_NAME_SYSTEM_DEFAULT : wstring = "!x-sys-default-locale" // String Length Maximums. // 5 ranges, 2 bytes ea., 0 term. @@ -16,16 +16,16 @@ MAX_DEFAULTCHAR :: 2 CPINFOEXW :: struct{ // Maximum length, in bytes, of a character in the code page. - MaxCharSize: UINT, + MaxCharSize: UINT, // The default is usually the "?" character for the code page. - DefaultChar: [MAX_DEFAULTCHAR]BYTE, + DefaultChar: [MAX_DEFAULTCHAR]BYTE, // A fixed-length array of lead byte ranges, for which the number of lead byte ranges is variable. - LeadByte: [MAX_LEADBYTES]BYTE, + LeadByte: [MAX_LEADBYTES]BYTE, // The default is usually the "?" character or the katakana middle dot character. UnicodeDefaultChar: WCHAR, // Code page value. This value reflects the code page passed to the GetCPInfoEx function. - CodePage: CODEPAGE, + CodePage: CODEPAGE, // Full name of the code page. - CodePageName: [MAX_PATH]WCHAR, + CodePageName: [MAX_PATH]WCHAR, } LPCPINFOEXW :: ^CPINFOEXW diff --git a/core/sys/windows/winver.odin b/core/sys/windows/winver.odin index 47751dab7..878080102 100644 --- a/core/sys/windows/winver.odin +++ b/core/sys/windows/winver.odin @@ -5,14 +5,14 @@ foreign import version "system:version.lib" @(default_calling_convention = "system") foreign version { - GetFileVersionInfoSizeW :: proc(lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- - GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL --- + GetFileVersionInfoSizeW :: proc(lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- + GetFileVersionInfoW :: proc(lptstrFilename: LPCWSTR, dwHandle: DWORD, dwLen: DWORD, lpData: LPVOID) -> BOOL --- GetFileVersionInfoSizeExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, lpdwHandle: LPDWORD) -> DWORD --- - GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD --- + GetFileVersionInfoExW :: proc(dwFlags: FILE_VER_GET_FLAGS, lpwstrFilename: LPCWSTR, dwHandle, dwLen: DWORD, lpData: LPVOID) -> DWORD --- - VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD --- - VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL --- + VerLanguageNameW :: proc(wLang: DWORD, szLang: LPWSTR, cchLang: DWORD) -> DWORD --- + VerQueryValueW :: proc(pBlock: LPCVOID, lpSubBlock: LPCWSTR, lplpBuffer: ^LPVOID, puLen: PUINT) -> BOOL --- } FILE_VER_GET :: enum DWORD {LOCALISED, NEUTRAL, PREFETCHED} diff --git a/core/sys/windows/wow64_apiset.odin b/core/sys/windows/wow64_apiset.odin index 3d29b786e..cce0ab2cc 100644 --- a/core/sys/windows/wow64_apiset.odin +++ b/core/sys/windows/wow64_apiset.odin @@ -5,30 +5,30 @@ foreign import kernel32 "system:Kernel32.lib" @(default_calling_convention="system") foreign kernel32 { - GetSystemWow64Directory2W :: proc (lpBuffer: LPWSTR, uSize: UINT, ImageFileMachineTyp: WORD) -> UINT --- - GetSystemWow64DirectoryW :: proc (lpBuffer: LPWSTR, uSize: UINT) -> UINT --- - IsWow64GuestMachineSupported :: proc (WowGuestMachine: USHORT, MachineIsSupported: ^BOOL) -> HRESULT --- - IsWow64Process :: proc (hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL --- - IsWow64Process2 :: proc (hProcess: HANDLE, pProcessMachine: ^USHORT, pNativeMachine: ^USHORT) -> BOOL --- - Wow64EnableWow64FsRedirection :: proc (Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN --- - Wow64DisableWow64FsRedirection :: proc (OldValue: ^PVOID) -> BOOL --- - Wow64RevertWow64FsRedirection :: proc (OlValue: PVOID) -> BOOL --- - Wow64GetThreadContext :: proc (hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL --- - Wow64SetThreadContext :: proc(hThread: HANDLE, lpContext: ^WOW64_CONTEXT) -> BOOL --- + GetSystemWow64Directory2W :: proc(lpBuffer: LPWSTR, uSize: UINT, ImageFileMachineTyp: WORD) -> UINT --- + GetSystemWow64DirectoryW :: proc(lpBuffer: LPWSTR, uSize: UINT) -> UINT --- + IsWow64GuestMachineSupported :: proc(WowGuestMachine: USHORT, MachineIsSupported: ^BOOL) -> HRESULT --- + IsWow64Process :: proc(hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL --- + IsWow64Process2 :: proc(hProcess: HANDLE, pProcessMachine: ^USHORT, pNativeMachine: ^USHORT) -> BOOL --- + Wow64EnableWow64FsRedirection :: proc(Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN --- + Wow64DisableWow64FsRedirection :: proc(OldValue: ^PVOID) -> BOOL --- + Wow64RevertWow64FsRedirection :: proc(OlValue: PVOID) -> BOOL --- + Wow64GetThreadContext :: proc(hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL --- + Wow64SetThreadContext :: proc(hThread: HANDLE, lpContext: ^WOW64_CONTEXT) -> BOOL --- Wow64SetThreadDefaultGuestMachine :: proc(Machine: USHORT) -> USHORT --- - Wow64SuspendThread :: proc (hThread: HANDLE) -> DWORD --- + Wow64SuspendThread :: proc(hThread: HANDLE) -> DWORD --- } WOW64_CONTEXT_i386 :: 0x00010000 -WOW64_CONTEXT_CONTROL :: (WOW64_CONTEXT_i386 | 0x00000001) -WOW64_CONTEXT_INTEGER :: (WOW64_CONTEXT_i386 | 0x00000002) +WOW64_CONTEXT_CONTROL :: (WOW64_CONTEXT_i386 | 0x00000001) +WOW64_CONTEXT_INTEGER :: (WOW64_CONTEXT_i386 | 0x00000002) WOW64_CONTEXT_SEGMENTS :: (WOW64_CONTEXT_i386 | 0x00000004) -WOW64_CONTEXT_FLOATING_POINT :: (WOW64_CONTEXT_i386 | 0x00000008) -WOW64_CONTEXT_DEBUG_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000010) +WOW64_CONTEXT_FLOATING_POINT :: (WOW64_CONTEXT_i386 | 0x00000008) +WOW64_CONTEXT_DEBUG_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000010) WOW64_CONTEXT_EXTENDED_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000020) -WOW64_CONTEXT_FULL :: (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS) +WOW64_CONTEXT_FULL :: (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS) WOW64_CONTEXT_ALL :: ( WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | @@ -41,45 +41,45 @@ WOW64_SIZE_OF_80387_REGISTERS :: 80 WOW64_MAXIMUM_SUPPORTED_EXTENSION :: 512 WOW64_CONTEXT :: struct { - ContextFlags: DWORD, - Dr0: DWORD, - Dr1: DWORD, - Dr2: DWORD, - Dr3: DWORD, - Dr6: DWORD, - Dr7: DWORD, - FloatSave: WOW64_FLOATING_SAVE_AREA, - SegGs: DWORD, - SegFs: DWORD, - SegEs: DWORD, - SegDs: DWORD, - Edi: DWORD, - Esi: DWORD, - Ebx: DWORD, - Edx: DWORD, - Ecx: DWORD, - Eax: DWORD, - Ebp: DWORD, - Eip: DWORD, - SegCs: DWORD, - EFlags: DWORD, - Esp: DWORD, - SegSs: DWORD, + ContextFlags: DWORD, + Dr0: DWORD, + Dr1: DWORD, + Dr2: DWORD, + Dr3: DWORD, + Dr6: DWORD, + Dr7: DWORD, + FloatSave: WOW64_FLOATING_SAVE_AREA, + SegGs: DWORD, + SegFs: DWORD, + SegEs: DWORD, + SegDs: DWORD, + Edi: DWORD, + Esi: DWORD, + Ebx: DWORD, + Edx: DWORD, + Ecx: DWORD, + Eax: DWORD, + Ebp: DWORD, + Eip: DWORD, + SegCs: DWORD, + EFlags: DWORD, + Esp: DWORD, + SegSs: DWORD, ExtendedRegisters: [WOW64_MAXIMUM_SUPPORTED_EXTENSION]BYTE, } PWOW64_CONTEXT :: ^WOW64_CONTEXT WOW64_FLOATING_SAVE_AREA :: struct { - ControlWord: DWORD, - StatusWord: DWORD, - TagWord: DWORD, - ErrorOffset: DWORD, + ControlWord: DWORD, + StatusWord: DWORD, + TagWord: DWORD, + ErrorOffset: DWORD, ErrorSelector: DWORD, - DataOffset: DWORD, - DataSelector: DWORD, - RegisterArea: [WOW64_SIZE_OF_80387_REGISTERS]BYTE, - Cr0NpxState: DWORD, + DataOffset: DWORD, + DataSelector: DWORD, + RegisterArea: [WOW64_SIZE_OF_80387_REGISTERS]BYTE, + Cr0NpxState: DWORD, } PWOW64_FLOATING_SAVE_AREA :: ^WOW64_FLOATING_SAVE_AREA \ No newline at end of file diff --git a/core/sys/windows/ws2_32.odin b/core/sys/windows/ws2_32.odin index ed2ad5e24..2c8dbe3b0 100644 --- a/core/sys/windows/ws2_32.odin +++ b/core/sys/windows/ws2_32.odin @@ -109,62 +109,62 @@ foreign ws2_32 { WSAPoll :: proc(fdArray: ^WSA_POLLFD, fds: c_ulong, timeout: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaduplicatesocketw) WSADuplicateSocketW :: proc( - s: SOCKET, - dwProcessId: DWORD, + s: SOCKET, + dwProcessId: DWORD, lpProtocolInfo: LPWSAPROTOCOL_INFO, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasend) WSASend :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD, - dwFlags: DWORD, - lpOverlapped: LPWSAOVERLAPPED, + dwFlags: DWORD, + lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasendto) WSASendTo :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesSent: LPDWORD, - dwFlags: DWORD, - lpTo: ^SOCKADDR_STORAGE_LH, - iToLen: c_int, - lpOverlapped: LPWSAOVERLAPPED, + dwFlags: DWORD, + lpTo: ^SOCKADDR_STORAGE_LH, + iToLen: c_int, + lpOverlapped: LPWSAOVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecv) WSARecv :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD, - lpFlags: LPDWORD, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + lpFlags: LPDWORD, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecvfrom) WSARecvFrom :: proc( - s: SOCKET, - lpBuffers: LPWSABUF, - dwBufferCount: DWORD, + s: SOCKET, + lpBuffers: LPWSABUF, + dwBufferCount: DWORD, lpNumberOfBytesRecvd: LPDWORD, - lpFlags: LPDWORD, - lpFrom: ^SOCKADDR_STORAGE_LH, - lpFromlen: ^c_int, - lpOverlapped: LPWSAOVERLAPPED, - lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, + lpFlags: LPDWORD, + lpFrom: ^SOCKADDR_STORAGE_LH, + lpFromlen: ^c_int, + lpOverlapped: LPWSAOVERLAPPED, + lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketw) WSASocketW :: proc( - af: c_int, - kind: c_int, - protocol: c_int, + af: c_int, + kind: c_int, + protocol: c_int, lpProtocolInfo: LPWSAPROTOCOL_INFO, - g: GROUP, - dwFlags: DWORD, + g: GROUP, + dwFlags: DWORD, ) -> SOCKET --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl) WSAIoctl :: proc(s: SOCKET, dwIoControlCode: DWORD, lpvInBuffer: rawptr, cbInBuffer: DWORD, lpvOutBuffer: rawptr, cbOutBuffer: DWORD, lpcbBytesReturned: ^DWORD, lpOverlapped: ^OVERLAPPED, lpCompletionRoutine: LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> c_int --- @@ -182,8 +182,8 @@ foreign ws2_32 { WSAGetOverlappedResult :: proc(s: SOCKET, lpOverlapped: ^OVERLAPPED, lpcbTransfer: ^DWORD, fWait: BOOL, lpdwFlags: ^DWORD) -> BOOL --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket) socket :: proc( - af: c_int, - type: c_int, + af: c_int, + type: c_int, protocol: c_int, ) -> SOCKET --- @@ -197,20 +197,20 @@ foreign ws2_32 { send :: proc(socket: SOCKET, buf: rawptr, len: c_int, flags: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recvfrom) recvfrom :: proc( - socket: SOCKET, - buf: rawptr, - len: c_int, - flags: c_int, - addr: ^SOCKADDR_STORAGE_LH, + socket: SOCKET, + buf: rawptr, + len: c_int, + flags: c_int, + addr: ^SOCKADDR_STORAGE_LH, addrlen: ^c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-sendto) sendto :: proc( - socket: SOCKET, - buf: rawptr, - len: c_int, - flags: c_int, - addr: ^SOCKADDR_STORAGE_LH, + socket: SOCKET, + buf: rawptr, + len: c_int, + flags: c_int, + addr: ^SOCKADDR_STORAGE_LH, addrlen: c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-shutdown) @@ -220,11 +220,11 @@ foreign ws2_32 { // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt) setsockopt :: proc( - s: SOCKET, - level: c_int, + s: SOCKET, + level: c_int, optname: c_int, - optval: rawptr, - optlen: c_int, + optval: rawptr, + optlen: c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockname) getsockname :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, address_len: ^c_int) -> c_int --- @@ -238,10 +238,10 @@ foreign ws2_32 { connect :: proc(socket: SOCKET, address: ^SOCKADDR_STORAGE_LH, len: c_int) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-getaddrinfo) getaddrinfo :: proc( - node: cstring, + node: cstring, service: cstring, - hints: ^ADDRINFOA, - res: ^^ADDRINFOA, + hints: ^ADDRINFOA, + res: ^^ADDRINFOA, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-freeaddrinfo) freeaddrinfo :: proc(res: ^ADDRINFOA) --- @@ -261,19 +261,19 @@ foreign ws2_32 { lpHandle: LPHANDLE) -> INT --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select) select :: proc( - nfds: c_int, - readfds: ^fd_set, - writefds: ^fd_set, - exceptfds: ^fd_set, - timeout: ^timeval, + nfds: c_int, + readfds: [^]fd_set, + writefds: [^]fd_set, + exceptfds: [^]fd_set, + timeout: ^timeval, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-getsockopt) getsockopt :: proc( - s: SOCKET, - level: c_int, + s: SOCKET, + level: c_int, optname: c_int, - optval: ^c_char, - optlen: ^c_int, + optval: [^]c_char, + optlen: ^c_int, ) -> c_int --- // [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-ntohl) ntohl :: proc(netlong: c_ulong) -> c_ulong --- diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin index 0089f88cb..c0c758c41 100644 --- a/core/sys/windows/xinput.odin +++ b/core/sys/windows/xinput.odin @@ -199,12 +199,12 @@ XINPUT_KEYSTROKE :: struct { // XInput APIs @(default_calling_convention = "system") foreign xinput { - XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- - XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- - XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- - XInputEnable :: proc(enable: BOOL) --- - XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- - XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- - XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- + XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- + XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- + XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- + XInputEnable :: proc(enable: BOOL) --- + XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- + XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- + XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error --- } From 57c7ae1bd9eb2160afc0cf6d85c3e16781e9a439 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 2 Jan 2026 11:35:44 +0000 Subject: [PATCH 063/212] Minor fixes to formatting and types --- core/sys/windows/comctl32.odin | 8 ++++---- core/sys/windows/xinput.odin | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 3418c7649..28fab53be 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -1609,9 +1609,9 @@ LPTV_ITEMEXW :: LPTVITEMEXW TVINSERTSTRUCTW :: struct { hParent: HTREEITEM, hInsertAfter: HTREEITEM, - _: struct #raw_union { - itemex: TVITEMEXW, - item: TV_ITEMW, + using _: struct #raw_union { + itemex: TVITEMEXW, + item: TV_ITEMW, }, } TV_INSERTSTRUCTW :: TVINSERTSTRUCTW @@ -1703,7 +1703,7 @@ TreeView_Expand :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, co } TreeView_GetItemRect :: #force_inline proc "system" (hwnd: HWND, hitem: HTREEITEM, prc: ^RECT, code: UINT) -> BOOL { alias: struct #raw_union { - rc: ^RECT, + rc: ^RECT, hitem: ^HTREEITEM, } diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin index c0c758c41..f8fd45bc9 100644 --- a/core/sys/windows/xinput.odin +++ b/core/sys/windows/xinput.odin @@ -57,9 +57,9 @@ XINPUT_GAMEPAD_BUTTON_BIT :: enum WORD { XINPUT_GAMEPAD_BUTTON :: distinct bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD] // Gamepad thresholds -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849 -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE: SHORT : 8689 -XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30 +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE : SHORT : 7849 +XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE : SHORT : 8689 +XINPUT_GAMEPAD_TRIGGER_THRESHOLD : SHORT : 30 // Flags to pass to XInputGetCapabilities // Corresponds to log2(XINPUT_FLAG_...) From 65b147d4d39c4431ad7ee7e7f856eadc225b195a Mon Sep 17 00:00:00 2001 From: Piotr Doan Date: Fri, 2 Jan 2026 18:58:09 +0100 Subject: [PATCH 064/212] Prefer LPCSTR/LPCWSTR types in DirectX bindings - Replaces [^]u16 parameter types because they are not directly compatible with result of `win32.utf8_to_wstring()` - Replaces some string/wstring types for consistency, similarly as other packages do to match original C declarations and documentation --- vendor/directx/d3d11/d3d11.odin | 55 +++++++-------- vendor/directx/d3d12/d3d12.odin | 67 ++++++++++--------- vendor/directx/d3d_compiler/d3d_compiler.odin | 46 +++++++------ 3 files changed, 87 insertions(+), 81 deletions(-) diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index 835655bbf..517146c8a 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -20,6 +20,7 @@ BOOL :: dxgi.BOOL UINT :: dxgi.UINT INT :: dxgi.INT +LPCSTR :: windows.LPCSTR LPCWSTR :: windows.LPCWSTR RECT :: dxgi.RECT @@ -950,7 +951,7 @@ INPUT_CLASSIFICATION :: enum i32 { } INPUT_ELEMENT_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Format: dxgi.FORMAT, InputSlot: u32, @@ -972,7 +973,7 @@ CULL_MODE :: enum i32 { SO_DECLARATION_ENTRY :: struct { Stream: u32, - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, StartComponent: u8, ComponentCount: u8, @@ -2172,8 +2173,8 @@ IClassLinkage :: struct #raw_union { } IClassLinkage_VTable :: struct { using id3d11devicechild_vtable: IDeviceChild_VTable, - GetClassInstance: proc "system" (this: ^IClassLinkage, pClassInstanceName: cstring, InstanceIndex: u32, ppInstance: ^^IClassInstance) -> HRESULT, - CreateClassInstance: proc "system" (this: ^IClassLinkage, pClassTypeName: cstring, ConstantBufferOffset: u32, ConstantVectorOffset: u32, TextureOffset: u32, SamplerOffset: u32, ppInstance: ^^IClassInstance) -> HRESULT, + GetClassInstance: proc "system" (this: ^IClassLinkage, pClassInstanceName: LPCSTR, InstanceIndex: u32, ppInstance: ^^IClassInstance) -> HRESULT, + CreateClassInstance: proc "system" (this: ^IClassLinkage, pClassTypeName: LPCSTR, ConstantBufferOffset: u32, ConstantVectorOffset: u32, TextureOffset: u32, SamplerOffset: u32, ppInstance: ^^IClassInstance) -> HRESULT, } @@ -3407,7 +3408,7 @@ SHADER_VERSION_TYPE :: enum i32 { } SIGNATURE_PARAMETER_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Register: u32, SystemValueType: NAME, @@ -3421,7 +3422,7 @@ SIGNATURE_PARAMETER_DESC :: struct { } SHADER_BUFFER_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: CBUFFER_TYPE, Variables: u32, Size: u32, @@ -3429,7 +3430,7 @@ SHADER_BUFFER_DESC :: struct { } SHADER_VARIABLE_DESC :: struct { - Name: cstring, + Name: LPCSTR, StartOffset: u32, Size: u32, uFlags: SHADER_VARIABLE_FLAGS, @@ -3448,12 +3449,12 @@ SHADER_TYPE_DESC :: struct { Elements: u32, Members: u32, Offset: u32, - Name: cstring, + Name: LPCSTR, } SHADER_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -3496,7 +3497,7 @@ SHADER_DESC :: struct { } SHADER_INPUT_BIND_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: SHADER_INPUT_TYPE, BindPoint: u32, BindCount: u32, @@ -3508,14 +3509,14 @@ SHADER_INPUT_BIND_DESC :: struct { } LIBRARY_DESC :: struct { - Creator: cstring, + Creator: LPCSTR, Flags: u32, FunctionCount: u32, } FUNCTION_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -3545,7 +3546,7 @@ FUNCTION_DESC :: struct { MinFeatureLevel: FEATURE_LEVEL, RequiredFeatureFlags: SHADER_REQUIRES_FLAGS, - Name: cstring, + Name: LPCSTR, FunctionParameterCount: i32, HasReturn: BOOL, Has10Level9VertexShader: BOOL, @@ -3553,8 +3554,8 @@ FUNCTION_DESC :: struct { } PARAMETER_DESC :: struct { - Name: cstring, - SemanticName: cstring, + Name: LPCSTR, + SemanticName: LPCSTR, Type: SHADER_VARIABLE_TYPE, Class: SHADER_VARIABLE_CLASS, Rows: u32, @@ -3576,8 +3577,8 @@ IShaderReflectionType :: struct { IShaderReflectionType_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionType, pDesc: ^SHADER_TYPE_DESC) -> HRESULT, GetMemberTypeByIndex: proc "system" (this: ^IShaderReflectionType, Index: u32) -> ^IShaderReflectionType, - GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: cstring) -> ^IShaderReflectionType, - GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> cstring, + GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: LPCSTR) -> ^IShaderReflectionType, + GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> LPCSTR, IsEqual: proc "system" (this: ^IShaderReflectionType, pType: ^IShaderReflectionType) -> HRESULT, GetSubType: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, GetBaseClass: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, @@ -3607,7 +3608,7 @@ IShaderReflectionConstantBuffer :: struct { IShaderReflectionConstantBuffer_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionConstantBuffer, pDesc: ^SHADER_BUFFER_DESC) -> HRESULT, GetVariableByIndex: proc "system" (this: ^IShaderReflectionConstantBuffer, Index: u32) -> ^IShaderReflectionVariable, - GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: cstring) -> ^IShaderReflectionVariable, + GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: LPCSTR) -> ^IShaderReflectionVariable, } @@ -3621,13 +3622,13 @@ IShaderReflection_VTable :: struct { using iunknown_vtable: IUnknown_VTable, GetDesc: proc "system" (this: ^IShaderReflection, pDesc: ^SHADER_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IShaderReflection, Index: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IShaderReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetInputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetOutputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetPatchConstantParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetMovInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetMovcInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetConversionInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, @@ -3661,10 +3662,10 @@ IFunctionReflection :: struct { IFunctionReflection_VTable :: struct { GetDesc: proc "system" (this: ^IFunctionReflection, pDesc: ^FUNCTION_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IFunctionReflection, BufferIndex: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IFunctionReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetFunctionParameter: proc "system" (this: ^IFunctionReflection, ParameterIndex: i32) -> ^IFunctionParameterReflection, } @@ -3691,7 +3692,7 @@ IFunctionLinkingGraph_VTable :: struct { CreateModuleInstance: proc "system" (this: ^IFunctionLinkingGraph, ppModuleInstance: ^^IModuleInstance, ppErrorBuffer: ^^IBlob) -> HRESULT, SetInputSignature: proc "system" (this: ^IFunctionLinkingGraph, pInputParameters: [^]PARAMETER_DESC, cInputParameters: u32, ppInputNode: ^^ILinkingNode) -> HRESULT, SetOutputSignature: proc "system" (this: ^IFunctionLinkingGraph, pOutputParameters: [^]PARAMETER_DESC, cOutputParameters: u32, ppOutputNode: ^^ILinkingNode) -> HRESULT, - CallFunction: proc "system" (this: ^IFunctionLinkingGraph, pModuleInstanceNamespace: cstring, pModuleWithFunctionPrototype: ^IModule, pFunctionName: cstring, ppCallNode: ^^ILinkingNode) -> HRESULT, + CallFunction: proc "system" (this: ^IFunctionLinkingGraph, pModuleInstanceNamespace: LPCSTR, pModuleWithFunctionPrototype: ^IModule, pFunctionName: LPCSTR, ppCallNode: ^^ILinkingNode) -> HRESULT, PassValue: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pDstNode: ^ILinkingNode, DstParameterIndex: i32) -> HRESULT, PassValueWithSwizzle: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pSrcSwizzle: ^u8, pDstNode: ^ILinkingNode, DstParameterIndex: i32, pDstSwizzle: ^u8) -> HRESULT, GetLastError: proc "system" (this: ^IFunctionLinkingGraph, ppErrorBuffer: ^^IBlob) -> HRESULT, @@ -3814,8 +3815,8 @@ IInfoQueue_VTable :: struct { PushRetrievalFilter: proc "system" (this: ^IInfoQueue, pFilter: ^INFO_QUEUE_FILTER) -> HRESULT, PopRetrievalFilter: proc "system" (this: ^IInfoQueue), GetRetrievalFilterStackSize: proc "system" (this: ^IInfoQueue) -> u64, - AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring) -> HRESULT, - AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: cstring) -> HRESULT, + AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR) -> HRESULT, + AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: LPCSTR) -> HRESULT, SetBreakOnCategory: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, bEnable: BOOL) -> HRESULT, SetBreakOnSeverity: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, bEnable: BOOL) -> HRESULT, SetBreakOnID: proc "system" (this: ^IInfoQueue, ID: MESSAGE_ID, bEnable: BOOL) -> HRESULT, diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index a0e020d1a..efa323733 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -23,6 +23,7 @@ BOOL :: dxgi.BOOL RECT :: dxgi.RECT +LPCSTR :: win32.LPCSTR LPCWSTR :: win32.LPCWSTR IModuleInstance :: d3d_compiler.ID3D11ModuleInstance @@ -467,7 +468,7 @@ INPUT_CLASSIFICATION :: enum i32 { } INPUT_ELEMENT_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Format: dxgi.FORMAT, InputSlot: u32, @@ -489,7 +490,7 @@ CULL_MODE :: enum i32 { SO_DECLARATION_ENTRY :: struct { Stream: u32, - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, StartComponent: u8, ComponentCount: u8, @@ -3153,13 +3154,13 @@ EXISTING_COLLECTION_DESC :: struct { SUBOBJECT_TO_EXPORTS_ASSOCIATION :: struct { pSubobjectToAssociate: ^STATE_SUBOBJECT, NumExports: u32, - pExports: [^]cstring16 `fmt:"v,NumExports"`, + pExports: [^]LPCWSTR `fmt:"v,NumExports"`, } DXIL_SUBOBJECT_TO_EXPORTS_ASSOCIATION :: struct { - SubobjectToAssociate: cstring16, + SubobjectToAssociate: LPCWSTR, NumExports: u32, - pExports: [^]cstring16 `fmt:"v,NumExports"`, + pExports: [^]LPCWSTR `fmt:"v,NumExports"`, } HIT_GROUP_TYPE :: enum i32 { @@ -3168,11 +3169,11 @@ HIT_GROUP_TYPE :: enum i32 { } HIT_GROUP_DESC :: struct { - HitGroupExport: cstring16, + HitGroupExport: LPCWSTR, Type: HIT_GROUP_TYPE, - AnyHitShaderImport: cstring16, - ClosestHitShaderImport: cstring16, - IntersectionShaderImport: cstring16, + AnyHitShaderImport: LPCWSTR, + ClosestHitShaderImport: LPCWSTR, + IntersectionShaderImport: LPCWSTR, } RAYTRACING_SHADER_CONFIG :: struct { @@ -5222,8 +5223,8 @@ IInfoQueue_VTable :: struct { PushRetrievalFilter: proc "system" (this: ^IInfoQueue, pFilter: ^INFO_QUEUE_FILTER) -> HRESULT, PopRetrievalFilter: proc "system" (this: ^IInfoQueue), GetRetrievalFilterStackSize: proc "system" (this: ^IInfoQueue) -> u32, - AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring) -> HRESULT, - AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: cstring) -> HRESULT, + AddMessage: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR) -> HRESULT, + AddApplicationMessage: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, pDescription: LPCSTR) -> HRESULT, SetBreakOnCategory: proc "system" (this: ^IInfoQueue, Category: MESSAGE_CATEGORY, bEnable: BOOL) -> HRESULT, SetBreakOnSeverity: proc "system" (this: ^IInfoQueue, Severity: MESSAGE_SEVERITY, bEnable: BOOL) -> HRESULT, SetBreakOnID: proc "system" (this: ^IInfoQueue, ID: MESSAGE_ID, bEnable: BOOL) -> HRESULT, @@ -5239,7 +5240,7 @@ MESSAGE_CALLBACK_FLAG :: enum { IGNORE_FILTERS = 0, } -PFN_MESSAGE_CALLBACK :: #type proc "c" (Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: cstring, pContext: rawptr) +PFN_MESSAGE_CALLBACK :: #type proc "c" (Category: MESSAGE_CATEGORY, Severity: MESSAGE_SEVERITY, ID: MESSAGE_ID, pDescription: LPCSTR, pContext: rawptr) IInfoQueue1_UUID_STRING :: "2852dd88-b484-4c0c-b6b1-67168500e600" IInfoQueue1_UUID := &IID{0x2852dd88, 0xb484, 0x4c0c, {0xb6, 0xb1, 0x67, 0x16, 0x85, 0x00, 0xe6, 0x00}} @@ -5262,7 +5263,7 @@ ISDKConfiguration :: struct #raw_union { } ISDKConfiguration_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - SetSDKVersion: proc "system" (this: ^ISDKConfiguration, SDKVersion: u32, SDKPath: cstring) -> HRESULT, + SetSDKVersion: proc "system" (this: ^ISDKConfiguration, SDKVersion: u32, SDKPath: LPCSTR) -> HRESULT, } @@ -5361,7 +5362,7 @@ shver_get_minor :: proc "contextless" (version: u32) -> u8 { } SIGNATURE_PARAMETER_DESC :: struct { - SemanticName: cstring, + SemanticName: LPCSTR, SemanticIndex: u32, Register: u32, SystemValueType: NAME, @@ -5375,7 +5376,7 @@ SIGNATURE_PARAMETER_DESC :: struct { } SHADER_BUFFER_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: CBUFFER_TYPE, Variables: u32, Size: u32, @@ -5383,7 +5384,7 @@ SHADER_BUFFER_DESC :: struct { } SHADER_VARIABLE_DESC :: struct { - Name: cstring, + Name: LPCSTR, StartOffset: u32, Size: u32, uFlags: u32, @@ -5402,12 +5403,12 @@ SHADER_TYPE_DESC :: struct { Elements: u32, Members: u32, Offset: u32, - Name: cstring, + Name: LPCSTR, } SHADER_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -5450,7 +5451,7 @@ SHADER_DESC :: struct { } SHADER_INPUT_BIND_DESC :: struct { - Name: cstring, + Name: LPCSTR, Type: SHADER_INPUT_TYPE, BindPoint: u32, BindCount: u32, @@ -5497,14 +5498,14 @@ SHADER_REQUIRES :: enum u64 { } LIBRARY_DESC :: struct { - Creator: cstring, + Creator: LPCSTR, Flags: u32, FunctionCount: u32, } FUNCTION_DESC :: struct { Version: u32, - Creator: cstring, + Creator: LPCSTR, Flags: u32, ConstantBuffers: u32, @@ -5534,7 +5535,7 @@ FUNCTION_DESC :: struct { MinFeatureLevel: FEATURE_LEVEL, RequiredFeatureFlags: u64, - Name: cstring, + Name: LPCSTR, FunctionParameterCount: i32, HasReturn: BOOL, Has10Level9VertexShader: BOOL, @@ -5542,8 +5543,8 @@ FUNCTION_DESC :: struct { } PARAMETER_DESC :: struct { - Name: cstring, - SemanticName: cstring, + Name: LPCSTR, + SemanticName: LPCSTR, Type: SHADER_VARIABLE_TYPE, Class: SHADER_VARIABLE_CLASS, Rows: u32, @@ -5565,8 +5566,8 @@ IShaderReflectionType :: struct { IShaderReflectionType_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionType, pDesc: ^SHADER_TYPE_DESC) -> HRESULT, GetMemberTypeByIndex: proc "system" (this: ^IShaderReflectionType, Index: u32) -> ^IShaderReflectionType, - GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: cstring) -> ^IShaderReflectionType, - GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> cstring, + GetMemberTypeByName: proc "system" (this: ^IShaderReflectionType, Name: LPCSTR) -> ^IShaderReflectionType, + GetMemberTypeName: proc "system" (this: ^IShaderReflectionType, Index: u32) -> LPCSTR, IsEqual: proc "system" (this: ^IShaderReflectionType, pType: ^IShaderReflectionType) -> HRESULT, GetSubType: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, GetBaseClass: proc "system" (this: ^IShaderReflectionType) -> ^IShaderReflectionType, @@ -5596,7 +5597,7 @@ IShaderReflectionConstantBuffer :: struct { IShaderReflectionConstantBuffer_VTable :: struct { GetDesc: proc "system" (this: ^IShaderReflectionConstantBuffer, pDesc: ^SHADER_BUFFER_DESC) -> HRESULT, GetVariableByIndex: proc "system" (this: ^IShaderReflectionConstantBuffer, Index: u32) -> ^IShaderReflectionVariable, - GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: cstring) -> ^IShaderReflectionVariable, + GetVariableByName: proc "system" (this: ^IShaderReflectionConstantBuffer, Name: LPCSTR) -> ^IShaderReflectionVariable, } IShaderReflection_UUID_STRING :: "5A58797D-A72C-478D-8BA2-EFC6B0EFE88E" @@ -5609,13 +5610,13 @@ IShaderReflection_VTable :: struct { using iunknown_vtable: IUnknown_VTable, GetDesc: proc "system" (this: ^IShaderReflection, pDesc: ^SHADER_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IShaderReflection, Index: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IShaderReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetInputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetOutputParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, GetPatchConstantParameterDesc: proc "system" (this: ^IShaderReflection, ParameterIndex: u32, pDesc: ^SIGNATURE_PARAMETER_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IShaderReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IShaderReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetMovInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetMovcInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, GetConversionInstructionCount: proc "system" (this: ^IShaderReflection) -> u32, @@ -5648,10 +5649,10 @@ IFunctionReflection :: struct { IFunctionReflection_VTable :: struct { GetDesc: proc "system" (this: ^IFunctionReflection, pDesc: ^FUNCTION_DESC) -> HRESULT, GetConstantBufferByIndex: proc "system" (this: ^IFunctionReflection, BufferIndex: u32) -> ^IShaderReflectionConstantBuffer, - GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionConstantBuffer, + GetConstantBufferByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionConstantBuffer, GetResourceBindingDesc: proc "system" (this: ^IFunctionReflection, ResourceIndex: u32, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, - GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: cstring) -> ^IShaderReflectionVariable, - GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: cstring, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, + GetVariableByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR) -> ^IShaderReflectionVariable, + GetResourceBindingDescByName: proc "system" (this: ^IFunctionReflection, Name: LPCSTR, pDesc: ^SHADER_INPUT_BIND_DESC) -> HRESULT, GetFunctionParameter: proc "system" (this: ^IFunctionReflection, ParameterIndex: i32) -> ^IFunctionParameterReflection, } diff --git a/vendor/directx/d3d_compiler/d3d_compiler.odin b/vendor/directx/d3d_compiler/d3d_compiler.odin index 6f9f3fe89..17a835f23 100644 --- a/vendor/directx/d3d_compiler/d3d_compiler.odin +++ b/vendor/directx/d3d_compiler/d3d_compiler.odin @@ -2,6 +2,7 @@ package directx_d3d_compiler foreign import d3dcompiler "d3dcompiler_47.lib" +import win32 "core:sys/windows" D3DCOMPILER_DLL_A :: "d3dcompiler_47.dll" COMPILER_VERSION :: 47 @@ -16,19 +17,22 @@ HRESULT :: dxgi.HRESULT IUnknown :: dxgi.IUnknown IUnknown_VTable :: dxgi.IUnknown_VTable +LPCSTR :: win32.LPCSTR +LPCWSTR :: win32.LPCWSTR + @(default_calling_convention="system", link_prefix="D3D") foreign d3dcompiler { - ReadFileToBlob :: proc(pFileName: [^]u16, ppContents: ^^ID3DBlob) -> HRESULT --- - WriteBlobToFile :: proc(pBlob: ^ID3DBlob, pFileName: [^]u16, bOverwrite: BOOL) -> HRESULT --- - Compile :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - Compile2 :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, SecondaryDataFlags: u32, pSecondaryData: rawptr, SecondaryDataSize: SIZE_T, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - CompileFromFile :: proc(pFileName: [^]u16, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: cstring, pTarget: cstring, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- - Preprocess :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: cstring, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, ppCodeText: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + ReadFileToBlob :: proc(pFileName: LPCWSTR, ppContents: ^^ID3DBlob) -> HRESULT --- + WriteBlobToFile :: proc(pBlob: ^ID3DBlob, pFileName: LPCWSTR, bOverwrite: BOOL) -> HRESULT --- + Compile :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + Compile2 :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, SecondaryDataFlags: u32, pSecondaryData: rawptr, SecondaryDataSize: SIZE_T, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + CompileFromFile :: proc(pFileName: LPCWSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, pEntrypoint: LPCSTR, pTarget: LPCSTR, Flags1: u32, Flags2: u32, ppCode: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- + Preprocess :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pSourceName: LPCSTR, pDefines: ^SHADER_MACRO, pInclude: ^ID3DInclude, ppCodeText: ^^ID3DBlob, ppErrorMsgs: ^^ID3DBlob) -> HRESULT --- GetDebugInfo :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, ppDebugInfo: ^^ID3DBlob) -> HRESULT --- Reflect :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, pInterface: ^IID, ppReflector: ^rawptr) -> HRESULT --- ReflectLibrary :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, riid: ^IID, ppReflector: ^rawptr) -> HRESULT --- - Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, ppDisassembly: ^^ID3DBlob) -> HRESULT --- - DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: cstring, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT --- + Disassemble :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, ppDisassembly: ^^ID3DBlob) -> HRESULT --- + DisassembleRegion :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, szComments: LPCSTR, StartByteOffset: SIZE_T, NumInsts: SIZE_T, pFinishByteOffset: ^SIZE_T, ppDisassembly: ^^ID3DBlob) -> HRESULT --- CreateLinker :: proc(ppLinker: ^^ID3D11Linker) -> HRESULT --- LoadModule :: proc(pSrcData: rawptr, cbSrcDataSize: SIZE_T, ppModule: ^^ID3D11Module) -> HRESULT --- GetTraceInstructionOffsets :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Flags: u32, StartInstIndex: SIZE_T, NumInsts: SIZE_T, pOffsets: ^SIZE_T, pTotalInsts: ^SIZE_T) -> HRESULT --- @@ -113,8 +117,8 @@ GET_INST_OFFSETS_INCLUDE_NON_EXECUTABLE :: 0x00000001 COMPRESS_SHADER_KEEP_ALL_PARTS :: 0x00000001 SHADER_MACRO :: struct { - Name: cstring, - Definition: cstring, + Name: LPCSTR, + Definition: LPCSTR, } ID3D10Blob_UUID_STRING :: "8BA5FB08-5195-40E2-AC58-0D989C3A0102" @@ -146,7 +150,7 @@ ID3DInclude :: struct { vtable: ^ID3DInclude_VTable, } ID3DInclude_VTable :: struct { - Open: proc "system" (this: ^ID3DInclude, IncludeType: INCLUDE_TYPE, pFileName: cstring, pParentData: rawptr, ppData: ^rawptr, pBytes: ^u32) -> HRESULT, + Open: proc "system" (this: ^ID3DInclude, IncludeType: INCLUDE_TYPE, pFileName: LPCSTR, pParentData: rawptr, ppData: ^rawptr, pBytes: ^u32) -> HRESULT, Close: proc "system" (this: ^ID3DInclude, pData: rawptr) -> HRESULT, } @@ -160,7 +164,7 @@ ID3D11Module :: struct #raw_union { } ID3D11Module_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - CreateInstance: proc "system" (this: ^ID3D11Module, pNamespace: cstring, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT, + CreateInstance: proc "system" (this: ^ID3D11Module, pNamespace: LPCSTR, ppModuleInstance: ^^ID3D11ModuleInstance) -> HRESULT, } @@ -171,15 +175,15 @@ ID3D11ModuleInstance :: struct #raw_union { ID3D11ModuleInstance_VTable :: struct { using iunknown_vtable: IUnknown_VTable, BindConstantBuffer: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, - BindConstantBufferByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, + BindConstantBufferByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, cbDstOffset: u32) -> HRESULT, BindResource: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindResourceByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindResourceByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindSampler: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindSamplerByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindSamplerByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSlot: u32, uDstSlot: u32, uCount: u32) -> HRESULT, - BindUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pName: cstring, uDstSlot: u32, uCount: u32) -> HRESULT, + BindUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pName: LPCSTR, uDstSlot: u32, uCount: u32) -> HRESULT, BindResourceAsUnorderedAccessView: proc "system" (this: ^ID3D11ModuleInstance, uSrcSrvSlot: u32, uDstUavSlot: u32, uCount: u32) -> HRESULT, - BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pSrvName: cstring, uDstUavSlot: u32, uCount: u32) -> HRESULT, + BindResourceAsUnorderedAccessViewByName: proc "system" (this: ^ID3D11ModuleInstance, pSrvName: LPCSTR, uDstUavSlot: u32, uCount: u32) -> HRESULT, } @@ -189,15 +193,15 @@ ID3D11Linker :: struct #raw_union { } ID3D11Linker_VTable :: struct { using iunknown_vtable: IUnknown_VTable, - Link: proc "system" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: cstring, pTargetName: cstring, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, + Link: proc "system" (this: ^ID3D11Linker, pEntry: ^ID3D11ModuleInstance, pEntryName: LPCSTR, pTargetName: LPCSTR, uFlags: u32, ppShaderBlob: ^^ID3DBlob, ppErrorBuffer: ^^ID3DBlob) -> HRESULT, UseLibrary: proc "system" (this: ^ID3D11Linker, pLibraryMI: ^ID3D11ModuleInstance) -> HRESULT, AddClipPlaneFromCBuffer: proc "system" (this: ^ID3D11Linker, uCBufferSlot: u32, uCBufferEntry: u32) -> HRESULT, } -pD3DCompile :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: cstring, a6: cstring, a7: u32, a8: u32, a9: ^^ID3DBlob, a10: ^^ID3DBlob) -> HRESULT -pD3DPreprocess :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: cstring, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: ^^ID3DBlob, a6: ^^ID3DBlob) -> HRESULT -pD3DDisassemble :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: u32, a3: cstring, a4: ^^ID3DBlob) -> HRESULT +pD3DCompile :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: LPCSTR, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: LPCSTR, a6: LPCSTR, a7: u32, a8: u32, a9: ^^ID3DBlob, a10: ^^ID3DBlob) -> HRESULT +pD3DPreprocess :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: LPCSTR, a3: ^SHADER_MACRO, a4: ^ID3DInclude, a5: ^^ID3DBlob, a6: ^^ID3DBlob) -> HRESULT +pD3DDisassemble :: #type proc "c" (a0: rawptr, a1: SIZE_T, a2: u32, a3: LPCSTR, a4: ^^ID3DBlob) -> HRESULT D3DCOMPILER_STRIP_FLAGS :: distinct bit_set[D3DCOMPILER_STRIP_FLAG; u32] D3DCOMPILER_STRIP_FLAG :: enum u32 { From ed52393c7c4b13781574416da8dbb47398b0abf3 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 2 Jan 2026 13:48:23 -0500 Subject: [PATCH 065/212] [vendor/sdl3] update to sdl 3.4.0 [vendor/sdl3] updated lib files [vendor/sdl3] typo [vendor/sdl3] typo [vendor/sdl3] spacing [vendor/sdl3] whitespace [vendor/sdl3] whitespace --- vendor/sdl3/SDL3.dll | Bin 2462720 -> 2788352 bytes vendor/sdl3/SDL3.lib | Bin 269054 -> 283572 bytes vendor/sdl3/include/SDL.h | 3 +- vendor/sdl3/include/SDL_assert.h | 47 +- vendor/sdl3/include/SDL_atomic.h | 18 + vendor/sdl3/include/SDL_audio.h | 179 +++++++- vendor/sdl3/include/SDL_begin_code.h | 75 +++- vendor/sdl3/include/SDL_camera.h | 28 +- vendor/sdl3/include/SDL_clipboard.h | 36 +- vendor/sdl3/include/SDL_cpuinfo.h | 21 + vendor/sdl3/include/SDL_dialog.h | 10 +- vendor/sdl3/include/SDL_dlopennote.h | 234 ++++++++++ vendor/sdl3/include/SDL_endian.h | 8 +- vendor/sdl3/include/SDL_events.h | 91 +++- vendor/sdl3/include/SDL_filesystem.h | 37 +- vendor/sdl3/include/SDL_gamepad.h | 171 +++++++- vendor/sdl3/include/SDL_gpu.h | 475 +++++++++++++++++--- vendor/sdl3/include/SDL_haptic.h | 72 +-- vendor/sdl3/include/SDL_hidapi.h | 19 + vendor/sdl3/include/SDL_hints.h | 405 +++++++++++++++-- vendor/sdl3/include/SDL_init.h | 2 +- vendor/sdl3/include/SDL_intrin.h | 7 +- vendor/sdl3/include/SDL_iostream.h | 149 ++++--- vendor/sdl3/include/SDL_joystick.h | 187 +++++++- vendor/sdl3/include/SDL_keyboard.h | 3 +- vendor/sdl3/include/SDL_keycode.h | 8 +- vendor/sdl3/include/SDL_log.h | 4 +- vendor/sdl3/include/SDL_main.h | 48 +- vendor/sdl3/include/SDL_mouse.h | 144 +++++- vendor/sdl3/include/SDL_mutex.h | 8 +- vendor/sdl3/include/SDL_pen.h | 95 +++- vendor/sdl3/include/SDL_pixels.h | 12 +- vendor/sdl3/include/SDL_platform_defines.h | 27 +- vendor/sdl3/include/SDL_power.h | 4 +- vendor/sdl3/include/SDL_process.h | 11 + vendor/sdl3/include/SDL_properties.h | 31 +- vendor/sdl3/include/SDL_rect.h | 17 +- vendor/sdl3/include/SDL_render.h | 481 ++++++++++++++++++--- vendor/sdl3/include/SDL_revision.h | 39 +- vendor/sdl3/include/SDL_scancode.h | 2 +- vendor/sdl3/include/SDL_sensor.h | 3 +- vendor/sdl3/include/SDL_stdinc.h | 73 +++- vendor/sdl3/include/SDL_storage.h | 4 + vendor/sdl3/include/SDL_surface.h | 300 +++++++++++-- vendor/sdl3/include/SDL_system.h | 4 +- vendor/sdl3/include/SDL_test_common.h | 4 + vendor/sdl3/include/SDL_test_compare.h | 1 + vendor/sdl3/include/SDL_test_log.h | 8 + vendor/sdl3/include/SDL_thread.h | 3 +- vendor/sdl3/include/SDL_timer.h | 12 +- vendor/sdl3/include/SDL_version.h | 13 +- vendor/sdl3/include/SDL_video.h | 253 +++++++++-- vendor/sdl3/include/SDL_vulkan.h | 6 +- vendor/sdl3/sdl3_atomic.odin | 3 +- vendor/sdl3/sdl3_audio.odin | 11 +- vendor/sdl3/sdl3_camera.odin | 10 +- vendor/sdl3/sdl3_cpuinfo.odin | 3 +- vendor/sdl3/sdl3_events.odin | 65 ++- vendor/sdl3/sdl3_gpu.odin | 57 ++- vendor/sdl3/sdl3_hidapi.odin | 4 +- vendor/sdl3/sdl3_hints.odin | 20 +- vendor/sdl3/sdl3_iostream.odin | 1 + vendor/sdl3/sdl3_mouse.odin | 11 +- vendor/sdl3/sdl3_pen.odin | 29 +- vendor/sdl3/sdl3_pixels.odin | 6 +- vendor/sdl3/sdl3_process.odin | 4 +- vendor/sdl3/sdl3_render.odin | 102 ++++- vendor/sdl3/sdl3_surface.odin | 22 +- vendor/sdl3/sdl3_video.odin | 26 +- 69 files changed, 3659 insertions(+), 607 deletions(-) create mode 100644 vendor/sdl3/include/SDL_dlopennote.h diff --git a/vendor/sdl3/SDL3.dll b/vendor/sdl3/SDL3.dll index 63f5b22ecbe711493313acd305ed1b8dd36b59dd..510825b26ac432445d6b5bc39d54d4bd115132ed 100644 GIT binary patch literal 2788352 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�RXG+|X)5 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 z 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 j(z<>X-4nx8Kye#R5x_Iq2Ww|0 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%0A|EPs;U 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%0DmsjVsZrMOX1RqG%hd@)F+!Qs97fj#OK#WmxL;gH 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

RAo9-s&>bfA(+=zB3n{uN3*f=Y@=XE2gf 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 z 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 K=}fgU|^%$~T36xGx=b#`dsIq3yP% zpLY!b>DCEZHJR4wOsTOg1>^L)~x zKXiv&BxgKEWf_l8fvckkd&AB;706bvd1+;ModoD6n!Z%`e3|YVuKO@R`q*+q`uj|J zS!$g0(v9j$(wljvr&t^q!Cyy>SLNKcRHW|hC6dDZV(eW*y$B5jAE0oP3g(Ne2C@Fr zdOS6wCq9v{L26h%oYUY|T@UK2zYp3|J>2BA>f(^&6HX2_ZvMAHwB3{}1up{8Zek@c z=fteqCkYplGuzG+=W${E2}ypHqV;(lE&<_+tTt84T2i_(SitLoGCGNAEb6>hHJxi! zXRMT&&C0*u@_h|692CQdD)NX!70KjF%Ji6%Y2W=$rVb8jl;KM$jRWy%P@a4BvVb~A z4Y*Cv4)_eleaE~J*GL|~3Ru)5>K^T23&o#y@PMzaPC7t`Ua)k`Vcn7maql(gBzCBo z<@|i#dGpbdUOMFw`l4pk-CJ1Ya6=K#rl`Bj%Pe(=d6}V5 zzkMK~kFZ5eiluwcOm#5{;YA{M=9cQ@i$2uUg()U!RK70Ien{T?==V02t$&3MF}0?) z|B77;X!w*6_ejpt4J?LNA7S$8$Qp@cSB0r36DoGiL%!g z57FLw*}^3y5;!uY>ah`l^cJxkMgeP#hlLrN#+g4li^DlFdl7w-&RX+6>?s{)zin@= zz@7it@keAQCpRp#s&iJrb)wl%-+3KU8N>_rMs1B?t$Ev8vsFzUDs@RSlUcvG)q|O@ zOxLE{|o_{`wzVGd-Qy@`(A-_5_Uh^mmCi}F_{lc!UI{d{b@|&R-?}oYk|;V z-5$Ljup0R7?lKcBb2z3Eil9bj33!+)B*ME(c!3EQ3lw5T7g`SdP;Pg18c0mjHx|#XmX4sCT3@n=rcZ0 zGRMkf5+%!GrR4f_YYnI0VeCYOF@ye9cyxs93U_doc8wBW)keU=gQ2;OF9W%TDI})r zol_0NjE7VMI)~mi2gIXsP8Jbs#6L_Uy7adYV zJs9xT-{`zuSl`WgyUMv#;b7p>`kp2%2zB2dxC)r+x0{0j^O=z{Jw%oa{6bckYZCv@V0f`iH+Wf$G6RDNyU+lP{W6zgVww& zNPFptaN`fzEAGz!r{fT8o$QRFBi6~*Ct9pEp3y;COA$R|9l|u+tJ5FaMV{qrV&7uf zZ3O6^v&!3KiXx^kr}u2(DwD*eg{y|ndMg@Ht6n1p4gR)?9=ysn;>o1r$1Ja$GACr0|L z_q(^7bierz=^}l9j*<~*X0Ky890xS&PLgU`B(xw7N^E{R{)|n#$DOR(9k{+`)cqT! z&As9*&+c>eA!EO8@8Wzd-;89hx7JMar>f%wnl*X?I#Na;xBx)Zrmxe*8`c-4M+zZgMZZEDGwFP60 z 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%0D)dztCz5lY^Q6 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