/** 添加已被按下的按键 */ void LCUIKeyBoard_HitKey( int key_code ) { clock_t ct; key_state data, *data_ptr; LCUIMutex_Lock( &record_mutex ); ct = clock()*1000 / CLOCKS_PER_SEC; data_ptr = KeyStateRecord_FindData( key_code ); if( !data_ptr ) { data.key_code = key_code; data.interval_time = -1; data.hit_time = ct; data.state = LCUIKEYSTATE_PRESSED; LinkedList_AddDataCopy( &key_state_record, &data ); LCUIMutex_Unlock( &record_mutex ); return; } if( data_ptr->state == LCUIKEYSTATE_RELEASE ) { data_ptr->state = LCUIKEYSTATE_PRESSED; /* 记录与上次此键被按下时的时间间隔 */ data_ptr->interval_time = ct - data_ptr->hit_time; /* 记录本次此键被按下时的时间 */ data_ptr->hit_time = ct; } LCUIMutex_Unlock( &record_mutex ); }
/** * 功能:注册设备 * 说明:为指定设备添加处理函数 * */ int LCUIDevice_Add( LCUI_BOOL (*init)(void), LCUI_BOOL (*proc)(void), LCUI_BOOL (*exit)(void) ) { DeviceData device, *p; device.init = init; device.proc = proc; device.exit = exit; LCUIMutex_Lock( &list_mutex ); p = (DeviceData*)LinkedList_AddDataCopy( &dev_list, &device ); LCUIMutex_Unlock( &list_mutex ); if( !p ) { return -1; } if( device.init ) { device.init(); } return 0; }
/** 更新数据 */ void TextLayer_Update( LCUI_TextLayer* layer, LinkedList *rect_list ) { if( layer->task.update_bitmap ) { TextLayer_InvalidateAllRowRect( layer ); TextLayer_ReloadCharBitmap( layer ); TextLayer_InvalidateAllRowRect( layer ); layer->task.update_bitmap = FALSE; layer->task.redraw_all = TRUE; } if( layer->task.update_typeset ) { TextLayer_TextTypeset( layer, layer->task.typeset_start_row ); layer->task.update_typeset = FALSE; layer->task.typeset_start_row = 0; } /* 如果坐标偏移量有变化,记录各个文本行区域 */ if( layer->new_offset_x != layer->offset_x || layer->new_offset_y != layer->offset_y ) { TextLayer_InvalidateAllRowRect( layer ); layer->offset_x = layer->new_offset_x; layer->offset_y = layer->new_offset_y; TextLayer_InvalidateAllRowRect( layer ); layer->task.redraw_all = TRUE; } if( rect_list ) { int n; void *data_ptr; n = LinkedList_GetTotal( &layer->dirty_rect ); LinkedList_Goto( &layer->dirty_rect, 0 ); /* 转移脏矩形记录,供利用 */ while(n--) { data_ptr = LinkedList_Get( &layer->dirty_rect ); LinkedList_AddDataCopy( rect_list, data_ptr ); LinkedList_ToNext( &layer->dirty_rect ); } } }
/** 将事件投递给事件处理器,等待处理 */ int $(Post)( LCUI_EventBox box, const char *name, void *data, void (*destroy_data)(void*) ) { LCUI_Event event; LCUI_RBTreeNode *node; LCUI_EventSlot *slot; LinkedList *elist = &box->events[box->current]; if( !(node = RBTree_CustomSearch(&box->event_name, (const void*)name)) ) { return -1; } if( !(node = RBTree_Search(&box->event_slot, node->key)) ) { return -2; } slot = (LCUI_EventSlot*)node->data; event.id = slot->id; event.name =slot->name; event.data = data; event.destroy_data = destroy_data; LinkedList_AddDataCopy( elist, &event ); return 0; }