Draw tags
This commit is contained in:
		| @@ -3,7 +3,7 @@ project('somebar', ['c', 'cpp'], | ||||
|  | ||||
| wayland_dep = dependency('wayland-client') | ||||
| qt5 = import('qt5') | ||||
| qt5_dep = dependency('qt5', modules: ['Core', 'Widgets']) | ||||
| qt5_dep = dependency('qt5', modules: ['Core', 'Gui']) | ||||
| #moc = qt5.compile_moc(headers: [ 'src/.hpp', ]) | ||||
|  | ||||
| subdir('protocols') | ||||
| @@ -12,7 +12,6 @@ executable('somebar', | ||||
|   'src/main.cpp', | ||||
|   'src/shm_buffer.cpp', | ||||
|   'src/bar.cpp', | ||||
|   'src/bar_widget.cpp', | ||||
|   wayland_sources, | ||||
|   #moc, | ||||
|   dependencies: [qt5_dep, wayland_dep]) | ||||
|   | ||||
							
								
								
									
										44
									
								
								src/bar.cpp
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								src/bar.cpp
									
									
									
									
									
								
							| @@ -1,7 +1,9 @@ | ||||
| // somebar - dwl bar | ||||
| // See LICENSE file for copyright and license details. | ||||
|  | ||||
| #include <QColor> | ||||
| #include <QImage> | ||||
| #include <QPainter> | ||||
| #include "bar.hpp" | ||||
| #include "config.hpp" | ||||
|  | ||||
| @@ -24,6 +26,10 @@ Bar::Bar(const wl_output *output) | ||||
|     zwlr_layer_surface_v1_set_size(_layerSurface, 0, barSize); | ||||
|     zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface, barSize); | ||||
|     wl_surface_commit(_surface); | ||||
|  | ||||
|     for (auto i=1; i<=4; i++) { | ||||
|         _tags.push_back({ QString::number(i), i%2 == 0 }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| Bar::~Bar() | ||||
| @@ -36,10 +42,11 @@ void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height | ||||
| { | ||||
|     zwlr_layer_surface_v1_ack_configure(_layerSurface, serial); | ||||
|     _bufs.emplace(width, height, WL_SHM_FORMAT_XRGB8888); | ||||
|     auto root = _widget.root(); | ||||
|     root->setFixedSize(width, height); | ||||
|     render(); | ||||
| } | ||||
| static QBrush inactiveBg = {QColor::fromRgb(0, 0, 0)}; | ||||
| static QBrush activeBg = QBrush {QColor::fromRgb(0, 0, 255)}; | ||||
| static QPen fg = QPen {QBrush {QColor::fromRgb(255, 255, 255)}, 1}; | ||||
|  | ||||
| void Bar::render() | ||||
| { | ||||
| @@ -48,11 +55,38 @@ void Bar::render() | ||||
|         _bufs->width, | ||||
|         _bufs->height, | ||||
|         _bufs->stride, | ||||
|         QImage::Format_RGBX8888 | ||||
|         QImage::Format_ARGB32 | ||||
|     }; | ||||
|     auto root = _widget.root(); | ||||
|     root->render(&img); | ||||
|     auto painter = QPainter {&img}; | ||||
|     auto font = painter.font(); | ||||
|     font.setBold(true); | ||||
|     font.setPixelSize(18); | ||||
|     painter.setFont(font); | ||||
|     painter.setPen(fg); | ||||
|  | ||||
|     painter.fillRect(0, 0, img.width(), img.height(), activeBg); | ||||
|     _fontMetrics.emplace(painter.font()); | ||||
|     _textY = _fontMetrics->ascent() + paddingY; | ||||
|     renderTags(painter); | ||||
|      | ||||
|     wl_surface_attach(_surface, _bufs->buffer(), 0, 0); | ||||
|     wl_surface_commit(_surface); | ||||
|     _bufs->flip(); | ||||
| } | ||||
|  | ||||
| void Bar::renderTags(QPainter &painter) | ||||
| { | ||||
|     auto x = 0; | ||||
|     for (const auto &tag : _tags) { | ||||
|         auto size = textWidth(tag.name) + paddingX*2; | ||||
|         auto& bg = tag.active ? activeBg : inactiveBg; | ||||
|         painter.fillRect(x, 0, size, barSize, bg); | ||||
|         painter.drawText(paddingX+x, _textY, tag.name); | ||||
|         x += size; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int Bar::textWidth(const QString &text) | ||||
| { | ||||
|     return _fontMetrics->size(Qt::TextSingleLine, text).width(); | ||||
| } | ||||
|   | ||||
							
								
								
									
										15
									
								
								src/bar.hpp
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/bar.hpp
									
									
									
									
									
								
							| @@ -3,22 +3,33 @@ | ||||
|  | ||||
| #pragma once | ||||
| #include <optional> | ||||
| #include <vector> | ||||
| #include <wayland-client.h> | ||||
| #include <QString> | ||||
| #include <QFontMetrics> | ||||
| #include "wlr-layer-shell-unstable-v1-client-protocol.h" | ||||
| #include "common.hpp" | ||||
| #include "shm_buffer.hpp" | ||||
| #include "bar_widget.hpp" | ||||
|  | ||||
| struct Tag { | ||||
|     QString name; | ||||
|     bool active; | ||||
| }; | ||||
|  | ||||
| class Bar { | ||||
|     static const zwlr_layer_surface_v1_listener _layerSurfaceListener; | ||||
|  | ||||
|     wl_surface *_surface {nullptr}; | ||||
|     zwlr_layer_surface_v1 *_layerSurface {nullptr}; | ||||
|     std::optional<QFontMetrics> _fontMetrics; | ||||
|     std::optional<ShmBuffer> _bufs; | ||||
|     BarWidget _widget; | ||||
|     std::vector<Tag> _tags; | ||||
|     int _textY; | ||||
|  | ||||
|     void layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height); | ||||
|     void render(); | ||||
|     void renderTags(QPainter &painter); | ||||
|     int textWidth(const QString &text); | ||||
| public: | ||||
|     explicit Bar(const wl_output *output); | ||||
|     ~Bar(); | ||||
|   | ||||
| @@ -1,18 +0,0 @@ | ||||
| // somebar - dwl bar | ||||
| // See LICENSE file for copyright and license details. | ||||
|  | ||||
| #include "bar_widget.hpp" | ||||
|  | ||||
| BarWidget::BarWidget() | ||||
|     : _box {QBoxLayout::LeftToRight, &_root} | ||||
|     , _label {&_root} | ||||
| { | ||||
|     _root.setAttribute(Qt::WA_DontShowOnScreen); | ||||
|     _label.setText("somebar"); | ||||
| } | ||||
|  | ||||
| BarWidget::~BarWidget() | ||||
| { | ||||
| } | ||||
|  | ||||
| QWidget* BarWidget::root() { return &_root; } | ||||
| @@ -1,17 +0,0 @@ | ||||
| // somebar - dwl bar | ||||
| // See LICENSE file for copyright and license details. | ||||
|  | ||||
| #pragma once | ||||
| #include <QBoxLayout> | ||||
| #include <QLabel> | ||||
| #include <QWidget> | ||||
|  | ||||
| class BarWidget { | ||||
|     QWidget _root; | ||||
|     QBoxLayout _box; | ||||
|     QLabel _label; | ||||
| public: | ||||
|     explicit BarWidget(); | ||||
|     ~BarWidget(); | ||||
|     QWidget* root(); | ||||
| }; | ||||
| @@ -1,5 +1,7 @@ | ||||
| // somebar - dwl bar | ||||
| // See LICENSE file for copyright and license details. | ||||
|  | ||||
| constexpr int barSize = 20; | ||||
| constexpr int barSize = 26; | ||||
| constexpr bool topbar = 1; | ||||
| constexpr int paddingX = 10; | ||||
| constexpr int paddingY = 3; | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #include <sys/mman.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
| #include <QApplication> | ||||
| #include <QGuiApplication> | ||||
| #include <QSocketNotifier> | ||||
| #include <wayland-client.h> | ||||
| #include "qnamespace.h" | ||||
| @@ -68,7 +68,7 @@ static const struct wl_registry_listener registry_listener = { registryHandleGlo | ||||
|  | ||||
| int main(int argc, char **argv) | ||||
| { | ||||
|     QApplication app(argc, argv); | ||||
|     QGuiApplication app(argc, argv); | ||||
|     QCoreApplication::setOrganizationName("tape software"); | ||||
|     QCoreApplication::setOrganizationDomain("tapesoftware.net"); | ||||
|     QCoreApplication::setApplicationName("somebar"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user