diff --git a/lib/src/common.dart b/lib/src/common.dart index 0052948..fe460bd 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -27,6 +27,8 @@ const String kNotifyFirstFrameRasterizedMethodName = const String kWindowMovedMethodName = 'windowMoved'; const String kWindowResizedMethodName = 'windowResized'; const String kWindowActivatedMethodName = 'windowActivated'; +const String kWindowMinimizedMethodName = 'windowMinimized'; +const String kWindowMaximizedMethodName = 'windowMaximized'; // GTK Exclusives: diff --git a/lib/src/platform/win32_window.dart b/lib/src/platform/win32_window.dart index d37ec23..05432ab 100644 --- a/lib/src/platform/win32_window.dart +++ b/lib/src/platform/win32_window.dart @@ -43,6 +43,30 @@ class Win32Window extends PlatformWindow { } break; } + case kWindowMinimizedMethodName: + { + try { + minimizedStreamController.add(await minimized); + } on AssertionError catch (_) { + // NOTE: [WindowsPlus.instance.hwnd] is `0` during fresh start until [WindowPlus.ensureInitialized] resolves. + } catch (exception, stacktrace) { + debugPrint(exception.toString()); + debugPrint(stacktrace.toString()); + } + break; + } + case kWindowMaximizedMethodName: + { + try { + maximizedStreamController.add(await maximized); + } on AssertionError catch (_) { + // NOTE: [WindowsPlus.instance.hwnd] is `0` during fresh start until [WindowPlus.ensureInitialized] resolves. + } catch (exception, stacktrace) { + debugPrint(exception.toString()); + debugPrint(stacktrace.toString()); + } + break; + } case kWindowMovedMethodName: { try { @@ -316,16 +340,16 @@ class Win32Window extends PlatformWindow { while (next_hwnd != hwnd) { if (IsWindowVisible(next_hwnd) == TRUE) { final cloaked = calloc(); - final dwmWindowAttribute = DwmGetWindowAttribute(next_hwnd, - DWMWINDOWATTRIBUTE.DWMWA_CLOAKED, - cloaked, + final dwmWindowAttribute = DwmGetWindowAttribute( + next_hwnd, + DWMWINDOWATTRIBUTE.DWMWA_CLOAKED, + cloaked, sizeOf(), ); - if (dwmWindowAttribute != S_OK) - { + if (dwmWindowAttribute != S_OK) { cloaked.value = 0; } - if (cloaked.value == 0){ + if (cloaked.value == 0) { SetForegroundWindow(next_hwnd); free(cloaked); return; diff --git a/windows/common.h b/windows/common.h index 1b2eccc..df67b0c 100644 --- a/windows/common.h +++ b/windows/common.h @@ -16,6 +16,8 @@ static constexpr auto kNotifyFirstFrameRasterizedMethodName = static constexpr auto kWindowMovedMethodName = "windowMoved"; static constexpr auto kWindowResizedMethodName = "windowResized"; static constexpr auto kWindowActivatedMethodName = "windowActivated"; +static constexpr auto kWindowMinimizedMethodName = "windowMinimized"; +static constexpr auto kWindowMaximizedMethodName = "windowMaximized"; static constexpr auto kSingleInstanceDataReceivedMethodName = "singleInstanceDataReceived"; static constexpr auto kWindows10RTM = 10240; diff --git a/windows/window_plus_plugin.cpp b/windows/window_plus_plugin.cpp index 40d18f5..2543d37 100644 --- a/windows/window_plus_plugin.cpp +++ b/windows/window_plus_plugin.cpp @@ -394,6 +394,34 @@ std::optional WindowPlusPlugin::WindowProcDelegate( AlignChildContent(); // Notify Flutter. if (enable_event_streams_) { + switch (wparam) + { + case SIZE_MINIMIZED: + minimized_ = true; + maximized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + return 0; + case SIZE_MAXIMIZED: + maximized_ = true; + if (minimized_) { + minimized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + } + channel_->InvokeMethod(kWindowMaximizedMethodName, nullptr, nullptr); + break; + case SIZE_RESTORED: + if (minimized_) { + minimized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + } + else if (maximized_) { + maximized_ = false; + channel_->InvokeMethod(kWindowMaximizedMethodName, nullptr, nullptr); + } + break; + default: + break; + } channel_->InvokeMethod(kWindowResizedMethodName, nullptr, nullptr); } return 0; @@ -476,6 +504,34 @@ std::optional WindowPlusPlugin::FallbackWindowProcDelegate( AlignChildContent(); // Notify Flutter. if (enable_event_streams_) { + switch (wparam) + { + case SIZE_MINIMIZED: + minimized_ = true; + maximized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + return 0; + case SIZE_MAXIMIZED: + maximized_ = true; + if (minimized_) { + minimized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + } + channel_->InvokeMethod(kWindowMaximizedMethodName, nullptr, nullptr); + break; + case SIZE_RESTORED: + if (minimized_) { + minimized_ = false; + channel_->InvokeMethod(kWindowMinimizedMethodName, nullptr, nullptr); + } + else if (maximized_) { + maximized_ = false; + channel_->InvokeMethod(kWindowMaximizedMethodName, nullptr, nullptr); + } + break; + default: + break; + } channel_->InvokeMethod(kWindowResizedMethodName, nullptr, nullptr); } return 0; diff --git a/windows/window_plus_plugin.h b/windows/window_plus_plugin.h index 29350ee..5e31566 100644 --- a/windows/window_plus_plugin.h +++ b/windows/window_plus_plugin.h @@ -112,6 +112,8 @@ class WindowPlusPlugin : public flutter::Plugin { bool enable_custom_frame_ = false; bool enable_event_streams_ = false; bool first_frame_rasterized_ = false; + bool minimized_ = false; + bool maximized_ = false; // DO NOT ACCESS THIS MEMBER DIRECTLY. Use |GetMonitors| instead. std::vector monitors_ = {}; };