summaryrefslogtreecommitdiff
path: root/src/protocols/types/DataDevice.hpp
blob: 9a9579d3d19b7151a8ee56ee55ebd6f6d0788a30 (plain)
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
#pragma once

#include <string>
#include <vector>
#include <cstdint>
#include "../../helpers/signal/Signal.hpp"
#include <wayland-server-protocol.h>
#include "../../helpers/memory/Memory.hpp"
#include "../../helpers/math/Math.hpp"
#include <hyprutils/os/FileDescriptor.hpp>

class CWLDataOfferResource;
class CX11DataOffer;
class CX11DataDevice;
class CWLDataDeviceResource;
class CWLSurfaceResource;

enum eDataSourceType : uint8_t {
    DATA_SOURCE_TYPE_WAYLAND = 0,
    DATA_SOURCE_TYPE_X11,
};

class IDataSource {
  public:
    IDataSource()          = default;
    virtual ~IDataSource() = default;

    virtual std::vector<std::string> mimes()                                                          = 0;
    virtual void                     send(const std::string& mime, Hyprutils::OS::CFileDescriptor fd) = 0;
    virtual void                     accepted(const std::string& mime)                                = 0;
    virtual void                     cancelled()                                                      = 0;
    virtual bool                     hasDnd();
    virtual bool                     dndDone();
    virtual void                     sendDndFinished();
    virtual bool                     used();
    virtual void                     markUsed();
    virtual void                     error(uint32_t code, const std::string& msg) = 0;
    virtual eDataSourceType          type();
    virtual uint32_t                 actions(); // wl_data_device_manager.dnd_action
    virtual void                     sendDndDropPerformed();
    virtual void                     sendDndAction(wl_data_device_manager_dnd_action a);

    struct {
        CSignalT<> destroy;
    } m_events;

  private:
    bool m_wasUsed = false;
};

class IDataOffer {
  public:
    IDataOffer()          = default;
    virtual ~IDataOffer() = default;

    virtual eDataSourceType          type()       = 0;
    virtual SP<CWLDataOfferResource> getWayland() = 0;
    virtual SP<CX11DataOffer>        getX11()     = 0;
    virtual SP<IDataSource>          getSource()  = 0;
    virtual void                     markDead();
};

class IDataDevice {
  public:
    IDataDevice()          = default;
    virtual ~IDataDevice() = default;

    virtual SP<CWLDataDeviceResource> getWayland()                                                                                         = 0;
    virtual SP<CX11DataDevice>        getX11()                                                                                             = 0;
    virtual void                      sendDataOffer(SP<IDataOffer> offer)                                                                  = 0;
    virtual void                      sendEnter(uint32_t serial, SP<CWLSurfaceResource> surf, const Vector2D& local, SP<IDataOffer> offer) = 0;
    virtual void                      sendLeave()                                                                                          = 0;
    virtual void                      sendMotion(uint32_t timeMs, const Vector2D& local)                                                   = 0;
    virtual void                      sendDrop()                                                                                           = 0;
    virtual void                      sendSelection(SP<IDataOffer> offer)                                                                  = 0;
    virtual eDataSourceType           type()                                                                                               = 0;
};