tauri-apps / tauri-apps/plugins-workspace

tauri-plugin-positioner-2.3.1 crashes when used on two different screens

Open
#3,284 0 comments 0 reactions 0 assignees Claimed by @johnyburd View on GitHub
type: bug
Dominant language
Rust
Stars
1.8k
Forks
602
Avg merge
4d 14h
Merged PRs (30d)
9

Description

### Describe the bug

When using two different screens, one external 24" monitor, and one internal 16" monitor, tauri-plugin-positioner crashes when opened first on one, then unplugging it, and then opening it on the second one.

### Reproduction

Step-by-step:
* Only 24" external screen used
* Start application, tray icon visible
* Click tray icon -> App opens up at the correct position
* Disconnect from USB hub, open laptop lid
* Only 16" internal screen used at this point
* Click tray icon -> Application instantly crashes with below stack trace

### Expected behavior

App should not crash when moving between external and internal screen

### Full `tauri info` output

```text
npm run tauri info 101 ↵

> tauri
> tauri info

[✔] Environment
- OS: Mac OS 26.3.0 arm64 (X64)
✔ Xcode Command Line Tools: installed
✔ Xcode: 26.2
✔ rustc: 1.90.0 (1159e78c4 2025-09-14)
✔ cargo: 1.90.0 (840b83a10 2025-07-30)
✔ rustup: 1.28.2 (e4f3ad6f8 2025-04-28)
✔ Rust toolchain: stable-aarch64-apple-darwin (default)
- node: 24.11.1
- yarn: 1.22.22
- npm: 11.6.2

[-] Packages
- tauri 🦀: 2.10.1, (outdated, latest: 2.10.2)
- tauri-build 🦀: 2.5.5
- wry 🦀: 0.54.2
- tao 🦀: 0.34.5
- @tauri-apps/api ⱼₛ: 2.10.1
- @tauri-apps/cli ⱼₛ: 2.10.0

[-] Plugins
- tauri-plugin-positioner 🦀: 2.3.1
- @tauri-apps/plugin-positioner ⱼₛ: not installed!
- tauri-plugin-opener 🦀: 2.5.3
- @tauri-apps/plugin-opener ⱼₛ: 2.5.3
- tauri-plugin-log 🦀: 2.8.0
- @tauri-apps/plugin-log ⱼₛ: 2.8.0

[-] App
- build-type: bundle
- CSP: unset
- frontendDist: ../../apps/my/build/webpack
- devUrl: http://localhost:8000/
- framework: React
- bundler: Webpack
```

### Stack trace

```text
thread 'main' panicked at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-plugin-positioner-2.3.1/src/ext.rs:155:44:
called `Option::unwrap()` on a `None` value
stack backtrace:
0: __rustc::rust_begin_unwind
at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library/std/src/panicking.rs:697:5
1: core::panicking::panic_fmt
at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library/core/src/panicking.rs:75:14
2: core::panicking::panic
at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library/core/src/panicking.rs:145:5
3: core::option::unwrap_failed
at /rustc/1159e78c4747b02ef996e55082b704c09b970588/library/core/src/option.rs:2130:5
4: core::option::Option::unwrap
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/option.rs:1009:21
5: tauri_plugin_positioner::ext::calculate_position
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-plugin-positioner-2.3.1/src/ext.rs:155:44
6: as tauri_plugin_positioner::ext::WindowExt>::move_window_constrained
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-plugin-positioner-2.3.1/src/ext.rs:85:31
7: as tauri_plugin_positioner::ext::WindowExt>::move_window_constrained
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-plugin-positioner-2.3.1/src/ext.rs:65:32
8: my_lib::run::{{closure}}::{{closure}}
at ./src/lib.rs:107:49
9: as core::ops::function::Fn>::call
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/alloc/src/boxed.rs:1985:9
10: tauri::app::on_event_loop_event
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-2.10.1/src/app.rs:2468:17
11: tauri::app::App::make_run_event_loop_callback::{{closure}}
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-2.10.1/src/app.rs:1313:21
12: tauri_runtime_wry::handle_event_loop
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-runtime-wry-2.10.0/src/lib.rs:4235:32
13: tauri_runtime_wry::make_event_handler::{{closure}}
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-runtime-wry-2.10.0/src/lib.rs:3174:5
14: as tao::platform_impl::platform::app_state::EventHandler>::handle_user_events::{{closure}}
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/app_state.rs:117:11
15: tao::platform_impl::platform::app_state::EventLoopHandler::with_callback
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/app_state.rs:79:7
16: as tao::platform_impl::platform::app_state::EventHandler>::handle_user_events
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/app_state.rs:111:10
17: tao::platform_impl::platform::app_state::Handler::handle_user_events
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/app_state.rs:217:16
18: tao::platform_impl::platform::app_state::AppState::cleared
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/app_state.rs:394:13
19: tao::platform_impl::platform::observer::control_flow_end_handler::{{closure}}
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/observer.rs:187:11
20: tao::platform_impl::platform::observer::control_flow_handler::{{closure}}
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/observer.rs:148:5
21: std::panicking::catch_unwind::do_call
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:589:40
22: ___rust_try
23: std::panicking::catch_unwind
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/std/src/panicking.rs:552:19
24: std::panic::catch_unwind
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/std/src/panic.rs:359:14
25: tao::platform_impl::platform::event_loop::stop_app_on_panic
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/event_loop.rs:277:9
26: tao::platform_impl::platform::observer::control_flow_handler
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/observer.rs:146:3
27: tao::platform_impl::platform::observer::control_flow_end_handler
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/observer.rs:182:5
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40: <() as objc2::encode::EncodeArguments>::__invoke
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/objc2-0.6.3/src/encode.rs:433:26
41: objc2::runtime::message_receiver::msg_send_primitive::send
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/objc2-0.6.3/src/runtime/message_receiver.rs:172:18
42: objc2::runtime::message_receiver::MessageReceiver::send_message
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/objc2-0.6.3/src/runtime/message_receiver.rs:432:38
43: >::send_message
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/objc2-0.6.3/src/__macro_helpers/msg_send_retained.rs:35:28
44: tao::platform_impl::platform::event_loop::EventLoop::run_return
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/event_loop.rs:234:16
45: tao::platform_impl::platform::event_loop::EventLoop::run
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/platform_impl/macos/event_loop.rs:201:26
46: tao::event_loop::EventLoop::run
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/event_loop.rs:214:21
47: as tauri_runtime::Runtime>::run
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-runtime-wry-2.10.0/src/lib.rs:3118:21
48: tauri::app::App::run
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-2.10.1/src/app.rs:1247:8
49: tauri::app::Builder::run
at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-2.10.1/src/app.rs:2299:26
50: my_lib::run
at ./src/lib.rs:127:10
51: my::main
at ./src/main.rs:5:5
52: core::ops::function::FnOnce::call_once
at /Users/bes/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/ops/function.rs:253:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
```

### Additional context

Code:

```rust
tauri::Builder::default()
.plugin(
tauri_plugin_log::Builder::new()
.level(tauri_plugin_log::log::LevelFilter::Info)
.build(),
)
.setup(|app| {
let app_handle = app.handle().clone();

app_handle.plugin(tauri_plugin_positioner::init()).unwrap();

TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.icon_as_template(true)
.on_tray_icon_event(|tray_handle, event| {
let app_handle = tray_handle.app_handle();
tauri_plugin_positioner::on_tray_event(tray_handle.app_handle(), &event);
// More stuff ...
})
.build(app)?;

#[cfg(target_os = "macos")]
app.set_activation_policy(tauri::ActivationPolicy::Accessory);

Ok(())
}
.plugin(tauri_plugin_opener::init())
.invoke_handler(tauri::generate_handler![greet])
.run(tauri::generate_context!())
.expect("error while running tauri application");
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.