Index: chrome/views/window/window_gtk.cc |
=================================================================== |
--- chrome/views/window/window_gtk.cc (revision 0) |
+++ chrome/views/window/window_gtk.cc (revision 0) |
@@ -0,0 +1,199 @@ |
+// Copyright (c) 2009 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 "chrome/views/window/window_gtk.h" |
+ |
+#include "app/l10n_util.h" |
+#include "base/gfx/rect.h" |
+#include "chrome/views/window/custom_frame_view.h" |
+#include "chrome/views/window/non_client_view.h" |
+#include "chrome/views/window/window_delegate.h" |
+ |
+namespace views { |
+ |
+WindowGtk::~WindowGtk() { |
+} |
+ |
+// static |
+Window* Window::CreateChromeWindow(gfx::NativeWindow parent, |
+ const gfx::Rect& bounds, |
+ WindowDelegate* window_delegate) { |
+ WindowGtk* window = new WindowGtk(window_delegate); |
+ window->GetNonClientView()->SetFrameView(window->CreateFrameViewForWindow()); |
+ window->Init(bounds); |
+ return window; |
+} |
+ |
+gfx::Rect WindowGtk::GetBounds() const { |
+ gfx::Rect bounds; |
+ WidgetGtk::GetBounds(&bounds, true); |
+ return bounds; |
+} |
+ |
+gfx::Rect WindowGtk::GetNormalBounds() const { |
+ NOTIMPLEMENTED(); |
+ return GetBounds(); |
+} |
+ |
+void WindowGtk::SetBounds(const gfx::Rect& bounds) { |
+ // TODO: this may need to set an initial size if not showing. |
+ // TODO: need to constrain based on screen size. |
+ gtk_window_resize(GTK_WINDOW(GetNativeView()), bounds.width(), |
+ bounds.height()); |
+ |
+ gtk_window_move(GTK_WINDOW(GetNativeView()), bounds.x(), bounds.y()); |
+} |
+ |
+void WindowGtk::SetBounds(const gfx::Rect& bounds, |
+ gfx::NativeWindow other_window) { |
+ // TODO: need to deal with other_window. |
+ SetBounds(bounds); |
+} |
+ |
+void WindowGtk::Show() { |
+ gtk_widget_show_all(GetNativeView()); |
+} |
+ |
+void WindowGtk::Activate() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void WindowGtk::Close() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void WindowGtk::Maximize() { |
+ gtk_window_maximize(GetNativeWindow()); |
+} |
+ |
+void WindowGtk::Minimize() { |
+ gtk_window_iconify(GetNativeWindow()); |
+} |
+ |
+void WindowGtk::Restore() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool WindowGtk::IsActive() const { |
+ return gtk_window_is_active(GetNativeWindow()); |
+} |
+ |
+bool WindowGtk::IsVisible() const { |
+ return GTK_WIDGET_VISIBLE(GetNativeView()); |
+} |
+ |
+bool WindowGtk::IsMaximized() const { |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+bool WindowGtk::IsMinimized() const { |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+void WindowGtk::SetFullscreen(bool fullscreen) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+bool WindowGtk::IsFullscreen() const { |
+ NOTIMPLEMENTED(); |
+ return false; |
+} |
+ |
+void WindowGtk::EnableClose(bool enable) { |
+ gtk_window_set_deletable(GetNativeWindow(), enable); |
+} |
+ |
+void WindowGtk::DisableInactiveRendering() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+void WindowGtk::UpdateWindowTitle() { |
+ // If the non-client view is rendering its own title, it'll need to relayout |
+ // now. |
+ non_client_view_->Layout(); |
+ |
+ // Update the native frame's text. We do this regardless of whether or not |
+ // the native frame is being used, since this also updates the taskbar, etc. |
+ std::wstring window_title = window_delegate_->GetWindowTitle(); |
+ std::wstring localized_text; |
+ if (l10n_util::AdjustStringForLocaleDirection(window_title, &localized_text)) |
+ window_title.assign(localized_text); |
+ |
+ gtk_window_set_title(GetNativeWindow(), WideToUTF8(window_title).c_str()); |
+} |
+ |
+void WindowGtk::UpdateWindowIcon() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+NonClientFrameView* WindowGtk::CreateFrameViewForWindow() { |
+ // TODO(erg): Always use a custom frame view? Are there cases where we let |
+ // the window manager deal with the X11 equivalent of the "non-client" area? |
+ return new CustomFrameView(this); |
+} |
+ |
+void WindowGtk::UpdateFrameAfterFrameChange() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+WindowDelegate* WindowGtk::GetDelegate() const { |
+ return window_delegate_; |
+} |
+ |
+NonClientView* WindowGtk::GetNonClientView() const { |
+ return non_client_view_; |
+} |
+ |
+ClientView* WindowGtk::GetClientView() const { |
+ return non_client_view_->client_view(); |
+} |
+ |
+gfx::NativeWindow WindowGtk::GetNativeWindow() const { |
+ return GTK_WINDOW(GetNativeView()); |
+} |
+ |
+WindowGtk::WindowGtk(WindowDelegate* window_delegate) |
+ : WidgetGtk(TYPE_WINDOW), |
+ is_modal_(false), |
+ is_always_on_top_(false), |
+ window_delegate_(window_delegate), |
+ non_client_view_(new NonClientView(this)) { |
+ window_delegate_->window_.reset(this); |
+} |
+ |
+void WindowGtk::Init(const gfx::Rect& bounds) { |
+ // We call this after initializing our members since our implementations of |
+ // assorted WidgetWin functions may be called during initialization. |
+ is_modal_ = window_delegate_->IsModal(); |
+ if (is_modal_) { |
+ // TODO(erg): Fix once modality works. |
+ // BecomeModal(); |
+ } |
+ is_always_on_top_ = window_delegate_->IsAlwaysOnTop(); |
+ |
+ WidgetGtk::Init(bounds, true); |
+ |
+ // Create the ClientView, add it to the NonClientView and add the |
+ // NonClientView to the RootView. This will cause everything to be parented. |
+ non_client_view_->set_client_view(window_delegate_->CreateClientView(this)); |
+ WidgetGtk::SetContentsView(non_client_view_); |
+ |
+ UpdateWindowTitle(); |
+ |
+ // SetInitialBounds(bounds); |
+ // InitAlwaysOnTopState(); |
+ |
+ // if (!IsAppWindow()) { |
+ // notification_registrar_.Add( |
+ // this, |
+ // NotificationType::ALL_APPWINDOWS_CLOSED, |
+ // NotificationService::AllSources()); |
+ // } |
+ |
+ // ResetWindowRegion(false); |
+} |
+ |
+} // namespace views |