extern si_t send_window_activate_message(struct egui_uds* uds_ptr, union message* msg, si_t window_descripter) { union message msg_to_be_sent; copy_message(msg, &msg_to_be_sent); message_set_window_activate(&msg_to_be_sent, window_descripter); return comm_send_message(uds_ptr, &msg_to_be_sent); }
/** * 请求处理函数;这个函数是comm_recv_request_and_send_respond()里面的回调函数 **/ si_t request_handler(addr_t body, si_t detail_type, union respond* respond_ptr, addr_t arg) { char* str = NULL; si_t ret = 0; si_t fd = 0; union message msg; struct queue* message_queue_ptr = (struct queue*)arg; switch(detail_type) { /** * 测试普通情况:发送的请求实质是客户端需要远程调用一个函数 **/ case REQUEST_TYPE_DRAW_LINE: ret = request_call_by_draw_line(body, fake_engine_draw_line); respond_set_normal(respond_ptr, RESPOND_TYPE_DRAW_LINE, ret); EGUI_PRINT_INFO("recieved draw line request!"); break; /** * 测试特殊情况:发送请求后产生消息,消息先放到队列中,稍后回处理 **/ case REQUEST_TYPE_REGISTER_WINDOW: /** 读取请求包中的窗口标题和父窗口的句柄 **/ request_get_register_window(body, &fd, &str, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); /** 返回的包是新窗口句柄,此处假设为父窗口句柄+1 **/ ret = fd + 1; respond_set_normal(respond_ptr, RESPOND_TYPE_REGISTER_WINDOW, ret); /** 此外,还会发送给客户端一个激活新窗口的消息 **/ message_set_window_activate(&msg, ret); queue_push(message_queue_ptr, &msg, sizeof(msg)); EGUI_PRINT_INFO("recieved register window request! title = %s", str); break; /** * 测试特殊情况:发送请求要求服务器退出循环 **/ case REQUEST_TYPE_WINDOW_MANAGER_QUIT: ret = EXIT_NUMBER; respond_set_normal(respond_ptr, RESPOND_TYPE_WINDOW_MANAGER_QUIT, 0); EGUI_PRINT_INFO("recived exit request! SERVER EXIT!"); break; default: break; } return ret; }