blob: 8fab1f6360c8c0e25ced346b760082d12c44a792 [file] [log] [blame]
// 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