fix: save normal window bounds when maximizing (#25051)
* fix: save normal window bounds when maximizing * fix: prevent maximize being emitted twice
This commit is contained in:
parent
5ed3460751
commit
cd3fadc2fb
2 changed files with 43 additions and 9 deletions
|
@ -315,14 +315,8 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
|
||||||
// Here we handle the WM_SIZE event in order to figure out what is the current
|
// Here we handle the WM_SIZE event in order to figure out what is the current
|
||||||
// window state and notify the user accordingly.
|
// window state and notify the user accordingly.
|
||||||
switch (w_param) {
|
switch (w_param) {
|
||||||
case SIZE_MAXIMIZED: {
|
case SIZE_MAXIMIZED:
|
||||||
last_window_state_ = ui::SHOW_STATE_MAXIMIZED;
|
case SIZE_MINIMIZED: {
|
||||||
NotifyWindowMaximize();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SIZE_MINIMIZED:
|
|
||||||
last_window_state_ = ui::SHOW_STATE_MINIMIZED;
|
|
||||||
|
|
||||||
WINDOWPLACEMENT wp;
|
WINDOWPLACEMENT wp;
|
||||||
wp.length = sizeof(WINDOWPLACEMENT);
|
wp.length = sizeof(WINDOWPLACEMENT);
|
||||||
|
|
||||||
|
@ -330,8 +324,19 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
|
||||||
last_normal_placement_bounds_ = gfx::Rect(wp.rcNormalPosition);
|
last_normal_placement_bounds_ = gfx::Rect(wp.rcNormalPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that SIZE_MAXIMIZED and SIZE_MINIMIZED might be emitted for
|
||||||
|
// multiple times for one resize because of the SetWindowPlacement call.
|
||||||
|
if (w_param == SIZE_MAXIMIZED &&
|
||||||
|
last_window_state_ != ui::SHOW_STATE_MAXIMIZED) {
|
||||||
|
last_window_state_ = ui::SHOW_STATE_MAXIMIZED;
|
||||||
|
NotifyWindowMaximize();
|
||||||
|
} else if (w_param == SIZE_MINIMIZED &&
|
||||||
|
last_window_state_ != ui::SHOW_STATE_MINIMIZED) {
|
||||||
|
last_window_state_ = ui::SHOW_STATE_MINIMIZED;
|
||||||
NotifyWindowMinimize();
|
NotifyWindowMinimize();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case SIZE_RESTORED:
|
case SIZE_RESTORED:
|
||||||
switch (last_window_state_) {
|
switch (last_window_state_) {
|
||||||
case ui::SHOW_STATE_MAXIMIZED:
|
case ui::SHOW_STATE_MAXIMIZED:
|
||||||
|
|
|
@ -1021,6 +1021,26 @@ describe('BrowserWindow module', () => {
|
||||||
await unmaximize;
|
await unmaximize;
|
||||||
expectBoundsEqual(w.getNormalBounds(), bounds);
|
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('maximize', () => {
|
||||||
|
w.unmaximize();
|
||||||
|
});
|
||||||
|
const unmaximize = emittedOnce(w, 'unmaximize');
|
||||||
|
w.show();
|
||||||
|
w.maximize();
|
||||||
|
await unmaximize;
|
||||||
|
expectBoundsEqual(w.getNormalBounds(), bounds);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
ifdescribe(process.platform !== 'linux')('Minimized state', () => {
|
ifdescribe(process.platform !== 'linux')('Minimized state', () => {
|
||||||
|
@ -2993,6 +3013,15 @@ describe('BrowserWindow module', () => {
|
||||||
await maximize;
|
await maximize;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('emits only one event when frameless window is maximized', () => {
|
||||||
|
const w = new BrowserWindow({ show: false, frame: false });
|
||||||
|
let emitted = 0;
|
||||||
|
w.on('maximize', () => emitted++);
|
||||||
|
w.show();
|
||||||
|
w.maximize();
|
||||||
|
expect(emitted).to.equal(1);
|
||||||
|
});
|
||||||
|
|
||||||
it('emits an event when window is unmaximized', async () => {
|
it('emits an event when window is unmaximized', async () => {
|
||||||
const w = new BrowserWindow({ show: false });
|
const w = new BrowserWindow({ show: false });
|
||||||
const unmaximize = emittedOnce(w, 'unmaximize');
|
const unmaximize = emittedOnce(w, 'unmaximize');
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue