diff options
| author | maxim nikonov <maxim.nikonov@hqo.co> | 2026-02-05 21:32:25 +0500 |
|---|---|---|
| committer | maxim nikonov <maxim.nikonov@hqo.co> | 2026-02-05 21:32:25 +0500 |
| commit | dc39575fb3ef90e5a2689babe7fb335cd88f6727 (patch) | |
| tree | 24f6cef8f2b558ae6f1f812c75be0c09a53fe417 /src/drivers/Base/Fl_Base_Pen_Events.cxx | |
| parent | 7d3793ce1d8cb26e7608bf859beca21359cec6e9 (diff) | |
wip
Diffstat (limited to 'src/drivers/Base/Fl_Base_Pen_Events.cxx')
| -rw-r--r-- | src/drivers/Base/Fl_Base_Pen_Events.cxx | 188 |
1 files changed, 120 insertions, 68 deletions
diff --git a/src/drivers/Base/Fl_Base_Pen_Events.cxx b/src/drivers/Base/Fl_Base_Pen_Events.cxx index 12f207731..2214a61f5 100644 --- a/src/drivers/Base/Fl_Base_Pen_Events.cxx +++ b/src/drivers/Base/Fl_Base_Pen_Events.cxx @@ -15,134 +15,186 @@ // #include "src/drivers/Base/Fl_Base_Pen_Events.H" +#include <stdlib.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 +Fl_Pen_EventData fl_pen_event_data; +Fl_Pen_SubscriberList fl_pen_subscriber_list; +Fl_Pen_Subscriber *fl_pen_pushed = 0; +Fl_Pen_Subscriber *fl_pen_below = 0; + + +void fl_pen_event_data_init(Fl_Pen_EventData *d) { + d->x = 0.0; + d->y = 0.0; + d->rx = 0.0; + d->ry = 0.0; + d->tilt_x = 0.0; + d->tilt_y = 0.0; + d->pressure = 1.0; + d->proximity = 0.0; + d->barrel_pressure = 0.0; + d->twist = 0.0; + d->pen_id = 0; + d->state = (Fl_Pen_State)0; + d->trigger = (Fl_Pen_State)0; +} -using namespace Fl::Pen; +// ---- Fl_Pen_SubscriberList implementation ------------------------------------ +Fl_Pen_SubscriberList::Fl_Pen_SubscriberList() { + items_ = 0; + widgets_ = 0; + count_ = 0; + alloc_ = 0; +} -// ---- SubscriberList implementation ------------------------------------------ +Fl_Pen_SubscriberList::~Fl_Pen_SubscriberList() { + int i; + for (i = 0; i < count_; i++) { + delete items_[i]; + } + if (items_) free(items_); + if (widgets_) free(widgets_); +} /* Remove subscribers that have a 0 as a widget */ -void Fl::Pen::SubscriberList::cleanup() { - for (auto it = begin(); it != end(); ) { - if (!it->second->widget()) { - it = erase(it); +void Fl_Pen_SubscriberList::cleanup() { + int i, j; + for (i = 0, j = 0; i < count_; i++) { + if (items_[i]->widget()) { + if (i != j) { + items_[j] = items_[i]; + widgets_[j] = widgets_[i]; + } + j++; } else { - ++it; + delete items_[i]; } } + count_ = j; +} + +Fl_Pen_Subscriber *Fl_Pen_SubscriberList::find(Fl_Widget *w) { + int i; + for (i = 0; i < count_; i++) { + if (widgets_[i] == w) return items_[i]; + } + return 0; } /* Add a new subscriber, or return an existing one. */ -std::shared_ptr<Subscriber> Fl::Pen::SubscriberList::add(Fl_Widget *w) { +Fl_Pen_Subscriber *Fl_Pen_SubscriberList::add(Fl_Widget *w) { + Fl_Pen_Subscriber *existing; 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; + existing = find(w); + if (existing) return existing; + + if (count_ >= alloc_) { + int new_alloc = alloc_ ? alloc_ * 2 : 8; + items_ = (Fl_Pen_Subscriber **)realloc(items_, new_alloc * sizeof(Fl_Pen_Subscriber *)); + widgets_ = (Fl_Widget **)realloc(widgets_, new_alloc * sizeof(Fl_Widget *)); + alloc_ = new_alloc; } + Fl_Pen_Subscriber *sub = new Fl_Pen_Subscriber(w); + items_[count_] = sub; + widgets_[count_] = w; + count_++; + return sub; } /* 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); +void Fl_Pen_SubscriberList::remove(Fl_Widget *w) { + int i; + for (i = 0; i < count_; i++) { + if (widgets_[i] == w) { + items_[i]->clear(); + delete items_[i]; + count_--; + if (i < count_) { + items_[i] = items_[count_]; + widgets_[i] = widgets_[count_]; + } + return; + } } } -// ---- Driver implementation -------------------------------------------------- +// ---- Fl_Pen_Driver implementation -------------------------------------------- // Override the methods below to handle subscriptions and queries by user apps. -void Fl::Pen::Driver::subscribe(Fl_Widget* widget) { +void Fl_Pen_Driver::subscribe(Fl_Widget* widget) { if (widget == 0) return; - subscriber_list_.add(widget); + fl_pen_subscriber_list.add(widget); } -void Fl::Pen::Driver::unsubscribe(Fl_Widget* widget) { +void Fl_Pen_Driver::unsubscribe(Fl_Widget* widget) { if (widget == 0) return; - subscriber_list_.remove(widget); + fl_pen_subscriber_list.remove(widget); } -void Fl::Pen::Driver::release() { - pushed_ = 0; - below_pen_ = 0; +void Fl_Pen_Driver::release() { + fl_pen_pushed = 0; + fl_pen_below = 0; } -Trait Fl::Pen::Driver::traits() { - return Trait::NONE; +Fl_Pen_Trait Fl_Pen_Driver::traits() { + return FL_PEN_TRAIT_NONE; } -Trait Fl::Pen::Driver::pen_traits(int pen_id) { +Fl_Pen_Trait Fl_Pen_Driver::pen_traits(int pen_id) { (void)pen_id; - return Trait::NONE; + return FL_PEN_TRAIT_NONE; } -// ---- Fl::Pen API ------------------------------------------------------------ +// ---- Fl_Pen API -------------------------------------------------------------- -void Fl::Pen::subscribe(Fl_Widget* widget) { - driver.subscribe(widget); +void Fl_Pen_subscribe(Fl_Widget* widget) { + fl_pen_driver->subscribe(widget); } -void Fl::Pen::unsubscribe(Fl_Widget* widget) { - driver.unsubscribe(widget); +void Fl_Pen_unsubscribe(Fl_Widget* widget) { + fl_pen_driver->unsubscribe(widget); } -void Fl::Pen::release() { - driver.release(); +void Fl_Pen_release(void) { + fl_pen_driver->release(); } -Trait Fl::Pen::driver_traits() { - return driver.traits(); +Fl_Pen_Trait Fl_Pen_driver_traits(void) { + return fl_pen_driver->traits(); } -Trait Fl::Pen::pen_traits(int pen_id) { - return driver.pen_traits(pen_id); +Fl_Pen_Trait Fl_Pen_pen_traits(int pen_id) { + return fl_pen_driver->pen_traits(pen_id); } -double Fl::Pen::event_x() { return e.x; } +double Fl_Pen_event_x(void) { return fl_pen_event_data.x; } -double Fl::Pen::event_y() { return e.y; } +double Fl_Pen_event_y(void) { return fl_pen_event_data.y; } -double Fl::Pen::event_x_root() { return e.rx; } +double Fl_Pen_event_x_root(void) { return fl_pen_event_data.rx; } -double Fl::Pen::event_y_root() { return e.ry; } +double Fl_Pen_event_y_root(void) { return fl_pen_event_data.ry; } -int Fl::Pen::event_pen_id() { return e.pen_id; } +int Fl_Pen_event_pen_id(void) { return fl_pen_event_data.pen_id; } -double Fl::Pen::event_pressure() { return e.pressure; } +double Fl_Pen_event_pressure(void) { return fl_pen_event_data.pressure; } -double Fl::Pen::event_barrel_pressure() { return e.barrel_pressure; } +double Fl_Pen_event_barrel_pressure(void) { return fl_pen_event_data.barrel_pressure; } -double Fl::Pen::event_tilt_x() { return e.tilt_x; } +double Fl_Pen_event_tilt_x(void) { return fl_pen_event_data.tilt_x; } -double Fl::Pen::event_tilt_y() { return e.tilt_y; } +double Fl_Pen_event_tilt_y(void) { return fl_pen_event_data.tilt_y; } -double Fl::Pen::event_twist() { return e.twist; } +double Fl_Pen_event_twist(void) { return fl_pen_event_data.twist; } -double Fl::Pen::event_proximity() { return e.proximity; } +double Fl_Pen_event_proximity(void) { return fl_pen_event_data.proximity; } -State Fl::Pen::event_state() { return e.state; } +Fl_Pen_State Fl_Pen_event_state(void) { return fl_pen_event_data.state; } -State Fl::Pen::event_trigger() { return e.trigger; } +Fl_Pen_State Fl_Pen_event_trigger(void) { return fl_pen_event_data.trigger; } |
