2018-08-08 21:54:58 +00:00
|
|
|
#include "client.hpp"
|
|
|
|
|
|
|
|
waybar::Client::Client(int argc, char* argv[])
|
|
|
|
: gtk_main(argc, argv),
|
|
|
|
gdk_display(Gdk::Display::get_default()),
|
|
|
|
wlDisplay(gdk_wayland_display_get_wl_display(gdk_display->gobj()))
|
2018-08-09 12:04:48 +00:00
|
|
|
{
|
|
|
|
auto getFirstValidPath = [] (std::vector<std::string> possiblePaths) {
|
|
|
|
wordexp_t p;
|
|
|
|
|
|
|
|
for (std::string path: possiblePaths) {
|
|
|
|
if (wordexp(path.c_str(), &p, 0) == 0) {
|
|
|
|
if (access(p.we_wordv[0], F_OK) == 0) {
|
|
|
|
std::string result = p.we_wordv[0];
|
|
|
|
wordfree(&p);
|
|
|
|
return result;
|
|
|
|
}
|
2018-08-15 15:31:45 +00:00
|
|
|
wordfree(&p);
|
2018-08-09 12:04:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return std::string();
|
|
|
|
};
|
|
|
|
|
|
|
|
configFile = getFirstValidPath({
|
|
|
|
"$XDG_CONFIG_HOME/waybar/config",
|
|
|
|
"$HOME/waybar/config",
|
2018-08-09 15:02:30 +00:00
|
|
|
"/etc/xdg/waybar/config",
|
2018-08-09 12:04:48 +00:00
|
|
|
"./resources/config",
|
|
|
|
});
|
|
|
|
cssFile = getFirstValidPath({
|
|
|
|
"$XDG_CONFIG_HOME/waybar/style.css",
|
|
|
|
"$HOME/waybar/style.css",
|
2018-08-09 15:02:30 +00:00
|
|
|
"/etc/xdg/waybar/style.css",
|
2018-08-09 12:04:48 +00:00
|
|
|
"./resources/style.css",
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
2018-08-08 21:54:58 +00:00
|
|
|
|
2018-08-09 18:22:01 +00:00
|
|
|
void waybar::Client::_handle_global(void *data, struct wl_registry *registry,
|
|
|
|
uint32_t name, const char *interface, uint32_t version)
|
|
|
|
{
|
|
|
|
auto o = reinterpret_cast<waybar::Client *>(data);
|
2018-08-15 15:31:45 +00:00
|
|
|
if (!strcmp(interface, zwlr_layer_shell_v1_interface.name))
|
|
|
|
o->layerShell = (zwlr_layer_shell_v1 *)wl_registry_bind(registry, name,
|
2018-08-09 18:22:01 +00:00
|
|
|
&zwlr_layer_shell_v1_interface, version);
|
2018-08-15 15:31:45 +00:00
|
|
|
else if (!strcmp(interface, wl_output_interface.name)) {
|
2018-08-14 23:53:43 +00:00
|
|
|
auto output = std::make_unique<struct wl_output *>();
|
2018-08-15 15:31:45 +00:00
|
|
|
*output = (struct wl_output *)wl_registry_bind(registry, name,
|
|
|
|
&wl_output_interface, version);
|
|
|
|
if (o->xdgOutputManager)
|
2018-08-14 23:53:43 +00:00
|
|
|
o->bars.emplace_back(std::make_unique<Bar>(*o, std::move(output)));
|
2018-08-15 15:31:45 +00:00
|
|
|
} else if (!strcmp(interface, wl_seat_interface.name))
|
2018-08-09 18:22:01 +00:00
|
|
|
o->seat = (struct wl_seat *)wl_registry_bind(registry, name,
|
|
|
|
&wl_seat_interface, version);
|
2018-08-15 15:31:45 +00:00
|
|
|
else if (!strcmp(interface, zxdg_output_manager_v1_interface.name)
|
|
|
|
&& version >= ZXDG_OUTPUT_V1_NAME_SINCE_VERSION)
|
|
|
|
o->xdgOutputManager =
|
2018-08-10 22:32:59 +00:00
|
|
|
(struct zxdg_output_manager_v1 *)wl_registry_bind(registry, name,
|
|
|
|
&zxdg_output_manager_v1_interface, ZXDG_OUTPUT_V1_NAME_SINCE_VERSION);
|
2018-08-09 18:22:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void waybar::Client::_handle_global_remove(void *data,
|
|
|
|
struct wl_registry *registry, uint32_t name)
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
2018-08-08 21:54:58 +00:00
|
|
|
void waybar::Client::bind_interfaces()
|
|
|
|
{
|
|
|
|
registry = wl_display_get_registry(wlDisplay);
|
2018-08-09 18:22:01 +00:00
|
|
|
static const struct wl_registry_listener registry_listener = {
|
|
|
|
.global = _handle_global,
|
|
|
|
.global_remove = _handle_global_remove,
|
|
|
|
};
|
2018-08-08 21:54:58 +00:00
|
|
|
wl_registry_add_listener(registry, ®istry_listener, this);
|
|
|
|
wl_display_roundtrip(wlDisplay);
|
|
|
|
}
|
|
|
|
|
|
|
|
int waybar::Client::main(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
bind_interfaces();
|
|
|
|
gtk_main.run();
|
|
|
|
return 0;
|
|
|
|
}
|