| // Copyright 2018 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 "components/exo/wayland/zwp_input_timestamps_manager.h" |
| |
| #include <input-timestamps-unstable-v1-server-protocol.h> |
| #include <wayland-server-core.h> |
| #include <wayland-server-protocol-core.h> |
| |
| #include "components/exo/keyboard.h" |
| #include "components/exo/pointer.h" |
| #include "components/exo/touch.h" |
| #include "components/exo/wayland/server_util.h" |
| #include "components/exo/wayland/wayland_input_delegate.h" |
| #include "components/exo/wayland/wayland_keyboard_delegate.h" |
| #include "components/exo/wayland/wayland_pointer_delegate.h" |
| #include "components/exo/wayland/wayland_touch_delegate.h" |
| |
| namespace exo { |
| namespace wayland { |
| |
| namespace { |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // input_timestamps_v1 interface: |
| |
| class WaylandInputTimestamps : public WaylandInputDelegate::Observer { |
| public: |
| WaylandInputTimestamps(wl_resource* resource, WaylandInputDelegate* delegate) |
| : resource_(resource), delegate_(delegate) { |
| delegate_->AddObserver(this); |
| } |
| |
| ~WaylandInputTimestamps() override { |
| if (delegate_) |
| delegate_->RemoveObserver(this); |
| } |
| |
| // Overridden from WaylandInputDelegate::Observer: |
| void OnDelegateDestroying(WaylandInputDelegate* delegate) override { |
| DCHECK(delegate_ == delegate); |
| delegate_ = nullptr; |
| } |
| void OnSendTimestamp(base::TimeTicks time_stamp) override { |
| timespec ts = (time_stamp - base::TimeTicks()).ToTimeSpec(); |
| |
| zwp_input_timestamps_v1_send_timestamp( |
| resource_, static_cast<uint64_t>(ts.tv_sec) >> 32, |
| ts.tv_sec & 0xffffffff, ts.tv_nsec); |
| } |
| |
| private: |
| wl_resource* const resource_; |
| WaylandInputDelegate* delegate_; |
| |
| DISALLOW_COPY_AND_ASSIGN(WaylandInputTimestamps); |
| }; |
| |
| void input_timestamps_destroy(struct wl_client* client, |
| struct wl_resource* resource) { |
| wl_resource_destroy(resource); |
| } |
| |
| const struct zwp_input_timestamps_v1_interface input_timestamps_implementation = |
| {input_timestamps_destroy}; |
| |
| //////////////////////////////////////////////////////////////////////////////// |
| // input_timestamps_manager_v1 interface: |
| |
| void input_timestamps_manager_destroy(struct wl_client* client, |
| struct wl_resource* resource) { |
| wl_resource_destroy(resource); |
| } |
| |
| template <typename T, typename D> |
| void input_timestamps_manager_get_timestamps(wl_client* client, |
| wl_resource* resource, |
| uint32_t id, |
| wl_resource* input_resource) { |
| wl_resource* input_timestamps_resource = |
| wl_resource_create(client, &zwp_input_timestamps_v1_interface, 1, id); |
| |
| auto input_timestamps = std::make_unique<WaylandInputTimestamps>( |
| input_timestamps_resource, |
| static_cast<WaylandInputDelegate*>( |
| static_cast<D*>(GetUserDataAs<T>(input_resource)->delegate()))); |
| |
| SetImplementation(input_timestamps_resource, &input_timestamps_implementation, |
| std::move(input_timestamps)); |
| } |
| |
| const struct zwp_input_timestamps_manager_v1_interface |
| input_timestamps_manager_implementation = { |
| input_timestamps_manager_destroy, |
| input_timestamps_manager_get_timestamps<Keyboard, |
| WaylandKeyboardDelegate>, |
| input_timestamps_manager_get_timestamps<Pointer, |
| WaylandPointerDelegate>, |
| input_timestamps_manager_get_timestamps<Touch, WaylandTouchDelegate>}; |
| |
| } // namespace |
| |
| void bind_input_timestamps_manager(wl_client* client, |
| void* data, |
| uint32_t version, |
| uint32_t id) { |
| wl_resource* resource = wl_resource_create( |
| client, &zwp_input_timestamps_manager_v1_interface, 1, id); |
| |
| wl_resource_set_implementation( |
| resource, &input_timestamps_manager_implementation, nullptr, nullptr); |
| } |
| |
| } // namespace wayland |
| } // namespace exo |