Chromium Code Reviews| Index: ui/views/widget/native_widget_win.cc |
| diff --git a/ui/views/widget/native_widget_win.cc b/ui/views/widget/native_widget_win.cc |
| index ede049e6e11767a0bf57947d692050ca3158dc63..216b1fba752e05cca8a8d885b1da496397fc78cc 100644 |
| --- a/ui/views/widget/native_widget_win.cc |
| +++ b/ui/views/widget/native_widget_win.cc |
| @@ -321,6 +321,21 @@ const int kCustomObjectID = 1; |
| const int kDragFrameWindowAlpha = 200; |
| +struct FindOwnedWindowsData { |
| + HWND window; |
| + std::vector<Widget*> owned_widgets; |
| +}; |
| + |
| +BOOL CALLBACK FindOwnedWindowsCallback(HWND hwnd, LPARAM param) { |
| + FindOwnedWindowsData* data = reinterpret_cast<FindOwnedWindowsData*>(param); |
| + if (GetWindow(hwnd, GW_OWNER) == data->window) { |
| + Widget* widget = Widget::GetWidgetForNativeView(hwnd); |
| + if (widget) |
| + data->owned_widgets.push_back(widget); |
| + } |
| + return TRUE; |
| +} |
| + |
| } // namespace |
| // static |
| @@ -891,6 +906,9 @@ void NativeWidgetWin::Hide() { |
| SetWindowPos(NULL, 0, 0, 0, 0, |
| SWP_HIDEWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | |
| SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER); |
| + |
| + if (!GetParent()) |
| + NotifyOwnedWindowsParentClosing(); |
|
oshima
2012/04/26 03:05:27
Can a widget be closed by Windows?
sky
2012/04/26 03:54:53
Do you mean can windows close out from under us? Y
|
| } |
| } |
| @@ -2486,6 +2504,15 @@ void NativeWidgetWin::RestoreEnabledIfNecessary() { |
| } |
| } |
| +void NativeWidgetWin::NotifyOwnedWindowsParentClosing() { |
| + FindOwnedWindowsData data; |
| + data.window = hwnd(); |
| + EnumThreadWindows(GetCurrentThreadId(), FindOwnedWindowsCallback, |
| + reinterpret_cast<LPARAM>(&data)); |
| + for (size_t i = 0; i < data.owned_widgets.size(); ++i) |
| + data.owned_widgets[i]->OnOwnedParentClosing(); |
| +} |
| + |
| void NativeWidgetWin::DispatchKeyEventPostIME(const KeyEvent& key) { |
| SetMsgHandled(delegate_->OnKeyEvent(key)); |
| } |