Skip to content

Commit

Permalink
Merge pull request #3528 from alebastr/sway-scene-fixes
Browse files Browse the repository at this point in the history
Fixes for Sway modes and wlr_scene support
  • Loading branch information
Alexays authored Sep 16, 2024
2 parents ae997ad + e0be3ac commit 9cfb1e3
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 14 deletions.
6 changes: 3 additions & 3 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion include/bar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ struct bar_margins {
};

struct bar_mode {
std::optional<bar_layer> layer;
bar_layer layer;
bool exclusive;
bool passthrough;
bool visible;
Expand Down
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ if libsndio.found()
endif
endif

gtk_layer_shell = dependency('gtk-layer-shell-0', version: ['>=0.6.0'],
gtk_layer_shell = dependency('gtk-layer-shell-0', version: ['>=0.9.0'],
default_options: ['introspection=false', 'vapi=false'],
fallback: ['gtk-layer-shell', 'gtk_layer_shell'])
systemd = dependency('systemd', required: get_option('systemd'))
Expand Down
26 changes: 17 additions & 9 deletions src/bar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@ const Bar::bar_mode_map Bar::PRESET_MODES = { //
.visible = true}},
{"hide",
{//
.layer = bar_layer::TOP,
.layer = bar_layer::OVERLAY,
.exclusive = false,
.passthrough = false,
.visible = true}},
{"invisible",
{//
.layer = std::nullopt,
.layer = bar_layer::BOTTOM,
.exclusive = false,
.passthrough = true,
.visible = false}},
{"overlay",
{//
.layer = bar_layer::TOP,
.layer = bar_layer::OVERLAY,
.exclusive = false,
.passthrough = true,
.visible = true}}};
Expand All @@ -59,7 +59,7 @@ const std::string Bar::MODE_INVISIBLE = "invisible";
const std::string_view DEFAULT_BAR_ID = "bar-0";

/* Deserializer for enum bar_layer */
void from_json(const Json::Value& j, std::optional<bar_layer>& l) {
void from_json(const Json::Value& j, bar_layer& l) {
if (j == "bottom") {
l = bar_layer::BOTTOM;
} else if (j == "top") {
Expand Down Expand Up @@ -132,6 +132,7 @@ void from_json(const Json::Value& j, std::map<Key, Value>& m) {
waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
: output(w_output),
config(w_config),
surface(nullptr),
window{Gtk::WindowType::WINDOW_TOPLEVEL},
x_global(0),
y_global(0),
Expand Down Expand Up @@ -316,13 +317,13 @@ void waybar::Bar::setMode(const std::string& mode) {
void waybar::Bar::setMode(const struct bar_mode& mode) {
auto* gtk_window = window.gobj();

if (mode.layer == bar_layer::BOTTOM) {
gtk_layer_set_layer(gtk_window, GTK_LAYER_SHELL_LAYER_BOTTOM);
} else if (mode.layer == bar_layer::TOP) {
gtk_layer_set_layer(gtk_window, GTK_LAYER_SHELL_LAYER_TOP);
auto layer = GTK_LAYER_SHELL_LAYER_BOTTOM;
if (mode.layer == bar_layer::TOP) {
layer = GTK_LAYER_SHELL_LAYER_TOP;
} else if (mode.layer == bar_layer::OVERLAY) {
gtk_layer_set_layer(gtk_window, GTK_LAYER_SHELL_LAYER_OVERLAY);
layer = GTK_LAYER_SHELL_LAYER_OVERLAY;
}
gtk_layer_set_layer(gtk_window, layer);

if (mode.exclusive) {
gtk_layer_auto_exclusive_zone_enable(gtk_window);
Expand All @@ -339,6 +340,13 @@ void waybar::Bar::setMode(const struct bar_mode& mode) {
window.get_style_context()->add_class("hidden");
window.set_opacity(0);
}
/*
* All the changes above require `wl_surface_commit`.
* gtk-layer-shell schedules a commit on the next frame event in GTK, but this could fail in
* certain scenarios, such as fully occluded bar.
*/
gtk_layer_try_force_commit(gtk_window);
wl_display_flush(Client::inst()->wl_display);
}

void waybar::Bar::setPassThrough(bool passthrough) {
Expand Down

0 comments on commit 9cfb1e3

Please sign in to comment.