From 958021682b3e1b84fbce83f8c21f2bbf41c03e0b Mon Sep 17 00:00:00 2001 From: Iason Paraskevopoulos Date: Tue, 15 Sep 2026 17:44:58 +0100 Subject: [PATCH 1/4] Fix tray window positioning on external monitors --- tauri/src-tauri/Cargo.toml | 4 ++-- tauri/src-tauri/src/lib.rs | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tauri/src-tauri/Cargo.toml b/tauri/src-tauri/Cargo.toml index 3f5b69ea..d3161d61 100644 --- a/tauri/src-tauri/Cargo.toml +++ b/tauri/src-tauri/Cargo.toml @@ -36,7 +36,7 @@ tauri-plugin-global-shortcut = "2" tauri-plugin-updater = "2.7.1" [dependencies] -tauri = { version = "2.6.1", features = ["macos-private-api", "tray-icon", "image-ico"] } +tauri = { version = "2.10.1", features = ["macos-private-api", "tray-icon", "image-ico"] } tauri-plugin-positioner = { version = "2.0.0", features = ["tray-icon"] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -50,7 +50,7 @@ tauri-plugin-notification = "2" tauri-plugin-process = "2" tauri-plugin-shell = "2" tauri-plugin-dialog = "2" -tauri-plugin-clipboard-manager = "2.2.0" +tauri-plugin-clipboard-manager = "2.3.2" tauri-plugin-os = "2" tauri-plugin-fs = "2" dirs = "5.0.1" diff --git a/tauri/src-tauri/src/lib.rs b/tauri/src-tauri/src/lib.rs index 8b49e229..5a53256d 100644 --- a/tauri/src-tauri/src/lib.rs +++ b/tauri/src-tauri/src/lib.rs @@ -422,16 +422,23 @@ pub fn center_window_on_tray(window: &WebviewWindow, tray_rect: Rect, show_windo * working as expected, probably for the same reason as the window size. */ let mut scale = 1.0; - /* The tray rect position is in physical units */ + /* The tray rect position is in physical units. Its top edge can sit just + * outside the monitor (for example y == -2 on an external display), so + * use the icon center for monitor detection. */ let tray_pos: PhysicalPosition = tray_rect.position.to_physical(1.0); + let tray_size_at_1x: PhysicalSize = tray_rect.size.to_physical(1.0); + let tray_center = PhysicalPosition::new( + tray_pos.x + (tray_size_at_1x.width / 2.0) as i32, + tray_pos.y + (tray_size_at_1x.height / 2.0) as i32, + ); let mut found_monitor = false; let monitors = window.available_monitors(); if let Ok(monitors) = monitors { for monitor in monitors { let monitor_pos = monitor.position(); let monitor_size = monitor.size(); - let x_offset = tray_pos.x - monitor_pos.x; - let y_offset = tray_pos.y - monitor_pos.y; + let x_offset = tray_center.x - monitor_pos.x; + let y_offset = tray_center.y - monitor_pos.y; if (x_offset >= 0) && (x_offset <= (monitor_size.width as i32)) && (y_offset >= 0) @@ -449,7 +456,7 @@ pub fn center_window_on_tray(window: &WebviewWindow, tray_rect: Rect, show_windo if !found_monitor { log::warn!( - "center_window_on_tray: Tray position {tray_pos:?} is outside all monitors, skipping" + "center_window_on_tray: Tray center {tray_center:?} is outside all monitors, skipping" ); return; } From 09d6172b4eb0af0a698b62b37d4b79f50347a079 Mon Sep 17 00:00:00 2001 From: Iason Paraskevopoulos Date: Tue, 15 Sep 2026 17:53:27 +0100 Subject: [PATCH 2/4] chore: bump release --- tauri/src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tauri/src-tauri/tauri.conf.json b/tauri/src-tauri/tauri.conf.json index 48af8ebd..eb7e6965 100644 --- a/tauri/src-tauri/tauri.conf.json +++ b/tauri/src-tauri/tauri.conf.json @@ -29,7 +29,7 @@ }, "productName": "hopp", "mainBinaryName": "hopp", - "version": "1.0.29", + "version": "1.0.30", "identifier": "com.hopp.app", "plugins": { "updater": { From 7ea8ab7326e72844e6f27d5e1877c8049b4cac92 Mon Sep 17 00:00:00 2001 From: Iason Paraskevopoulos Date: Tue, 15 Sep 2026 17:53:50 +0100 Subject: [PATCH 3/4] fix: setting drag --- tauri/src/windows/settings/main.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tauri/src/windows/settings/main.tsx b/tauri/src/windows/settings/main.tsx index 515f07b5..02911c04 100644 --- a/tauri/src/windows/settings/main.tsx +++ b/tauri/src/windows/settings/main.tsx @@ -470,9 +470,9 @@ function SettingsWindow() { return (
-
+
-
+

Settings

From 022ea03848b8f87243db36d7978d071f81af9919 Mon Sep 17 00:00:00 2001 From: Iason Paraskevopoulos Date: Tue, 15 Sep 2026 18:24:26 +0100 Subject: [PATCH 4/4] fix: improve non-retina window capture quality --- core/src/capture/macos_stream.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/capture/macos_stream.rs b/core/src/capture/macos_stream.rs index 1e528ebe..fee70b18 100644 --- a/core/src/capture/macos_stream.rs +++ b/core/src/capture/macos_stream.rs @@ -239,6 +239,7 @@ impl Stream { let frame = window.frame(); let filter = SCContentFilter::create().with_window(&window).build(); let backing_scale = f64::from(filter.point_pixel_scale()); + let capture_scale = backing_scale.max(2.0); *self.frame.lock().unwrap() = Frame { origin_x: frame.origin.x, origin_y: frame.origin.y, @@ -247,8 +248,8 @@ impl Stream { height: frame.size.height, }, }; - let native_width = (frame.size.width * backing_scale) as u32; - let native_height = (frame.size.height * backing_scale) as u32; + let native_width = (frame.size.width * capture_scale) as u32; + let native_height = (frame.size.height * capture_scale) as u32; let (width, height) = capture_dimensions( native_width, native_height, @@ -373,8 +374,9 @@ impl Stream { let scale_factor = info.scale_factor.unwrap_or(1.0); if crop_window { if let Some(screen_rect) = info.screen_rect { - let native_width = (screen_rect.size.width * scale_factor) as u32; - let native_height = (screen_rect.size.height * scale_factor) as u32; + let capture_scale = scale_factor.max(2.0); + let native_width = (screen_rect.size.width * capture_scale) as u32; + let native_height = (screen_rect.size.height * capture_scale) as u32; let next_resize_target = capture_dimensions( native_width, native_height,