wl_subcompositor.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Copyright 2019 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. #include "components/exo/wayland/wl_subcompositor.h"
  5. #include <wayland-server-protocol-core.h>
  6. #include "components/exo/display.h"
  7. #include "components/exo/sub_surface.h"
  8. #include "components/exo/surface.h"
  9. #include "components/exo/wayland/server_util.h"
  10. namespace exo {
  11. namespace wayland {
  12. namespace {
  13. ////////////////////////////////////////////////////////////////////////////////
  14. // wl_subsurface_interface:
  15. void subsurface_destroy(wl_client* client, wl_resource* resource) {
  16. wl_resource_destroy(resource);
  17. }
  18. void subsurface_set_position(wl_client* client,
  19. wl_resource* resource,
  20. int32_t x,
  21. int32_t y) {
  22. GetUserDataAs<SubSurface>(resource)->SetPosition(gfx::PointF(x, y));
  23. }
  24. void subsurface_place_above(wl_client* client,
  25. wl_resource* resource,
  26. wl_resource* reference_resource) {
  27. GetUserDataAs<SubSurface>(resource)->PlaceAbove(
  28. GetUserDataAs<Surface>(reference_resource));
  29. }
  30. void subsurface_place_below(wl_client* client,
  31. wl_resource* resource,
  32. wl_resource* sibling_resource) {
  33. GetUserDataAs<SubSurface>(resource)->PlaceBelow(
  34. GetUserDataAs<Surface>(sibling_resource));
  35. }
  36. void subsurface_set_sync(wl_client* client, wl_resource* resource) {
  37. GetUserDataAs<SubSurface>(resource)->SetCommitBehavior(true);
  38. }
  39. void subsurface_set_desync(wl_client* client, wl_resource* resource) {
  40. GetUserDataAs<SubSurface>(resource)->SetCommitBehavior(false);
  41. }
  42. const struct wl_subsurface_interface subsurface_implementation = {
  43. subsurface_destroy, subsurface_set_position, subsurface_place_above,
  44. subsurface_place_below, subsurface_set_sync, subsurface_set_desync};
  45. ////////////////////////////////////////////////////////////////////////////////
  46. // wl_subcompositor_interface:
  47. void subcompositor_destroy(wl_client* client, wl_resource* resource) {
  48. wl_resource_destroy(resource);
  49. }
  50. void subcompositor_get_subsurface(wl_client* client,
  51. wl_resource* resource,
  52. uint32_t id,
  53. wl_resource* surface,
  54. wl_resource* parent) {
  55. std::unique_ptr<SubSurface> subsurface =
  56. GetUserDataAs<Display>(resource)->CreateSubSurface(
  57. GetUserDataAs<Surface>(surface), GetUserDataAs<Surface>(parent));
  58. if (!subsurface) {
  59. wl_resource_post_error(resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE,
  60. "invalid surface");
  61. return;
  62. }
  63. wl_resource* subsurface_resource =
  64. wl_resource_create(client, &wl_subsurface_interface, 1, id);
  65. SetImplementation(subsurface_resource, &subsurface_implementation,
  66. std::move(subsurface));
  67. }
  68. const struct wl_subcompositor_interface subcompositor_implementation = {
  69. subcompositor_destroy, subcompositor_get_subsurface};
  70. } // namespace
  71. void bind_subcompositor(wl_client* client,
  72. void* data,
  73. uint32_t version,
  74. uint32_t id) {
  75. wl_resource* resource =
  76. wl_resource_create(client, &wl_subcompositor_interface, 1, id);
  77. wl_resource_set_implementation(resource, &subcompositor_implementation, data,
  78. nullptr);
  79. }
  80. } // namespace wayland
  81. } // namespace exo