int main(void) { struct event_listener server_listener; struct egui_uds server_uds; if(0 != uds_init(&server_uds, SOCK_STREAM, SERVER_PATH, PEER_ROLE_SERVER)) { EGUI_PRINT_ERROR("Failed to init server uds"); return -1; } event_listener_init(&server_listener); event_listener_add_read_event(&server_listener, &server_uds, &server_listener, server_accept_handler, NULL); if(0 != event_listener_exec(&server_listener)) { EGUI_PRINT_ERROR("failed to execute event_listener"); return -1; } event_listener_exit(&server_listener); if(0 != uds_exit(&server_uds)) { EGUI_PRINT_ERROR("failed to exit server uds"); return -1; } return 0; }
/** * @brief 初始化通信模块 * * @param server_path 配置项 窗口管理器的socket路径 * * @return 成功返回0 否则返回-1 **/ static si_t comm_init(char* server_path) { int i = 0; /** * 初始化窗口管理器的通信句柄 用来接受用户应用程序的连接请求 **/ if(0 != uds_init(&global_wm.uds, SOCK_STREAM, server_path, PEER_ROLE_SERVER)) { EGUI_PRINT_ERROR("Failed to init server uds"); return -1; } /** * 初始化监听事件的event_listener **/ event_listener_init(&global_wm.server_listener); /** * 添加event_listener监听来自窗口管理器通信句柄的读请求 若有读请求发生则调用window_manager_accept_handler处理 * 析构函数为简单关闭通信句柄 **/ event_listener_add_read_event(&global_wm.server_listener, &global_wm.uds, NULL, window_manager_accept_handler, NULL); /** * 设置对来自客户端的请求处理函数 * * 当客户端建立连接后 在window_manager_accept_handler中 将调用server_lib的接口添加一个客户端 * server_lib添加客户端的具体实现是 将这个客户端句柄添加到event_listener里面监听读请求 并使用server_lib内部的事件处理函数 * server_lib内部的事件处理函数 将来自客户端的绘图请求直接调用绘图模块的函数处理 然后将函数返回值发回回应包 * 而来自客户端需要窗口管理器处理的窗口/应用程序管理类的请求 则通过窗口管理器在window_manger_set_request_handler里面设置的处理函数处理 **/ window_manager_set_request_handler(); /** * 设置对来自输入设备的请求处理函数 * 事件处理函数为window_manager_input_handler 析构函数为input_exit对应的函数 **/ for(i = 0; i != vector_size(&global_wm.input_device_vector); ++ i) { struct input_device* device_ptr = vector_at(&global_wm.input_device_vector, i); event_listener_add_read_event(&global_wm.server_listener, &device_ptr->uds, device_ptr, window_manager_input_handler, window_manager_input_destructor); } return 0; }
int main(void) { struct event_listener client_listener; struct egui_uds client_uds; struct egui_uds stdin_uds; event_listener_init(&client_listener); /** * 初始化客户端通信句柄并将其对应的回调函数设置为server_message_handler **/ if(0 != uds_init(&client_uds, SOCK_STREAM, SERVER_PATH, PEER_ROLE_CLIENT)) { EGUI_PRINT_ERROR("Failed to init server uds"); return -1; } event_listener_add_read_event(&client_listener, &client_uds, NULL, server_message_handler, NULL); /** * 初始化标准输入通信句柄并将对应的回调函数设置为command_handler **/ uds_init_from_naked_socket(&stdin_uds, STDIN_FILENO); event_listener_add_read_event(&client_listener, &stdin_uds, &client_uds, command_handler, NULL); /** 打印帮助信息 **/ EGUI_PRINT_INFO(help_str); if(0 != event_listener_exec(&client_listener)) { EGUI_PRINT_ERROR("failed to execute event_listener"); return -1; } event_listener_exit(&client_listener); return 0; }
si_t application_init(si_t video_access_mode, si_t application_type, char* name) { /** * 加载配置项 **/ if(0 != application_load_config()) { EGUI_PRINT_ERROR("failed to load config."); return -1; } /** * 初始化客户端通信句柄 **/ if(0 != uds_init(&global_application.uds, SOCK_STREAM, global_application.server_path, PEER_ROLE_CLIENT)) { EGUI_PRINT_ERROR("Failed to init client uds"); return -1; } /** * 初始化消息队列 **/ queue_init(&global_application.message_queue); client_lib_init(&global_application.uds, &global_application.message_queue); /** * 初始化event_listener **/ event_listener_init(&global_application.app_event_listener); global_application.exec_flag = 0; /** * init focus list **/ list_init(&(global_application.focus_list)); /* 初始化向量 */ vector_init(&(global_application.window_vector)); /** * 应用程序名称 **/ global_application.name = malloc(strlen(name) + 1); if(NULL == global_application.name) { EGUI_PRINT_SYS_ERROR("failed to malloc for application name %s. malloc()", name); return -1; } strncpy(global_application.name, name, strlen(name) + 1); global_application.application_type = application_type; if(0 != register_application(video_access_mode, application_type, name)) { EGUI_PRINT_ERROR("failed to register application %s.", name); return -1; } global_application.focus = NULL; global_application.main_window = NULL; global_application.desktop_ptr = NULL; global_application.desktop_msg_handler = NULL; term_init(); return 0; }