From fbc621a7d86f15333aedba1fc6a25d31583f98b6 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Mon, 16 Sep 2024 13:47:52 +0200 Subject: [PATCH] gtk: implement splitting leftwards and upwards --- src/Surface.zig | 2 ++ src/apprt/action.zig | 2 ++ src/apprt/gtk/App.zig | 2 ++ src/apprt/gtk/Split.zig | 27 +++++++++++++++++++-------- src/apprt/gtk/Window.zig | 28 ++++++++++++++++++++++++++++ src/input/Binding.zig | 4 ++-- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 4e311cd38..3e2aa3d95 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3835,7 +3835,9 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool .new_split, switch (direction) { .right => .right, + .left => .left, .down => .down, + .up => .up, .auto => if (self.screen_size.width > self.screen_size.height) .right else diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 5c8ba6a01..a5da51d1d 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -272,6 +272,8 @@ pub const Action = union(Key) { pub const SplitDirection = enum(c_int) { right, down, + left, + up, }; // This is made extern (c_int) to make interop easier with our embedded diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 3bed756d0..3855d27c3 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -768,6 +768,8 @@ fn syncActionAccelerators(self: *App) !void { try self.syncActionAccelerator("win.new_tab", .{ .new_tab = {} }); try self.syncActionAccelerator("win.split_right", .{ .new_split = .right }); try self.syncActionAccelerator("win.split_down", .{ .new_split = .down }); + try self.syncActionAccelerator("win.split_left", .{ .new_split = .left }); + try self.syncActionAccelerator("win.split_up", .{ .new_split = .up }); try self.syncActionAccelerator("win.copy", .{ .copy_to_clipboard = {} }); try self.syncActionAccelerator("win.paste", .{ .paste_from_clipboard = {} }); try self.syncActionAccelerator("win.reset", .{ .reset = {} }); diff --git a/src/apprt/gtk/Split.zig b/src/apprt/gtk/Split.zig index 7a3645d1b..5afac6f5b 100644 --- a/src/apprt/gtk/Split.zig +++ b/src/apprt/gtk/Split.zig @@ -22,8 +22,8 @@ pub const Orientation = enum { pub fn fromDirection(direction: apprt.action.SplitDirection) Orientation { return switch (direction) { - .right => .horizontal, - .down => .vertical, + .right, .left => .horizontal, + .down, .up => .vertical, }; } @@ -80,8 +80,8 @@ pub fn init( // Create the actual GTKPaned, attach the proper children. const orientation: c_uint = switch (direction) { - .right => c.GTK_ORIENTATION_HORIZONTAL, - .down => c.GTK_ORIENTATION_VERTICAL, + .right, .left => c.GTK_ORIENTATION_HORIZONTAL, + .down, .up => c.GTK_ORIENTATION_VERTICAL, }; const paned = c.gtk_paned_new(orientation); errdefer c.g_object_unref(paned); @@ -94,14 +94,25 @@ pub fn init( // we're inheriting its parent. The sibling points to its location // in the split, and the surface points to the other location. const container = sibling.container; - sibling.container = .{ .split_tl = &self.top_left }; - surface.container = .{ .split_br = &self.bottom_right }; + const tl: *Surface, const br: *Surface = switch (direction) { + .right, .down => right_down: { + sibling.container = .{ .split_tl = &self.top_left }; + surface.container = .{ .split_br = &self.bottom_right }; + break :right_down .{ sibling, surface }; + }, + + .left, .up => left_up: { + sibling.container = .{ .split_br = &self.bottom_right }; + surface.container = .{ .split_tl = &self.top_left }; + break :left_up .{ surface, sibling }; + }, + }; self.* = .{ .paned = @ptrCast(paned), .container = container, - .top_left = .{ .surface = sibling }, - .bottom_right = .{ .surface = surface }, + .top_left = .{ .surface = tl }, + .bottom_right = .{ .surface = br }, .orientation = Orientation.fromDirection(direction), }; diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index efde78e61..a3d74c77f 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -373,6 +373,8 @@ fn initActions(self: *Window) void { .{ "new_tab", >kActionNewTab }, .{ "split_right", >kActionSplitRight }, .{ "split_down", >kActionSplitDown }, + .{ "split_left", >kActionSplitLeft }, + .{ "split_up", >kActionSplitUp }, .{ "toggle_inspector", >kActionToggleInspector }, .{ "copy", >kActionCopy }, .{ "paste", >kActionPaste }, @@ -812,6 +814,32 @@ fn gtkActionSplitDown( }; } +fn gtkActionSplitLeft( + _: *c.GSimpleAction, + _: *c.GVariant, + ud: ?*anyopaque, +) callconv(.C) void { + const self: *Window = @ptrCast(@alignCast(ud orelse return)); + const surface = self.actionSurface() orelse return; + _ = surface.performBindingAction(.{ .new_split = .left }) catch |err| { + log.warn("error performing binding action error={}", .{err}); + return; + }; +} + +fn gtkActionSplitUp( + _: *c.GSimpleAction, + _: *c.GVariant, + ud: ?*anyopaque, +) callconv(.C) void { + const self: *Window = @ptrCast(@alignCast(ud orelse return)); + const surface = self.actionSurface() orelse return; + _ = surface.performBindingAction(.{ .new_split = .up }) catch |err| { + log.warn("error performing binding action error={}", .{err}); + return; + }; +} + fn gtkActionToggleInspector( _: *c.GSimpleAction, _: *c.GVariant, diff --git a/src/input/Binding.zig b/src/input/Binding.zig index dead84c9f..9667f2d17 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -440,9 +440,9 @@ pub const Action = union(enum) { pub const SplitDirection = enum { right, down, + left, + up, auto, // splits along the larger direction - - // Note: we don't support top or left yet }; pub const SplitFocusDirection = enum {