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,
@ -386,7 +386,7 @@ impl State {
))); )));
} }
} }
std::mem::drop(shell); std::mem::drop(shell);
// cancel grabs // cancel grabs
@ -850,35 +850,21 @@ 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| {
let mut shell = fn dispatch_grab<G: PointerGrab<State> + 'static>(
state.common.shell.write().unwrap(); grab: Option<(G, smithay::input::pointer::Focus)>,
let res = shell.move_request( seat: Seat<State>,
&surface, serial: Serial,
&seat_clone, state: &mut State)
serial, {
ReleaseMode::NoMouseButtons, if let Some((target, focus)) = grab {
false, seat
&state.common.config, .modifiers_shortcut_queue()
&state.common.event_loop_handle, .clear();
&state.common.xdg_activation_state,
);
if let Some((target, focus)) = res {
seat_clone
.modifiers_shortcut_queue()
.clear();
std::mem::drop(shell); seat
if target.is_touch_grab() {
seat_clone
.get_touch()
.unwrap()
.set_grab(
state, target, serial,
);
} else {
seat_clone
.get_pointer() .get_pointer()
.unwrap() .unwrap()
.set_grab( .set_grab(
@ -887,6 +873,52 @@ impl State {
); );
} }
} }
let mut shell =
state.common.shell.write().unwrap();
if let Some(button) = button {
match button {
smithay::backend::input::MouseButton::Left => {
let res = shell.move_request(
&surface,
&seat_clone,
serial,
ReleaseMode::NoMouseButtons,
false,
&state.common.config,
&state.common.event_loop_handle,
&state.common.xdg_activation_state,
);
drop(shell);
dispatch_grab(res, seat_clone, serial, state);
},
smithay::backend::input::MouseButton::Right => {
let Some(target_elem) = shell.element_for_surface(&surface) else { return };
let Some(geom) = shell
.space_for(target_elem)
.and_then(|f| f.element_geometry(target_elem)) else { return };
let geom = geom.to_f64();
let center = geom.loc + geom.size.downscale(2.0);
let offset = center.to_global(&output) - pos;
let edge = match (offset.x > 0.0, offset.y > 0.0) {
(true, true) => ResizeEdge::TOP_LEFT,
(false, true) => ResizeEdge::TOP_RIGHT,
(true, false) => ResizeEdge::BOTTOM_LEFT,
(false, false) => ResizeEdge::BOTTOM_RIGHT
};
let res = shell.resize_request(
&surface,
&seat_clone,
serial,
edge
);
drop(shell);
dispatch_grab(res, seat_clone, serial, state);
},
_ => {},
}
}
}, },
); );
} }