From 2a9fa1a4b9951fe98fbb1f9a04fd61b29a059bfe Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 25 May 2019 17:50:45 +0200 Subject: [PATCH] refactor(bar): onRealize, onMap --- include/bar.hpp | 11 +- include/modules/sway/mode.hpp | 2 +- include/modules/sway/workspaces.hpp | 2 +- src/bar.cpp | 170 +++++++++++++++------------- 4 files changed, 99 insertions(+), 86 deletions(-) diff --git a/include/bar.hpp b/include/bar.hpp index a8b9981..97ca03e 100644 --- a/include/bar.hpp +++ b/include/bar.hpp @@ -38,13 +38,13 @@ class Bar { bool vertical = false; private: - static constexpr const char* MIN_HEIGHT_MSG = + static constexpr const char *MIN_HEIGHT_MSG = "Requested height: {} exceeds the minimum height: {} required by the modules"; - static constexpr const char* MIN_WIDTH_MSG = + static constexpr const char *MIN_WIDTH_MSG = "Requested width: {} exceeds the minimum width: {} required by the modules"; - static constexpr const char* BAR_SIZE_MSG = + static constexpr const char *BAR_SIZE_MSG = "Bar configured (width: {}, height: {}) for output: {}"; - static constexpr const char* SIZE_DEFINED = + static constexpr const char *SIZE_DEFINED = "{} size is defined in the config file so it will stay like that"; static void layerSurfaceHandleConfigure(void *, struct zwlr_layer_surface_v1 *, uint32_t, uint32_t, uint32_t); @@ -52,6 +52,8 @@ class Bar { void destroyOutput(); void onConfigure(GdkEventConfigure *ev); + void onRealize(); + void onMap(GdkEventAny *ev); void setMarginsAndZone(uint32_t height, uint32_t width); auto setupWidgets() -> void; void getModules(const Factory &, const std::string &); @@ -66,6 +68,7 @@ class Bar { } margins_; uint32_t width_ = 0; uint32_t height_ = 1; + uint8_t anchor_; Gtk::Box left_; Gtk::Box center_; Gtk::Box right_; diff --git a/include/modules/sway/mode.hpp b/include/modules/sway/mode.hpp index e2c4e11..ab7ca12 100644 --- a/include/modules/sway/mode.hpp +++ b/include/modules/sway/mode.hpp @@ -26,4 +26,4 @@ class Mode : public ALabel, public sigc::trackable { util::JsonParser parser_; }; -} // namespace waybar::modules::sway \ No newline at end of file +} // namespace waybar::modules::sway diff --git a/include/modules/sway/workspaces.hpp b/include/modules/sway/workspaces.hpp index d6244c4..8ea365e 100644 --- a/include/modules/sway/workspaces.hpp +++ b/include/modules/sway/workspaces.hpp @@ -37,9 +37,9 @@ class Workspaces : public IModule, public sigc::trackable { std::vector workspaces_; std::vector workspaces_order_; waybar::util::SleeperThread thread_; + Ipc ipc_; std::mutex mutex_; Gtk::Box box_; - Ipc ipc_; util::JsonParser parser_; bool scrolling_; std::unordered_map buttons_; diff --git a/src/bar.cpp b/src/bar.cpp index a183c96..8306f75 100644 --- a/src/bar.cpp +++ b/src/bar.cpp @@ -9,6 +9,7 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) window{Gtk::WindowType::WINDOW_TOPLEVEL}, surface(nullptr), layer_surface(nullptr), + anchor_(ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP), left_(Gtk::ORIENTATION_HORIZONTAL, 0), center_(Gtk::ORIENTATION_HORIZONTAL, 0), right_(Gtk::ORIENTATION_HORIZONTAL, 0), @@ -21,41 +22,27 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) height_ = 0; width_ = 1; } + height_ = config["height"].isUInt() ? config["height"].asUInt() : height_; + width_ = config["width"].isUInt() ? config["width"].asUInt() : width_; - auto gtk_window = window.gobj(); - auto gtk_widget = GTK_WIDGET(gtk_window); - gtk_widget_realize(gtk_widget); - auto gdk_window = window.get_window()->gobj(); - gdk_wayland_window_set_use_custom_surface(gdk_window); - surface = gdk_wayland_window_get_wl_surface(gdk_window); + window.signal_realize().connect_notify(sigc::mem_fun(*this, &Bar::onRealize)); + window.signal_map_event().connect_notify(sigc::mem_fun(*this, &Bar::onMap)); + window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Bar::onConfigure)); + window.set_size_request(width_, height_); - std::size_t layer = - config["layer"] == "top" ? ZWLR_LAYER_SHELL_V1_LAYER_TOP : ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM; - auto client = waybar::Client::inst(); - layer_surface = zwlr_layer_shell_v1_get_layer_surface( - client->layer_shell, surface, output->output, layer, "waybar"); - 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); - - auto height = config["height"].isUInt() ? config["height"].asUInt() : height_; - auto width = config["width"].isUInt() ? config["width"].asUInt() : width_; - - std::size_t anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; if (config["position"] == "bottom") { - anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; + anchor_ = ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; } else if (config["position"] == "left") { - anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; + anchor_ = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; } else if (config["position"] == "right") { - anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; + anchor_ = ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; } - if (anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM || anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP) { - anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; - } else if (anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT || - anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT) { - anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; + if (anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM || + anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP) { + anchor_ |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; + } else if (anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT || + anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT) { + anchor_ |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; left_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); center_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); right_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0); @@ -63,17 +50,71 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config) vertical = true; } - zwlr_layer_surface_v1_set_anchor(layer_surface, anchor); - zwlr_layer_surface_v1_set_size(layer_surface, width, height); - setMarginsAndZone(height, width); + 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(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(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); - - setupWidgets(); - - window.set_size_request(width_, height_); - window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Bar::onConfigure)); } void waybar::Bar::setMarginsAndZone(uint32_t height, uint32_t width) { @@ -127,36 +168,6 @@ void waybar::Bar::setMarginsAndZone(uint32_t height, uint32_t width) { zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, zone); } -void waybar::Bar::onConfigure(GdkEventConfigure* ev) { - auto tmp_height = height_; - auto tmp_width = width_; - if (ev->height > static_cast(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(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); - } -} - // Converting string to button code rn as to avoid doing it later void waybar::Bar::setupAltFormatKeyForModule(const std::string& module_name) { if (config.isMember(module_name)) { @@ -229,9 +240,9 @@ void waybar::Bar::layerSurfaceHandleConfigure(void* data, struct zwlr_layer_surf auto zone = o->vertical ? width + o->margins_.right : height + o->margins_.bottom; zwlr_layer_surface_v1_set_exclusive_zone(o->layer_surface, zone); spdlog::info(BAR_SIZE_MSG, - o->width_ == 1 ? "auto" : std::to_string(o->width_), - o->height_ == 1 ? "auto" : std::to_string(o->height_), - o->output->name); + o->width_ == 1 ? "auto" : std::to_string(o->width_), + o->height_ == 1 ? "auto" : std::to_string(o->height_), + o->output->name); wl_surface_commit(o->surface); } zwlr_layer_surface_v1_ack_configure(surface, serial); @@ -239,7 +250,10 @@ void waybar::Bar::layerSurfaceHandleConfigure(void* data, struct zwlr_layer_surf void waybar::Bar::layerSurfaceHandleClosed(void* data, struct zwlr_layer_surface_v1* /*surface*/) { auto o = static_cast(data); - zwlr_layer_surface_v1_destroy(o->layer_surface); + if (o->layer_surface) { + zwlr_layer_surface_v1_destroy(o->layer_surface); + o->layer_surface = nullptr; + } o->modules_left_.clear(); o->modules_center_.clear(); o->modules_right_.clear(); @@ -272,14 +286,11 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos) { modules_right_.emplace_back(module); } module->dp.connect([module, &name] { - // Fix https://github.com/Alexays/Waybar/issues/320, proper way? - Glib::signal_idle().connect_once([module, &name] { - try { - module->update(); - } catch (const std::exception& e) { - spdlog::error("{}: {}", name.asString(), e.what()); - } - }); + try { + module->update(); + } catch (const std::exception& e) { + spdlog::error("{}: {}", name.asString(), e.what()); + } }); } catch (const std::exception& e) { spdlog::warn("module {}: {}", name.asString(), e.what()); @@ -313,5 +324,4 @@ auto waybar::Bar::setupWidgets() -> void { for (auto const& module : modules_right_) { right_.pack_end(*module, false, false, 0); } - window.show_all(); }