WIP: exec element with initial implementation
Problem is that the main application actually does not create a pty and instead uses the current one (for better compatability for ssh based hosting). The current problem is the fact that the child process should not take over (and never give back too) the input / output handling of the current pts. Such that both applications can receive inputs accordingly (in best case actually controlled by the main application).
This commit is contained in:
@@ -79,54 +79,29 @@ pub fn main() !void {
|
||||
}, quit_text.element());
|
||||
try container.append(try App.Container.init(allocator, .{}, scrollable.element()));
|
||||
|
||||
var nested_container: App.Container = try .init(allocator, .{
|
||||
.layout = .{
|
||||
.direction = .vertical,
|
||||
.separator = .{
|
||||
.enabled = true,
|
||||
},
|
||||
},
|
||||
}, .{});
|
||||
var inner_container: App.Container = try .init(allocator, .{
|
||||
.layout = .{
|
||||
.direction = .vertical,
|
||||
var environment = try std.process.getEnvMap(allocator);
|
||||
defer environment.deinit();
|
||||
|
||||
var editor: App.Exec = .init(
|
||||
allocator,
|
||||
&.{
|
||||
"tty",
|
||||
},
|
||||
&environment,
|
||||
&app.queue,
|
||||
);
|
||||
defer editor.deinit();
|
||||
|
||||
try container.append(try App.Container.init(allocator, .{
|
||||
.border = .{
|
||||
.color = .light_blue,
|
||||
.sides = .all,
|
||||
},
|
||||
}, .{});
|
||||
try inner_container.append(try .init(allocator, .{
|
||||
.rectangle = .{
|
||||
.fill = .blue,
|
||||
},
|
||||
.size = .{
|
||||
.grow = .horizontal,
|
||||
.dim = .{ .y = 5 },
|
||||
.dim = .{ .x = 100 },
|
||||
},
|
||||
}, .{}));
|
||||
try inner_container.append(try .init(allocator, .{
|
||||
.rectangle = .{
|
||||
.fill = .red,
|
||||
},
|
||||
.size = .{
|
||||
.grow = .horizontal,
|
||||
.dim = .{ .y = 5 },
|
||||
},
|
||||
}, .{}));
|
||||
try inner_container.append(try .init(allocator, .{
|
||||
.rectangle = .{
|
||||
.fill = .green,
|
||||
},
|
||||
}, .{}));
|
||||
try nested_container.append(inner_container);
|
||||
try nested_container.append(try .init(allocator, .{
|
||||
.size = .{
|
||||
.grow = .horizontal,
|
||||
.dim = .{ .y = 1 },
|
||||
},
|
||||
}, .{}));
|
||||
try container.append(nested_container);
|
||||
}, editor.element()));
|
||||
|
||||
try container.append(try App.Container.init(allocator, .{
|
||||
.rectangle = .{ .fill = .blue },
|
||||
.size = .{
|
||||
@@ -138,6 +113,11 @@ pub fn main() !void {
|
||||
try app.start();
|
||||
defer app.stop() catch |err| log.err("Failed to stop application: {any}", .{err});
|
||||
|
||||
var process_in: std.ArrayListUnmanaged(u8) = .empty;
|
||||
defer process_in.deinit(allocator);
|
||||
var process_out: std.ArrayListUnmanaged(u8) = .empty;
|
||||
defer process_out.deinit(allocator);
|
||||
|
||||
// event loop
|
||||
while (true) {
|
||||
const event = app.nextEvent();
|
||||
@@ -145,23 +125,7 @@ pub fn main() !void {
|
||||
|
||||
// pre event handling
|
||||
switch (event) {
|
||||
.key => |key| {
|
||||
if (key.eql(.{ .cp = 'c', .mod = .{ .ctrl = true } })) app.quit();
|
||||
|
||||
if (key.eql(.{ .cp = 'n', .mod = .{ .ctrl = true } })) {
|
||||
try app.interrupt();
|
||||
renderer.size = .{}; // reset size, such that next resize will cause a full re-draw!
|
||||
defer app.start() catch @panic("could not start app event loop");
|
||||
var child = std.process.Child.init(&.{"hx"}, allocator);
|
||||
_ = child.spawnAndWait() catch |err| app.postEvent(.{
|
||||
.err = .{
|
||||
.err = err,
|
||||
.msg = "Spawning $EDITOR failed",
|
||||
},
|
||||
});
|
||||
continue;
|
||||
}
|
||||
},
|
||||
.key => |key| if (key.eql(.{ .cp = 'c', .mod = .{ .ctrl = true } })) app.quit(),
|
||||
// NOTE errors could be displayed in another container in case one was received, etc. to provide the user with feedback
|
||||
.err => |err| log.err("Received {s} with message: {s}", .{ @errorName(err.err), err.msg }),
|
||||
else => {},
|
||||
|
||||
Reference in New Issue
Block a user