zcr_extended_drag.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // Copyright 2020 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/zcr_extended_drag.h"
  5. #include <extended-drag-unstable-v1-server-protocol.h>
  6. #include <wayland-server-core.h>
  7. #include <wayland-server-protocol-core.h>
  8. #include <cstdint>
  9. #include "base/notreached.h"
  10. #include "components/exo/data_offer.h"
  11. #include "components/exo/data_source.h"
  12. #include "components/exo/display.h"
  13. #include "components/exo/extended_drag_offer.h"
  14. #include "components/exo/extended_drag_source.h"
  15. #include "components/exo/surface.h"
  16. #include "components/exo/wayland/server_util.h"
  17. #include "ui/gfx/geometry/vector2d.h"
  18. namespace exo {
  19. namespace wayland {
  20. namespace {
  21. ////////////////////////////////////////////////////////////////////////////////
  22. // zcr_extended_drag_source interface:
  23. class ZcrExtendedDragSourceDelegate : public ExtendedDragSource::Delegate {
  24. public:
  25. ZcrExtendedDragSourceDelegate(wl_resource* resource, uint32_t settings)
  26. : resource_(resource), settings_(settings) {}
  27. ZcrExtendedDragSourceDelegate(const ZcrExtendedDragSourceDelegate&) = delete;
  28. ZcrExtendedDragSourceDelegate& operator=(
  29. const ZcrExtendedDragSourceDelegate&) = delete;
  30. ~ZcrExtendedDragSourceDelegate() override = default;
  31. // ExtendedDragSource::Delegate:
  32. bool ShouldAllowDropAnywhere() const override {
  33. return settings_ & ZCR_EXTENDED_DRAG_V1_OPTIONS_ALLOW_DROP_NO_TARGET;
  34. }
  35. bool ShouldLockCursor() const override {
  36. return settings_ & ZCR_EXTENDED_DRAG_V1_OPTIONS_LOCK_CURSOR;
  37. }
  38. void OnSwallowed(const std::string& mime_type) override {
  39. zcr_extended_drag_source_v1_send_swallow(resource_, mime_type.c_str());
  40. wl_client_flush(wl_resource_get_client(resource_));
  41. }
  42. void OnUnswallowed(const std::string& mime_type,
  43. const gfx::Vector2d& offset) override {
  44. zcr_extended_drag_source_v1_send_unswallow(resource_, mime_type.c_str(),
  45. offset.x(), offset.y());
  46. wl_client_flush(wl_resource_get_client(resource_));
  47. }
  48. void OnDataSourceDestroying() override { delete this; }
  49. private:
  50. wl_resource* const resource_;
  51. const uint32_t settings_;
  52. };
  53. void extended_drag_source_destroy(wl_client* client, wl_resource* resource) {
  54. wl_resource_destroy(resource);
  55. }
  56. void extended_drag_source_drag(wl_client* client,
  57. wl_resource* resource,
  58. wl_resource* surface_resource,
  59. int32_t x_offset,
  60. int32_t y_offset) {
  61. Surface* surface =
  62. surface_resource ? GetUserDataAs<Surface>(surface_resource) : nullptr;
  63. gfx::Vector2d offset{x_offset, y_offset};
  64. GetUserDataAs<ExtendedDragSource>(resource)->Drag(surface, offset);
  65. }
  66. const struct zcr_extended_drag_source_v1_interface
  67. extended_drag_source_implementation = {extended_drag_source_destroy,
  68. extended_drag_source_drag};
  69. ////////////////////////////////////////////////////////////////////////////////
  70. // zcr_extended_drag_offer interface:
  71. class ZcrExtendedOfferDelegate : public ExtendedDragOffer::Delegate {
  72. public:
  73. explicit ZcrExtendedOfferDelegate(wl_resource* resource)
  74. : resource_(resource) {
  75. DCHECK(resource_);
  76. }
  77. ZcrExtendedOfferDelegate(const ZcrExtendedOfferDelegate&) = delete;
  78. ZcrExtendedOfferDelegate& operator=(const ZcrExtendedOfferDelegate&) = delete;
  79. ~ZcrExtendedOfferDelegate() override = default;
  80. // ExtendedDragOffer::Delegate:
  81. void OnDataOfferDestroying() override { delete this; }
  82. private:
  83. wl_resource* const resource_;
  84. };
  85. void extended_drag_offer_destroy(wl_client* client, wl_resource* resource) {
  86. wl_resource_destroy(resource);
  87. }
  88. void extended_drag_offer_swallow(wl_client* client,
  89. wl_resource* resource,
  90. uint32_t serial,
  91. const char* mime_type) {
  92. GetUserDataAs<ExtendedDragOffer>(resource)->Swallow(serial, mime_type);
  93. }
  94. void extended_drag_offer_unswallow(wl_client* client,
  95. wl_resource* resource,
  96. uint32_t serial,
  97. const char* mime_type,
  98. int32_t x_offset,
  99. int32_t y_offset) {
  100. gfx::Vector2d offset{x_offset, y_offset};
  101. GetUserDataAs<ExtendedDragOffer>(resource)->Unswallow(serial, mime_type,
  102. offset);
  103. }
  104. const struct zcr_extended_drag_offer_v1_interface
  105. extended_drag_offer_implementation = {extended_drag_offer_destroy,
  106. extended_drag_offer_swallow,
  107. extended_drag_offer_unswallow};
  108. ////////////////////////////////////////////////////////////////////////////////
  109. // zcr_extended_drag interface:
  110. void extended_drag_get_extended_drag_source(wl_client* client,
  111. wl_resource* resource,
  112. uint32_t id,
  113. wl_resource* data_source_resource,
  114. uint32_t settings) {
  115. DataSource* source = GetUserDataAs<DataSource>(data_source_resource);
  116. wl_resource* extended_drag_source_resource =
  117. wl_resource_create(client, &zcr_extended_drag_source_v1_interface,
  118. wl_resource_get_version(resource), id);
  119. SetImplementation(extended_drag_source_resource,
  120. &extended_drag_source_implementation,
  121. std::make_unique<ExtendedDragSource>(
  122. source, new ZcrExtendedDragSourceDelegate(
  123. extended_drag_source_resource, settings)));
  124. }
  125. void extended_drag_get_extended_drag_offer(wl_client* client,
  126. wl_resource* resource,
  127. uint32_t id,
  128. wl_resource* data_offer_resource) {
  129. DataOffer* offer = GetUserDataAs<DataOffer>(data_offer_resource);
  130. wl_resource* extended_drag_offer_resource =
  131. wl_resource_create(client, &zcr_extended_drag_offer_v1_interface,
  132. wl_resource_get_version(resource), id);
  133. SetImplementation(
  134. extended_drag_offer_resource, &extended_drag_offer_implementation,
  135. std::make_unique<ExtendedDragOffer>(
  136. offer, new ZcrExtendedOfferDelegate(extended_drag_offer_resource)));
  137. }
  138. const struct zcr_extended_drag_v1_interface extended_drag_implementation = {
  139. extended_drag_get_extended_drag_source,
  140. extended_drag_get_extended_drag_offer};
  141. } // namespace
  142. void bind_extended_drag(wl_client* client,
  143. void* data,
  144. uint32_t version,
  145. uint32_t id) {
  146. wl_resource* resource =
  147. wl_resource_create(client, &zcr_extended_drag_v1_interface, version, id);
  148. wl_resource_set_implementation(resource, &extended_drag_implementation, data,
  149. nullptr);
  150. }
  151. } // namespace wayland
  152. } // namespace exo