diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index ab5645cc080..bddca8559de 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -12,6 +12,7 @@ #include "base/mac/scoped_nsobject.h" #include "atom/browser/native_window.h" +#include "content/public/browser/render_widget_host.h" @class AtomNSWindow; @class AtomNSWindowDelegate; @@ -19,7 +20,8 @@ namespace atom { -class NativeWindowMac : public NativeWindow { +class NativeWindowMac : public NativeWindow, + public content::RenderWidgetHost::InputEventObserver { public: NativeWindowMac(brightray::InspectableWebContents* inspectable_web_contents, const mate::Dictionary& options, @@ -90,6 +92,8 @@ class NativeWindowMac : public NativeWindow { void SetVisibleOnAllWorkspaces(bool visible) override; bool IsVisibleOnAllWorkspaces() override; + void OnInputEvent(const blink::WebInputEvent& event) override; + // Refresh the DraggableRegion views. void UpdateDraggableRegionViews() { UpdateDraggableRegionViews(draggable_regions_); @@ -126,6 +130,11 @@ class NativeWindowMac : public NativeWindow { // whehter we can drag. void UpdateDraggableRegionViews(const std::vector& regions); + void RegisterInputEventObserver(content::RenderViewHost* host); + void UnregisterInputEventObserver(content::RenderViewHost* host); + void RenderViewHostChanged(content::RenderViewHost* old_host, + content::RenderViewHost* new_host); + base::scoped_nsobject window_; base::scoped_nsobject window_delegate_; @@ -147,6 +156,8 @@ class NativeWindowMac : public NativeWindow { // The "titleBarStyle" option. TitleBarStyle title_bar_style_; + bool is_edge_; + DISALLOW_COPY_AND_ASSIGN(NativeWindowMac); }; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 97f24efcaac..e5c0453980f 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -429,13 +429,14 @@ struct Converter { namespace atom { NativeWindowMac::NativeWindowMac( - brightray::InspectableWebContents* web_contents, + brightray::InspectableWebContents* iWeb_contents, const mate::Dictionary& options, NativeWindow* parent) - : NativeWindow(web_contents, options, parent), + : NativeWindow(iWeb_contents, options, parent), is_kiosk_(false), attention_request_id_(0), - title_bar_style_(NORMAL) { + title_bar_style_(NORMAL), + is_edge_(false) { int width = 800, height = 600; options.Get(options::kWidth, &width); options.Get(options::kHeight, &height); @@ -574,17 +575,19 @@ NativeWindowMac::NativeWindowMac( if ([[event window] windowNumber] != [window_ windowNumber]) return event; - if (!web_contents) + if (!iWeb_contents) return event; - if (!began && (([event phase] == NSEventPhaseMayBegin) || - ([event phase] == NSEventPhaseBegan))) { + if (!began && is_edge_ && (([event phase] == NSEventPhaseMayBegin) || + ([event phase] == NSEventPhaseBegan))) { this->NotifyWindowScrollTouchBegin(); began = YES; + is_edge_ = false; } else if (began && (([event phase] == NSEventPhaseEnded) || ([event phase] == NSEventPhaseCancelled))) { this->NotifyWindowScrollTouchEnd(); began = NO; + is_edge_ = false; } return event; }]; @@ -594,6 +597,26 @@ NativeWindowMac::NativeWindowMac( // Set maximizable state last to ensure zoom button does not get reset // by calls to other APIs. SetMaximizable(maximizable); + + RegisterInputEventObserver(web_contents()->GetRenderViewHost()); +} +void NativeWindowMac::RegisterInputEventObserver( + content::RenderViewHost* host) { + if (host != nullptr) + host->GetWidget()->AddInputEventObserver(this); +} + +void NativeWindowMac::UnregisterInputEventObserver( + content::RenderViewHost* host) { + if (host != nullptr) + host->GetWidget()->RemoveInputEventObserver(this); +} + +void NativeWindowMac::RenderViewHostChanged( + content::RenderViewHost* old_host, + content::RenderViewHost* new_host) { + UnregisterInputEventObserver(old_host); + RegisterInputEventObserver(new_host); } NativeWindowMac::~NativeWindowMac() { @@ -1197,6 +1220,20 @@ void NativeWindowMac::SetCollectionBehavior(bool on, NSUInteger flag) { SetMaximizable(was_maximizable); } +void NativeWindowMac::OnInputEvent(const blink::WebInputEvent& event) { + switch (event.type) { + case blink::WebInputEvent::GestureScrollBegin: + case blink::WebInputEvent::GestureScrollUpdate: + case blink::WebInputEvent::GestureScrollEnd: + { + is_edge_ = true; + break; + } + default: + break; + } +} + // static NativeWindow* NativeWindow::Create( brightray::InspectableWebContents* inspectable_web_contents,