From 58d004ec59c7d2aa588511ae927abe69230ddb64 Mon Sep 17 00:00:00 2001 From: Raphael Robatsch Date: Fri, 22 Oct 2021 16:52:04 +0200 Subject: [PATCH] Update status from pipe --- src/bar.cpp | 24 ++++++++++++++++++++++++ src/bar.hpp | 4 ++++ src/main.cpp | 7 ++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/bar.cpp b/src/bar.cpp index b76b569..7134eb7 100644 --- a/src/bar.cpp +++ b/src/bar.cpp @@ -13,6 +13,13 @@ const zwlr_layer_surface_v1_listener Bar::_layerSurfaceListener = { static_cast(owner)->layerSurfaceConfigure(serial, width, height); } }; +const wl_callback_listener Bar::_frameListener = { + [](void *owner, wl_callback *cb, uint32_t) + { + static_cast(owner)->render(); + wl_callback_destroy(cb); + } +}; static QFont getFont() { @@ -53,6 +60,21 @@ Bar::~Bar() zwlr_layer_surface_v1_destroy(_layerSurface); } +void Bar::invalidate() +{ + if (_invalid) return; + _invalid = true; + auto frame = wl_surface_frame(_surface); + wl_callback_add_listener(frame, &_frameListener, this); + wl_surface_commit(_surface); +} + +void Bar::setStatus(const QString &status) +{ + _status = status; + invalidate(); +} + void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height) { zwlr_layer_surface_v1_ack_configure(_layerSurface, serial); @@ -83,8 +105,10 @@ void Bar::render() _painter = nullptr; wl_surface_attach(_surface, _bufs->buffer(), 0, 0); + wl_surface_damage(_surface, 0, 0, INT_MAX, INT_MAX); wl_surface_commit(_surface); _bufs->flip(); + _invalid = false; } void Bar::setColorScheme(const ColorScheme &scheme) diff --git a/src/bar.hpp b/src/bar.hpp index 7a76ee8..5798f7d 100644 --- a/src/bar.hpp +++ b/src/bar.hpp @@ -19,6 +19,7 @@ struct Tag { class Bar { static const zwlr_layer_surface_v1_listener _layerSurfaceListener; + static const wl_callback_listener _frameListener; wl_surface *_surface {nullptr}; zwlr_layer_surface_v1 *_layerSurface {nullptr}; @@ -27,6 +28,7 @@ class Bar { QFontMetrics _fontMetrics; std::optional _bufs; int _textY, _x; + bool _invalid {false}; std::vector _tags; QString _windowTitle; @@ -39,7 +41,9 @@ class Bar { void renderText(const QString &text); int textWidth(const QString &text); void setColorScheme(const ColorScheme &scheme); + void invalidate(); public: explicit Bar(const wl_output *output); + void setStatus(const QString &status); ~Bar(); }; diff --git a/src/main.cpp b/src/main.cpp index d6e1de4..b4b87db 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,7 @@ wl_display *display; wl_compositor *compositor; wl_shm *shm; zwlr_layer_shell_v1 *wlrLayerShell; +static std::optional bar; static std::string statusFifoName; static int statusFifoFd {-1}; static int statusFifoWriter {-1}; @@ -48,7 +50,7 @@ static void onReady() requireGlobal(shm, "wl_shm"); requireGlobal(wlrLayerShell, "zwlr_layer_shell_v1"); setupStatusFifo(); - std::ignore = new Bar(nullptr); + bar.emplace(nullptr); } static void setupStatusFifo() @@ -89,6 +91,9 @@ static void onStatus() char buffer[512]; auto n = read(statusFifoFd, buffer, sizeof(buffer)); auto str = QString::fromUtf8(buffer, n); + if (bar) { + bar->setStatus(str); + } } struct HandleGlobalHelper {