From 26a009ce346e5db1f6c3b4ecbc5b78a01be59e58 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 3 Oct 2018 12:18:47 -0700 Subject: [PATCH 1/5] feat: add evt listeners for SetAlwaysOnTop --- atom/browser/api/atom_api_top_level_window.cc | 8 ++++++++ atom/browser/api/atom_api_top_level_window.h | 2 ++ atom/browser/native_window.cc | 10 ++++++++++ atom/browser/native_window.h | 2 ++ atom/browser/native_window_observer.h | 2 ++ atom/browser/native_window_views.cc | 6 ++++++ 6 files changed, 30 insertions(+) diff --git a/atom/browser/api/atom_api_top_level_window.cc b/atom/browser/api/atom_api_top_level_window.cc index b2a15f9855a06..8b1fa22a9b6af 100644 --- a/atom/browser/api/atom_api_top_level_window.cc +++ b/atom/browser/api/atom_api_top_level_window.cc @@ -262,6 +262,14 @@ void TopLevelWindow::OnWindowLeaveHtmlFullScreen() { Emit("leave-html-full-screen"); } +void TopLevelWindow::OnWindowEnterAlwaysOnTop() { + Emit("enter-always-on-top"); +} + +void TopLevelWindow::OnWindowLeaveAlwaysOnTop() { + Emit("leave-always-on-top"); +} + void TopLevelWindow::OnExecuteWindowsCommand(const std::string& command_name) { Emit("app-command", command_name); } diff --git a/atom/browser/api/atom_api_top_level_window.h b/atom/browser/api/atom_api_top_level_window.h index 7950d4c6a33f4..9aa6569b9a175 100644 --- a/atom/browser/api/atom_api_top_level_window.h +++ b/atom/browser/api/atom_api_top_level_window.h @@ -77,6 +77,8 @@ class TopLevelWindow : public mate::TrackableObject, void OnWindowLeaveFullScreen() override; void OnWindowEnterHtmlFullScreen() override; void OnWindowLeaveHtmlFullScreen() override; + void OnWindowEnterAlwaysOnTop() override; + void OnWindowLeaveAlwaysOnTop() override; void OnExecuteWindowsCommand(const std::string& command_name) override; void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 464bdae7fa319..9cebd88d514d6 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -537,6 +537,16 @@ void NativeWindow::NotifyWindowLeaveHtmlFullScreen() { observer.OnWindowLeaveHtmlFullScreen(); } +void NativeWindow::NotifyWindowEnterAlwaysOnTop() { + for (NativeWindowObserver& observer : observers_) + observer.OnWindowEnterAlwaysOnTop(); +} + +void NativeWindow::NotifyWindowLeaveAlwaysOnTop() { + for (NativeWindowObserver& observer : observers_) + observer.OnWindowLeaveAlwaysOnTop(); +} + void NativeWindow::NotifyWindowExecuteWindowsCommand( const std::string& command) { for (NativeWindowObserver& observer : observers_) diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index a41e94595ee9a..e0a75b171c35f 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -254,6 +254,8 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowLeaveFullScreen(); void NotifyWindowEnterHtmlFullScreen(); void NotifyWindowLeaveHtmlFullScreen(); + void NotifyWindowEnterAlwaysOnTop(); + void NotifyWindowLeaveAlwaysOnTop(); void NotifyWindowExecuteWindowsCommand(const std::string& command); void NotifyTouchBarItemInteraction(const std::string& item_id, const base::DictionaryValue& details); diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index e14332b9f0be6..b3b578d099ebe 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -83,6 +83,8 @@ class NativeWindowObserver { virtual void OnWindowLeaveFullScreen() {} virtual void OnWindowEnterHtmlFullScreen() {} virtual void OnWindowLeaveHtmlFullScreen() {} + virtual void OnWindowEnterAlwaysOnTop() {} + virtual void OnWindowLeaveAlwaysOnTop() {} virtual void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) {} virtual void OnNewWindowForTab() {} diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 9664d17544041..a7af2df9cf52d 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -706,6 +706,12 @@ void NativeWindowViews::SetAlwaysOnTop(bool top, const std::string& level, int relativeLevel, std::string* error) { + if (top) { + NativeWindow::NotifyWindowEnterAlwaysOnTop(); + } else { + NativeWindow::NotifyWindowLeaveAlwaysOnTop(); + } + widget()->SetAlwaysOnTop(top); } From 75fcc879ad4273006f696ad0dfa1e1e1b36d47ad Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 3 Oct 2018 17:41:15 -0700 Subject: [PATCH 2/5] only emit one event on AlwaysOnTop change --- atom/browser/api/atom_api_top_level_window.cc | 8 ++------ atom/browser/api/atom_api_top_level_window.h | 3 +-- atom/browser/native_window.cc | 9 ++------- atom/browser/native_window.h | 3 +-- atom/browser/native_window_observer.h | 3 +-- atom/browser/native_window_views.cc | 7 +------ 6 files changed, 8 insertions(+), 25 deletions(-) diff --git a/atom/browser/api/atom_api_top_level_window.cc b/atom/browser/api/atom_api_top_level_window.cc index 8b1fa22a9b6af..cc8b6f5f9a899 100644 --- a/atom/browser/api/atom_api_top_level_window.cc +++ b/atom/browser/api/atom_api_top_level_window.cc @@ -262,12 +262,8 @@ void TopLevelWindow::OnWindowLeaveHtmlFullScreen() { Emit("leave-html-full-screen"); } -void TopLevelWindow::OnWindowEnterAlwaysOnTop() { - Emit("enter-always-on-top"); -} - -void TopLevelWindow::OnWindowLeaveAlwaysOnTop() { - Emit("leave-always-on-top"); +void TopLevelWindow::OnWindowAlwaysOnTopChange() { + Emit("always-on-top-change", IsAlwaysOnTop()); } void TopLevelWindow::OnExecuteWindowsCommand(const std::string& command_name) { diff --git a/atom/browser/api/atom_api_top_level_window.h b/atom/browser/api/atom_api_top_level_window.h index 9aa6569b9a175..756ed5522a4de 100644 --- a/atom/browser/api/atom_api_top_level_window.h +++ b/atom/browser/api/atom_api_top_level_window.h @@ -77,8 +77,7 @@ class TopLevelWindow : public mate::TrackableObject, void OnWindowLeaveFullScreen() override; void OnWindowEnterHtmlFullScreen() override; void OnWindowLeaveHtmlFullScreen() override; - void OnWindowEnterAlwaysOnTop() override; - void OnWindowLeaveAlwaysOnTop() override; + void OnWindowAlwaysOnTopChange() override; void OnExecuteWindowsCommand(const std::string& command_name) override; void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 9cebd88d514d6..199faba0726ed 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -537,14 +537,9 @@ void NativeWindow::NotifyWindowLeaveHtmlFullScreen() { observer.OnWindowLeaveHtmlFullScreen(); } -void NativeWindow::NotifyWindowEnterAlwaysOnTop() { +void NativeWindow::NotifyWindowAlwaysOnTopChange() { for (NativeWindowObserver& observer : observers_) - observer.OnWindowEnterAlwaysOnTop(); -} - -void NativeWindow::NotifyWindowLeaveAlwaysOnTop() { - for (NativeWindowObserver& observer : observers_) - observer.OnWindowLeaveAlwaysOnTop(); + observer.OnWindowAlwaysOnTopChange(); } void NativeWindow::NotifyWindowExecuteWindowsCommand( diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index e0a75b171c35f..e0a4e2975fa95 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -254,8 +254,7 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowLeaveFullScreen(); void NotifyWindowEnterHtmlFullScreen(); void NotifyWindowLeaveHtmlFullScreen(); - void NotifyWindowEnterAlwaysOnTop(); - void NotifyWindowLeaveAlwaysOnTop(); + void NotifyWindowAlwaysOnTopChange(); void NotifyWindowExecuteWindowsCommand(const std::string& command); void NotifyTouchBarItemInteraction(const std::string& item_id, const base::DictionaryValue& details); diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index b3b578d099ebe..5ae9cc17acc84 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -83,8 +83,7 @@ class NativeWindowObserver { virtual void OnWindowLeaveFullScreen() {} virtual void OnWindowEnterHtmlFullScreen() {} virtual void OnWindowLeaveHtmlFullScreen() {} - virtual void OnWindowEnterAlwaysOnTop() {} - virtual void OnWindowLeaveAlwaysOnTop() {} + virtual void OnWindowAlwaysOnTopChange() {} virtual void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) {} virtual void OnNewWindowForTab() {} diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index a7af2df9cf52d..ef1056e12faf0 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -706,12 +706,7 @@ void NativeWindowViews::SetAlwaysOnTop(bool top, const std::string& level, int relativeLevel, std::string* error) { - if (top) { - NativeWindow::NotifyWindowEnterAlwaysOnTop(); - } else { - NativeWindow::NotifyWindowLeaveAlwaysOnTop(); - } - + NativeWindow::NotifyWindowAlwaysOnTopChange(); widget()->SetAlwaysOnTop(top); } From 1602ad7c7a45dbe5100020c74d8ba645b76b1f39 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 3 Oct 2018 18:00:29 -0700 Subject: [PATCH 3/5] docs: add new alwaysontop event --- docs/api/browser-window.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 49b18522feb69..1b5f7b9ce6d0e 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -542,6 +542,10 @@ Emitted when the window enters a full-screen state triggered by HTML API. Emitted when the window leaves a full-screen state triggered by HTML API. +#### Event: 'always-on-top-change' _macOS_ + +Emitted when the window is set or unset to show always on top of other windows. + #### Event: 'app-command' _Windows_ Returns: From 8859314ac148eb2769f88be60d113a4f37b92c86 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 3 Oct 2018 18:02:36 -0700 Subject: [PATCH 4/5] dont emit if theres no change --- atom/browser/native_window_views.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index ef1056e12faf0..7722b127ad884 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -706,7 +706,9 @@ void NativeWindowViews::SetAlwaysOnTop(bool top, const std::string& level, int relativeLevel, std::string* error) { - NativeWindow::NotifyWindowAlwaysOnTopChange(); + if (top != widget()->IsAlwaysOnTop()) + NativeWindow::NotifyWindowAlwaysOnTopChange(); + widget()->SetAlwaysOnTop(top); } From 6b1fc1202bb911066e5f8d6157f7eccd565191fd Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 3 Oct 2018 21:11:13 -0700 Subject: [PATCH 5/5] address feedback from review --- atom/browser/api/atom_api_top_level_window.cc | 4 ++-- atom/browser/api/atom_api_top_level_window.h | 2 +- atom/browser/native_window.cc | 4 ++-- atom/browser/native_window.h | 2 +- atom/browser/native_window_observer.h | 2 +- atom/browser/native_window_views.cc | 2 +- docs/api/browser-window.md | 7 ++++++- 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/atom/browser/api/atom_api_top_level_window.cc b/atom/browser/api/atom_api_top_level_window.cc index cc8b6f5f9a899..02a0d8a240175 100644 --- a/atom/browser/api/atom_api_top_level_window.cc +++ b/atom/browser/api/atom_api_top_level_window.cc @@ -262,8 +262,8 @@ void TopLevelWindow::OnWindowLeaveHtmlFullScreen() { Emit("leave-html-full-screen"); } -void TopLevelWindow::OnWindowAlwaysOnTopChange() { - Emit("always-on-top-change", IsAlwaysOnTop()); +void TopLevelWindow::OnWindowAlwaysOnTopChanged() { + Emit("always-on-top-changed", IsAlwaysOnTop()); } void TopLevelWindow::OnExecuteWindowsCommand(const std::string& command_name) { diff --git a/atom/browser/api/atom_api_top_level_window.h b/atom/browser/api/atom_api_top_level_window.h index 756ed5522a4de..809efaa5979ce 100644 --- a/atom/browser/api/atom_api_top_level_window.h +++ b/atom/browser/api/atom_api_top_level_window.h @@ -77,7 +77,7 @@ class TopLevelWindow : public mate::TrackableObject, void OnWindowLeaveFullScreen() override; void OnWindowEnterHtmlFullScreen() override; void OnWindowLeaveHtmlFullScreen() override; - void OnWindowAlwaysOnTopChange() override; + void OnWindowAlwaysOnTopChanged() override; void OnExecuteWindowsCommand(const std::string& command_name) override; void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 199faba0726ed..ab575e4f58e72 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -537,9 +537,9 @@ void NativeWindow::NotifyWindowLeaveHtmlFullScreen() { observer.OnWindowLeaveHtmlFullScreen(); } -void NativeWindow::NotifyWindowAlwaysOnTopChange() { +void NativeWindow::NotifyWindowAlwaysOnTopChanged() { for (NativeWindowObserver& observer : observers_) - observer.OnWindowAlwaysOnTopChange(); + observer.OnWindowAlwaysOnTopChanged(); } void NativeWindow::NotifyWindowExecuteWindowsCommand( diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index e0a4e2975fa95..d0de62249f14f 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -254,7 +254,7 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowLeaveFullScreen(); void NotifyWindowEnterHtmlFullScreen(); void NotifyWindowLeaveHtmlFullScreen(); - void NotifyWindowAlwaysOnTopChange(); + void NotifyWindowAlwaysOnTopChanged(); void NotifyWindowExecuteWindowsCommand(const std::string& command); void NotifyTouchBarItemInteraction(const std::string& item_id, const base::DictionaryValue& details); diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index 5ae9cc17acc84..dde449637d541 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -83,7 +83,7 @@ class NativeWindowObserver { virtual void OnWindowLeaveFullScreen() {} virtual void OnWindowEnterHtmlFullScreen() {} virtual void OnWindowLeaveHtmlFullScreen() {} - virtual void OnWindowAlwaysOnTopChange() {} + virtual void OnWindowAlwaysOnTopChanged() {} virtual void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) {} virtual void OnNewWindowForTab() {} diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 7722b127ad884..8f3d9a2dc70d5 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -707,7 +707,7 @@ void NativeWindowViews::SetAlwaysOnTop(bool top, int relativeLevel, std::string* error) { if (top != widget()->IsAlwaysOnTop()) - NativeWindow::NotifyWindowAlwaysOnTopChange(); + NativeWindow::NotifyWindowAlwaysOnTopChanged(); widget()->SetAlwaysOnTop(top); } diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 1b5f7b9ce6d0e..10d3a40aafff0 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -542,7 +542,12 @@ Emitted when the window enters a full-screen state triggered by HTML API. Emitted when the window leaves a full-screen state triggered by HTML API. -#### Event: 'always-on-top-change' _macOS_ +#### Event: 'always-on-top-changed' _macOS_ + +Returns: + +* `event` Event +* `isAlwaysOnTop` Boolean Emitted when the window is set or unset to show always on top of other windows.