Skip to content

Commit

Permalink
fix: Windows 7 frame showing for frameless non-resizable windows
Browse files Browse the repository at this point in the history
  • Loading branch information
rzhao271 committed Oct 4, 2022
1 parent e63d4a6 commit a13dcad
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 46 deletions.
2 changes: 1 addition & 1 deletion patches/chromium/.patches
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ chore_allow_chromium_to_handle_synthetic_mouse_events_for_touch.patch
add_maximized_parameter_to_linuxui_getwindowframeprovider.patch
revert_spellcheck_fully_launch_spell_check_delayed_initialization.patch
add_electron_deps_to_license_credits_file.patch
feat_add_set_can_resize_mutator.patch
fix_crash_loading_non-standard_schemes_in_iframes.patch
disable_optimization_guide_for_preconnect_feature.patch
fix_return_v8_value_from_localframe_requestexecutescript.patch
create_browser_v8_snapshot_file_name_fuse.patch
feat_ensure_mas_builds_of_the_same_application_can_use_safestorage.patch
fix_remove_caption-removing_style_call.patch
27 changes: 0 additions & 27 deletions patches/chromium/feat_add_set_can_resize_mutator.patch

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ We attempt to migrate the safe storage key from the old account, if that migrati
Existing apps that aren't built for the app store should be unimpacted, there is one edge case where a user uses BOTH an AppStore and a darwin build of the same app only one will keep it's access to the safestorage key as during the migration we delete the old account. This is an acceptable edge case as no one should be actively using two versions of the same app.

diff --git a/components/os_crypt/keychain_password_mac.mm b/components/os_crypt/keychain_password_mac.mm
index 5589310e2e1f41a6a97e77bb57a7a71cd09a18be..ad81ca6726e265b43f30f12ee3f5a22f943298ac 100644
index 214ae79b9a6de27b99ccfa9cf03327449fd79198..1b740e8dd19eeb34e68db30ba66ebadd1a132a39 100644
--- a/components/os_crypt/keychain_password_mac.mm
+++ b/components/os_crypt/keychain_password_mac.mm
@@ -22,6 +22,12 @@
Expand Down
48 changes: 48 additions & 0 deletions patches/chromium/fix_remove_caption-removing_style_call.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Raymond Zhao <7199958+rzhao271@users.noreply.github.com>
Date: Wed, 17 Aug 2022 13:49:40 -0700
Subject: fix: Adjust caption-removing style call

There is a SetWindowLong call that removes WS_CAPTION for frameless
windows, but Electron uses WS_CAPTION even for frameless windows,
unless they are transparent.

Changing this call only affects frameless windows, and it fixes
a visual glitch where they showed a Windows 7 style frame
during startup.

The if statement was originally introduced by
https://codereview.chromium.org/9372053/, and it was there to fix
a visual glitch with the close button showing up during startup
or resizing, but Electron does not seem to run into that issue
for opaque frameless windows even with that block commented out.

diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index 400278ab26a4e095fd837fcf84c952a1297b173d..55afa69870f27b877826ea8a442ab20a8b336d74 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -1731,7 +1731,23 @@ LRESULT HWNDMessageHandler::OnCreate(CREATESTRUCT* create_struct) {
SendMessage(hwnd(), WM_CHANGEUISTATE, MAKELPARAM(UIS_CLEAR, UISF_HIDEFOCUS),
0);

- if (!delegate_->HasFrame()) {
+ LONG is_popup =
+ GetWindowLong(hwnd(), GWL_STYLE) & static_cast<LONG>(WS_POPUP);
+
+ // For transparent windows, Electron removes the WS_CAPTION style,
+ // so we continue to remove it here. If we didn't, an opaque rectangle
+ // would show up.
+ // For non-transparent windows, Electron keeps the WS_CAPTION style,
+ // so we don't remove it in that case. If we did, a Windows 7 frame
+ // would show up.
+ // We also need this block for frameless popup windows. When the user opens
+ // a dropdown in an Electron app, the internal popup menu from
+ // third_party/blink/renderer/core/html/forms/internal_popup_menu.h
+ // is rendered. That menu is actually an HTML page inside of a frameless popup window.
+ // A new popup window is created every time the user opens the dropdown,
+ // and this code path is run. The code block below runs SendFrameChanged,
+ // which gives the dropdown options the proper layout.
+ if (!delegate_->HasFrame() && (is_translucent_ || is_popup)) {
SetWindowLong(hwnd(), GWL_STYLE,
GetWindowLong(hwnd(), GWL_STYLE) & ~WS_CAPTION);
SendFrameChanged();
17 changes: 0 additions & 17 deletions shell/browser/native_window_views.cc
Original file line number Diff line number Diff line change
Expand Up @@ -281,24 +281,7 @@ NativeWindowViews::NativeWindowViews(const gin_helper::Dictionary& options,
new ElectronDesktopWindowTreeHostLinux(this, native_widget);
#endif

// Ref https://github.com/electron/electron/issues/30760
// Set the can_resize param before initializing the widget.
// When resizable_ is true, this causes the WS_THICKFRAME style
// to be passed into CreateWindowEx and SetWindowLong calls in
// WindowImpl::Init and HwndMessageHandler::SizeConstraintsChanged
// respectively. As a result, the Windows 7 frame doesn't show,
// but it isn't clear why this is the case.
// When resizable_ is false, WS_THICKFRAME is not passed into the
// SetWindowLong call, so the Windows 7 frame still shows.
// One workaround would be to call set_can_resize(true) here,
// and then move the SetCanResize(resizable_) call after the
// SetWindowLong call around line 365, but that's a much larger change.
set_can_resize(true);
widget()->Init(std::move(params));

// When the workaround above is not needed anymore, only this
// call should be necessary.
// With the workaround in place, this call doesn't do anything.
SetCanResize(resizable_);

bool fullscreen = false;
Expand Down

0 comments on commit a13dcad

Please sign in to comment.