[第11天]制作新窗口

      博客记录到11天,进度已经15天(多任务)了。因为一个不小心就往前冲,停不下来。进度到一半,感觉接下去才是操作系统的核心。前面都是关于硬件的,没有涉及理论。先把11天记录下来再说。

      今天是昨天的延续。在完成叠加处理后可以制作新的窗口。而叠加处理不用修改,只需加个图层就行。主要代码其实跟显示鼠标差不多,如下。

      效果如下:居然有一点win98的味道了。

window

      然后作者不满意鼠标移动到图层的闪烁。因此加以优化。闪烁的主要原因是刷新整个上部图层效率不高。作者是用“MAP”的方式,记下屏幕每块区域的所属。这样之后,比如鼠标所在map就不需要刷新了。代码修改比较多,可以看github

      今天内容较少。。。。。

[第10天]叠加处理

      终于到1/3了。今天作者介绍如何处理上次出现的鼠标覆盖的问题。主要原理是把窗口分层。确定图层的相对位置。然后根据位置,从底至上刷新像素。

图层控制:

      以下是图层的主要控制部分。SHEET代表了每个图层的信息,含义如注释。SHTCTL保存控制所有图层的信息。一共支持256个图层。这里的col_inv还不是很理解。大致的作用就是看是否要进行刷新。起到的作用就是透明色效果。比如指定透明色为99,鼠标设定的背景色为99,那么在刷新是遇到99就不刷新。

控制函数:

      不仅为了解决这个问题,还为后面的窗口做准备。作者一下子把窗口相对高度(sheet_updown())也搞定了。最简单的方法是刷新所有的区域。但这样效率不高,画面还闪。因此作者的做法是只刷新窗口移动前后位置的像素。如sheet_refreshsub()的功能。这些函数的实现还是需要进行思考的。

初始化显示:

      因为不是在一个vram上显示,我们要做的是把一个个图层添加到屏幕。同时要分配内存,内存是额外增加的,所以之前的内存管理就在这里起到了很好的作用。但貌似作者没有很好的处理这里的内存释放。

后续:

      这个版本的刷新还不是最完善的。比如没有必要从底到上全部刷新。这些问题在下一天解决。今天成果和代码:

mouse

Python: list, dict, tuple, file

      chromium更新了Version 35.0.1916.114 (270117)。字体变好看了,爽!好像还出来aura什么的。

      list, dict, tuple基本上算Python中最常用的高级数据类型。很多其他数据结构都可以由这些数据类型衍生。比如namedtuple。

list:

      list相当于数组,但是不同于数组的是list可以存任何数据类型,可以嵌套。因为list存的都是引用(指针)。比一般的数组灵活很多。比如添加元素,删除等。list是可变的,即一般的操作不会改变list的内存地址。像 l.sort() 都是直接在原list上操作的 不会返回新list。如果要返回新list的话使用sorted会更好。list等其他类型都要注意循环引用的问题。如下代码,在很久以前的Python会有问题。现在的Python也很好玩。

dict:

      dict是Python里非常神奇的数据类型。上能建树下能索引。dict使用hash来实现基本功能,因此dict的key的顺序是随机的,甚至同一个程序不同时间也会不一样,具体可以参考。dict用起来也是非常方便的,dict的key是不能用可变类型的,因为key要先hash,可变类型hash是没有意义的。关键是dict的Python3跟Python2稍微有点区别。最主要的区别是获取keys。 D.keys() 返回的是类似set的类型。如下程序测试。

tuple:

      tuple应该来说是最简单的。tuple是不可变类型。但tuple里面引用的内容可以变,不变的是可变数据类型的引用。如下。

      有了list为什么还有有tuple呢。最直接的原因是tuple的不可变。可以限制其他地方不小心的更改。更好的一点是因为不可变,tuple可以作为dict的key。

namedtuple是既可以像list一样顺序存取也可以像dict一样按key来。很有意思。

file:

      file姑且也算数据类型了。是由open()函数来创建。但也有其他类型的file,比如socket等。file在Python中默认以uft8格式解码,而不是Unicode。这两个之间还是有一点差别的。当然Python也可以指定不解码,以二进制方式读取, f = open('boot.img','rb') 。这种用法通常是读取编译文件等等。

      有时要把对象写入file。这是就需要序列化。python有内置的pickle等,有个struct也很好用。具体含义help就知。

      file据说不用手动关闭,因为Python的gc会自动收集没有引用的文件。但作为良好编程习惯还算close好。但也可以使用Python的File Context Manager.
      Python可以直接把shell的命令执行结果当成文件。

Unicode与utf8:

      Python默认是使用utf8的而不是Unicode。还有个NCR是用在网页里的,跟Unicode差不多,就是表示方法不一样。可以试一下Python中的对字符的处理以及utf8和Unicode间的转换。

链接:

  1. Python Built-in Types