diff --git a/src/apprt/gtk-ng/class/application.zig b/src/apprt/gtk-ng/class/application.zig index 226d7c56b..523a98033 100644 --- a/src/apprt/gtk-ng/class/application.zig +++ b/src/apprt/gtk-ng/class/application.zig @@ -562,6 +562,8 @@ pub const Application = extern struct { .move_tab => return Action.moveTab(target, value), + .new_split => return Action.newSplit(target, value), + .new_tab => return Action.newTab(target), .new_window => try Action.newWindow( @@ -611,7 +613,6 @@ pub const Application = extern struct { .prompt_title, .inspector, // TODO: splits - .new_split, .resize_split, .equalize_splits, .goto_split, @@ -1747,6 +1748,28 @@ const Action = struct { } } + pub fn newSplit( + target: apprt.Target, + direction: apprt.action.SplitDirection, + ) bool { + switch (target) { + .app => { + log.warn("new split to app is unexpected", .{}); + return false; + }, + + .surface => |core| { + const surface = core.rt_surface.surface; + return surface.as(gtk.Widget).activateAction(switch (direction) { + .right => "split-tree.new-right", + .left => "split-tree.new-left", + .down => "split-tree.new-down", + .up => "split-tree.new-up", + }, null) != 0; + }, + } + } + pub fn newTab(target: apprt.Target) bool { switch (target) { .app => { diff --git a/src/apprt/gtk-ng/class/split_tree.zig b/src/apprt/gtk-ng/class/split_tree.zig index 1cfaeb669..62caf7108 100644 --- a/src/apprt/gtk-ng/class/split_tree.zig +++ b/src/apprt/gtk-ng/class/split_tree.zig @@ -490,7 +490,6 @@ pub const SplitTree = extern struct { // Remove the surface from the tree. .surface => { // TODO: close confirmation - // TODO: invalid free on final close // Find the surface in the tree. const tree = self.getTree() orelse return; diff --git a/src/apprt/gtk-ng/class/window.zig b/src/apprt/gtk-ng/class/window.zig index 739405961..f3e8ee129 100644 --- a/src/apprt/gtk-ng/class/window.zig +++ b/src/apprt/gtk-ng/class/window.zig @@ -335,6 +335,10 @@ pub const Window = extern struct { .{ "close-tab", actionCloseTab, null }, .{ "new-tab", actionNewTab, null }, .{ "new-window", actionNewWindow, null }, + .{ "split-right", actionSplitRight, null }, + .{ "split-left", actionSplitLeft, null }, + .{ "split-up", actionSplitUp, null }, + .{ "split-down", actionSplitDown, null }, .{ "copy", actionCopy, null }, .{ "paste", actionPaste, null }, .{ "reset", actionReset, null }, @@ -1650,6 +1654,38 @@ pub const Window = extern struct { self.performBindingAction(.new_tab); } + fn actionSplitRight( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *Window, + ) callconv(.c) void { + self.performBindingAction(.{ .new_split = .right }); + } + + fn actionSplitLeft( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *Window, + ) callconv(.c) void { + self.performBindingAction(.{ .new_split = .left }); + } + + fn actionSplitUp( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *Window, + ) callconv(.c) void { + self.performBindingAction(.{ .new_split = .up }); + } + + fn actionSplitDown( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *Window, + ) callconv(.c) void { + self.performBindingAction(.{ .new_split = .down }); + } + fn actionCopy( _: *gio.SimpleAction, _: ?*glib.Variant,