mirror of
				https://codeberg.org/waydeer/layer-shika.git
				synced 2025-10-31 20:04:23 +00:00 
			
		
		
		
	refactor: modularize windowing system
This commit is contained in:
		
							parent
							
								
									5cdf4d5af9
								
							
						
					
					
						commit
						afe77990f8
					
				
					 3 changed files with 128 additions and 112 deletions
				
			
		
							
								
								
									
										92
									
								
								src/windowing/builder.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/windowing/builder.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,92 @@ | ||||||
|  | use anyhow::Result; | ||||||
|  | use slint_interpreter::ComponentDefinition; | ||||||
|  | use smithay_client_toolkit::reexports::protocols_wlr::layer_shell::v1::client::{ | ||||||
|  |     zwlr_layer_shell_v1::{self}, | ||||||
|  |     zwlr_layer_surface_v1::{Anchor, KeyboardInteractivity}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | use super::{config::WindowConfig, WindowingSystem}; | ||||||
|  | 
 | ||||||
|  | pub struct WindowingSystemBuilder { | ||||||
|  |     config: WindowConfig, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Default for WindowingSystemBuilder { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self::new() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl WindowingSystemBuilder { | ||||||
|  |     #[inline] | ||||||
|  |     #[must_use] | ||||||
|  |     pub fn new() -> Self { | ||||||
|  |         Self { | ||||||
|  |             config: WindowConfig::default(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_height(mut self, height: u32) -> Self { | ||||||
|  |         self.config.height = height; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_layer(mut self, layer: zwlr_layer_shell_v1::Layer) -> Self { | ||||||
|  |         self.config.layer = layer; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_margin(mut self, top: i32, right: i32, bottom: i32, left: i32) -> Self { | ||||||
|  |         self.config.margin = (top, right, bottom, left); | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_anchor(mut self, anchor: Anchor) -> Self { | ||||||
|  |         self.config.anchor = anchor; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_keyboard_interactivity( | ||||||
|  |         mut self, | ||||||
|  |         interactivity: KeyboardInteractivity, | ||||||
|  |     ) -> Self { | ||||||
|  |         self.config.keyboard_interactivity = interactivity; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_exclusive_zone(mut self, zone: i32) -> Self { | ||||||
|  |         self.config.exclusive_zone = zone; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub fn with_namespace(mut self, namespace: String) -> Self { | ||||||
|  |         self.config.namespace = namespace; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub const fn with_scale_factor(mut self, scale_factor: f32) -> Self { | ||||||
|  |         self.config.scale_factor = scale_factor; | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     #[must_use] | ||||||
|  |     pub fn with_component_definition(mut self, component: ComponentDefinition) -> Self { | ||||||
|  |         self.config.component_definition = Some(component); | ||||||
|  |         self | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     pub fn build(self) -> Result<WindowingSystem> { | ||||||
|  |         match self.config.component_definition { | ||||||
|  |             Some(_) => WindowingSystem::new(self.config), | ||||||
|  |             None => Err(anyhow::anyhow!("Slint component not set")), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								src/windowing/config.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/windowing/config.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | use slint_interpreter::ComponentDefinition; | ||||||
|  | use smithay_client_toolkit::reexports::protocols_wlr::layer_shell::v1::client::{ | ||||||
|  |     zwlr_layer_shell_v1::{self}, | ||||||
|  |     zwlr_layer_surface_v1::{Anchor, KeyboardInteractivity}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | pub struct WindowConfig { | ||||||
|  |     pub height: u32, | ||||||
|  |     pub layer: zwlr_layer_shell_v1::Layer, | ||||||
|  |     pub margin: (i32, i32, i32, i32), | ||||||
|  |     pub anchor: Anchor, | ||||||
|  |     pub keyboard_interactivity: KeyboardInteractivity, | ||||||
|  |     pub exclusive_zone: i32, | ||||||
|  |     pub scale_factor: f32, | ||||||
|  |     pub namespace: String, | ||||||
|  |     pub component_definition: Option<ComponentDefinition>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Default for WindowConfig { | ||||||
|  |     fn default() -> Self { | ||||||
|  |         Self { | ||||||
|  |             height: 30, | ||||||
|  |             layer: zwlr_layer_shell_v1::Layer::Top, | ||||||
|  |             margin: (0, 0, 0, 0), | ||||||
|  |             anchor: Anchor::Top | Anchor::Left | Anchor::Right, | ||||||
|  |             keyboard_interactivity: KeyboardInteractivity::OnDemand, | ||||||
|  |             exclusive_zone: -1, | ||||||
|  |             namespace: "layer-shika".to_owned(), | ||||||
|  |             scale_factor: 1.0, | ||||||
|  |             component_definition: None, | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -6,6 +6,7 @@ use crate::{ | ||||||
|     }, |     }, | ||||||
| }; | }; | ||||||
| use anyhow::{Context, Result}; | use anyhow::{Context, Result}; | ||||||
|  | use config::WindowConfig; | ||||||
| use log::{debug, info}; | use log::{debug, info}; | ||||||
| use slint::{platform::femtovg_renderer::FemtoVGRenderer, ComponentHandle, LogicalPosition}; | use slint::{platform::femtovg_renderer::FemtoVGRenderer, ComponentHandle, LogicalPosition}; | ||||||
| use slint_interpreter::{ComponentDefinition, ComponentInstance}; | use slint_interpreter::{ComponentDefinition, ComponentInstance}; | ||||||
|  | @ -29,122 +30,12 @@ use wayland_client::{ | ||||||
|     Connection, EventQueue, Proxy, QueueHandle, |     Connection, EventQueue, Proxy, QueueHandle, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | pub mod builder; | ||||||
|  | mod config; | ||||||
| mod event_loop; | mod event_loop; | ||||||
| mod macros; | mod macros; | ||||||
| mod state; | mod state; | ||||||
| 
 | 
 | ||||||
| pub struct WindowConfig { |  | ||||||
|     height: u32, |  | ||||||
|     layer: zwlr_layer_shell_v1::Layer, |  | ||||||
|     margin: (i32, i32, i32, i32), |  | ||||||
|     anchor: Anchor, |  | ||||||
|     keyboard_interactivity: KeyboardInteractivity, |  | ||||||
|     exclusive_zone: i32, |  | ||||||
|     scale_factor: f32, |  | ||||||
|     namespace: String, |  | ||||||
|     component_definition: Option<ComponentDefinition>, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Default for WindowConfig { |  | ||||||
|     fn default() -> Self { |  | ||||||
|         Self { |  | ||||||
|             height: 30, |  | ||||||
|             layer: zwlr_layer_shell_v1::Layer::Top, |  | ||||||
|             margin: (0, 0, 0, 0), |  | ||||||
|             anchor: Anchor::Top | Anchor::Left | Anchor::Right, |  | ||||||
|             keyboard_interactivity: KeyboardInteractivity::OnDemand, |  | ||||||
|             exclusive_zone: -1, |  | ||||||
|             namespace: "layer-shika".to_owned(), |  | ||||||
|             scale_factor: 1.0, |  | ||||||
|             component_definition: None, |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pub struct WindowingSystemBuilder { |  | ||||||
|     config: WindowConfig, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Default for WindowingSystemBuilder { |  | ||||||
|     fn default() -> Self { |  | ||||||
|         Self::new() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl WindowingSystemBuilder { |  | ||||||
|     #[inline] |  | ||||||
|     #[must_use] |  | ||||||
|     pub fn new() -> Self { |  | ||||||
|         Self { |  | ||||||
|             config: WindowConfig::default(), |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_height(mut self, height: u32) -> Self { |  | ||||||
|         self.config.height = height; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_layer(mut self, layer: zwlr_layer_shell_v1::Layer) -> Self { |  | ||||||
|         self.config.layer = layer; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_margin(mut self, top: i32, right: i32, bottom: i32, left: i32) -> Self { |  | ||||||
|         self.config.margin = (top, right, bottom, left); |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_anchor(mut self, anchor: Anchor) -> Self { |  | ||||||
|         self.config.anchor = anchor; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_keyboard_interactivity( |  | ||||||
|         mut self, |  | ||||||
|         interactivity: KeyboardInteractivity, |  | ||||||
|     ) -> Self { |  | ||||||
|         self.config.keyboard_interactivity = interactivity; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_exclusive_zone(mut self, zone: i32) -> Self { |  | ||||||
|         self.config.exclusive_zone = zone; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub fn with_namespace(mut self, namespace: String) -> Self { |  | ||||||
|         self.config.namespace = namespace; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub const fn with_scale_factor(mut self, scale_factor: f32) -> Self { |  | ||||||
|         self.config.scale_factor = scale_factor; |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     #[must_use] |  | ||||||
|     pub fn with_component_definition(mut self, component: ComponentDefinition) -> Self { |  | ||||||
|         self.config.component_definition = Some(component); |  | ||||||
|         self |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn build(self) -> Result<WindowingSystem> { |  | ||||||
|         match self.config.component_definition { |  | ||||||
|             Some(_) => WindowingSystem::new(self.config), |  | ||||||
|             None => Err(anyhow::anyhow!("Slint component not set")), |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pub struct WindowingSystem { | pub struct WindowingSystem { | ||||||
|     state: Rc<RefCell<WindowState>>, |     state: Rc<RefCell<WindowState>>, | ||||||
|     connection: Rc<Connection>, |     connection: Rc<Connection>, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue