/** 将 widget 与 sruface 进行绑定 */ static void LCUIDisplay_BindSurface( LCUI_Widget widget ) { LCUI_Rect *p_rect; SurfaceRecord *p_sr; if( LCUIDisplay_GetBindSurface(widget) ) { return; } p_sr = NEW( SurfaceRecord, 1 ); p_sr->widget = widget; p_sr->surface = Surface_New(); Surface_SetCaptionW( p_sr->surface, widget->title ); p_rect = &widget->box.graph; if( widget->style->sheet[key_top].is_valid && widget->style->sheet[key_left].is_valid ) { Surface_Move( p_sr->surface, p_rect->x, p_rect->y ); } Surface_Resize( p_sr->surface, p_rect->w, p_rect->h ); if( widget->computed_style.visible ) { Surface_Show( p_sr->surface ); } else { Surface_Hide( p_sr->surface ); } Widget_InvalidateArea( widget, NULL, SV_GRAPH_BOX ); LinkedList_Append( &display.surfaces, p_sr ); }
/** 将 widget 与 sruface 进行绑定 */ static void LCUIDisplay_BindSurface( LCUI_Widget widget ) { SurfaceRecord *p_sr; LCUI_Rect *p_rect; if( LCUIDisplay_GetBindSurface(widget) ) { return; } p_sr = (SurfaceRecord*)LinkedList_Alloc( &display.surfaces ); p_sr->widget = widget; /** * 初次调用 Surface_New() 耗时较长, 所以先为 p_sr->surface 设置初 * 始值,避免在 Surface_New() 返回前被当成正常指针使用。 */ p_sr->surface = NULL; p_sr->surface = Surface_New(); Surface_SetCaptionW( p_sr->surface, widget->title ); p_rect = &widget->base.box.graph; Surface_Move( p_sr->surface, p_rect->x, p_rect->y ); Surface_Resize( p_sr->surface, p_rect->w, p_rect->h ); if( widget->style.visible ) { Surface_Show( p_sr->surface ); } else { Surface_Hide( p_sr->surface ); } Widget_InvalidateArea( widget, NULL, SV_GRAPH_BOX ); }
/** 响应顶级部件的各种事件 */ static void OnTopLevelWidgetEvent( LCUI_Widget w, LCUI_WidgetEvent *e, void *arg ) { int e_type = *((int*)&arg); LCUI_Surface surface; LCUI_Rect *p_rect; DEBUG_MSG("tip, e_type = %d\n", e_type); surface = LCUIDisplay_GetBindSurface( e->target ); if( display.mode == LDM_SEAMLESS ) { if( !surface && e_type != WET_ADD ) { return; } } else if ( e->target == LCUIRootWidget ) { if( !surface && e_type != WET_ADD ) { return; } } else { return; } p_rect = &e->target->base.box.graph; switch( e_type ) { case WET_ADD: LCUIDisplay_BindSurface( e->target ); break; case WET_REMOVE: case WET_DESTROY: LCUIDisplay_UnbindSurface( e->target ); break; case WET_SHOW: Surface_Show( surface ); break; case WET_HIDE: Surface_Hide( surface ); break; case WET_TITLE: //_DEBUG_MSG("%S\n", e->target->title ); Surface_SetCaptionW( surface, e->target->title ); break; case WET_RESIZE: DEBUG_MSG( "resize, w: %d, h: %d\n", p_rect->w, p_rect->h ); Surface_Resize( surface, p_rect->w, p_rect->h ); Widget_InvalidateArea( w, NULL, SV_GRAPH_BOX ); if( w == LCUIRootWidget && display.mode != LDM_SEAMLESS ) { LCUIDisplay_ExecResize( p_rect->w, p_rect->h ); } break; case WET_MOVE: DEBUG_MSG( "x: %d, y: %d\n", p_rect->left, p_rect->top ); Surface_Move( surface, p_rect->left, p_rect->top ); break; default: break; } }