feat(x11): Add Window::drag_resize_window (#2515)
This commit is contained in:
parent
08ce3af3e1
commit
9225b2812e
14 changed files with 280 additions and 15 deletions
|
|
@ -4,6 +4,17 @@ use once_cell::sync::Lazy;
|
|||
|
||||
use super::*;
|
||||
|
||||
// https://specifications.freedesktop.org/wm-spec/latest/ar01s04.html#idm46075117309248
|
||||
pub const MOVERESIZE_TOPLEFT: isize = 0;
|
||||
pub const MOVERESIZE_TOP: isize = 1;
|
||||
pub const MOVERESIZE_TOPRIGHT: isize = 2;
|
||||
pub const MOVERESIZE_RIGHT: isize = 3;
|
||||
pub const MOVERESIZE_BOTTOMRIGHT: isize = 4;
|
||||
pub const MOVERESIZE_BOTTOM: isize = 5;
|
||||
pub const MOVERESIZE_BOTTOMLEFT: isize = 6;
|
||||
pub const MOVERESIZE_LEFT: isize = 7;
|
||||
pub const MOVERESIZE_MOVE: isize = 8;
|
||||
|
||||
// This info is global to the window manager.
|
||||
static SUPPORTED_HINTS: Lazy<Mutex<Vec<ffi::Atom>>> =
|
||||
Lazy::new(|| Mutex::new(Vec::with_capacity(0)));
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ use crate::{
|
|||
PlatformSpecificWindowBuilderAttributes, VideoMode as PlatformVideoMode,
|
||||
},
|
||||
window::{
|
||||
CursorGrabMode, CursorIcon, Icon, Theme, UserAttentionType, WindowAttributes,
|
||||
WindowButtons, WindowLevel,
|
||||
CursorGrabMode, CursorIcon, Icon, ResizeDirection, Theme, UserAttentionType,
|
||||
WindowAttributes, WindowButtons, WindowLevel,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -1433,7 +1433,27 @@ impl UnownedWindow {
|
|||
Err(ExternalError::NotSupported(NotSupportedError::new()))
|
||||
}
|
||||
|
||||
/// Moves the window while it is being dragged.
|
||||
pub fn drag_window(&self) -> Result<(), ExternalError> {
|
||||
self.drag_initiate(util::MOVERESIZE_MOVE)
|
||||
}
|
||||
|
||||
/// Resizes the window while it is being dragged.
|
||||
pub fn drag_resize_window(&self, direction: ResizeDirection) -> Result<(), ExternalError> {
|
||||
self.drag_initiate(match direction {
|
||||
ResizeDirection::East => util::MOVERESIZE_RIGHT,
|
||||
ResizeDirection::North => util::MOVERESIZE_TOP,
|
||||
ResizeDirection::NorthEast => util::MOVERESIZE_TOPRIGHT,
|
||||
ResizeDirection::NorthWest => util::MOVERESIZE_TOPLEFT,
|
||||
ResizeDirection::South => util::MOVERESIZE_BOTTOM,
|
||||
ResizeDirection::SouthEast => util::MOVERESIZE_BOTTOMRIGHT,
|
||||
ResizeDirection::SouthWest => util::MOVERESIZE_BOTTOMLEFT,
|
||||
ResizeDirection::West => util::MOVERESIZE_LEFT,
|
||||
})
|
||||
}
|
||||
|
||||
/// Initiates a drag operation while the left mouse button is pressed.
|
||||
fn drag_initiate(&self, action: isize) -> Result<(), ExternalError> {
|
||||
let pointer = self
|
||||
.xconn
|
||||
.query_pointer(self.xwindow, util::VIRTUAL_CORE_POINTER)
|
||||
|
|
@ -1464,7 +1484,7 @@ impl UnownedWindow {
|
|||
[
|
||||
(window.x as c_long + pointer.win_x as c_long),
|
||||
(window.y as c_long + pointer.win_y as c_long),
|
||||
8, // _NET_WM_MOVERESIZE_MOVE
|
||||
action.try_into().unwrap(),
|
||||
ffi::Button1 as c_long,
|
||||
1,
|
||||
],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue