Commit 2098f2e
2
files
+42
added
-0
deleted
@@ -496,6 +496,36 @@ pub fn interactive_resize_from_toplevel(
496
496
}
497
497
}
498
498
499
+/// Rozpoczyna przeciągnięcie okna z pozycji globalnej (X11 `_NET_WM_MOVERESIZE`).
500
+pub fn interactive_move_at(state: &mut State, slot: usize, pos: Point) {
501
+ if window_geometry(state, slot).is_none() {
502
+ return;
503
+ }
504
+ raise_and_focus(state, slot);
505
+ begin_drag(state, slot, pos);
506
+}
507
+
508
+/// Rozpoczyna zmianę rozmiaru z pozycji globalnej (X11 `_NET_WM_MOVERESIZE`).
509
+pub fn interactive_resize_at(state: &mut State, slot: usize, edges: u8, pos: Point) {
510
+ if edges == 0 {
511
+ return;
512
+ }
513
+ let Some((x, y, w, h)) = window_geometry(state, slot) else {
514
+ return;
515
+ };
516
+ raise_and_focus(state, slot);
517
+ state.resize = Some(ResizeState {
518
+ slot,
519
+ edges,
520
+ start_x: x,
521
+ start_y: y,
522
+ start_w: w,
523
+ start_h: h,
524
+ start_px: pos.x,
525
+ start_py: pos.y,
526
+ });
527
+}
528
+
499
529
/// Slot okna dla danych `xdg_toplevel` (przez powiązaną `wl_surface`).
500
530
pub(crate) fn toplevel_slot(data: &XdgToplevelData) -> Option<usize> {
501
531
let sd = data.surface.data::<SurfaceData>()?;
@@ -1075,6 +1075,18 @@ fn slot_for_serial(state: &State, serial: u64) -> Option<usize> {
1075
1075
mod tests {
1076
1076
use super::*;
1077
1077
1078
+ #[test]
1079
+ fn moveresize_directions_map_to_edges() {
1080
+ assert_eq!(move_resize_edges(0), 1 | 4); // lewy-górny
1081
+ assert_eq!(move_resize_edges(1), 1); // góra
1082
+ assert_eq!(move_resize_edges(3), 8); // prawo
1083
+ assert_eq!(move_resize_edges(4), 2 | 8); // prawy-dolny
1084
+ assert_eq!(move_resize_edges(5), 2); // dół
1085
+ assert_eq!(move_resize_edges(7), 4); // lewo
1086
+ assert_eq!(move_resize_edges(8), 0); // „move” nie jest zmianą rozmiaru
1087
+ assert_eq!(move_resize_edges(99), 0);
1088
+ }
1089
+
1078
1090
#[test]
1079
1091
fn normal_windows_are_decorated_but_menus_are_not() {
1080
1092
let normal = X11Info {