mirror of
https://github.com/MezzalunaWM/Mezzaluna.git
synced 2026-03-07 19:49:53 -05:00
rework how remote lua clients are stored in the server
This commit is contained in:
parent
1e31875670
commit
6fcb13741a
2 changed files with 20 additions and 15 deletions
|
|
@ -11,13 +11,16 @@ const mez = wayland.server.zmez;
|
||||||
const gpa = std.heap.c_allocator;
|
const gpa = std.heap.c_allocator;
|
||||||
const server = &@import("main.zig").server;
|
const server = &@import("main.zig").server;
|
||||||
|
|
||||||
id: usize,
|
node: std.DoublyLinkedList.Node,
|
||||||
remote_lua_v1: *mez.RemoteLuaV1,
|
remote_lua_v1: *mez.RemoteLuaV1,
|
||||||
L: *zlua.Lua,
|
L: *zlua.Lua,
|
||||||
|
|
||||||
pub fn sendNewLogEntry(str: [*:0]const u8) void {
|
pub fn sendNewLogEntry(str: [*:0]const u8) void {
|
||||||
for (server.remote_lua_clients.items) |c| {
|
var node = server.remote_lua_clients.first;
|
||||||
c.remote_lua_v1.sendNewLogEntry(str);
|
while (node) |n| {
|
||||||
|
const data: ?*RemoteLua = @fieldParentPtr("node", n);
|
||||||
|
if (data) |d| d.remote_lua_v1.sendNewLogEntry(str);
|
||||||
|
node = n.next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -28,7 +31,7 @@ pub fn create(client: *wl.Client, version: u32, id: u32) !void {
|
||||||
errdefer gpa.destroy(node);
|
errdefer gpa.destroy(node);
|
||||||
node.* = .{
|
node.* = .{
|
||||||
.remote_lua_v1 = remote_lua_v1,
|
.remote_lua_v1 = remote_lua_v1,
|
||||||
.id = server.remote_lua_clients.items.len,
|
.node = .{},
|
||||||
.L = try zlua.Lua.init(gpa),
|
.L = try zlua.Lua.init(gpa),
|
||||||
};
|
};
|
||||||
errdefer node.L.deinit();
|
errdefer node.L.deinit();
|
||||||
|
|
@ -36,7 +39,7 @@ pub fn create(client: *wl.Client, version: u32, id: u32) !void {
|
||||||
Lua.openLibs(node.L);
|
Lua.openLibs(node.L);
|
||||||
// TODO: replace stdout and stderr with buffers we can send to the clients
|
// TODO: replace stdout and stderr with buffers we can send to the clients
|
||||||
|
|
||||||
try server.remote_lua_clients.append(gpa, node);
|
server.remote_lua_clients.prepend(&node.node);
|
||||||
|
|
||||||
remote_lua_v1.setHandler(*RemoteLua, handleRequest, handleDestroy, node);
|
remote_lua_v1.setHandler(*RemoteLua, handleRequest, handleDestroy, node);
|
||||||
}
|
}
|
||||||
|
|
@ -56,6 +59,16 @@ remote: *RemoteLua,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handleDestroy(_: *mez.RemoteLuaV1, remote_lua: *RemoteLua) void {
|
||||||
|
if (remote_lua.node.prev) |p| {
|
||||||
|
if (remote_lua.node.next) |n| n.prev.? = p;
|
||||||
|
p.next = remote_lua.node.next;
|
||||||
|
} else server.remote_lua_clients.first = remote_lua.node.next;
|
||||||
|
|
||||||
|
remote_lua.L.deinit();
|
||||||
|
gpa.destroy(remote_lua);
|
||||||
|
}
|
||||||
|
|
||||||
fn catchLuaFail(remote: *RemoteLua) void {
|
fn catchLuaFail(remote: *RemoteLua) void {
|
||||||
const err_txt: []const u8 = remote.L.toString(-1) catch unreachable;
|
const err_txt: []const u8 = remote.L.toString(-1) catch unreachable;
|
||||||
const txt = std.mem.concat(gpa, u8, &[_][]const u8{ "repl: ", err_txt }) catch Utils.oomPanic();
|
const txt = std.mem.concat(gpa, u8, &[_][]const u8{ "repl: ", err_txt }) catch Utils.oomPanic();
|
||||||
|
|
@ -69,9 +82,3 @@ fn catchLuaFail(remote: *RemoteLua) void {
|
||||||
sendNewLogEntry(w_sentinel);
|
sendNewLogEntry(w_sentinel);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handleDestroy(_: *mez.RemoteLuaV1, remote_lua: *RemoteLua) void {
|
|
||||||
_ = server.remote_lua_clients.swapRemove(remote_lua.id);
|
|
||||||
remote_lua.L.deinit();
|
|
||||||
gpa.destroy(remote_lua);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ cursor: Cursor,
|
||||||
keymaps: std.AutoHashMap(u64, Keymap),
|
keymaps: std.AutoHashMap(u64, Keymap),
|
||||||
hooks: std.ArrayList(*Hook),
|
hooks: std.ArrayList(*Hook),
|
||||||
events: Events,
|
events: Events,
|
||||||
remote_lua_clients: std.ArrayList(*RemoteLua),
|
remote_lua_clients: std.DoublyLinkedList,
|
||||||
|
|
||||||
// Backend listeners
|
// Backend listeners
|
||||||
new_input: wl.Listener(*wlr.InputDevice) = .init(handleNewInput),
|
new_input: wl.Listener(*wlr.InputDevice) = .init(handleNewInput),
|
||||||
|
|
@ -103,7 +103,7 @@ pub fn init(self: *Server) void {
|
||||||
.keymaps = .init(gpa),
|
.keymaps = .init(gpa),
|
||||||
.hooks = try .initCapacity(gpa, 10), // TODO: choose how many slots to start with
|
.hooks = try .initCapacity(gpa, 10), // TODO: choose how many slots to start with
|
||||||
.events = try .init(gpa),
|
.events = try .init(gpa),
|
||||||
.remote_lua_clients = try .initCapacity(gpa, 0),
|
.remote_lua_clients = .{},
|
||||||
};
|
};
|
||||||
|
|
||||||
self.renderer.initServer(wl_server) catch {
|
self.renderer.initServer(wl_server) catch {
|
||||||
|
|
@ -138,8 +138,6 @@ pub fn deinit(self: *Server) noreturn {
|
||||||
self.new_xdg_popup.link.remove();
|
self.new_xdg_popup.link.remove();
|
||||||
self.new_xdg_toplevel_decoration.link.remove();
|
self.new_xdg_toplevel_decoration.link.remove();
|
||||||
|
|
||||||
self.remote_lua_clients.deinit(gpa);
|
|
||||||
|
|
||||||
self.seat.deinit();
|
self.seat.deinit();
|
||||||
self.root.deinit();
|
self.root.deinit();
|
||||||
self.cursor.deinit();
|
self.cursor.deinit();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue