aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/Window.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-17 13:52:52 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-17 13:52:52 +0800
commitf7c4d19df66c602d74795e98ce2ee4390d06fbb4 (patch)
tree5d91dc18ae8129652d4c5b88234d0bb7b93dcf13 /src/ui/controls/Window.cpp
parentc9f31440d65a867e2316e9a19ee3f5db2d0e53a7 (diff)
downloadcru-f7c4d19df66c602d74795e98ce2ee4390d06fbb4.tar.gz
cru-f7c4d19df66c602d74795e98ce2ee4390d06fbb4.tar.bz2
cru-f7c4d19df66c602d74795e98ce2ee4390d06fbb4.zip
Harden delete after free.
Diffstat (limited to 'src/ui/controls/Window.cpp')
-rw-r--r--src/ui/controls/Window.cpp33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/ui/controls/Window.cpp b/src/ui/controls/Window.cpp
index e6abc48d..c82b2485 100644
--- a/src/ui/controls/Window.cpp
+++ b/src/ui/controls/Window.cpp
@@ -265,16 +265,6 @@ void Window::SetOverrideCursor(std::shared_ptr<platform::gui::ICursor> cursor) {
bool Window::IsInEventHandling() { return event_handling_count_; }
-void Window::UpdateCursor() {
- if (override_cursor_) {
- native_window_->SetCursor(override_cursor_);
- } else {
- const auto capture = GetMouseCaptureControl();
- native_window_->SetCursor(
- (capture ? capture : GetMouseHoverControl())->GetInheritedCursor());
- }
-}
-
void Window::OnNativeDestroy(platform::gui::INativeWindow* window,
std::nullptr_t) {
CRU_UNUSED(window)
@@ -428,4 +418,27 @@ void Window::DispatchMouseHoverControlChangeEvent(Control* old_control,
}
}
+void Window::UpdateCursor() {
+ if (override_cursor_) {
+ native_window_->SetCursor(override_cursor_);
+ } else {
+ const auto capture = GetMouseCaptureControl();
+ native_window_->SetCursor(
+ (capture ? capture : GetMouseHoverControl())->GetInheritedCursor());
+ }
+}
+
+void Window::NotifyControlDestroyed(Control* control) {
+ if (focus_control_->HasAncestor(control)) {
+ focus_control_ = control->GetParent();
+ }
+
+ if (mouse_captured_control_->HasAncestor(control)) {
+ mouse_captured_control_ = control->GetParent();
+ }
+
+ if (mouse_hover_control_->HasAncestor(control)) {
+ mouse_hover_control_ = control->GetParent();
+ }
+}
} // namespace cru::ui::controls