fix(bar): address some of RawSurfaceImpl resizing issues

This commit is contained in:
Aleksei Bavshin 2020-10-23 02:59:04 -07:00
parent fc5906dbd4
commit 9c566564e1
No known key found for this signature in database
GPG Key ID: 4F071603387A382A
2 changed files with 31 additions and 26 deletions

View File

@ -75,8 +75,6 @@ class Bar {
void setupAltFormatKeyForModuleList(const char *module_list_name); void setupAltFormatKeyForModuleList(const char *module_list_name);
std::unique_ptr<BarSurface> surface_impl_; std::unique_ptr<BarSurface> surface_impl_;
uint32_t width_ = 0;
uint32_t height_ = 1;
bar_layer layer_; bar_layer layer_;
Gtk::Box left_; Gtk::Box left_;
Gtk::Box center_; Gtk::Box center_;

View File

@ -199,8 +199,8 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
} }
void setSize(uint32_t width, uint32_t height) override { void setSize(uint32_t width, uint32_t height) override {
width_ = width; configured_width_ = width_ = width;
height_ = height; configured_height_ = height_ = height;
// layer_shell.configure handler should update exclusive zone if size changes // layer_shell.configure handler should update exclusive zone if size changes
window_.set_size_request(width, height); window_.set_size_request(width, height);
}; };
@ -224,8 +224,10 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
Gtk::Window& window_; Gtk::Window& window_;
std::string output_name_; std::string output_name_;
uint32_t width_; uint32_t configured_width_ = 0;
uint32_t height_; uint32_t configured_height_ = 0;
uint32_t width_ = 0;
uint32_t height_ = 0;
uint8_t anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; uint8_t anchor_ = HORIZONTAL_ANCHOR | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP;
bool exclusive_zone_ = true; bool exclusive_zone_ = true;
struct bar_margins margins_; struct bar_margins margins_;
@ -280,23 +282,23 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
if (height_ > 1) { if (height_ > 1) {
spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height); spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height);
} }
/* if (configured_height_ > 1) {
if (config["height"].isUInt()) {
spdlog::info(SIZE_DEFINED, "Height"); spdlog::info(SIZE_DEFINED, "Height");
} else */ } else {
tmp_height = ev->height; tmp_height = ev->height;
} }
}
if (ev->width > static_cast<int>(width_)) { if (ev->width > static_cast<int>(width_)) {
// Default minimal value // Default minimal value
if (width_ > 1) { if (width_ > 1) {
spdlog::warn(MIN_WIDTH_MSG, width_, ev->width); spdlog::warn(MIN_WIDTH_MSG, width_, ev->width);
} }
/* if (configured_width_ > 1) {
if (config["width"].isUInt()) {
spdlog::info(SIZE_DEFINED, "Width"); spdlog::info(SIZE_DEFINED, "Width");
} else */ } else {
tmp_width = ev->width; tmp_width = ev->width;
} }
}
if (tmp_width != width_ || tmp_height != height_) { if (tmp_width != width_ || tmp_height != height_) {
setSurfaceSize(tmp_width, tmp_height); setSurfaceSize(tmp_width, tmp_height);
commit(); commit();
@ -308,14 +310,21 @@ struct RawSurfaceImpl : public BarSurface, public sigc::trackable {
* size without margins for the axis. * size without margins for the axis.
* layer_surface.set_size, however, expects size with margins for the anchored axis. * layer_surface.set_size, however, expects size with margins for the anchored axis.
* This is not specified by wlr-layer-shell and based on actual behavior of sway. * This is not specified by wlr-layer-shell and based on actual behavior of sway.
*
* If the size for unanchored axis is not set (0), change request to 1 to avoid automatic
* assignment by the compositor.
*/ */
bool vertical = (anchor_ & VERTICAL_ANCHOR) == VERTICAL_ANCHOR; if ((anchor_ & VERTICAL_ANCHOR) == VERTICAL_ANCHOR) {
if (vertical && height > 1) { width = width > 0 ? width : 1;
if (height > 1) {
height += margins_.top + margins_.bottom; height += margins_.top + margins_.bottom;
} }
if (!vertical && width > 1) { } else {
height = height > 0 ? height : 1;
if (width > 1) {
width += margins_.right + margins_.left; width += margins_.right + margins_.left;
} }
}
spdlog::debug("Set surface size {}x{} for output {}", width, height, output_name_); spdlog::debug("Set surface size {}x{} for output {}", width, height, output_name_);
zwlr_layer_surface_v1_set_size(layer_surface_.get(), width, height); zwlr_layer_surface_v1_set_size(layer_surface_.get(), width, height);
} }
@ -379,12 +388,10 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
right_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); right_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0);
box_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); box_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0);
vertical = true; vertical = true;
height_ = 0;
width_ = 1;
} }
height_ = config["height"].isUInt() ? config["height"].asUInt() : height_;
width_ = config["width"].isUInt() ? config["width"].asUInt() : width_; uint32_t height = config["height"].isUInt() ? config["height"].asUInt() : 0;
uint32_t width = config["width"].isUInt() ? config["width"].asUInt() : 0;
struct bar_margins margins_; struct bar_margins margins_;
@ -447,7 +454,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
surface_impl_->setExclusiveZone(true); surface_impl_->setExclusiveZone(true);
surface_impl_->setMargins(margins_); surface_impl_->setMargins(margins_);
surface_impl_->setPosition(position); surface_impl_->setPosition(position);
surface_impl_->setSize(width_, height_); surface_impl_->setSize(width, height);
window.signal_map_event().connect_notify(sigc::mem_fun(*this, &Bar::onMap)); window.signal_map_event().connect_notify(sigc::mem_fun(*this, &Bar::onMap));