| Index: views/widget/native_widget_wayland.cc
|
| diff --git a/views/widget/native_widget_wayland.cc b/views/widget/native_widget_wayland.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ec462c605183cb7bb52363e329e02d0026a4866c
|
| --- /dev/null
|
| +++ b/views/widget/native_widget_wayland.cc
|
| @@ -0,0 +1,677 @@
|
| +// Copyright (c) 2011 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 "views/widget/native_widget_wayland.h"
|
| +
|
| +#include <cairo.h>
|
| +#include <cairo-gl.h>
|
| +#include <EGL/egl.h>
|
| +#include <GL/gl.h>
|
| +#include <wayland-egl.h>
|
| +
|
| +#include <algorithm>
|
| +#include <list>
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "ui/base/view_prop.h"
|
| +#include "ui/gfx/canvas_skia_paint.h"
|
| +#include "ui/gfx/compositor/compositor.h"
|
| +#include "ui/gfx/gl/gl_surface.h"
|
| +#include "ui/gfx/gl/gl_surface_egl.h"
|
| +#include "ui/wayland/events/wayland_event.h"
|
| +#include "ui/wayland/wayland_display.h"
|
| +#include "ui/wayland/wayland_input_device.h"
|
| +#include "ui/wayland/wayland_screen.h"
|
| +#include "ui/wayland/wayland_window.h"
|
| +#include "views/ime/input_method_wayland.h"
|
| +#include "views/views_delegate.h"
|
| +#include "views/widget/native_widget_views.h"
|
| +#include "views/widget/root_view.h"
|
| +#include "views/widget/tooltip_manager_views.h"
|
| +
|
| +using ui::ViewProp;
|
| +
|
| +namespace views {
|
| +
|
| +namespace {
|
| +
|
| +// Links the WaylandWidget to its NativeWidget.
|
| +const char* const kNativeWidgetKey = "__VIEWS_NATIVE_WIDGET__";
|
| +
|
| +} // namespace
|
| +
|
| +NativeWidgetWayland::NativeWidgetWayland(
|
| + internal::NativeWidgetDelegate* delegate)
|
| + : delegate_(delegate),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)),
|
| + ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET),
|
| + has_mouse_capture_(false),
|
| + wayland_display_(
|
| + ui:: WaylandDisplay::GetDisplay(gfx::GLSurfaceEGL::GetNativeDisplay())),
|
| + wayland_window_(new ui::WaylandWindow(this, wayland_display_)),
|
| + surface_data_key_(),
|
| + damage_area_() {
|
| +}
|
| +
|
| +NativeWidgetWayland::~NativeWidgetWayland() {
|
| + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
|
| + delete delegate_;
|
| +
|
| + if (!View::get_use_acceleration_when_possible()) {
|
| + cairo_surface_destroy(cairo_surface_);
|
| + cairo_device_destroy(device_);
|
| + }
|
| +
|
| + if (egl_window_)
|
| + wl_egl_window_destroy(egl_window_);
|
| +
|
| + if (wayland_window_)
|
| + delete wayland_window_;
|
| +}
|
| +
|
| +void NativeWidgetWayland::InitNativeWidget(const Widget::InitParams& params) {
|
| + // Cannot create a window with a size smaller than 1x1
|
| + allocation_.set_width(std::max(params.bounds.width(), 1));
|
| + allocation_.set_height(std::max(params.bounds.height(), 1));
|
| +
|
| + egl_window_ = wl_egl_window_create(wayland_window_->surface(),
|
| + allocation_.width(),
|
| + allocation_.height(),
|
| + wayland_display_->visual());
|
| +
|
| + SetNativeWindowProperty(kNativeWidgetKey, this);
|
| +
|
| + if (View::get_use_acceleration_when_possible()) {
|
| + if (Widget::compositor_factory()) {
|
| + compositor_ = (*Widget::compositor_factory())();
|
| + } else {
|
| + compositor_ = ui::Compositor::Create(egl_window_, allocation_.size());
|
| + }
|
| + if (compositor_.get())
|
| + delegate_->AsWidget()->GetRootView()->SetPaintToLayer(true);
|
| + } else {
|
| + surface_ = gfx::GLSurface::CreateViewGLSurface(false, egl_window_);
|
| + context_ = gfx::GLContext::CreateGLContext(NULL, surface_.get());
|
| +
|
| + if (!context_->MakeCurrent(surface_.get()))
|
| + DLOG(ERROR) << "Failed to make surface current";
|
| +
|
| + device_ = cairo_egl_device_create(gfx::GLSurfaceEGL::GetHardwareDisplay(),
|
| + context_->GetHandle());
|
| + if (cairo_device_status(device_) != CAIRO_STATUS_SUCCESS)
|
| + DLOG(ERROR) << "Failed to create cairo egl device";
|
| +
|
| + cairo_surface_ = cairo_gl_surface_create_for_egl(device_,
|
| + surface_->GetHandle(),
|
| + allocation_.width(),
|
| + allocation_.height());
|
| + cairo_surface_set_user_data(cairo_surface_,
|
| + &surface_data_key_,
|
| + this,
|
| + NULL);
|
| + }
|
| +
|
| + delegate_->OnNativeWidgetCreated();
|
| +
|
| + if (params.type != Widget::InitParams::TYPE_TOOLTIP) {
|
| + // TODO(dnicoara) Enable this once it works with Wayland
|
| + /*
|
| + views::TooltipManagerViews* manager = new views::TooltipManagerViews(
|
| + static_cast<internal::RootView*>(GetWidget()->GetRootView()));
|
| + tooltip_manager_.reset(manager);
|
| + */
|
| + }
|
| +
|
| + // TODO(dnicoara) This should be removed when we can specify the (x, y)
|
| + // coordinates for a window. We use fullscreen since it will center the
|
| + // window rather than give it random (x, y) coordinates.
|
| + wayland_window_->set_fullscreen(true);
|
| + Show();
|
| + OnPaint(allocation_);
|
| +}
|
| +
|
| +NonClientFrameView* NativeWidgetWayland::CreateNonClientFrameView() {
|
| + return NULL;
|
| +}
|
| +
|
| +void NativeWidgetWayland::UpdateFrameAfterFrameChange() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::ShouldUseNativeFrame() const {
|
| + NOTIMPLEMENTED();
|
| + return false;
|
| +}
|
| +
|
| +void NativeWidgetWayland::FrameTypeChanged() {
|
| + // Called when the Theme has changed, so forward the event to the root
|
| + // widget
|
| + GetWidget()->ThemeChanged();
|
| + GetWidget()->GetRootView()->SchedulePaint();
|
| +}
|
| +
|
| +Widget* NativeWidgetWayland::GetWidget() {
|
| + return delegate_->AsWidget();
|
| +}
|
| +
|
| +const Widget* NativeWidgetWayland::GetWidget() const {
|
| + return delegate_->AsWidget();
|
| +}
|
| +
|
| +gfx::NativeView NativeWidgetWayland::GetNativeView() const {
|
| + return wayland_window_;
|
| +}
|
| +
|
| +gfx::NativeWindow NativeWidgetWayland::GetNativeWindow() const {
|
| + return wayland_window_;
|
| +}
|
| +
|
| +Widget* NativeWidgetWayland::GetTopLevelWidget() {
|
| + NativeWidgetPrivate* native_widget = GetTopLevelNativeWidget(GetNativeView());
|
| + return native_widget ? native_widget->GetWidget() : NULL;
|
| +}
|
| +
|
| +const ui::Compositor* NativeWidgetWayland::GetCompositor() const {
|
| + return compositor_.get();
|
| +}
|
| +
|
| +ui::Compositor* NativeWidgetWayland::GetCompositor() {
|
| + return compositor_.get();
|
| +}
|
| +
|
| +void NativeWidgetWayland::MarkLayerDirty() {
|
| +}
|
| +
|
| +void NativeWidgetWayland::CalculateOffsetToAncestorWithLayer(
|
| + gfx::Point* offset,
|
| + View** ancestor) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::ViewRemoved(View* view) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetNativeWindowProperty(const char* name,
|
| + void* value) {
|
| + // Remove the existing property (if any).
|
| + for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) {
|
| + if ((*i)->Key() == name) {
|
| + props_.erase(i);
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (value)
|
| + props_.push_back(new ViewProp(wayland_window_, name, value));
|
| +}
|
| +
|
| +void* NativeWidgetWayland::GetNativeWindowProperty(const char* name) const {
|
| + return ViewProp::GetValue(wayland_window_, name);
|
| +}
|
| +
|
| +TooltipManager* NativeWidgetWayland::GetTooltipManager() const {
|
| + return tooltip_manager_.get();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsScreenReaderActive() const {
|
| + return false;
|
| +}
|
| +
|
| +void NativeWidgetWayland::SendNativeAccessibilityEvent(
|
| + View* view,
|
| + ui::AccessibilityTypes::Event event_type) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetMouseCapture() {
|
| + NOTIMPLEMENTED();
|
| + has_mouse_capture_ = true;
|
| +}
|
| +
|
| +void NativeWidgetWayland::ReleaseMouseCapture() {
|
| + NOTIMPLEMENTED();
|
| + has_mouse_capture_ = false;
|
| +}
|
| +
|
| +bool NativeWidgetWayland::HasMouseCapture() const {
|
| + NOTIMPLEMENTED();
|
| + return has_mouse_capture_;
|
| +}
|
| +
|
| +InputMethod* NativeWidgetWayland::CreateInputMethod() {
|
| + return new InputMethodWayland(this);
|
| +}
|
| +
|
| +void NativeWidgetWayland::CenterWindow(const gfx::Size& size) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::GetWindowBoundsAndMaximizedState(
|
| + gfx::Rect* bounds,
|
| + bool* maximized) const {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetWindowTitle(const std::wstring& title) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetWindowIcons(const SkBitmap& window_icon,
|
| + const SkBitmap& app_icon) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetAccessibleName(const std::wstring& name) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetAccessibleRole(
|
| + ui::AccessibilityTypes::Role role) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetAccessibleState(
|
| + ui::AccessibilityTypes::State state) {
|
| +}
|
| +
|
| +void NativeWidgetWayland::BecomeModal() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +gfx::Rect NativeWidgetWayland::GetWindowScreenBounds() const {
|
| + return GetClientAreaScreenBounds();
|
| +}
|
| +
|
| +gfx::Rect NativeWidgetWayland::GetClientAreaScreenBounds() const {
|
| + return allocation_;
|
| +}
|
| +
|
| +gfx::Rect NativeWidgetWayland::GetRestoredBounds() const {
|
| + return GetWindowScreenBounds();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetBounds(const gfx::Rect& bounds) {
|
| + saved_allocation_ = allocation_;
|
| + allocation_ = bounds;
|
| +
|
| + // TODO(dnicoara) This needs to be updated to include (x, y).
|
| + wl_egl_window_resize(egl_window_,
|
| + allocation_.width(),
|
| + allocation_.height(),
|
| + 0, 0);
|
| + if (!View::get_use_acceleration_when_possible()) {
|
| + cairo_gl_surface_set_size(cairo_surface_,
|
| + allocation_.width(),
|
| + allocation_.height());
|
| + }
|
| +
|
| + if (compositor_.get())
|
| + compositor_->WidgetSizeChanged(allocation_.size());
|
| + delegate_->OnNativeWidgetSizeChanged(allocation_.size());
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetSize(const gfx::Size& size) {
|
| + gfx::Rect new_alloc = allocation_;
|
| + new_alloc.set_size(size);
|
| +
|
| + SetBounds(new_alloc);
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetBoundsConstrained(const gfx::Rect& bounds,
|
| + Widget* other_widget) {
|
| + // TODO(dnicoara) Need to take into account |other_widget|.
|
| + SetBounds(bounds);
|
| +}
|
| +
|
| +void NativeWidgetWayland::MoveAbove(gfx::NativeView native_view) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::MoveToTop() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetShape(gfx::NativeRegion shape) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::Close() {
|
| + Hide();
|
| + if (close_widget_factory_.empty()) {
|
| + MessageLoop::current()->PostTask(FROM_HERE,
|
| + close_widget_factory_.NewRunnableMethod(
|
| + &NativeWidgetWayland::CloseNow));
|
| + }
|
| +}
|
| +
|
| +void NativeWidgetWayland::CloseNow() {
|
| + delegate_->OnNativeWidgetDestroying();
|
| + delegate_->OnNativeWidgetDestroyed();
|
| + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
|
| + delete this;
|
| +}
|
| +
|
| +void NativeWidgetWayland::EnableClose(bool enable) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::Show() {
|
| + wayland_window_->SetVisible(true);
|
| + delegate_->OnNativeWidgetVisibilityChanged(true);
|
| +}
|
| +
|
| +void NativeWidgetWayland::Hide() {
|
| + wayland_window_->SetVisible(false);
|
| + delegate_->OnNativeWidgetVisibilityChanged(false);
|
| +}
|
| +
|
| +void NativeWidgetWayland::ShowMaximizedWithBounds(
|
| + const gfx::Rect& restored_bounds) {
|
| + Show();
|
| + Maximize();
|
| + saved_allocation_ = restored_bounds;
|
| +}
|
| +
|
| +void NativeWidgetWayland::ShowWithState(ShowState state) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsVisible() const {
|
| + return wayland_window_->IsVisible();
|
| +}
|
| +
|
| +void NativeWidgetWayland::Activate() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::Deactivate() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsActive() const {
|
| + NOTIMPLEMENTED();
|
| + return true;
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetAlwaysOnTop(bool always_on_top) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::Maximize() {
|
| + std::list<ui::WaylandScreen*> screens = wayland_display_->GetScreenList();
|
| +
|
| + if (screens.empty())
|
| + return;
|
| +
|
| + // TODO(dnicoara) We need to intersect the current coordinates with the
|
| + // screen ones and decide the correct screen to fullscreen on.
|
| + ui::WaylandScreen* screen = screens.front();
|
| +
|
| + SetBounds(screen->GetAllocation());
|
| +}
|
| +
|
| +void NativeWidgetWayland::Minimize() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsMaximized() const {
|
| + NOTIMPLEMENTED();
|
| + return true;
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsMinimized() const {
|
| + NOTIMPLEMENTED();
|
| + return false;
|
| +}
|
| +
|
| +void NativeWidgetWayland::Restore() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetFullscreen(bool fullscreen) {
|
| + gfx::Rect new_allocation = allocation_;
|
| +
|
| + if (fullscreen) {
|
| + std::list<ui::WaylandScreen*> screens = wayland_display_->GetScreenList();
|
| +
|
| + if (screens.empty())
|
| + return;
|
| +
|
| + // TODO(dnicoara) What does it mean to be fullscreen when having multiple
|
| + // monitors? If we're going fullscreen only on one screen then we need to
|
| + // intersect the current coordinates with the screen ones and decide the
|
| + // correct screen to fullscreen on.
|
| + ui::WaylandScreen* screen = screens.front();
|
| + new_allocation = screen->GetAllocation();
|
| + } else {
|
| + new_allocation = saved_allocation_;
|
| + }
|
| +
|
| + wayland_window_->set_fullscreen(fullscreen);
|
| + SetBounds(new_allocation);
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsFullscreen() const {
|
| + return wayland_window_->fullscreen();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetOpacity(unsigned char opacity) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetUseDragFrame(bool use_drag_frame) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::IsAccessibleWidget() const {
|
| + NOTIMPLEMENTED();
|
| + return true;
|
| +}
|
| +
|
| +void NativeWidgetWayland::RunShellDrag(View* view,
|
| + const ui::OSExchangeData& data,
|
| + int operation) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +gboolean NativeWidgetWayland::IdleRedraw(void* ptr) {
|
| + NativeWidgetWayland* widget = static_cast<NativeWidgetWayland*>(ptr);
|
| + gfx::Rect damage_area = widget->damage_area_;
|
| + widget->damage_area_ = gfx::Rect();
|
| +
|
| + widget->OnPaint(damage_area);
|
| +
|
| + return FALSE;
|
| +}
|
| +
|
| +void NativeWidgetWayland::SchedulePaintInRect(const gfx::Rect& rect) {
|
| + if (damage_area_.IsEmpty())
|
| + g_idle_add(NativeWidgetWayland::IdleRedraw, this);
|
| +
|
| + damage_area_ = damage_area_.Union(rect);
|
| +}
|
| +
|
| +void NativeWidgetWayland::SetCursor(gfx::NativeCursor cursor) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +
|
| +void NativeWidgetWayland::ClearNativeFocus() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +
|
| +void NativeWidgetWayland::FocusNativeView(gfx::NativeView native_view) {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +bool NativeWidgetWayland::ConvertPointFromAncestor(
|
| + const Widget* ancestor, gfx::Point* point) const {
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +// Overridden from NativeWidget
|
| +gfx::AcceleratedWidget NativeWidgetWayland::GetAcceleratedWidget() {
|
| + return egl_window_;
|
| +}
|
| +
|
| +
|
| +// Overridden from internal::InputMethodDelegate
|
| +void NativeWidgetWayland::DispatchKeyEventPostIME(const KeyEvent& key) {
|
| + NOTIMPLEMENTED();
|
| + delegate_->OnKeyEvent(key);
|
| +}
|
| +
|
| +/////////////////////////////////////////////////////////////////////////////
|
| +// NativeWidgetWayland, private, event handlers
|
| +
|
| +void NativeWidgetWayland::OnPaint(gfx::Rect damage_area) {
|
| + if (!delegate_->OnNativeWidgetPaintAccelerated(damage_area)) {
|
| + // This is required since the CanvasSkiaPaint damages the surface
|
| + // in the destructor so we need to have this done before calling
|
| + // swapbuffers.
|
| + {
|
| + cairo_rectangle_int_t region = damage_area.ToCairoRectangle();
|
| + gfx::CanvasSkiaPaint canvas(cairo_surface_, ®ion);
|
| + if (!canvas.is_empty()) {
|
| + canvas.set_composite_alpha(false);
|
| + delegate_->OnNativeWidgetPaint(&canvas);
|
| + }
|
| + }
|
| +
|
| + // Have cairo swap buffers, then let Wayland know of the damaged area.
|
| + cairo_gl_surface_swapbuffers(cairo_surface_);
|
| + wl_surface_damage(wayland_window_->surface(),
|
| + damage_area.x(), damage_area.y(),
|
| + damage_area.width(), damage_area.height());
|
| + }
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnMotionNotify(ui::WaylandEvent event) {
|
| + MouseEvent mouse_event(&event);
|
| + delegate_->OnMouseEvent(mouse_event);
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnButtonNotify(ui::WaylandEvent event) {
|
| + if (event.button.button == ui::SCROLL_UP ||
|
| + event.button.button == ui::SCROLL_DOWN) {
|
| + MouseWheelEvent mouse_event(&event);
|
| + delegate_->OnMouseEvent(mouse_event);
|
| + } else {
|
| + MouseEvent mouse_event(&event);
|
| + delegate_->OnMouseEvent(mouse_event);
|
| + }
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnKeyNotify(ui::WaylandEvent event) {
|
| + KeyEvent key_event(&event);
|
| + InputMethod* input_method = GetWidget()->GetInputMethodDirect();
|
| + if (input_method)
|
| + input_method->DispatchKeyEvent(key_event);
|
| + else
|
| + DispatchKeyEventPostIME(key_event);
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnPointerFocus(ui::WaylandEvent event) {
|
| + MouseEvent mouse_event(&event);
|
| + delegate_->OnMouseEvent(mouse_event);
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnKeyboardFocus(ui::WaylandEvent event) {
|
| + InputMethod* input_method = GetWidget()->GetInputMethodDirect();
|
| + if (input_method) {
|
| + if (event.keyboard_focus.state)
|
| + input_method->OnFocus();
|
| + else
|
| + input_method->OnBlur();
|
| + }
|
| +}
|
| +
|
| +void NativeWidgetWayland::OnGeometryChange(ui::WaylandEvent event) {
|
| + SetSize(gfx::Size(event.geometry_change.width,
|
| + event.geometry_change.height));
|
| +}
|
| +
|
| +/////////////////////////////////////////////////////////////////////////////
|
| +// Widget
|
| +
|
| +// static
|
| +bool Widget::ConvertRect(const Widget* source,
|
| + const Widget* target,
|
| + gfx::Rect* rect) {
|
| + DCHECK(source);
|
| + DCHECK(target);
|
| + DCHECK(rect);
|
| +
|
| + gfx::NativeView source_widget = source->GetNativeView();
|
| + gfx::NativeView target_widget = target->GetNativeView();
|
| + if (source_widget == target_widget)
|
| + return true;
|
| +
|
| + if (!source_widget || !target_widget)
|
| + return false;
|
| +
|
| + NOTIMPLEMENTED();
|
| + return false;
|
| +}
|
| +
|
| +namespace internal {
|
| +
|
| +/////////////////////////////////////////////////////////////////////////////
|
| +// NativeWidget
|
| +
|
| +// static
|
| +NativeWidgetPrivate* NativeWidgetPrivate::CreateNativeWidget(
|
| + internal::NativeWidgetDelegate* delegate) {
|
| + if (Widget::IsPureViews() &&
|
| + ViewsDelegate::views_delegate->GetDefaultParentView()) {
|
| + return new NativeWidgetViews(delegate);
|
| + }
|
| + return new NativeWidgetWayland(delegate);
|
| +}
|
| +
|
| +// static
|
| +NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeView(
|
| + gfx::NativeView native_view) {
|
| + return reinterpret_cast<NativeWidgetWayland*>(
|
| + ViewProp::GetValue(native_view, kNativeWidgetKey));
|
| +}
|
| +
|
| +// static
|
| +NativeWidgetPrivate* NativeWidgetPrivate::GetNativeWidgetForNativeWindow(
|
| + gfx::NativeWindow native_window) {
|
| + return GetNativeWidgetForNativeView(native_window);
|
| +}
|
| +
|
| +// static
|
| +NativeWidgetPrivate* NativeWidgetPrivate::GetTopLevelNativeWidget(
|
| + gfx::NativeView native_view) {
|
| + // TODO(dnicoara) What would be the best way to implement this?
|
| + // Since there isn't any actual parenting concept in Wayland, we could
|
| + // implement it using WaylandWindow->SetParent/GetParent calls.
|
| + return GetNativeWidgetForNativeView(native_view);
|
| +}
|
| +
|
| +// static
|
| +void NativeWidgetPrivate::GetAllChildWidgets(gfx::NativeView native_view,
|
| + Widget::Widgets* children) {
|
| + NOTIMPLEMENTED();
|
| + if (!native_view)
|
| + return;
|
| +}
|
| +
|
| +// static
|
| +void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view,
|
| + gfx::NativeView new_parent) {
|
| + NOTIMPLEMENTED();
|
| + if (!native_view)
|
| + return;
|
| +}
|
| +
|
| +// static
|
| +bool NativeWidgetPrivate::IsMouseButtonDown() {
|
| + NOTIMPLEMENTED();
|
| + return false;
|
| +}
|
| +
|
| +} // namespace internal
|
| +
|
| +} // namespace views
|
|
|