/* * 每一次接收, */ int TCPServer_Input(SOCKET iSocket) { // 1、接收逻辑 int iRet = OnInput(iSocket); if(iRet < 0) { XLOG_ERROR(m_pLogger, "ProcessRead error: iRet = %d", iRet); return -2; } return 0; }
int CTransportTcp::OnTimeout(const CTimeValue &aCurTime, LPVOID aArg) { int arg = (int)aArg; if (arg == 1) { OnInput(); } else { CTransportBase::OnTimeout(aCurTime, aArg); } }
void GameState::HandleInput() { int currentKeyboardState = 0; if(GetAsyncKeyState(VK_DOWN)) currentKeyboardState |= (int)KeyboardKeys::UP_ARROW; if(GetAsyncKeyState(VK_UP)) currentKeyboardState |= (int)KeyboardKeys::DOWN_ARROW; if(GetAsyncKeyState(VK_LEFT)) currentKeyboardState |= (int)KeyboardKeys::LEFT_ARROW; if(GetAsyncKeyState(VK_RIGHT)) currentKeyboardState |= (int)KeyboardKeys::RIGHT_ARROW; if(GetAsyncKeyState(VK_RETURN)) currentKeyboardState |= (int)KeyboardKeys::ENTER; if(GetAsyncKeyState(VK_SPACE)) currentKeyboardState |= (int)KeyboardKeys::SPACE; int keysChanged = currentKeyboardState ^ previousKeyboardState; int keysDown = currentKeyboardState & keysChanged; int keysUp = ~currentKeyboardState & keysChanged; OnInput(keysChanged, keysDown, keysUp); previousKeyboardState = currentKeyboardState; }
void CInputProviderMacOsHid::SetInitialBindValues(IOHIDDeviceRef device) { CFArrayRef elements = IOHIDDeviceCopyMatchingElements(device, nullptr, 0); for(int i = 0; i < CFArrayGetCount(elements); i++) { IOHIDElementRef elementRef = (IOHIDElementRef)CFArrayGetValueAtIndex(elements, i); uint32 usagePage = IOHIDElementGetUsagePage(elementRef); if( (usagePage != kHIDPage_GenericDesktop) && (usagePage != kHIDPage_Button)) { continue; } IOHIDValueRef valueRef; if(IOHIDDeviceGetValue(device, elementRef, &valueRef) != kIOReturnSuccess) { continue; } CFIndex value = IOHIDValueGetIntegerValue(valueRef); IOHIDElementType type = IOHIDElementGetType(elementRef); uint32 usage = IOHIDElementGetUsage(elementRef); BINDINGTARGET tgt; tgt.providerId = PROVIDER_ID; tgt.deviceId = GetDeviceID(device); tgt.keyId = usage; tgt.keyType = GetKeyType(usage, type); switch(type) { case kIOHIDElementTypeInput_Misc: case kIOHIDElementTypeInput_Button: case kIOHIDElementTypeInput_Axis: OnInput(tgt, value); break; default: break; } } }
void CInputProviderMacOsHid::InputValueCallback(DEVICE_INFO* deviceInfo, IOReturn result, void* sender, IOHIDValueRef valueRef) { if(!OnInput) return; IOHIDElementRef elementRef = IOHIDValueGetElement(valueRef); uint32 usagePage = IOHIDElementGetUsagePage(elementRef); if( (usagePage != kHIDPage_GenericDesktop) && (usagePage != kHIDPage_Button)) { return; } uint32 usage = IOHIDElementGetUsage(elementRef); CFIndex value = IOHIDValueGetIntegerValue(valueRef); IOHIDElementType type = IOHIDElementGetType(elementRef); BINDINGTARGET tgt; tgt.providerId = PROVIDER_ID; tgt.deviceId = deviceInfo->deviceId; tgt.keyId = usage; tgt.keyType = GetKeyType(usage, type); OnInput(tgt, value); }
void SDLWrapper::OnExecute( ) { // Frame starts // double startTime = m_timer->GetElapsedTime( ); // Input // OnInput( ); // Update // OnUpdate( ); // Draw // OnRender( ); // Time Management // double endTime = m_timer->GetElapsedTime( ); double nextTimeFrame = startTime + DESIRED_FRAME_TIME; while( endTime < nextTimeFrame ) { // Spin lock // endTime = m_timer->GetElapsedTime( ); } // Frame ends // ++m_nUpdates; m_deltaTime = m_nUpdates / static_cast< double >( DESIRED_FRAME_RATE ); }
void CChat::OnRender() { if (!g_Config.m_ClShowChat) return; // send pending chat messages if(m_PendingChatCounter > 0 && m_LastChatSend+time_freq() < time_get()) { CHistoryEntry *pEntry = m_History.Last(); for(int i = m_PendingChatCounter-1; pEntry; --i, pEntry = m_History.Prev(pEntry)) { if(i == 0) { Say(pEntry->m_Team, pEntry->m_aText); break; } } --m_PendingChatCounter; } float Width = 300.0f*Graphics()->ScreenAspect(); Graphics()->MapScreen(0.0f, 0.0f, Width, 300.0f); float x = 5.0f; float y = 300.0f-20.0f; if(m_Mode != MODE_NONE) { // render chat input CTextCursor Cursor; TextRender()->SetCursor(&Cursor, x, y, 8.0f, TEXTFLAG_RENDER); Cursor.m_LineWidth = Width-190.0f; Cursor.m_MaxLines = 2; if(m_Mode == MODE_ALL) TextRender()->TextEx(&Cursor, Localize("All"), -1); else if(m_Mode == MODE_TEAM) TextRender()->TextEx(&Cursor, Localize("Team"), -1); else TextRender()->TextEx(&Cursor, Localize("Chat"), -1); TextRender()->TextEx(&Cursor, ": ", -1); // check if the visible text has to be moved if(m_InputUpdate) { if(m_ChatStringOffset > 0 && m_Input.GetLength() < m_OldChatStringLength) m_ChatStringOffset = max(0, m_ChatStringOffset-(m_OldChatStringLength-m_Input.GetLength())); if(m_ChatStringOffset > m_Input.GetCursorOffset()) m_ChatStringOffset -= m_ChatStringOffset-m_Input.GetCursorOffset(); else { CTextCursor Temp = Cursor; Temp.m_Flags = 0; TextRender()->TextEx(&Temp, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); TextRender()->TextEx(&Temp, "|", -1); while(Temp.m_LineCount > 2) { ++m_ChatStringOffset; Temp = Cursor; Temp.m_Flags = 0; TextRender()->TextEx(&Temp, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); TextRender()->TextEx(&Temp, "|", -1); } } m_InputUpdate = false; } TextRender()->TextEx(&Cursor, m_Input.GetString()+m_ChatStringOffset, m_Input.GetCursorOffset()-m_ChatStringOffset); static float MarkerOffset = TextRender()->TextWidth(0, 8.0f, "|", -1)/3; CTextCursor Marker = Cursor; Marker.m_X -= MarkerOffset; TextRender()->TextEx(&Marker, "|", -1); TextRender()->TextEx(&Cursor, m_Input.GetString()+m_Input.GetCursorOffset(), -1); } y -= 8.0f; #if defined(__ANDROID__) x += 120.0f; #endif int64 Now = time_get(); float LineWidth = m_pClient->m_pScoreboard->Active() ? 90.0f : 200.0f; float HeightLimit = m_pClient->m_pScoreboard->Active() ? 230.0f : m_Show ? 50.0f : 200.0f; float Begin = x; #if defined(__ANDROID__) float FontSize = 10.0f; #else float FontSize = 6.0f; #endif CTextCursor Cursor; int OffsetType = m_pClient->m_pScoreboard->Active() ? 1 : 0; for(int i = 0; i < MAX_LINES; i++) { int r = ((m_CurrentLine-i)+MAX_LINES)%MAX_LINES; if(Now > m_aLines[r].m_Time+16*time_freq() && !m_Show) break; // get the y offset (calculate it if we haven't done that yet) if(m_aLines[r].m_YOffset[OffsetType] < 0.0f) { TextRender()->SetCursor(&Cursor, Begin, 0.0f, FontSize, 0); Cursor.m_LineWidth = LineWidth; TextRender()->TextEx(&Cursor, m_aLines[r].m_aName, -1); TextRender()->TextEx(&Cursor, m_aLines[r].m_aText, -1); m_aLines[r].m_YOffset[OffsetType] = Cursor.m_Y + Cursor.m_FontSize; } y -= m_aLines[r].m_YOffset[OffsetType]; // cut off if msgs waste too much space if(y < HeightLimit) break; float Blend = Now > m_aLines[r].m_Time+14*time_freq() && !m_Show ? 1.0f-(Now-m_aLines[r].m_Time-14*time_freq())/(2.0f*time_freq()) : 1.0f; // reset the cursor TextRender()->SetCursor(&Cursor, Begin, y, FontSize, TEXTFLAG_RENDER); Cursor.m_LineWidth = LineWidth; // render name if (m_aLines[r].m_ClientID == -1) { //TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system vec3 rgb = HslToRgb(vec3(g_Config.m_ClMessageSystemHue / 255.0f, g_Config.m_ClMessageSystemSat / 255.0f, g_Config.m_ClMessageSystemLht / 255.0f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } else if (m_aLines[r].m_Team) TextRender()->TextColor(0.45f, 0.9f, 0.45f, Blend); // team message else if(m_aLines[r].m_NameColor == TEAM_RED) TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // red else if(m_aLines[r].m_NameColor == TEAM_BLUE) TextRender()->TextColor(0.7f, 0.7f, 1.0f, Blend); // blue else if(m_aLines[r].m_NameColor == TEAM_SPECTATORS) TextRender()->TextColor(0.75f, 0.5f, 0.75f, Blend); // spectator else if(m_aLines[r].m_ClientID >= 0 && g_Config.m_ClChatTeamColors && m_pClient->m_Teams.Team(m_aLines[r].m_ClientID)) { vec3 rgb = HslToRgb(vec3(m_pClient->m_Teams.Team(m_aLines[r].m_ClientID) / 64.0f, 1.0f, 0.75f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } else TextRender()->TextColor(0.8f, 0.8f, 0.8f, Blend); TextRender()->TextEx(&Cursor, m_aLines[r].m_aName, -1); // render line if (m_aLines[r].m_ClientID == -1) { //TextRender()->TextColor(1.0f, 1.0f, 0.5f, Blend); // system vec3 rgb = HslToRgb(vec3(g_Config.m_ClMessageSystemHue / 255.0f, g_Config.m_ClMessageSystemSat / 255.0f, g_Config.m_ClMessageSystemLht / 255.0f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } else if (m_aLines[r].m_Highlighted) { //TextRender()->TextColor(1.0f, 0.5f, 0.5f, Blend); // highlighted vec3 rgb = HslToRgb(vec3(g_Config.m_ClMessageHighlightHue / 255.0f, g_Config.m_ClMessageHighlightSat / 255.0f, g_Config.m_ClMessageHighlightLht / 255.0f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } else if (m_aLines[r].m_Team) { //TextRender()->TextColor(0.65f, 1.0f, 0.65f, Blend); // team message vec3 rgb = HslToRgb(vec3(g_Config.m_ClMessageTeamHue / 255.0f, g_Config.m_ClMessageTeamSat / 255.0f, g_Config.m_ClMessageTeamLht / 255.0f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } else { //TextRender()->TextColor(1.0f, 1.0f, 1.0f, Blend); vec3 rgb = HslToRgb(vec3(g_Config.m_ClMessageHue / 255.0f, g_Config.m_ClMessageSat / 255.0f, g_Config.m_ClMessageLht / 255.0f)); TextRender()->TextColor(rgb.r, rgb.g, rgb.b, Blend); } TextRender()->TextEx(&Cursor, m_aLines[r].m_aText, -1); } TextRender()->TextColor(1.0f, 1.0f, 1.0f, 1.0f); #if defined(__ANDROID__) static int deferEvent = 0; if( UI()->AndroidTextInputShown() ) { if(m_Mode == MODE_NONE) { deferEvent++; if( deferEvent > 2 ) EnableMode(0); } else deferEvent = 0; } else { if(m_Mode != MODE_NONE) { deferEvent++; if( deferEvent > 2 ) { IInput::CEvent Event; Event.m_Flags = IInput::FLAG_PRESS; Event.m_Key = KEY_RETURN; OnInput(Event); } } else deferEvent = 0; } #endif }
int CTransportTcp::IOCtl(int aCmd, LPVOID aArg) { switch (aCmd) { case WUO_TRANSPORT_OPT_GET_FIO_NREAD: return m_SockTcp.Control(FIONREAD, aArg); case WUO_TRANSPORT_OPT_GET_TRAN_NREAD: *(static_cast<DWORD*>(aArg)) = m_mbBufferOne.GetLength(); return 0; case WUO_TRANSPORT_OPT_GET_FD: *(static_cast<CM_HANDLE *>(aArg)) = m_SockTcp.GetHandle(); return 0; case WUO_TRANSPORT_OPT_GET_LOCAL_ADDR: m_SockTcp.GetLocalAddr(*(static_cast<CInetAddr*>(aArg))); return 0; case WUO_TRANSPORT_OPT_GET_PEER_ADDR: { static CInetAddr Addr; m_SockTcp.GetRemoteAddr(Addr); *((struct sockaddr_in **)aArg) = (struct sockaddr_in *)Addr.GetPtr(); return 0; } case WUO_TRANSPORT_OPT_GET_SOCK_ALIVE: { char cTmp; int nRet = m_SockTcp.Recv(&cTmp, sizeof(cTmp), MSG_PEEK); if (nRet > 0 || (nRet < 0 && errno == EWOULDBLOCK)) *static_cast<BOOL*>(aArg) = TRUE; else *static_cast<BOOL*>(aArg) = FALSE; return 0; } case WUO_TRANSPORT_OPT_GET_TRAN_TYPE: *(static_cast<DWORD*>(aArg)) = TYPE_TCP; return 0; case WUO_TRANSPORT_OPT_SET_SND_BUF_LEN: if (m_SockTcp.SetOption(SOL_SOCKET, SO_SNDBUF, aArg, sizeof(DWORD)) == -1) { CM_ERROR_LOG(("CTransportTcp::IOCtl, SetOption(SO_SNDBUF) failed!")); return -1; } return 0; case WUO_TRANSPORT_OPT_SET_RCV_BUF_LEN: if (m_SockTcp.SetOption(SOL_SOCKET, SO_RCVBUF, aArg, sizeof(DWORD)) == -1) { CM_ERROR_LOG(("CTransportTcp::IOCtl, SetOption(SO_RCVBUF) failed!")); return -1; } return 0; case WUO_TRANSPORT_OPT_SET_CAN_RCV_DATA: { bool bCanRecv = static_cast<bool>(*static_cast<DWORD*>(aArg)); m_bCanRecv = bCanRecv; if (m_bCanRecv) { OnInput(NULL); } } return 0; #ifdef CM_DEBUG_SEND_RECV case 13333: { char *szBuf = static_cast<char*>(aArg); RecType::iterator iter = m_RecordDebug.begin(); for ( ; iter != m_RecordDebug.end(); ++iter) { int nPrint = sprintf(szBuf, "%c%d, ", (*iter).first, (*iter).second); szBuf += nPrint; } return 0; } #endif // CM_DEBUG_SEND_RECV // mainly for TeleSession usage. support SO_KEEPALIVE function case WUO_TRANSPORT_OPT_SET_TCP_KEEPALIVE: { DWORD dwTime = *static_cast<DWORD*>(aArg); int nKeep = dwTime > 0 ? 1 : 0; if (m_SockTcp.SetOption(SOL_SOCKET, SO_KEEPALIVE, &nKeep, sizeof(nKeep)) == -1) { CM_ERROR_LOG(("CTransportTcp::IOCtl, SetOption(SO_KEEPALIVE) failed! dwTime=%u", dwTime)); return -1; } #ifdef LINUX if (dwTime > 0) { if (m_SockTcp.SetOption(SOL_TCP, TCP_KEEPIDLE, &dwTime, sizeof(dwTime)) == -1) { CM_ERROR_LOG(("CTransportTcp::IOCtl, SetOption(TCP_KEEPINTVL) failed! dwTime=%u", dwTime)); return -1; } } #endif // LINUX return 0; } default: VP_TRACE_ERROR("CTransportTcp::IOCtl, unknow aCmd=%d aArg=%x", aCmd, aArg); return -1; } }
void CInputProviderQtKey::OnKeyRelease(int keyCode) { if(!OnInput) return; OnInput(MakeBindingTarget(keyCode), 0); }
void CInputProviderQtKey::OnKeyPress(int keyCode) { if(!OnInput) return; OnInput(MakeBindingTarget(keyCode), 1); }