Home | History | Annotate | Download | only in caca
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/ozone/platform/caca/caca_window.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/debug/trace_event.h"
      9 #include "base/logging.h"
     10 #include "base/message_loop/message_loop.h"
     11 #include "ui/events/ozone/events_ozone.h"
     12 #include "ui/events/platform/platform_event_source.h"
     13 #include "ui/ozone/platform/caca/caca_event_source.h"
     14 #include "ui/ozone/platform/caca/caca_window_manager.h"
     15 #include "ui/platform_window/platform_window_delegate.h"
     16 
     17 namespace ui {
     18 
     19 namespace {
     20 
     21 // Size of initial cnavas (in characters).
     22 const int kDefaultCanvasWidth = 160;
     23 const int kDefaultCanvasHeight = 48;
     24 
     25 }  // namespace
     26 
     27 // TODO(dnicoara) As an optimization, |bitmap_size_| should be scaled based on
     28 // |physical_size_| and font size.
     29 CacaWindow::CacaWindow(PlatformWindowDelegate* delegate,
     30                        CacaWindowManager* manager,
     31                        CacaEventSource* event_source,
     32                        const gfx::Rect& bounds)
     33     : delegate_(delegate),
     34       manager_(manager),
     35       event_source_(event_source),
     36       weak_ptr_factory_(this) {
     37   widget_ = manager_->AddWindow(this);
     38   ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
     39   delegate_->OnAcceleratedWidgetAvailable(widget_);
     40 }
     41 
     42 CacaWindow::~CacaWindow() {
     43   ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
     44   manager_->RemoveWindow(widget_, this);
     45 }
     46 
     47 bool CacaWindow::Initialize() {
     48   if (display_)
     49     return true;
     50 
     51   canvas_.reset(caca_create_canvas(kDefaultCanvasWidth, kDefaultCanvasHeight));
     52   if (!canvas_) {
     53     PLOG(ERROR) << "failed to create libcaca canvas";
     54     return false;
     55   }
     56 
     57   display_.reset(caca_create_display(canvas_.get()));
     58   if (!display_) {
     59     PLOG(ERROR) << "failed to initialize libcaca display";
     60     return false;
     61   }
     62 
     63   caca_set_cursor(display_.get(), 1);
     64   caca_set_display_title(display_.get(), "Ozone Content Shell");
     65 
     66   UpdateDisplaySize();
     67 
     68   TryProcessingEvent();
     69 
     70   return true;
     71 }
     72 
     73 void CacaWindow::TryProcessingEvent() {
     74   event_source_->TryProcessingEvent(this);
     75 
     76   // Caca uses a poll based event retrieval. Since we don't want to block we'd
     77   // either need to spin up a new thread or just poll. For simplicity just poll
     78   // for messages.
     79   base::MessageLoop::current()->PostDelayedTask(
     80       FROM_HERE,
     81       base::Bind(&CacaWindow::TryProcessingEvent,
     82                  weak_ptr_factory_.GetWeakPtr()),
     83       base::TimeDelta::FromMilliseconds(10));
     84 }
     85 
     86 void CacaWindow::UpdateDisplaySize() {
     87   physical_size_.SetSize(caca_get_canvas_width(canvas_.get()),
     88                          caca_get_canvas_height(canvas_.get()));
     89 
     90   bitmap_size_.SetSize(caca_get_display_width(display_.get()),
     91                        caca_get_display_height(display_.get()));
     92 }
     93 
     94 void CacaWindow::OnCacaResize() {
     95   UpdateDisplaySize();
     96 
     97   delegate_->OnBoundsChanged(gfx::Rect(bitmap_size_));
     98 }
     99 
    100 void CacaWindow::OnCacaQuit() {
    101   delegate_->OnCloseRequest();
    102 }
    103 
    104 
    105 void CacaWindow::OnCacaEvent(ui::Event* event) {
    106   DispatchEventFromNativeUiEvent(
    107       event,
    108       base::Bind(&PlatformWindowDelegate::DispatchEvent,
    109                  base::Unretained(delegate_)));
    110 }
    111 
    112 gfx::Rect CacaWindow::GetBounds() { return gfx::Rect(bitmap_size_); }
    113 
    114 void CacaWindow::SetBounds(const gfx::Rect& bounds) {}
    115 
    116 void CacaWindow::Show() {}
    117 
    118 void CacaWindow::Hide() {}
    119 
    120 void CacaWindow::Close() {}
    121 
    122 void CacaWindow::SetCapture() {}
    123 
    124 void CacaWindow::ReleaseCapture() {}
    125 
    126 void CacaWindow::ToggleFullscreen() {}
    127 
    128 void CacaWindow::Maximize() {}
    129 
    130 void CacaWindow::Minimize() {}
    131 
    132 void CacaWindow::Restore() {}
    133 
    134 void CacaWindow::SetCursor(PlatformCursor cursor) {}
    135 
    136 void CacaWindow::MoveCursorTo(const gfx::Point& location) {}
    137 
    138 bool CacaWindow::CanDispatchEvent(const PlatformEvent& event) { return true; }
    139 
    140 uint32_t CacaWindow::DispatchEvent(const PlatformEvent& ne) {
    141   // We don't dispatch events via PlatformEventSource.
    142   NOTREACHED();
    143   return ui::POST_DISPATCH_STOP_PROPAGATION;
    144 }
    145 
    146 }  // namespace ui
    147