From afdb6c5f903cd49bd794998a6d7630097ed5e014 Mon Sep 17 00:00:00 2001 From: Siddharth Dalal Date: Tue, 28 Aug 2018 09:44:10 -0400 Subject: [PATCH] feat: 'will-move' event for windows. (#14283) * feat: 'will-resize' window event (Windows only) * documentation for 'will-move' event * comment and line break fix in docs --- atom/browser/api/atom_api_top_level_window.cc | 7 +++++++ atom/browser/api/atom_api_top_level_window.h | 2 ++ atom/browser/native_window.cc | 6 ++++++ atom/browser/native_window.h | 1 + atom/browser/native_window_observer.h | 2 ++ atom/browser/native_window_views_win.cc | 9 ++++++++- docs/api/browser-window.md | 11 +++++++++++ 7 files changed, 37 insertions(+), 1 deletion(-) diff --git a/atom/browser/api/atom_api_top_level_window.cc b/atom/browser/api/atom_api_top_level_window.cc index 2c536a55df2d3..799ff5aca52ea 100644 --- a/atom/browser/api/atom_api_top_level_window.cc +++ b/atom/browser/api/atom_api_top_level_window.cc @@ -205,6 +205,13 @@ void TopLevelWindow::OnWindowResize() { Emit("resize"); } +void TopLevelWindow::OnWindowWillMove(const gfx::Rect& new_bounds, + bool* prevent_default) { + if (Emit("will-move", new_bounds)) { + *prevent_default = true; + } +} + void TopLevelWindow::OnWindowMove() { Emit("move"); } diff --git a/atom/browser/api/atom_api_top_level_window.h b/atom/browser/api/atom_api_top_level_window.h index 3f7c3f7cedf26..ead430ae9ad57 100644 --- a/atom/browser/api/atom_api_top_level_window.h +++ b/atom/browser/api/atom_api_top_level_window.h @@ -63,6 +63,8 @@ class TopLevelWindow : public mate::TrackableObject, void OnWindowWillResize(const gfx::Rect& new_bounds, bool* prevent_default) override; void OnWindowResize() override; + void OnWindowWillMove(const gfx::Rect& new_bounds, + bool* prevent_default) override; void OnWindowMove() override; void OnWindowMoved() override; void OnWindowScrollTouchBegin() override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 6ad8cd96fe49c..2077806c5b52c 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -468,6 +468,12 @@ void NativeWindow::NotifyWindowWillResize(const gfx::Rect& new_bounds, observer.OnWindowWillResize(new_bounds, prevent_default); } +void NativeWindow::NotifyWindowWillMove(const gfx::Rect& new_bounds, + bool* prevent_default) { + for (NativeWindowObserver& observer : observers_) + observer.OnWindowWillMove(new_bounds, prevent_default); +} + void NativeWindow::NotifyWindowResize() { for (NativeWindowObserver& observer : observers_) observer.OnWindowResize(); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index eb5c95cb3e3ec..3069d607ca31e 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -241,6 +241,7 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowWillResize(const gfx::Rect& new_bounds, bool* prevent_default); void NotifyWindowResize(); + void NotifyWindowWillMove(const gfx::Rect& new_bounds, bool* prevent_default); void NotifyWindowMoved(); void NotifyWindowScrollTouchBegin(); void NotifyWindowScrollTouchEnd(); diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index c2a86ea6b65cd..e14332b9f0be6 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -70,6 +70,8 @@ class NativeWindowObserver { virtual void OnWindowWillResize(const gfx::Rect& new_bounds, bool* prevent_default) {} virtual void OnWindowResize() {} + virtual void OnWindowWillMove(const gfx::Rect& new_bounds, + bool* prevent_default) {} virtual void OnWindowMove() {} virtual void OnWindowMoved() {} virtual void OnWindowScrollTouchBegin() {} diff --git a/atom/browser/native_window_views_win.cc b/atom/browser/native_window_views_win.cc index 0e61d18b91592..63419095fe0ac 100644 --- a/atom/browser/native_window_views_win.cc +++ b/atom/browser/native_window_views_win.cc @@ -207,9 +207,16 @@ bool NativeWindowViews::PreHandleMSG(UINT message, return false; } case WM_MOVING: { - if (!movable_) + bool prevent_default = false; + NotifyWindowWillMove(gfx::Rect(*reinterpret_cast(l_param)), + &prevent_default); + if (!movable_ || prevent_default) { ::GetWindowRect(GetAcceleratedWidget(), reinterpret_cast(l_param)); + return true; // Tells Windows that the Move is handled. If not true, + // frameless windows can be moved using + // -webkit-app-region: drag elements. + } return false; } case WM_MOVE: { diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 1595e2c8635a6..78d17cc16560a 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -505,6 +505,17 @@ Note that this is only emitted when the window is being resized manually. Resizi Emitted after the window has been resized. +#### Event: 'will-move' _Windows_ + +Returns: + +* `event` Event +* `newBounds` [`Rectangle`](structures/rectangle.md) - Location the window is being moved to. + +Emitted before the window is moved. Calling `event.preventDefault()` will prevent the window from being moved. + +Note that this is only emitted when the window is being resized manually. Resizing the window with `setBounds`/`setSize` will not emit this event. + #### Event: 'move' Emitted when the window is being moved to a new position.