File: zcr_extended_drag.cc

package info (click to toggle)
chromium 139.0.7258.127-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,122,156 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (180 lines) | stat: -rw-r--r-- 6,637 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/exo/wayland/zcr_extended_drag.h"

#include <extended-drag-unstable-v1-server-protocol.h>
#include <wayland-server-core.h>
#include <wayland-server-protocol-core.h>

#include <cstdint>

#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "components/exo/data_offer.h"
#include "components/exo/data_source.h"
#include "components/exo/display.h"
#include "components/exo/extended_drag_offer.h"
#include "components/exo/extended_drag_source.h"
#include "components/exo/surface.h"
#include "components/exo/wayland/server_util.h"
#include "ui/gfx/geometry/vector2d.h"

namespace exo {
namespace wayland {

namespace {

////////////////////////////////////////////////////////////////////////////////
// zcr_extended_drag_source interface:

class ZcrExtendedDragSourceDelegate : public ExtendedDragSource::Delegate {
 public:
  ZcrExtendedDragSourceDelegate(wl_resource* resource, uint32_t settings)
      : resource_(resource), settings_(settings) {}

  ZcrExtendedDragSourceDelegate(const ZcrExtendedDragSourceDelegate&) = delete;
  ZcrExtendedDragSourceDelegate& operator=(
      const ZcrExtendedDragSourceDelegate&) = delete;

  ~ZcrExtendedDragSourceDelegate() override = default;

  // ExtendedDragSource::Delegate:
  bool ShouldAllowDropAnywhere() const override {
    return settings_ & ZCR_EXTENDED_DRAG_V1_OPTIONS_ALLOW_DROP_NO_TARGET;
  }

  bool ShouldLockCursor() const override {
    return settings_ & ZCR_EXTENDED_DRAG_V1_OPTIONS_LOCK_CURSOR;
  }

  void OnDataSourceDestroying() override { delete this; }

 private:
  const raw_ptr<wl_resource> resource_;
  const uint32_t settings_;
};

void extended_drag_source_destroy(wl_client* client, wl_resource* resource) {
  wl_resource_destroy(resource);
}

void extended_drag_source_drag(wl_client* client,
                               wl_resource* resource,
                               wl_resource* surface_resource,
                               int32_t x_offset,
                               int32_t y_offset) {
  Surface* surface =
      surface_resource ? GetUserDataAs<Surface>(surface_resource) : nullptr;
  gfx::Vector2d offset{x_offset, y_offset};
  GetUserDataAs<ExtendedDragSource>(resource)->Drag(surface, offset);
}

const struct zcr_extended_drag_source_v1_interface
    extended_drag_source_implementation = {extended_drag_source_destroy,
                                           extended_drag_source_drag};

////////////////////////////////////////////////////////////////////////////////
// zcr_extended_drag_offer interface:

class ZcrExtendedOfferDelegate : public ExtendedDragOffer::Delegate {
 public:
  explicit ZcrExtendedOfferDelegate(wl_resource* resource)
      : resource_(resource) {
    DCHECK(resource_);
  }

  ZcrExtendedOfferDelegate(const ZcrExtendedOfferDelegate&) = delete;
  ZcrExtendedOfferDelegate& operator=(const ZcrExtendedOfferDelegate&) = delete;

  ~ZcrExtendedOfferDelegate() override = default;

  // ExtendedDragOffer::Delegate:
  void OnDataOfferDestroying() override { delete this; }

 private:
  const raw_ptr<wl_resource> resource_;
};

void extended_drag_offer_destroy(wl_client* client, wl_resource* resource) {
  wl_resource_destroy(resource);
}

void extended_drag_offer_swallow(wl_client* client,
                                 wl_resource* resource,
                                 uint32_t serial,
                                 const char* mime_type) {
  // [deprecatd]: No need to implement this.
}

void extended_drag_offer_unswallow(wl_client* client,
                                   wl_resource* resource,
                                   uint32_t serial,
                                   const char* mime_type,
                                   int32_t x_offset,
                                   int32_t y_offset) {
  // [deprecatd]: No need to implement this.
}

const struct zcr_extended_drag_offer_v1_interface
    extended_drag_offer_implementation = {extended_drag_offer_destroy,
                                          extended_drag_offer_swallow,
                                          extended_drag_offer_unswallow};

////////////////////////////////////////////////////////////////////////////////
// zcr_extended_drag interface:

void extended_drag_get_extended_drag_source(wl_client* client,
                                            wl_resource* resource,
                                            uint32_t id,
                                            wl_resource* data_source_resource,
                                            uint32_t settings) {
  DataSource* source = GetUserDataAs<DataSource>(data_source_resource);

  wl_resource* extended_drag_source_resource =
      wl_resource_create(client, &zcr_extended_drag_source_v1_interface,
                         wl_resource_get_version(resource), id);

  SetImplementation(extended_drag_source_resource,
                    &extended_drag_source_implementation,
                    std::make_unique<ExtendedDragSource>(
                        source, new ZcrExtendedDragSourceDelegate(
                                    extended_drag_source_resource, settings)));
}

void extended_drag_get_extended_drag_offer(wl_client* client,
                                           wl_resource* resource,
                                           uint32_t id,
                                           wl_resource* data_offer_resource) {
  DataOffer* offer = GetUserDataAs<DataOffer>(data_offer_resource);

  wl_resource* extended_drag_offer_resource =
      wl_resource_create(client, &zcr_extended_drag_offer_v1_interface,
                         wl_resource_get_version(resource), id);

  SetImplementation(
      extended_drag_offer_resource, &extended_drag_offer_implementation,
      std::make_unique<ExtendedDragOffer>(
          offer, new ZcrExtendedOfferDelegate(extended_drag_offer_resource)));
}

const struct zcr_extended_drag_v1_interface extended_drag_implementation = {
    extended_drag_get_extended_drag_source,
    extended_drag_get_extended_drag_offer};

}  // namespace

void bind_extended_drag(wl_client* client,
                        void* data,
                        uint32_t version,
                        uint32_t id) {
  wl_resource* resource =
      wl_resource_create(client, &zcr_extended_drag_v1_interface, version, id);

  wl_resource_set_implementation(resource, &extended_drag_implementation, data,
                                 nullptr);
}

}  // namespace wayland
}  // namespace exo