input: resize on Super + Right-Click Drag

This commit is contained in:
Daniel 2024-08-02 03:50:28 +10:00 committed by GitHub
parent c1bf410466
commit e01a55aae7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -50,7 +50,7 @@ use smithay::{
AxisFrame, ButtonEvent, GestureHoldBeginEvent, GestureHoldEndEvent, AxisFrame, ButtonEvent, GestureHoldBeginEvent, GestureHoldEndEvent,
GesturePinchBeginEvent, GesturePinchEndEvent, GesturePinchUpdateEvent, GesturePinchBeginEvent, GesturePinchEndEvent, GesturePinchUpdateEvent,
GestureSwipeBeginEvent, GestureSwipeEndEvent, GestureSwipeUpdateEvent, MotionEvent, GestureSwipeBeginEvent, GestureSwipeEndEvent, GestureSwipeUpdateEvent, MotionEvent,
RelativeMotionEvent, PointerGrab, RelativeMotionEvent,
}, },
touch::{DownEvent, MotionEvent as TouchMotionEvent, UpEvent}, touch::{DownEvent, MotionEvent as TouchMotionEvent, UpEvent},
Seat, Seat,
@ -850,10 +850,35 @@ impl State {
target.toplevel().map(Cow::into_owned) target.toplevel().map(Cow::into_owned)
{ {
let seat_clone = seat.clone(); let seat_clone = seat.clone();
let button = PointerButtonEvent::button(&event);
self.common.event_loop_handle.insert_idle( self.common.event_loop_handle.insert_idle(
move |state| { move |state| {
fn dispatch_grab<G: PointerGrab<State> + 'static>(
grab: Option<(G, smithay::input::pointer::Focus)>,
seat: Seat<State>,
serial: Serial,
state: &mut State)
{
if let Some((target, focus)) = grab {
seat
.modifiers_shortcut_queue()
.clear();
seat
.get_pointer()
.unwrap()
.set_grab(
state, target, serial,
focus,
);
}
}
let mut shell = let mut shell =
state.common.shell.write().unwrap(); state.common.shell.write().unwrap();
if let Some(button) = button {
match button {
smithay::backend::input::MouseButton::Left => {
let res = shell.move_request( let res = shell.move_request(
&surface, &surface,
&seat_clone, &seat_clone,
@ -864,28 +889,35 @@ impl State {
&state.common.event_loop_handle, &state.common.event_loop_handle,
&state.common.xdg_activation_state, &state.common.xdg_activation_state,
); );
if let Some((target, focus)) = res { drop(shell);
seat_clone dispatch_grab(res, seat_clone, serial, state);
.modifiers_shortcut_queue() },
.clear(); smithay::backend::input::MouseButton::Right => {
let Some(target_elem) = shell.element_for_surface(&surface) else { return };
std::mem::drop(shell); let Some(geom) = shell
if target.is_touch_grab() { .space_for(target_elem)
seat_clone .and_then(|f| f.element_geometry(target_elem)) else { return };
.get_touch() let geom = geom.to_f64();
.unwrap() let center = geom.loc + geom.size.downscale(2.0);
.set_grab( let offset = center.to_global(&output) - pos;
state, target, serial, let edge = match (offset.x > 0.0, offset.y > 0.0) {
); (true, true) => ResizeEdge::TOP_LEFT,
} else { (false, true) => ResizeEdge::TOP_RIGHT,
seat_clone (true, false) => ResizeEdge::BOTTOM_LEFT,
.get_pointer() (false, false) => ResizeEdge::BOTTOM_RIGHT
.unwrap() };
.set_grab( let res = shell.resize_request(
state, target, serial, &surface,
focus, &seat_clone,
serial,
edge
); );
drop(shell);
dispatch_grab(res, seat_clone, serial, state);
},
_ => {},
} }
} }
}, },
); );