mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
Merge pull request #447 from alebastr/exclusive-zone
Fix some issues with exclusive zone and margins
This commit is contained in:
commit
56d9cdc245
@ -55,7 +55,8 @@ class Bar {
|
|||||||
void onConfigure(GdkEventConfigure *ev);
|
void onConfigure(GdkEventConfigure *ev);
|
||||||
void onRealize();
|
void onRealize();
|
||||||
void onMap(GdkEventAny *ev);
|
void onMap(GdkEventAny *ev);
|
||||||
void setMarginsAndZone(uint32_t height, uint32_t width);
|
void setExclusiveZone(uint32_t width, uint32_t height);
|
||||||
|
void setSurfaceSize(uint32_t width, uint32_t height);
|
||||||
auto setupWidgets() -> void;
|
auto setupWidgets() -> void;
|
||||||
void getModules(const Factory &, const std::string &);
|
void getModules(const Factory &, const std::string &);
|
||||||
void setupAltFormatKeyForModule(const std::string &module_name);
|
void setupAltFormatKeyForModule(const std::string &module_name);
|
||||||
|
174
src/bar.cpp
174
src/bar.cpp
@ -53,74 +53,6 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
|
|||||||
vertical = true;
|
vertical = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
setupWidgets();
|
|
||||||
|
|
||||||
if (window.get_realized()) {
|
|
||||||
onRealize();
|
|
||||||
}
|
|
||||||
window.show_all();
|
|
||||||
}
|
|
||||||
|
|
||||||
void waybar::Bar::onConfigure(GdkEventConfigure* ev) {
|
|
||||||
auto tmp_height = height_;
|
|
||||||
auto tmp_width = width_;
|
|
||||||
if (ev->height > static_cast<int>(height_)) {
|
|
||||||
// Default minimal value
|
|
||||||
if (height_ != 1) {
|
|
||||||
spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height);
|
|
||||||
}
|
|
||||||
if (config["height"].isUInt()) {
|
|
||||||
spdlog::info(SIZE_DEFINED, "Height");
|
|
||||||
} else {
|
|
||||||
tmp_height = ev->height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ev->width > static_cast<int>(width_)) {
|
|
||||||
// Default minimal value
|
|
||||||
if (width_ != 1) {
|
|
||||||
spdlog::warn(MIN_WIDTH_MSG, width_, ev->width);
|
|
||||||
}
|
|
||||||
if (config["width"].isUInt()) {
|
|
||||||
spdlog::info(SIZE_DEFINED, "Width");
|
|
||||||
} else {
|
|
||||||
tmp_width = ev->width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tmp_width != width_ || tmp_height != height_) {
|
|
||||||
zwlr_layer_surface_v1_set_size(layer_surface, tmp_width, tmp_height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void waybar::Bar::onRealize() {
|
|
||||||
auto gdk_window = window.get_window()->gobj();
|
|
||||||
gdk_wayland_window_set_use_custom_surface(gdk_window);
|
|
||||||
}
|
|
||||||
|
|
||||||
void waybar::Bar::onMap(GdkEventAny* ev) {
|
|
||||||
auto gdk_window = window.get_window()->gobj();
|
|
||||||
surface = gdk_wayland_window_get_wl_surface(gdk_window);
|
|
||||||
|
|
||||||
auto client = waybar::Client::inst();
|
|
||||||
auto layer =
|
|
||||||
config["layer"] == "top" ? ZWLR_LAYER_SHELL_V1_LAYER_TOP : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM;
|
|
||||||
layer_surface = zwlr_layer_shell_v1_get_layer_surface(
|
|
||||||
client->layer_shell, surface, output->output, layer, "waybar");
|
|
||||||
|
|
||||||
zwlr_layer_surface_v1_set_keyboard_interactivity(layer_surface, false);
|
|
||||||
zwlr_layer_surface_v1_set_anchor(layer_surface, anchor_);
|
|
||||||
zwlr_layer_surface_v1_set_size(layer_surface, width_, height_);
|
|
||||||
setMarginsAndZone(height_, width_);
|
|
||||||
static const struct zwlr_layer_surface_v1_listener layer_surface_listener = {
|
|
||||||
.configure = layerSurfaceHandleConfigure,
|
|
||||||
.closed = layerSurfaceHandleClosed,
|
|
||||||
};
|
|
||||||
zwlr_layer_surface_v1_add_listener(layer_surface, &layer_surface_listener, this);
|
|
||||||
|
|
||||||
wl_surface_commit(surface);
|
|
||||||
wl_display_roundtrip(client->wl_display);
|
|
||||||
}
|
|
||||||
|
|
||||||
void waybar::Bar::setMarginsAndZone(uint32_t height, uint32_t width) {
|
|
||||||
if (config["margin-top"].isInt() || config["margin-right"].isInt() ||
|
if (config["margin-top"].isInt() || config["margin-right"].isInt() ||
|
||||||
config["margin-bottom"].isInt() || config["margin-left"].isInt()) {
|
config["margin-bottom"].isInt() || config["margin-left"].isInt()) {
|
||||||
margins_ = {
|
margins_ = {
|
||||||
@ -165,12 +97,110 @@ void waybar::Bar::setMarginsAndZone(uint32_t height, uint32_t width) {
|
|||||||
auto gaps = config["margin"].asInt();
|
auto gaps = config["margin"].asInt();
|
||||||
margins_ = {.top = gaps, .right = gaps, .bottom = gaps, .left = gaps};
|
margins_ = {.top = gaps, .right = gaps, .bottom = gaps, .left = gaps};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setupWidgets();
|
||||||
|
|
||||||
|
if (window.get_realized()) {
|
||||||
|
onRealize();
|
||||||
|
}
|
||||||
|
window.show_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::Bar::onConfigure(GdkEventConfigure* ev) {
|
||||||
|
auto tmp_height = height_;
|
||||||
|
auto tmp_width = width_;
|
||||||
|
if (ev->height > static_cast<int>(height_)) {
|
||||||
|
// Default minimal value
|
||||||
|
if (height_ != 1) {
|
||||||
|
spdlog::warn(MIN_HEIGHT_MSG, height_, ev->height);
|
||||||
|
}
|
||||||
|
if (config["height"].isUInt()) {
|
||||||
|
spdlog::info(SIZE_DEFINED, "Height");
|
||||||
|
} else {
|
||||||
|
tmp_height = ev->height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ev->width > static_cast<int>(width_)) {
|
||||||
|
// Default minimal value
|
||||||
|
if (width_ != 1) {
|
||||||
|
spdlog::warn(MIN_WIDTH_MSG, width_, ev->width);
|
||||||
|
}
|
||||||
|
if (config["width"].isUInt()) {
|
||||||
|
spdlog::info(SIZE_DEFINED, "Width");
|
||||||
|
} else {
|
||||||
|
tmp_width = ev->width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tmp_width != width_ || tmp_height != height_) {
|
||||||
|
setSurfaceSize(tmp_width, tmp_height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::Bar::onRealize() {
|
||||||
|
auto gdk_window = window.get_window()->gobj();
|
||||||
|
gdk_wayland_window_set_use_custom_surface(gdk_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::Bar::onMap(GdkEventAny* ev) {
|
||||||
|
auto gdk_window = window.get_window()->gobj();
|
||||||
|
surface = gdk_wayland_window_get_wl_surface(gdk_window);
|
||||||
|
|
||||||
|
auto client = waybar::Client::inst();
|
||||||
|
auto layer =
|
||||||
|
config["layer"] == "top" ? ZWLR_LAYER_SHELL_V1_LAYER_TOP : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM;
|
||||||
|
layer_surface = zwlr_layer_shell_v1_get_layer_surface(
|
||||||
|
client->layer_shell, surface, output->output, layer, "waybar");
|
||||||
|
|
||||||
|
zwlr_layer_surface_v1_set_keyboard_interactivity(layer_surface, false);
|
||||||
|
zwlr_layer_surface_v1_set_anchor(layer_surface, anchor_);
|
||||||
zwlr_layer_surface_v1_set_margin(
|
zwlr_layer_surface_v1_set_margin(
|
||||||
layer_surface, margins_.top, margins_.right, margins_.bottom, margins_.left);
|
layer_surface, margins_.top, margins_.right, margins_.bottom, margins_.left);
|
||||||
auto zone = vertical ? width + margins_.right : height + margins_.bottom;
|
setSurfaceSize(width_, height_);
|
||||||
|
setExclusiveZone(width_, height_);
|
||||||
|
|
||||||
|
static const struct zwlr_layer_surface_v1_listener layer_surface_listener = {
|
||||||
|
.configure = layerSurfaceHandleConfigure,
|
||||||
|
.closed = layerSurfaceHandleClosed,
|
||||||
|
};
|
||||||
|
zwlr_layer_surface_v1_add_listener(layer_surface, &layer_surface_listener, this);
|
||||||
|
|
||||||
|
wl_surface_commit(surface);
|
||||||
|
wl_display_roundtrip(client->wl_display);
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::Bar::setExclusiveZone(uint32_t width, uint32_t height) {
|
||||||
|
auto zone = 0;
|
||||||
|
if (visible) {
|
||||||
|
// exclusive zone already includes margin for anchored edge,
|
||||||
|
// only opposite margin should be added
|
||||||
|
if (vertical) {
|
||||||
|
zone += width;
|
||||||
|
zone += (anchor_ & ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT) ? margins_.right : margins_.left;
|
||||||
|
} else {
|
||||||
|
zone += height;
|
||||||
|
zone += (anchor_ & ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP) ? margins_.bottom : margins_.top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spdlog::debug("Set exclusive zone {} for output {}", zone, output->name);
|
||||||
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, zone);
|
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, zone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void waybar::Bar::setSurfaceSize(uint32_t width, uint32_t height) {
|
||||||
|
/* If the client is anchored to two opposite edges, layer_surface.configure will return
|
||||||
|
* size without margins for the 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.
|
||||||
|
*/
|
||||||
|
if (vertical && height > 1) {
|
||||||
|
height += margins_.top + margins_.bottom;
|
||||||
|
}
|
||||||
|
if (!vertical && width > 1) {
|
||||||
|
width += margins_.right + margins_.left;
|
||||||
|
}
|
||||||
|
spdlog::debug("Set surface size {}x{} for output {}", width, height, output->name);
|
||||||
|
zwlr_layer_surface_v1_set_size(layer_surface, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
// Converting string to button code rn as to avoid doing it later
|
// Converting string to button code rn as to avoid doing it later
|
||||||
void waybar::Bar::setupAltFormatKeyForModule(const std::string& module_name) {
|
void waybar::Bar::setupAltFormatKeyForModule(const std::string& module_name) {
|
||||||
if (config.isMember(module_name)) {
|
if (config.isMember(module_name)) {
|
||||||
@ -240,8 +270,7 @@ void waybar::Bar::layerSurfaceHandleConfigure(void* data, struct zwlr_layer_surf
|
|||||||
o->height_ = height;
|
o->height_ = height;
|
||||||
o->window.set_size_request(o->width_, o->height_);
|
o->window.set_size_request(o->width_, o->height_);
|
||||||
o->window.resize(o->width_, o->height_);
|
o->window.resize(o->width_, o->height_);
|
||||||
auto zone = o->vertical ? width + o->margins_.right : height + o->margins_.bottom;
|
o->setExclusiveZone(width, height);
|
||||||
zwlr_layer_surface_v1_set_exclusive_zone(o->layer_surface, zone);
|
|
||||||
spdlog::info(BAR_SIZE_MSG,
|
spdlog::info(BAR_SIZE_MSG,
|
||||||
o->width_ == 1 ? "auto" : std::to_string(o->width_),
|
o->width_ == 1 ? "auto" : std::to_string(o->width_),
|
||||||
o->height_ == 1 ? "auto" : std::to_string(o->height_),
|
o->height_ == 1 ? "auto" : std::to_string(o->height_),
|
||||||
@ -264,13 +293,12 @@ void waybar::Bar::layerSurfaceHandleClosed(void* data, struct zwlr_layer_surface
|
|||||||
|
|
||||||
auto waybar::Bar::toggle() -> void {
|
auto waybar::Bar::toggle() -> void {
|
||||||
visible = !visible;
|
visible = !visible;
|
||||||
auto zone = visible ? height_ : 0;
|
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
window.get_style_context()->add_class("hidden");
|
window.get_style_context()->add_class("hidden");
|
||||||
} else {
|
} else {
|
||||||
window.get_style_context()->remove_class("hidden");
|
window.get_style_context()->remove_class("hidden");
|
||||||
}
|
}
|
||||||
zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, zone);
|
setExclusiveZone(width_, height_);
|
||||||
wl_surface_commit(surface);
|
wl_surface_commit(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user