From d0c6c4f367f3b3633804f6f45c0e22c5d536937c Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Fri, 13 Sep 2024 01:11:59 +0100 Subject: [PATCH 1/3] apprt/gtk: use toast UX from Adwaita if available Notify the user with in-app notifications if libadwaita is available. Co-authored-by: Paul Berg Signed-off-by: Tristan Partin --- src/apprt/gtk/App.zig | 7 +++++++ src/apprt/gtk/Window.zig | 29 ++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 67b28ff93..6a3d79d8a 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -353,6 +353,13 @@ pub fn reloadConfig(self: *App) !?*const Config { log.warn("error handling configuration changes err={}", .{err}); }; + if (adwaita.enabled(&self.config)) { + if (self.core_app.focusedSurface()) |core_surface| { + const surface = core_surface.rt_surface; + if (surface.container.window()) |window| window.onConfigReloaded(); + } + } + return &self.config; } diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 47fd63038..2ebfc1db6 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -41,6 +41,10 @@ notebook: Notebook, context_menu: *c.GtkWidget, +/// The libadwaita widget for receiving toast send requests. If libadwaita is +/// not used, this is null and unused. +toast_overlay: ?*c.GtkWidget, + pub fn create(alloc: Allocator, app: *App) !*Window { // Allocate a fixed pointer for our window. We try to minimize // allocations but windows and other GUI requirements are so minimal @@ -63,6 +67,7 @@ pub fn init(self: *Window, app: *App) !void { .header = null, .notebook = undefined, .context_menu = undefined, + .toast_overlay = undefined, }; // Create the window @@ -201,9 +206,15 @@ pub fn init(self: *Window, app: *App) !void { c.gtk_box_append(@ptrCast(box), warning_box); } + self.toast_overlay = if (self.isAdwWindow()) + c.adw_toast_overlay_new() + else + null; + // Setup our notebook self.notebook = Notebook.create(self); - c.gtk_box_append(@ptrCast(box), self.notebook.asWidget()); + c.adw_toast_overlay_set_child(@ptrCast(self.toast_overlay), @ptrCast(@alignCast(self.notebook.asWidget()))); + c.gtk_box_append(@ptrCast(box), self.toast_overlay); // If we have a tab overview then we can set it on our notebook. if (tab_overview_) |tab_overview| { @@ -462,6 +473,18 @@ pub fn focusCurrentTab(self: *Window) void { _ = c.gtk_widget_grab_focus(gl_area); } +pub fn onConfigReloaded(self: *Window) void { + self.sendToast("Reloaded the configuration"); +} + +fn sendToast(self: *Window, title: [:0]const u8) void { + if (self.toast_overlay) |toast_overlay| { + const toast = c.adw_toast_new(title); + c.adw_toast_set_timeout(toast, 3); + c.adw_toast_overlay_add_toast(@ptrCast(toast_overlay), toast); + } +} + // Note: we MUST NOT use the GtkButton parameter because gtkActionNewTab // sends an undefined value. fn gtkTabNewClick(_: *c.GtkButton, ud: ?*anyopaque) callconv(.C) void { @@ -697,6 +720,10 @@ fn gtkActionCopy( log.warn("error performing binding action error={}", .{err}); return; }; + + if (self.isAdwWindow()) { + self.sendToast("Copied to clipboard"); + } } fn gtkActionPaste( From 2f0b48e8ad565a045dfd93818b64b1bbfb3eb3b4 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 16 Sep 2024 10:12:09 -0700 Subject: [PATCH 2/3] apprt/gtk: tweaks --- src/apprt/gtk/Window.zig | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 2ebfc1db6..72b22ea41 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -478,11 +478,10 @@ pub fn onConfigReloaded(self: *Window) void { } fn sendToast(self: *Window, title: [:0]const u8) void { - if (self.toast_overlay) |toast_overlay| { - const toast = c.adw_toast_new(title); - c.adw_toast_set_timeout(toast, 3); - c.adw_toast_overlay_add_toast(@ptrCast(toast_overlay), toast); - } + const toast_overlay = self.toast_overlay orelse return; + const toast = c.adw_toast_new(title); + c.adw_toast_set_timeout(toast, 3); + c.adw_toast_overlay_add_toast(@ptrCast(toast_overlay), toast); } // Note: we MUST NOT use the GtkButton parameter because gtkActionNewTab From c48a1801f6fbf94563ab43e58dae3bac220f48d9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 16 Sep 2024 10:17:55 -0700 Subject: [PATCH 3/3] apprt/gtk: only setup the toast overlay if we have it enabled --- src/apprt/gtk/Window.zig | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 72b22ea41..08c518acf 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -206,15 +206,19 @@ pub fn init(self: *Window, app: *App) !void { c.gtk_box_append(@ptrCast(box), warning_box); } - self.toast_overlay = if (self.isAdwWindow()) - c.adw_toast_overlay_new() - else - null; - // Setup our notebook self.notebook = Notebook.create(self); - c.adw_toast_overlay_set_child(@ptrCast(self.toast_overlay), @ptrCast(@alignCast(self.notebook.asWidget()))); - c.gtk_box_append(@ptrCast(box), self.toast_overlay); + + // Setup our toast overlay if we have one + self.toast_overlay = if (self.isAdwWindow()) toast: { + const toast_overlay = c.adw_toast_overlay_new(); + c.adw_toast_overlay_set_child( + @ptrCast(toast_overlay), + @ptrCast(@alignCast(self.notebook.asWidget())), + ); + c.gtk_box_append(@ptrCast(box), toast_overlay); + break :toast toast_overlay; + } else null; // If we have a tab overview then we can set it on our notebook. if (tab_overview_) |tab_overview| {