diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index bfa56dc5aa17..cc3749bd0143 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -326,14 +326,6 @@ bool Window::IsVisible() { return window_->IsVisible(); } -void Window::Disable() { - window_->Disable(); -} - -void Window::Enable() { - window_->Enable(); -} - bool Window::IsEnabled() { return window_->IsEnabled(); } @@ -767,8 +759,6 @@ void Window::RemoveFromParentChildWindows() { return; parent->child_windows_.Remove(ID()); - if (IsModal()) - parent->Enable(); } // static @@ -784,8 +774,6 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("showInactive", &Window::ShowInactive) .SetMethod("hide", &Window::Hide) .SetMethod("isVisible", &Window::IsVisible) - .SetMethod("enable", &Window::Enable) - .SetMethod("disable", &Window::Disable) .SetMethod("isEnabled", &Window::IsEnabled) .SetMethod("maximize", &Window::Maximize) .SetMethod("unmaximize", &Window::Unmaximize) @@ -796,7 +784,9 @@ void Window::BuildPrototype(v8::Isolate* isolate, .SetMethod("setFullScreen", &Window::SetFullScreen) .SetMethod("isFullScreen", &Window::IsFullscreen) .SetMethod("setAspectRatio", &Window::SetAspectRatio) +#if !defined(OS_WIN) .SetMethod("setParentWindow", &Window::SetParentWindow) +#endif .SetMethod("getParentWindow", &Window::GetParentWindow) .SetMethod("getChildWindows", &Window::GetChildWindows) .SetMethod("isModal", &Window::IsModal) diff --git a/atom/browser/api/atom_api_window.h b/atom/browser/api/atom_api_window.h index cd8b6ddc42ed..21ecca4c7292 100644 --- a/atom/browser/api/atom_api_window.h +++ b/atom/browser/api/atom_api_window.h @@ -99,8 +99,6 @@ class Window : public mate::TrackableObject, void ShowInactive(); void Hide(); bool IsVisible(); - void Disable(); - void Enable(); bool IsEnabled(); void Maximize(); void Unmaximize(); diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index 42ba8d90237f..4eb72dfe08cd 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -57,7 +57,6 @@ NativeWindow::NativeWindow( sheet_offset_x_(0.0), sheet_offset_y_(0.0), aspect_ratio_(0.0), - disable_count_(0), parent_(parent), is_modal_(false), inspectable_web_contents_(inspectable_web_contents), @@ -185,18 +184,6 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) { Show(); } -void NativeWindow::Disable() { - ++disable_count_; - if (disable_count_ == 1) - SetEnabled(false); -} - -void NativeWindow::Enable() { - --disable_count_; - if (disable_count_ == 0) - SetEnabled(true); -} - void NativeWindow::SetSize(const gfx::Size& size, bool animate) { SetBounds(gfx::Rect(GetPosition(), size), animate); } diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index ca1ffe2117e6..d3b6f8a2b0be 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -98,9 +98,6 @@ class NativeWindow : public base::SupportsUserData, virtual void ShowInactive() = 0; virtual void Hide() = 0; virtual bool IsVisible() = 0; - virtual void Disable(); - virtual void Enable(); - virtual void SetEnabled(bool enable) = 0; // internal API, should not be used virtual bool IsEnabled() = 0; virtual void Maximize() = 0; virtual void Unmaximize() = 0; @@ -339,9 +336,6 @@ class NativeWindow : public base::SupportsUserData, double aspect_ratio_; gfx::Size aspect_ratio_extraSize_; - // How many times the Disable has been called. - int disable_count_; - // The parent window, it is guaranteed to be valid during this window's life. NativeWindow* parent_; diff --git a/atom/browser/native_window_mac.h b/atom/browser/native_window_mac.h index 732a75ee18ad..af99b3912e16 100644 --- a/atom/browser/native_window_mac.h +++ b/atom/browser/native_window_mac.h @@ -35,7 +35,6 @@ class NativeWindowMac : public NativeWindow { void ShowInactive() override; void Hide() override; bool IsVisible() override; - void SetEnabled(bool enable) override; bool IsEnabled() override; void Maximize() override; void Unmaximize() override; diff --git a/atom/browser/native_window_mac.mm b/atom/browser/native_window_mac.mm index 8a5308b66172..5f997ee9b6b9 100644 --- a/atom/browser/native_window_mac.mm +++ b/atom/browser/native_window_mac.mm @@ -279,7 +279,6 @@ bool ScopedDisableResize::disable_resize_ = false; @property BOOL acceptsFirstMouse; @property BOOL disableAutoHideCursor; @property BOOL disableKeyOrMainWindow; -@property BOOL disableMouseEvents; - (void)setShell:(atom::NativeWindowMac*)shell; - (void)setEnableLargerThanScreen:(bool)enable; @@ -349,29 +348,6 @@ bool ScopedDisableResize::disable_resize_ = false; return !self.disableKeyOrMainWindow; } -- (void)sendEvent:(NSEvent*)event { - // Drop all mouse events. - if (self.disableMouseEvents) { - switch([event type]) { - case NSLeftMouseUp: - case NSLeftMouseDown: - case NSRightMouseDown: - case NSRightMouseUp: - case NSOtherMouseUp: - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - case NSMouseMoved: - case NSScrollWheel: - return; - default: - break; - } - } - - [super sendEvent:event]; -} - @end @interface ControlRegionView : NSView @@ -521,7 +497,6 @@ NativeWindowMac::NativeWindowMac( backing:NSBackingStoreBuffered defer:YES]); [window_ setShell:this]; - [window_ setDisableMouseEvents:NO]; [window_ setEnableLargerThanScreen:enable_larger_than_screen()]; window_delegate_.reset([[AtomNSWindowDelegate alloc] initWithShell:this]); @@ -692,11 +667,6 @@ bool NativeWindowMac::IsVisible() { return [window_ isVisible]; } -void NativeWindowMac::SetEnabled(bool enable) { - [window_ setDisableKeyOrMainWindow:!enable]; - [window_ setDisableMouseEvents:!enable]; -} - bool NativeWindowMac::IsEnabled() { return [window_ attachedSheet] == nil; } diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 8d1421010945..1feb9618ac66 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -129,13 +129,14 @@ NativeWindowViews::NativeWindowViews( brightray::InspectableWebContents* web_contents, const mate::Dictionary& options, NativeWindow* parent) - : NativeWindow(web_contents, options), + : NativeWindow(web_contents, options, parent), window_(new views::Widget), web_view_(inspectable_web_contents()->GetView()->GetView()), menu_bar_autohide_(false), menu_bar_visible_(false), menu_bar_alt_pressed_(false), keyboard_event_handler_(new views::UnhandledKeyboardEventHandler), + disable_count_(0), use_content_size_(false), movable_(true), resizable_(true), @@ -242,16 +243,24 @@ NativeWindowViews::NativeWindowViews( state_atom_list.push_back(GetAtom("_NET_WM_STATE_FULLSCREEN")); } + std::string window_type; + options.Get(options::kType, &window_type); + + if (parent) { + SetParentWindow(parent); + // Force using dialog type for child window. + window_type = "dialog"; + // Modal window needs the _NET_WM_STATE_MODAL hint. + if (is_modal()) + state_atom_list.push_back(GetAtom("_NET_WM_STATE_MODAL")); + } + ui::SetAtomArrayProperty(GetAcceleratedWidget(), "_NET_WM_STATE", "ATOM", state_atom_list); // Set the _NET_WM_WINDOW_TYPE. - std::string window_type; - if (options.Get(options::kType, &window_type)) + if (!window_type.empty()) SetWindowType(GetAcceleratedWidget(), window_type); - - if (parent) - SetParentWindow(parent); #endif // Add web view. @@ -346,6 +355,9 @@ bool NativeWindowViews::IsFocused() { } void NativeWindowViews::Show() { + if (is_modal() && NativeWindow::parent()) + static_cast(NativeWindow::parent())->SetEnabled(false); + window_->native_widget_private()->ShowWithWindowState(GetRestoredState()); NotifyWindowShow(); @@ -368,6 +380,9 @@ void NativeWindowViews::ShowInactive() { } void NativeWindowViews::Hide() { + if (is_modal() && NativeWindow::parent()) + static_cast(NativeWindow::parent())->SetEnabled(true); + window_->Hide(); NotifyWindowHide(); @@ -382,22 +397,6 @@ bool NativeWindowViews::IsVisible() { return window_->IsVisible(); } -void NativeWindowViews::SetEnabled(bool enable) { -#if defined(OS_WIN) - ::EnableWindow(GetAcceleratedWidget(), enable); -#elif defined(USE_X11) - views::DesktopWindowTreeHostX11* tree_host = - views::DesktopWindowTreeHostX11::GetHostForXID(GetAcceleratedWidget()); - if (enable) { - tree_host->RemoveEventRewriter(event_disabler_.get()); - event_disabler_.reset(); - } else { - event_disabler_.reset(new EventDisabler); - tree_host->AddEventRewriter(event_disabler_.get()); - } -#endif -} - bool NativeWindowViews::IsEnabled() { #if defined(OS_WIN) return ::IsWindowEnabled(GetAcceleratedWidget()); @@ -831,16 +830,6 @@ void NativeWindowViews::SetParentWindow(NativeWindow* parent) { #endif } -void NativeWindowViews::SetModal(bool modal) { - NativeWindow::SetModal(modal); -#if defined(USE_X11) - SetWindowType(GetAcceleratedWidget(), modal ? "dialog" : "normal"); - Show(); - SetWMSpecState(GetAcceleratedWidget(), modal, - GetAtom("_NET_WM_STATE_MODAL")); -#endif -} - gfx::NativeWindow NativeWindowViews::GetNativeWindow() { return window_->GetNativeWindow(); } @@ -936,6 +925,33 @@ void NativeWindowViews::SetIcon(const gfx::ImageSkia& icon) { } #endif +void NativeWindowViews::SetEnabled(bool enable) { + // Handle multiple calls of SetEnabled correctly. + if (enable) { + --disable_count_; + if (disable_count_ != 0) + return; + } else { + ++disable_count_; + if (disable_count_ != 1) + return; + } + +#if defined(OS_WIN) + ::EnableWindow(GetAcceleratedWidget(), enable); +#elif defined(USE_X11) + views::DesktopWindowTreeHostX11* tree_host = + views::DesktopWindowTreeHostX11::GetHostForXID(GetAcceleratedWidget()); + if (enable) { + tree_host->RemoveEventRewriter(event_disabler_.get()); + event_disabler_.reset(); + } else { + event_disabler_.reset(new EventDisabler); + tree_host->AddEventRewriter(event_disabler_.get()); + } +#endif +} + void NativeWindowViews::OnWidgetActivationChanged( views::Widget* widget, bool active) { if (widget != window_.get()) @@ -969,6 +985,15 @@ void NativeWindowViews::OnWidgetBoundsChanged( } void NativeWindowViews::DeleteDelegate() { + if (is_modal() && NativeWindow::parent()) { + NativeWindowViews* parent = + static_cast(NativeWindow::parent()); + // Enable parent window after current window gets closed. + parent->SetEnabled(true); + // Focus on parent window. + parent->Focus(true); + } + NotifyWindowClosed(); } diff --git a/atom/browser/native_window_views.h b/atom/browser/native_window_views.h index adc18a1dfdeb..69d3d27a35da 100644 --- a/atom/browser/native_window_views.h +++ b/atom/browser/native_window_views.h @@ -57,7 +57,6 @@ class NativeWindowViews : public NativeWindow, void ShowInactive() override; void Hide() override; bool IsVisible() override; - void SetEnabled(bool enable) override; bool IsEnabled() override; void Maximize() override; void Unmaximize() override; @@ -100,7 +99,6 @@ class NativeWindowViews : public NativeWindow, void SetFocusable(bool focusable) override; void SetMenu(ui::MenuModel* menu_model) override; void SetParentWindow(NativeWindow* parent) override; - void SetModal(bool modal) override; gfx::NativeWindow GetNativeWindow() override; void SetOverlayIcon(const gfx::Image& overlay, const std::string& description) override; @@ -120,6 +118,8 @@ class NativeWindowViews : public NativeWindow, void SetIcon(const gfx::ImageSkia& icon); #endif + void SetEnabled(bool enable); + views::Widget* widget() const { return window_.get(); } #if defined(OS_WIN) @@ -230,6 +230,9 @@ class NativeWindowViews : public NativeWindow, // Map from accelerator to menu item's command id. accelerator_util::AcceleratorTable accelerator_table_; + // How many times the Disable has been called. + int disable_count_; + bool use_content_size_; bool movable_; bool resizable_;