diff --git a/ui/rp_widget.cpp b/ui/rp_widget.cpp index 042a95a..8646c92 100644 --- a/ui/rp_widget.cpp +++ b/ui/rp_widget.cpp @@ -27,6 +27,11 @@ void ResizeFitChild( }, child->lifetime()); } +rpl::producer> RpWidgetMethods::events() const { + auto &stream = eventStreams().events; + return stream.events(); +} + rpl::producer RpWidgetMethods::geometryValue() const { auto &stream = eventStreams().geometry; return stream.events_starting_with_copy(callGetGeometry()); @@ -110,11 +115,27 @@ rpl::lifetime &RpWidgetMethods::lifetime() { } bool RpWidgetMethods::handleEvent(QEvent *event) { + Expects(event != nullptr); + + auto streams = _eventStreams.get(); + if (!streams) { + return eventHook(event); + } + auto that = QPointer(); + if (streams->events.has_consumers()) { + that = callCreateWeak(); + streams->events.fire_copy(event); + if (!that) { + return true; + } + } switch (event->type()) { case QEvent::Move: case QEvent::Resize: - if (auto streams = _eventStreams.get()) { - auto that = callCreateWeak(); + if (streams->geometry.has_consumers()) { + if (!that) { + that = callCreateWeak(); + } streams->geometry.fire_copy(callGetGeometry()); if (!that) { return true; @@ -123,10 +144,12 @@ bool RpWidgetMethods::handleEvent(QEvent *event) { break; case QEvent::Paint: - if (auto streams = _eventStreams.get()) { - auto that = callCreateWeak(); - streams->paint.fire_copy( - static_cast(event)->rect()); + if (streams->paint.has_consumers()) { + if (!that) { + that = callCreateWeak(); + } + const auto rect = static_cast(event)->rect(); + streams->paint.fire_copy(rect); if (!that) { return true; } diff --git a/ui/rp_widget.h b/ui/rp_widget.h index 641cba7..bfadb9f 100644 --- a/ui/rp_widget.h +++ b/ui/rp_widget.h @@ -252,6 +252,7 @@ class RpWidgetWrap; class RpWidgetMethods { public: + rpl::producer> events() const; rpl::producer geometryValue() const; rpl::producer sizeValue() const; rpl::producer heightValue() const; @@ -275,7 +276,6 @@ public: }, lifetime()); } - rpl::lifetime &lifetime(); virtual ~RpWidgetMethods() = default; @@ -289,6 +289,7 @@ private: friend class RpWidgetWrap; struct EventStreams { + rpl::event_stream> events; rpl::event_stream geometry; rpl::event_stream paint; rpl::event_stream shown;