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

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

Issue 1962473002: exo: Add support for alpha_compositing interface to wayland bindings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@wayland-protocols-alpha-compositing
Patch Set: Created 4 years, 7 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 <alpha-compositing-unstable-v1-server-protocol.h>
7 #include <grp.h> 8 #include <grp.h>
8 #include <linux/input.h> 9 #include <linux/input.h>
9 #include <scaler-server-protocol.h> 10 #include <scaler-server-protocol.h>
10 #include <secure-output-unstable-v1-server-protocol.h> 11 #include <secure-output-unstable-v1-server-protocol.h>
11 #include <stddef.h> 12 #include <stddef.h>
12 #include <stdint.h> 13 #include <stdint.h>
13 #include <wayland-server-core.h> 14 #include <wayland-server-core.h>
14 #include <wayland-server-protocol-core.h> 15 #include <wayland-server-protocol-core.h>
15 #include <xdg-shell-unstable-v5-server-protocol.h> 16 #include <xdg-shell-unstable-v5-server-protocol.h>
16 17
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); 106 DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr);
106 107
107 // A property key containing a boolean set to true if a viewport is associated 108 // A property key containing a boolean set to true if a viewport is associated
108 // with window. 109 // with window.
109 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false); 110 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false);
110 111
111 // A property key containing a boolean set to true if a security object is 112 // A property key containing a boolean set to true if a security object is
112 // associated with window. 113 // associated with window.
113 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasSecurityKey, false); 114 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasSecurityKey, false);
114 115
116 // A property key containing a boolean set to true if a blending object is
117 // associated with window.
118 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasBlendingKey, false);
119
115 //////////////////////////////////////////////////////////////////////////////// 120 ////////////////////////////////////////////////////////////////////////////////
116 // wl_buffer_interface: 121 // wl_buffer_interface:
117 122
118 void buffer_destroy(wl_client* client, wl_resource* resource) { 123 void buffer_destroy(wl_client* client, wl_resource* resource) {
119 wl_resource_destroy(resource); 124 wl_resource_destroy(resource);
120 } 125 }
121 126
122 const struct wl_buffer_interface buffer_implementation = {buffer_destroy}; 127 const struct wl_buffer_interface buffer_implementation = {buffer_destroy};
123 128
124 void HandleBufferReleaseCallback(wl_resource* resource) { 129 void HandleBufferReleaseCallback(wl_resource* resource) {
(...skipping 1913 matching lines...) Expand 10 before | Expand all | Expand 10 after
2038 void* data, 2043 void* data,
2039 uint32_t version, 2044 uint32_t version,
2040 uint32_t id) { 2045 uint32_t id) {
2041 wl_resource* resource = 2046 wl_resource* resource =
2042 wl_resource_create(client, &zwp_secure_output_v1_interface, 1, id); 2047 wl_resource_create(client, &zwp_secure_output_v1_interface, 1, id);
2043 2048
2044 wl_resource_set_implementation(resource, &secure_output_implementation, data, 2049 wl_resource_set_implementation(resource, &secure_output_implementation, data,
2045 nullptr); 2050 nullptr);
2046 } 2051 }
2047 2052
2053 ////////////////////////////////////////////////////////////////////////////////
2054 // blending_interface:
2055
2056 class Blending : public SurfaceObserver {
Daniele Castagna 2016/05/09 23:34:19 nit: comment before class declaration (https://goo
reveman 2016/05/10 14:05:19 Done. There are 2 other classed (Viewport, Securit
2057 public:
2058 explicit Blending(Surface* surface) : surface_(surface) {
2059 surface_->AddSurfaceObserver(this);
2060 surface_->SetProperty(kSurfaceHasBlendingKey, true);
2061 }
2062 ~Blending() override {
2063 if (surface_) {
2064 surface_->RemoveSurfaceObserver(this);
2065 surface_->SetBlendMode(SkXfermode::kSrcOver_Mode);
2066 surface_->SetAlpha(1.0f);
2067 surface_->SetProperty(kSurfaceHasBlendingKey, false);
2068 }
2069 }
2070
2071 void SetBlendMode(SkXfermode::Mode blend_mode) {
2072 surface_->SetBlendMode(blend_mode);
Daniele Castagna 2016/05/09 23:34:20 Why don't you need to check the surface_ in this c
reveman 2016/05/10 14:05:19 Good catch. Fixed in latest patch.
2073 }
2074
2075 void SetAlpha(float value) {
2076 if (surface_)
2077 surface_->SetAlpha(value);
2078 }
2079
2080 // Overridden from SurfaceObserver:
2081 void OnSurfaceDestroying(Surface* surface) override {
2082 surface->RemoveSurfaceObserver(this);
2083 surface_ = nullptr;
2084 }
2085
2086 private:
2087 Surface* surface_;
2088
2089 DISALLOW_COPY_AND_ASSIGN(Blending);
2090 };
2091
2092 void blending_destroy(wl_client* client, wl_resource* resource) {
2093 wl_resource_destroy(resource);
2094 }
2095
2096 void blending_set_blending(wl_client* client,
2097 wl_resource* resource,
2098 uint32_t equation) {
2099 switch (equation) {
2100 case ZWP_BLENDING_V1_BLENDING_EQUATION_NONE:
2101 GetUserDataAs<Blending>(resource)->SetBlendMode(SkXfermode::kSrc_Mode);
2102 break;
2103 case ZWP_BLENDING_V1_BLENDING_EQUATION_PREMULT:
2104 GetUserDataAs<Blending>(resource)->SetBlendMode(
2105 SkXfermode::kSrcOver_Mode);
2106 break;
2107 case ZWP_BLENDING_V1_BLENDING_EQUATION_COVERAGE:
2108 NOTIMPLEMENTED();
2109 break;
2110 default:
2111 DLOG(WARNING) << "Unsupported blending equation: " << equation;
Daniele Castagna 2016/05/09 23:34:20 If you're asserting with NOTIMPLEMENTED in case of
reveman 2016/05/10 14:05:19 The default case would be incorrect usage by the c
2112 break;
2113 }
2114 }
2115
2116 void blending_set_alpha(wl_client* client,
2117 wl_resource* resource,
2118 wl_fixed_t alpha) {
2119 GetUserDataAs<Blending>(resource)->SetAlpha(wl_fixed_to_double(alpha));
2120 }
2121
2122 const struct zwp_blending_v1_interface blending_implementation = {
2123 blending_destroy, blending_set_blending, blending_set_alpha};
2124
2125 ////////////////////////////////////////////////////////////////////////////////
2126 // alpha_compositing_interface:
2127
2128 void alpha_compositing_destroy(wl_client* client, wl_resource* resource) {
2129 wl_resource_destroy(resource);
2130 }
2131
2132 void alpha_compositing_get_blending(wl_client* client,
2133 wl_resource* resource,
2134 uint32_t id,
2135 wl_resource* surface_resource) {
2136 Surface* surface = GetUserDataAs<Surface>(surface_resource);
2137 if (surface->GetProperty(kSurfaceHasBlendingKey)) {
2138 wl_resource_post_error(resource,
2139 ZWP_ALPHA_COMPOSITING_V1_ERROR_BLENDING_EXISTS,
2140 "a blending object for that surface already exists");
2141 return;
2142 }
2143
2144 wl_resource* blending_resource =
2145 wl_resource_create(client, &zwp_blending_v1_interface, 1, id);
2146
2147 SetImplementation(blending_resource, &blending_implementation,
2148 base::WrapUnique(new Blending(surface)));
2149 }
2150
2151 const struct zwp_alpha_compositing_v1_interface
2152 alpha_compositing_implementation = {alpha_compositing_destroy,
2153 alpha_compositing_get_blending};
2154
2155 void bind_alpha_compositing(wl_client* client,
2156 void* data,
2157 uint32_t version,
2158 uint32_t id) {
2159 wl_resource* resource =
2160 wl_resource_create(client, &zwp_alpha_compositing_v1_interface, 1, id);
2161
2162 wl_resource_set_implementation(resource, &alpha_compositing_implementation,
2163 data, nullptr);
2164 }
2165
2048 } // namespace 2166 } // namespace
2049 2167
2050 //////////////////////////////////////////////////////////////////////////////// 2168 ////////////////////////////////////////////////////////////////////////////////
2051 // Server, public: 2169 // Server, public:
2052 2170
2053 Server::Server(Display* display) 2171 Server::Server(Display* display)
2054 : display_(display), wl_display_(wl_display_create()) { 2172 : display_(display), wl_display_(wl_display_create()) {
2055 wl_global_create(wl_display_.get(), &wl_compositor_interface, 2173 wl_global_create(wl_display_.get(), &wl_compositor_interface,
2056 compositor_version, display_, bind_compositor); 2174 compositor_version, display_, bind_compositor);
2057 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); 2175 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm);
(...skipping 12 matching lines...) Expand all
2070 wl_global_create(wl_display_.get(), &xdg_shell_interface, 1, display_, 2188 wl_global_create(wl_display_.get(), &xdg_shell_interface, 1, display_,
2071 bind_xdg_shell); 2189 bind_xdg_shell);
2072 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1, 2190 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1,
2073 display_, bind_data_device_manager); 2191 display_, bind_data_device_manager);
2074 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, 2192 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version,
2075 display_, bind_seat); 2193 display_, bind_seat);
2076 wl_global_create(wl_display_.get(), &wl_scaler_interface, scaler_version, 2194 wl_global_create(wl_display_.get(), &wl_scaler_interface, scaler_version,
2077 display_, bind_scaler); 2195 display_, bind_scaler);
2078 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, 2196 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1,
2079 display_, bind_secure_output); 2197 display_, bind_secure_output);
2198 wl_global_create(wl_display_.get(), &zwp_alpha_compositing_v1_interface, 1,
2199 display_, bind_alpha_compositing);
2080 } 2200 }
2081 2201
2082 Server::~Server() {} 2202 Server::~Server() {}
2083 2203
2084 // static 2204 // static
2085 std::unique_ptr<Server> Server::Create(Display* display) { 2205 std::unique_ptr<Server> Server::Create(Display* display) {
2086 std::unique_ptr<Server> server(new Server(display)); 2206 std::unique_ptr<Server> server(new Server(display));
2087 2207
2088 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); 2208 char* runtime_dir = getenv("XDG_RUNTIME_DIR");
2089 if (!runtime_dir) { 2209 if (!runtime_dir) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2141 DCHECK(event_loop); 2261 DCHECK(event_loop);
2142 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); 2262 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds());
2143 } 2263 }
2144 2264
2145 void Server::Flush() { 2265 void Server::Flush() {
2146 wl_display_flush_clients(wl_display_.get()); 2266 wl_display_flush_clients(wl_display_.get());
2147 } 2267 }
2148 2268
2149 } // namespace wayland 2269 } // namespace wayland
2150 } // namespace exo 2270 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698