1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: clavin <[email protected]>
- Date: Mon, 11 Dec 2023 20:43:34 -0300
- Subject: fix: activate background material on windows
- This patch adds a condition to the HWND message handler to allow windows
- with translucent background materials to become activated.
- It also ensures the lParam of WM_NCACTIVATE is set to -1 so as to not repaint
- the client area, which can lead to a title bar incorrectly being displayed in
- frameless windows.
- This patch likely can't be upstreamed as-is, as Chromium doesn't have
- this use case in mind currently.
- diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
- index 64aa90f0fcd7fb2a66b8ea98ab355c4f4f6ffa08..740f92ec4e355032d02138c87d6c4473c8abd3a1 100644
- --- a/ui/views/win/hwnd_message_handler.cc
- +++ b/ui/views/win/hwnd_message_handler.cc
- @@ -901,13 +901,13 @@ void HWNDMessageHandler::FrameTypeChanged() {
-
- void HWNDMessageHandler::PaintAsActiveChanged() {
- if (!delegate_->HasNonClientView() || !delegate_->CanActivate() ||
- - !delegate_->HasFrame() ||
- + (!delegate_->HasFrame() && !is_translucent_) ||
- (delegate_->GetFrameMode() == FrameMode::CUSTOM_DRAWN)) {
- return;
- }
-
- DefWindowProcWithRedrawLock(WM_NCACTIVATE, delegate_->ShouldPaintAsActive(),
- - 0);
- + delegate_->HasFrame() ? 0 : -1);
- }
-
- void HWNDMessageHandler::SetWindowIcons(const gfx::ImageSkia& window_icon,
- @@ -2254,17 +2254,18 @@ LRESULT HWNDMessageHandler::OnNCActivate(UINT message,
- if (IsVisible())
- delegate_->SchedulePaint();
-
- - // Calling DefWindowProc is only necessary if there's a system frame being
- - // drawn. Otherwise it can draw an incorrect title bar and cause visual
- - // corruption.
- - if (!delegate_->HasFrame() ||
- + // If the window is translucent, it may have the Mica background.
- + // In that case, it's necessary to call |DefWindowProc|, but we can
- + // pass -1 in the lParam to prevent any non-client area elements from
- + // being displayed.
- + if ((!delegate_->HasFrame() && !is_translucent_) ||
- delegate_->GetFrameMode() == FrameMode::CUSTOM_DRAWN) {
- SetMsgHandled(TRUE);
- return TRUE;
- }
-
- return DefWindowProcWithRedrawLock(WM_NCACTIVATE, paint_as_active || active,
- - 0);
- + delegate_->HasFrame() ? 0 : -1);
- }
-
- LRESULT HWNDMessageHandler::OnNCCalcSize(BOOL mode, LPARAM l_param) {
|