void* x11_shadow_subsystem_thread(x11ShadowSubsystem* subsystem) { int fps; XEvent xevent; DWORD status; DWORD nCount; UINT64 cTime; DWORD dwTimeout; DWORD dwInterval; UINT64 frameTime; HANDLE events[32]; HANDLE StopEvent; StopEvent = subsystem->server->StopEvent; nCount = 0; events[nCount++] = StopEvent; events[nCount++] = subsystem->event; fps = 16; dwInterval = 1000 / fps; frameTime = GetTickCount64() + dwInterval; while (1) { cTime = GetTickCount64(); dwTimeout = (cTime > frameTime) ? 0 : frameTime - cTime; status = WaitForMultipleObjects(nCount, events, FALSE, dwTimeout); if (WaitForSingleObject(StopEvent, 0) == WAIT_OBJECT_0) { break; } if (WaitForSingleObject(subsystem->event, 0) == WAIT_OBJECT_0) { XNextEvent(subsystem->display, &xevent); x11_shadow_handle_xevent(subsystem, &xevent); } if ((status == WAIT_TIMEOUT) || (GetTickCount64() > frameTime)) { x11_shadow_query_cursor(subsystem, FALSE); x11_shadow_screen_grab(subsystem); dwInterval = 1000 / fps; frameTime += dwInterval; } } ExitThread(0); return NULL; }
void* x11_shadow_subsystem_thread(x11ShadowSubsystem* subsystem) { XEvent xevent; DWORD status; DWORD nCount; UINT64 cTime; DWORD dwTimeout; DWORD dwInterval; UINT64 frameTime; HANDLE events[32]; wMessage message; wMessagePipe* MsgPipe; MsgPipe = subsystem->MsgPipe; nCount = 0; events[nCount++] = subsystem->event; events[nCount++] = MessageQueue_Event(MsgPipe->In); subsystem->captureFrameRate = 16; dwInterval = 1000 / subsystem->captureFrameRate; frameTime = GetTickCount64() + dwInterval; while (1) { cTime = GetTickCount64(); dwTimeout = (cTime > frameTime) ? 0 : frameTime - cTime; status = WaitForMultipleObjects(nCount, events, FALSE, dwTimeout); if (WaitForSingleObject(MessageQueue_Event(MsgPipe->In), 0) == WAIT_OBJECT_0) { if (MessageQueue_Peek(MsgPipe->In, &message, TRUE)) { if (message.id == WMQ_QUIT) break; x11_shadow_subsystem_process_message(subsystem, &message); } } if (WaitForSingleObject(subsystem->event, 0) == WAIT_OBJECT_0) { XLockDisplay(subsystem->display); if (XEventsQueued(subsystem->display, QueuedAlready)) { XNextEvent(subsystem->display, &xevent); x11_shadow_handle_xevent(subsystem, &xevent); } XUnlockDisplay(subsystem->display); } if ((status == WAIT_TIMEOUT) || (GetTickCount64() > frameTime)) { x11_shadow_check_resize(subsystem); x11_shadow_screen_grab(subsystem); x11_shadow_query_cursor(subsystem, FALSE); dwInterval = 1000 / subsystem->captureFrameRate; frameTime += dwInterval; } } ExitThread(0); return NULL; }