- add sources.
[platform/framework/web/crosswalk.git] / src / ozone / wayland / surface.cc
1 // Copyright 2013 Intel Corporation. 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 "ozone/wayland/surface.h"
6
7 #include "ozone/wayland/display.h"
8
9 namespace ozonewayland {
10 static const struct wl_callback_listener frameListener = {
11     WaylandSurface::SurfaceFrameCallback
12 };
13
14 WaylandSurface::WaylandSurface() : surface_(NULL),
15     frameCallBack_(NULL),
16     m_queue(NULL) {
17   WaylandDisplay* display = WaylandDisplay::GetInstance();
18   surface_ = wl_compositor_create_surface(display->GetCompositor());
19
20   if (!surface_)
21     return;
22
23   m_queue = wl_display_create_queue(display->display());
24   wl_proxy_set_queue((struct wl_proxy *)display->registry(), m_queue);
25 }
26
27 WaylandSurface::~WaylandSurface() {
28   DeleteFrameCallBack();
29
30   if (surface_) {
31     wl_surface_destroy(surface_);
32     surface_ = 0;
33   }
34 }
35
36 void WaylandSurface::AddFrameCallBack() {
37   if (frameCallBack_)
38     return;
39
40   frameCallBack_ = wl_surface_frame(surface_);
41   wl_callback_add_listener(frameCallBack_, &frameListener, this);
42   wl_proxy_set_queue((struct wl_proxy *)frameCallBack_, m_queue);
43 }
44
45 void WaylandSurface::DeleteFrameCallBack() {
46   if (frameCallBack_) {
47     wl_callback_destroy(frameCallBack_);
48     frameCallBack_ = 0;
49   }
50 }
51
52 int WaylandSurface::EnsureFrameCallBackDone() {
53   if (!m_queue)
54     return -1;
55
56   int ret = 0;
57   wl_display* display = WaylandDisplay::GetInstance()->display();
58
59   if (frameCallBack_) {
60     while (frameCallBack_ && ret != -1)
61       ret = wl_display_dispatch_queue(display, m_queue);
62
63     wl_display_dispatch_pending(display);
64   }
65
66   return ret;
67 }
68
69 void WaylandSurface::SurfaceFrameCallback(void* data,
70                                           struct wl_callback* callback,
71                                           uint32_t) {
72   WaylandSurface* surface = static_cast<WaylandSurface *>(data);
73   wl_callback_destroy(callback);
74   surface->DestroyFrameCallBack();
75 }
76
77 void WaylandSurface::DestroyFrameCallBack() {
78   frameCallBack_ = NULL;
79 }
80
81 }  // namespace ozonewayland