SmlOS九-窗口控制功能

  • 内容
  • 评论
  • 相关

大致简介

在现代的操作系统中,窗口管理是一个非常复杂的功能。

但是,作为一个合格的toy os,实现的能显示,能拖动就好了。

大致原理就是:

每个窗口就是大小不一的矩形图层,在背景的这个大矩形上,可以进行移动和相互覆盖或者部分覆盖的操作。

最终展示的画面其实都是计算出来的一幅画。


拖动显示原理

以鼠标的拖动为例,我们怎么实现鼠标的拖动显示的呢?

鼠标也是一个16*16的矩形图层,假设我们现在只有两个图层,一个是鼠标图层,一个是背景图层。

在我们之前已经收到了鼠标移动的中断解析,假如鼠标向右移动16个位置,那么我们该如何显示呢。

image

其实就两步:
* 1.在原位置矩形中,从背景图层中把相应位置的像素填充进去
* 2.把鼠标矩形,在绘制到新位置的矩形上去。

这样在快速刷新的情况下,看起来就是鼠标的拖动效果了。

当然,窗口管理仅有拖动是不够的,还需要以下基本功能.

  • 透明色支持
    • (比如鼠标是需要透明色的)
  • 是否是顶层图层
    • (鼠标就是顶层图层,不然移到其他窗口下面去了)
  • 窗口高度设定
    • (比如说你点击了一个窗口,这个窗口的高度就应该是变高的,然后根据高度绘制界面)
  • 避免全界面刷新
    • (在鼠标的例子中,我们也只是刷新了两个小矩形窗口而已,这里主要是为了效率考虑)
  • 窗口隐藏
    • (窗口关闭和最小化也是需要处理的)

窗口图层相关结构

图层管理表:

struct SHTCTL
{
 unsigned char *vram, *map;
 int xsize, ysize, top;
 struct SHEET *p_sheets[MAX_SHEETS];
 struct SHEET sheets[MAX_SHEETS];
};
  • vram: 图像缓冲区首地址
  • xsize, ysize: 分辨率的x和y
  • sheets: 图层指针数组, 指向sheets0中各个图层
  • sheets0: 图层数组, 存放各个图层结构

单个图层结构体如下:

struct SHEET
{
 unsigned char *buf;
 int bxsize, bysize, vx0, vy0, col_inv, height, flags;
 struct SHTCTL *ctl;
};
  • buf:是记录图层上所描画内容的地址

  • bxsize, bysize: 图层的行数和列数

  • vx0, vy0: 图层左上角的坐标

  • col_inv: 图层的透明色色号

  • height: 图层的高度

  • flags: 记录图层各种状态信息

窗口图层管理结构的初始化

建立在内存分配功能实现的基础上,首先从内存中分配足够大的内存空间,也为图层地图分配了内存空间。

遍历所有图层,初始化所有的图层的使用标志为未使用,且把sheet管理的结构体指向自身。


窗口分配

图层的分配比较简单,主要是遍历图层管理表 ,查找第一个未使用的图层,即Flag=0的图层。

找到之后,该图层的使用状态时使用,并且高度设置为-1,即不显示,最后返回该图层地址,如果失败返回0.


窗口刷新

图层的刷新考虑到很多的算法设计,系统设计中,对于图层的设置都不会刷新全部的显示内容,这样的算法效率太低,所以只会刷新相关需要显示的相关区域。

还有很多具体细节比如怎么移动,覆盖了部分窗口,覆盖了全部窗口,窗口超出了界面等就不一一展示了。