Move non protocol related code to util

This commit is contained in:
Isaac Freund
2020-10-05 16:35:59 +02:00
parent e713606356
commit 3bf6bbea66
4 changed files with 213 additions and 213 deletions
-47
View File
@@ -23,53 +23,6 @@ pub const Array = extern struct {
data: *c_void,
};
pub const List = extern struct {
prev: *List,
next: *List,
pub fn init(list: *List) void {
list.* = .{ .prev = list, .next = list };
}
pub fn prepend(list: *List, elm: *List) void {
elm.prev = list;
elm.next = list.next;
list.next = elm;
elm.next.prev = elm;
}
pub fn append(list: *List, elm: *List) void {
list.prev.prepend(elm);
}
pub fn remove(elm: *elm) void {
elm.prev.next = elm.next;
elm.next.prev = elm.prev;
elm = undefined;
}
pub fn length(list: *const List) usize {
var count: usize = 0;
var current = list.next;
while (current != list) : (current = current.next) {
count += 1;
}
return count;
}
pub fn empty(list: *const List) bool {
return list.next == list;
}
pub fn insertList(list: *List, other: *List) void {
if (other.empty()) return;
other.next.prev = list;
other.prev.next = list.next;
list.next.prev = other.prev;
list.next = other.next;
}
};
pub const Fixed = extern enum(i32) {
_,
-166
View File
@@ -1,6 +1,3 @@
const std = @import("std");
const os = std.os;
const wayland = @import("wayland.zig");
const common = wayland.common;
@@ -93,166 +90,3 @@ pub const Resource = opaque {
return wl_resource_get_user_data(resource);
}
};
pub const EventLoop = opaque {
extern fn wl_event_loop_create() ?*EventLoop;
pub fn create() ?*EventLoop {
return wl_event_loop_create();
}
extern fn wl_event_loop_destroy(loop: *EventLoop) void;
pub fn destroy(loop: *EventLoop) void {
wl_event_loop_destroy(loop);
}
extern fn wl_event_loop_add_fd(
loop: *EventLoop,
fd: os.fd_t,
mask: u32,
func: fn (fd: os.fd_t, mask: u32, data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addFd(
loop: *EventLoop,
comptime T: type,
fd: os.fd_t,
mask: u32,
func: fn (fd: os.fd_t, mask: u32, data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_fd(loop, fd, mask, func, data);
}
extern fn wl_event_loop_add_timer(
loop: *EventLoop,
func: fn (data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addTimer(
loop: *EventLoop,
comptime T: type,
func: fn (data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_timer(loop, func, data);
}
extern fn wl_event_loop_add_signal(
loop: *EventLoop,
signal_number: c_int,
func: fn (c_int, ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addSignal(
loop: *EventLoop,
comptime T: type,
signal_number: c_int,
func: fn (signal_number: c_int, data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_signal(loop, signal_number, func, data);
}
extern fn wl_event_loop_add_idle(
loop: *EventLoop,
func: fn (data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addIdle(
loop: *EventLoop,
comptime T: type,
func: fn (data: T) callconv(.C) c_int,
data: T,
) error{OutOfMemory}!*EventSource {
return wl_event_loop_add_idle(loop, func, data) orelse error.OutOfMemory;
}
extern fn wl_event_loop_dispatch(loop: *EventLoop, timeout: c_int) c_int;
pub fn dispatch(loop: *EventLoop, timeout: c_int) !void {
const rc = wl_event_loop_dispatch(loop, timeout);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
extern fn wl_event_loop_dispatch_idle(loop: *EventLoop) void;
pub fn dispatchIdle(loop: *EventLoop) void {
wl_event_loop_dispatch_idle(loop);
}
extern fn wl_event_loop_get_fd(loop: *EventLoop) c_int;
pub fn getFd(loop: *EventLoop) os.fd_t {
return wl_event_loop_get_fd(loop);
}
extern fn wl_event_loop_add_destroy_listener(loop: *EventLoop, listener: *Listener) void;
pub fn addDestroyListener(loop: *EventLoop, listener: *Listener) void {
wl_event_loop_add_destroy_listener(loop, listener);
}
extern fn wl_event_loop_get_destroy_listener(loop: *EventLoop, notify: Listener.NotifyFn) ?*Listener;
pub fn getDestroyListener(loop: *EventLoop, notify: Listener.NotifyFn) ?*Listener {
return wl_event_loop_get_destroy_listener(loop, notify);
}
};
pub const EventSource = opaque {
extern fn wl_event_source_remove(source: *EventSource) c_int;
pub fn remove(source: *EventSource) void {
if (wl_event_source_remove(source) != 0) unreachable;
}
extern fn wl_event_source_check(source: *EventSource) void;
pub fn check(source: *EventSource) void {
wl_event_source_check(source);
}
extern fn wl_event_source_fd_update(source: *EventSource, mask: u32) c_int;
pub fn fdUpdate(source: *EventSource, mask: u32) !void {
const rc = wl_event_source_fd_update(source, mask);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
extern fn wl_event_source_timer_update(source: *EventSource, ms_delay: c_int) c_int;
pub fn timerUpdate(source: *EventSource, ms_delay: u31) !void {
const rc = wl_event_source_timer_update(source, ms_delay);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
};
pub const Listener = extern struct {
pub const NotifyFn = fn (listener: *Listener, data: ?*c_void) callconv(.C) void;
link: common.List,
notify: NotifyFn,
};
pub const Signal = extern struct {
listener_list: common.List,
pub fn init(signal: *Signal) void {
signal.listener_list.init();
}
pub fn add(signal: *Signal, listener: *Listener) void {
signal.listener_list.append(&listener.link);
}
pub fn get(signal: *Signal, notify: Listener.NotifyFn) ?*Listener {
// TODO
}
pub fn emit(signal: *Signal, data: ?*c_void) void {
//TODO
}
};
+212
View File
@@ -0,0 +1,212 @@
const std = @import("std");
const os = std.os;
pub const List = extern struct {
prev: *List,
next: *List,
pub fn init(list: *List) void {
list.* = .{ .prev = list, .next = list };
}
pub fn prepend(list: *List, elm: *List) void {
elm.prev = list;
elm.next = list.next;
list.next = elm;
elm.next.prev = elm;
}
pub fn append(list: *List, elm: *List) void {
list.prev.prepend(elm);
}
pub fn remove(elm: *elm) void {
elm.prev.next = elm.next;
elm.next.prev = elm.prev;
elm = undefined;
}
pub fn length(list: *const List) usize {
var count: usize = 0;
var current = list.next;
while (current != list) : (current = current.next) {
count += 1;
}
return count;
}
pub fn empty(list: *const List) bool {
return list.next == list;
}
pub fn insertList(list: *List, other: *List) void {
if (other.empty()) return;
other.next.prev = list;
other.prev.next = list.next;
list.next.prev = other.prev;
list.next = other.next;
}
};
pub const Listener = extern struct {
pub const NotifyFn = fn (listener: *Listener, data: ?*c_void) callconv(.C) void;
link: List,
notify: NotifyFn,
};
pub const Signal = extern struct {
listener_list: List,
pub fn init(signal: *Signal) void {
signal.listener_list.init();
}
pub fn add(signal: *Signal, listener: *Listener) void {
signal.listener_list.append(&listener.link);
}
pub fn get(signal: *Signal, notify: Listener.NotifyFn) ?*Listener {
// TODO
}
pub fn emit(signal: *Signal, data: ?*c_void) void {
//TODO
}
};
pub const EventLoop = opaque {
extern fn wl_event_loop_create() ?*EventLoop;
pub fn create() ?*EventLoop {
return wl_event_loop_create();
}
extern fn wl_event_loop_destroy(loop: *EventLoop) void;
pub fn destroy(loop: *EventLoop) void {
wl_event_loop_destroy(loop);
}
extern fn wl_event_loop_add_fd(
loop: *EventLoop,
fd: os.fd_t,
mask: u32,
func: fn (fd: os.fd_t, mask: u32, data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addFd(
loop: *EventLoop,
comptime T: type,
fd: os.fd_t,
mask: u32,
func: fn (fd: os.fd_t, mask: u32, data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_fd(loop, fd, mask, func, data);
}
extern fn wl_event_loop_add_timer(
loop: *EventLoop,
func: fn (data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addTimer(
loop: *EventLoop,
comptime T: type,
func: fn (data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_timer(loop, func, data);
}
extern fn wl_event_loop_add_signal(
loop: *EventLoop,
signal_number: c_int,
func: fn (c_int, ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addSignal(
loop: *EventLoop,
comptime T: type,
signal_number: c_int,
func: fn (signal_number: c_int, data: T) callconv(.C) c_int,
data: T,
) ?*EventSource {
return wl_event_loop_add_signal(loop, signal_number, func, data);
}
extern fn wl_event_loop_add_idle(
loop: *EventLoop,
func: fn (data: ?*c_void) c_int,
data: ?*c_void,
) ?*EventSource;
pub fn addIdle(
loop: *EventLoop,
comptime T: type,
func: fn (data: T) callconv(.C) c_int,
data: T,
) error{OutOfMemory}!*EventSource {
return wl_event_loop_add_idle(loop, func, data) orelse error.OutOfMemory;
}
extern fn wl_event_loop_dispatch(loop: *EventLoop, timeout: c_int) c_int;
pub fn dispatch(loop: *EventLoop, timeout: c_int) !void {
const rc = wl_event_loop_dispatch(loop, timeout);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
extern fn wl_event_loop_dispatch_idle(loop: *EventLoop) void;
pub fn dispatchIdle(loop: *EventLoop) void {
wl_event_loop_dispatch_idle(loop);
}
extern fn wl_event_loop_get_fd(loop: *EventLoop) c_int;
pub fn getFd(loop: *EventLoop) os.fd_t {
return wl_event_loop_get_fd(loop);
}
extern fn wl_event_loop_add_destroy_listener(loop: *EventLoop, listener: *Listener) void;
pub fn addDestroyListener(loop: *EventLoop, listener: *Listener) void {
wl_event_loop_add_destroy_listener(loop, listener);
}
extern fn wl_event_loop_get_destroy_listener(loop: *EventLoop, notify: Listener.NotifyFn) ?*Listener;
pub fn getDestroyListener(loop: *EventLoop, notify: Listener.NotifyFn) ?*Listener {
return wl_event_loop_get_destroy_listener(loop, notify);
}
};
pub const EventSource = opaque {
extern fn wl_event_source_remove(source: *EventSource) c_int;
pub fn remove(source: *EventSource) void {
if (wl_event_source_remove(source) != 0) unreachable;
}
extern fn wl_event_source_check(source: *EventSource) void;
pub fn check(source: *EventSource) void {
wl_event_source_check(source);
}
extern fn wl_event_source_fd_update(source: *EventSource, mask: u32) c_int;
pub fn fdUpdate(source: *EventSource, mask: u32) !void {
const rc = wl_event_source_fd_update(source, mask);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
extern fn wl_event_source_timer_update(source: *EventSource, ms_delay: c_int) c_int;
pub fn timerUpdate(source: *EventSource, ms_delay: u31) !void {
const rc = wl_event_source_timer_update(source, ms_delay);
switch (os.errno(rc)) {
0 => return,
// TODO
else => |err| os.unexpectedErrno(err),
}
}
};
+1
View File
@@ -3,3 +3,4 @@
pub const client = @import("client.zig");
pub const server = @import("server.zig");
pub const common = @import("common.zig");
pub const util = @import("util.zig");