shell: resize_request better handle tiled windows
This commit is contained in:
parent
20123927e0
commit
e7f746ccee
2 changed files with 82 additions and 59 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
139
src/shell/mod.rs
139
src/shell/mod.rs
|
|
@ -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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue