15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/ozone/platform/dri/dri_window.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/event.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/events/ozone/evdev/event_factory_evdev.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/ozone/events_ozone.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/platform/platform_event_source.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_cursor.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_delegate.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_delegate_manager.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/ozone/platform/dri/dri_window_manager.h"
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/platform_window/platform_window_delegate.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace ui {
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DriWindow::DriWindow(PlatformWindowDelegate* delegate,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                     const gfx::Rect& bounds,
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     scoped_ptr<DriWindowDelegate> dri_window_delegate,
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     EventFactoryEvdev* event_factory,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     DriWindowDelegateManager* window_delegate_manager,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     DriWindowManager* window_manager)
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : delegate_(delegate),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      bounds_(bounds),
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      widget_(dri_window_delegate->GetAcceleratedWidget()),
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      dri_window_delegate_(dri_window_delegate.get()),
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      event_factory_(event_factory),
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      window_delegate_manager_(window_delegate_manager),
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      window_manager_(window_manager) {
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_delegate_manager_->AddWindowDelegate(widget_,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              dri_window_delegate.Pass());
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_manager_->AddWindow(widget_, this);
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DriWindow::~DriWindow() {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dri_window_delegate_->Shutdown();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_manager_->RemoveWindow(widget_);
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_delegate_manager_->RemoveWindowDelegate(widget_);
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid DriWindow::Initialize() {
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dri_window_delegate_->Initialize();
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dri_window_delegate_->OnBoundsChanged(bounds_);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->OnAcceleratedWidgetAvailable(widget_);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Show() {}
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Hide() {}
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Close() {}
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::SetBounds(const gfx::Rect& bounds) {
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bounds_ = bounds;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  delegate_->OnBoundsChanged(bounds);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (window_manager_->cursor()->GetCursorWindow() == widget_)
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    window_manager_->cursor()->HideCursor();
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dri_window_delegate_->OnBoundsChanged(bounds);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (window_manager_->cursor()->GetCursorWindow() == widget_)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    window_manager_->cursor()->ShowCursor();
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::Rect DriWindow::GetBounds() {
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return bounds_;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::SetCapture() {}
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::ReleaseCapture() {}
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::ToggleFullscreen() {}
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Maximize() {}
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Minimize() {}
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DriWindow::Restore() {}
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DriWindow::SetCursor(PlatformCursor cursor) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  window_manager_->cursor()->SetCursor(widget_, cursor);
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void DriWindow::MoveCursorTo(const gfx::Point& location) {
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  event_factory_->WarpCursorTo(widget_, location);
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool DriWindow::CanDispatchEvent(const PlatformEvent& ne) {
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(ne);
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  Event* event = static_cast<Event*>(ne);
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsMouseEvent() || event->IsScrollEvent())
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return window_manager_->cursor()->GetCursorWindow() == widget_;
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return true;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciuint32_t DriWindow::DispatchEvent(const PlatformEvent& native_event) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DispatchEventFromNativeUiEvent(
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      native_event,
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&PlatformWindowDelegate::DispatchEvent,
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(delegate_)));
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return POST_DISPATCH_STOP_PROPAGATION;
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace ui
112