1 use std::{cell::RefCell, collections::BTreeMap, sync::Arc};
2
3 use crate::{
4 base::{display::Display, image::Image},
5 config::Config,
6 };
7
8 use self::{
9 compositor::{compositor, Compositor},
10 input::{input_manager, InputManager},
11 window_manager::{window_manager, CursorKind, WindowManager},
12 };
13
14 pub mod compositor;
15 pub mod input;
16 pub mod window_manager;
17
18 // TODO: 读帧缓冲设备属性
19 /// 屏幕宽度
20 pub const SCREEN_WIDTH: usize = 1440;
21 /// 屏幕高度
22 #[allow(dead_code)]
23 pub const SCREEN_HEIGHT: usize = 900;
24
25 static DESKTOP_BG: &[u8] = include_bytes!("../resource/desktop_bg.png");
26 static CURSOR_NORMAL: &[u8] = include_bytes!("../resource/cursor_normal.png");
27
28 static mut STARRY_SERVER: Option<Arc<StarryServer>> = None;
29
starry_server() -> Option<Arc<StarryServer>>30 pub fn starry_server() -> Option<Arc<StarryServer>> {
31 unsafe { STARRY_SERVER.clone() }
32 }
33
34 /// 图形系统服务器
35 pub struct StarryServer {
36 pub displays: RefCell<Vec<Display>>,
37 pub config: RefCell<Arc<Config>>,
38 pub cursors: RefCell<BTreeMap<CursorKind, Image>>,
39 }
40
41 impl StarryServer {
42 /// 创建图形服务器
new(config: Arc<Config>, displays: Vec<Display>)43 pub fn new(config: Arc<Config>, displays: Vec<Display>) {
44 let mut cursors = BTreeMap::new();
45 cursors.insert(CursorKind::None, Image::new(0, 0));
46 cursors.insert(
47 CursorKind::Normal,
48 Image::from_path(CURSOR_NORMAL).unwrap_or(Image::new(10, 10)),
49 );
50 // cursors.insert(CursorKind::BottomLeftCorner, Image::from_path_scale(&config.bottom_left_corner, scale).unwrap_or(Image::new(0, 0)));
51 // cursors.insert(CursorKind::BottomRightCorner, Image::from_path_scale(&config.bottom_right_corner, scale).unwrap_or(Image::new(0, 0)));
52 // cursors.insert(CursorKind::BottomSide, Image::from_path_scale(&config.bottom_side, scale).unwrap_or(Image::new(0, 0)));
53 // cursors.insert(CursorKind::LeftSide, Image::from_path_scale(&config.left_side, scale).unwrap_or(Image::new(0, 0)));
54 // cursors.insert(CursorKind::RightSide, Image::from_path_scale(&config.right_side, scale).unwrap_or(Image::new(0, 0)));
55
56 let server = StarryServer {
57 displays: RefCell::new(displays),
58 config: RefCell::new(config),
59 cursors: RefCell::new(cursors),
60 };
61
62 unsafe {
63 STARRY_SERVER = Some(Arc::new(server));
64 }
65
66 // println!("[Init] Starry_Server created successfully!");
67 }
68
69 /// 开启主循环
run(&self)70 pub fn run(&self) {
71 WindowManager::new();
72 Compositor::new();
73 InputManager::new();
74
75 // TODO 临时在此创建桌面窗口
76 window_manager().unwrap().window_new(
77 0,
78 0,
79 SCREEN_WIDTH as i32,
80 SCREEN_HEIGHT as i32,
81 "",
82 "".to_string(),
83 DESKTOP_BG,
84 );
85
86 // println!("[Init] Starry_Server start main loop!");
87 loop {
88 input_manager().unwrap().polling_all(); // 轮询所有设备文件
89 window_manager().unwrap().polling_all_windows(); // 轮询所有窗口通信管道
90 window_manager().unwrap().handle_all_events(); // 处理所有事件
91 compositor().unwrap().redraw_all(); // 重绘所有更新区域
92 std::thread::sleep(std::time::Duration::from_millis(1));
93 }
94 }
95 }
96