diff --git a/src/server_core.zig b/src/server_core.zig index d772f16..9a3750a 100644 --- a/src/server_core.zig +++ b/src/server_core.zig @@ -10,7 +10,7 @@ pub const Global = opaque { version: c_int, data: ?*c_void, bind: fn (client: *Client, data: ?*c_void, version: u32, id: u32) callconv(.C) void, - ) void; + ) ?*Global; pub fn create( display: *wl.Display, comptime ObjectT: type, @@ -18,8 +18,9 @@ pub const Global = opaque { 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); + ) !*Global { + return wl_global_create(display, ObjectT.interface, version, data, bind) orelse + error.GlobalCreateFailed; } extern fn wl_global_remove(global: *Global) void; @@ -76,7 +77,7 @@ pub const Resource = opaque { data: ?*c_void, destroy: DestroyFn, ) !void { - if (wl_proxy_add_dispatcher(proxy, dispatcher, implementation, data) == -1) + if (wl_resource_set_dispatcher(proxy, dispatcher, implementation, data) == -1) return error.AlreadyHasListener; } @@ -90,3 +91,23 @@ pub const Resource = opaque { return wl_resource_get_user_data(resource); } }; + +pub const ProtocolLogger = opaque { + pub const Type = extern enum { + request, + event, + }; + + pub const Message = extern struct { + resource: *Resource, + message_opcode: c_int, + message: *common.Message, + arguments_count: c_int, + arguments: ?[*]common.Argument, + }; + + extern fn wl_protocol_logger_destroy(logger: *ProtocolLogger) void; + pub fn destroy(logger: *ProtocolLogger) void { + wl_protocol_logger_destroy(logger); + } +}; diff --git a/src/server_display_functions.zig b/src/server_display_functions.zig new file mode 100644 index 0000000..82839b1 --- /dev/null +++ b/src/server_display_functions.zig @@ -0,0 +1,96 @@ +const os = @import("std").os; + +const util = wayland.util; + +extern fn wl_display_create() ?*Display; +pub const create = wl_display_create; + +extern fn wl_display_destroy(display: *Display) void; +pub const destroy = wl_display_destroy; + +extern fn wl_display_get_event_loop(display: *Display) *util.EventLoop; +pub const getEventLoop = wl_display_get_event_loop; + +extern fn wl_display_add_socket(display: *Display, name: [*:0]const u8) c_int; +pub fn addSocket(display: *Display, name: [*:0]const u8) !void { + if (wl_display_add_socket(display, name) == -1) + return error.AddSocketFailed; +} + +// TODO implement the non-broken version of this +extern fn wl_display_add_socket_auto(display: *Display) ?[*:0]const u8; + +extern fn wl_display_add_socket_fd(display: *Display, sock_fd: c_int) c_int; +pub fn addSocketFd(display: *Display, sock_fd: os.fd_t) !void { + if (wl_display_add_socket_fd(display, sock_fd) == -1) + return error.AddSocketFailed; +} + +extern fn wl_display_terminate(display: *Display) void; +pub const terminate = wl_display_terminate; + +extern fn wl_display_run(display: *Display) void; +pub const run = wl_display_run; + +extern fn wl_display_flush_clients(display: *Display) void; +pub const flushClients = wl_display_flush_clients; + +extern fn wl_display_destroy_clients(display: *Display) void; +pub const destroyClients = wl_display_destroy_clients; + +extern fn wl_display_get_serial(display: *Display) u32; +pub const getSerial = wl_display_get_serial; + +extern fn wl_display_next_serial(display: *Display) u32; +pub const nextSerial = wl_display_next_serial; + +extern fn wl_display_add_destroy_listener(display: *Display, listener: *util.Listener) void; +pub const addDestroyListener = wl_display_add_destroy_listener; + +extern fn wl_display_add_client_created_listener(display: *Display, listener: *util.Listener) void; +pub const addClientCreatedListener = wl_display_add_client_created_listener; + +extern fn wl_display_get_destroy_listener(display: *Display, notify: util.Listener.NotifyFn) ?*util.Listener; +pub const getDestroyListener = wl_display_get_destroy_listener; + +extern fn wl_display_set_global_filter( + display: *Display, + filter: fn (client: *const server.Client, global: *const server.Global, data: ?*c_void) bool, + data: ?*c_void, +) void; +pub fn setGlobalFilter( + display: *Display, + comptime T: type, + filter: fn (client: *const server.Client, global: *const server.Global, data: T) callconv(.C) bool, + data: T, +) void { + wl_display_set_global_filter(display, filter, data); +} + +extern fn wl_display_get_client_list(display: *Display) *util.List; +pub const getClientList = wl_display_get_client_list; + +extern fn wl_display_init_shm(display: *Display) c_int; +pub fn initShm(display: *Display) !void { + if (wl_display_init_shm(display) == -1) + return error.GlobalCreateFailed; +} + +extern fn wl_display_add_shm_format(display: *Display, format: u32) ?*u32; +pub fn addShmFormat(display: *Display, format: u32) !*u32 { + return wl_display_add_shm_format(display, format) orelse error.OutOfMemory; +} + +extern fn wl_display_add_protocol_logger( + display: *Display, + func: fn (data: ?*c_void, direction: server.ProtocolLogger.Type, message: *const server.ProtocolLogger.Message) void, + data: ?*c_void, +) void; +pub fn addProtocolLogger( + display: *Display, + comptime T: type, + func: fn (data: T, direction: server.ProtocolLogger.Type, message: *const server.ProtocolLogger.Message) callconv(.C) void, + data: T, +) void { + wl_display_add_protocol_logger(display, func, data); +}