aboutsummaryrefslogtreecommitdiffstats
path: root/sl0ppij/zellij-utils/src/input/mouse.rs
diff options
context:
space:
mode:
authoruser <user@clank>2026-08-12 19:34:15 +0200
committeruser <user@clank>2026-08-12 19:34:15 +0200
commitd1c14ff0f5c5b55c46d91ad12f4a291041480a99 (patch)
tree9dca9628d228b211a6919c9dd65cd7a9b4fcf6b0 /sl0ppij/zellij-utils/src/input/mouse.rs
parentchore: initialize sl0ppi monorepo (diff)
downloadsl0ppi-d1c14ff0f5c5b55c46d91ad12f4a291041480a99.tar.gz
sl0ppi-d1c14ff0f5c5b55c46d91ad12f4a291041480a99.tar.xz
sl0ppi-d1c14ff0f5c5b55c46d91ad12f4a291041480a99.zip
vendor(sl0ppij): import zellij v0.45.0 tree
Squashed import of upstream zellij at 0e6e4404 ("Support the Kitty Image Protocol (#5428)"), the merge-base our fork was developed against. Upstream's 3311 commits are deliberately NOT replayed here; only our own fork commits are, so the monorepo stays small and `git log sl0ppij/` shows sl0p work, not zellij's entire history. Upstream provenance is tracked in FORKS.md and can always be re-fetched from https://github.com/zellij-org/zellij.
Diffstat (limited to 'sl0ppij/zellij-utils/src/input/mouse.rs')
-rw-r--r--sl0ppij/zellij-utils/src/input/mouse.rs445
1 files changed, 445 insertions, 0 deletions
diff --git a/sl0ppij/zellij-utils/src/input/mouse.rs b/sl0ppij/zellij-utils/src/input/mouse.rs
new file mode 100644
index 0000000..231dc58
--- /dev/null
+++ b/sl0ppij/zellij-utils/src/input/mouse.rs
@@ -0,0 +1,445 @@
+use serde::{Deserialize, Serialize};
+
+use crate::position::Position;
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
+/// A mouse event can have any number of buttons (including no
+/// buttons) pressed or released.
+pub struct MouseEvent {
+ /// A mouse event can current be a Press, Release, or Motion.
+ /// Future events could consider double-click and triple-click.
+ pub event_type: MouseEventType,
+
+ // Mouse buttons associated with this event.
+ pub left: bool,
+ pub right: bool,
+ pub middle: bool,
+ pub wheel_up: bool,
+ pub wheel_down: bool,
+ #[serde(default)]
+ pub wheel_left: bool,
+ #[serde(default)]
+ pub wheel_right: bool,
+
+ // Keyboard modifier flags can be encoded with events too. They
+ // are not often passed on the wire (instead used for
+ // selection/copy-paste and changing terminal properties
+ // on-the-fly at the user-facing terminal), but alt-mouseclick
+ // usually passes through and is testable on vttest. termwiz
+ // already exposes them too.
+ pub shift: bool,
+ pub alt: bool,
+ pub ctrl: bool,
+
+ /// The coordinates are zero-based.
+ pub position: Position,
+}
+
+/// A mouse related event
+#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Deserialize, Serialize)]
+pub enum MouseEventType {
+ /// A mouse button was pressed.
+ Press,
+ /// A mouse button was released.
+ Release,
+ /// A mouse button is held over the given coordinates.
+ Motion,
+}
+
+impl MouseEvent {
+ pub fn new() -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position: Position::new(0, 0),
+ };
+ event
+ }
+ pub fn new_buttonless_motion(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_left_press_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_right_press_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: true,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_middle_press_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: true,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_middle_release_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Release,
+ left: false,
+ right: false,
+ middle: true,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_left_release_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Release,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_left_motion_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_right_release_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Release,
+ left: false,
+ right: true,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_right_motion_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: false,
+ right: true,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_middle_motion_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: false,
+ right: false,
+ middle: true,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_left_press_with_alt_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: true,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_right_press_with_alt_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: true,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: true,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_left_press_with_ctrl_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: true,
+ position,
+ };
+ event
+ }
+ pub fn new_left_motion_with_ctrl_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: true,
+ position,
+ };
+ event
+ }
+ pub fn new_left_release_with_ctrl_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Release,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: true,
+ position,
+ };
+ event
+ }
+ pub fn new_left_motion_with_alt_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Motion,
+ left: true,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: true,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_scroll_up_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: true,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_scroll_down_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: true,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ };
+ event
+ }
+ pub fn new_ctrl_scroll_up_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: true,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: true,
+ position,
+ };
+ event
+ }
+ pub fn new_ctrl_scroll_down_event(position: Position) -> Self {
+ let event = MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: true,
+ wheel_left: false,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: true,
+ position,
+ };
+ event
+ }
+ pub fn new_scroll_left_event(position: Position) -> Self {
+ MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: true,
+ wheel_right: false,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ }
+ }
+ pub fn new_scroll_right_event(position: Position) -> Self {
+ MouseEvent {
+ event_type: MouseEventType::Press,
+ left: false,
+ right: false,
+ middle: false,
+ wheel_up: false,
+ wheel_down: false,
+ wheel_left: false,
+ wheel_right: true,
+ shift: false,
+ alt: false,
+ ctrl: false,
+ position,
+ }
+ }
+}
+
+impl Default for MouseEvent {
+ fn default() -> Self {
+ MouseEvent::new()
+ }
+}