Draw tags
This commit is contained in:
parent
64fa80f8b2
commit
4c0b1f31fe
7 changed files with 58 additions and 47 deletions
|
@ -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…
Reference in a new issue