• GTK+/DirectFB PC模拟运行环境


    GTK+/DirectFB PC模拟运行环境

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    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远程去控制它。为了方便,把它放到虚拟机里去运行是不错的选择。

    ~~end~~
     
  • 相关阅读:
    background-position-x和background-position-y的兼容性问题
    用SVGDeveloper制作svg地图
    实现绝对定位元素水平垂直居中的两种方法
    用-webkit-box-reflect制作倒影
    解决ul的li横向排列换行的问题
    用echarts.js制作中国地图,点击对应的省市链接到指定页面
    css3制作扇形菜单
    IE7中a标签包含img,点击img,链接失效的bug
    ie7中position:fixed定位后导致margin:0 auto;无效
    背景图片铺满全屏的方法
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167661.html
Copyright © 2020-2023  润新知