danath 发表于 2006-10-10 19:19:34

asmcos,能否探讨几个问题?

我自己也做GUI,看了你写的文档(版本0.1),觉得我们在思维上的一些差异比较有趣:

1. 最大的差别是我的GUI只能供一个进程使用,因此没有内核代码,另外目前我只支持256色,当然代码逻辑是与颜色深度无关的.

2. 窗口类型,我只定义了一种窗口类型,其实例既可以充当根窗口(借用X术语),也可以充当控件,取决于它到底是注册到GUI核心还是另外一个窗口.

3. 窗口修饰,我的窗口没有任何修饰,即没有边框和标题栏,窗口可以在自己的范围内任意绘制,如果用户需要给某个应用定制统一的外观,可以自行派生一个窗口类来实现公共的绘制.

4. 窗口队列,我觉得其实"焦点"和窗口的Z序似乎没有太大关系,我曾经考虑过实现这种效果:即屏幕的顶层飘着一个窗口显示一些用户提示之类的东西,而实际接受用户键盘输入的是其下方的窗口.

5. 控件的Z序,我给控件定义了Z序,和根窗口的代码几乎一样,可以在实现中带来很多方便,例如呈现一个三维的场景并允许用户和其中的对象交互,此时具有Z序的控件很容易实现画家算法.

6. 鼠标消息分派,沿着Z序从上到下交给各个窗口直到消息被某个窗口标记为"consumed",则所有与该窗口同级的窗口都不再遍历,除非它是上一条鼠标消息的"consumer"或者设置了"mouse capture"标记.

还有一些没有从文档中找到线索 :

7. 对象间通信,我看到boost里面有一个signa/slot的实现,照猫画虎自己也做了一个简化的,不知EGUI如何处理?

8. 调试,为了完全控制键盘(例如检测大小写锁的按下),我把/dev/tty设置为原始方式,但如此一来就无法在控制台下运行GDB,我的解决办法是用SSH远程调试,不知EGUI如何考虑?

最后是一个小小的建议 :

9. 习惯上颜色深度的单位是bit,因此16位色的颜色深度应该是16而不是文档中的2,笔误? :D

asmcos 发表于 2006-10-11 00:16:31

关于Z序,在窗口提升的时候应该是必需的。

关于16位,我不知道我文档里那里写成了2,应该是2个字节=16位。
EGui代码使用2是为了方便计算。

以后的代码里16,8,24,32bits 画点画线都用单独的函数。
这样速度快。现在到画点函数里面判断颜色位,这样速度慢。


关于调试,我和你一样用的ssh,但是鼠标,键盘操作都必须使用本地键盘。
ssh客户端的使用不了。

非常欢迎大家一起讨论图形问题。

asmcos 发表于 2006-10-11 06:49:34

另外,你的窗口没有标题栏?那怎么拖动?

danath 发表于 2006-10-11 14:40:44

GUI的核心对拖动一无所知,而是完全留给客户端,在窗口响应鼠标消息的回调函数中这么写(伪代码):

if(LeftButtonPressed)
{
    Locate(X() + DetalX, Y() + DeltaY);
}

当然客户端代码愿意定义只有在光标落在窗口的特定区域才能拖动也可以。

asmcos 发表于 2006-10-11 16:28:58

像X server,一样由wm 提供窗口标题栏?

danath 发表于 2006-10-11 21:38:05

可以这么理解吧,不过可能没有X和WM分开得那么清晰。觉得有时候确实没有必要非给加一个标题栏。

其它的话题呢?比方说对象间通信?EGUI中按下一个按钮是如何产生相应动作的?

asmcos 发表于 2006-10-12 09:08:12

1.EGui 应用一直等待kernel的输入消息。阻塞睡眠状态。不消耗CPU资源。

2.当kernel获取按键后,按照鼠标所在坐标点的窗口进行消息分发,分发给应用。

3.应用获取分发到的消息后,立即唤醒,处理消息事件。

asmcos 发表于 2006-10-12 09:09:11

所以现在有点问题就是EGui每个窗口独立绘制鼠标的光标,
以后准备更改为root窗口绘制鼠标的光标。

danath 发表于 2006-10-12 13:09:36

假如某个应用得到鼠标消息后,判断应该产生一个按钮按下的消息,这个新的消息又是如何被传递和处理呢?

asmcos 发表于 2006-10-16 11:25:48

按钮消息,会寻找控件,请看widget/*.c

每个控件处理不同。

lilofreeman 发表于 2006-10-24 17:15:14

感觉EGUI代码绕的比较复杂, :P
页: [1]
查看完整版本: asmcos,能否探讨几个问题?