summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui')
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h2
-rw-r--r--chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm17
-rw-r--r--chrome/browser/ui/cocoa/browser_window_cocoa.h1
-rw-r--r--chrome/browser/ui/cocoa/browser_window_cocoa.mm5
-rw-r--r--chrome/browser/ui/gtk/apps/native_app_window_gtk.cc16
-rw-r--r--chrome/browser/ui/gtk/apps/native_app_window_gtk.h5
-rw-r--r--chrome/browser/ui/gtk/browser_window_gtk.cc5
-rw-r--r--chrome/browser/ui/gtk/browser_window_gtk.h1
-rw-r--r--chrome/browser/ui/panels/panel.cc8
-rw-r--r--chrome/browser/ui/panels/panel.h4
-rw-r--r--chrome/browser/ui/views/apps/native_app_window_views.cc12
-rw-r--r--chrome/browser/ui/views/apps/native_app_window_views.h1
-rw-r--r--chrome/browser/ui/views/frame/browser_view.cc5
-rw-r--r--chrome/browser/ui/views/frame/browser_view.h1
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;