← luna

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 {