Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4784)

Unified Diff: ash/hostwm/host_window_manager.cc

Issue 10789018: aura: Add X11 host window management. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Keep ash switches alphabetized. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/hostwm/host_window_manager.cc
diff --git a/ash/hostwm/host_window_manager.cc b/ash/hostwm/host_window_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..543ea07cb6b78ae9052614e514c346620af1be59
--- /dev/null
+++ b/ash/hostwm/host_window_manager.cc
@@ -0,0 +1,119 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/hostwm/host_window_manager.h"
+
+#include "ash/hostwm/host_window_container.h"
+#include "ash/shell.h"
+#include "ui/views/widget/widget.h"
+#include "ui/aura/window.h"
+#include "ui/gfx/screen.h"
+
+namespace {
+
+// TODO(reveman): This should not be a constant.
+const int kTitlebarHeight = 28;
+
+class HostWindowClientWidget : public views::Widget {
+public:
+ virtual bool OnKeyEvent(const views::KeyEvent& event) {
+ return false;
+ }
+};
+
+}
+
+namespace ash {
+namespace internal {
+
+gfx::NativeWindow HostWindowManager::OnHostWindowCreated(
+ const gfx::Rect& bounds, bool decorated) {
+ int top_offset = decorated ? kTitlebarHeight : 0;
+ HostWindowClientWidget* client_widget = new HostWindowClientWidget;
+ views::Widget::InitParams params(
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ params.delegate = NULL;
+ params.parent = NULL;
+ params.bounds = gfx::Rect(gfx::Point(0, top_offset), bounds.size());
+ params.can_activate = false;
+ client_widget->Init(params);
+ client_widget->GetNativeView()->SetName("HostWindowClient");
+ client_widget->Show();
+
+ gfx::Rect container_bounds(bounds.x(), bounds.y() - top_offset,
+ bounds.width(), bounds.height() + top_offset);
+ HostWindowContainer::CreateHostWindowContainerWidget(client_widget,
+ container_bounds, decorated ? views::Widget::InitParams::TYPE_WINDOW :
+ views::Widget::InitParams::TYPE_MENU);
+
+ // Return the native client window.
+ return client_widget->GetNativeWindow();
+}
+
+void HostWindowManager::OnHostWindowDestroyed(
+ gfx::NativeWindow window) {
+ views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
+ window->GetToplevelWindow());
+ if (!widget)
+ return;
+ widget->Close();
+}
+
+void HostWindowManager::OnHostWindowMovedOrResized(
+ gfx::NativeWindow window, const gfx::Rect& bounds) {
+ views::Widget* client_widget = views::Widget::GetWidgetForNativeWindow(
+ window);
+ if (!client_widget)
+ return;
+ client_widget->SetSize(bounds.size());
+ DCHECK(!client_widget->GetNativeView()->bounds().x());
+ DCHECK(!client_widget->GetNativeView()->bounds().y());
+ views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
+ window->GetToplevelWindow());
+ if (!widget)
+ return;
+ widget->SetBounds(bounds);
+}
+
+void HostWindowManager::OnHostWindowMovedOrResizedConstrained(
+ gfx::NativeWindow window, const gfx::Rect& bounds) {
+ views::Widget* client_widget = views::Widget::GetWidgetForNativeWindow(
+ window);
+ if (!client_widget)
+ return;
+ DCHECK(!client_widget->GetNativeView()->bounds().x());
+ int top_offset = client_widget->GetNativeView()->bounds().y();
+ views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
+ window->GetToplevelWindow());
+ if (!widget)
+ return;
+ gfx::Rect container_bounds(bounds.x(), bounds.y() - top_offset,
+ bounds.width(), bounds.height() + top_offset);
+ // TODO(reveman): Use SetBoundsConstrained().
+ gfx::Rect work_area = gfx::Screen::GetDisplayNearestPoint(
+ bounds.origin()).work_area();
+ if (work_area.IsEmpty())
+ widget->SetBounds(container_bounds);
+ else
+ widget->SetBounds(container_bounds.AdjustToFit(work_area));
+}
+
+void HostWindowManager::OnHostWindowVisibilityChanged(
+ gfx::NativeWindow window, bool visible) {
+ views::Widget* widget = views::Widget::GetWidgetForNativeWindow(
+ window->GetToplevelWindow());
+ if (!widget)
+ return;
+ if (visible)
+ widget->Show();
+ else
+ widget->Hide();
+}
+
+aura::RootWindow* HostWindowManager::GetRootWindow() {
+ return ash::Shell::GetPrimaryRootWindow();
+}
+
+} // namespace internal
+} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698