...
在窗口管理器中启用了Compositor扩展,Composite扩展允许窗口管理器在所有窗口创建和显示的过程中重定向窗口输出内容。FDE-X11使用了这三个API RedirectSubwindows
,NameWindowPixmap
和GetWindowPixmap
,通过RedirectSubwindows
调用将一个窗口树中的所有窗口渲染重定向到内部存储off-screen storage 。重定向的时候可以指定让X 自动更新窗口的内容到屏幕上或者由混成器手动更新,通过NameWindowPixmap
取得某个窗口的内部存储,再通过GetWindowPixmap
最终拿到这个窗口的图像buffer。合成器实现窗口特效的原理也基于此。
这样就可以将每个窗口的图像buffer分享出来,转到Android处理绘制,而不再是只绘制整个Xserver的合成后的图像buffer。这样就可以将每个窗口的图像buffer分离出来,转到Android处理绘制,而不再是只绘制整个Xserver的合成后的图像buffer。
Activity或Dialog
在目前的FDE-X11方案中,主要还是使用Activity做为与Linux一一对应的窗口。在Android的窗口系统中,APP窗口所处理的层次被限定在一个层级范围,只有在这个层级范围的窗口才会与其他APP的窗口交互行为相同,目前可选的Android组件就只有Activity和Dialog了。作用是创建SurfaceView显示输出图像,接收Android输入事件发送给Xserver。在FDE使用的Android freeform模式下,表现大致等同于Linux桌面,在理论上甚至可以做到完全一致。
...
X窗口除了图像buffer,本身的元属性和扩展属性也非常多,最基本的比如尺寸、坐标、层级、支持的操作等等。就是要Android的窗口特性要匹配X窗口的特性,在Linux上可以怎么操作窗口,在FDE上就可以怎么操作窗口。并且两端窗口的属性状态都是实时匹配的,比如在Android中手动调整了窗口大小,窗口管理器就执行ConfigureWindow同步更新X窗口大小,如果Linux程序调整了窗口大小,Android中就通过ActivitiyTaskManagerService来resizeTask。
Android和Linux剪贴板同步
在上一个使用VNC原理的融合方案中,需要将Android输入法产生的字符传到VNCServer再发送到Linux输入法,而这个方案中Xservr本身就有这样的接口,可以直接发送字符到Xserver。剪贴板的支持则是将Android的ClipBoardManager和Xserver和Selection相关协议对接起来就可以实现。在FDE在上一个使用VNC原理的融合方案中,需要将Android输入法产生的字符传到VNCServer再发送到Linux输入法,而这个方案中Xservr本身就有这样的接口,可以直接发送字符到Xserver。剪贴板的支持则是将Android的ClipBoardManager和Xserver的Selection相关协议对接起来就可以实现。在FDE-X11中,采用的方法是新建一个Window做为剪贴板管理者,实时接收和发送剪贴板内容,并且将这个内容与Android端同步,即实现了两端使用的是同一个剪贴板的效果。
...