summaryrefslogtreecommitdiff
path: root/somebar/src/bar.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'somebar/src/bar.hpp')
-rw-r--r--somebar/src/bar.hpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/somebar/src/bar.hpp b/somebar/src/bar.hpp
new file mode 100644
index 0000000..176a1bc
--- /dev/null
+++ b/somebar/src/bar.hpp
@@ -0,0 +1,74 @@
+// somebar - dwl bar
+// See LICENSE file for copyright and license details.
+
+#pragma once
+#include <optional>
+#include <string>
+#include <vector>
+#include <wayland-client.h>
+#include "wlr-layer-shell-unstable-v1-client-protocol.h"
+#include "common.hpp"
+#include "shm_buffer.hpp"
+
+class BarComponent {
+ std::unique_ptr<std::string> _text;
+public:
+ BarComponent();
+ explicit BarComponent(wl_unique_ptr<PangoLayout> layout);
+ int width() const;
+ void setText(const std::string& text);
+ wl_unique_ptr<PangoLayout> pangoLayout;
+ int x {0};
+};
+
+struct Tag {
+ int state;
+ int numClients;
+ int focusedClient;
+ BarComponent component;
+};
+
+struct Monitor;
+class Bar {
+ static const zwlr_layer_surface_v1_listener _layerSurfaceListener;
+ static const wl_callback_listener _frameListener;
+
+ wl_unique_ptr<wl_surface> _surface;
+ wl_unique_ptr<zwlr_layer_surface_v1> _layerSurface;
+ wl_unique_ptr<PangoContext> _pangoContext;
+ std::optional<ShmBuffer> _bufs;
+ std::vector<Tag> _tags;
+ BarComponent _layoutCmp, _titleCmp, _statusCmp;
+ bool _selected;
+ bool _invalid {false};
+
+ // only vaild during render()
+ cairo_t* _painter {nullptr};
+ int _x;
+ ColorScheme _colorScheme;
+
+ void layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height);
+ void render();
+ void renderTags();
+ void renderStatus();
+
+ // low-level rendering
+ void setColorScheme(const ColorScheme& scheme, bool invert = false);
+ void beginFg();
+ void beginBg();
+ void renderComponent(BarComponent& component);
+ BarComponent createComponent(const std::string& initial = {});
+public:
+ Bar();
+ const wl_surface* surface() const;
+ bool visible() const;
+ void show(wl_output* output);
+ void hide();
+ void setTag(int tag, int state, int numClients, int focusedClient);
+ void setSelected(bool selected);
+ void setLayout(const std::string& layout);
+ void setTitle(const std::string& title);
+ void setStatus(const std::string& status);
+ void invalidate();
+ void click(Monitor* mon, int x, int y, int btn);
+};