fix: calculate frame when setting window placement (#25014)

This commit is contained in:
Cheng Zhao 2020-08-20 04:34:15 +09:00 коммит произвёл GitHub
Родитель 9021843850
Коммит 52d7afa4ef
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 33 добавлений и 8 удалений

Просмотреть файл

@ -278,8 +278,8 @@ class NativeWindowViews : public NativeWindow,
// Set to true if the window is always on top and behind the task bar.
bool behind_task_bar_ = false;
// Whether to block Chromium from handling window messages.
bool block_chromium_message_handler_ = false;
// Whether we want to set window placement without side effect.
bool is_setting_window_placement_ = false;
#endif
// Handles unhandled keyboard messages coming back from the renderer process.

Просмотреть файл

@ -180,11 +180,16 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
LRESULT* result) {
NotifyWindowMessage(message, w_param, l_param);
// See code below for why blocking Chromium from handling messages.
if (block_chromium_message_handler_) {
// Handle the message with default proc.
// Avoid side effects when calling SetWindowPlacement.
if (is_setting_window_placement_) {
// Let Chromium handle the WM_NCCALCSIZE message otherwise the window size
// would be wrong.
// See https://github.com/electron/electron/issues/22393 for more.
if (message == WM_NCCALCSIZE)
return false;
// Otherwise handle the message with default proc,
*result = DefWindowProc(GetAcceleratedWidget(), message, w_param, l_param);
// Tell Chromium to ignore this message.
// and tell Chromium to ignore this message.
return true;
}
@ -239,9 +244,9 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
// messages until the SetWindowPlacement call is done.
//
// See https://github.com/electron/electron/issues/21614 for more.
block_chromium_message_handler_ = true;
is_setting_window_placement_ = true;
SetWindowPlacement(GetAcceleratedWidget(), &wp);
block_chromium_message_handler_ = false;
is_setting_window_placement_ = false;
last_normal_placement_bounds_ = gfx::Rect();
}

Просмотреть файл

@ -1005,6 +1005,26 @@ describe('BrowserWindow module', () => {
await restore;
expectBoundsEqual(w.getNormalBounds(), bounds);
});
it('does not change size for a frameless window with min size', async () => {
w.destroy();
w = new BrowserWindow({
show: false,
frame: false,
width: 300,
height: 300,
minWidth: 300,
minHeight: 300
});
const bounds = w.getBounds();
w.once('minimize', () => {
w.restore();
});
const restore = emittedOnce(w, 'restore');
w.show();
w.minimize();
await restore;
expectBoundsEqual(w.getNormalBounds(), bounds);
});
});
ifdescribe(process.platform === 'win32')('Fullscreen state', () => {