| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/shell/platform/windows/window_proc_delegate_manager.h" |
| |
| #include <algorithm> |
| |
| #include "flutter/shell/platform/embedder/embedder.h" |
| |
| namespace flutter { |
| |
| WindowProcDelegateManager::WindowProcDelegateManager() = default; |
| WindowProcDelegateManager::~WindowProcDelegateManager() = default; |
| |
| void WindowProcDelegateManager::RegisterTopLevelWindowProcDelegate( |
| FlutterDesktopWindowProcCallback callback, |
| void* user_data) { |
| UnregisterTopLevelWindowProcDelegate(callback); |
| |
| delegates_.push_back(WindowProcDelegate{ |
| .callback = callback, |
| .user_data = user_data, |
| }); |
| } |
| |
| void WindowProcDelegateManager::UnregisterTopLevelWindowProcDelegate( |
| FlutterDesktopWindowProcCallback callback) { |
| delegates_.erase( |
| std::remove_if(delegates_.begin(), delegates_.end(), |
| [&callback](const WindowProcDelegate& delegate) { |
| return delegate.callback == callback; |
| }), |
| delegates_.end()); |
| } |
| |
| std::optional<LRESULT> WindowProcDelegateManager::OnTopLevelWindowProc( |
| HWND hwnd, |
| UINT message, |
| WPARAM wparam, |
| LPARAM lparam) const { |
| std::optional<LRESULT> result; |
| for (const auto& delegate : delegates_) { |
| LPARAM handler_result; |
| // Stop as soon as any delegate indicates that it has handled the message. |
| if (delegate.callback(hwnd, message, wparam, lparam, delegate.user_data, |
| &handler_result)) { |
| result = handler_result; |
| break; |
| } |
| } |
| return result; |
| } |
| |
| } // namespace flutter |