Added setKeyboardCallback and update variants
This commit is contained in:
		@@ -13,6 +13,133 @@ pub const Rgb = packed struct {
 | 
				
			|||||||
    _reserved: u8 = 0,
 | 
					    _reserved: u8 = 0,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub const Key = enum(c_int) {
 | 
				
			||||||
 | 
					    unknown = c.KB_KEY_UNKNOWN,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    space = c.KB_KEY_SPACE,
 | 
				
			||||||
 | 
					    apostrophe = c.KB_KEY_APOSTROPHE,
 | 
				
			||||||
 | 
					    comma = c.KB_KEY_COMMA,
 | 
				
			||||||
 | 
					    minus = c.KB_KEY_MINUS,
 | 
				
			||||||
 | 
					    period = c.KB_KEY_PERIOD,
 | 
				
			||||||
 | 
					    slash = c.KB_KEY_SLASH,
 | 
				
			||||||
 | 
					    @"0" = c.KB_KEY_0,
 | 
				
			||||||
 | 
					    @"1" = c.KB_KEY_1,
 | 
				
			||||||
 | 
					    @"2" = c.KB_KEY_2,
 | 
				
			||||||
 | 
					    @"3" = c.KB_KEY_3,
 | 
				
			||||||
 | 
					    @"4" = c.KB_KEY_4,
 | 
				
			||||||
 | 
					    @"5" = c.KB_KEY_5,
 | 
				
			||||||
 | 
					    @"6" = c.KB_KEY_6,
 | 
				
			||||||
 | 
					    @"7" = c.KB_KEY_7,
 | 
				
			||||||
 | 
					    @"8" = c.KB_KEY_8,
 | 
				
			||||||
 | 
					    @"9" = c.KB_KEY_9,
 | 
				
			||||||
 | 
					    semicolon = c.KB_KEY_SEMICOLON,
 | 
				
			||||||
 | 
					    equal = c.KB_KEY_EQUAL,
 | 
				
			||||||
 | 
					    a = c.KB_KEY_A,
 | 
				
			||||||
 | 
					    b = c.KB_KEY_B,
 | 
				
			||||||
 | 
					    c = c.KB_KEY_C,
 | 
				
			||||||
 | 
					    d = c.KB_KEY_D,
 | 
				
			||||||
 | 
					    e = c.KB_KEY_E,
 | 
				
			||||||
 | 
					    f = c.KB_KEY_F,
 | 
				
			||||||
 | 
					    g = c.KB_KEY_G,
 | 
				
			||||||
 | 
					    h = c.KB_KEY_H,
 | 
				
			||||||
 | 
					    i = c.KB_KEY_I,
 | 
				
			||||||
 | 
					    j = c.KB_KEY_J,
 | 
				
			||||||
 | 
					    k = c.KB_KEY_K,
 | 
				
			||||||
 | 
					    l = c.KB_KEY_L,
 | 
				
			||||||
 | 
					    m = c.KB_KEY_M,
 | 
				
			||||||
 | 
					    n = c.KB_KEY_N,
 | 
				
			||||||
 | 
					    o = c.KB_KEY_O,
 | 
				
			||||||
 | 
					    p = c.KB_KEY_P,
 | 
				
			||||||
 | 
					    q = c.KB_KEY_Q,
 | 
				
			||||||
 | 
					    r = c.KB_KEY_R,
 | 
				
			||||||
 | 
					    s = c.KB_KEY_S,
 | 
				
			||||||
 | 
					    t = c.KB_KEY_T,
 | 
				
			||||||
 | 
					    u = c.KB_KEY_U,
 | 
				
			||||||
 | 
					    v = c.KB_KEY_V,
 | 
				
			||||||
 | 
					    w = c.KB_KEY_W,
 | 
				
			||||||
 | 
					    x = c.KB_KEY_X,
 | 
				
			||||||
 | 
					    y = c.KB_KEY_Y,
 | 
				
			||||||
 | 
					    z = c.KB_KEY_Z,
 | 
				
			||||||
 | 
					    left_bracket = c.KB_KEY_LEFT_BRACKET,
 | 
				
			||||||
 | 
					    backslash = c.KB_KEY_BACKSLASH,
 | 
				
			||||||
 | 
					    right_bracket = c.KB_KEY_RIGHT_BRACKET,
 | 
				
			||||||
 | 
					    grave_accent = c.KB_KEY_GRAVE_ACCENT,
 | 
				
			||||||
 | 
					    world_1 = c.KB_KEY_WORLD_1,
 | 
				
			||||||
 | 
					    world_2 = c.KB_KEY_WORLD_2,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    escape = c.KB_KEY_ESCAPE,
 | 
				
			||||||
 | 
					    enter = c.KB_KEY_ENTER,
 | 
				
			||||||
 | 
					    tab = c.KB_KEY_TAB,
 | 
				
			||||||
 | 
					    backspace = c.KB_KEY_BACKSPACE,
 | 
				
			||||||
 | 
					    insert = c.KB_KEY_INSERT,
 | 
				
			||||||
 | 
					    delete = c.KB_KEY_DELETE,
 | 
				
			||||||
 | 
					    right = c.KB_KEY_RIGHT,
 | 
				
			||||||
 | 
					    left = c.KB_KEY_LEFT,
 | 
				
			||||||
 | 
					    down = c.KB_KEY_DOWN,
 | 
				
			||||||
 | 
					    up = c.KB_KEY_UP,
 | 
				
			||||||
 | 
					    page_up = c.KB_KEY_PAGE_UP,
 | 
				
			||||||
 | 
					    page_down = c.KB_KEY_PAGE_DOWN,
 | 
				
			||||||
 | 
					    home = c.KB_KEY_HOME,
 | 
				
			||||||
 | 
					    end = c.KB_KEY_END,
 | 
				
			||||||
 | 
					    caps_lock = c.KB_KEY_CAPS_LOCK,
 | 
				
			||||||
 | 
					    scroll_lock = c.KB_KEY_SCROLL_LOCK,
 | 
				
			||||||
 | 
					    num_lock = c.KB_KEY_NUM_LOCK,
 | 
				
			||||||
 | 
					    print_screen = c.KB_KEY_PRINT_SCREEN,
 | 
				
			||||||
 | 
					    pause = c.KB_KEY_PAUSE,
 | 
				
			||||||
 | 
					    f1 = c.KB_KEY_F1,
 | 
				
			||||||
 | 
					    f2 = c.KB_KEY_F2,
 | 
				
			||||||
 | 
					    f3 = c.KB_KEY_F3,
 | 
				
			||||||
 | 
					    f4 = c.KB_KEY_F4,
 | 
				
			||||||
 | 
					    f5 = c.KB_KEY_F5,
 | 
				
			||||||
 | 
					    f6 = c.KB_KEY_F6,
 | 
				
			||||||
 | 
					    f7 = c.KB_KEY_F7,
 | 
				
			||||||
 | 
					    f8 = c.KB_KEY_F8,
 | 
				
			||||||
 | 
					    f9 = c.KB_KEY_F9,
 | 
				
			||||||
 | 
					    f10 = c.KB_KEY_F10,
 | 
				
			||||||
 | 
					    f11 = c.KB_KEY_F11,
 | 
				
			||||||
 | 
					    f12 = c.KB_KEY_F12,
 | 
				
			||||||
 | 
					    f13 = c.KB_KEY_F13,
 | 
				
			||||||
 | 
					    f14 = c.KB_KEY_F14,
 | 
				
			||||||
 | 
					    f15 = c.KB_KEY_F15,
 | 
				
			||||||
 | 
					    f16 = c.KB_KEY_F16,
 | 
				
			||||||
 | 
					    f17 = c.KB_KEY_F17,
 | 
				
			||||||
 | 
					    f18 = c.KB_KEY_F18,
 | 
				
			||||||
 | 
					    f19 = c.KB_KEY_F19,
 | 
				
			||||||
 | 
					    f20 = c.KB_KEY_F20,
 | 
				
			||||||
 | 
					    f21 = c.KB_KEY_F21,
 | 
				
			||||||
 | 
					    f22 = c.KB_KEY_F22,
 | 
				
			||||||
 | 
					    f23 = c.KB_KEY_F23,
 | 
				
			||||||
 | 
					    f24 = c.KB_KEY_F24,
 | 
				
			||||||
 | 
					    f25 = c.KB_KEY_F25,
 | 
				
			||||||
 | 
					    kp_0 = c.KB_KEY_KP_0,
 | 
				
			||||||
 | 
					    kp_1 = c.KB_KEY_KP_1,
 | 
				
			||||||
 | 
					    kp_2 = c.KB_KEY_KP_2,
 | 
				
			||||||
 | 
					    kp_3 = c.KB_KEY_KP_3,
 | 
				
			||||||
 | 
					    kp_4 = c.KB_KEY_KP_4,
 | 
				
			||||||
 | 
					    kp_5 = c.KB_KEY_KP_5,
 | 
				
			||||||
 | 
					    kp_6 = c.KB_KEY_KP_6,
 | 
				
			||||||
 | 
					    kp_7 = c.KB_KEY_KP_7,
 | 
				
			||||||
 | 
					    kp_8 = c.KB_KEY_KP_8,
 | 
				
			||||||
 | 
					    kp_9 = c.KB_KEY_KP_9,
 | 
				
			||||||
 | 
					    kp_decimal = c.KB_KEY_KP_DECIMAL,
 | 
				
			||||||
 | 
					    kp_divide = c.KB_KEY_KP_DIVIDE,
 | 
				
			||||||
 | 
					    kp_multiply = c.KB_KEY_KP_MULTIPLY,
 | 
				
			||||||
 | 
					    kp_subtract = c.KB_KEY_KP_SUBTRACT,
 | 
				
			||||||
 | 
					    kp_add = c.KB_KEY_KP_ADD,
 | 
				
			||||||
 | 
					    kp_enter = c.KB_KEY_KP_ENTER,
 | 
				
			||||||
 | 
					    kp_equal = c.KB_KEY_KP_EQUAL,
 | 
				
			||||||
 | 
					    left_shift = c.KB_KEY_LEFT_SHIFT,
 | 
				
			||||||
 | 
					    left_control = c.KB_KEY_LEFT_CONTROL,
 | 
				
			||||||
 | 
					    left_alt = c.KB_KEY_LEFT_ALT,
 | 
				
			||||||
 | 
					    left_super = c.KB_KEY_LEFT_SUPER,
 | 
				
			||||||
 | 
					    right_shift = c.KB_KEY_RIGHT_SHIFT,
 | 
				
			||||||
 | 
					    right_control = c.KB_KEY_RIGHT_CONTROL,
 | 
				
			||||||
 | 
					    right_alt = c.KB_KEY_RIGHT_ALT,
 | 
				
			||||||
 | 
					    right_super = c.KB_KEY_RIGHT_SUPER,
 | 
				
			||||||
 | 
					    menu = c.KB_KEY_MENU,
 | 
				
			||||||
 | 
					    _,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub const KeyMod = packed struct {
 | 
					pub const KeyMod = packed struct {
 | 
				
			||||||
    shift: bool = false,
 | 
					    shift: bool = false,
 | 
				
			||||||
    control: bool = false,
 | 
					    control: bool = false,
 | 
				
			||||||
@@ -76,7 +203,20 @@ pub fn Window(comptime TUserData: type) type {
 | 
				
			|||||||
            InternalError,
 | 
					            InternalError,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub const State = enum { ok, exit };
 | 
					        pub const UpdateState = enum {
 | 
				
			||||||
 | 
					            ok,
 | 
				
			||||||
 | 
					            exit,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            pub fn from(state: c.mfb_update_state) UpdateError!UpdateState {
 | 
				
			||||||
 | 
					                return switch (state) {
 | 
				
			||||||
 | 
					                    c.STATE_OK => UpdateState.ok,
 | 
				
			||||||
 | 
					                    c.STATE_EXIT => UpdateState.exit,
 | 
				
			||||||
 | 
					                    c.STATE_INVALID_WINDOW => UpdateError.InvalidWindow,
 | 
				
			||||||
 | 
					                    c.STATE_INVALID_BUFFER => UpdateError.InvalidBuffer,
 | 
				
			||||||
 | 
					                    else => UpdateError.InternalError,
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub const OpenFlags = packed struct {
 | 
					        pub const OpenFlags = packed struct {
 | 
				
			||||||
            resizable: bool = false,
 | 
					            resizable: bool = false,
 | 
				
			||||||
@@ -108,15 +248,16 @@ pub fn Window(comptime TUserData: type) type {
 | 
				
			|||||||
            return c.mfb_wait_sync(self.cwin);
 | 
					            return c.mfb_wait_sync(self.cwin);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn update(self: Window(TUserData), buffer: []Rgb) UpdateError!State {
 | 
					        pub fn update(self: Window(TUserData), buffer: []Rgb) UpdateError!UpdateState {
 | 
				
			||||||
            const rawState = c.mfb_update(self.cwin, @ptrCast(*anyopaque, buffer.ptr));
 | 
					            return UpdateState.from(c.mfb_update(self.cwin, @ptrCast(*anyopaque, buffer.ptr)));
 | 
				
			||||||
            switch (rawState) {
 | 
					        }
 | 
				
			||||||
                c.STATE_OK => return State.ok,
 | 
					
 | 
				
			||||||
                c.STATE_EXIT => return State.exit,
 | 
					        pub fn updateEvents(self: Window(TUserData)) UpdateError!UpdateState {
 | 
				
			||||||
                c.STATE_INVALID_WINDOW => return UpdateError.InvalidWindow,
 | 
					            return UpdateState.from(c.mfb_update_events(self.cwin));
 | 
				
			||||||
                c.STATE_INVALID_BUFFER => return UpdateError.InvalidBuffer,
 | 
					        }
 | 
				
			||||||
                else => return UpdateError.InternalError,
 | 
					
 | 
				
			||||||
            }
 | 
					        pub fn updateEx(self: Window(TUserData), buffer: []Rgb, width: u32, height: u32) UpdateError!UpdateState {
 | 
				
			||||||
 | 
					            return UpdateState.from(c.mfb_update_ex(self.cwin), @ptrCast(*anyopaque, buffer), width, height);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn setUserData(self: Window(TUserData), data: *TUserData) void {
 | 
					        pub fn setUserData(self: Window(TUserData), data: *TUserData) void {
 | 
				
			||||||
@@ -153,6 +294,11 @@ pub fn Window(comptime TUserData: type) type {
 | 
				
			|||||||
            c.mfb_set_mouse_scroll_callback(self.cwin, @ptrCast(c.mfb_mouse_scroll_func, callback));
 | 
					            c.mfb_set_mouse_scroll_callback(self.cwin, @ptrCast(c.mfb_mouse_scroll_func, callback));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pub const KeyboardFunc = fn (win: Window(TUserData), key: Key, key_mod: KeyMod, is_pressed: bool) callconv(.C) void;
 | 
				
			||||||
 | 
					        pub fn setKeyboardCallback(self: Window(TUserData), callback: KeyboardFunc) void {
 | 
				
			||||||
 | 
					            c.mfb_set_keyboard_callback(self.cwin, @ptrCast(c.mfb_keyboard_func, callback));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pub fn setViewport(self: Window(TUserData), offset_x: u32, offset_y: u32, width: u32, height: u32) bool {
 | 
					        pub fn setViewport(self: Window(TUserData), offset_x: u32, offset_y: u32, width: u32, height: u32) bool {
 | 
				
			||||||
            return c.mfb_set_viewport(self.cwin, offset_x, offset_y, width, height);
 | 
					            return c.mfb_set_viewport(self.cwin, offset_x, offset_y, width, height);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								src/main.zig
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								src/main.zig
									
									
									
									
									
								
							@@ -41,6 +41,7 @@ const State = struct {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    rectangle_width: f32 = @intToFloat(f32, Width) / 3.0,
 | 
					    rectangle_width: f32 = @intToFloat(f32, Width) / 3.0,
 | 
				
			||||||
    rectangle_height: f32 = @intToFloat(f32, Height) / 3.0,
 | 
					    rectangle_height: f32 = @intToFloat(f32, Height) / 3.0,
 | 
				
			||||||
 | 
					    paused: bool = false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn init(alloc: std.mem.Allocator, period: f64) !State {
 | 
					    pub fn init(alloc: std.mem.Allocator, period: f64) !State {
 | 
				
			||||||
        var timer = try alloc.create(mfb.Timer);
 | 
					        var timer = try alloc.create(mfb.Timer);
 | 
				
			||||||
@@ -195,6 +196,15 @@ fn handleMouseScroll(win: mfb.Window(State), key_mod: mfb.KeyMod, delta_x: f32,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn handleKeyboard(win: mfb.Window(State), key: mfb.Key, _: mfb.KeyMod, is_pressed: bool) callconv(.C) void {
 | 
				
			||||||
 | 
					    if (key == mfb.Key.escape and is_pressed) {
 | 
				
			||||||
 | 
					        win.close();
 | 
				
			||||||
 | 
					    } else if (key == mfb.Key.space and is_pressed) {
 | 
				
			||||||
 | 
					        var state = win.getUserData().?;
 | 
				
			||||||
 | 
					        state.*.paused = !state.*.paused;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn main() !void {
 | 
					pub fn main() !void {
 | 
				
			||||||
    var gp_allocator = std.heap.GeneralPurposeAllocator(.{}){};
 | 
					    var gp_allocator = std.heap.GeneralPurposeAllocator(.{}){};
 | 
				
			||||||
    const alloc = gp_allocator.allocator();
 | 
					    const alloc = gp_allocator.allocator();
 | 
				
			||||||
@@ -213,6 +223,7 @@ pub fn main() !void {
 | 
				
			|||||||
    win.setMouseButtonCallback(handleMouseButton);
 | 
					    win.setMouseButtonCallback(handleMouseButton);
 | 
				
			||||||
    win.setMouseMoveCallback(handleMouseMove);
 | 
					    win.setMouseMoveCallback(handleMouseMove);
 | 
				
			||||||
    win.setMouseScrollCallback(handleMouseScroll);
 | 
					    win.setMouseScrollCallback(handleMouseScroll);
 | 
				
			||||||
 | 
					    win.setKeyboardCallback(handleKeyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var buf = try Buffer.init(alloc, Width, Height);
 | 
					    var buf = try Buffer.init(alloc, Width, Height);
 | 
				
			||||||
    defer buf.deinit();
 | 
					    defer buf.deinit();
 | 
				
			||||||
@@ -221,6 +232,10 @@ pub fn main() !void {
 | 
				
			|||||||
    while (win.waitSync()) {
 | 
					    while (win.waitSync()) {
 | 
				
			||||||
        state.render(buf);
 | 
					        state.render(buf);
 | 
				
			||||||
        // TODO Handle mfb state
 | 
					        // TODO Handle mfb state
 | 
				
			||||||
        _ = win.update(buf.slice) catch unreachable;
 | 
					        if (state.paused) {
 | 
				
			||||||
 | 
					            _ = win.updateEvents() catch unreachable;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            _ = win.update(buf.slice) catch unreachable;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user