-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathHaikuSeat.h
121 lines (98 loc) · 3.1 KB
/
HaikuSeat.h
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
#pragma once
#include "Wayland.h"
#include "WlGlobal.h"
#include "XdgShell.h"
#include "HaikuTextInput.h"
#include <SupportDefs.h>
#include <Point.h>
#include <Locker.h>
#include <util/DoublyLinkedList.h>
class BMessage;
class HaikuSurface;
class HaikuSeatGlobal;
class HaikuDataDevice;
class HaikuPointer: public WlPointer {
private:
HaikuSeatGlobal *fGlobal;
DoublyLinkedListLink<HaikuPointer> fLink;
protected:
virtual ~HaikuPointer();
public:
typedef DoublyLinkedList<HaikuPointer, DoublyLinkedListMemberGetLink<HaikuPointer, &HaikuPointer::fLink>> List;
HaikuPointer(HaikuSeatGlobal *global): fGlobal(global) {}
HaikuSeatGlobal *GetGlobal() const {return fGlobal;}
void HandleSetCursor(uint32_t serial, struct wl_resource *surface, int32_t hotspot_x, int32_t hotspot_y) final;
};
class HaikuKeyboard: public WlKeyboard {
private:
HaikuSeatGlobal *fGlobal;
DoublyLinkedListLink<HaikuKeyboard> fLink;
protected:
virtual ~HaikuKeyboard();
public:
typedef DoublyLinkedList<HaikuKeyboard, DoublyLinkedListMemberGetLink<HaikuKeyboard, &HaikuKeyboard::fLink>> List;
HaikuKeyboard(HaikuSeatGlobal *global): fGlobal(global) {}
HaikuSeatGlobal *GetGlobal() const {return fGlobal;}
};
class HaikuSeatGlobal: public WlGlocal {
public:
enum TrackId {
trackNone,
trackClient,
trackMove,
trackResize,
trackDrag,
};
union TrackInfo {
XdgToplevel::ResizeEdge resizeEdge;
};
private:
friend class HaikuSeat;
friend class HaikuPointer;
friend class HaikuKeyboard;
friend class HaikuDataDevice;
friend class HaikuTextInputGlobal;
friend class HaikuTextInput;
struct Track {
TrackId id = trackNone;
bool captured;
bool inside;
BPoint origin;
int32_t wndWidth, wndHeight;
TrackInfo info;
};
uint32_t fSerial = 1;
HaikuPointer::List fPointerIfaces{};
HaikuKeyboard::List fKeyboardIfaces{};
HaikuTextInputGlobal *fTextInput{};
HaikuDataDevice *fDataDevice{};
HaikuSurface *fPointerFocus{};
HaikuSurface *fKeyboardFocus{};
uint32 fOldMouseBtns{};
Track fTrack;
uint32_t NextSerial();
public:
static HaikuSeatGlobal *Create(struct wl_display *display);
virtual ~HaikuSeatGlobal() = default;
void Bind(struct wl_client *wl_client, uint32_t version, uint32_t id) override;
void SetPointerFocus(HaikuSurface *surface, const BMessage &msg, TrackId trackId);
void SetPointerFocus(HaikuSurface *surface, bool setFocus, const BMessage &msg, TrackId trackId = trackClient);
void SetKeyboardFocus(HaikuSurface *surface, bool setFocus);
void DoTrack(TrackId id, const TrackInfo &info = {});
bool MessageReceived(HaikuSurface *surface, BMessage *msg);
void UpdateKeymap();
};
class HaikuSeat: public WlSeat {
private:
HaikuSeatGlobal *fGlobal;
protected:
virtual ~HaikuSeat() = default;
public:
HaikuSeat(HaikuSeatGlobal *global): fGlobal(global) {}
HaikuSeatGlobal *GetGlobal() const {return fGlobal;}
static HaikuSeat *FromResource(struct wl_resource *resource) {return (HaikuSeat*)WlResource::FromResource(resource);}
void HandleGetPointer(uint32_t id) final;
void HandleGetKeyboard(uint32_t id) final;
void HandleGetTouch(uint32_t id) final;
};
HaikuSeatGlobal *HaikuGetSeat(struct wl_client *wl_client);