aboutsummaryrefslogtreecommitdiff
path: root/src/input/pick_window_grab.rs
diff options
context:
space:
mode:
authorbbb651 🇮🇱 <53972231+bbb651@users.noreply.github.com>2025-02-26 14:22:27 +0200
committerGitHub <noreply@github.com>2025-02-26 15:22:27 +0300
commit16405b9b2b99edaf9388df6a7228ca07f110769d (patch)
treed05734655900336c809bb212230cb4d34a6325b2 /src/input/pick_window_grab.rs
parent4719cc6d5942c70f43ae167d66d2383708ae3536 (diff)
downloadniri-16405b9b2b99edaf9388df6a7228ca07f110769d.tar.gz
niri-16405b9b2b99edaf9388df6a7228ca07f110769d.tar.bz2
niri-16405b9b2b99edaf9388df6a7228ca07f110769d.zip
Implement `niri msg pick-window`
* feat: `niri msg pick-window` * fixes --------- Co-authored-by: Ivan Molodetskikh <yalterz@gmail.com>
Diffstat (limited to 'src/input/pick_window_grab.rs')
-rw-r--r--src/input/pick_window_grab.rs167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/input/pick_window_grab.rs b/src/input/pick_window_grab.rs
new file mode 100644
index 00000000..9a3b22ae
--- /dev/null
+++ b/src/input/pick_window_grab.rs
@@ -0,0 +1,167 @@
+use smithay::backend::input::ButtonState;
+use smithay::input::pointer::{
+ AxisFrame, ButtonEvent, CursorImageStatus, GestureHoldBeginEvent, GestureHoldEndEvent,
+ GesturePinchBeginEvent, GesturePinchEndEvent, GesturePinchUpdateEvent, GestureSwipeBeginEvent,
+ GestureSwipeEndEvent, GestureSwipeUpdateEvent, GrabStartData as PointerGrabStartData,
+ MotionEvent, PointerGrab, PointerInnerHandle, RelativeMotionEvent,
+};
+use smithay::input::SeatHandler;
+use smithay::utils::{Logical, Point};
+
+use crate::niri::State;
+use crate::window::Mapped;
+
+pub struct PickWindowGrab {
+ start_data: PointerGrabStartData<State>,
+}
+
+impl PickWindowGrab {
+ pub fn new(start_data: PointerGrabStartData<State>) -> Self {
+ Self { start_data }
+ }
+
+ fn on_ungrab(&mut self, state: &mut State) {
+ if let Some(tx) = state.niri.pick_window.take() {
+ let _ = tx.send_blocking(None);
+ }
+ state
+ .niri
+ .cursor_manager
+ .set_cursor_image(CursorImageStatus::default_named());
+ // Redraw to update the cursor.
+ state.niri.queue_redraw_all();
+ }
+}
+
+impl PointerGrab<State> for PickWindowGrab {
+ fn motion(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ _focus: Option<(<State as SeatHandler>::PointerFocus, Point<f64, Logical>)>,
+ event: &MotionEvent,
+ ) {
+ handle.motion(data, None, event);
+ }
+
+ fn relative_motion(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ _focus: Option<(<State as SeatHandler>::PointerFocus, Point<f64, Logical>)>,
+ event: &RelativeMotionEvent,
+ ) {
+ handle.relative_motion(data, None, event);
+ }
+
+ fn button(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &ButtonEvent,
+ ) {
+ if event.state == ButtonState::Pressed {
+ if let Some(tx) = data.niri.pick_window.take() {
+ let _ = tx.send_blocking(
+ data.niri
+ .window_under(handle.current_location())
+ .map(Mapped::id),
+ );
+ }
+ handle.unset_grab(self, data, event.serial, event.time, true);
+ }
+ }
+
+ fn axis(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ details: AxisFrame,
+ ) {
+ handle.axis(data, details);
+ }
+
+ fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<'_, State>) {
+ handle.frame(data);
+ }
+
+ fn gesture_swipe_begin(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GestureSwipeBeginEvent,
+ ) {
+ handle.gesture_swipe_begin(data, event);
+ }
+
+ fn gesture_swipe_update(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GestureSwipeUpdateEvent,
+ ) {
+ handle.gesture_swipe_update(data, event);
+ }
+
+ fn gesture_swipe_end(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GestureSwipeEndEvent,
+ ) {
+ handle.gesture_swipe_end(data, event);
+ }
+
+ fn gesture_pinch_begin(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GesturePinchBeginEvent,
+ ) {
+ handle.gesture_pinch_begin(data, event);
+ }
+
+ fn gesture_pinch_update(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GesturePinchUpdateEvent,
+ ) {
+ handle.gesture_pinch_update(data, event);
+ }
+
+ fn gesture_pinch_end(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GesturePinchEndEvent,
+ ) {
+ handle.gesture_pinch_end(data, event);
+ }
+
+ fn gesture_hold_begin(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GestureHoldBeginEvent,
+ ) {
+ handle.gesture_hold_begin(data, event);
+ }
+
+ fn gesture_hold_end(
+ &mut self,
+ data: &mut State,
+ handle: &mut PointerInnerHandle<'_, State>,
+ event: &GestureHoldEndEvent,
+ ) {
+ handle.gesture_hold_end(data, event);
+ }
+
+ fn start_data(&self) -> &PointerGrabStartData<State> {
+ &self.start_data
+ }
+
+ fn unset(&mut self, data: &mut State) {
+ self.on_ungrab(data);
+ }
+}