OLD | NEW |
---|---|
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 <scaler-server-protocol.h> | 9 #include <scaler-server-protocol.h> |
10 #include <secure-output-unstable-v1-server-protocol.h> | |
10 #include <stddef.h> | 11 #include <stddef.h> |
11 #include <stdint.h> | 12 #include <stdint.h> |
12 #include <wayland-server-core.h> | 13 #include <wayland-server-core.h> |
13 #include <wayland-server-protocol-core.h> | 14 #include <wayland-server-protocol-core.h> |
14 #include <xdg-shell-unstable-v5-server-protocol.h> | 15 #include <xdg-shell-unstable-v5-server-protocol.h> |
15 | 16 |
16 #include <algorithm> | 17 #include <algorithm> |
17 #include <iterator> | 18 #include <iterator> |
18 #include <string> | 19 #include <string> |
19 #include <utility> | 20 #include <utility> |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
96 } | 97 } |
97 | 98 |
98 // A property key containing the surface resource that is associated with | 99 // A property key containing the surface resource that is associated with |
99 // window. If unset, no surface resource is associated with window. | 100 // window. If unset, no surface resource is associated with window. |
100 DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); | 101 DEFINE_WINDOW_PROPERTY_KEY(wl_resource*, kSurfaceResourceKey, nullptr); |
101 | 102 |
102 // A property key containing a boolean set to true if a viewport is associated | 103 // A property key containing a boolean set to true if a viewport is associated |
103 // with window. | 104 // with window. |
104 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false); | 105 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasViewportKey, false); |
105 | 106 |
107 // A property key containing a boolean set to true if a security object is | |
108 // associated with window. | |
109 DEFINE_WINDOW_PROPERTY_KEY(bool, kSurfaceHasSecurityKey, false); | |
110 | |
106 //////////////////////////////////////////////////////////////////////////////// | 111 //////////////////////////////////////////////////////////////////////////////// |
107 // wl_buffer_interface: | 112 // wl_buffer_interface: |
108 | 113 |
109 void buffer_destroy(wl_client* client, wl_resource* resource) { | 114 void buffer_destroy(wl_client* client, wl_resource* resource) { |
110 wl_resource_destroy(resource); | 115 wl_resource_destroy(resource); |
111 } | 116 } |
112 | 117 |
113 const struct wl_buffer_interface buffer_implementation = {buffer_destroy}; | 118 const struct wl_buffer_interface buffer_implementation = {buffer_destroy}; |
114 | 119 |
115 void HandleBufferReleaseCallback(wl_resource* resource) { | 120 void HandleBufferReleaseCallback(wl_resource* resource) { |
(...skipping 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1867 uint32_t id, | 1872 uint32_t id, |
1868 wl_resource* surface_resource) { | 1873 wl_resource* surface_resource) { |
1869 Surface* surface = GetUserDataAs<Surface>(surface_resource); | 1874 Surface* surface = GetUserDataAs<Surface>(surface_resource); |
1870 if (surface->GetProperty(kSurfaceHasViewportKey)) { | 1875 if (surface->GetProperty(kSurfaceHasViewportKey)) { |
1871 wl_resource_post_error(resource, WL_SCALER_ERROR_VIEWPORT_EXISTS, | 1876 wl_resource_post_error(resource, WL_SCALER_ERROR_VIEWPORT_EXISTS, |
1872 "a viewport for that surface already exists"); | 1877 "a viewport for that surface already exists"); |
1873 return; | 1878 return; |
1874 } | 1879 } |
1875 | 1880 |
1876 wl_resource* viewport_resource = wl_resource_create( | 1881 wl_resource* viewport_resource = wl_resource_create( |
1877 client, &wl_viewport_interface, wl_resource_get_version(resource), id); | 1882 client, &wl_viewport_interface, wl_resource_get_version(resource), id); |
Daniele Castagna
2016/03/16 22:28:07
Maybe mention this minor change in the description
reveman
2016/03/17 16:36:32
Done.
| |
1878 if (!viewport_resource) { | |
1879 wl_resource_post_no_memory(resource); | |
1880 return; | |
1881 } | |
1882 | 1883 |
1883 SetImplementation(viewport_resource, &viewport_implementation, | 1884 SetImplementation(viewport_resource, &viewport_implementation, |
1884 make_scoped_ptr(new Viewport(surface))); | 1885 make_scoped_ptr(new Viewport(surface))); |
1885 } | 1886 } |
1886 | 1887 |
1887 const struct wl_scaler_interface scaler_implementation = {scaler_destroy, | 1888 const struct wl_scaler_interface scaler_implementation = {scaler_destroy, |
1888 scaler_get_viewport}; | 1889 scaler_get_viewport}; |
1889 | 1890 |
1890 const uint32_t scaler_version = 2; | 1891 const uint32_t scaler_version = 2; |
1891 | 1892 |
1892 void bind_scaler(wl_client* client, void* data, uint32_t version, uint32_t id) { | 1893 void bind_scaler(wl_client* client, void* data, uint32_t version, uint32_t id) { |
1893 wl_resource* resource = wl_resource_create( | 1894 wl_resource* resource = wl_resource_create( |
1894 client, &wl_scaler_interface, std::min(version, scaler_version), id); | 1895 client, &wl_scaler_interface, std::min(version, scaler_version), id); |
1895 if (!resource) { | 1896 |
1896 wl_client_post_no_memory(client); | |
1897 return; | |
1898 } | |
1899 wl_resource_set_implementation(resource, &scaler_implementation, data, | 1897 wl_resource_set_implementation(resource, &scaler_implementation, data, |
1900 nullptr); | 1898 nullptr); |
1901 } | 1899 } |
1902 | 1900 |
1901 //////////////////////////////////////////////////////////////////////////////// | |
1902 // security_interface: | |
1903 | |
1904 class Security : public SurfaceObserver { | |
1905 public: | |
1906 explicit Security(Surface* surface) : surface_(surface) { | |
1907 surface_->AddSurfaceObserver(this); | |
1908 surface_->SetProperty(kSurfaceHasSecurityKey, true); | |
1909 } | |
1910 ~Security() override { | |
1911 if (surface_) { | |
1912 surface_->RemoveSurfaceObserver(this); | |
1913 surface_->SetOnlyVisibleOnSecureOutput(false); | |
1914 surface_->SetProperty(kSurfaceHasSecurityKey, false); | |
1915 } | |
1916 } | |
1917 | |
1918 void OnlyVisibleOnSecureOutput() { | |
1919 if (surface_) | |
1920 surface_->SetOnlyVisibleOnSecureOutput(true); | |
1921 } | |
1922 | |
1923 // Overridden from SurfaceObserver: | |
1924 void OnSurfaceDestroying(Surface* surface) override { | |
1925 surface->RemoveSurfaceObserver(this); | |
1926 surface_ = nullptr; | |
1927 } | |
1928 | |
1929 private: | |
1930 Surface* surface_; | |
1931 | |
1932 DISALLOW_COPY_AND_ASSIGN(Security); | |
1933 }; | |
1934 | |
1935 void security_destroy(wl_client* client, wl_resource* resource) { | |
1936 wl_resource_destroy(resource); | |
1937 } | |
1938 | |
1939 void security_only_visible_on_secure_output(wl_client* client, | |
1940 wl_resource* resource) { | |
1941 GetUserDataAs<Security>(resource)->OnlyVisibleOnSecureOutput(); | |
1942 } | |
1943 | |
1944 const struct zwp_security_v1_interface security_implementation = { | |
1945 security_destroy, security_only_visible_on_secure_output}; | |
1946 | |
1947 //////////////////////////////////////////////////////////////////////////////// | |
1948 // secure_output_interface: | |
1949 | |
1950 void secure_output_destroy(wl_client* client, wl_resource* resource) { | |
1951 wl_resource_destroy(resource); | |
1952 } | |
1953 | |
1954 void secure_output_get_security(wl_client* client, | |
1955 wl_resource* resource, | |
1956 uint32_t id, | |
1957 wl_resource* surface_resource) { | |
1958 Surface* surface = GetUserDataAs<Surface>(surface_resource); | |
1959 if (surface->GetProperty(kSurfaceHasSecurityKey)) { | |
1960 wl_resource_post_error(resource, ZWP_SECURE_OUTPUT_V1_ERROR_SECURITY_EXISTS, | |
1961 "a security object for that surface already exists"); | |
1962 return; | |
1963 } | |
1964 | |
1965 wl_resource* security_resource = | |
1966 wl_resource_create(client, &zwp_security_v1_interface, 1, id); | |
1967 | |
1968 SetImplementation(security_resource, &security_implementation, | |
1969 make_scoped_ptr(new Security(surface))); | |
1970 } | |
1971 | |
1972 const struct zwp_secure_output_v1_interface secure_output_implementation = { | |
1973 secure_output_destroy, secure_output_get_security}; | |
1974 | |
1975 void bind_secure_output(wl_client* client, | |
1976 void* data, | |
1977 uint32_t version, | |
1978 uint32_t id) { | |
1979 wl_resource* resource = | |
1980 wl_resource_create(client, &zwp_secure_output_v1_interface, 1, id); | |
1981 | |
1982 wl_resource_set_implementation(resource, &secure_output_implementation, data, | |
1983 nullptr); | |
1984 } | |
1985 | |
1903 } // namespace | 1986 } // namespace |
1904 | 1987 |
1905 //////////////////////////////////////////////////////////////////////////////// | 1988 //////////////////////////////////////////////////////////////////////////////// |
1906 // Server, public: | 1989 // Server, public: |
1907 | 1990 |
1908 Server::Server(Display* display) | 1991 Server::Server(Display* display) |
1909 : display_(display), wl_display_(wl_display_create()) { | 1992 : display_(display), wl_display_(wl_display_create()) { |
1910 wl_global_create(wl_display_.get(), &wl_compositor_interface, | 1993 wl_global_create(wl_display_.get(), &wl_compositor_interface, |
1911 compositor_version, display_, bind_compositor); | 1994 compositor_version, display_, bind_compositor); |
1912 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); | 1995 wl_global_create(wl_display_.get(), &wl_shm_interface, 1, display_, bind_shm); |
(...skipping 10 matching lines...) Expand all Loading... | |
1923 wl_global_create(wl_display_.get(), &wl_output_interface, output_version, | 2006 wl_global_create(wl_display_.get(), &wl_output_interface, output_version, |
1924 display_, bind_output); | 2007 display_, bind_output); |
1925 wl_global_create(wl_display_.get(), &xdg_shell_interface, 1, display_, | 2008 wl_global_create(wl_display_.get(), &xdg_shell_interface, 1, display_, |
1926 bind_xdg_shell); | 2009 bind_xdg_shell); |
1927 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1, | 2010 wl_global_create(wl_display_.get(), &wl_data_device_manager_interface, 1, |
1928 display_, bind_data_device_manager); | 2011 display_, bind_data_device_manager); |
1929 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, | 2012 wl_global_create(wl_display_.get(), &wl_seat_interface, seat_version, |
1930 display_, bind_seat); | 2013 display_, bind_seat); |
1931 wl_global_create(wl_display_.get(), &wl_scaler_interface, scaler_version, | 2014 wl_global_create(wl_display_.get(), &wl_scaler_interface, scaler_version, |
1932 display_, bind_scaler); | 2015 display_, bind_scaler); |
2016 wl_global_create(wl_display_.get(), &zwp_secure_output_v1_interface, 1, | |
2017 display_, bind_secure_output); | |
1933 } | 2018 } |
1934 | 2019 |
1935 Server::~Server() {} | 2020 Server::~Server() {} |
1936 | 2021 |
1937 // static | 2022 // static |
1938 scoped_ptr<Server> Server::Create(Display* display) { | 2023 scoped_ptr<Server> Server::Create(Display* display) { |
1939 scoped_ptr<Server> server(new Server(display)); | 2024 scoped_ptr<Server> server(new Server(display)); |
1940 | 2025 |
1941 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); | 2026 char* runtime_dir = getenv("XDG_RUNTIME_DIR"); |
1942 if (!runtime_dir) { | 2027 if (!runtime_dir) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1994 DCHECK(event_loop); | 2079 DCHECK(event_loop); |
1995 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); | 2080 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); |
1996 } | 2081 } |
1997 | 2082 |
1998 void Server::Flush() { | 2083 void Server::Flush() { |
1999 wl_display_flush_clients(wl_display_.get()); | 2084 wl_display_flush_clients(wl_display_.get()); |
2000 } | 2085 } |
2001 | 2086 |
2002 } // namespace wayland | 2087 } // namespace wayland |
2003 } // namespace exo | 2088 } // namespace exo |
OLD | NEW |