Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(347)

Side by Side Diff: components/exo/wayland/server.cc

Issue 2076013002: exo: Implement wayland gamepad support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@serv
Patch Set: minor adjustments to protocol Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/exo/wayland/server.h" 5 #include "components/exo/wayland/server.h"
6 6
7 #include <grp.h> 7 #include <grp.h>
8 #include <linux/input.h> 8 #include <linux/input.h>
9 #include <stddef.h> 9 #include <stddef.h>
10 #include <stdint.h> 10 #include <stdint.h>
11 #include <viewporter-server-protocol.h> 11 #include <viewporter-server-protocol.h>
12 #include <wayland-server-core.h> 12 #include <wayland-server-core.h>
13 #include <wayland-server-protocol-core.h> 13 #include <wayland-server-protocol-core.h>
14 14
15 // Note: core wayland headers need to be included before protocol headers. 15 // Note: core wayland headers need to be included before protocol headers.
16 #include <alpha-compositing-unstable-v1-server-protocol.h> // NOLINT 16 #include <alpha-compositing-unstable-v1-server-protocol.h> // NOLINT
17 #include <gamepads-unstable-v1-server-protocol.h> // NOLINT
17 #include <remote-shell-unstable-v1-server-protocol.h> // NOLINT 18 #include <remote-shell-unstable-v1-server-protocol.h> // NOLINT
18 #include <secure-output-unstable-v1-server-protocol.h> // NOLINT 19 #include <secure-output-unstable-v1-server-protocol.h> // NOLINT
19 #include <xdg-shell-unstable-v5-server-protocol.h> // NOLINT 20 #include <xdg-shell-unstable-v5-server-protocol.h> // NOLINT
20 #include <vsync-feedback-unstable-v1-server-protocol.h> // NOLINT 21 #include <vsync-feedback-unstable-v1-server-protocol.h> // NOLINT
21 22
22 #include <algorithm> 23 #include <algorithm>
23 #include <iterator> 24 #include <iterator>
24 #include <string> 25 #include <string>
25 #include <utility> 26 #include <utility>
26 27
27 #include "ash/common/shell_observer.h" 28 #include "ash/common/shell_observer.h"
28 #include "ash/common/shell_window_ids.h" 29 #include "ash/common/shell_window_ids.h"
29 #include "ash/common/wm_shell.h" 30 #include "ash/common/wm_shell.h"
30 #include "ash/display/display_info.h" 31 #include "ash/display/display_info.h"
31 #include "ash/display/display_manager.h" 32 #include "ash/display/display_manager.h"
32 #include "ash/shell.h" 33 #include "ash/shell.h"
33 #include "base/bind.h" 34 #include "base/bind.h"
34 #include "base/cancelable_callback.h" 35 #include "base/cancelable_callback.h"
35 #include "base/files/file_path.h" 36 #include "base/files/file_path.h"
36 #include "base/macros.h" 37 #include "base/macros.h"
37 #include "base/memory/free_deleter.h" 38 #include "base/memory/free_deleter.h"
38 #include "base/memory/ptr_util.h" 39 #include "base/memory/ptr_util.h"
39 #include "base/strings/stringprintf.h" 40 #include "base/strings/stringprintf.h"
40 #include "base/strings/utf_string_conversions.h" 41 #include "base/strings/utf_string_conversions.h"
41 #include "components/exo/buffer.h" 42 #include "components/exo/buffer.h"
42 #include "components/exo/display.h" 43 #include "components/exo/display.h"
44 #include "components/exo/gamepads.h"
45 #include "components/exo/gamepads_delegate.h"
43 #include "components/exo/keyboard.h" 46 #include "components/exo/keyboard.h"
44 #include "components/exo/keyboard_delegate.h" 47 #include "components/exo/keyboard_delegate.h"
45 #include "components/exo/pointer.h" 48 #include "components/exo/pointer.h"
46 #include "components/exo/pointer_delegate.h" 49 #include "components/exo/pointer_delegate.h"
47 #include "components/exo/shared_memory.h" 50 #include "components/exo/shared_memory.h"
48 #include "components/exo/shell_surface.h" 51 #include "components/exo/shell_surface.h"
49 #include "components/exo/sub_surface.h" 52 #include "components/exo/sub_surface.h"
50 #include "components/exo/surface.h" 53 #include "components/exo/surface.h"
51 #include "components/exo/surface_property.h" 54 #include "components/exo/surface_property.h"
52 #include "components/exo/touch.h" 55 #include "components/exo/touch.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 DestroyUserData<T>); 118 DestroyUserData<T>);
116 } 119 }
117 120
118 // Convert a timestamp to a time value that can be used when interfacing 121 // Convert a timestamp to a time value that can be used when interfacing
119 // with wayland. Note that we cast a int64_t value to uint32_t which can 122 // with wayland. Note that we cast a int64_t value to uint32_t which can
120 // potentially overflow. 123 // potentially overflow.
121 uint32_t TimeTicksToMilliseconds(base::TimeTicks ticks) { 124 uint32_t TimeTicksToMilliseconds(base::TimeTicks ticks) {
122 return (ticks - base::TimeTicks()).InMilliseconds(); 125 return (ticks - base::TimeTicks()).InMilliseconds();
123 } 126 }
124 127
128 uint32_t NowInMilliseconds() {
129 return TimeTicksToMilliseconds(base::TimeTicks::Now());
130 }
131
125 // A property key containing the surface resource that is associated with 132 // A property key containing the surface resource that is associated with
126 // window. If unset, no surface resource is associated with window. 133 // window. If unset, no surface resource is associated with window.
127 DEFINE_SURFACE_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); 134 DEFINE_SURFACE_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr);
128 135
129 // A property key containing a boolean set to true if a viewport is associated 136 // A property key containing a boolean set to true if a viewport is associated
130 // with window. 137 // with window.
131 DEFINE_SURFACE_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false); 138 DEFINE_SURFACE_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false);
132 139
133 // A property key containing a boolean set to true if a security object is 140 // A property key containing a boolean set to true if a security object is
134 // associated with window. 141 // associated with window.
(...skipping 2521 matching lines...) Expand 10 before | Expand all | Expand 10 after
2656 void* data, 2663 void* data,
2657 uint32_t version, 2664 uint32_t version,
2658 uint32_t id) { 2665 uint32_t id) {
2659 wl_resource* resource = 2666 wl_resource* resource =
2660 wl_resource_create(client, &zwp_alpha_compositing_v1_interface, 1, id); 2667 wl_resource_create(client, &zwp_alpha_compositing_v1_interface, 1, id);
2661 2668
2662 wl_resource_set_implementation(resource, &alpha_compositing_implementation, 2669 wl_resource_set_implementation(resource, &alpha_compositing_implementation,
2663 data, nullptr); 2670 data, nullptr);
2664 } 2671 }
2665 2672
2673 ////////////////////////////////////////////////////////////////////////////////
2674 // zwp_gamepads_v1:
2675
2676 // Gamepads delegate class that forwards gamepad events to the client resource.
2677 class WaylandGamepadsDelegate : public GamepadsDelegate {
2678 public:
2679 explicit WaylandGamepadsDelegate(wl_resource* gamepads_resource)
2680 : gamepads_resource_(gamepads_resource) {}
2681
2682 // Overridden from GamepadsDelegate:
2683 void OnGamepadsDestroying(Gamepads* gamepads) override { delete this; }
2684
2685 void OnConnected(int id) override {
2686 zwp_gamepads_v1_send_connected(gamepads_resource_, id);
2687 wl_client_flush(client());
2688 }
2689 void OnDisconnected(int id) override {
2690 zwp_gamepads_v1_send_disconnected(gamepads_resource_, id);
2691 wl_client_flush(client());
2692 }
2693 void OnAxis(int id, int axis, double value) override {
2694 zwp_gamepads_v1_send_axis(gamepads_resource_, NowInMilliseconds(), id,
2695 axis, wl_fixed_from_double(value));
2696 }
2697 void OnButton(int id, int button, bool pressed, double value) override {
2698 zwp_gamepads_v1_send_button(gamepads_resource_, NowInMilliseconds(), id,
2699 button, pressed, wl_fixed_from_double(value));
2700 }
2701 void OnFrame(int id) override {
2702 zwp_gamepads_v1_send_frame(gamepads_resource_, NowInMilliseconds(), id);
2703 wl_client_flush(client());
2704 }
2705
2706 private:
2707 // The client who own this gamepads instance.
2708 wl_client* client() const {
2709 return wl_resource_get_client(gamepads_resource_);
2710 }
2711
2712 // The gamepads resource associated with the gamepads.
2713 wl_resource* const gamepads_resource_;
2714
2715 DISALLOW_COPY_AND_ASSIGN(WaylandGamepadsDelegate);
2716 };
2717
2718 void gamepads_destroy(wl_client* client, wl_resource* resource) {
2719 wl_resource_destroy(resource);
2720 }
2721
2722 const struct zwp_gamepads_v1_interface gamepads_implementation = {
2723 gamepads_destroy};
2724
2725 void bind_gamepads(wl_client* client,
2726 void* data,
2727 uint32_t version,
2728 uint32_t id) {
2729 wl_resource* resource =
2730 wl_resource_create(client, &zwp_gamepads_v1_interface, version, id);
2731
2732 auto gamepads = new Gamepads(new WaylandGamepadsDelegate(resource));
2733 SetImplementation(resource, &gamepads_implementation,
2734 base::WrapUnique(gamepads));
2735 }
2736
2666 } // namespace 2737 } // namespace
2667 2738
2668 //////////////////////////////////////////////////////////////////////////////// 2739 ////////////////////////////////////////////////////////////////////////////////
2669 // Server, public: 2740 // Server, public:
2670 2741
2671 Server::Server(Display* display) 2742 Server::Server(Display* display)
2672 : display_(display), wl_display_(wl_display_create()) { 2743 : display_(display), wl_display_(wl_display_create()) {
2673 wl_global_create(wl_display_.get(), &wl_compositor_interface, 2744 wl_global_create(wl_display_.get(), &wl_compositor_interface,
2674 compositor_version, display_, bind_compositor); 2745 compositor_version, display_, bind_compositor);
2675 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); 2746 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm);
(...skipping 18 matching lines...) Expand all
2694 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, 2765 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version,
2695 display_, bind_seat); 2766 display_, bind_seat);
2696 wl_global_create(wl_display_.get(), &wp_viewporter_interface, 1, display_, 2767 wl_global_create(wl_display_.get(), &wp_viewporter_interface, 1, display_,
2697 bind_viewporter); 2768 bind_viewporter);
2698 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, 2769 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1,
2699 display_, bind_secure_output); 2770 display_, bind_secure_output);
2700 wl_global_create(wl_display_.get(), &zwp_alpha_compositing_v1_interface, 1, 2771 wl_global_create(wl_display_.get(), &zwp_alpha_compositing_v1_interface, 1,
2701 display_, bind_alpha_compositing); 2772 display_, bind_alpha_compositing);
2702 wl_global_create(wl_display_.get(), &zwp_remote_shell_v1_interface, 2773 wl_global_create(wl_display_.get(), &zwp_remote_shell_v1_interface,
2703 remote_shell_version, display_, bind_remote_shell); 2774 remote_shell_version, display_, bind_remote_shell);
2775 wl_global_create(wl_display_.get(), &zwp_gamepads_v1_interface, 1, display_,
2776 bind_gamepads);
2704 } 2777 }
2705 2778
2706 Server::~Server() {} 2779 Server::~Server() {}
2707 2780
2708 // static 2781 // static
2709 std::unique_ptr<Server> Server::Create(Display* display) { 2782 std::unique_ptr<Server> Server::Create(Display* display) {
2710 std::unique_ptr<Server> server(new Server(display)); 2783 std::unique_ptr<Server> server(new Server(display));
2711 2784
2712 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); 2785 char* runtime_dir = getenv("XDG_RUNTIME_DIR");
2713 if (!runtime_dir) { 2786 if (!runtime_dir) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2765 DCHECK(event_loop); 2838 DCHECK(event_loop);
2766 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); 2839 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds());
2767 } 2840 }
2768 2841
2769 void Server::Flush() { 2842 void Server::Flush() {
2770 wl_display_flush_clients(wl_display_.get()); 2843 wl_display_flush_clients(wl_display_.get());
2771 } 2844 }
2772 2845
2773 } // namespace wayland 2846 } // namespace wayland
2774 } // namespace exo 2847 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698