shell: resize_request better handle tiled windows

This commit is contained in:
Victoria Brekenfeld 2024-03-07 16:54:19 +01:00
parent 20123927e0
commit e7f746ccee
2 changed files with 82 additions and 59 deletions

View file

@ -2443,7 +2443,7 @@ impl TilingLayout {
edges edges
} }
pub fn menu_resize( pub fn resize_request(
&self, &self,
mut node_id: NodeId, mut node_id: NodeId,
edge: ResizeEdge, edge: ResizeEdge,

View file

@ -2619,23 +2619,23 @@ impl Shell {
return; return;
}; };
let new_loc = if edge.contains(ResizeEdge::LEFT) { let new_loc = if edge.contains(ResizeEdge::LEFT) {
Point::<i32, Global>::from((geometry.loc.x, geometry.loc.y + (geometry.size.h / 2))) Point::<i32, Global>::from((geometry.loc.x, geometry.loc.y + (geometry.size.h / 2)))
} else if edge.contains(ResizeEdge::RIGHT) { } else if edge.contains(ResizeEdge::RIGHT) {
Point::<i32, Global>::from(( Point::<i32, Global>::from((
geometry.loc.x + geometry.size.w, geometry.loc.x + geometry.size.w,
geometry.loc.y + (geometry.size.h / 2), geometry.loc.y + (geometry.size.h / 2),
)) ))
} else if edge.contains(ResizeEdge::TOP) { } else if edge.contains(ResizeEdge::TOP) {
Point::<i32, Global>::from((geometry.loc.x + (geometry.size.w / 2), geometry.loc.y)) Point::<i32, Global>::from((geometry.loc.x + (geometry.size.w / 2), geometry.loc.y))
} else if edge.contains(ResizeEdge::BOTTOM) { } else if edge.contains(ResizeEdge::BOTTOM) {
Point::<i32, Global>::from(( Point::<i32, Global>::from((
geometry.loc.x + (geometry.size.w / 2), geometry.loc.x + (geometry.size.w / 2),
geometry.loc.y + geometry.size.h, geometry.loc.y + geometry.size.h,
)) ))
} else { } else {
return; return;
}; };
let focus = Some((mapped.clone().into(), (new_loc - geometry.loc).as_logical())); let focus = Some((mapped.clone().into(), (new_loc - geometry.loc).as_logical()));
@ -2643,49 +2643,49 @@ impl Shell {
start_data.focus = focus.clone(); start_data.focus = focus.clone();
let grab: ResizeGrab = if let Some(grab) = floating_layer.resize_request( let grab: ResizeGrab = if let Some(grab) = floating_layer.resize_request(
mapped, mapped,
seat, seat,
start_data.clone(), start_data.clone(),
edge, edge,
ReleaseMode::Click, ReleaseMode::Click,
) { ) {
grab.into() grab.into()
} else if let Some(ws) = state.common.shell.space_for_mut(&mapped) { } else if let Some(ws) = state.common.shell.space_for_mut(&mapped) {
let Some(node_id) = mapped.tiling_node_id.lock().unwrap().clone() else { let Some(node_id) = mapped.tiling_node_id.lock().unwrap().clone() else {
return; return;
}; };
let Some((node, left_up_idx, orientation)) = let Some((node, left_up_idx, orientation)) =
ws.tiling_layer.resize_request(node_id, edge) ws.tiling_layer.resize_request(node_id, edge)
else { else {
return; return;
}; };
ResizeForkGrab::new( ResizeForkGrab::new(
start_data, start_data,
new_loc.to_f64(), new_loc.to_f64(),
node, node,
left_up_idx, left_up_idx,
orientation, orientation,
ws.output.downgrade(), ws.output.downgrade(),
ReleaseMode::Click, ReleaseMode::Click,
) )
.into() .into()
} else { } else {
return; return;
}; };
let ptr = seat.get_pointer().unwrap(); let ptr = seat.get_pointer().unwrap();
let serial = SERIAL_COUNTER.next_serial(); let serial = SERIAL_COUNTER.next_serial();
ptr.motion( ptr.motion(
state, state,
focus, focus,
&MotionEvent { &MotionEvent {
location: new_loc.as_logical().to_f64(), location: new_loc.as_logical().to_f64(),
serial, serial,
time: 0, time: 0,
}, },
); );
ptr.frame(state); ptr.frame(state);
ptr.set_grab(state, grab, serial, Focus::Keep); ptr.set_grab(state, grab, serial, Focus::Keep);
} }
} }
@ -2871,20 +2871,43 @@ impl Shell {
return; return;
}; };
if let Some(grab) = floating_layer.resize_request( let grab: ResizeGrab = if let Some(grab) = floating_layer.resize_request(
&mapped, &mapped,
seat, seat,
start_data.clone(), start_data.clone(),
edges, edges,
ReleaseMode::NoMouseButtons, ReleaseMode::NoMouseButtons,
) { ) {
seat.get_pointer().unwrap().set_grab( grab.into()
state, } else if let Some(ws) = state.common.shell.space_for_mut(&mapped) {
grab, let Some(node_id) = mapped.tiling_node_id.lock().unwrap().clone() else {
serial.unwrap_or_else(|| SERIAL_COUNTER.next_serial()), return;
Focus::Clear, };
); let Some((node, left_up_idx, orientation)) =
} ws.tiling_layer.resize_request(node_id, edges)
else {
return;
};
ResizeForkGrab::new(
start_data,
seat.get_pointer().unwrap().current_location().as_global(),
node,
left_up_idx,
orientation,
ws.output.downgrade(),
ReleaseMode::NoMouseButtons,
)
.into()
} else {
return;
};
seat.get_pointer().unwrap().set_grab(
state,
grab,
serial.unwrap_or_else(|| SERIAL_COUNTER.next_serial()),
Focus::Clear,
);
} }
} }
} }