Пример #1
0
/*
 * 每一次接收,
 */
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;
}
Пример #2
0
int CTransportTcp::OnTimeout(const CTimeValue &aCurTime, LPVOID aArg)
{
	int arg = (int)aArg;
	if (arg == 1)
	{
		OnInput();
	}
	else
	{
		CTransportBase::OnTimeout(aCurTime, aArg);
	}
}
Пример #3
0
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;
}
Пример #4
0
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;
		}
	}
}
Пример #5
0
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);
}
Пример #6
0
    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 );
    }
Пример #7
0
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
}
Пример #8
0
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;
	}
}
Пример #9
0
void CInputProviderQtKey::OnKeyRelease(int keyCode)
{
	if(!OnInput) return;
	OnInput(MakeBindingTarget(keyCode), 0);
}
Пример #10
0
void CInputProviderQtKey::OnKeyPress(int keyCode)
{
	if(!OnInput) return;
	OnInput(MakeBindingTarget(keyCode), 1);
}