From 6ff9f0a45bc39eff7d0fb6f58ab9d3382af8cd6e Mon Sep 17 00:00:00 2001 From: Not-Nik Date: Fri, 31 May 2024 20:22:57 +0200 Subject: [PATCH] Use packed struct for ConfigFlags (#93) --- examples/core/window_flags.zig | 78 ++++++++++++++++----------------- lib/generate_functions.py | 4 +- lib/preludes/raylib-prelude.zig | 51 +++++++++++++-------- lib/raylib-ext.zig | 2 +- lib/raylib.zig | 55 ++++++++++++++--------- 5 files changed, 110 insertions(+), 80 deletions(-) diff --git a/examples/core/window_flags.zig b/examples/core/window_flags.zig index 7be231f..bbecbaa 100644 --- a/examples/core/window_flags.zig +++ b/examples/core/window_flags.zig @@ -62,74 +62,74 @@ pub fn main() anyerror!void { if (rl.isKeyPressed(.key_f)) rl.toggleFullscreen(); // Modifies window size when scaling! if (rl.isKeyPressed(.key_r)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_resizable))) { - rl.clearWindowState(.flag_window_resizable); + if (rl.isWindowState(rl.ConfigFlags { .window_resizable = true })) { + rl.clearWindowState(rl.ConfigFlags { .window_resizable = true }); } else { - rl.setWindowState(.flag_window_resizable); + rl.setWindowState(rl.ConfigFlags { .window_resizable = true }); } } if (rl.isKeyPressed(.key_d)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_undecorated))) { - rl.clearWindowState(.flag_window_undecorated); + if (rl.isWindowState(rl.ConfigFlags { .window_undecorated = true })) { + rl.clearWindowState(rl.ConfigFlags { .window_undecorated = true }); } else { - rl.setWindowState(.flag_window_undecorated); + rl.setWindowState(rl.ConfigFlags { .window_undecorated = true }); } } if (rl.isKeyPressed(.key_h)) { - if (!rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_hidden))) { - rl.setWindowState(.flag_window_hidden); + if (!rl.isWindowState(rl.ConfigFlags { .window_hidden = true })) { + rl.setWindowState(rl.ConfigFlags { .window_hidden = true }); } frames_counter = 0; } - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_hidden))) { + if (rl.isWindowState(rl.ConfigFlags { .window_hidden = true })) { frames_counter += 1; - if (frames_counter >= 240) rl.clearWindowState(.flag_window_hidden); // Show window after 3 seconds + if (frames_counter >= 240) rl.clearWindowState(rl.ConfigFlags { .window_hidden = true }); // Show window after 3 seconds } if (rl.isKeyPressed(.key_n)) { - if (!rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_minimized))) { + if (!rl.isWindowState(rl.ConfigFlags { .window_minimized = true })) { rl.minimizeWindow(); } frames_counter = 0; } - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_minimized))) { + if (rl.isWindowState(rl.ConfigFlags { .window_minimized = true })) { frames_counter += 1; if (frames_counter >= 240) rl.restoreWindow(); // Restore window after 3 seconds } if (rl.isKeyPressed(.key_m)) { // NOTE: Requires `flag_window_resizable` enabled! - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_maximized))) { + if (rl.isWindowState(rl.ConfigFlags { .window_maximized = true })) { rl.restoreWindow(); } else rl.maximizeWindow(); } if (rl.isKeyPressed(.key_u)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_unfocused))) { - rl.clearWindowState(.flag_window_unfocused); - } else rl.setWindowState(.flag_window_unfocused); + if (rl.isWindowState(rl.ConfigFlags { .window_unfocused = true })) { + rl.clearWindowState(rl.ConfigFlags { .window_unfocused = true }); + } else rl.setWindowState(rl.ConfigFlags { .window_unfocused = true }); } if (rl.isKeyPressed(.key_t)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_topmost))) { - rl.clearWindowState(.flag_window_topmost); - } else rl.setWindowState(.flag_window_topmost); + if (rl.isWindowState(rl.ConfigFlags { .window_topmost = true })) { + rl.clearWindowState(rl.ConfigFlags { .window_topmost = true }); + } else rl.setWindowState(rl.ConfigFlags { .window_topmost = true }); } if (rl.isKeyPressed(.key_a)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_always_run))) { - rl.clearWindowState(.flag_window_always_run); - } else rl.setWindowState(.flag_window_always_run); + if (rl.isWindowState(rl.ConfigFlags { .window_always_run = true })) { + rl.clearWindowState(rl.ConfigFlags { .window_always_run = true }); + } else rl.setWindowState(rl.ConfigFlags { .window_always_run = true }); } if (rl.isKeyPressed(.key_v)) { - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_vsync_hint))) { - rl.clearWindowState(.flag_vsync_hint); - } else rl.setWindowState(.flag_vsync_hint); + if (rl.isWindowState(rl.ConfigFlags { .vsync_hint = true })) { + rl.clearWindowState(rl.ConfigFlags { .vsync_hint = true }); + } else rl.setWindowState(rl.ConfigFlags { .vsync_hint = true }); } // Bouncing ball logic @@ -149,7 +149,7 @@ pub fn main() anyerror!void { rl.beginDrawing(); defer rl.endDrawing(); - if (rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_transparent))) { + if (rl.isWindowState(rl.ConfigFlags { .window_transparent = true })) { rl.clearBackground(rl.Color.blank); } else rl.clearBackground(rl.Color.ray_white); @@ -182,7 +182,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[F] flag_fullscreen_mode: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_fullscreen_mode)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .fullscreen_mode = true }))), }), 10, 80, @@ -191,7 +191,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[R] flag_window_resizable: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_resizable)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_resizable = true }))), }), 10, 100, @@ -200,7 +200,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[D] flag_window_undecorated: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_undecorated)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_undecorated = true }))), }), 10, 120, @@ -209,7 +209,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[H] flag_window_hidden: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_hidden)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_hidden = true }))), }), 10, 140, @@ -218,7 +218,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[N] flag_window_minimized: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_minimized)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_minimized = true }))), }), 10, 160, @@ -227,7 +227,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[M] flag_window_maximized: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_maximized)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_maximized = true }))), }), 10, 180, @@ -236,7 +236,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[U] flag_window_unfocused: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_unfocused)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_unfocused = true }))), }), 10, 200, @@ -245,7 +245,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[T] flag_window_topmost: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_topmost)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_topmost = true }))), }), 10, 220, @@ -254,7 +254,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[A] flag_window_always_run: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_always_run)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_always_run = true }))), }), 10, 240, @@ -263,7 +263,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("[V] flag_vsync_hint: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_vsync_hint)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .vsync_hint = true }))), }), 10, 260, @@ -280,7 +280,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("flag_window_highdpi: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_highdpi)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_highdpi = true }))), }), 10, 320, @@ -289,7 +289,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("flag_window_transparent: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_window_transparent)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_transparent = true }))), }), 10, 340, @@ -298,7 +298,7 @@ pub fn main() anyerror!void { ); rl.drawText( rl.textFormat("flag_msaa_4x_hint: %d", .{ - @as(i32, @intFromBool(rl.isWindowState(@intFromEnum(rl.ConfigFlags.flag_msaa_4x_hint)))), + @as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .msaa_4x_hint = true }))), }), 10, 360, diff --git a/lib/generate_functions.py b/lib/generate_functions.py index d3ae863..74328a6 100644 --- a/lib/generate_functions.py +++ b/lib/generate_functions.py @@ -165,9 +165,9 @@ def fix_enums(arg_name, arg_type, func_name): arg_type = "BlendMode" elif arg_name == "gesture": arg_type = "Gesture" - elif arg_name == "flags": + elif arg_name == "flags" or arg_name == "flag": if func_name in [ - "SetWindowState", "ClearWindowState", "SetConfigFlags" + "SetWindowState", "ClearWindowState", "SetConfigFlags", "IsWindowState" ]: arg_type = "ConfigFlags" elif func_name == "SetGesturesEnabled": diff --git a/lib/preludes/raylib-prelude.zig b/lib/preludes/raylib-prelude.zig index c1368dd..b822712 100755 --- a/lib/preludes/raylib-prelude.zig +++ b/lib/preludes/raylib-prelude.zig @@ -805,24 +805,39 @@ pub const AutomationEventList = extern struct { events: [*c]AutomationEvent }; -pub const ConfigFlags = enum(c_int) { - flag_fullscreen_mode = 2, - flag_window_resizable = 4, - flag_window_undecorated = 8, - flag_window_transparent = 16, - flag_msaa_4x_hint = 32, - flag_vsync_hint = 64, - flag_window_hidden = 128, - flag_window_always_run = 256, - flag_window_minimized = 512, - flag_window_maximized = 1024, - flag_window_unfocused = 2048, - flag_window_topmost = 4096, - flag_window_highdpi = 8192, - flag_window_mouse_passthrough = 16384, - flag_borderless_windowed_mode = 32768, - flag_interlaced_hint = 65536, - _, +pub const ConfigFlags = packed struct { + __reserved: bool = false, + fullscreen_mode: bool = false, + window_resizable: bool = false, + window_undecorated: bool = false, + window_transparent: bool = false, + msaa_4x_hint: bool = false, + vsync_hint: bool = false, + window_hidden: bool = false, + window_always_run: bool = false, + window_minimized: bool = false, + window_maximized: bool = false, + window_unfocused: bool = false, + window_topmost: bool = false, + window_highdpi: bool = false, + window_mouse_passthrough: bool = false, + borderless_windowed_mode: bool = false, + interlaced_hint: bool = false, + __reserved2: bool = false, + __reserved3: bool = false, + __reserved4: bool = false, + __reserved5: bool = false, + __reserved6: bool = false, + __reserved7: bool = false, + __reserved8: bool = false, + __reserved9: bool = false, + __reserved10: bool = false, + __reserved11: bool = false, + __reserved12: bool = false, + __reserved13: bool = false, + __reserved14: bool = false, + __reserved15: bool = false, + __reserved16: bool = false, }; pub const TraceLogLevel = enum(c_int) { diff --git a/lib/raylib-ext.zig b/lib/raylib-ext.zig index aaa67b6..b7dc1d3 100644 --- a/lib/raylib-ext.zig +++ b/lib/raylib-ext.zig @@ -12,7 +12,7 @@ pub extern "c" fn IsWindowMinimized() bool; pub extern "c" fn IsWindowMaximized() bool; pub extern "c" fn IsWindowFocused() bool; pub extern "c" fn IsWindowResized() bool; -pub extern "c" fn IsWindowState(flag: c_uint) bool; +pub extern "c" fn IsWindowState(flag: rl.ConfigFlags) bool; pub extern "c" fn SetWindowState(flags: rl.ConfigFlags) void; pub extern "c" fn ClearWindowState(flags: rl.ConfigFlags) void; pub extern "c" fn ToggleFullscreen() void; diff --git a/lib/raylib.zig b/lib/raylib.zig index 24b8b4b..c883ba1 100644 --- a/lib/raylib.zig +++ b/lib/raylib.zig @@ -805,24 +805,39 @@ pub const AutomationEventList = extern struct { events: [*c]AutomationEvent }; -pub const ConfigFlags = enum(c_int) { - flag_fullscreen_mode = 2, - flag_window_resizable = 4, - flag_window_undecorated = 8, - flag_window_transparent = 16, - flag_msaa_4x_hint = 32, - flag_vsync_hint = 64, - flag_window_hidden = 128, - flag_window_always_run = 256, - flag_window_minimized = 512, - flag_window_maximized = 1024, - flag_window_unfocused = 2048, - flag_window_topmost = 4096, - flag_window_highdpi = 8192, - flag_window_mouse_passthrough = 16384, - flag_borderless_windowed_mode = 32768, - flag_interlaced_hint = 65536, - _, +pub const ConfigFlags = packed struct { + __reserved: bool = false, + fullscreen_mode: bool = false, + window_resizable: bool = false, + window_undecorated: bool = false, + window_transparent: bool = false, + msaa_4x_hint: bool = false, + vsync_hint: bool = false, + window_hidden: bool = false, + window_always_run: bool = false, + window_minimized: bool = false, + window_maximized: bool = false, + window_unfocused: bool = false, + window_topmost: bool = false, + window_highdpi: bool = false, + window_mouse_passthrough: bool = false, + borderless_windowed_mode: bool = false, + interlaced_hint: bool = false, + __reserved2: bool = false, + __reserved3: bool = false, + __reserved4: bool = false, + __reserved5: bool = false, + __reserved6: bool = false, + __reserved7: bool = false, + __reserved8: bool = false, + __reserved9: bool = false, + __reserved10: bool = false, + __reserved11: bool = false, + __reserved12: bool = false, + __reserved13: bool = false, + __reserved14: bool = false, + __reserved15: bool = false, + __reserved16: bool = false, }; pub const TraceLogLevel = enum(c_int) { @@ -1500,8 +1515,8 @@ pub fn isWindowResized() bool { return cdef.IsWindowResized(); } -pub fn isWindowState(flag: u32) bool { - return cdef.IsWindowState(@as(c_uint, flag)); +pub fn isWindowState(flag: ConfigFlags) bool { + return cdef.IsWindowState(flag); } pub fn setWindowState(flags: ConfigFlags) void {