|
|
|
@ -13,6 +13,7 @@ use glutin::{
|
|
|
|
|
},
|
|
|
|
|
PossiblyCurrent, WindowedContext,
|
|
|
|
|
};
|
|
|
|
|
use log::info;
|
|
|
|
|
use skia_safe::Rect;
|
|
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
@ -85,6 +86,9 @@ pub struct MouseManager {
|
|
|
|
|
|
|
|
|
|
mouse_hidden: bool,
|
|
|
|
|
pub enabled: bool,
|
|
|
|
|
|
|
|
|
|
// Not exactly a mouse setting but ideally needs to exist for some state
|
|
|
|
|
current_window_focused: bool,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl MouseManager {
|
|
|
|
@ -100,6 +104,7 @@ impl MouseManager {
|
|
|
|
|
window_details_under_mouse: None,
|
|
|
|
|
mouse_hidden: false,
|
|
|
|
|
enabled: true,
|
|
|
|
|
current_window_focused: false,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -195,6 +200,7 @@ impl MouseManager {
|
|
|
|
|
mouse_button: &MouseButton,
|
|
|
|
|
down: bool,
|
|
|
|
|
keyboard_manager: &KeyboardManager,
|
|
|
|
|
click_through: bool,
|
|
|
|
|
) {
|
|
|
|
|
// For some reason pointer down is handled differently from pointer up and drag.
|
|
|
|
|
// Floating windows: relative coordinates are great.
|
|
|
|
@ -214,6 +220,7 @@ impl MouseManager {
|
|
|
|
|
self.relative_position
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if click_through || !self.current_window_focused {
|
|
|
|
|
EVENT_AGGREGATOR.send(UiCommand::Serial(SerialCommand::MouseButton {
|
|
|
|
|
button: button_text.clone(),
|
|
|
|
|
action,
|
|
|
|
@ -222,6 +229,7 @@ impl MouseManager {
|
|
|
|
|
modifier_string: keyboard_manager.format_modifier_string(true),
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if down {
|
|
|
|
|
self.dragging = Some(button_text);
|
|
|
|
@ -387,13 +395,23 @@ impl MouseManager {
|
|
|
|
|
renderer,
|
|
|
|
|
windowed_context,
|
|
|
|
|
);
|
|
|
|
|
self.handle_pointer_transition(&MouseButton::Left, true, keyboard_manager);
|
|
|
|
|
self.handle_pointer_transition(
|
|
|
|
|
&MouseButton::Left,
|
|
|
|
|
true,
|
|
|
|
|
keyboard_manager,
|
|
|
|
|
true,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
TouchPhase::Ended | TouchPhase::Cancelled => {
|
|
|
|
|
if let Some(trace) = self.touch_position.remove(&finger_id) {
|
|
|
|
|
if self.dragging.is_some() {
|
|
|
|
|
self.handle_pointer_transition(&MouseButton::Left, false, keyboard_manager);
|
|
|
|
|
self.handle_pointer_transition(
|
|
|
|
|
&MouseButton::Left,
|
|
|
|
|
false,
|
|
|
|
|
keyboard_manager,
|
|
|
|
|
true,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
if !trace.left_deadzone_once {
|
|
|
|
|
self.handle_pointer_motion(
|
|
|
|
@ -403,8 +421,18 @@ impl MouseManager {
|
|
|
|
|
renderer,
|
|
|
|
|
windowed_context,
|
|
|
|
|
);
|
|
|
|
|
self.handle_pointer_transition(&MouseButton::Left, true, keyboard_manager);
|
|
|
|
|
self.handle_pointer_transition(&MouseButton::Left, false, keyboard_manager);
|
|
|
|
|
self.handle_pointer_transition(
|
|
|
|
|
&MouseButton::Left,
|
|
|
|
|
true,
|
|
|
|
|
keyboard_manager,
|
|
|
|
|
true,
|
|
|
|
|
);
|
|
|
|
|
self.handle_pointer_transition(
|
|
|
|
|
&MouseButton::Left,
|
|
|
|
|
false,
|
|
|
|
|
keyboard_manager,
|
|
|
|
|
true,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -419,6 +447,10 @@ impl MouseManager {
|
|
|
|
|
windowed_context: &WindowedContext<PossiblyCurrent>,
|
|
|
|
|
) {
|
|
|
|
|
match event {
|
|
|
|
|
Event::WindowEvent {
|
|
|
|
|
event: WindowEvent::Focused(focused),
|
|
|
|
|
..
|
|
|
|
|
} => self.current_window_focused = *focused,
|
|
|
|
|
Event::WindowEvent {
|
|
|
|
|
event: WindowEvent::CursorMoved { position, .. },
|
|
|
|
|
..
|
|
|
|
@ -476,11 +508,18 @@ impl MouseManager {
|
|
|
|
|
Event::WindowEvent {
|
|
|
|
|
event: WindowEvent::MouseInput { button, state, .. },
|
|
|
|
|
..
|
|
|
|
|
} => self.handle_pointer_transition(
|
|
|
|
|
} => {
|
|
|
|
|
let window_settings = SETTINGS.get::<WindowSettings>();
|
|
|
|
|
self.handle_pointer_transition(
|
|
|
|
|
button,
|
|
|
|
|
state == &ElementState::Pressed,
|
|
|
|
|
keyboard_manager,
|
|
|
|
|
),
|
|
|
|
|
window_settings.click_through,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Always reset focused to false to prevent all mouse inputs not working
|
|
|
|
|
self.current_window_focused = false;
|
|
|
|
|
}
|
|
|
|
|
Event::WindowEvent {
|
|
|
|
|
event:
|
|
|
|
|
WindowEvent::KeyboardInput {
|
|
|
|
|