Updated the SDK with the latest code from the TF and HL2 branches

* Adds support for Visual Studio 2012 and 2013
* VR Mode:
. Switches from headtrack.dll to sourcevr.dll
. Improved readability of the UI in VR
. Removed the IPD calibration tool. TF2 will now obey the Oculus
configuration file. Use the Oculus calibration tool in your SDK or
install and run "OpenVR" under Tools in Steam to calibrate your IPD.
. Added dropdown to enable VR mode in the Video options. Removed the -vr
command line option.
. Added the ability to switch in and out of VR mode without quitting the
game
. By default VR mode will run full screen. To switch back to a
borderless window set the vr_force_windowed convar.
. Added support for VR mode on Linux
* Many assorted bug fixes and other changes from Team Fortress in
various shared files
This commit is contained in:
Joe Ludwig
2013-12-03 08:54:16 -08:00
parent 2861c3fbfc
commit beaae8ac45
424 changed files with 11412 additions and 11273 deletions

View File

@@ -111,18 +111,18 @@ void CCEFThread::WakeThread()
//-----------------------------------------------------------------------------
#define HTML_MSG_FUNC( eHTMLCommand, bodyType, commandFunc ) \
case eHTMLCommand: \
{ \
CHTMLProtoBufMsg< bodyType > cmd( pCmd->m_eCmd ); \
if ( !cmd.BDeserializeCrossProc( &pCmd->m_Buffer ) ) \
{ \
bError = true; \
} \
{ \
CHTMLProtoBufMsg< bodyType > cmd( pCmd->m_eCmd ); \
if ( !cmd.BDeserializeCrossProc( &pCmd->m_Buffer ) ) \
{ \
bError = true; \
} \
else \
{ \
{ \
cmd.Body().set_browser_handle( pCmd->m_iBrowser ); \
g_CEFThread.commandFunc( cmd ); \
} \
} \
g_CEFThread.commandFunc( cmd ); \
} \
} \
break;
@@ -204,7 +204,7 @@ void CCEFThread::RunCurrentCommands()
HTML_MSG_FUNC( eHTMLCommands_ExitFullScreen, CMsgExitFullScreen, ThreadExitFullScreen );
HTML_MSG_FUNC( eHTMLCommands_CloseFullScreenFlashIfOpen, CMsgCloseFullScreenFlashIfOpen, ThreadCloseFullScreenFlashIfOpen );
HTML_MSG_FUNC( eHTMLCommands_PauseFullScreenFlashMovieIfOpen, CMsgPauseFullScreenFlashMovieIfOpen, ThreadPauseFullScreenFlashMovieIfOpen );
default:
bError = true;
AssertMsg1( false, "Invalid message in browser stream (%d)", pCmd->m_eCmd );
@@ -351,7 +351,7 @@ bool CCEFThread::GetMainThreadCommand( HTMLCommandBuffer_t **pBuf )
return true;
}
else
return m_tslResponseBuffers.PopItem( pBuf );
return m_tslResponseBuffers.PopItem( pBuf );
}
@@ -376,7 +376,7 @@ bool CCEFThread::GetCEFThreadCommand( HTMLCommandBuffer_t **pBuf )
//-----------------------------------------------------------------------------
const char *CCEFThread::PchWebkitUserAgent()
{
return "Mozilla/5.0 (%s; U; %s; en-US; %s/%llu; %s) AppleWebKit/535.15 (KHTML, like Gecko) Chrome/18.0.989.0 Safari/535.11";
return "Mozilla/5.0 (%s; U; %s; en-US; %s/%llu; %s) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19";
}
@@ -405,7 +405,6 @@ void CCEFThread::ThreadCreateBrowser( const CHTMLProtoBufMsg<CMsgBrowserCreate>
CefWindowInfo info;
info.SetAsOffScreen( NULL );
info.m_bPopupWindow = htmlCommand.BodyConst().popup();
CefBrowserSettings settings;
settings.fullscreen_enabled = true;
settings.threaded_compositing_enabled = true;
@@ -416,6 +415,28 @@ void CCEFThread::ThreadCreateBrowser( const CHTMLProtoBufMsg<CMsgBrowserCreate>
// ports for Mac and Linux have bugs where it is not really disabled, causing havoc
settings.drag_drop_disabled = true;
#ifdef LINUX
// Turn off web features here that don't work on Linux
settings.webgl_disabled = true;
#endif
// CEF HTML local storage, databases, and offline application cache are all busted;
// they live in a temp dir which gets cleaned up on shutdown. There's no point in
// enabling them just to generate extra files to cleanup on shutdown when there's
// no actual disk persistence. we need to upgrade CEF again before they will work.
settings.local_storage_disabled = true;
settings.databases_disabled = true;
settings.application_cache_disabled = true;
settings.java_disabled = true;
// We don't provide a UI to connect to the WebKit developer tools API
// so there is no point having it suck up CPU and listening on a port.
settings.developer_tools_disabled = true;
// Drag and drop is supposed to be disabled automatically for offscreen views, but
// ports for Mac and Linux have bugs where it is not really disabled, causing havoc
settings.drag_drop_disabled = true;
#ifdef LINUX
// Turn off web features here that don't work on Linux
settings.webgl_disabled = true;
@@ -479,7 +500,7 @@ void CCEFThread::ThreadBrowserSize( const CHTMLProtoBufMsg<CMsgBrowserSize> &htm
GET_BROSWER_FUNC( htmlCommand, SetSize( PET_VIEW, htmlCommand.BodyConst().width(), htmlCommand.BodyConst().height() ) );
if ( BIsValidBrowserHandle( htmlCommand.BodyConst().browser_handle(), iClient ) )
m_listClientHandlers[iClient]->SetSize( htmlCommand.BodyConst().width(), htmlCommand.BodyConst().height() );
}
}
//-----------------------------------------------------------------------------
@@ -646,8 +667,8 @@ void CCEFThread::ThreadBrowserHorizontalScrollBarSizeHelper( int iBrowser, bool
if ( bForceSendUpdate || 0 != memcmp( &pHandler->m_CachedHScroll, &scroll, sizeof( scroll ) ) )
{
pHandler->m_CachedHScroll = scroll;
CHTMLProtoBufMsg<CMsgHorizontalScrollBarSizeResponse> cmd( eHTMLCommands_HorizontalScrollBarSizeResponse );
CHTMLProtoBufMsg<CMsgHorizontalScrollBarSizeResponse> cmd( eHTMLCommands_HorizontalScrollBarSizeResponse );
cmd.Body().set_x( scroll.m_nX );
cmd.Body().set_y( scroll.m_nY );
cmd.Body().set_wide( scroll.m_nWide );
@@ -655,10 +676,10 @@ void CCEFThread::ThreadBrowserHorizontalScrollBarSizeHelper( int iBrowser, bool
cmd.Body().set_scroll_max( scroll.m_nMax );
cmd.Body().set_scroll( scroll.m_nScroll );
cmd.Body().set_visible( scroll.m_bVisible != 0 );
cmd.Body().set_zoom( flZoom );
int m_iBrowser = iBrowser;
DISPATCH_MESSAGE( eHTMLCommands_HorizontalScrollBarSizeResponse );
}
cmd.Body().set_zoom( flZoom );
int m_iBrowser = iBrowser;
DISPATCH_MESSAGE( eHTMLCommands_HorizontalScrollBarSizeResponse );
}
}
}
@@ -701,7 +722,7 @@ void CCEFThread::ThreadBrowserVerticalScrollBarSizeHelper( int iBrowser, bool bF
{
pHandler->m_CachedVScroll = scroll;
CHTMLProtoBufMsg<CMsgVerticalScrollBarSizeResponse> cmd( eHTMLCommands_VerticalScrollBarSizeResponse );
CHTMLProtoBufMsg<CMsgVerticalScrollBarSizeResponse> cmd( eHTMLCommands_VerticalScrollBarSizeResponse );
cmd.Body().set_x( scroll.m_nX );
cmd.Body().set_y( scroll.m_nY );
cmd.Body().set_wide( scroll.m_nWide );
@@ -709,10 +730,10 @@ void CCEFThread::ThreadBrowserVerticalScrollBarSizeHelper( int iBrowser, bool bF
cmd.Body().set_scroll_max( scroll.m_nMax );
cmd.Body().set_scroll( scroll.m_nScroll );
cmd.Body().set_visible( scroll.m_bVisible != 0 );
cmd.Body().set_zoom( flZoom );
int m_iBrowser = iBrowser;
DISPATCH_MESSAGE( eHTMLCommands_VerticalScrollBarSizeResponse );
}
cmd.Body().set_zoom( flZoom );
int m_iBrowser = iBrowser;
DISPATCH_MESSAGE( eHTMLCommands_VerticalScrollBarSizeResponse );
}
}
}
@@ -743,7 +764,7 @@ void CCEFThread::ThreadBrowserSetHorizontalScroll( const CHTMLProtoBufMsg<CMsgSe
GET_BROSWER_FUNC( htmlCommand, SetHorizontalScroll( htmlCommand.BodyConst().scroll() ) );
ThreadBrowserHorizontalScrollBarSizeHelper( htmlCommand.BodyConst().browser_handle(), true );
}
}
//-----------------------------------------------------------------------------
@@ -851,7 +872,7 @@ void CCEFThread::ThreadGetZoom( const CHTMLProtoBufMsg<CMsgGetZoom> &htmlCmd )
//-----------------------------------------------------------------------------
void IOT_SetCookie(const CefString& url, CefCookie* cookie, CThreadEvent *pEvent )
{
CefSetCookie(url, *cookie);
CefCookieManager::GetGlobalManager()->SetCookie(url, *cookie);
pEvent->Set();
}
@@ -936,7 +957,7 @@ private:
//-----------------------------------------------------------------------------
void IOT_CookiesForURL(const CefString& url, CThreadEvent *pEvent, CUtlVector<CCefCookie> *pVecCookies )
{
CefVisitUrlCookies( url, false, new CookieVisitor( pVecCookies, pEvent ) );
CefCookieManager::GetGlobalManager()->VisitUrlCookies( url, false, new CookieVisitor( pVecCookies, pEvent ) );
}
@@ -1029,7 +1050,6 @@ void CCEFThread::AppGetSettings(CefSettings& settings, CefRefPtr<CefApp>& app)
//#endif
}
//-----------------------------------------------------------------------------
// Purpose: clean up the temp folders cef can leave around on crash
//-----------------------------------------------------------------------------
@@ -1092,12 +1112,13 @@ int CCEFThread::Run()
// Populate the settings based on command line arguments.
AppGetSettings(settings, app);
settings.pack_loading_disabled = true;
// Initialize CEF.
CefInitialize(settings, app, "");
#if defined( VPROF_ENABLED )
//CVProfile *pProfile = GetVProfProfileForCurrentThread();
// CVProfile *pProfile = GetVProfProfileForCurrentThread();
#endif
CLimitTimer timer;
@@ -1125,8 +1146,8 @@ int CCEFThread::Run()
m_bSawUserInputThisFrame = false;
#if defined( VPROF_ENABLED )
//if ( pProfile )
// pProfile->MarkFrame( "UI CEF HTML Thread" );
// if ( pProfile )
// pProfile->MarkFrame( "UI CEF HTML Thread" );
#endif
// Limit animation frame rate
timer.SetLimit( k_nMillion/m_nTargetFrameRate );
@@ -1138,7 +1159,7 @@ int CCEFThread::Run()
}
// now let cef think
if ( m_listClientHandlers.Count() || timerLastCefThink.BLimitReached() )
if ( !m_bExit && ( m_listClientHandlers.Count() || timerLastCefThink.BLimitReached() ) && m_nTargetFrameRate > 0 )
{
VPROF_BUDGET( "CCEFThread - CefDoMessageLoopWork()", VPROF_BUDGETGROUP_TENFOOT );
CefDoMessageLoopWork();
@@ -1314,7 +1335,7 @@ void CCEFThread::CheckForFullScreenFlashControl()
}
SetForegroundWindow( m_flashfullscreenHWND );
}
}
}
else
{
@@ -1360,40 +1381,40 @@ void CCEFThread::Validate( CValidator &validator, const tchar *pchName )
// hacky but reliable way to avoid both vgui and panorama validating all this stuff twice
if ( !validator.IsClaimed( m_sHTMLCacheDir.Access() ) )
{
VALIDATE_SCOPE();
ValidateObj( m_sHTMLCacheDir );
ValidateObj( m_sCookiePath );
ValidateObj( m_listClientHandlers );
FOR_EACH_LL( m_listClientHandlers, i )
{
ValidatePtr( m_listClientHandlers[i] );
}
ValidateObj( m_vecQueueCommands );
FOR_EACH_VEC( m_vecQueueCommands, i )
{
ValidatePtr( m_vecQueueCommands[i] );
}
VALIDATE_SCOPE();
ValidateObj( m_sHTMLCacheDir );
ValidateObj( m_sCookiePath );
ValidateObj( m_listClientHandlers );
FOR_EACH_LL( m_listClientHandlers, i )
{
ValidatePtr( m_listClientHandlers[i] );
}
ValidateObj( m_vecQueueCommands );
FOR_EACH_VEC( m_vecQueueCommands, i )
{
ValidatePtr( m_vecQueueCommands[i] );
}
ValidateObj( m_vecQueueResponses );
FOR_EACH_VEC( m_vecQueueResponses, i )
{
ValidatePtr( m_vecQueueResponses[i] );
}
ValidateObj( m_tslUnsedBuffers );
ValidateObj( m_tslUnsedBuffers );
{
CTSList<HTMLCommandBuffer_t*>::Node_t *pNode = m_tslUnsedBuffers.Detach();
while ( pNode )
{
CTSList<HTMLCommandBuffer_t*>::Node_t *pNode = m_tslUnsedBuffers.Detach();
while ( pNode )
{
CTSList<HTMLCommandBuffer_t*>::Node_t *pNext = (CTSList<HTMLCommandBuffer_t*>::Node_t *)pNode->Next;
ValidatePtr( pNode->elem );
m_tslUnsedBuffers.Push( pNode );
pNode = pNext;
}
CTSList<HTMLCommandBuffer_t*>::Node_t *pNext = (CTSList<HTMLCommandBuffer_t*>::Node_t *)pNode->Next;
ValidatePtr( pNode->elem );
m_tslUnsedBuffers.Push( pNode );
pNode = pNext;
}
ValidateObj( m_tslCommandBuffers );
ValidateObj( m_tslResponseBuffers );
}
ValidateObj( m_tslCommandBuffers );
ValidateObj( m_tslResponseBuffers );
}
}
#endif
@@ -1567,23 +1588,23 @@ void CChromePainter::OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType typ
{
// main browser painting
if ( !m_pParent->IsVisuallyNonEmpty() )
{
return;
}
if ( !m_pParent->IsVisuallyNonEmpty() )
{
return;
}
// If there were no dirty regions (unlikely), perhaps due to a bug, be conservative and paint all
if ( dirtyRects.empty() )
{
{
m_MainTexture.MarkAllDirty();
}
else
{
}
else
{
for ( RectList::const_iterator iter = dirtyRects.begin(); iter != dirtyRects.end(); ++iter )
{
{
m_MainTexture.MarkDirtyRect( iter->x, iter->y, iter->x + iter->width, iter->y + iter->height );
}
}
}
}
// Refresh all dirty main texture pixels from the chromium rendering buffer
if ( m_MainTexture.BUpdatePixels( (byte*)buffer, wide, tall ) )
@@ -1629,7 +1650,7 @@ void CChromePainter::SetUpdated( bool state )
// Purpose: move to the next html texture to render into
//-----------------------------------------------------------------------------
uint32 CChromePainter::FlipTexture()
{
{
int iTex = m_iNextTexture;
m_iTexturesInFlightBits |= ( 1<<iTex );
m_iNextTexture = (m_iNextTexture+1)%Q_ARRAYSIZE(m_Texture);
@@ -1672,19 +1693,19 @@ byte *CChromePainter::PComposedTextureData( uint32 iTexture )
// Notify the main thread that the composited popup region is dirty
m_UpdateRect.MarkDirtyRect( GetPopupX(), GetPopupY(), GetPopupX() + nCopyWide, GetPopupY() + nCopyTall );
byte *pCurTextureByte = pTexture;
pCurTextureByte += ( GetPopupY() * m_Texture[ iTexture ].GetWide() * 4 ); // move ahead to the right row
pCurTextureByte += ( GetPopupX() * 4 ); // now offset into the edge as needed
const byte *pPopupTexture = PPopupTextureData();
for ( int iRow = 0; iRow < nCopyTall; iRow++ )
{
{
Q_memcpy( pCurTextureByte, pPopupTexture, nCopyWide*4 );
pCurTextureByte += ( m_Texture[ iTexture ].GetWide() * 4 ); // move ahead one row in both images
pPopupTexture += ( GetPopupWide() * 4 );
}
}
}
return pTexture;
}
@@ -2000,34 +2021,34 @@ void CClientHandler::OnLoadStart(CefRefPtr<CefBrowser> browser,
if ( !frame->IsMain() )
return;
std::wstring sURL = frame->GetURL();
if ( sURL.empty() )
return;
std::wstring sURL = frame->GetURL();
if ( sURL.empty() )
return;
CStrAutoEncode url( sURL.c_str() );
m_strCurrentUrl = url.ToString();
CStrAutoEncode url( sURL.c_str() );
m_strCurrentUrl = url.ToString();
if ( m_strCurrentUrl.IsEmpty() )
return;
if ( m_strCurrentUrl.IsEmpty() )
return;
bool bIsRedirect = false;
if ( m_strCurrentUrl == m_strLastRedirectURL )
bIsRedirect = true;
bool bIsRedirect = false;
if ( m_strCurrentUrl == m_strLastRedirectURL )
bIsRedirect = true;
CHTMLProtoBufMsg<CMsgURLChanged> cmd( eHTMLCommands_URLChanged );
cmd.Body().set_url( url.ToString() );
CHTMLProtoBufMsg<CMsgURLChanged> cmd( eHTMLCommands_URLChanged );
cmd.Body().set_url( url.ToString() );
cmd.Body().set_bnewnavigation( bIsNewNavigation );
if ( !m_strPostData.IsEmpty() )
if ( !m_strPostData.IsEmpty() )
cmd.Body().set_postdata( m_strPostData.String() );
cmd.Body().set_bisredirect( bIsRedirect );
CefString frameName = frame->GetName();
if ( !frameName.empty() )
cmd.Body().set_pagetitle( frameName.c_str() );
cmd.Body().set_bisredirect( bIsRedirect );
CefString frameName = frame->GetName();
if ( !frameName.empty() )
cmd.Body().set_pagetitle( frameName.c_str() );
DISPATCH_MESSAGE( eHTMLCommands_URLChanged );
}
DISPATCH_MESSAGE( eHTMLCommands_URLChanged );
}
{
CHTMLProtoBufMsg<CMsgCanGoBackAndForward> cmd( eHTMLCommands_CanGoBackandForward );
@@ -2420,10 +2441,10 @@ bool CClientHandler::OnTooltip(CefRefPtr<CefBrowser> browser, CefString& text)
{
m_strToolTip = text.c_str();
CHTMLProtoBufMsg<CMsgUpdateToolTip> cmd( eHTMLCommands_UpdateToolTip );
CHTMLProtoBufMsg<CMsgUpdateToolTip> cmd( eHTMLCommands_UpdateToolTip );
cmd.Body().set_text( m_strToolTip );
DISPATCH_MESSAGE( eHTMLCommands_UpdateToolTip );
}
DISPATCH_MESSAGE( eHTMLCommands_UpdateToolTip );
}
}
else if ( m_bShowingToolTip )
{
@@ -2612,9 +2633,9 @@ bool CChromePainter::OnFileOpenDialog( CefRefPtr<CefBrowser> browser, bool bMult
{
if ( !cmd.BodyConst().files(i).empty() )
{
CPathString path( cmd.BodyConst().files(i).c_str() );
files.push_back( path.GetWCharPathPrePended() );
}
CPathString path( cmd.BodyConst().files(i).c_str() );
files.push_back( path.GetWCharPathPrePended() );
}
}
// if you have a DEBUG build and are crashing here it is because
@@ -2853,7 +2874,7 @@ void CClientHandler::SetMouseLocation( int nMouseX, int nMouseY )
m_nMouseScrolledY = nMouseY + m_Browser->HorizontalScroll();
m_bMouseFocus = true;
m_Browser->SendMouseMoveEvent( m_nMouseX, m_nMouseY, false );
}
}
}
//-----------------------------------------------------------------------------
@@ -2952,7 +2973,7 @@ const byte *CClientHandler::PComposedTextureData( uint32 iTexture )
VPROF_BUDGET( "CClientHandler::PTextureData", VPROF_BUDGETGROUP_VGUI );
return m_Painter.PComposedTextureData( iTexture );
}
}
//-----------------------------------------------------------------------------
@@ -3048,12 +3069,13 @@ void CCEFThread::ThreadLinkAtPosition( const CHTMLProtoBufMsg<CMsgLinkAtPosition
{
CefString pchURL;
int iClient = 0;
int bLiveLink = false;
int bInput = false;
int bLiveLink = false;
int bInput = false;
if ( BIsValidBrowserHandle( htmlCommand.BodyConst().browser_handle(), iClient ) )
{
if ( m_listClientHandlers[iClient]->GetBrowser() )
pchURL = m_listClientHandlers[iClient]->GetBrowser()->GetLinkAtPosition( htmlCommand.BodyConst().x(), htmlCommand.BodyConst().y(), bLiveLink, bInput );
m_listClientHandlers[iClient]->GetBrowser()->GetLinkAtPosition( htmlCommand.BodyConst().x(), htmlCommand.BodyConst().y(),
pchURL, bLiveLink, bInput);
}
CHTMLProtoBufMsg<CMsgLinkAtPositionResponse> cmd( eHTMLCommands_LinkAtPositionResponse );
@@ -3079,9 +3101,9 @@ void CCEFThread::ThreadZoomToElementAtPosition( const CHTMLProtoBufMsg<CMsgZoomT
if ( m_listClientHandlers[iClient]->GetBrowser() )
{
CefRect initialRect, finalRect;
float zoomLevel = m_listClientHandlers[iClient]->GetBrowser()->scalePageToFitElementAt(
htmlCommand.BodyConst().x(), htmlCommand.BodyConst().y(),
initialRect, finalRect );
float zoomLevel = m_listClientHandlers[iClient]->GetBrowser()->scalePageToFitElementAt(
htmlCommand.BodyConst().x(), htmlCommand.BodyConst().y(),
initialRect, finalRect );
int m_iBrowser = htmlCommand.BodyConst().browser_handle();
ThreadBrowserVerticalScrollBarSizeHelper( m_iBrowser, true );
ThreadBrowserHorizontalScrollBarSizeHelper( m_iBrowser, true );
@@ -3100,7 +3122,7 @@ void CCEFThread::ThreadZoomToElementAtPosition( const CHTMLProtoBufMsg<CMsgZoomT
}
}
}
}
}
//-----------------------------------------------------------------------------
@@ -3357,7 +3379,7 @@ void CCEFThread::ThreadMouseWheel( const CHTMLProtoBufMsg<CMsgMouseWheel> &htmlC
int nMouseX, nMouseY;
m_listClientHandlers[ iClient ]->GetMouseLocation( nMouseX, nMouseY );
browser->SendMouseWheelEvent( nMouseX, nMouseY, htmlCommand.BodyConst().delta() );
browser->SendMouseWheelEvent( nMouseX, nMouseY, 0, htmlCommand.BodyConst().delta() );
}
}
@@ -3374,7 +3396,13 @@ void CCEFThread::ThreadKeyTyped( const CHTMLProtoBufMsg<CMsgKeyChar> &htmlComman
if ( !browser.get() )
return;
browser->SendKeyEvent( KT_CHAR, htmlCommand.BodyConst().unichar(), 0, false, false );
CefKeyInfo keyInfo;
#ifdef OSX
keyInfo.character = htmlCommand.BodyConst().unichar();
#else
keyInfo.key = htmlCommand.BodyConst().unichar();
#endif
browser->SendKeyEvent( KT_CHAR, keyInfo, 0 );
}
}
@@ -3391,7 +3419,13 @@ void CCEFThread::ThreadKeyDown( const CHTMLProtoBufMsg<CMsgKeyDown> &htmlCommand
if ( !browser.get() )
return;
browser->SendKeyEvent( KT_KEYDOWN, htmlCommand.BodyConst().keycode(), htmlCommand.BodyConst().modifiers(), false, false );
CefKeyInfo keyInfo;
#ifdef OSX
keyInfo.keyCode = htmlCommand.BodyConst().keycode();
#else
keyInfo.key = htmlCommand.BodyConst().keycode();
#endif
browser->SendKeyEvent( KT_KEYDOWN, keyInfo, htmlCommand.BodyConst().modifiers() );
}
}
@@ -3408,7 +3442,13 @@ void CCEFThread::ThreadKeyUp( const CHTMLProtoBufMsg<CMsgKeyUp> &htmlCommand )
if ( !browser.get() )
return;
browser->SendKeyEvent( KT_KEYUP, htmlCommand.BodyConst().keycode(), htmlCommand.BodyConst().modifiers(), false, false );
CefKeyInfo keyInfo;
#ifdef OSX
keyInfo.keyCode = htmlCommand.BodyConst().keycode();
#else
keyInfo.key = htmlCommand.BodyConst().keycode();
#endif
browser->SendKeyEvent( KT_KEYUP, keyInfo, htmlCommand.BodyConst().modifiers() );
}
}