Added setKeyboardCallback and update variants
This commit is contained in:
parent
a816791914
commit
ed6ab7c92a
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user