show/hide calls

This commit is contained in:
Raphael Robatsch 2021-10-27 17:24:47 +02:00
parent 3db22e4a71
commit 5e5c04af47
3 changed files with 17 additions and 7 deletions

View file

@ -77,9 +77,11 @@ Bar::Bar(Monitor *mon)
} }
const wl_surface* Bar::surface() const { return _surface.get(); } const wl_surface* Bar::surface() const { return _surface.get(); }
bool Bar::visible() const { return _surface.get(); }
void Bar::create(wl_output *output) void Bar::show(wl_output *output)
{ {
if (visible()) return;
_surface.reset(wl_compositor_create_surface(compositor)); _surface.reset(wl_compositor_create_surface(compositor));
_layerSurface.reset(zwlr_layer_shell_v1_get_layer_surface(wlrLayerShell, _layerSurface.reset(zwlr_layer_shell_v1_get_layer_surface(wlrLayerShell,
_surface.get(), nullptr, ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, "net.tapesoftware.Somebar")); _surface.get(), nullptr, ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM, "net.tapesoftware.Somebar"));
@ -94,6 +96,13 @@ void Bar::create(wl_output *output)
wl_surface_commit(_surface.get()); wl_surface_commit(_surface.get());
} }
void Bar::hide()
{
if (!visible()) return;
_layerSurface.reset();
_surface.reset();
_bufs.reset();
}
void Bar::setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient) void Bar::setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient)
{ {
@ -109,7 +118,7 @@ void Bar::setStatus(const std::string &status) { _statusCmp.setText(status); }
void Bar::invalidate() void Bar::invalidate()
{ {
if (_invalid) return; if (_invalid || !visible()) return;
_invalid = true; _invalid = true;
auto frame = wl_surface_frame(_surface.get()); auto frame = wl_surface_frame(_surface.get());
wl_callback_add_listener(frame, &_frameListener, this); wl_callback_add_listener(frame, &_frameListener, this);
@ -153,6 +162,7 @@ void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height
void Bar::render() void Bar::render()
{ {
if (!visible()) return;
auto img = wl_unique_ptr<cairo_surface_t> {cairo_image_surface_create_for_data( auto img = wl_unique_ptr<cairo_surface_t> {cairo_image_surface_create_for_data(
_bufs->data(), _bufs->data(),
CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_ARGB32,

View file

@ -62,7 +62,9 @@ class Bar {
public: public:
Bar(Monitor *mon); Bar(Monitor *mon);
const wl_surface* surface() const; const wl_surface* surface() const;
void create(wl_output *output); bool visible() const;
void show(wl_output *output);
void hide();
void setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient); void setTag(int tag, znet_tapesoftware_dwl_wm_monitor_v1_tag_state state, int numClients, int focusedClient);
void setSelected(bool selected); void setSelected(bool selected);
void setLayout(int layout); void setLayout(int layout);

View file

@ -29,7 +29,6 @@ struct Monitor {
wl_unique_ptr<wl_output> wlOutput; wl_unique_ptr<wl_output> wlOutput;
wl_unique_ptr<znet_tapesoftware_dwl_wm_monitor_v1> dwlMonitor; wl_unique_ptr<znet_tapesoftware_dwl_wm_monitor_v1> dwlMonitor;
std::optional<Bar> bar; std::optional<Bar> bar;
bool created;
}; };
struct SeatPointer { struct SeatPointer {
wl_unique_ptr<wl_pointer> wlPointer; wl_unique_ptr<wl_pointer> wlPointer;
@ -209,11 +208,10 @@ static const struct znet_tapesoftware_dwl_wm_monitor_v1_listener dwlWmMonitorLis
}, },
.frame = [](void *mv, znet_tapesoftware_dwl_wm_monitor_v1*) { .frame = [](void *mv, znet_tapesoftware_dwl_wm_monitor_v1*) {
auto mon = static_cast<Monitor*>(mv); auto mon = static_cast<Monitor*>(mv);
if (mon->created) { if (mon->bar->visible()) {
mon->bar->invalidate(); mon->bar->invalidate();
} else { } else {
mon->bar->create(mon->wlOutput.get()); mon->bar->show(mon->wlOutput.get());
mon->created = true;
} }
} }
}; };