mirror of
https://codeberg.org/waydeer/layer-shika.git
synced 2025-11-17 23:14:23 +00:00
refactor: event routing
This commit is contained in:
parent
596f0a5cf6
commit
ab47c3988b
4 changed files with 63 additions and 64 deletions
|
|
@ -44,7 +44,7 @@ impl<'a> RuntimeStateFacade<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn popup_manager(&self) -> Option<Rc<PopupManager>> {
|
pub fn popup_manager(&self) -> Option<Rc<PopupManager>> {
|
||||||
self.window_state.popup_manager().cloned()
|
self.window_state.popup_manager()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn component_instance(&self) -> &ComponentInstance {
|
pub fn component_instance(&self) -> &ComponentInstance {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use slint::platform::{WindowAdapter, WindowEvent};
|
||||||
use slint::{LogicalPosition, PhysicalSize};
|
use slint::{LogicalPosition, PhysicalSize};
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use wayland_client::{backend::ObjectId, protocol::wl_surface::WlSurface};
|
use wayland_client::{Proxy, backend::ObjectId, protocol::wl_surface::WlSurface};
|
||||||
use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1;
|
use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1::WpFractionalScaleV1;
|
||||||
|
|
||||||
pub struct SharedPointerSerial {
|
pub struct SharedPointerSerial {
|
||||||
|
|
@ -42,6 +42,7 @@ pub struct EventContext {
|
||||||
current_pointer_position: LogicalPosition,
|
current_pointer_position: LogicalPosition,
|
||||||
last_pointer_serial: u32,
|
last_pointer_serial: u32,
|
||||||
shared_pointer_serial: Option<Rc<SharedPointerSerial>>,
|
shared_pointer_serial: Option<Rc<SharedPointerSerial>>,
|
||||||
|
active_window: ActiveWindow,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventContext {
|
impl EventContext {
|
||||||
|
|
@ -59,6 +60,7 @@ impl EventContext {
|
||||||
current_pointer_position: LogicalPosition::new(0.0, 0.0),
|
current_pointer_position: LogicalPosition::new(0.0, 0.0),
|
||||||
last_pointer_serial: 0,
|
last_pointer_serial: 0,
|
||||||
shared_pointer_serial: None,
|
shared_pointer_serial: None,
|
||||||
|
active_window: ActiveWindow::None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,19 +125,36 @@ impl EventContext {
|
||||||
self.shared_pointer_serial = Some(shared_serial);
|
self.shared_pointer_serial = Some(shared_serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dispatch_to_active_window(&self, event: WindowEvent, surface: &WlSurface) {
|
pub fn set_entered_surface(&mut self, surface: &WlSurface) {
|
||||||
if let Some(popup_manager) = &self.popup_manager {
|
self.active_window = if let Some(popup_manager) = &self.popup_manager {
|
||||||
match popup_manager.get_active_window(surface, &self.main_surface_id) {
|
popup_manager.get_active_window(surface, &self.main_surface_id)
|
||||||
ActiveWindow::Main => {
|
} else {
|
||||||
self.main_window.window().dispatch_event(event);
|
let surface_id = surface.id();
|
||||||
}
|
if self.main_surface_id == surface_id {
|
||||||
ActiveWindow::Popup(handle) => {
|
ActiveWindow::Main
|
||||||
|
} else {
|
||||||
|
ActiveWindow::None
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_entered_surface(&mut self) {
|
||||||
|
self.active_window = ActiveWindow::None;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dispatch_to_active_window(&self, event: WindowEvent) {
|
||||||
|
match self.active_window {
|
||||||
|
ActiveWindow::Main => {
|
||||||
|
self.main_window.window().dispatch_event(event);
|
||||||
|
}
|
||||||
|
ActiveWindow::Popup(handle) => {
|
||||||
|
if let Some(popup_manager) = &self.popup_manager {
|
||||||
if let Some(popup_window) = popup_manager.get_popup_window(handle.key()) {
|
if let Some(popup_window) = popup_manager.get_popup_window(handle.key()) {
|
||||||
popup_window.dispatch_event(event);
|
popup_window.dispatch_event(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ActiveWindow::None => {}
|
|
||||||
}
|
}
|
||||||
|
ActiveWindow::None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,10 @@ use wayland_protocols::wp::fractional_scale::v1::client::wp_fractional_scale_v1:
|
||||||
pub struct WindowState {
|
pub struct WindowState {
|
||||||
component: ComponentState,
|
component: ComponentState,
|
||||||
rendering: RenderingState<FemtoVGWindow>,
|
rendering: RenderingState<FemtoVGWindow>,
|
||||||
event_context: EventContext,
|
event_context: RefCell<EventContext>,
|
||||||
display_metrics: SharedDisplayMetrics,
|
display_metrics: SharedDisplayMetrics,
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pointer: ManagedWlPointer,
|
pointer: ManagedWlPointer,
|
||||||
active_popup_key: RefCell<Option<usize>>,
|
|
||||||
main_surface: Rc<WlSurface>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowState {
|
impl WindowState {
|
||||||
|
|
@ -115,22 +113,21 @@ impl WindowState {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
component,
|
component,
|
||||||
rendering,
|
rendering,
|
||||||
event_context,
|
event_context: RefCell::new(event_context),
|
||||||
display_metrics,
|
display_metrics,
|
||||||
pointer,
|
pointer,
|
||||||
active_popup_key: RefCell::new(None),
|
|
||||||
main_surface: surface_rc,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_size(&mut self, width: u32, height: u32) {
|
pub fn update_size(&mut self, width: u32, height: u32) {
|
||||||
let scale_factor = self.event_context.scale_factor();
|
let scale_factor = self.event_context.borrow().scale_factor();
|
||||||
self.rendering.update_size(width, height, scale_factor);
|
self.rendering.update_size(width, height, scale_factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::cast_possible_truncation)]
|
#[allow(clippy::cast_possible_truncation)]
|
||||||
pub fn set_current_pointer_position(&mut self, physical_x: f64, physical_y: f64) {
|
pub fn set_current_pointer_position(&mut self, physical_x: f64, physical_y: f64) {
|
||||||
self.event_context
|
self.event_context
|
||||||
|
.borrow_mut()
|
||||||
.set_current_pointer_position(physical_x, physical_y);
|
.set_current_pointer_position(physical_x, physical_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -139,7 +136,7 @@ impl WindowState {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn current_pointer_position(&self) -> LogicalPosition {
|
pub fn current_pointer_position(&self) -> LogicalPosition {
|
||||||
self.event_context.current_pointer_position()
|
self.event_context.borrow().current_pointer_position()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn window(&self) -> Rc<FemtoVGWindow> {
|
pub(crate) fn window(&self) -> Rc<FemtoVGWindow> {
|
||||||
|
|
@ -158,7 +155,7 @@ impl WindowState {
|
||||||
self.display_metrics
|
self.display_metrics
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.update_output_size(output_size);
|
.update_output_size(output_size);
|
||||||
self.event_context.update_output_size(output_size);
|
self.event_context.borrow().update_output_size(output_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn output_size(&self) -> PhysicalSize {
|
pub fn output_size(&self) -> PhysicalSize {
|
||||||
|
|
@ -180,7 +177,9 @@ impl WindowState {
|
||||||
|
|
||||||
#[allow(clippy::cast_precision_loss)]
|
#[allow(clippy::cast_precision_loss)]
|
||||||
pub fn update_scale_factor(&mut self, scale_120ths: u32) {
|
pub fn update_scale_factor(&mut self, scale_120ths: u32) {
|
||||||
self.event_context.update_scale_factor(scale_120ths);
|
self.event_context
|
||||||
|
.borrow_mut()
|
||||||
|
.update_scale_factor(scale_120ths);
|
||||||
|
|
||||||
let current_logical_size = self.rendering.logical_size();
|
let current_logical_size = self.rendering.logical_size();
|
||||||
if current_logical_size.width > 0 && current_logical_size.height > 0 {
|
if current_logical_size.width > 0 && current_logical_size.height > 0 {
|
||||||
|
|
@ -189,7 +188,7 @@ impl WindowState {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn scale_factor(&self) -> f32 {
|
pub fn scale_factor(&self) -> f32 {
|
||||||
self.event_context.scale_factor()
|
self.event_context.borrow().scale_factor()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const fn display_metrics(&self) -> &SharedDisplayMetrics {
|
pub const fn display_metrics(&self) -> &SharedDisplayMetrics {
|
||||||
|
|
@ -197,49 +196,37 @@ impl WindowState {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn last_pointer_serial(&self) -> u32 {
|
pub fn last_pointer_serial(&self) -> u32 {
|
||||||
self.event_context.last_pointer_serial()
|
self.event_context.borrow().last_pointer_serial()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_last_pointer_serial(&mut self, serial: u32) {
|
pub fn set_last_pointer_serial(&mut self, serial: u32) {
|
||||||
self.event_context.set_last_pointer_serial(serial);
|
self.event_context
|
||||||
|
.borrow_mut()
|
||||||
|
.set_last_pointer_serial(serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_shared_pointer_serial(&mut self, shared_serial: Rc<SharedPointerSerial>) {
|
pub fn set_shared_pointer_serial(&mut self, shared_serial: Rc<SharedPointerSerial>) {
|
||||||
self.event_context.set_shared_pointer_serial(shared_serial);
|
self.event_context
|
||||||
|
.borrow_mut()
|
||||||
|
.set_shared_pointer_serial(shared_serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_popup_manager(&mut self, popup_manager: Rc<PopupManager>) {
|
pub fn set_popup_manager(&mut self, popup_manager: Rc<PopupManager>) {
|
||||||
self.event_context.set_popup_manager(popup_manager);
|
self.event_context
|
||||||
|
.borrow_mut()
|
||||||
|
.set_popup_manager(popup_manager);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_entered_surface(&self, surface: &WlSurface) {
|
pub fn set_entered_surface(&self, surface: &WlSurface) {
|
||||||
if let Some(popup_manager) = self.event_context.popup_manager() {
|
self.event_context.borrow_mut().set_entered_surface(surface);
|
||||||
if let Some(popup_key) = popup_manager.find_popup_key_by_surface_id(&surface.id()) {
|
|
||||||
*self.active_popup_key.borrow_mut() = Some(popup_key);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*self.active_popup_key.borrow_mut() = None;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear_entered_surface(&self) {
|
pub fn clear_entered_surface(&self) {
|
||||||
*self.active_popup_key.borrow_mut() = None;
|
self.event_context.borrow_mut().clear_entered_surface();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn dispatch_to_active_window(&self, event: WindowEvent) {
|
pub fn dispatch_to_active_window(&self, event: WindowEvent) {
|
||||||
let active_popup = *self.active_popup_key.borrow();
|
self.event_context.borrow().dispatch_to_active_window(event);
|
||||||
|
|
||||||
if let Some(popup_key) = active_popup {
|
|
||||||
if let Some(popup_manager) = self.event_context.popup_manager() {
|
|
||||||
if let Some(popup_window) = popup_manager.get_popup_window(popup_key) {
|
|
||||||
popup_window.dispatch_event(event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.event_context
|
|
||||||
.dispatch_to_active_window(event, &self.main_surface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::cast_precision_loss)]
|
#[allow(clippy::cast_precision_loss)]
|
||||||
|
|
@ -258,11 +245,12 @@ impl WindowState {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.event_context
|
self.event_context
|
||||||
|
.borrow()
|
||||||
.update_scale_for_fractional_scale_object(fractional_scale_proxy, scale_120ths);
|
.update_scale_for_fractional_scale_object(fractional_scale_proxy, scale_120ths);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn popup_manager(&self) -> Option<&Rc<PopupManager>> {
|
pub fn popup_manager(&self) -> Option<Rc<PopupManager>> {
|
||||||
self.event_context.popup_manager()
|
self.event_context.borrow().popup_manager().cloned()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -162,15 +162,11 @@ impl RuntimeState<'_> {
|
||||||
|
|
||||||
self.close_current_popup()?;
|
self.close_current_popup()?;
|
||||||
|
|
||||||
let popup_manager = self
|
let popup_manager = self.window_state.popup_manager().ok_or_else(|| {
|
||||||
.window_state
|
Error::Domain(DomainError::Configuration {
|
||||||
.popup_manager()
|
message: "No popup manager available".to_string(),
|
||||||
.ok_or_else(|| {
|
|
||||||
Error::Domain(DomainError::Configuration {
|
|
||||||
message: "No popup manager available".to_string(),
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.cloned()?;
|
})?;
|
||||||
|
|
||||||
let initial_dimensions = match req.size {
|
let initial_dimensions = match req.size {
|
||||||
PopupSize::Fixed { w, h } => {
|
PopupSize::Fixed { w, h } => {
|
||||||
|
|
@ -233,15 +229,11 @@ impl RuntimeState<'_> {
|
||||||
height: f32,
|
height: f32,
|
||||||
resize_sender: Option<channel::Sender<PopupCommand>>,
|
resize_sender: Option<channel::Sender<PopupCommand>>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let popup_manager = self
|
let popup_manager = self.window_state.popup_manager().ok_or_else(|| {
|
||||||
.window_state
|
Error::Domain(DomainError::Configuration {
|
||||||
.popup_manager()
|
message: "No popup manager available".to_string(),
|
||||||
.ok_or_else(|| {
|
|
||||||
Error::Domain(DomainError::Configuration {
|
|
||||||
message: "No popup manager available".to_string(),
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.cloned()?;
|
})?;
|
||||||
|
|
||||||
let Some((request, _serial)) = popup_manager.get_popup_info(handle.key()) else {
|
let Some((request, _serial)) = popup_manager.get_popup_info(handle.key()) else {
|
||||||
log::debug!(
|
log::debug!(
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue