xref: /DragonOS/docs/kernel/libs/lib_ui/scm.md (revision abe3a6ea3c543425e2cad12722e8a658b324d515)
1*abe3a6eaShanjiezhou# 屏幕管理器(SCM)
2*abe3a6eaShanjiezhou
3*abe3a6eaShanjiezhou:::{note}
4*abe3a6eaShanjiezhou作者: 周瀚杰 <2625553453@qq.com>
5*abe3a6eaShanjiezhou:::
6*abe3a6eaShanjiezhou&emsp;&emsp;屏幕管理器用来管理控制所有ui框架,所有框架都必须先在屏幕管理器中注册才可使用,然后scm控制当前是哪个ui框架在使用
7*abe3a6eaShanjiezhou
8*abe3a6eaShanjiezhou## traits
9*abe3a6eaShanjiezhou
10*abe3a6eaShanjiezhou### ScmUiFramework
11*abe3a6eaShanjiezhou&emsp;&emsp;每个要注册到scm中的ui框架都必须实现这个trait中的方法,具体定义如下:
12*abe3a6eaShanjiezhou```rust
13*abe3a6eaShanjiezhoupub trait ScmUiFramework: Sync + Send + Debug {
14*abe3a6eaShanjiezhou    // 安装ui框架的回调函数
15*abe3a6eaShanjiezhou    fn install(&self) -> Result<i32, SystemError> {
16*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
17*abe3a6eaShanjiezhou    }
18*abe3a6eaShanjiezhou    // 卸载ui框架的回调函数
19*abe3a6eaShanjiezhou    fn uninstall(&self) -> Result<i32, SystemError> {
20*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
21*abe3a6eaShanjiezhou    }
22*abe3a6eaShanjiezhou    // 启用ui框架的回调函数
23*abe3a6eaShanjiezhou    fn enable(&self) -> Result<i32, SystemError> {
24*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
25*abe3a6eaShanjiezhou    }
26*abe3a6eaShanjiezhou    // 禁用ui框架的回调函数
27*abe3a6eaShanjiezhou    fn disable(&self) -> Result<i32, SystemError> {
28*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
29*abe3a6eaShanjiezhou    }
30*abe3a6eaShanjiezhou    // 改变ui框架的帧缓冲区的回调函数
31*abe3a6eaShanjiezhou    fn change(&self, _buf: ScmBufferInfo) -> Result<i32, SystemError> {
32*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
33*abe3a6eaShanjiezhou    }
34*abe3a6eaShanjiezhou    /// @brief 获取ScmUiFramework的元数据
35*abe3a6eaShanjiezhou    /// @return 成功:Ok(ScmUiFramework的元数据)
36*abe3a6eaShanjiezhou    ///         失败:Err(错误码)
37*abe3a6eaShanjiezhou    fn metadata(&self) -> Result<ScmUiFrameworkMetadata, SystemError> {
38*abe3a6eaShanjiezhou        // 若文件系统没有实现此方法,则返回“不支持”
39*abe3a6eaShanjiezhou        return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
40*abe3a6eaShanjiezhou    }
41*abe3a6eaShanjiezhou}
42*abe3a6eaShanjiezhou```
43*abe3a6eaShanjiezhou## 主要API
44*abe3a6eaShanjiezhou### scm_init() -初始化屏幕管理模块
45*abe3a6eaShanjiezhou#### 原型
46*abe3a6eaShanjiezhou```rust
47*abe3a6eaShanjiezhoupub extern "C" fn scm_init()
48*abe3a6eaShanjiezhou```
49*abe3a6eaShanjiezhou#### 说明
50*abe3a6eaShanjiezhou&emsp;&emsp;scm_init()主要是初始化一些scm中使用的全局变量,例如是否使用双缓冲区标志位,textui未初始化时使用的一些全局变量
51*abe3a6eaShanjiezhou
52*abe3a6eaShanjiezhou### scm_reinit() -当内存管理单元被初始化之后,重新初始化屏幕管理模块
53*abe3a6eaShanjiezhou#### 原型
54*abe3a6eaShanjiezhou```rust
55*abe3a6eaShanjiezhoupub extern "C" fn scm_reinit() -> i32
56*abe3a6eaShanjiezhou```
57*abe3a6eaShanjiezhou#### 说明
58*abe3a6eaShanjiezhou&emsp;&emsp;scm_reinit()用于当内存管理单元被初始化之后,重新处理帧缓冲区问题
59*abe3a6eaShanjiezhou
60*abe3a6eaShanjiezhou### scm_enable_double_buffer() -允许双缓冲区
61*abe3a6eaShanjiezhou#### 原型
62*abe3a6eaShanjiezhou```rust
63*abe3a6eaShanjiezhoupub extern "C" fn scm_enable_double_buffer() -> i32
64*abe3a6eaShanjiezhou```
65*abe3a6eaShanjiezhou#### 说明
66*abe3a6eaShanjiezhou&emsp;&emsp;scm_enable_double_buffer()用于启动双缓冲来往窗口输出打印信息。启用后,往窗口输出的信息会暂时放在一个缓冲区中,然后每次按一定时间将该缓冲区的信息输出到窗口帧缓冲区中,渲染显示到窗口上。
67*abe3a6eaShanjiezhou
68*abe3a6eaShanjiezhou### scm_framework_enable() -启用某个ui框架,将它的帧缓冲区渲染到屏幕上
69*abe3a6eaShanjiezhou#### 原型
70*abe3a6eaShanjiezhou```rust
71*abe3a6eaShanjiezhoupub fn scm_framework_enable(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError>
72*abe3a6eaShanjiezhou```
73*abe3a6eaShanjiezhou#### 说明
74*abe3a6eaShanjiezhou&emsp;&emsp;scm_framework_enable用于启用某个ui框架,将它的帧缓冲区渲染到屏幕上
75*abe3a6eaShanjiezhou
76*abe3a6eaShanjiezhou
77*abe3a6eaShanjiezhou### scm_register() -向屏幕管理器注册UI框架
78*abe3a6eaShanjiezhou#### 原型
79*abe3a6eaShanjiezhou```rust
80*abe3a6eaShanjiezhoupub fn scm_register(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError>
81*abe3a6eaShanjiezhou```
82*abe3a6eaShanjiezhou#### 说明
83*abe3a6eaShanjiezhou&emsp;&emsp;scm_register用于将ui框架注册到scm中,主要是调用ui框架的回调函数以安装ui框架,并将其激活
84