@ -751,25 +751,21 @@ ImGuiIO::ImGuiIO()
IniSavingRate = 5.0f ;
IniFilename = " imgui.ini " ;
LogFilename = " imgui_log.txt " ;
Fonts = & GImDefaultFontAtlas ;
FontGlobalScale = 1.0f ;
FontDefault = NULL ;
DisplayFramebufferScale = ImVec2 ( 1.0f , 1.0f ) ;
MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
MousePosPrev = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
MouseDoubleClickTime = 0.30f ;
MouseDoubleClickMaxDist = 6.0f ;
MouseDragThreshold = 6.0f ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( MouseDownDuration ) ; i + + )
MouseDownDuration [ i ] = MouseDownDurationPrev [ i ] = - 1.0f ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( KeysDownDuration ) ; i + + )
KeysDownDuration [ i ] = KeysDownDurationPrev [ i ] = - 1.0f ;
for ( int i = 0 ; i < ImGuiKey_COUNT ; i + + )
KeyMap [ i ] = - 1 ;
KeyRepeatDelay = 0.250f ;
KeyRepeatRate = 0.050f ;
UserData = NULL ;
Fonts = & GImDefaultFontAtlas ;
FontGlobalScale = 1.0f ;
FontDefault = NULL ;
FontAllowUserScaling = false ;
DisplayFramebufferScale = ImVec2 ( 1.0f , 1.0f ) ;
DisplayVisibleMin = DisplayVisibleMax = ImVec2 ( 0.0f , 0.0f ) ;
// User functions
RenderDrawListsFn = NULL ;
MemAllocFn = malloc ;
@ -780,6 +776,13 @@ ImGuiIO::ImGuiIO()
ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl ;
ImeWindowHandle = NULL ;
// Input (NB: we already have memset zero the entire structure)
MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
MousePosPrev = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
MouseDragThreshold = 6.0f ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( MouseDownDuration ) ; i + + ) MouseDownDuration [ i ] = MouseDownDurationPrev [ i ] = - 1.0f ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( KeysDownDuration ) ; i + + ) KeysDownDuration [ i ] = KeysDownDurationPrev [ i ] = - 1.0f ;
// Set OS X style defaults based on __APPLE__ compile time flag
# ifdef __APPLE__
OSXBehaviors = true ;
@ -1768,14 +1771,13 @@ ImGuiWindow::ImGuiWindow(const char* name)
Name = ImStrdup ( name ) ;
ID = ImHash ( name , 0 ) ;
IDStack . push_back ( ID ) ;
MoveId = GetID ( " #MOVE " ) ;
Flags = 0 ;
OrderWithinParent = 0 ;
PosFloat = Pos = ImVec2 ( 0.0f , 0.0f ) ;
Size = SizeFull = ImVec2 ( 0.0f , 0.0f ) ;
SizeContents = SizeContentsExplicit = ImVec2 ( 0.0f , 0.0f ) ;
WindowPadding = ImVec2 ( 0.0f , 0.0f ) ;
MoveId = GetID ( " #MOVE " ) ;
Scroll = ImVec2 ( 0.0f , 0.0f ) ;
ScrollTarget = ImVec2 ( FLT_MAX , FLT_MAX ) ;
ScrollTargetCenterRatio = ImVec2 ( 0.5f , 0.5f ) ;
@ -2156,6 +2158,20 @@ void ImGui::NewFrame()
g . RenderDrawData . CmdLists = NULL ;
g . RenderDrawData . CmdListsCount = g . RenderDrawData . TotalVtxCount = g . RenderDrawData . TotalIdxCount = 0 ;
// Clear reference to active widget if the widget isn't alive anymore
g . HoveredIdPreviousFrame = g . HoveredId ;
g . HoveredId = 0 ;
g . HoveredIdAllowOverlap = false ;
if ( ! g . ActiveIdIsAlive & & g . ActiveIdPreviousFrame = = g . ActiveId & & g . ActiveId ! = 0 )
ClearActiveID ( ) ;
g . ActiveIdPreviousFrame = g . ActiveId ;
g . ActiveIdIsAlive = false ;
g . ActiveIdIsJustActivated = false ;
// Update keyboard input state
memcpy ( g . IO . KeysDownDurationPrev , g . IO . KeysDownDuration , sizeof ( g . IO . KeysDownDuration ) ) ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . IO . KeysDown ) ; i + + )
g . IO . KeysDownDuration [ i ] = g . IO . KeysDown [ i ] ? ( g . IO . KeysDownDuration [ i ] < 0.0f ? 0.0f : g . IO . KeysDownDuration [ i ] + g . IO . DeltaTime ) : - 1.0f ;
// Update mouse input state
// If mouse just appeared or disappeared (usually denoted by -FLT_MAX component, but in reality we test for -256000.0f) we cancel out movement in MouseDelta
if ( IsMousePosValid ( & g . IO . MousePos ) & & IsMousePosValid ( & g . IO . MousePosPrev ) )
@ -2190,9 +2206,6 @@ void ImGui::NewFrame()
g . IO . MouseDragMaxDistanceSqr [ i ] = ImMax ( g . IO . MouseDragMaxDistanceSqr [ i ] , ImLengthSqr ( g . IO . MousePos - g . IO . MouseClickedPos [ i ] ) ) ;
}
}
memcpy ( g . IO . KeysDownDurationPrev , g . IO . KeysDownDuration , sizeof ( g . IO . KeysDownDuration ) ) ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . IO . KeysDown ) ; i + + )
g . IO . KeysDownDuration [ i ] = g . IO . KeysDown [ i ] ? ( g . IO . KeysDownDuration [ i ] < 0.0f ? 0.0f : g . IO . KeysDownDuration [ i ] + g . IO . DeltaTime ) : - 1.0f ;
// Calculate frame-rate for the user, as a purely luxurious feature
g . FramerateSecPerFrameAccum + = g . IO . DeltaTime - g . FramerateSecPerFrame [ g . FramerateSecPerFrameIdx ] ;
@ -2200,16 +2213,6 @@ void ImGui::NewFrame()
g . FramerateSecPerFrameIdx = ( g . FramerateSecPerFrameIdx + 1 ) % IM_ARRAYSIZE ( g . FramerateSecPerFrame ) ;
g . IO . Framerate = 1.0f / ( g . FramerateSecPerFrameAccum / ( float ) IM_ARRAYSIZE ( g . FramerateSecPerFrame ) ) ;
// Clear reference to active widget if the widget isn't alive anymore
g . HoveredIdPreviousFrame = g . HoveredId ;
g . HoveredId = 0 ;
g . HoveredIdAllowOverlap = false ;
if ( ! g . ActiveIdIsAlive & & g . ActiveIdPreviousFrame = = g . ActiveId & & g . ActiveId ! = 0 )
ClearActiveID ( ) ;
g . ActiveIdPreviousFrame = g . ActiveId ;
g . ActiveIdIsAlive = false ;
g . ActiveIdIsJustActivated = false ;
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering). Only valid for root windows.
if ( g . MovedWindowMoveId & & g . MovedWindowMoveId = = g . ActiveId )
{