| Index: ui/ozone/platform/drm/host/drm_window_host.cc
|
| diff --git a/ui/ozone/platform/drm/host/drm_window_host.cc b/ui/ozone/platform/drm/host/drm_window_host.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..51c19ce06386987c17088c16aff9ed2c64a46a98
|
| --- /dev/null
|
| +++ b/ui/ozone/platform/drm/host/drm_window_host.cc
|
| @@ -0,0 +1,195 @@
|
| +// Copyright 2014 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 "ui/ozone/platform/drm/host/drm_window_host.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "ui/events/devices/device_data_manager.h"
|
| +#include "ui/events/event.h"
|
| +#include "ui/events/ozone/evdev/event_factory_evdev.h"
|
| +#include "ui/events/ozone/events_ozone.h"
|
| +#include "ui/events/platform/platform_event_source.h"
|
| +#include "ui/gfx/display.h"
|
| +#include "ui/ozone/platform/drm/host/drm_cursor.h"
|
| +#include "ui/ozone/platform/drm/host/drm_display_host.h"
|
| +#include "ui/ozone/platform/drm/host/drm_display_host_manager.h"
|
| +#include "ui/ozone/platform/drm/host/drm_gpu_platform_support_host.h"
|
| +#include "ui/ozone/platform/drm/host/drm_window_host_manager.h"
|
| +#include "ui/platform_window/platform_window_delegate.h"
|
| +
|
| +namespace ui {
|
| +
|
| +DrmWindowHost::DrmWindowHost(PlatformWindowDelegate* delegate,
|
| + const gfx::Rect& bounds,
|
| + DrmGpuPlatformSupportHost* sender,
|
| + EventFactoryEvdev* event_factory,
|
| + DrmCursor* cursor,
|
| + DrmWindowHostManager* window_manager,
|
| + DrmDisplayHostManager* display_manager)
|
| + : delegate_(delegate),
|
| + sender_(sender),
|
| + event_factory_(event_factory),
|
| + cursor_(cursor),
|
| + window_manager_(window_manager),
|
| + display_manager_(display_manager),
|
| + bounds_(bounds),
|
| + widget_(window_manager->NextAcceleratedWidget()) {
|
| + window_manager_->AddWindow(widget_, this);
|
| +}
|
| +
|
| +DrmWindowHost::~DrmWindowHost() {
|
| + PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
|
| + window_manager_->RemoveWindow(widget_);
|
| + cursor_->OnWindowRemoved(widget_);
|
| +
|
| + sender_->RemoveChannelObserver(this);
|
| + sender_->DestroyWindow(widget_);
|
| +}
|
| +
|
| +void DrmWindowHost::Initialize() {
|
| + sender_->AddChannelObserver(this);
|
| + PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
|
| + cursor_->OnWindowAdded(widget_, bounds_, GetCursorConfinedBounds());
|
| + delegate_->OnAcceleratedWidgetAvailable(widget_);
|
| +}
|
| +
|
| +gfx::AcceleratedWidget DrmWindowHost::GetAcceleratedWidget() {
|
| + return widget_;
|
| +}
|
| +
|
| +gfx::Rect DrmWindowHost::GetCursorConfinedBounds() const {
|
| + return cursor_confined_bounds_.IsEmpty() ? gfx::Rect(bounds_.size())
|
| + : cursor_confined_bounds_;
|
| +}
|
| +
|
| +void DrmWindowHost::Show() {
|
| +}
|
| +
|
| +void DrmWindowHost::Hide() {
|
| +}
|
| +
|
| +void DrmWindowHost::Close() {
|
| +}
|
| +
|
| +void DrmWindowHost::SetBounds(const gfx::Rect& bounds) {
|
| + bounds_ = bounds;
|
| + delegate_->OnBoundsChanged(bounds);
|
| + SendBoundsChange();
|
| +}
|
| +
|
| +gfx::Rect DrmWindowHost::GetBounds() {
|
| + return bounds_;
|
| +}
|
| +
|
| +void DrmWindowHost::SetCapture() {
|
| + window_manager_->GrabEvents(widget_);
|
| +}
|
| +
|
| +void DrmWindowHost::ReleaseCapture() {
|
| + window_manager_->UngrabEvents(widget_);
|
| +}
|
| +
|
| +void DrmWindowHost::ToggleFullscreen() {
|
| +}
|
| +
|
| +void DrmWindowHost::Maximize() {
|
| +}
|
| +
|
| +void DrmWindowHost::Minimize() {
|
| +}
|
| +
|
| +void DrmWindowHost::Restore() {
|
| +}
|
| +
|
| +void DrmWindowHost::SetCursor(PlatformCursor cursor) {
|
| + cursor_->SetCursor(widget_, cursor);
|
| +}
|
| +
|
| +void DrmWindowHost::MoveCursorTo(const gfx::Point& location) {
|
| + event_factory_->WarpCursorTo(widget_, location);
|
| +}
|
| +
|
| +void DrmWindowHost::ConfineCursorToBounds(const gfx::Rect& bounds) {
|
| + if (cursor_confined_bounds_ == bounds)
|
| + return;
|
| +
|
| + cursor_confined_bounds_ = bounds;
|
| + cursor_->CommitBoundsChange(widget_, bounds_, bounds);
|
| +}
|
| +
|
| +bool DrmWindowHost::CanDispatchEvent(const PlatformEvent& ne) {
|
| + DCHECK(ne);
|
| + Event* event = static_cast<Event*>(ne);
|
| +
|
| + // If there is a grab, capture events here.
|
| + gfx::AcceleratedWidget grabber = window_manager_->event_grabber();
|
| + if (grabber != gfx::kNullAcceleratedWidget)
|
| + return grabber == widget_;
|
| +
|
| + if (event->IsTouchEvent()) {
|
| + // Dispatch the event if it is from the touchscreen associated with the
|
| + // DrmWindowHost. We cannot check the event's location because if the
|
| + // touchscreen has a bezel, touches in the bezel have a location outside of
|
| + // |bounds_|.
|
| + int64_t display_id =
|
| + DeviceDataManager::GetInstance()->GetTargetDisplayForTouchDevice(
|
| + event->source_device_id());
|
| +
|
| + if (display_id == gfx::Display::kInvalidDisplayID)
|
| + return false;
|
| +
|
| + DrmDisplayHost* display = display_manager_->GetDisplay(display_id);
|
| + if (!display)
|
| + return false;
|
| +
|
| + DisplaySnapshot* snapshot = display->snapshot();
|
| + if (!snapshot->current_mode())
|
| + return false;
|
| +
|
| + gfx::Rect display_bounds(snapshot->origin(),
|
| + snapshot->current_mode()->size());
|
| + return display_bounds == bounds_;
|
| + } else if (event->IsLocatedEvent()) {
|
| + LocatedEvent* located_event = static_cast<LocatedEvent*>(event);
|
| + return bounds_.Contains(gfx::ToFlooredPoint(located_event->location()));
|
| + }
|
| +
|
| + // TODO(spang): For non-ash builds we would need smarter keyboard focus.
|
| + return true;
|
| +}
|
| +
|
| +uint32_t DrmWindowHost::DispatchEvent(const PlatformEvent& native_event) {
|
| + DCHECK(native_event);
|
| +
|
| + Event* event = static_cast<Event*>(native_event);
|
| + if (event->IsLocatedEvent()) {
|
| + // Make the event location relative to this window's origin.
|
| + LocatedEvent* located_event = static_cast<LocatedEvent*>(event);
|
| + gfx::PointF location = located_event->location();
|
| + location -= bounds_.OffsetFromOrigin();
|
| + located_event->set_location(location);
|
| + located_event->set_root_location(location);
|
| + }
|
| + DispatchEventFromNativeUiEvent(
|
| + native_event, base::Bind(&PlatformWindowDelegate::DispatchEvent,
|
| + base::Unretained(delegate_)));
|
| + return POST_DISPATCH_STOP_PROPAGATION;
|
| +}
|
| +
|
| +void DrmWindowHost::OnChannelEstablished() {
|
| + sender_->CreateWindow(widget_);
|
| + SendBoundsChange();
|
| +}
|
| +
|
| +void DrmWindowHost::OnChannelDestroyed() {
|
| +}
|
| +
|
| +void DrmWindowHost::SendBoundsChange() {
|
| + // Update the cursor before the window so that the cursor stays within the
|
| + // window bounds when the window size shrinks.
|
| + cursor_->CommitBoundsChange(widget_, bounds_, GetCursorConfinedBounds());
|
| + sender_->WindowBoundsChanged(widget_, bounds_);
|
| +}
|
| +
|
| +} // namespace ui
|
|
|