Handle messages with no args

This commit is contained in:
Isaac Freund
2020-10-08 14:31:26 +02:00
parent 8d7f1f546e
commit de5909ae8c
3 changed files with 47 additions and 40 deletions
+44 -35
View File
@@ -192,17 +192,23 @@ const Message = struct {
fn emitMessage(message: Message, writer: anytype) !void {
try writer.print(".{{ .name = \"{}\", .signature = \"", .{message.name});
for (message.args.items) |arg| try arg.emitSignature(writer);
try writer.writeAll("\", .types = &[_]?*const common.Interface{");
for (message.args.items) |arg| {
switch (arg.kind) {
.object, .new_id => |interface| if (interface) |i|
try writer.print("&common.{}.{}.interface,", .{ prefix(i), trimPrefix(i) })
else
try writer.writeAll("null,"),
else => try writer.writeAll("null,"),
try writer.writeAll("\", .types = ");
if (message.args.items.len > 0) {
try writer.writeAll("&[_]?*const common.Interface{");
for (message.args.items) |arg| {
switch (arg.kind) {
.object, .new_id => |interface| if (interface) |i|
try writer.print("&common.{}.{}.interface,", .{ prefix(i), trimPrefix(i) })
else
try writer.writeAll("null,"),
else => try writer.writeAll("null,"),
}
}
try writer.writeAll("},");
} else {
try writer.writeAll("null,");
}
try writer.writeAll("}, },");
try writer.writeAll("},");
}
fn emitField(message: Message, target: Target, writer: anytype) !void {
@@ -278,39 +284,42 @@ const Message = struct {
try writer.writeAll("const proxy = @ptrCast(*client.Proxy,");
try printIdentifier(writer, trimPrefix(interface.name));
try writer.writeAll(");");
try writer.writeAll("var args = [_]common.Argument{");
for (message.args.items) |arg| {
switch (arg.kind) {
.int, .uint, .fixed, .string, .object, .array, .fd => {
try writer.writeAll(".{ .");
try arg.emitSignature(writer);
try writer.writeAll(" = ");
try printIdentifier(writer, arg.name);
try writer.writeAll("},");
},
.new_id => |new_iface| {
if (target == .server) {
try writer.writeAll(".{ .o = ");
if (message.args.items.len > 0) {
try writer.writeAll("var args = [_]common.Argument{");
for (message.args.items) |arg| {
switch (arg.kind) {
.int, .uint, .fixed, .string, .object, .array, .fd => {
try writer.writeAll(".{ .");
try arg.emitSignature(writer);
try writer.writeAll(" = ");
try printIdentifier(writer, arg.name);
try writer.writeAll(" },");
} else {
if (new_iface == null) {
try writer.writeAll(
\\.{ .s = T.interface.name },
\\.{ .u = version },
);
try writer.writeAll("},");
},
.new_id => |new_iface| {
if (target == .server) {
try writer.writeAll(".{ .o = ");
try printIdentifier(writer, arg.name);
try writer.writeAll(" },");
} else {
if (new_iface == null) {
try writer.writeAll(
\\.{ .s = T.interface.name },
\\.{ .u = version },
);
}
try writer.writeAll(".{ .o = null },");
}
try writer.writeAll(".{ .o = null },");
}
},
},
}
}
try writer.writeAll("};\n");
}
try writer.writeAll("};\n");
const args = if (message.args.items.len > 0) "&args" else "null";
if (target == .server) {
try writer.print("resource.postEvent({}, &args);", .{opcode});
try writer.print("resource.postEvent({}, {});", .{ opcode, args });
} else switch (message.kind) {
.normal, .destructor => {
try writer.print("proxy.marshal({}, &args);", .{opcode});
try writer.print("proxy.marshal({}, {});", .{ opcode, args });
if (message.kind == .destructor) try writer.writeAll("proxy.destroy();");
},
.constructor => |new_iface| {
+2 -4
View File
@@ -12,10 +12,8 @@ pub const Proxy = opaque {
wl_proxy_destroy(proxy);
}
extern fn wl_proxy_marshal_array(proxy: *Proxy, opcode: u32, args: [*]common.Argument) void;
pub fn marshal(proxy: *Proxy, opcode: u32, args: [*]common.Argument) void {
wl_proxy_marshal_array(proxy, opcode, args);
}
extern fn wl_proxy_marshal_array(proxy: *Proxy, opcode: u32, args: ?[*]common.Argument) void;
pub const marshal = wl_proxy_marshal_array;
extern fn wl_proxy_marshal_array_constructor(
proxy: *Proxy,
+1 -1
View File
@@ -6,7 +6,7 @@ pub const Object = opaque {};
pub const Message = extern struct {
name: [*:0]const u8,
signature: [*:0]const u8,
types: [*]const ?*const Interface,
types: ?[*]const ?*const Interface,
};
pub const Interface = extern struct {