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 ae0189bd5fb9a91f4c76081cd3eed94f79d567dd..d03bea613d7b85567c968f758fa8d64d3dc6f263 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc @@ -937,13 +937,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, @@ -2332,17 +2332,18 @@ LRESULT HWNDMessageHandler::OnNCActivate(UINT message, 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) {