refactor(bar): onRealize, onMap
This commit is contained in:
parent
07147878a9
commit
2a9fa1a4b9
|
@ -52,6 +52,8 @@ class Bar {
|
||||||
|
|
||||||
void destroyOutput();
|
void destroyOutput();
|
||||||
void onConfigure(GdkEventConfigure *ev);
|
void onConfigure(GdkEventConfigure *ev);
|
||||||
|
void onRealize();
|
||||||
|
void onMap(GdkEventAny *ev);
|
||||||
void setMarginsAndZone(uint32_t height, uint32_t width);
|
void setMarginsAndZone(uint32_t height, uint32_t width);
|
||||||
auto setupWidgets() -> void;
|
auto setupWidgets() -> void;
|
||||||
void getModules(const Factory &, const std::string &);
|
void getModules(const Factory &, const std::string &);
|
||||||
|
@ -66,6 +68,7 @@ class Bar {
|
||||||
} margins_;
|
} margins_;
|
||||||
uint32_t width_ = 0;
|
uint32_t width_ = 0;
|
||||||
uint32_t height_ = 1;
|
uint32_t height_ = 1;
|
||||||
|
uint8_t anchor_;
|
||||||
Gtk::Box left_;
|
Gtk::Box left_;
|
||||||
Gtk::Box center_;
|
Gtk::Box center_;
|
||||||
Gtk::Box right_;
|
Gtk::Box right_;
|
||||||
|
|
|
@ -37,9 +37,9 @@ class Workspaces : public IModule, public sigc::trackable {
|
||||||
std::vector<Json::Value> workspaces_;
|
std::vector<Json::Value> workspaces_;
|
||||||
std::vector<std::string> workspaces_order_;
|
std::vector<std::string> workspaces_order_;
|
||||||
waybar::util::SleeperThread thread_;
|
waybar::util::SleeperThread thread_;
|
||||||
|
Ipc ipc_;
|
||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
Gtk::Box box_;
|
Gtk::Box box_;
|
||||||
Ipc ipc_;
|
|
||||||
util::JsonParser parser_;
|
util::JsonParser parser_;
|
||||||
bool scrolling_;
|
bool scrolling_;
|
||||||
std::unordered_map<std::string, Gtk::Button> buttons_;
|
std::unordered_map<std::string, Gtk::Button> buttons_;
|
||||||
|
|
152
src/bar.cpp
152
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},
|
window{Gtk::WindowType::WINDOW_TOPLEVEL},
|
||||||
surface(nullptr),
|
surface(nullptr),
|
||||||
layer_surface(nullptr),
|
layer_surface(nullptr),
|
||||||
|
anchor_(ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP),
|
||||||
left_(Gtk::ORIENTATION_HORIZONTAL, 0),
|
left_(Gtk::ORIENTATION_HORIZONTAL, 0),
|
||||||
center_(Gtk::ORIENTATION_HORIZONTAL, 0),
|
center_(Gtk::ORIENTATION_HORIZONTAL, 0),
|
||||||
right_(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;
|
height_ = 0;
|
||||||
width_ = 1;
|
width_ = 1;
|
||||||
}
|
}
|
||||||
|
height_ = config["height"].isUInt() ? config["height"].asUInt() : height_;
|
||||||
|
width_ = config["width"].isUInt() ? config["width"].asUInt() : width_;
|
||||||
|
|
||||||
auto gtk_window = window.gobj();
|
window.signal_realize().connect_notify(sigc::mem_fun(*this, &Bar::onRealize));
|
||||||
auto gtk_widget = GTK_WIDGET(gtk_window);
|
window.signal_map_event().connect_notify(sigc::mem_fun(*this, &Bar::onMap));
|
||||||
gtk_widget_realize(gtk_widget);
|
window.signal_configure_event().connect_notify(sigc::mem_fun(*this, &Bar::onConfigure));
|
||||||
auto gdk_window = window.get_window()->gobj();
|
window.set_size_request(width_, height_);
|
||||||
gdk_wayland_window_set_use_custom_surface(gdk_window);
|
|
||||||
surface = gdk_wayland_window_get_wl_surface(gdk_window);
|
|
||||||
|
|
||||||
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") {
|
if (config["position"] == "bottom") {
|
||||||
anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
|
anchor_ = ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
|
||||||
} else if (config["position"] == "left") {
|
} else if (config["position"] == "left") {
|
||||||
anchor = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT;
|
anchor_ = ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT;
|
||||||
} else if (config["position"] == "right") {
|
} 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) {
|
if (anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM ||
|
||||||
anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
|
anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP) {
|
||||||
} else if (anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT ||
|
anchor_ |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;
|
||||||
anchor == ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT) {
|
} else if (anchor_ == ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT ||
|
||||||
anchor |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM;
|
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);
|
left_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0);
|
||||||
center_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0);
|
center_ = Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0);
|
||||||
right_ = 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;
|
vertical = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
zwlr_layer_surface_v1_set_anchor(layer_surface, anchor);
|
setupWidgets();
|
||||||
zwlr_layer_surface_v1_set_size(layer_surface, width, height);
|
|
||||||
setMarginsAndZone(height, width);
|
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_surface_commit(surface);
|
||||||
wl_display_roundtrip(client->wl_display);
|
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) {
|
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);
|
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<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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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)) {
|
||||||
|
@ -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*/) {
|
void waybar::Bar::layerSurfaceHandleClosed(void* data, struct zwlr_layer_surface_v1* /*surface*/) {
|
||||||
auto o = static_cast<waybar::Bar*>(data);
|
auto o = static_cast<waybar::Bar*>(data);
|
||||||
|
if (o->layer_surface) {
|
||||||
zwlr_layer_surface_v1_destroy(o->layer_surface);
|
zwlr_layer_surface_v1_destroy(o->layer_surface);
|
||||||
|
o->layer_surface = nullptr;
|
||||||
|
}
|
||||||
o->modules_left_.clear();
|
o->modules_left_.clear();
|
||||||
o->modules_center_.clear();
|
o->modules_center_.clear();
|
||||||
o->modules_right_.clear();
|
o->modules_right_.clear();
|
||||||
|
@ -272,15 +286,12 @@ void waybar::Bar::getModules(const Factory& factory, const std::string& pos) {
|
||||||
modules_right_.emplace_back(module);
|
modules_right_.emplace_back(module);
|
||||||
}
|
}
|
||||||
module->dp.connect([module, &name] {
|
module->dp.connect([module, &name] {
|
||||||
// Fix https://github.com/Alexays/Waybar/issues/320, proper way?
|
|
||||||
Glib::signal_idle().connect_once([module, &name] {
|
|
||||||
try {
|
try {
|
||||||
module->update();
|
module->update();
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
spdlog::error("{}: {}", name.asString(), e.what());
|
spdlog::error("{}: {}", name.asString(), e.what());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
spdlog::warn("module {}: {}", name.asString(), e.what());
|
spdlog::warn("module {}: {}", name.asString(), e.what());
|
||||||
}
|
}
|
||||||
|
@ -313,5 +324,4 @@ auto waybar::Bar::setupWidgets() -> void {
|
||||||
for (auto const& module : modules_right_) {
|
for (auto const& module : modules_right_) {
|
||||||
right_.pack_end(*module, false, false, 0);
|
right_.pack_end(*module, false, false, 0);
|
||||||
}
|
}
|
||||||
window.show_all();
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue