diff --git a/packages/desktop_webview_window/lib/src/webview.dart b/packages/desktop_webview_window/lib/src/webview.dart index 9a95f1c3..c5073f9b 100644 --- a/packages/desktop_webview_window/lib/src/webview.dart +++ b/packages/desktop_webview_window/lib/src/webview.dart @@ -62,6 +62,9 @@ abstract class Webview { /// Activates the webview window (giving it the focus) Future bringToForeground({bool maximized = false}); + /// get position, extents and maximization info of the webview window + Future?> getPositionalParameters(); + /// Reload the current page. Future reload(); diff --git a/packages/desktop_webview_window/lib/src/webview_impl.dart b/packages/desktop_webview_window/lib/src/webview_impl.dart index 7d372c2e..33be9bfa 100644 --- a/packages/desktop_webview_window/lib/src/webview_impl.dart +++ b/packages/desktop_webview_window/lib/src/webview_impl.dart @@ -200,6 +200,13 @@ class WebviewImpl extends Webview { }); } + @override + Future?> getPositionalParameters() async { + return await channel.invokeMethod("getPositionalParameters", { + "viewId": viewId, + }); + } + @override Future back() { return channel.invokeMethod("back", {"viewId": viewId}); diff --git a/packages/desktop_webview_window/windows/web_view_window_plugin.cc b/packages/desktop_webview_window/windows/web_view_window_plugin.cc index 8607666b..03e16180 100644 --- a/packages/desktop_webview_window/windows/web_view_window_plugin.cc +++ b/packages/desktop_webview_window/windows/web_view_window_plugin.cc @@ -209,6 +209,18 @@ void WebviewWindowPlugin::HandleMethodCall( } windows_[window_id]->bringToForeground(maximized); result->Success(); + } else if (method_call.method_name() == "getPositionalParameters") { + auto* arguments = std::get_if(method_call.arguments()); + auto window_id = arguments->at(flutter::EncodableValue("viewId")).LongValue(); + if (!windows_.count(window_id)) { + result->Error("0", "can not find webview window for id"); + return; + } + if (!windows_[window_id]->GetWebView()) { + result->Error("0", "webview window not ready"); + return; + } + windows_[window_id]->getPositionalParameters(std::move(result)); } else if (method_call.method_name() == "reload") { auto *arguments = std::get_if(method_call.arguments()); auto window_id = arguments->at(flutter::EncodableValue("viewId")).LongValue(); diff --git a/packages/desktop_webview_window/windows/webview_window.cc b/packages/desktop_webview_window/windows/webview_window.cc index f4d2d1a6..c2bcff0b 100644 --- a/packages/desktop_webview_window/windows/webview_window.cc +++ b/packages/desktop_webview_window/windows/webview_window.cc @@ -155,6 +155,21 @@ void WebviewWindow::bringToForeground(bool maximized) { } } +void WebviewWindow::getPositionalParameters(std::unique_ptr> completer) { + RECT rc; + GetWindowRect(hwnd_.get(), &rc); + + std::unique_ptr wp(new WINDOWPLACEMENT); + GetWindowPlacement(hwnd_.get(), wp.get()); + std::map m{ + {"left", rc.left}, + {"top", rc.top}, + {"width", rc.right-rc.left}, + {"height", rc.bottom-rc.top}, + {"maximized", wp->showCmd==SW_MAXIMIZE}}; + completer->Success(flutter::EncodableValue(m)); +} + // static LRESULT CALLBACK WebviewWindow::WndProc( diff --git a/packages/desktop_webview_window/windows/webview_window.h b/packages/desktop_webview_window/windows/webview_window.h index 6bc5bc65..dc4054b4 100644 --- a/packages/desktop_webview_window/windows/webview_window.h +++ b/packages/desktop_webview_window/windows/webview_window.h @@ -62,6 +62,8 @@ class WebviewWindow { void bringToForeground(bool maximized); + void getPositionalParameters(std::unique_ptr> completer); + [[nodiscard]] const std::unique_ptr &GetWebView() const { return web_view_; }