Browse Source

feat(core): Expose "ignore_cursor_events" to Tauri and API (#5032)

Co-authored-by: Thomas Kilsby <>
Co-authored-by: Lucas Nogueira <lucas@tauri.studio>
jabza 2 years ago
parent
commit
eedfa5e618

+ 11 - 0
core/tauri-runtime-wry/src/lib.rs

@@ -1051,6 +1051,7 @@ pub enum WindowMessage {
   SetCursorVisible(bool),
   SetCursorIcon(CursorIcon),
   SetCursorPosition(Position),
+  SetIgnoreCursorEvents(bool),
   DragWindow,
   UpdateMenuItem(u16, MenuUpdate),
   RequestRedraw,
@@ -1493,6 +1494,13 @@ impl<T: UserEvent> Dispatch<T> for WryDispatcher<T> {
     )
   }
 
+  fn set_ignore_cursor_events(&self, ignore: bool) -> crate::Result<()> {
+    send_user_message(
+      &self.context,
+      Message::Window(self.window_id, WindowMessage::SetIgnoreCursorEvents(ignore)),
+    )
+  }
+
   fn start_dragging(&self) -> Result<()> {
     send_user_message(
       &self.context,
@@ -2342,6 +2350,9 @@ fn handle_user_message<T: UserEvent>(
             WindowMessage::SetCursorPosition(position) => {
               let _ = window.set_cursor_position(PositionWrapper::from(position).0);
             }
+            WindowMessage::SetIgnoreCursorEvents(ignore) => {
+              let _ = window.set_ignore_cursor_events(ignore);
+            }
             WindowMessage::DragWindow => {
               let _ = window.drag_window();
             }

+ 3 - 0
core/tauri-runtime/src/lib.rs

@@ -630,6 +630,9 @@ pub trait Dispatch<T: UserEvent>: Debug + Clone + Send + Sync + Sized + 'static
   /// Changes the position of the cursor in window coordinates.
   fn set_cursor_position<Pos: Into<Position>>(&self, position: Pos) -> Result<()>;
 
+  /// Ignores the window cursor events.
+  fn set_ignore_cursor_events(&self, ignore: bool) -> Result<()>;
+
   /// Starts dragging the window.
   fn start_dragging(&self) -> Result<()>;
 

+ 10 - 0
core/tauri-utils/src/config.rs

@@ -1337,6 +1337,9 @@ pub struct WindowAllowlistConfig {
   /// Allows setting the cursor position.
   #[serde(default, alias = "set-cursor-position")]
   pub set_cursor_position: bool,
+  /// Allows ignoring cursor events.
+  #[serde(default, alias = "set-ignore-cursor-events")]
+  pub set_ignore_cursor_events: bool,
   /// Allows start dragging on the window.
   #[serde(default, alias = "start-dragging")]
   pub start_dragging: bool,
@@ -1375,6 +1378,7 @@ impl Allowlist for WindowAllowlistConfig {
       set_cursor_visible: true,
       set_cursor_icon: true,
       set_cursor_position: true,
+      set_ignore_cursor_events: true,
       start_dragging: true,
       print: true,
     };
@@ -1434,6 +1438,12 @@ impl Allowlist for WindowAllowlistConfig {
         set_cursor_position,
         "window-set-cursor-position"
       );
+      check_feature!(
+        self,
+        features,
+        set_ignore_cursor_events,
+        "window-set-ignore-cursor-events"
+      );
       check_feature!(self, features, start_dragging, "window-start-dragging");
       check_feature!(self, features, print, "window-print");
       features

+ 2 - 0
core/tauri/Cargo.toml

@@ -250,6 +250,7 @@ window-all = [
   "window-set-cursor-visible",
   "window-set-cursor-icon",
   "window-set-cursor-position",
+  "window-set-ignore-cursor-events",
   "window-start-dragging",
   "window-print"
 ]
@@ -279,6 +280,7 @@ window-set-cursor-grab = [ ]
 window-set-cursor-visible = [ ]
 window-set-cursor-icon = [ ]
 window-set-cursor-position = [ ]
+window-set-ignore-cursor-events = [ ]
 window-start-dragging = [ ]
 window-print = [ ]
 config-json5 = [ "tauri-macros/config-json5" ]

+ 1 - 0
core/tauri/build.rs

@@ -93,6 +93,7 @@ fn main() {
       "set-cursor-visible",
       "set-cursor-icon",
       "set-cursor-position",
+      "set-ignore-cursor-events",
       "start-dragging",
       "print",
     ],

File diff suppressed because it is too large
+ 0 - 0
core/tauri/scripts/bundle.js


+ 9 - 0
core/tauri/src/endpoints/window.rs

@@ -127,6 +127,8 @@ pub enum WindowManagerCmd {
   SetCursorIcon(CursorIcon),
   #[cfg(window_set_cursor_position)]
   SetCursorPosition(Position),
+  #[cfg(window_set_ignore_cursor_events)]
+  SetIgnoreCursorEvents(bool),
   #[cfg(window_start_dragging)]
   StartDragging,
   #[cfg(window_print)]
@@ -173,6 +175,9 @@ pub fn into_allowlist_error(variant: &str) -> crate::Error {
     "setCursorPosition" => {
       crate::Error::ApiNotAllowlisted("window > setCursorPosition".to_string())
     }
+    "setIgnoreCursorEvents" => {
+      crate::Error::ApiNotAllowlisted("window > setIgnoreCursorEvents".to_string())
+    }
     "startDragging" => crate::Error::ApiNotAllowlisted("window > startDragging".to_string()),
     "print" => crate::Error::ApiNotAllowlisted("window > print".to_string()),
     "internalToggleMaximize" => {
@@ -314,6 +319,10 @@ impl Cmd {
       WindowManagerCmd::SetCursorIcon(icon) => window.set_cursor_icon(icon)?,
       #[cfg(window_set_cursor_position)]
       WindowManagerCmd::SetCursorPosition(position) => window.set_cursor_position(position)?,
+      #[cfg(window_set_ignore_cursor_events)]
+      WindowManagerCmd::SetIgnoreCursorEvents(ignore_cursor) => {
+        window.set_ignore_cursor_events(ignore_cursor)?
+      }
       #[cfg(window_start_dragging)]
       WindowManagerCmd::StartDragging => window.start_dragging()?,
       #[cfg(window_print)]

+ 1 - 0
core/tauri/src/lib.rs

@@ -145,6 +145,7 @@
 //! - **window-set-cursor-visible**: Enables the [`setCursorVisible` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#setcursorvisible).
 //! - **window-set-cursor-icon**: Enables the [`setCursorIcon` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#setcursoricon).
 //! - **window-set-cursor-position**: Enables the [`setCursorPosition` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#setcursorposition).
+//! - **window-set-ignore-cursor-events**: Enables the [`setIgnoreCursorEvents` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#setignorecursorevents).
 //! - **window-start-dragging**: Enables the [`startDragging` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#startdragging).
 //! - **window-print**: Enables the [`print` API](https://tauri.app/en/docs/api/js/classes/window.WebviewWindow#print).
 

+ 4 - 0
core/tauri/src/test/mock_runtime.rs

@@ -500,6 +500,10 @@ impl<T: UserEvent> Dispatch<T> for MockDispatcher {
     Ok(())
   }
 
+  fn set_ignore_cursor_events(&self, ignore: bool) -> Result<()> {
+    Ok(())
+  }
+
   fn start_dragging(&self) -> Result<()> {
     Ok(())
   }

+ 9 - 0
core/tauri/src/window.rs

@@ -1175,6 +1175,15 @@ impl<R: Runtime> Window<R> {
       .map_err(Into::into)
   }
 
+  /// Ignores the window cursor events.
+  pub fn set_ignore_cursor_events(&self, ignore: bool) -> crate::Result<()> {
+    self
+      .window
+      .dispatcher
+      .set_ignore_cursor_events(ignore)
+      .map_err(Into::into)
+  }
+
   /// Starts dragging the window.
   pub fn start_dragging(&self) -> crate::Result<()> {
     self.window.dispatcher.start_dragging().map_err(Into::into)

File diff suppressed because it is too large
+ 0 - 0
examples/api/dist/assets/index.js


+ 6 - 0
examples/api/src/views/Window.svelte

@@ -87,6 +87,7 @@
   let cursorX = null
   let cursorY = null
   let cursorIcon = 'default'
+  let cursorIgnoreEvents = false
   let windowTitle = 'Awesome Tauri Example!'
 
   function openUrl() {
@@ -212,6 +213,7 @@
     windowMap[selectedWindow]?.setCursorPosition(
       new PhysicalPosition(cursorX, cursorY)
     )
+  $: windowMap[selectedWindow]?.setIgnoreCursorEvents(cursorIgnoreEvents)
 </script>
 
 <div class="flex flex-col children:grow gap-2">
@@ -413,6 +415,10 @@
         <input type="checkbox" bind:checked={cursorVisible} />
         Visible
       </label>
+      <label>
+        <input type="checkbox" bind:checked={cursorIgnoreEvents} />
+        Ignore events
+      </label>
     </div>
     <div class="flex gap-2">
       <label>

+ 29 - 0
tooling/api/src/window.ts

@@ -40,6 +40,7 @@
  *         "setCursorVisible": true,
  *         "setCursorIcon": true,
  *         "setCursorPosition": true,
+ *         "setIgnoreCursorEvents": true,
  *         "startDragging": true,
  *         "print": true
  *       }
@@ -1510,6 +1511,34 @@ class WindowManager extends WebviewWindowHandle {
     })
   }
 
+  /**
+   * Changes the cursor events behavior.
+   *
+   * @example
+   * ```typescript
+   * import { appWindow } from '@tauri-apps/api/window';
+   * await appWindow.setIgnoreCursorEvents(true);
+   * ```
+   *
+   * @param ignore `true` to ignore the cursor events; `false` to process them as usual.
+   * @returns A promise indicating the success or failure of the operation.
+   */
+  async setIgnoreCursorEvents(ignore: boolean): Promise<void> {
+    return invokeTauriCommand({
+      __tauriModule: 'Window',
+      message: {
+        cmd: 'manage',
+        data: {
+          label: this.label,
+          cmd: {
+            type: 'setIgnoreCursorEvents',
+            payload: ignore
+          }
+        }
+      }
+    })
+  }
+
   /**
    * Starts dragging the window.
    * @example

+ 8 - 0
tooling/cli/schema.json

@@ -108,6 +108,7 @@
             "setFocus": false,
             "setFullscreen": false,
             "setIcon": false,
+            "setIgnoreCursorEvents": false,
             "setMaxSize": false,
             "setMinSize": false,
             "setPosition": false,
@@ -375,6 +376,7 @@
               "setFocus": false,
               "setFullscreen": false,
               "setIcon": false,
+              "setIgnoreCursorEvents": false,
               "setMaxSize": false,
               "setMinSize": false,
               "setPosition": false,
@@ -1552,6 +1554,7 @@
             "setFocus": false,
             "setFullscreen": false,
             "setIcon": false,
+            "setIgnoreCursorEvents": false,
             "setMaxSize": false,
             "setMinSize": false,
             "setPosition": false,
@@ -1940,6 +1943,11 @@
           "default": false,
           "type": "boolean"
         },
+        "setIgnoreCursorEvents": {
+          "description": "Allows ignoring cursor events.",
+          "default": false,
+          "type": "boolean"
+        },
         "startDragging": {
           "description": "Allows start dragging on the window.",
           "default": false,

Some files were not shown because too many files changed in this diff