Skip to content

Commit

Permalink
Patch refactor scm and textui (#289)
Browse files Browse the repository at this point in the history
* 重构屏幕管理器和textui框架

* 切换字体为spleen,并增加对字体的抽象

* 修正文档

---------

Co-authored-by: longjin <[email protected]>
  • Loading branch information
hanjiezhou and fslongjin committed Aug 19, 2023
1 parent 5db5a56 commit abe3a6e
Show file tree
Hide file tree
Showing 42 changed files with 2,006 additions and 1,727 deletions.
1 change: 0 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"stdbool.h": "c",
"printk.h": "c",
"stdarg.h": "c",
"font.h": "c",
"trap.h": "c",
"gate.h": "c",
"process.h": "c",
Expand Down
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
kernel/debug/index
kernel/ktest/index
kernel/cpu_arch/index
kernel/libs/index


.. toctree::
Expand Down
12 changes: 12 additions & 0 deletions docs/kernel/libs/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
====================================
其他内核库
====================================

这里的集中了内核中的一些库的文档,这些库不属于任何子系统。

.. toctree::
:maxdepth: 1

lib_ui/scm
lib_ui/textui

83 changes: 83 additions & 0 deletions docs/kernel/libs/lib_ui/scm.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# 屏幕管理器(SCM)

:::{note}
作者: 周瀚杰 <[email protected]>
:::
&emsp;&emsp;屏幕管理器用来管理控制所有ui框架,所有框架都必须先在屏幕管理器中注册才可使用,然后scm控制当前是哪个ui框架在使用

## traits

### ScmUiFramework
&emsp;&emsp;每个要注册到scm中的ui框架都必须实现这个trait中的方法,具体定义如下:
```rust
pub trait ScmUiFramework: Sync + Send + Debug {
// 安装ui框架的回调函数
fn install(&self) -> Result<i32, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
// 卸载ui框架的回调函数
fn uninstall(&self) -> Result<i32, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
// 启用ui框架的回调函数
fn enable(&self) -> Result<i32, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
// 禁用ui框架的回调函数
fn disable(&self) -> Result<i32, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
// 改变ui框架的帧缓冲区的回调函数
fn change(&self, _buf: ScmBufferInfo) -> Result<i32, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
/// @brief 获取ScmUiFramework的元数据
/// @return 成功:Ok(ScmUiFramework的元数据)
/// 失败:Err(错误码)
fn metadata(&self) -> Result<ScmUiFrameworkMetadata, SystemError> {
// 若文件系统没有实现此方法,则返回“不支持”
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
}
```
## 主要API
### scm_init() -初始化屏幕管理模块
#### 原型
```rust
pub extern "C" fn scm_init()
```
#### 说明
&emsp;&emsp;scm_init()主要是初始化一些scm中使用的全局变量,例如是否使用双缓冲区标志位,textui未初始化时使用的一些全局变量

### scm_reinit() -当内存管理单元被初始化之后,重新初始化屏幕管理模块
#### 原型
```rust
pub extern "C" fn scm_reinit() -> i32
```
#### 说明
&emsp;&emsp;scm_reinit()用于当内存管理单元被初始化之后,重新处理帧缓冲区问题

### scm_enable_double_buffer() -允许双缓冲区
#### 原型
```rust
pub extern "C" fn scm_enable_double_buffer() -> i32
```
#### 说明
&emsp;&emsp;scm_enable_double_buffer()用于启动双缓冲来往窗口输出打印信息。启用后,往窗口输出的信息会暂时放在一个缓冲区中,然后每次按一定时间将该缓冲区的信息输出到窗口帧缓冲区中,渲染显示到窗口上。

### scm_framework_enable() -启用某个ui框架,将它的帧缓冲区渲染到屏幕上
#### 原型
```rust
pub fn scm_framework_enable(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError>
```
#### 说明
&emsp;&emsp;scm_framework_enable用于启用某个ui框架,将它的帧缓冲区渲染到屏幕上


### scm_register() -向屏幕管理器注册UI框架
#### 原型
```rust
pub fn scm_register(framework: Arc<dyn ScmUiFramework>) -> Result<i32, SystemError>
```
#### 说明
&emsp;&emsp;scm_register用于将ui框架注册到scm中,主要是调用ui框架的回调函数以安装ui框架,并将其激活
32 changes: 32 additions & 0 deletions docs/kernel/libs/lib_ui/textui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# 文本显示框架(textui)

:::{note}
作者: 周瀚杰 <[email protected]>
:::
&emsp;&emsp;文本框架主要用于DragonOS的文本的窗口渲染显示,往屏幕窗口中输出打印文本信息,往窗口显示文本分成两种情况:一种是当内存管理单元(mm)未被初始化时,不能进行动态内存分配,限制颇多(例如不能使用vec,mpsc等),所以直接往窗口的帧缓冲区输出打印信息,不使用虚拟行等复杂结构体;另一种是当内存管理单元(mm)已经初始化,可以进行动态内存分配,便可以使用一些复杂的结构体来处理要打印的文本信息。


## 主要API
### rs_textui_init() -textui框架初始化
#### 原型
```rust
pub extern "C" fn rs_textui_init() -> i32
```
#### 说明
&emsp;&emsp;rs_textui_init()主要是初始化一些textui框架要使用到的一些全局变量信息(例如TEXTUIFRAMEWORKTEXTUI_PRIVATE_INFO等),以及将textui框架注册到scm中。

### textui_putchar() -textui框架中的当前使用的窗口打印文本信息
#### 原型
```rust
pub extern "C" fn rs_textui_putchar(character: u8, fr_color: u32, bk_color: u32) -> i32

pub fn textui_putchar(
character: char,
fr_color: FontColor,
bk_color: FontColor,
) -> Result<(), SystemError>
```
#### 说明
&emsp;&emsp;textui_putchar()要处理两种情况:一种是当内存管理单元(mm)未被初始化时,不能进行动态内存分配,限制颇多(例如不能使用vec,mpsc等),所以直接往窗口的帧缓冲区输出打印信息,不使用虚拟行等复杂结构体;另一种是当内存管理单元(mm)已经初始化,可以进行动态内存分配,便可以使用一些复杂的结构体来处理要打印的文本信息。


21 changes: 4 additions & 17 deletions kernel/src/arch/x86_64/mm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ use x86_64::registers::model_specific::EferFlags;

use crate::driver::uart::uart::c_uart_send_str;
use crate::include::bindings::bindings::{
disable_textui, enable_textui, multiboot2_get_memory, multiboot2_iter, multiboot_mmap_entry_t,
video_reinitialize,
multiboot2_get_memory, multiboot2_iter, multiboot_mmap_entry_t,
};
use crate::libs::align::page_align_up;
use crate::libs::lib_ui::screen_manager::scm_disable_put_to_window;
use crate::libs::printk::PrintkWriter;
use crate::libs::spinlock::SpinLock;

Expand Down Expand Up @@ -315,8 +315,6 @@ pub fn mm_init() {
unsafe { allocator_init() };
// enable mmio
mmio_init();
// 启用printk的alloc选项
PrintkWriter.enable_alloc();
}

unsafe fn allocator_init() {
Expand Down Expand Up @@ -396,9 +394,8 @@ unsafe fn allocator_init() {
unsafe { set_inner_allocator(buddy_allocator) };
kinfo!("Successfully initialized buddy allocator");
// 关闭显示输出
unsafe {
disable_textui();
}
scm_disable_put_to_window();

// make the new page table current
{
let mut binding = INNER_ALLOCATOR.lock();
Expand All @@ -416,16 +413,6 @@ unsafe fn allocator_init() {
kdebug!("New page table enabled");
}
kdebug!("Successfully enabled new page table");
// 重置显示输出目标
unsafe {
video_reinitialize(false);
}

// 打开显示输出
unsafe {
enable_textui();
}
kdebug!("Text UI enabled");
}

#[no_mangle]
Expand Down
4 changes: 2 additions & 2 deletions kernel/src/common/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
#pragma once
#include <arch/x86_64/include/asm/cmpxchg.h>

#define atomic_read(atomic) ((atomic)->value) // 读取原子变量
#define atomic_set(atomic,val) (((atomic)->value) = (val)) // 设置原子变量的初始值
#define atomic_read(atomic) ((atomic)->value) // 读取原子变量
#define atomic_set(atomic, val) (((atomic)->value) = (val)) // 设置原子变量的初始值

typedef struct
{
Expand Down
Loading

0 comments on commit abe3a6e

Please sign in to comment.