electron/patches/common/chromium/disable-redraw-lock.patch
2019-03-08 15:06:16 -08:00

76 lines
3.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Heilig Benedek <benecene@gmail.com>
Date: Thu, 20 Sep 2018 17:47:54 -0700
Subject: disable-redraw-lock.patch
Chromium uses a custom window titlebar implementation on Windows when DWM
is disabled (Windows 7 and earlier, non Aero theme). The native titlebar
sometimes painted over this custom titlebar, so a workaround was put in
place to lock redraws in reaction to certain events if DWM is disabled,
since the code assumes that in that case, the custom titlebar is painted.
Electron forces the use of the native titlebar, which the workaround doesn't
take into account, and still locks redraws, causing weird repainting issues
in electron (and other applications). This patch provides a way to disable
the redraw locking mechanism, which fixes these issues. The electron issue
can be found at https://github.com/electron/electron/issues/1821
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index 6fa8cd0846d253d2bf2c3ff07ff0234ee31a270a..2f7ebbb8453a5f55f07b9ee4cff9eb7ef29dc2e4 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -290,6 +290,10 @@ const int kSynthesizedMouseMessagesTimeDifference = 500;
} // namespace
+bool HWNDMessageHandlerDelegate::HasNativeFrame() const {
+ return false;
+}
+
// A scoping class that prevents a window from being able to redraw in response
// to invalidations that may occur within it for the lifetime of the object.
//
@@ -341,6 +345,7 @@ class HWNDMessageHandler::ScopedRedrawLock {
cancel_unlock_(false),
should_lock_(owner_->IsVisible() && !owner->HasChildRenderingWindow() &&
::IsWindow(hwnd_) &&
+ !owner_->HasNativeFrame() &&
(!(GetWindowLong(hwnd_, GWL_STYLE) & WS_CAPTION) ||
!ui::win::IsAeroGlassEnabled())) {
if (should_lock_)
@@ -942,6 +947,10 @@ bool HWNDMessageHandler::HasChildRenderingWindow() {
hwnd());
}
+bool HWNDMessageHandler::HasNativeFrame() {
+ return delegate_->HasNativeFrame();
+}
+
////////////////////////////////////////////////////////////////////////////////
// HWNDMessageHandler, gfx::WindowImpl overrides:
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index 925996e356994bf27939565beb9663c4416de1bc..8c2b5fc09da64a4766c1918eee34d4cfe651958d 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -183,6 +183,8 @@ class VIEWS_EXPORT HWNDMessageHandler : public gfx::WindowImpl,
typedef std::set<DWORD> TouchIDs;
enum class DwmFrameState { OFF, ON };
+ bool HasNativeFrame();
+
// Overridden from WindowImpl:
HICON GetDefaultWindowIcon() const override;
HICON GetSmallWindowIcon() const override;
diff --git a/ui/views/win/hwnd_message_handler_delegate.h b/ui/views/win/hwnd_message_handler_delegate.h
index a3c4e34bd26891e1bb98bc47038700da7e5a6b94..a919147ef1d46fe562ac74cdf515ae2d3ff8e2c4 100644
--- a/ui/views/win/hwnd_message_handler_delegate.h
+++ b/ui/views/win/hwnd_message_handler_delegate.h
@@ -46,6 +46,8 @@ class VIEWS_EXPORT HWNDMessageHandlerDelegate {
// True if the widget associated with this window has a non-client view.
virtual bool HasNonClientView() const = 0;
+ virtual bool HasNativeFrame() const;
+
// Returns who we want to be drawing the frame. Either the system (Windows)
// will handle it or Chrome will custom draw it.
virtual FrameMode GetFrameMode() const = 0;