From f1e81563d96376b03e8e19163aa79aa801793baf Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Wed, 1 Nov 2023 06:28:50 +0100 Subject: [PATCH] gtk: always remember focused surface before grabbing focus --- src/apprt/gtk/Paned.zig | 1 + src/apprt/gtk/Surface.zig | 1 + src/apprt/gtk/Tab.zig | 5 +++-- src/apprt/gtk/Window.zig | 4 ++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/apprt/gtk/Paned.zig b/src/apprt/gtk/Paned.zig index 10e7dc355..852409e12 100644 --- a/src/apprt/gtk/Paned.zig +++ b/src/apprt/gtk/Paned.zig @@ -86,6 +86,7 @@ pub fn setParent(self: *Paned, parent: Parent) void { pub fn focusSurfaceInPosition(self: *Paned, position: Position) void { const surface: *Surface = self.surfaceInPosition(position) orelse return; const widget = @as(*c.GtkWidget, @ptrCast(surface.gl_area)); + surface.tab.focus_child = surface; _ = c.gtk_widget_grab_focus(widget); } diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 59a9df4bb..3969200f1 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -836,6 +836,7 @@ fn gtkMouseDown( // If we don't have focus, grab it. const gl_widget = @as(*c.GtkWidget, @ptrCast(self.gl_area)); if (c.gtk_widget_has_focus(gl_widget) == 0) { + self.tab.focus_child = self; _ = c.gtk_widget_grab_focus(gl_widget); } diff --git a/src/apprt/gtk/Tab.zig b/src/apprt/gtk/Tab.zig index 5ded58f4c..69093b65b 100644 --- a/src/apprt/gtk/Tab.zig +++ b/src/apprt/gtk/Tab.zig @@ -93,8 +93,6 @@ pub fn init(self: *Tab, window: *Window, parent_: ?*CoreSurface) !void { errdefer surface.deinit(); self.child = Child{ .surface = surface }; - // // TODO: this needs to change - self.focus_child = surface; // Add Surface to the Tab const gl_area_widget = @as(*c.GtkWidget, @ptrCast(surface.gl_area)); @@ -122,6 +120,9 @@ pub fn init(self: *Tab, window: *Window, parent_: ?*CoreSurface) !void { c.gtk_notebook_set_show_tabs(window.notebook, 1); } + // TODO: This needs to happen before we show the page + self.focus_child = surface; + // Set the userdata of the box to point to this tab. c.g_object_set_data(@ptrCast(box_widget), GHOSTTY_TAB, self); diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index ae5efda43..b9f880707 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -313,6 +313,10 @@ fn closeSurfaceInPaned(self: *Window, surface: *Surface, paned: *Paned, position }, } + switch (sibling_child) { + .surface => |s| s.tab.focus_child = s, + else => {}, + } const widget = @as(*c.GtkWidget, @ptrCast(sibling_widget)); _ = c.gtk_widget_grab_focus(widget); }