mirror of
https://github.com/niri-wm/niri.git
synced 2026-06-23 02:05:33 +07:00
screenshot_ui: Move selection with a second touch too
This commit is contained in:
+56
-10
@@ -66,14 +66,22 @@ pub enum ScreenshotUi {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// State for moving the selection (as opposed to just drawing).
|
||||||
|
pub struct MoveState {
|
||||||
|
// Cursor offset from selection.1 when starting the move.
|
||||||
|
pointer_offset: Point<i32, Physical>,
|
||||||
|
// If the move is initiated by a touch, this is the slot. If `None`, the move was initiated by
|
||||||
|
// holding Space.
|
||||||
|
touch_slot: Option<TouchSlot>,
|
||||||
|
}
|
||||||
|
|
||||||
pub enum Button {
|
pub enum Button {
|
||||||
Up,
|
Up,
|
||||||
Down {
|
Down {
|
||||||
touch_slot: Option<TouchSlot>,
|
touch_slot: Option<TouchSlot>,
|
||||||
on_capture_button: bool,
|
on_capture_button: bool,
|
||||||
last_pos: (Output, Point<i32, Physical>),
|
last_pos: (Output, Point<i32, Physical>),
|
||||||
/// Offset from the selection.1 corner to cursor grab point when moving the selection.
|
move_state: Option<MoveState>,
|
||||||
move_cursor_offset: Option<Point<i32, Physical>>,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,7 +282,7 @@ impl ScreenshotUi {
|
|||||||
selection,
|
selection,
|
||||||
button:
|
button:
|
||||||
Button::Down {
|
Button::Down {
|
||||||
move_cursor_offset,
|
move_state,
|
||||||
last_pos,
|
last_pos,
|
||||||
..
|
..
|
||||||
},
|
},
|
||||||
@@ -282,9 +290,20 @@ impl ScreenshotUi {
|
|||||||
} = self
|
} = self
|
||||||
{
|
{
|
||||||
if down {
|
if down {
|
||||||
*move_cursor_offset = Some(last_pos.1 - selection.1);
|
if move_state.is_none() {
|
||||||
|
*move_state = Some(MoveState {
|
||||||
|
pointer_offset: last_pos.1 - selection.1,
|
||||||
|
touch_slot: None,
|
||||||
|
});
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
*move_cursor_offset = None;
|
// Only clear if moving with Space.
|
||||||
|
if let Some(MoveState {
|
||||||
|
touch_slot: None, ..
|
||||||
|
}) = move_state
|
||||||
|
{
|
||||||
|
*move_state = None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -790,7 +809,7 @@ impl ScreenshotUi {
|
|||||||
touch_slot,
|
touch_slot,
|
||||||
on_capture_button,
|
on_capture_button,
|
||||||
last_pos,
|
last_pos,
|
||||||
move_cursor_offset,
|
move_state,
|
||||||
},
|
},
|
||||||
..
|
..
|
||||||
} = self
|
} = self
|
||||||
@@ -808,9 +827,9 @@ impl ScreenshotUi {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(cursor_offset) = move_cursor_offset {
|
if let Some(move_state) = move_state {
|
||||||
// The cursor offset is relative to selection.1.
|
// The cursor offset is relative to selection.1.
|
||||||
let delta = point - (selection.1 + *cursor_offset);
|
let delta = point - (selection.1 + move_state.pointer_offset);
|
||||||
|
|
||||||
let desired = rect_from_corner_points(selection.1 + delta, selection.2 + delta);
|
let desired = rect_from_corner_points(selection.1 + delta, selection.2 + delta);
|
||||||
let bounds = Rectangle::from_size(output_data[&selection.0].size - desired.size);
|
let bounds = Rectangle::from_size(output_data[&selection.0].size - desired.size);
|
||||||
@@ -843,6 +862,24 @@ impl ScreenshotUi {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Check if this is a second touch (different slot) while already dragging.
|
||||||
|
if let Some(new_slot) = slot {
|
||||||
|
if let Button::Down {
|
||||||
|
on_capture_button: false,
|
||||||
|
move_state,
|
||||||
|
last_pos,
|
||||||
|
..
|
||||||
|
} = button
|
||||||
|
{
|
||||||
|
if move_state.is_none() {
|
||||||
|
*move_state = Some(MoveState {
|
||||||
|
pointer_offset: last_pos.1 - selection.1,
|
||||||
|
touch_slot: Some(new_slot),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if button.is_down() {
|
if button.is_down() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -861,7 +898,7 @@ impl ScreenshotUi {
|
|||||||
touch_slot: slot,
|
touch_slot: slot,
|
||||||
on_capture_button: true,
|
on_capture_button: true,
|
||||||
last_pos: (output, point),
|
last_pos: (output, point),
|
||||||
move_cursor_offset: None,
|
move_state: None,
|
||||||
};
|
};
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -871,7 +908,7 @@ impl ScreenshotUi {
|
|||||||
touch_slot: slot,
|
touch_slot: slot,
|
||||||
on_capture_button: false,
|
on_capture_button: false,
|
||||||
last_pos: (output.clone(), point),
|
last_pos: (output.clone(), point),
|
||||||
move_cursor_offset: None,
|
move_state: None,
|
||||||
};
|
};
|
||||||
*selection = (output, point, point);
|
*selection = (output, point, point);
|
||||||
|
|
||||||
@@ -896,12 +933,21 @@ impl ScreenshotUi {
|
|||||||
touch_slot,
|
touch_slot,
|
||||||
on_capture_button,
|
on_capture_button,
|
||||||
ref last_pos,
|
ref last_pos,
|
||||||
|
ref mut move_state,
|
||||||
..
|
..
|
||||||
} = *button
|
} = *button
|
||||||
else {
|
else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Check if this is a move touch and if so, stop the move.
|
||||||
|
if let Some(state) = move_state {
|
||||||
|
if state.touch_slot.is_some_and(|m_slot| Some(m_slot) == slot) {
|
||||||
|
*move_state = None;
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if touch_slot != slot {
|
if touch_slot != slot {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user