@ -755,7 +755,8 @@ static void NavUpdate();
static void NavUpdateWindowing ( ) ;
static void NavProcessItem ( ImGuiWindow * window , const ImRect & nav_bb , const ImGuiID id ) ;
static void UpdateMovingWindow ( ) ;
static void NewFrameUpdateMovingWindow ( ) ;
static void NewFrameUpdateMouseInputs ( ) ;
static void UpdateManualResize ( ImGuiWindow * window , const ImVec2 & size_auto_fit , int * border_held , int resize_grip_count , ImU32 resize_grip_col [ 4 ] ) ;
static void FocusFrontMostActiveWindow ( ImGuiWindow * ignore_window ) ;
}
@ -3249,7 +3250,7 @@ static void ImGui::NavUpdate()
# endif
}
static void ImGui : : UpdateMovingWindow( )
static void ImGui : : NewFrame UpdateMovingWindow( )
{
ImGuiContext & g = * GImGui ;
if ( g . MovingWindow & & g . MovingWindow - > MoveId = = g . ActiveId & & g . ActiveIdSource = = ImGuiInputSource_Mouse )
@ -3288,6 +3289,59 @@ static void ImGui::UpdateMovingWindow()
}
}
static void ImGui : : NewFrameUpdateMouseInputs ( )
{
ImGuiContext & g = * GImGui ;
if ( g . IO . ConfigFlags & ImGuiConfigFlags_NoMouse )
{
g . IO . MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
memset ( g . IO . MouseDown , 0 , sizeof ( g . IO . MouseDown ) ) ;
}
// 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 ( ImGui : : IsMousePosValid ( & g . IO . MousePos ) & & ImGui : : IsMousePosValid ( & g . IO . MousePosPrev ) )
g . IO . MouseDelta = g . IO . MousePos - g . IO . MousePosPrev ;
else
g . IO . MouseDelta = ImVec2 ( 0.0f , 0.0f ) ;
if ( g . IO . MouseDelta . x ! = 0.0f | | g . IO . MouseDelta . y ! = 0.0f )
g . NavDisableMouseHover = false ;
g . IO . MousePosPrev = g . IO . MousePos ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . IO . MouseDown ) ; i + + )
{
g . IO . MouseClicked [ i ] = g . IO . MouseDown [ i ] & & g . IO . MouseDownDuration [ i ] < 0.0f ;
g . IO . MouseReleased [ i ] = ! g . IO . MouseDown [ i ] & & g . IO . MouseDownDuration [ i ] > = 0.0f ;
g . IO . MouseDownDurationPrev [ i ] = g . IO . MouseDownDuration [ i ] ;
g . IO . MouseDownDuration [ i ] = g . IO . MouseDown [ i ] ? ( g . IO . MouseDownDuration [ i ] < 0.0f ? 0.0f : g . IO . MouseDownDuration [ i ] + g . IO . DeltaTime ) : - 1.0f ;
g . IO . MouseDoubleClicked [ i ] = false ;
if ( g . IO . MouseClicked [ i ] )
{
if ( g . Time - g . IO . MouseClickedTime [ i ] < g . IO . MouseDoubleClickTime )
{
if ( ImLengthSqr ( g . IO . MousePos - g . IO . MouseClickedPos [ i ] ) < g . IO . MouseDoubleClickMaxDist * g . IO . MouseDoubleClickMaxDist )
g . IO . MouseDoubleClicked [ i ] = true ;
g . IO . MouseClickedTime [ i ] = - FLT_MAX ; // so the third click isn't turned into a double-click
}
else
{
g . IO . MouseClickedTime [ i ] = g . Time ;
}
g . IO . MouseClickedPos [ i ] = g . IO . MousePos ;
g . IO . MouseDragMaxDistanceAbs [ i ] = ImVec2 ( 0.0f , 0.0f ) ;
g . IO . MouseDragMaxDistanceSqr [ i ] = 0.0f ;
}
else if ( g . IO . MouseDown [ i ] )
{
ImVec2 mouse_delta = g . IO . MousePos - g . IO . MouseClickedPos [ i ] ;
g . IO . MouseDragMaxDistanceAbs [ i ] . x = ImMax ( g . IO . MouseDragMaxDistanceAbs [ i ] . x , mouse_delta . x < 0.0f ? - mouse_delta . x : mouse_delta . x ) ;
g . IO . MouseDragMaxDistanceAbs [ i ] . y = ImMax ( g . IO . MouseDragMaxDistanceAbs [ i ] . y , mouse_delta . y < 0.0f ? - mouse_delta . y : mouse_delta . y ) ;
g . IO . MouseDragMaxDistanceSqr [ i ] = ImMax ( g . IO . MouseDragMaxDistanceSqr [ i ] , ImLengthSqr ( mouse_delta ) ) ;
}
if ( g . IO . MouseClicked [ i ] ) // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
g . NavDisableMouseHover = false ;
}
}
void ImGui : : NewFrame ( )
{
IM_ASSERT ( GImGui ! = NULL & & " No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()? " ) ;
@ -3318,6 +3372,14 @@ void ImGui::NewFrame()
g . SettingsLoaded = true ;
}
// Save settings (with a delay so we don't spam disk too much)
if ( g . SettingsDirtyTimer > 0.0f )
{
g . SettingsDirtyTimer - = g . IO . DeltaTime ;
if ( g . SettingsDirtyTimer < = 0.0f )
SaveIniSettingsToDisk ( g . IO . IniFilename ) ;
}
g . Time + = g . IO . DeltaTime ;
g . FrameCount + = 1 ;
g . TooltipOverrideCount = 0 ;
@ -3372,53 +3434,7 @@ void ImGui::NewFrame()
NavUpdate ( ) ;
// 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 ( g . IO . ConfigFlags & ImGuiConfigFlags_NoMouse )
{
g . IO . MousePos = ImVec2 ( - FLT_MAX , - FLT_MAX ) ;
memset ( g . IO . MouseDown , 0 , sizeof ( g . IO . MouseDown ) ) ;
}
if ( IsMousePosValid ( & g . IO . MousePos ) & & IsMousePosValid ( & g . IO . MousePosPrev ) )
g . IO . MouseDelta = g . IO . MousePos - g . IO . MousePosPrev ;
else
g . IO . MouseDelta = ImVec2 ( 0.0f , 0.0f ) ;
if ( g . IO . MouseDelta . x ! = 0.0f | | g . IO . MouseDelta . y ! = 0.0f )
g . NavDisableMouseHover = false ;
g . IO . MousePosPrev = g . IO . MousePos ;
for ( int i = 0 ; i < IM_ARRAYSIZE ( g . IO . MouseDown ) ; i + + )
{
g . IO . MouseClicked [ i ] = g . IO . MouseDown [ i ] & & g . IO . MouseDownDuration [ i ] < 0.0f ;
g . IO . MouseReleased [ i ] = ! g . IO . MouseDown [ i ] & & g . IO . MouseDownDuration [ i ] > = 0.0f ;
g . IO . MouseDownDurationPrev [ i ] = g . IO . MouseDownDuration [ i ] ;
g . IO . MouseDownDuration [ i ] = g . IO . MouseDown [ i ] ? ( g . IO . MouseDownDuration [ i ] < 0.0f ? 0.0f : g . IO . MouseDownDuration [ i ] + g . IO . DeltaTime ) : - 1.0f ;
g . IO . MouseDoubleClicked [ i ] = false ;
if ( g . IO . MouseClicked [ i ] )
{
if ( g . Time - g . IO . MouseClickedTime [ i ] < g . IO . MouseDoubleClickTime )
{
if ( ImLengthSqr ( g . IO . MousePos - g . IO . MouseClickedPos [ i ] ) < g . IO . MouseDoubleClickMaxDist * g . IO . MouseDoubleClickMaxDist )
g . IO . MouseDoubleClicked [ i ] = true ;
g . IO . MouseClickedTime [ i ] = - FLT_MAX ; // so the third click isn't turned into a double-click
}
else
{
g . IO . MouseClickedTime [ i ] = g . Time ;
}
g . IO . MouseClickedPos [ i ] = g . IO . MousePos ;
g . IO . MouseDragMaxDistanceAbs [ i ] = ImVec2 ( 0.0f , 0.0f ) ;
g . IO . MouseDragMaxDistanceSqr [ i ] = 0.0f ;
}
else if ( g . IO . MouseDown [ i ] )
{
ImVec2 mouse_delta = g . IO . MousePos - g . IO . MouseClickedPos [ i ] ;
g . IO . MouseDragMaxDistanceAbs [ i ] . x = ImMax ( g . IO . MouseDragMaxDistanceAbs [ i ] . x , mouse_delta . x < 0.0f ? - mouse_delta . x : mouse_delta . x ) ;
g . IO . MouseDragMaxDistanceAbs [ i ] . y = ImMax ( g . IO . MouseDragMaxDistanceAbs [ i ] . y , mouse_delta . y < 0.0f ? - mouse_delta . y : mouse_delta . y ) ;
g . IO . MouseDragMaxDistanceSqr [ i ] = ImMax ( g . IO . MouseDragMaxDistanceSqr [ i ] , ImLengthSqr ( mouse_delta ) ) ;
}
if ( g . IO . MouseClicked [ i ] ) // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
g . NavDisableMouseHover = false ;
}
NewFrameUpdateMouseInputs ( ) ;
// Calculate frame-rate for the user, as a purely luxurious feature
g . FramerateSecPerFrameAccum + = g . IO . DeltaTime - g . FramerateSecPerFrame [ g . FramerateSecPerFrameIdx ] ;
@ -3427,15 +3443,7 @@ void ImGui::NewFrame()
g . IO . Framerate = 1.0f / ( g . FramerateSecPerFrameAccum / ( float ) IM_ARRAYSIZE ( g . FramerateSecPerFrame ) ) ;
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
UpdateMovingWindow ( ) ;
// Delay saving settings so we don't spam disk too much
if ( g . SettingsDirtyTimer > 0.0f )
{
g . SettingsDirtyTimer - = g . IO . DeltaTime ;
if ( g . SettingsDirtyTimer < = 0.0f )
SaveIniSettingsToDisk ( g . IO . IniFilename ) ;
}
NewFrameUpdateMovingWindow ( ) ;
// Find the window we are hovering
// - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow.