Directfb視窗管理分析之初始化

2021-06-02 09:50:00 字數 4463 閱讀 2640

1)初始化:

dfb_wm_core_initialize( coredfb         *core,

dfbwmcore       *data,

dfbwmcoreshared *shared )

%%%b  /* %%%b表示注釋開始,%%%e結束/

由dfb_core_part_initialize呼叫

if (core_part->size_local)

local = d_calloc( 1, core_part->size_local );//本地資料system mem

if (core_part->size_shared)

shared = shcalloc( pool, 1, core_part->size_shared );//共享資料shared mem

ret = core_part->initialize( core, local, shared );

其中:/* allocate local core structure. */

core 是dfb_core_create( coredfb **ret_core )中的

core = d_calloc( 1, sizeof(coredfb) );

pool是dfb_core_arena_initialize函式中建立的pool

ret = fusion_shm_pool_create( core->world, "directfb main pool", 0x400000,

fusion_config->debugshm, &pool ); */

/* allocate shared structure in the new pool. */

shared = shcalloc( pool, 1, sizeof(coredfbshared) );

if (!shared) {

fusion_shm_pool_destroy( core->world, pool );

return d_ooshm();

core->shared = shared;

core->master = true;

shared->shmpool = pool;

需要注意下巨集:dfb_window_manager( default )

%%%e

dfb_wm_core_initialize初始化過程:

%%%  給wm的各個指標賦值

data->core   = core;

data->shared = shared;

wm_local  = data;   /* fixme */

wm_shared = shared; /* fixme */

%%%  wm_shared->shmpool指向pool

wm_shared->shmpool = dfb_core_shmpool( core );  

%%%b  

載入libdirectfbwm_default.so  (分為:default 和 unique,預設為default)

%%%e

/* load the module. */

ret = load_module( dfb_config->wm );

%%%呼叫default.c中的函式wm_get_info

/* query module information. */

wm_local->funcs->getwminfo( &wm_shared->info );

/* store module name in shared memory. */

wm_shared->name = shstrdup( wm_shared->shmpool, wm_local->module->name );

if (!wm_shared->name) {

d_ooshm();

goto error;

/* allocate shared window manager data. */

if (wm_shared->info.wm_shared_size) {

wm_shared->data = shcalloc( wm_shared->shmpool, 1, wm_shared->info.wm_shared_size );

if (!wm_shared->data) {

d_ooshm();

goto error;

ret = dfb_nosystemmemory;

/* allocate local window manager data. */

if (wm_shared->info.wm_data_size) {

wm_local->data = d_calloc( 1, wm_shared->info.wm_data_size );

if (!wm_local->data) {

d_oom();

goto error;

%%% 呼叫default中的初始化函式 即 default.c中的wm_initialize

/* initialize window manager. */

ret = wm_local->funcs->initialize( core, wm_local->data, wm_shared->data );

if (ret) {

d_derror( ret, "directfb/core/wm: could not initialize window manager!/n" );

goto error;

d_magic_set( data, dfbwmcore );

d_magic_set( shared, dfbwmcoreshared );

return dfb_ok;

dfbresult

dfb_wm_init_stack( corewindowstack *stack )

dfbresult

idirectfb_construct( idirectfb *thiz, coredfb *core )

-》dfb_layer_get_primary_context-》dfb_layer_create_context-》dfb_layer_context_init-》

dfb_windowstack_create-》dfb_wm_init_stack

%%%b

corelayercontext *

dfb_core_create_layer_context( coredfb *core )

coredfbshared *shared;

d_assume( core != null );

if (!core)

core = core_dfb;

d_magic_assert( core, coredfb );

shared = core->shared;

d_magic_assert( shared, coredfbshared );

d_assert( shared->layer_context_pool != null );

return (corelayercontext*) fusion_object_create( shared->layer_context_pool, core->world );

static dfbresult

dfb_core_initialize( coredfb *core )

shared->layer_context_pool = dfb_layer_context_pool_create( core->world );

shared->layer_region_pool  = dfb_layer_region_pool_create( core->world );

shared->palette_pool       = dfb_palette_pool_create( core->world );

shared->su***ce_pool       = dfb_su***ce_pool_create( core->world );

shared->window_pool        = dfb_window_pool_create( core->world );

corewindowstack*

dfb_windowstack_create( corelayercontext *context )

/* allocate window stack data (completely shared) */

stack = (corewindowstack*) shcalloc( context->shmpool, 1, sizeof(corewindowstack) );

if (!stack) {

d_ooshm();

return null;

stack->shmpool = context->shmpool;

%%%e

#define max_update_regions    8

DirectFB 原始碼解讀之雙快取實現

及作者郵箱 wyw1976 gmail.com 雙快取是畫圖時乙個常用的技術,它的基本原理是在其中乙個快取中作圖,完成後提交顯示,同時在另一塊快取中繼續作圖,這樣兩塊快取交替畫圖 顯示,實現了兩者的同步進行,提高了效率。在directfb中,乙個快取實際就是一塊記憶體。dfb支援兩種快取分配方式 1...

Android GWES之視窗管理之基本構架原理

android 的視窗管理是 c s模式的。android 中的window 是表示top level 等頂級視窗的概念。decorview 是window 的top level view 這個view 我稱之為主 view decorview 會預設的 attach 到activity 的主視窗中...

Qt之布局管理 停靠視窗

qdockwidget類繼承與qwidget類,用於停靠視窗的管理。在主視窗中,先設定中心控制項,然後例項化qdockwidget物件,通過setfeatures 設定停靠視窗的窗體特性,通過 setallowedareas 設定窗體可停靠的區域。具體如下 voidsetfeatures dockw...