Skip to content

Commit

Permalink
Fix OpenTTD#11894: Defer window OnResize event to avoid processing mu…
Browse files Browse the repository at this point in the history
…ltiple times per input tick. (OpenTTD#11900)
  • Loading branch information
PeterN committed Jan 27, 2024
1 parent 8c5ad1a commit d3c673e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 4 deletions.
29 changes: 25 additions & 4 deletions src/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1447,8 +1447,8 @@ void Window::FindWindowPlacementAndResize(int def_width, int def_height)
ResizeWindow(this, enlarge_x, enlarge_y);
/* ResizeWindow() calls this->OnResize(). */
} else {
/* Always call OnResize; that way the scrollbars and matrices get initialized. */
this->OnResize();
/* Schedule OnResize; that way the scrollbars and matrices get initialized. */
this->ScheduleResize();
}

int nx = this->left;
Expand Down Expand Up @@ -2050,8 +2050,8 @@ void ResizeWindow(Window *w, int delta_x, int delta_y, bool clamp_to_screen)

EnsureVisibleCaption(w, w->left, w->top);

/* Always call OnResize to make sure everything is initialised correctly if it needs to be. */
w->OnResize();
/* Schedule OnResize to make sure everything is initialised correctly if it needs to be. */
w->ScheduleResize();
w->SetDirty();
}

Expand Down Expand Up @@ -3054,6 +3054,7 @@ void UpdateWindows()

/* Process invalidations before anything else. */
for (Window *w : Window::Iterate()) {
w->ProcessScheduledResize();
w->ProcessScheduledInvalidations();
w->ProcessHighlightedInvalidations();
}
Expand Down Expand Up @@ -3111,6 +3112,26 @@ void SetWindowClassesDirty(WindowClass cls)
}
}

/**
* Mark this window as resized and in need of OnResize() event.
*/
void Window::ScheduleResize()
{
this->scheduled_resize = true;
}

/**
* Process scheduled OnResize() event.
*/
void Window::ProcessScheduledResize()
{
/* Sometimes OnResize() resizes the window again, in which case we can reprocess immediately. */
while (this->scheduled_resize) {
this->scheduled_resize = false;
this->OnResize();
}
}

/**
* Mark this window's data as invalid (in need of re-computing)
* @param data The data to invalidate with
Expand Down
3 changes: 3 additions & 0 deletions src/window_gui.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ struct Window : ZeroedMemoryAllocator {
virtual void FindWindowPlacementAndResize(int def_width, int def_height);

std::vector<int> scheduled_invalidation_data; ///< Data of scheduled OnInvalidateData() calls.
bool scheduled_resize; ///< Set if window has been resized.

/* Protected to prevent deletion anywhere outside Window::DeleteClosedWindows(). */
virtual ~Window();
Expand Down Expand Up @@ -559,6 +560,8 @@ struct Window : ZeroedMemoryAllocator {

void SetShaded(bool make_shaded);

void ScheduleResize();
void ProcessScheduledResize();
void InvalidateData(int data = 0, bool gui_scope = true);
void ProcessScheduledInvalidations();
void ProcessHighlightedInvalidations();
Expand Down

0 comments on commit d3c673e

Please sign in to comment.