diff options
| author | Isaac Freund <ifreund@ifreund.xyz> | 2020-05-26 22:55:07 +0200 |
|---|---|---|
| committer | Isaac Freund <ifreund@ifreund.xyz> | 2020-05-31 21:04:25 +0200 |
| commit | d9ca9db5a49f0af2f6bef6f198b28a8d29808e6d (patch) | |
| tree | ebeb7de70a63bfff951e9eaa069f7885aa34a2dc /src/Control.zig | |
| parent | 9cd61f75903a83e56538ae3d69e7c2f3d2e6ca10 (diff) | |
| download | river-d9ca9db5a49f0af2f6bef6f198b28a8d29808e6d.tar.gz river-d9ca9db5a49f0af2f6bef6f198b28a8d29808e6d.tar.xz | |
Rework commands to be string based
This allows for significantly more flexibility and should make
implementing the bind command possible.
Diffstat (limited to 'src/Control.zig')
| -rw-r--r-- | src/Control.zig | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/Control.zig b/src/Control.zig index b870ada..6a94502 100644 --- a/src/Control.zig +++ b/src/Control.zig @@ -20,8 +20,8 @@ const Self = @This(); const std = @import("std"); const c = @import("c.zig"); +const command = @import("command.zig"); -const Command = @import("Command.zig"); const Log = @import("log.zig").Log; const Server = @import("Server.zig"); @@ -82,6 +82,7 @@ fn runCommand( ) callconv(.C) void { const self = @ptrCast(*Self, @alignCast(@alignOf(*Self), c.wl_resource_get_user_data(wl_resource))); const allocator = self.server.allocator; + const seat = self.server.input_manager.default_seat; var args = std.ArrayList([]const u8).init(allocator); @@ -106,22 +107,30 @@ fn runCommand( c.wl_resource_set_implementation(callback_resource, null, null, null); - const command = Command.init(args.items, allocator) catch |err| { - c.zriver_command_callback_v1_send_failure( - callback_resource, - switch (err) { - Command.Error.NoCommand => "no command given", - Command.Error.UnknownCommand => "unknown command", - Command.Error.NotEnoughArguments => "not enough arguments", - Command.Error.TooManyArguments => "too many arguments", - Command.Error.Overflow => "value out of bounds", - Command.Error.InvalidCharacter => "invalid character in argument", - Command.Error.InvalidDirection => "invalid direction. Must be 'next' or 'previous'", - Command.Error.OutOfMemory => unreachable, - }, - ); + var failure_message: []const u8 = undefined; + command.run(allocator, seat, args.items, &failure_message) catch |err| { + if (err == command.Error.CommandFailed) { + const out = std.cstr.addNullByte(allocator, failure_message) catch "out of memory"; + defer allocator.free(out); + allocator.free(failure_message); + c.zriver_command_callback_v1_send_failure(callback_resource, out); + } else { + c.zriver_command_callback_v1_send_failure( + callback_resource, + switch (err) { + command.Error.NoCommand => "no command given", + command.Error.UnknownCommand => "unknown command", + command.Error.NotEnoughArguments => "not enough arguments", + command.Error.TooManyArguments => "too many arguments", + command.Error.Overflow => "value out of bounds", + command.Error.InvalidCharacter => "invalid character in argument", + command.Error.InvalidDirection => "invalid direction. Must be 'next' or 'previous'", + command.Error.OutOfMemory => "out of memory", + command.Error.CommandFailed => unreachable, + }, + ); + } return; }; c.zriver_command_callback_v1_send_success(callback_resource); - command.run(self.server.input_manager.default_seat); } |
