Skip to content

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

@bes

Description

@bes

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

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

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<T>::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: <tauri::window::Window<R> 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: <tauri::webview::webview_window::WebviewWindow<R> 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: <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::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<R>::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: <tao::platform_impl::platform::app_state::EventLoopHandler<T> 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<T>::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: <tao::platform_impl::platform::app_state::EventLoopHandler<T> 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: <unknown>
  29: <unknown>
  30: <unknown>
  31: <unknown>
  32: <unknown>
  33: <unknown>
  34: <unknown>
  35: <unknown>
  36: <unknown>
  37: <unknown>
  38: <unknown>
  39: <unknown>
  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: <MethodFamily as objc2::__macro_helpers::msg_send_retained::MsgSend<Receiver,Return>>::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<T>::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<T>::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<T>::run
             at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tao-0.34.5/src/event_loop.rs:214:21
  47: <tauri_runtime_wry::Wry<T> as tauri_runtime::Runtime<T>>::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<R>::run
             at /Users/bes/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tauri-2.10.1/src/app.rs:1247:8
  49: tauri::app::Builder<R>::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:

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");

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions