blob: f4ebbd8adc7199bb34253006de70216f5be9fc6b (
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
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
|
//
// Implementation of default Pen/Tablet event driver.
//
// Copyright 2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this
// file is missing or damaged, see the license at:
//
// https://www.fltk.org/COPYING.php
//
// Please see the following page on how to report bugs and issues:
//
// https://www.fltk.org/bugs.php
//
#include "src/drivers/Base/Fl_Base_Pen_Events.H"
class Fl_Widget;
namespace Fl {
namespace Pen {
EventData e;
SubscriberList subscriber_list_;
std::shared_ptr<Subscriber> pushed_;
std::shared_ptr<Subscriber> below_pen_;
} // namespace Pen
} // namespace Fl
using namespace Fl::Pen;
// ---- SubscriberList implementation ------------------------------------------
/* Remove subscribers that have a nullptr as a widget */
void Fl::Pen::SubscriberList::cleanup() {
for (auto it = begin(); it != end(); ) {
if (!it->second->widget()) {
it = erase(it);
} else {
++it;
}
}
}
/* Add a new subscriber, or return an existing one. */
std::shared_ptr<Subscriber> Fl::Pen::SubscriberList::add(Fl_Widget *w) {
cleanup();
auto it = find(w);
if (it == end()) {
auto sub = std::make_shared<Subscriber>(w);
insert(std::make_pair(w, sub));
return sub;
} else {
return it->second;
}
}
/* Remove a subscriber from the list. */
void Fl::Pen::SubscriberList::remove(Fl_Widget *w) {
auto it = find(w);
if (it != end()) {
it->second->clear();
erase(it);
}
}
// ---- Driver implementation --------------------------------------------------
// Override the methods below to handle subscriptions and queries by user apps.
void Fl::Pen::Driver::subscribe(Fl_Widget* widget) {
if (widget == nullptr) return;
subscriber_list_.add(widget);
}
void Fl::Pen::Driver::unsubscribe(Fl_Widget* widget) {
if (widget == nullptr) return;
subscriber_list_.remove(widget);
}
void Fl::Pen::Driver::release() {
pushed_ = nullptr;
below_pen_ = nullptr;
}
Trait Fl::Pen::Driver::traits() {
return Trait::NONE;
}
Trait Fl::Pen::Driver::pen_traits(int pen_id) {
(void)pen_id;
return Trait::NONE;
}
// ---- Fl::Pen API ------------------------------------------------------------
void Fl::Pen::subscribe(Fl_Widget* widget) {
driver.subscribe(widget);
}
void Fl::Pen::unsubscribe(Fl_Widget* widget) {
driver.unsubscribe(widget);
}
void Fl::Pen::release() {
driver.release();
}
Trait Fl::Pen::driver_traits() {
return driver.traits();
}
Trait Fl::Pen::pen_traits(int pen_id) {
return driver.pen_traits(pen_id);
}
double Fl::Pen::event_x() { return e.x; }
double Fl::Pen::event_y() { return e.y; }
double Fl::Pen::event_x_root() { return e.rx; }
double Fl::Pen::event_y_root() { return e.ry; }
int Fl::Pen::event_pen_id() { return e.pen_id; }
double Fl::Pen::event_pressure() { return e.pressure; }
double Fl::Pen::event_barrel_pressure() { return e.barrel_pressure; }
double Fl::Pen::event_tilt_x() { return e.tilt_x; }
double Fl::Pen::event_tilt_y() { return e.tilt_y; }
double Fl::Pen::event_twist() { return e.twist; }
double Fl::Pen::event_proximity() { return e.proximity; }
State Fl::Pen::event_state() { return e.state; }
State Fl::Pen::event_trigger() { return e.trigger; }
|