1// Copyright (c) 2010 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 "ppapi/cpp/dev/widget_client_dev.h"
6
7#include "ppapi/c/dev/ppp_scrollbar_dev.h"
8#include "ppapi/c/dev/ppp_widget_dev.h"
9#include "ppapi/cpp/dev/scrollbar_dev.h"
10#include "ppapi/cpp/dev/widget_dev.h"
11#include "ppapi/cpp/instance.h"
12#include "ppapi/cpp/instance_handle.h"
13#include "ppapi/cpp/module.h"
14#include "ppapi/cpp/module_impl.h"
15#include "ppapi/cpp/rect.h"
16
17namespace pp {
18
19namespace {
20
21// PPP_Widget_Dev --------------------------------------------------------------
22
23const char kPPPWidgetInterface[] = PPP_WIDGET_DEV_INTERFACE;
24
25void Widget_Invalidate(PP_Instance instance,
26                       PP_Resource widget_id,
27                       const PP_Rect* dirty_rect) {
28  void* object = Instance::GetPerInstanceObject(instance, kPPPWidgetInterface);
29  if (!object)
30    return;
31  return static_cast<WidgetClient_Dev*>(object)->InvalidateWidget(
32      Widget_Dev(widget_id), *dirty_rect);
33}
34
35static PPP_Widget_Dev widget_interface = {
36  &Widget_Invalidate,
37};
38
39// PPP_Scrollbar_Dev -----------------------------------------------------------
40
41const char kPPPScrollbarInterface[] = PPP_SCROLLBAR_DEV_INTERFACE;
42
43void Scrollbar_ValueChanged(PP_Instance instance,
44                            PP_Resource scrollbar_id,
45                            uint32_t value) {
46  void* object =
47      Instance::GetPerInstanceObject(instance, kPPPScrollbarInterface);
48  if (!object)
49    return;
50  return static_cast<WidgetClient_Dev*>(object)->ScrollbarValueChanged(
51      Scrollbar_Dev(scrollbar_id), value);
52}
53
54void Scrollbar_OverlayChanged(PP_Instance instance,
55                              PP_Resource scrollbar_id,
56                              PP_Bool overlay) {
57  void* object =
58      Instance::GetPerInstanceObject(instance, kPPPScrollbarInterface);
59  if (!object)
60    return;
61  return static_cast<WidgetClient_Dev*>(object)->ScrollbarOverlayChanged(
62      Scrollbar_Dev(scrollbar_id), PP_ToBool(overlay));
63}
64
65static PPP_Scrollbar_Dev scrollbar_interface = {
66  &Scrollbar_ValueChanged,
67  &Scrollbar_OverlayChanged,
68};
69
70}  // namespace
71
72WidgetClient_Dev::WidgetClient_Dev(Instance* instance)
73    : associated_instance_(instance) {
74  Module::Get()->AddPluginInterface(kPPPWidgetInterface, &widget_interface);
75  instance->AddPerInstanceObject(kPPPWidgetInterface, this);
76  Module::Get()->AddPluginInterface(kPPPScrollbarInterface,
77                                    &scrollbar_interface);
78  instance->AddPerInstanceObject(kPPPScrollbarInterface, this);
79}
80
81WidgetClient_Dev::~WidgetClient_Dev() {
82  Instance::RemovePerInstanceObject(associated_instance_,
83                                    kPPPScrollbarInterface, this);
84  Instance::RemovePerInstanceObject(associated_instance_,
85                                    kPPPWidgetInterface, this);
86}
87
88}  // namespace pp
89