From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: clavin 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 04b1419df5769716de7669b67e7a7f32546813c6..78c39f1659fed684dcaa3abcca9bd8592f4ed94f 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc @@ -907,13 +907,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, @@ -2252,17 +2252,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) {