科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件GTK+/DirectFB PC模拟运行环境

GTK+/DirectFB PC模拟运行环境

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

GTK+/DirectFB不但可以运行在frambebuffer上,而且可以运行在其它GUI之上,比如像SDL和X11等等。

作者:absurd 来源:CSDN 2008年2月10日

关键字: 运行环境 模拟 DirectFB PC GTK+ Windows

  • 评论
  • 分享微博
  • 分享邮件
GTK+/DirectFB不但可以运行在frambebuffer上,而且可以运行在其它GUI之上,比如像SDL和X11等等,因此在PC上建立模拟运行环境是非常简单的。不过有一个小小麻烦一直困扰着我们,直到最近才解决这个问题,这里做个笔记供大家参考。

基于SDL/X11等其它GUI

这个很简单,只要修改一下DirectFB的配置/etc/directfbrc即可(也可以修改当前用户的配置文件)。如:
system=sdl
mode=240x320
wm=unique

这里的system=sdl指定以SDL作为显示后端,SDL通常是运行在X11之上的,所以要注意设置DISPLAY环境变量。mode=240x320指明分辨率为240像素宽,320像素高。wm=unique指定窗口管理器为unique。

基于framebuffer

如果前面的方式能够正常工作,那就没有必要使用基于framebuffer方式了。但不幸的是前面的方式在多进程(基于fusion)时,非常容易死锁,这主要是因为调用fusion_call_execute更新屏幕引起的。这个问题在最新版本里,似乎也没有解决,我看了一下,要解决它也确实很麻烦。

基于framebuffer是唯一不会死锁的方式,所以在多进程运行时使用基于framebuffer的方式是比较明智的。但遗憾的是,PC上的framebuffer的分辨率一般在都640x480及以上大小(可以参考kernel中的文档Documentation/fb/vesafb.txt)。看了网上一些文档,也做了一些尝试,但没有成功的把分辨率设置得更低。

后来修改了一下DirectFB,让它把窗口显示到指定区域,这样虽然framebuffer的分辨率是比较大的,但是屏幕上的效果是可以是任意分辨率的。主要修改如下:

1.修改layer_context.c:dfb_layer_context_get_configuration,返回配置文件中指定的分辨率,而不是实际的分辨率。因为gdk_screen_width/gdk_screen_height调用该函数获得屏幕大小,修改之后,GDK认为屏幕大小是配置文件中指定的值,而不是实际的framebuffer的大小。

2.修改窗口管理器的wm_resize_stack函数(也可以修改调用的地方),使用配置文件中指定的分辨率,而不是实际的分辨率。这样窗口管理器可以据此约束窗口的显示范围(与窗口管理器的实现有关)。

测试了一下,发现基于framebuffer的PC版本稳定多了,再也没有出现过那种死锁现象,分辨率也可以设置为任意大小。

不过要注意的是,基于framebuffer的DirectFB独占了显示设备,你不能运行其它X11程序,也不能打开终端,只能通过SSH远程去控制它。为了方便,把它放到虚拟机里去运行是不错的选择。

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章