Start server bindings

This commit is contained in:
Isaac Freund
2020-10-05 16:18:25 +02:00
parent 3340f8831f
commit e713606356
2 changed files with 263 additions and 1 deletions
+5 -1
View File
@@ -31,13 +31,17 @@ pub const List = extern struct {
list.* = .{ .prev = list, .next = list };
}
pub fn insert(list: *List, elm: *List) void {
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;
+258
View File
@@ -0,0 +1,258 @@
const std = @import("std");
const os = std.os;
const wayland = @import("wayland.zig");
const common = wayland.common;
pub const Client = opaque {};
pub const Global = opaque {
extern fn wl_global_create(
display: *wl.Display,
interface: *const common.Interface,
version: c_int,
data: ?*c_void,
bind: fn (client: *Client, data: ?*c_void, version: u32, id: u32) callconv(.C) void,
) void;
pub fn create(
display: *wl.Display,
comptime ObjectT: type,
version: u32,
comptime T: type,
data: T,
bind: fn (client: *Client, data: T, version: u32, id: u32) callconv(.C) void,
) void {
wl_global_create(display, ObjectT.interface, version, data, bind);
}
extern fn wl_global_remove(global: *Global) void;
pub fn remove(global: *Global) void {
wl_global_remove(global);
}
extern fn wl_global_destroy(global: *Global) void;
pub fn destroy(global: *Global) void {
wl_global_destroy(global);
}
};
pub const Resource = opaque {
extern fn wl_resource_post_event_array(resource: *Resource, opcode: u32, args: [*]common.Argument) void;
pub fn postEvent(resource: *Resource, opcode: u32, args: [*]common.Argument) void {
wl_resource_post_event_array(resource, opcode, args);
}
extern fn wl_resource_queue_event_array(resource: *Resource, opcode: u32, args: [*]common.Argument) void;
pub fn queueEvent(resource: *Resource, opcode: u32, args: [*]common.Argument) void {
wl_resource_queue_event_array(resource, opcode, args);
}
extern fn wl_resource_post_error(resource: *Resource, code: u32, message: [*:0]const u8, ...) void;
pub fn postError(resource: *Resource, code: u32, message: [*:0]const u8) void {
wl_resource_post_error(resource, code, message);
}
extern fn wl_resource_post_no_memory(resource: *Resource) void;
pub fn postNoMemory(resource: *Resource) void {
wl_resource_post_no_memory(resource);
}
const DispatcherFn = fn (
implementation: ?*const c_void,
resource: *Resource,
opcode: u32,
message: *const common.Message,
args: [*]common.Argument,
) callconv(.C) c_int;
const DestroyFn = fn (resource: *Resource) callconv(.C) void;
extern fn wl_resource_set_dispatcher(
resource: *Resource,
dispatcher: DispatcherFn,
implementation: ?*const c_void,
data: ?*c_void,
destroy: DestroyFn,
) void;
pub fn setDispatcher(
resource: *Resource,
dispatcher: DispatcherFn,
implementation: ?*const c_void,
data: ?*c_void,
destroy: DestroyFn,
) !void {
if (wl_proxy_add_dispatcher(proxy, dispatcher, implementation, data) == -1)
return error.AlreadyHasListener;
}
extern fn wl_resource_destroy(resource: *Resource) void;
pub fn destroy(resource: *Resource) void {
wl_resource_destroy(resource);
}
extern fn wl_resource_get_user_data(resource: *Resource) ?*c_void;
pub fn getUserData(resource: *Resource) ?*c_void {
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
}
};