static void DeleteCSSParserContext( CSSParserContext *ctx_ptr ) { CSSParserContext ctx = *ctx_ptr; LinkedList_Clear( &ctx->selectors, (FuncPtr)Selector_Delete ); free( ctx->buffer ); free( ctx ); *ctx_ptr = NULL; }
void LinkedList_Free(wLinkedList* list) { if (list) { LinkedList_Clear(list); free(list); } }
/** 清空文本 */ void TextLayer_ClearText( LCUI_TextLayer layer ) { layer->length = 0; layer->insert_x = 0; layer->insert_y = 0; layer->width = 0; TextLayer_InvalidateRowsRect( layer, 0, -1 ); TextRowList_Destroy( &layer->rowlist ); LinkedList_Clear( &layer->style_cache, (FuncPtr)TextStyle_Destroy ); TextRowList_InsertNewRow( &layer->rowlist, 0 ); layer->task.redraw_all = TRUE; }
void LCUIWorker_Destroy( LCUI_Worker worker ) { if( worker->thread != 0 ) { LOG( "[worker] worker %u is stopping...\n", worker->thread ); LCUIMutex_Lock( &worker->mutex ); worker->active = FALSE; LCUICond_Signal( &worker->cond ); LCUIMutex_Unlock( &worker->mutex ); LCUIThread_Join( worker->thread, NULL ); LOG( "[worker] worker %u has stopped\n", worker->thread ); worker->thread = 0; } LCUIMutex_Destroy( &worker->mutex ); LCUICond_Destroy( &worker->cond ); LinkedList_Clear( &worker->tasks, OnDeleteTask ); free( worker ); }
/** 载入CSS代码块,用于实现CSS代码的分块载入 */ static int LCUI_LoadCSSBlock( CSSParserContext ctx, const char *str ) { size_t size = 0; LCUI_Selector s; LinkedListNode *node; ctx->ptr = str; for( ; *ctx->ptr && size < ctx->buffer_size; ++ctx->ptr, ++size ) { switch( ctx->target ) { case TARGET_SELECTOR: switch( *ctx->ptr ) { case '/': goto proc_comment; case '{': ctx->target = TARGET_KEY; ctx->css = StyleSheet(); case ',': ctx->buffer[ctx->pos] = 0; ctx->pos = 0; DEBUG_MSG("selector: %s\n", ctx->buffer); s = Selector( ctx->buffer ); if( !s ) { // 解析出错 ... break; } LinkedList_Append( &ctx->selectors, s ); break; default: ctx->buffer[ctx->pos++] = *ctx->ptr; break; } break; case TARGET_KEY: switch( *ctx->ptr ) { case '/': goto proc_comment; case ' ': case '\n': case '\r': case '\t': case ';': ctx->pos = 0; continue; case ':': break; case '}': ctx->target = TARGET_NONE; goto put_css; default: ctx->buffer[ctx->pos++] = *ctx->ptr; continue; } goto select_parser; case TARGET_VALUE: switch( *ctx->ptr ) { case '/': goto proc_comment; case '}': case ';': goto parse_value; case '\n': case '\r': case '\t': case ' ': if( ctx->pos == 0 ) { continue; } default: ctx->buffer[ctx->pos++] = *ctx->ptr; continue; } break; case TARGET_COMMENT: if( ctx->is_line_comment ) { if( *ctx->ptr == '\n' ) { ctx->target = ctx->target_bak; } break; } if( *ctx->ptr == '/' && *(ctx->ptr - 1) == '*' ) { ctx->target = ctx->target_bak; } break; case TARGET_NONE: default: switch( *ctx->ptr ) { case '/': goto proc_comment; case '\n': case '\t': case '\r': case ' ': case ',': case '{': case '\\': case '"': case '}': continue; default: break; } ctx->pos = 0; ctx->buffer[ctx->pos++] = *ctx->ptr; ctx->target = TARGET_SELECTOR; break; } continue; proc_comment: switch( *(ctx->ptr + 1) ) { case '/': ctx->is_line_comment = TRUE; break; case '*': ctx->is_line_comment = FALSE; break; default: ctx->buffer[ctx->pos++] = *ctx->ptr; continue; } if( ctx->target_bak != TARGET_COMMENT ) { ctx->target_bak = ctx->target; ctx->target = TARGET_COMMENT; } continue; put_css: DEBUG_MSG("put css\n"); /* 将记录的样式表添加至匹配到的选择器中 */ for( LinkedList_Each( node, &ctx->selectors ) ) { LCUI_PutStyleSheet( node->data, ctx->css, ctx->space ); } LinkedList_Clear( &ctx->selectors, (FuncPtr)Selector_Delete ); StyleSheet_Delete( ctx->css ); continue; select_parser: ctx->target = TARGET_VALUE; ctx->buffer[ctx->pos] = 0; ctx->pos = 0; ctx->parser = Dict_FetchValue( self.parsers, ctx->buffer ); DEBUG_MSG("select style: %s, parser: %p\n", ctx->buffer, ctx->parser); continue; parse_value: if( *ctx->ptr == ';' ) { ctx->target = TARGET_KEY; } if( !ctx->parser ) { continue; } ctx->buffer[ctx->pos] = 0; ctx->pos = 0; ctx->parser->parse( ctx->css, ctx->parser->key, ctx->buffer ); DEBUG_MSG("parse style value: %s, result: %d\n", ctx->buffer); if( *ctx->ptr == '}' ) { ctx->target = TARGET_NONE; goto put_css; } } return size; }
void LCUIWidget_ExitTask( void ) { LinkedList_Clear( &self.trash, NULL ); }
int freerds_message_server_queue_pack(rdsBackendConnector* connector) { RDS_RECT rect; int ChainedMode; REGION16 region; wLinkedList* list; RECTANGLE_16 rect16; RDS_MSG_COMMON* node; rdsConnection* connection; const RECTANGLE_16* extents; ChainedMode = 0; connection = connector->connection; list = connector->ServerList; region16_init(®ion); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { node = (RDS_MSG_COMMON*) LinkedList_Enumerator_Current(list); if ((!ChainedMode) && (node->msgFlags & RDS_MSG_FLAG_RECT)) { rect16.left = node->rect.x; rect16.top = node->rect.y; rect16.right = node->rect.x + node->rect.width; rect16.bottom = node->rect.y + node->rect.height; region16_union_rect(®ion, ®ion, &rect16); } else { MessageQueue_Post(connector->ServerQueue, (void*) connector, node->type, (void*) node, NULL); } } LinkedList_Clear(list); if (!ChainedMode) { extents = region16_extents(®ion); rect.x = extents->left; rect.y = extents->top; rect.width = extents->right - extents->left; rect.height = extents->bottom - extents->top; freerds_message_server_align_rect(connector, &rect); if (connector->framebuffer.fbAttached && (rect.width * rect.height)) { RDS_MSG_COMMON* msg; RDS_MSG_PAINT_RECT paintRect; paintRect.type = RDS_SERVER_PAINT_RECT; paintRect.nXSrc = 0; paintRect.nYSrc = 0; paintRect.bitmapData = NULL; paintRect.bitmapDataLength = 0; paintRect.framebuffer = &(connector->framebuffer); paintRect.fbSegmentId = connector->framebuffer.fbSegmentId; paintRect.nLeftRect = rect.x; paintRect.nTopRect = rect.y; paintRect.nWidth = rect.width; paintRect.nHeight = rect.height; msg = freerds_server_message_copy((RDS_MSG_COMMON*) &paintRect); MessageQueue_Post(connector->ServerQueue, (void*) connector, msg->type, (void*) msg, NULL); } } region16_uninit(®ion); return 0; }