1*abe3a6eaShanjiezhou# 屏幕管理器(SCM) 2*abe3a6eaShanjiezhou 3*abe3a6eaShanjiezhou:::{note} 4*abe3a6eaShanjiezhou作者: 周瀚杰 <2625553453@qq.com> 5*abe3a6eaShanjiezhou::: 6*abe3a6eaShanjiezhou  屏幕管理器用来管理控制所有ui框架,所有框架都必须先在屏幕管理器中注册才可使用,然后scm控制当前是哪个ui框架在使用 7*abe3a6eaShanjiezhou 8*abe3a6eaShanjiezhou## traits 9*abe3a6eaShanjiezhou 10*abe3a6eaShanjiezhou### ScmUiFramework 11*abe3a6eaShanjiezhou  每个要注册到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  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  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  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  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  scm_register用于将ui框架注册到scm中,主要是调用ui框架的回调函数以安装ui框架,并将其激活 84