desktop window manager
#######################################################################################################
http://www.cppblog.com/windcsn/archive/2008/07/16/56346.html
桌面组合
到目前位置Vista最大的改变就是引进桌面组合。这成为一切都由DWM执行的基础。桌面组合的主要特点是:应用程序取得屏幕上像素的方法已经本质的改变。
在Windows的哥哥版本,直到XP,程序通过窗口来paint他们的可见区域,并且它们直接paint到buffer,然后现实到显卡。有了Vista,程序通过窗口来paint它们的整个表面到一个离屏(offscreen)的表面(可能叫做位图,缓冲区或纹理),并且DWM处理所有这些offscreen表面,并且组合在一起放到onscreen缓冲区。
再次阅读前面一段。从Windows系统显示远景来看,这根据实现的特性的深奥的提示,并且也能获得质量。一些例子:
访问窗口
现在程序是render到offscreen,这些offscreen表示能用在其他地方。这就是Flip,Flip3D和小图片特性怎么样工作的,并且其他的特性也能利用这个点。
不要在窗口操作中将背景程序牵涉进来
当窗口移动通过XP或以前的屏幕时,背景窗口部分仅仅在背景窗口苏醒并且开始paint的时候可见(相应WM_PAINT消息,其收到顶级窗口的移动消息)。对于非响应背景程序,或即使是响应的程序但正好是page out的,也会导致很差的用户体验。
考虑移动paint程序窗口通过一个IE窗口。在XP或之前的OS中,下面的症状是不幸的但也是非常普通的:两个case中下面的IE程序不能足够快的repaint它自己来避免由移动Paint窗口留下的尾巴。
在Vista下,就不是这样的情况了,下面的窗口不会收到WM_PAINT消息,并且不会被请求要render,由于它们的内容已经在DWM中,并且用来组合这个screen的。
Tear free体验:
假定,DWMrender到screen,DirextX提供的典型地用在游戏上最新技术能用来整个桌面体验。特别低,图形卡flip前缓冲区能力在屏幕上移动,增加了用户体验的平滑行和质量。
高分辨率的支持:
主要的程序输出都是对监视器分辨率(DPI)不可知的。随着高分辨率监视器的增加(120 DPI,144DPI),程序出现在非常小的物理空间会带来比较坏的体验。因为DWM有访问程序窗口的offscreen,DWM是唯一缩放这个DPI无知程序的地方,将其最终展现给用户,提高高分辨率监视器上的体验。
将来可能的topic
桌面组合是DWM提供的最基础的方面,但我们已经仅仅简单说了一下表面的主题,那里仍然有许多关于探索和完全理解我们在Vista中正在做什么的topic。这里错略列了几个topic:
1.DWM使用 DirextX, GPU和硬件加速
2.Vista显示驱动模型对DWM的重要性和影响
3.重定向GDI和DirextX程序
4.怎么样揭示正在使用的WPF概念和技术
5.DWM怎么样paint窗口边界和其他非客户区
6.DWM远程,显著和访问性
7.高DPI支持
8.公共的探索DWM API
9.rener和可视性的优化
10.DWM的内存使用
其他DWM相关的源信息
最技术的理解讨论关于DWM的WEB是可能的,确实有其他地方那个有相关的信息和新闻:
1.Kam VedBrat维护的log,常常给DWM内部的描述,特别是DWM的特性和Vista Aero。
2.microsoft.public.windows.developer.winfx.aero新组讨论所有Aero相关的东西
#######################################################################################################
http://ihgs.blog.163.com/blog/static/19411710220101163331889/
原理
当窗口管理器开始运作时,X服务器和客户端之间的互动,会重新导向到窗口管理器。每当要显示一个新窗口时,这个请求便会被重新导向到窗口管理器,它会决定窗口的初始位置。此外,大部分较新的窗口管理器会改变窗口的亲属关系,通常会在窗口顶部加上标题列,并在窗口周围加上装饰性的框架。这两个部分皆由窗口管理器来控制,而不是其它程式。因此,当使用者点击或拖曳那些元件时,窗口管理器会进行适当的动作(如移动或改变窗口的大小)。
窗口管理器也负责处理图示,图示并不存在于X Window核心协议的层次中。当使用者将窗口图示化时,窗口管理器会取消窗口的映射(使其不可见),并完成适当的动作,将窗口改显示成图示。某些窗口管理器并不支援图示功能。
窗口管理器主要的目标,就如同其名,是用来管理窗口的。许多窗口管理器提供附加的功能,如处理鼠标在根窗口上的点击,呈现出窗格以及其它的视觉化元件,处理按键(例如 Alt-F4 可关闭窗口),判定哪一个应用程式在启动时执行等等。
#######################################################################################################
简单的说,X Window system分成client端和server端,server端负责监听鼠标键盘,绘制窗口,而client端则是GUI程序,负责接收鼠标键盘事件,并处理这些事件。Server和client是可以完全分离的,比如说你在远程机器上开个GUI(client)可以在本地机器(server)上去显示和操纵。
#######################################################################################################
http://www.ibm.com/developerworks/cn/linux/embed/minigui/minigui-4/
5.2 GAL 和 IAL
在 MiniGUI 0.3.xx 的开发中,我们引入了图形和输入抽象层(Graphics and Input Abstract Layer,GAL 和 IAL)的概念。抽象层的概念类似 Linux 内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序结构。利用 GAL 和 IAL,MiniGUI 可以在许多图形引擎上运行,比如 SVGALib 和 LibGGI,并且可以非常方便地将 MiniGUI 移植到其他 POSIX 系统上,只需要根据我们的抽象层接口实现新的图形引擎即可。目前,我们已经编写了基于 SVGALib 和 LibGGI 的图形引擎。利用 LibGGI, MiniGUI 应用程序可以运行在 X Window 上,将大大方便应用程序的调试。我们目前正在进行 MiniGUI 私有图形引擎的设计开发。通过 MiniGUI 的私有图形引擎,我们可以最大程度地针对窗口系统对图形引擎进行优化,最终提高系统的图形性能和效率。
GAL 和 IAL 的结构是一样的,我们这里只拿 GAL 作为实例说明面向对象技术的运用,参见图 4。
系统维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针。系统利用一个指针保存当前使用的图形引擎。一般而言,系统中至少有两个图形引擎,一个是“哑”图形引擎,不进行任何实际的图形输出;一个是实际要使用的图形引擎,比如 LibGGI 或者 SVGALib。每个图形引擎的数据结构定义了该图形引擎的一些信息,比如标识符、属性等,更重要的是,它实现了 GAL 所定义的各个接口,包括初始化和终止、图形上下文管理、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等等。
#######################################################################################################
http://www.ibm.com/developerworks/cn/linux/embed/minigui/minigui-5/
3 窗口剪切算法
有了窗口 Z 序,我们就可以计算每个窗口的剪切域。我们把因为窗口 Z 序而产生的剪切域称为“全局剪切域”,这是相对于窗口自身定义的剪切域而言的,我们把后者称为“局部剪切域”。窗口中的所有输出,首先要受到全局剪切域的影响,其次受到局部剪切域的影响。我们在这里重点讲解窗口的全局剪切域的生成和维护。
3.1 全局剪切域的生成和维护
#######################################################################################################
4.1 MiniGUI的软件架构
为什么 MiniGUI 能够在如此众多的嵌入式操作系统上运行?这是因为 MiniGUI 具有良好的软件架构,通过抽象层将 MiniGUI上层和底层操作系统隔离开来。如图4.1 所示,基于 MiniGUI 的应用程序一般通过 ISO C 库、操作系统和驱动程序接口以及MiniGUI 自身提供的 API 来实现自己的功能;MiniGUI 中的抽象层将特定操作系统及底层硬件的细节隐藏起来,因而上层应用程序无需关心底层的硬件平台输出和输入设备。另外,MiniGUI 特有的运行模式概念,也为跨操作系统的支持提供了便利。
图 4.1MiniGUI 的软件架构图
如上图所示,从底至上,MiniGUI 由如下几个模块组成:
- 图形抽象层(Graphics Abastract Layer,GAL)。图形抽象层将来自不同操作系统或设备的图形接口进行抽象,为MiniGUI 上层提供统一的图形接口。在图形抽象层内,包含有针对 Linux FB 设备、eCos LCD 设备等的软件组成部分。这些软件组成部分通过调用底层设备的接口来实现具体的图形抽象层操作,如打开设备、设置分辨率及显示模式、关闭设备等。我们将这些用于适配图形抽象层接口的软件组成部分称为“引擎(engine)”,其概念和操作系统中的设备驱动程序类似。
- 输入抽象层(Input Abstract Layer,IAL)。和 GAL 类似,输入抽象层将 MiniGUI 涉及的所有输入设备,如键盘(keyboard)、小键盘(keypad)、鼠标(mouse)、触摸屏(touch screen)等抽象了出来,为上层提供一致的接口。要支持不同的键盘、触摸屏或者鼠标接口,则通过为 IAL 编写不同的输入引擎实现。MiniGUI 通过 IAL 及其输入引擎,提供对 Linux 控制台(键盘及鼠标)、触摸屏、遥控器、小键盘等输入设备的支持。
- 图形设备接口(Graphics Device Interfaces,GDI)。该模块基于图形抽象层为上层应用程序提供图形相关的接口,如绘制曲线、输出文本、填充矩形等等。图形设备接口中含包含其他比较独立的子模块,如字体字符集(font and charset)支持、图像(image)支持等。
- 消息处理模块(Messaging Module)。该模块在输入抽象层基础上,实现了 MiniGUI 的消息处理机制,为上层提供了完备的消息管理接口。众所周知,几乎所有的GUI 系统本质上都是事件驱动的,系统自身的运行,以及GUI 应用程序的运行,都依赖于消息处理模块。
- 多窗口处理模块(Windowing Module)和控件(Control 或 Widget)。基于图形设备接口和消息处理模块,MiniGUI 实现了多窗口处理模块。该模块为上层应用程序提供了创建主窗口和控件的基本接口,并负责维护控件类。控件类是用来实现控件代码重用的重要概念,利用控件类(control class),我们可以创建属于某个控件类的多个控件实例(instance),从而让这些控件实例使用同一个控件类的代码,这样,我们就实现了类似 C++ 那样的类和实例概念,从而可以最大程度上重复利用已有代码,并提高软件的可维护性。MiniGUI 的控件模块实现了常见的 GUI 控件,如静态框、按钮、编辑框、列表框、下拉框等等。
- 外观支持(Look and Feel)。这个模块是 MiniGUI V3.0 提供给上层应用程序的接口,可用来定制 MiniGUI 窗口、控件的绘制。在 MiniGUI V3.0 之前的版本中,对主窗口和控件的定制能力,还没有被抽离出来形成独立的模块,但我们仍然可以通过配置选项让 MiniGUI 的主窗口、控件具有三种显示风格,分别是:类似 PC 的三维风格(PC3D)、平板风格(FLAT)、流行风格(FASHION)。在 MiniGUI 3.0 中,主窗口和控件的外观可完全由应用程序自行定制,在创建主窗口或者控件时,指定外观渲染器(renderer)的名称,就可以让主窗口或者控件具有各自不同的外观。
以上模块组成了 MiniGUI 的核心(core);在 MiniGUI 接口之上,我们还为应用程序提供若干组件:mGi mGp mG3d mGUtils mGPlus,这些组件分别为应用程序提供某些特殊的功能特性。我们将在后面详细介绍这些组件
#######################################################################################################
窗口管理器的主要功能是:移动窗口,改变窗口大小,图标化(最小化)窗口,改变窗口层叠顺序……
#######################################################################################################
MiniGUi 3.0 鼠标消息流程分析+添加滑动滚动消息
http://gaohtao.blog.163.com/blog/static/58241823201392293752672/
识别滑动事件: 鼠标弹起,发出滑动消息,要求xy移动20像素点,参数是滑动方向
滚动事件: 鼠标按下移动,间隔100ms就发出一次消息,参数是滚动方向、速度
此处在按下和弹起之前强制发出MSG_MOUSEMOVE ,这是毫无根据的,应当屏蔽
#######################################################################################################
http://blog.csdn.net/doon/article/category/950124
#######################################################################################################
基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南
#######################################################################################################
#######################################################################################################