input: resize on Super + Right-Click Drag
This commit is contained in:
parent
c1bf410466
commit
e01a55aae7
1 changed files with 60 additions and 28 deletions
|
|
@ -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,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);
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue