diff options
Diffstat (limited to 'chrome/browser/ui')
-rw-r--r-- | chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h | 2 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm | 17 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_cocoa.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/browser_window_cocoa.mm | 5 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/apps/native_app_window_gtk.cc | 16 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/apps/native_app_window_gtk.h | 5 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.cc | 5 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/browser_window_gtk.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel.cc | 8 | ||||
-rw-r--r-- | chrome/browser/ui/panels/panel.h | 4 | ||||
-rw-r--r-- | chrome/browser/ui/views/apps/native_app_window_views.cc | 12 | ||||
-rw-r--r-- | chrome/browser/ui/views/apps/native_app_window_views.h | 1 | ||||
-rw-r--r-- | chrome/browser/ui/views/frame/browser_view.cc | 5 | ||||
-rw-r--r-- | chrome/browser/ui/views/frame/browser_view.h | 1 |
14 files changed, 72 insertions, 11 deletions
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h index 106e398..835c460 100644 --- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h +++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h @@ -137,6 +137,8 @@ class NativeAppWindowCocoa : public apps::NativeAppWindow, virtual void ShowWithApp() OVERRIDE; virtual void HideWithApp() OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; + // WebContentsModalDialogHost implementation. virtual gfx::NativeView GetHostView() const OVERRIDE; virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm index 5023194..fd18e0c 100644 --- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm @@ -265,6 +265,12 @@ void SetFullScreenCollectionBehavior(NSWindow* window, bool allow_fullscreen) { - (void)setMouseDownCanMoveWindow:(BOOL)can_move; @end +namespace { + +const NSInteger kAlwaysOnTopWindowLevel = NSFloatingWindowLevel; + +} // namespace + NativeAppWindowCocoa::NativeAppWindowCocoa( ShellWindow* shell_window, const ShellWindow::CreateParams& params) @@ -334,6 +340,9 @@ NativeAppWindowCocoa::NativeAppWindowCocoa( [window respondsToSelector:@selector(setBottomCornerRounded:)]) [window setBottomCornerRounded:NO]; + if (params.always_on_top) + [window setLevel:kAlwaysOnTopWindowLevel]; + // Set the window to participate in Lion Fullscreen mode. Setting this flag // has no effect on Snow Leopard or earlier. UI controls for fullscreen are // only shown for apps that have unbounded size. @@ -810,7 +819,7 @@ void NativeAppWindowCocoa::FlashFrame(bool flash) { } bool NativeAppWindowCocoa::IsAlwaysOnTop() const { - return false; + return [window() level] == kAlwaysOnTopWindowLevel; } void NativeAppWindowCocoa::RenderViewHostChanged( @@ -986,6 +995,12 @@ void NativeAppWindowCocoa::ShowWithApp() { shell_window_->OnNativeWindowChanged(); } +void NativeAppWindowCocoa::SetAlwaysOnTop(bool always_on_top) { + [window() setLevel:(always_on_top ? kAlwaysOnTopWindowLevel : + NSNormalWindowLevel)]; + shell_window_->OnNativeWindowChanged(); +} + void NativeAppWindowCocoa::HideWithoutMarkingHidden() { [window() orderOut:window_controller_]; } diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.h b/chrome/browser/ui/cocoa/browser_window_cocoa.h index efd9e94..e57eb8c 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.h +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.h @@ -49,6 +49,7 @@ class BrowserWindowCocoa : virtual bool IsActive() const OVERRIDE; virtual void FlashFrame(bool flash) OVERRIDE; virtual bool IsAlwaysOnTop() const OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; virtual BrowserWindowTesting* GetBrowserWindowTesting() OVERRIDE; virtual StatusBubble* GetStatusBubble() OVERRIDE; diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm index a26e674..a0f8056 100644 --- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm +++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm @@ -259,6 +259,11 @@ bool BrowserWindowCocoa::IsAlwaysOnTop() const { return false; } +void BrowserWindowCocoa::SetAlwaysOnTop(bool always_on_top) { + // Not implemented for browser windows. + NOTIMPLEMENTED(); +} + bool BrowserWindowCocoa::IsActive() const { return [window() isKeyWindow]; } diff --git a/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc b/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc index d86e490..9560d66 100644 --- a/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc +++ b/chrome/browser/ui/gtk/apps/native_app_window_gtk.cc @@ -48,6 +48,7 @@ NativeAppWindowGtk::NativeAppWindowGtk(ShellWindow* shell_window, is_active_(false), content_thinks_its_fullscreen_(false), frameless_(params.frame == ShellWindow::FRAME_NONE), + always_on_top_(params.always_on_top), frame_cursor_(NULL), atom_cache_(base::MessagePumpGtk::GetDefaultXDisplay(), kAtomsToCache), is_x_event_listened_(false) { @@ -91,6 +92,9 @@ NativeAppWindowGtk::NativeAppWindowGtk(ShellWindow* shell_window, if (frameless_) gtk_window_set_decorated(window_, false); + if (always_on_top_) + gtk_window_set_keep_above(window_, TRUE); + int min_width = params.minimum_size.width(); int min_height = params.minimum_size.height(); int max_width = params.maximum_size.width(); @@ -339,7 +343,7 @@ void NativeAppWindowGtk::FlashFrame(bool flash) { } bool NativeAppWindowGtk::IsAlwaysOnTop() const { - return false; + return always_on_top_; } void NativeAppWindowGtk::RenderViewHostChanged( @@ -381,6 +385,16 @@ bool NativeAppWindowGtk::IsVisible() const { void NativeAppWindowGtk::HideWithApp() {} void NativeAppWindowGtk::ShowWithApp() {} +void NativeAppWindowGtk::SetAlwaysOnTop(bool always_on_top) { + if (always_on_top_ != always_on_top) { + // gdk_window_get_state() does not give us the correct value for the + // GDK_WINDOW_STATE_ABOVE bit. Cache the current state. + always_on_top_ = always_on_top; + gtk_window_set_keep_above(window_, always_on_top_ ? TRUE : FALSE); + shell_window_->OnNativeWindowChanged(); + } +} + gfx::NativeView NativeAppWindowGtk::GetHostView() const { NOTIMPLEMENTED(); return NULL; diff --git a/chrome/browser/ui/gtk/apps/native_app_window_gtk.h b/chrome/browser/ui/gtk/apps/native_app_window_gtk.h index 6cb9c9b..302da4e 100644 --- a/chrome/browser/ui/gtk/apps/native_app_window_gtk.h +++ b/chrome/browser/ui/gtk/apps/native_app_window_gtk.h @@ -80,6 +80,7 @@ class NativeAppWindowGtk : public apps::NativeAppWindow, virtual bool IsVisible() const OVERRIDE; virtual void HideWithApp() OVERRIDE; virtual void ShowWithApp() OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; // web_modal::WebContentsModalDialogHost implementation. virtual gfx::NativeView GetHostView() const OVERRIDE; @@ -154,6 +155,10 @@ class NativeAppWindowGtk : public apps::NativeAppWindow, // True if the window should be resizable by the user. bool resizable_; + // True if the window should be kept on top of other windows that do not have + // this flag enabled. + bool always_on_top_; + // The current window cursor. We set it to a resize cursor when over the // custom frame border. We set it to NULL if we want the default cursor. GdkCursor* frame_cursor_; diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc index 60460ef..4494749 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.cc +++ b/chrome/browser/ui/gtk/browser_window_gtk.cc @@ -719,6 +719,11 @@ bool BrowserWindowGtk::IsAlwaysOnTop() const { return false; } +void BrowserWindowGtk::SetAlwaysOnTop(bool always_on_top) { + // Not implemented for browser windows. + NOTIMPLEMENTED(); +} + gfx::NativeWindow BrowserWindowGtk::GetNativeWindow() { return window_; } diff --git a/chrome/browser/ui/gtk/browser_window_gtk.h b/chrome/browser/ui/gtk/browser_window_gtk.h index fc7e690..aa4dbbc 100644 --- a/chrome/browser/ui/gtk/browser_window_gtk.h +++ b/chrome/browser/ui/gtk/browser_window_gtk.h @@ -84,6 +84,7 @@ class BrowserWindowGtk virtual bool IsActive() const OVERRIDE; virtual void FlashFrame(bool flash) OVERRIDE; virtual bool IsAlwaysOnTop() const OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; virtual BrowserWindowTesting* GetBrowserWindowTesting() OVERRIDE; virtual StatusBubble* GetStatusBubble() OVERRIDE; diff --git a/chrome/browser/ui/panels/panel.cc b/chrome/browser/ui/panels/panel.cc index 2b21bc7..bef02b1 100644 --- a/chrome/browser/ui/panels/panel.cc +++ b/chrome/browser/ui/panels/panel.cc @@ -350,6 +350,10 @@ bool Panel::IsAlwaysOnTop() const { return native_panel_->IsPanelAlwaysOnTop(); } +void Panel::SetAlwaysOnTop(bool on_top) { + native_panel_->SetPanelAlwaysOnTop(on_top); +} + void Panel::ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition) { DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command " @@ -658,10 +662,6 @@ void Panel::HandleKeyboardEvent(const content::NativeWebKeyboardEvent& event) { native_panel_->HandlePanelKeyboardEvent(event); } -void Panel::SetAlwaysOnTop(bool on_top) { - native_panel_->SetPanelAlwaysOnTop(on_top); -} - void Panel::SetPreviewMode(bool in_preview) { DCHECK_NE(in_preview_mode_, in_preview); in_preview_mode_ = in_preview; diff --git a/chrome/browser/ui/panels/panel.h b/chrome/browser/ui/panels/panel.h index 8ce650b..3e5bde5 100644 --- a/chrome/browser/ui/panels/panel.h +++ b/chrome/browser/ui/panels/panel.h @@ -133,6 +133,7 @@ class Panel : public ui::BaseWindow, virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; virtual void FlashFrame(bool flash) OVERRIDE; virtual bool IsAlwaysOnTop() const OVERRIDE; + virtual void SetAlwaysOnTop(bool on_top) OVERRIDE; // Overridden from CommandUpdaterDelegate: virtual void ExecuteCommandWithDisposition( @@ -245,9 +246,6 @@ class Panel : public ui::BaseWindow, // Handles keyboard events coming back from the renderer. void HandleKeyboardEvent(const content::NativeWebKeyboardEvent& event); - // Whether the panel window is always on top. - void SetAlwaysOnTop(bool on_top); - // Sets whether the panel is shown in preview mode. When the panel is // being dragged, it is in preview mode. void SetPreviewMode(bool in_preview_mode); diff --git a/chrome/browser/ui/views/apps/native_app_window_views.cc b/chrome/browser/ui/views/apps/native_app_window_views.cc index 5c18710..e321c775 100644 --- a/chrome/browser/ui/views/apps/native_app_window_views.cc +++ b/chrome/browser/ui/views/apps/native_app_window_views.cc @@ -169,6 +169,7 @@ void NativeAppWindowViews::InitializeDefaultWindow( // TODO(erg): Conceptually, these are toplevel windows, but we theoretically // could plumb context through to here in some cases. init_params.top_level = true; + init_params.keep_on_top = create_params.always_on_top; gfx::Rect window_bounds = create_params.bounds; bool position_specified = window_bounds.x() != INT_MIN && window_bounds.y() != INT_MIN; @@ -410,14 +411,16 @@ void NativeAppWindowViews::FlashFrame(bool flash) { } bool NativeAppWindowViews::IsAlwaysOnTop() const { - if (!shell_window_->window_type_is_panel()) - return false; + if (shell_window_->window_type_is_panel()) { #if defined(USE_ASH) return ash::wm::GetWindowState(window_->GetNativeWindow())-> panel_attached(); #else return true; #endif + } else { + return window_->IsAlwaysOnTop(); + } } gfx::Insets NativeAppWindowViews::GetFrameInsets() const { @@ -443,6 +446,11 @@ bool NativeAppWindowViews::IsVisible() const { void NativeAppWindowViews::HideWithApp() {} void NativeAppWindowViews::ShowWithApp() {} +void NativeAppWindowViews::SetAlwaysOnTop(bool always_on_top) { + window_->SetAlwaysOnTop(always_on_top); + shell_window_->OnNativeWindowChanged(); +} + gfx::NativeView NativeAppWindowViews::GetHostView() const { return window_->GetNativeView(); } diff --git a/chrome/browser/ui/views/apps/native_app_window_views.h b/chrome/browser/ui/views/apps/native_app_window_views.h index 704d028..833393c 100644 --- a/chrome/browser/ui/views/apps/native_app_window_views.h +++ b/chrome/browser/ui/views/apps/native_app_window_views.h @@ -147,6 +147,7 @@ class NativeAppWindowViews : public apps::NativeAppWindow, virtual bool IsVisible() const OVERRIDE; virtual void HideWithApp() OVERRIDE; virtual void ShowWithApp() OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; // web_modal::WebContentsModalDialogHost implementation. virtual gfx::NativeView GetHostView() const OVERRIDE; diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 851c741..429c7e8 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -700,6 +700,11 @@ bool BrowserView::IsAlwaysOnTop() const { return false; } +void BrowserView::SetAlwaysOnTop(bool always_on_top) { + // Not implemented for browser windows. + NOTIMPLEMENTED(); +} + gfx::NativeWindow BrowserView::GetNativeWindow() { // While the browser destruction is going on, the widget can already be gone, // but utility functions like FindBrowserWithWindow will come here and crash. diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index a7a3421..9edd602 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h @@ -263,6 +263,7 @@ class BrowserView : public BrowserWindow, virtual bool IsActive() const OVERRIDE; virtual void FlashFrame(bool flash) OVERRIDE; virtual bool IsAlwaysOnTop() const OVERRIDE; + virtual void SetAlwaysOnTop(bool always_on_top) OVERRIDE; virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; virtual BrowserWindowTesting* GetBrowserWindowTesting() OVERRIDE; virtual StatusBubble* GetStatusBubble() OVERRIDE; |