Draw tags
This commit is contained in:
		
							parent
							
								
									64fa80f8b2
								
							
						
					
					
						commit
						4c0b1f31fe
					
				| @ -3,7 +3,7 @@ project('somebar', ['c', 'cpp'], | |||||||
| 
 | 
 | ||||||
| wayland_dep = dependency('wayland-client') | wayland_dep = dependency('wayland-client') | ||||||
| qt5 = import('qt5') | qt5 = import('qt5') | ||||||
| qt5_dep = dependency('qt5', modules: ['Core', 'Widgets']) | qt5_dep = dependency('qt5', modules: ['Core', 'Gui']) | ||||||
| #moc = qt5.compile_moc(headers: [ 'src/.hpp', ]) | #moc = qt5.compile_moc(headers: [ 'src/.hpp', ]) | ||||||
| 
 | 
 | ||||||
| subdir('protocols') | subdir('protocols') | ||||||
| @ -12,7 +12,6 @@ executable('somebar', | |||||||
|   'src/main.cpp', |   'src/main.cpp', | ||||||
|   'src/shm_buffer.cpp', |   'src/shm_buffer.cpp', | ||||||
|   'src/bar.cpp', |   'src/bar.cpp', | ||||||
|   'src/bar_widget.cpp', |  | ||||||
|   wayland_sources, |   wayland_sources, | ||||||
|   #moc, |   #moc, | ||||||
|   dependencies: [qt5_dep, wayland_dep]) |   dependencies: [qt5_dep, wayland_dep]) | ||||||
|  | |||||||
							
								
								
									
										44
									
								
								src/bar.cpp
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								src/bar.cpp
									
									
									
									
									
								
							| @ -1,7 +1,9 @@ | |||||||
| // somebar - dwl bar
 | // somebar - dwl bar
 | ||||||
| // See LICENSE file for copyright and license details.
 | // See LICENSE file for copyright and license details.
 | ||||||
| 
 | 
 | ||||||
|  | #include <QColor> | ||||||
| #include <QImage> | #include <QImage> | ||||||
|  | #include <QPainter> | ||||||
| #include "bar.hpp" | #include "bar.hpp" | ||||||
| #include "config.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_size(_layerSurface, 0, barSize); | ||||||
|     zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface, barSize); |     zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface, barSize); | ||||||
|     wl_surface_commit(_surface); |     wl_surface_commit(_surface); | ||||||
|  | 
 | ||||||
|  |     for (auto i=1; i<=4; i++) { | ||||||
|  |         _tags.push_back({ QString::number(i), i%2 == 0 }); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Bar::~Bar() | 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); |     zwlr_layer_surface_v1_ack_configure(_layerSurface, serial); | ||||||
|     _bufs.emplace(width, height, WL_SHM_FORMAT_XRGB8888); |     _bufs.emplace(width, height, WL_SHM_FORMAT_XRGB8888); | ||||||
|     auto root = _widget.root(); |  | ||||||
|     root->setFixedSize(width, height); |  | ||||||
|     render(); |     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() | void Bar::render() | ||||||
| { | { | ||||||
| @ -48,11 +55,38 @@ void Bar::render() | |||||||
|         _bufs->width, |         _bufs->width, | ||||||
|         _bufs->height, |         _bufs->height, | ||||||
|         _bufs->stride, |         _bufs->stride, | ||||||
|         QImage::Format_RGBX8888 |         QImage::Format_ARGB32 | ||||||
|     }; |     }; | ||||||
|     auto root = _widget.root(); |     auto painter = QPainter {&img}; | ||||||
|     root->render(&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_attach(_surface, _bufs->buffer(), 0, 0); | ||||||
|     wl_surface_commit(_surface); |     wl_surface_commit(_surface); | ||||||
|     _bufs->flip(); |     _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 | #pragma once | ||||||
| #include <optional> | #include <optional> | ||||||
|  | #include <vector> | ||||||
| #include <wayland-client.h> | #include <wayland-client.h> | ||||||
|  | #include <QString> | ||||||
|  | #include <QFontMetrics> | ||||||
| #include "wlr-layer-shell-unstable-v1-client-protocol.h" | #include "wlr-layer-shell-unstable-v1-client-protocol.h" | ||||||
| #include "common.hpp" | #include "common.hpp" | ||||||
| #include "shm_buffer.hpp" | #include "shm_buffer.hpp" | ||||||
| #include "bar_widget.hpp" | 
 | ||||||
|  | struct Tag { | ||||||
|  |     QString name; | ||||||
|  |     bool active; | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| class Bar { | class Bar { | ||||||
|     static const zwlr_layer_surface_v1_listener _layerSurfaceListener; |     static const zwlr_layer_surface_v1_listener _layerSurfaceListener; | ||||||
| 
 | 
 | ||||||
|     wl_surface *_surface {nullptr}; |     wl_surface *_surface {nullptr}; | ||||||
|     zwlr_layer_surface_v1 *_layerSurface {nullptr}; |     zwlr_layer_surface_v1 *_layerSurface {nullptr}; | ||||||
|  |     std::optional<QFontMetrics> _fontMetrics; | ||||||
|     std::optional<ShmBuffer> _bufs; |     std::optional<ShmBuffer> _bufs; | ||||||
|     BarWidget _widget; |     std::vector<Tag> _tags; | ||||||
|  |     int _textY; | ||||||
| 
 | 
 | ||||||
|     void layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height); |     void layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height); | ||||||
|     void render(); |     void render(); | ||||||
|  |     void renderTags(QPainter &painter); | ||||||
|  |     int textWidth(const QString &text); | ||||||
| public: | public: | ||||||
|     explicit Bar(const wl_output *output); |     explicit Bar(const wl_output *output); | ||||||
|     ~Bar(); |     ~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
 | // somebar - dwl bar
 | ||||||
| // See LICENSE file for copyright and license details.
 | // See LICENSE file for copyright and license details.
 | ||||||
| 
 | 
 | ||||||
| constexpr int barSize = 20; | constexpr int barSize = 26; | ||||||
| constexpr bool topbar = 1; | constexpr bool topbar = 1; | ||||||
|  | constexpr int paddingX = 10; | ||||||
|  | constexpr int paddingY = 3; | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| #include <unistd.h> | #include <unistd.h> | ||||||
| #include <QApplication> | #include <QGuiApplication> | ||||||
| #include <QSocketNotifier> | #include <QSocketNotifier> | ||||||
| #include <wayland-client.h> | #include <wayland-client.h> | ||||||
| #include "qnamespace.h" | #include "qnamespace.h" | ||||||
| @ -68,7 +68,7 @@ static const struct wl_registry_listener registry_listener = { registryHandleGlo | |||||||
| 
 | 
 | ||||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||||
| { | { | ||||||
|     QApplication app(argc, argv); |     QGuiApplication app(argc, argv); | ||||||
|     QCoreApplication::setOrganizationName("tape software"); |     QCoreApplication::setOrganizationName("tape software"); | ||||||
|     QCoreApplication::setOrganizationDomain("tapesoftware.net"); |     QCoreApplication::setOrganizationDomain("tapesoftware.net"); | ||||||
|     QCoreApplication::setApplicationName("somebar"); |     QCoreApplication::setApplicationName("somebar"); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user