On Orbital, implement various Window methods
Implement the following methods on the `Window`: - `Window::set_cursor_grab`. - `Window::set_cursor_visible`. - `Window::drag_window`. - `Window::drag_resize_window`. - `Window::set_transparent`. - `Window::set_visible`. - `Window::is_visible`. - `Window::set_resizable`. - `Window::is_resizable`. - `Window::set_maximized`. - `Window::is_maximized`. - `Window::set_decorations`. - `Window::is_decorated`. - `Window::set_window_level`. To make locked pointer useful, the `DeviceEvent::MouseMotion` event was also implemented.
This commit is contained in:
parent
273984a385
commit
6825fed073
4 changed files with 140 additions and 50 deletions
15
CHANGELOG.md
15
CHANGELOG.md
|
|
@ -53,6 +53,21 @@ Unreleased` header.
|
||||||
- On Orbital, fix `logical_key` and `text` not reported in `KeyEvent`.
|
- On Orbital, fix `logical_key` and `text` not reported in `KeyEvent`.
|
||||||
- On Orbital, implement `KeyEventExtModifierSupplement`.
|
- On Orbital, implement `KeyEventExtModifierSupplement`.
|
||||||
- On Orbital, map keys to `NamedKey` when possible.
|
- On Orbital, map keys to `NamedKey` when possible.
|
||||||
|
- On Orbital, implement `set_cursor_grab`.
|
||||||
|
- On Orbital, implement `set_cursor_visible`.
|
||||||
|
- On Orbital, implement `drag_window`.
|
||||||
|
- On Orbital, implement `drag_resize_window`.
|
||||||
|
- On Orbital, implement `set_transparent`.
|
||||||
|
- On Orbital, implement `set_visible`.
|
||||||
|
- On Orbital, implement `is_visible`.
|
||||||
|
- On Orbital, implement `set_resizable`.
|
||||||
|
- On Orbital, implement `is_resizable`.
|
||||||
|
- On Orbital, implement `set_maximized`.
|
||||||
|
- On Orbital, implement `is_maximized`.
|
||||||
|
- On Orbital, implement `set_decorations`.
|
||||||
|
- On Orbital, implement `is_decorated`.
|
||||||
|
- On Orbital, implement `set_window_level`.
|
||||||
|
- On Orbital, emit `DeviceEvent::MouseMotion`.
|
||||||
|
|
||||||
# 0.29.10
|
# 0.29.10
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,8 @@ use std::{
|
||||||
|
|
||||||
use bitflags::bitflags;
|
use bitflags::bitflags;
|
||||||
use orbclient::{
|
use orbclient::{
|
||||||
ButtonEvent, EventOption, FocusEvent, HoverEvent, KeyEvent, MouseEvent, MoveEvent, QuitEvent,
|
ButtonEvent, EventOption, FocusEvent, HoverEvent, KeyEvent, MouseEvent, MouseRelativeEvent,
|
||||||
ResizeEvent, ScrollEvent, TextInputEvent,
|
MoveEvent, QuitEvent, ResizeEvent, ScrollEvent, TextInputEvent,
|
||||||
};
|
};
|
||||||
use smol_str::SmolStr;
|
use smol_str::SmolStr;
|
||||||
|
|
||||||
|
|
@ -457,6 +457,14 @@ impl<T: 'static> EventLoop<T> {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
EventOption::MouseRelative(MouseRelativeEvent { dx, dy }) => {
|
||||||
|
event_handler(event::Event::DeviceEvent {
|
||||||
|
device_id: event::DeviceId(DeviceId),
|
||||||
|
event: event::DeviceEvent::MouseMotion {
|
||||||
|
delta: (dx as f64, dy as f64),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
EventOption::Button(ButtonEvent {
|
EventOption::Button(ButtonEvent {
|
||||||
left,
|
left,
|
||||||
middle,
|
middle,
|
||||||
|
|
@ -510,7 +518,7 @@ impl<T: 'static> EventLoop<T> {
|
||||||
// Acknowledge resize after event loop.
|
// Acknowledge resize after event loop.
|
||||||
event_state.resize_opt = Some((width, height));
|
event_state.resize_opt = Some((width, height));
|
||||||
}
|
}
|
||||||
//TODO: Clipboard
|
//TODO: Screen, Clipboard, Drop
|
||||||
EventOption::Hover(HoverEvent { entered }) => {
|
EventOption::Hover(HoverEvent { entered }) => {
|
||||||
if entered {
|
if entered {
|
||||||
event_handler(event::Event::WindowEvent {
|
event_handler(event::Event::WindowEvent {
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ use crate::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
EventLoopWindowTarget, MonitorHandle, RedoxSocket, TimeSocket, WindowId, WindowProperties,
|
EventLoopWindowTarget, MonitorHandle, OsError, RedoxSocket, TimeSocket, WindowId,
|
||||||
|
WindowProperties,
|
||||||
};
|
};
|
||||||
|
|
||||||
// These values match the values uses in the `window_new` function in orbital:
|
// These values match the values uses in the `window_new` function in orbital:
|
||||||
|
|
@ -21,7 +22,9 @@ use super::{
|
||||||
const ORBITAL_FLAG_ASYNC: char = 'a';
|
const ORBITAL_FLAG_ASYNC: char = 'a';
|
||||||
const ORBITAL_FLAG_BACK: char = 'b';
|
const ORBITAL_FLAG_BACK: char = 'b';
|
||||||
const ORBITAL_FLAG_FRONT: char = 'f';
|
const ORBITAL_FLAG_FRONT: char = 'f';
|
||||||
|
const ORBITAL_FLAG_HIDDEN: char = 'h';
|
||||||
const ORBITAL_FLAG_BORDERLESS: char = 'l';
|
const ORBITAL_FLAG_BORDERLESS: char = 'l';
|
||||||
|
const ORBITAL_FLAG_MAXIMIZED: char = 'm';
|
||||||
const ORBITAL_FLAG_RESIZABLE: char = 'r';
|
const ORBITAL_FLAG_RESIZABLE: char = 'r';
|
||||||
const ORBITAL_FLAG_TRANSPARENT: char = 't';
|
const ORBITAL_FLAG_TRANSPARENT: char = 't';
|
||||||
|
|
||||||
|
|
@ -57,11 +60,15 @@ impl Window {
|
||||||
// Async by default.
|
// Async by default.
|
||||||
let mut flag_str = ORBITAL_FLAG_ASYNC.to_string();
|
let mut flag_str = ORBITAL_FLAG_ASYNC.to_string();
|
||||||
|
|
||||||
|
if attrs.maximized {
|
||||||
|
flag_str.push(ORBITAL_FLAG_MAXIMIZED);
|
||||||
|
}
|
||||||
|
|
||||||
if attrs.resizable {
|
if attrs.resizable {
|
||||||
flag_str.push(ORBITAL_FLAG_RESIZABLE);
|
flag_str.push(ORBITAL_FLAG_RESIZABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: maximized, fullscreen, visible
|
//TODO: fullscreen
|
||||||
|
|
||||||
if attrs.transparent {
|
if attrs.transparent {
|
||||||
flag_str.push(ORBITAL_FLAG_TRANSPARENT);
|
flag_str.push(ORBITAL_FLAG_TRANSPARENT);
|
||||||
|
|
@ -71,6 +78,10 @@ impl Window {
|
||||||
flag_str.push(ORBITAL_FLAG_BORDERLESS);
|
flag_str.push(ORBITAL_FLAG_BORDERLESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !attrs.visible {
|
||||||
|
flag_str.push(ORBITAL_FLAG_HIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
match attrs.window_level {
|
match attrs.window_level {
|
||||||
window::WindowLevel::AlwaysOnBottom => {
|
window::WindowLevel::AlwaysOnBottom => {
|
||||||
flag_str.push(ORBITAL_FLAG_BACK);
|
flag_str.push(ORBITAL_FLAG_BACK);
|
||||||
|
|
@ -129,6 +140,23 @@ impl Window {
|
||||||
f(self)
|
f(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_flag(&self, flag: char) -> Result<bool, error::ExternalError> {
|
||||||
|
let mut buf: [u8; 4096] = [0; 4096];
|
||||||
|
let path = self
|
||||||
|
.window_socket
|
||||||
|
.fpath(&mut buf)
|
||||||
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
let properties = WindowProperties::new(path);
|
||||||
|
Ok(properties.flags.contains(flag))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_flag(&self, flag: char, value: bool) -> Result<(), error::ExternalError> {
|
||||||
|
self.window_socket
|
||||||
|
.write(format!("F,{flag},{}", if value { 1 } else { 0 }).as_bytes())
|
||||||
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn id(&self) -> WindowId {
|
pub fn id(&self) -> WindowId {
|
||||||
WindowId {
|
WindowId {
|
||||||
|
|
@ -254,17 +282,21 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_transparent(&self, _transparent: bool) {}
|
pub fn set_transparent(&self, transparent: bool) {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_TRANSPARENT, transparent);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_blur(&self, _blur: bool) {}
|
pub fn set_blur(&self, _blur: bool) {}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_visible(&self, _visibility: bool) {}
|
pub fn set_visible(&self, visible: bool) {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_HIDDEN, !visible);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_visible(&self) -> Option<bool> {
|
pub fn is_visible(&self) -> Option<bool> {
|
||||||
None
|
Some(!self.get_flag(ORBITAL_FLAG_HIDDEN).unwrap_or(false))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
@ -276,17 +308,13 @@ impl Window {
|
||||||
pub fn set_resize_increments(&self, _increments: Option<Size>) {}
|
pub fn set_resize_increments(&self, _increments: Option<Size>) {}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_resizable(&self, _resizeable: bool) {}
|
pub fn set_resizable(&self, resizeable: bool) {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_RESIZABLE, resizeable);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_resizable(&self) -> bool {
|
pub fn is_resizable(&self) -> bool {
|
||||||
let mut buf: [u8; 4096] = [0; 4096];
|
self.get_flag(ORBITAL_FLAG_RESIZABLE).unwrap_or(false)
|
||||||
let path = self
|
|
||||||
.window_socket
|
|
||||||
.fpath(&mut buf)
|
|
||||||
.expect("failed to read properties");
|
|
||||||
let properties = WindowProperties::new(path);
|
|
||||||
properties.flags.contains(ORBITAL_FLAG_RESIZABLE)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
@ -298,11 +326,13 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_maximized(&self, _maximized: bool) {}
|
pub fn set_maximized(&self, maximized: bool) {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_MAXIMIZED, maximized);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_maximized(&self) -> bool {
|
pub fn is_maximized(&self) -> bool {
|
||||||
false
|
self.get_flag(ORBITAL_FLAG_MAXIMIZED).unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
@ -314,21 +344,30 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_decorations(&self, _decorations: bool) {}
|
pub fn set_decorations(&self, decorations: bool) {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_BORDERLESS, !decorations);
|
||||||
#[inline]
|
|
||||||
pub fn is_decorated(&self) -> bool {
|
|
||||||
let mut buf: [u8; 4096] = [0; 4096];
|
|
||||||
let path = self
|
|
||||||
.window_socket
|
|
||||||
.fpath(&mut buf)
|
|
||||||
.expect("failed to read properties");
|
|
||||||
let properties = WindowProperties::new(path);
|
|
||||||
!properties.flags.contains(ORBITAL_FLAG_BORDERLESS)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_window_level(&self, _level: window::WindowLevel) {}
|
pub fn is_decorated(&self) -> bool {
|
||||||
|
!self.get_flag(ORBITAL_FLAG_BORDERLESS).unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_window_level(&self, level: window::WindowLevel) {
|
||||||
|
match level {
|
||||||
|
window::WindowLevel::AlwaysOnBottom => {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_BACK, true);
|
||||||
|
}
|
||||||
|
window::WindowLevel::Normal => {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_BACK, false);
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_FRONT, false);
|
||||||
|
}
|
||||||
|
window::WindowLevel::AlwaysOnTop => {
|
||||||
|
let _ = self.set_flag(ORBITAL_FLAG_FRONT, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_window_icon(&self, _window_icon: Option<crate::icon::Icon>) {}
|
pub fn set_window_icon(&self, _window_icon: Option<crate::icon::Icon>) {}
|
||||||
|
|
@ -359,30 +398,58 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_grab(&self, _: window::CursorGrabMode) -> Result<(), error::ExternalError> {
|
pub fn set_cursor_grab(
|
||||||
Err(error::ExternalError::NotSupported(
|
&self,
|
||||||
error::NotSupportedError::new(),
|
mode: window::CursorGrabMode,
|
||||||
))
|
) -> Result<(), error::ExternalError> {
|
||||||
|
let (grab, relative) = match mode {
|
||||||
|
window::CursorGrabMode::None => (false, false),
|
||||||
|
window::CursorGrabMode::Confined => (true, false),
|
||||||
|
window::CursorGrabMode::Locked => (true, true),
|
||||||
|
};
|
||||||
|
self.window_socket
|
||||||
|
.write(format!("M,G,{}", if grab { 1 } else { 0 }).as_bytes())
|
||||||
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
self.window_socket
|
||||||
|
.write(format!("M,R,{}", if relative { 1 } else { 0 }).as_bytes())
|
||||||
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_visible(&self, _: bool) {}
|
pub fn set_cursor_visible(&self, visible: bool) {
|
||||||
|
let _ = self
|
||||||
|
.window_socket
|
||||||
|
.write(format!("M,C,{}", if visible { 1 } else { 0 }).as_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_window(&self) -> Result<(), error::ExternalError> {
|
pub fn drag_window(&self) -> Result<(), error::ExternalError> {
|
||||||
Err(error::ExternalError::NotSupported(
|
self.window_socket
|
||||||
error::NotSupportedError::new(),
|
.write(b"D")
|
||||||
))
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_resize_window(
|
pub fn drag_resize_window(
|
||||||
&self,
|
&self,
|
||||||
_direction: window::ResizeDirection,
|
direction: window::ResizeDirection,
|
||||||
) -> Result<(), error::ExternalError> {
|
) -> Result<(), error::ExternalError> {
|
||||||
Err(error::ExternalError::NotSupported(
|
let arg = match direction {
|
||||||
error::NotSupportedError::new(),
|
window::ResizeDirection::East => "R",
|
||||||
))
|
window::ResizeDirection::North => "T",
|
||||||
|
window::ResizeDirection::NorthEast => "T,R",
|
||||||
|
window::ResizeDirection::NorthWest => "T,L",
|
||||||
|
window::ResizeDirection::South => "B",
|
||||||
|
window::ResizeDirection::SouthEast => "B,R",
|
||||||
|
window::ResizeDirection::SouthWest => "B,L",
|
||||||
|
window::ResizeDirection::West => "L",
|
||||||
|
};
|
||||||
|
self.window_socket
|
||||||
|
.write(format!("D,{}", arg).as_bytes())
|
||||||
|
.map_err(|err| error::ExternalError::Os(os_error!(OsError::new(err))))?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
||||||
|
|
@ -946,7 +946,7 @@ impl Window {
|
||||||
///
|
///
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **Web / iOS / Android / Orbital:** Unsupported.
|
/// - **Web / iOS / Android:** Unsupported.
|
||||||
/// - **X11:** Can only be set while building the window, with [`WindowBuilder::with_transparent`].
|
/// - **X11:** Can only be set while building the window, with [`WindowBuilder::with_transparent`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_transparent(&self, transparent: bool) {
|
pub fn set_transparent(&self, transparent: bool) {
|
||||||
|
|
@ -1079,7 +1079,7 @@ impl Window {
|
||||||
///
|
///
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
/// - **iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_maximized(&self, maximized: bool) {
|
pub fn set_maximized(&self, maximized: bool) {
|
||||||
self.window
|
self.window
|
||||||
|
|
@ -1090,7 +1090,7 @@ impl Window {
|
||||||
///
|
///
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **iOS / Android / Web / Orbital:** Unsupported.
|
/// - **iOS / Android / Web:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_maximized(&self) -> bool {
|
pub fn is_maximized(&self) -> bool {
|
||||||
self.window.maybe_wait_on_main(|w| w.is_maximized())
|
self.window.maybe_wait_on_main(|w| w.is_maximized())
|
||||||
|
|
@ -1450,7 +1450,7 @@ impl Window {
|
||||||
/// - **Wayland:** The cursor is only hidden within the confines of the window.
|
/// - **Wayland:** The cursor is only hidden within the confines of the window.
|
||||||
/// - **macOS:** The cursor is hidden as long as the window has input focus, even if the cursor is
|
/// - **macOS:** The cursor is hidden as long as the window has input focus, even if the cursor is
|
||||||
/// outside of the window.
|
/// outside of the window.
|
||||||
/// - **iOS / Android / Orbital:** Unsupported.
|
/// - **iOS / Android:** Unsupported.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_cursor_visible(&self, visible: bool) {
|
pub fn set_cursor_visible(&self, visible: bool) {
|
||||||
self.window
|
self.window
|
||||||
|
|
@ -1467,7 +1467,7 @@ impl Window {
|
||||||
/// - **X11:** Un-grabs the cursor.
|
/// - **X11:** Un-grabs the cursor.
|
||||||
/// - **Wayland:** Requires the cursor to be inside the window to be dragged.
|
/// - **Wayland:** Requires the cursor to be inside the window to be dragged.
|
||||||
/// - **macOS:** May prevent the button release event to be triggered.
|
/// - **macOS:** May prevent the button release event to be triggered.
|
||||||
/// - **iOS / Android / Web / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
||||||
self.window.maybe_wait_on_main(|w| w.drag_window())
|
self.window.maybe_wait_on_main(|w| w.drag_window())
|
||||||
|
|
@ -1481,7 +1481,7 @@ impl Window {
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **macOS:** Always returns an [`ExternalError::NotSupported`]
|
/// - **macOS:** Always returns an [`ExternalError::NotSupported`]
|
||||||
/// - **iOS / Android / Web / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn drag_resize_window(&self, direction: ResizeDirection) -> Result<(), ExternalError> {
|
pub fn drag_resize_window(&self, direction: ResizeDirection) -> Result<(), ExternalError> {
|
||||||
self.window
|
self.window
|
||||||
|
|
@ -1642,7 +1642,7 @@ pub enum CursorGrabMode {
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **macOS:** Not implemented. Always returns [`ExternalError::NotSupported`] for now.
|
/// - **macOS:** Not implemented. Always returns [`ExternalError::NotSupported`] for now.
|
||||||
/// - **iOS / Android / Web / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android / Web:** Always returns an [`ExternalError::NotSupported`].
|
||||||
Confined,
|
Confined,
|
||||||
|
|
||||||
/// The cursor is locked inside the window area to the certain position.
|
/// The cursor is locked inside the window area to the certain position.
|
||||||
|
|
@ -1653,7 +1653,7 @@ pub enum CursorGrabMode {
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **X11 / Windows:** Not implemented. Always returns [`ExternalError::NotSupported`] for now.
|
/// - **X11 / Windows:** Not implemented. Always returns [`ExternalError::NotSupported`] for now.
|
||||||
/// - **iOS / Android / Orbital:** Always returns an [`ExternalError::NotSupported`].
|
/// - **iOS / Android:** Always returns an [`ExternalError::NotSupported`].
|
||||||
Locked,
|
Locked,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue