/* 获取程序ID */ LCUI_API LCUI_ID LCUIApp_GetSelfID( void ) { LCUI_App *app; app = LCUIApp_GetSelf(); if( app == NULL ) { return 0; } return (LCUI_ID)app->id; }
/* 注册终止函数,以在LCUI程序退出时调用 */ LCUI_API int LCUIApp_AtQuit( void (*callback_func)(void) ) { LCUI_App *app; app = LCUIApp_GetSelf(); if( app == NULL || callback_func == NULL ) { return -1; } app->func = callback_func; return 0; }
/* 退出程序 */ static int LCUIApp_Quit(void) { LCUI_App *app; app = LCUIApp_GetSelf(); if( !app ) { printf("%s (): %s", __FUNCTION__, APP_ERROR_UNRECORDED_APP); return -1; } LCUIAppList_Delete(app->id); /* 如果程序列表为空,就退出LCUI */ if (Queue_Empty(&LCUI_Sys.app_list)) { LCUI_Quit(); } return 0; }
/* * 功能:使用自定义方式添加程序任务 * 用法示例: * 在函数的各参数与队列中的函数及各参数不重复时,添加它 * AppTasks_CustomAdd(ADD_MODE_NOT_REPEAT | AND_ARG_F | AND_ARG_S, task); * 只要函数和参数1不重复则添加 * AppTasks_CustomAdd(ADD_MODE_NOT_REPEAT | AND_ARG_F, task); * 要函数不重复则添加 * AppTasks_CustomAdd(ADD_MODE_NOT_REPEAT, task); * 添加新的,不管是否有重复的 * AppTasks_CustomAdd(ADD_MODE_ADD_NEW, task); * 有相同函数则覆盖,没有则新增 * AppTasks_CustomAdd(ADD_MODE_REPLACE, task); * */ LCUI_API int AppTasks_CustomAdd( int mode, LCUI_Task *task ) { int ret; LCUI_App *app; if( task->id == (LCUI_ID)0 ) { app = LCUIApp_GetSelf(); } else { app = LCUIApp_Find( task->id ); } if( !app ) { return -1; } ret = Tasks_CustomAdd( &app->tasks, mode, task ); if( ret == 0 ) { LCUISleeper_BreakSleep( &app->mainloop_sleeper ); } return ret; }
/* 运行目标循环 */ LCUI_API int LCUI_MainLoop_Run( LCUI_MainLoop *loop ) { LCUI_App *app; int idle_time = 1; #ifdef LCUI_BUILD_IN_WIN32 MSG msg; #endif app = LCUIApp_GetSelf(); if( !app ) { printf("%s(): %s", __FUNCTION__, APP_ERROR_UNRECORDED_APP); return -1; } DEBUG_MSG("loop: %p, enter\n", loop); loop->running = TRUE; while( !loop->quit && LCUI_Sys.state == ACTIVE ) { if( LCUIApp_HaveTask(app) ) { idle_time = 1; LCUIApp_RunTask( app ); } else { LCUI_MSleep (idle_time); if (idle_time < MAX_APP_IDLE_TIME) { idle_time += 1; } } #ifdef LCUI_BUILD_IN_WIN32 if( PeekMessage( &msg, Win32_GetSelfHWND(), 0, 0, PM_REMOVE) ) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } #endif } loop->running = FALSE; DEBUG_MSG("loop: %p, exit\n", loop); return 0; }