diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 6b787e407b73..bcf6ccc5a335 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -227,6 +227,14 @@ void Window::OnWindowLeaveFullScreen() { Emit("leave-full-screen"); } +void Window::OnWindowScrollTouchBegin() { + Emit("scroll-touch-begin"); +} + +void Window::OnWindowScrollTouchEnd() { + Emit("scroll-touch-end"); +} + void Window::OnWindowEnterHtmlFullScreen() { Emit("enter-html-full-screen"); } diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index 760fbb542b3b..641124f4dfd2 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -65,6 +65,8 @@ class Window : public mate::TrackableObject, void OnWindowResize() override; void OnWindowMove() override; void OnWindowMoved() override; + void OnWindowScrollTouchBegin() override; + void OnWindowScrollTouchEnd() override; void OnWindowEnterFullScreen() override; void OnWindowLeaveFullScreen() override; void OnWindowEnterHtmlFullScreen() override; diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 3ddc9e197af8..c25534f7f18e 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -450,6 +450,16 @@ void NativeWindow::NotifyWindowEnterFullScreen() { OnWindowEnterFullScreen()); } +void NativeWindow::NotifyWindowScrollTouchBegin() { + FOR_EACH_OBSERVER(NativeWindowObserver, observers_, + OnWindowScrollTouchBegin()); +} + +void NativeWindow::NotifyWindowScrollTouchEnd() { + FOR_EACH_OBSERVER(NativeWindowObserver, observers_, + OnWindowScrollTouchEnd()); +} + void NativeWindow::NotifyWindowLeaveFullScreen() { FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnWindowLeaveFullScreen()); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index ea5f063a9826..09fae6c6bcfe 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -217,6 +217,8 @@ class NativeWindow : public base::SupportsUserData, void NotifyWindowMove(); void NotifyWindowResize(); void NotifyWindowMoved(); + void NotifyWindowScrollTouchBegin(); + void NotifyWindowScrollTouchEnd(); void NotifyWindowEnterFullScreen(); void NotifyWindowLeaveFullScreen(); void NotifyWindowEnterHtmlFullScreen(); diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index 964126593ae0..4d86ec337748 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -126,6 +126,7 @@ class NativeWindowMac : public NativeWindow { base::scoped_nsobject window_; base::scoped_nsobject window_delegate_; + base::scoped_nsobject event_monitor_; // The view that will fill the whole frameless window. base::scoped_nsobject content_view_; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 1f4ae43c881f..f69292e06074 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -499,10 +499,32 @@ NativeWindowMac::NativeWindowMac( NSView* view = inspectable_web_contents()->GetView()->GetNativeView(); [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + BOOL __block down = NO; + event_monitor_.reset([[NSEvent + addLocalMonitorForEventsMatchingMask:NSScrollWheelMask + handler:^NSEvent * _Nullable(NSEvent * event) { + if ([[event window] windowNumber] != [window_ windowNumber]) + return event; + + if (!web_contents) + return event; + + if (!down && (([event phase] == NSEventPhaseMayBegin) || ([event phase] == NSEventPhaseBegan))) { + this->NotifyWindowScrollTouchBegin(); + down = YES; + } + if (down && (([event phase] == NSEventPhaseEnded) || ([event phase] == NSEventPhaseCancelled))) { + this->NotifyWindowScrollTouchEnd(); + down = NO; + } + return event; + }] retain]); + InstallView(); } NativeWindowMac::~NativeWindowMac() { + [NSEvent removeMonitor: event_monitor_.get()]; Observe(nullptr); } diff --git a/atom/browser/native_window_observer.h b/atom/browser/native_window_observer.h index ce2d41c6fad6..4af181085a08 100644 --- a/atom/browser/native_window_observer.h +++ b/atom/browser/native_window_observer.h @@ -50,6 +50,8 @@ class NativeWindowObserver { virtual void OnWindowResize() {} virtual void OnWindowMove() {} virtual void OnWindowMoved() {} + virtual void OnWindowScrollTouchBegin() {} + virtual void OnWindowScrollTouchEnd() {} virtual void OnWindowEnterFullScreen() {} virtual void OnWindowLeaveFullScreen() {} virtual void OnWindowEnterHtmlFullScreen() {}