feat(sway/window): handle floating nodes

This commit is contained in:
Alex 2019-06-14 11:27:40 +02:00
parent 486b5a5d38
commit dabe2bebbb
3 changed files with 13 additions and 8 deletions

View File

@ -5,7 +5,6 @@
#include <sys/un.h> #include <sys/un.h>
#include <unistd.h> #include <unistd.h>
#include <cstring> #include <cstring>
#include <iostream>
#include <memory> #include <memory>
#include <mutex> #include <mutex>
#include "ipc.hpp" #include "ipc.hpp"

View File

@ -21,7 +21,8 @@ class Window : public ALabel, public sigc::trackable {
void onEvent(const struct Ipc::ipc_response&); void onEvent(const struct Ipc::ipc_response&);
void onCmd(const struct Ipc::ipc_response&); void onCmd(const struct Ipc::ipc_response&);
void worker(); void worker();
std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes, std::string output); std::tuple<std::size_t, int, std::string, std::string> getFocusedNode(const Json::Value& nodes,
std::string& output);
void getTree(); void getTree();
const Bar& bar_; const Bar& bar_;

View File

@ -24,7 +24,7 @@ void Window::onCmd(const struct Ipc::ipc_response& res) {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
auto payload = parser_.parse(res.payload); auto payload = parser_.parse(res.payload);
auto output = payload["ouput"].isString() ? payload["output"].asString() : ""; auto output = payload["ouput"].isString() ? payload["output"].asString() : "";
std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload, output); std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload["nodes"], output);
dp.emit(); dp.emit();
} catch (const std::exception& e) { } catch (const std::exception& e) {
spdlog::error("Window: {}", e.what()); spdlog::error("Window: {}", e.what());
@ -70,23 +70,28 @@ auto Window::update() -> void {
} }
std::tuple<std::size_t, int, std::string, std::string> Window::getFocusedNode( std::tuple<std::size_t, int, std::string, std::string> Window::getFocusedNode(
const Json::Value& nodes, std::string output) { const Json::Value& nodes, std::string& output) {
for (auto const& node : nodes["nodes"]) { for (auto const& node : nodes) {
if (node["output"].isString()) { if (node["output"].isString()) {
output = node["output"].asString(); output = node["output"].asString();
} }
if (node["focused"].asBool() && node["type"] == "con") { if (node["focused"].asBool() && (node["type"] == "con" || node["type"] == "floating_con")) {
if ((!config_["all-outputs"].asBool() && output == bar_.output->name) || if ((!config_["all-outputs"].asBool() && output == bar_.output->name) ||
config_["all-outputs"].asBool()) { config_["all-outputs"].asBool()) {
auto app_id = node["app_id"].isString() ? node["app_id"].asString() auto app_id = node["app_id"].isString() ? node["app_id"].asString()
: node["window_properties"]["instance"].asString(); : node["window_properties"]["instance"].asString();
return {nodes["nodes"].size(), return {nodes.size(),
node["id"].asInt(), node["id"].asInt(),
Glib::Markup::escape_text(node["name"].asString()), Glib::Markup::escape_text(node["name"].asString()),
app_id}; app_id};
} }
} }
auto [nb, id, name, app_id] = getFocusedNode(node, output); auto [nb, id, name, app_id] = getFocusedNode(node["nodes"], output);
if (id > -1 && !name.empty()) {
return {nb, id, name, app_id};
}
// Search for floating node
std::tie(nb, id, name, app_id) = getFocusedNode(node["floating_nodes"], output);
if (id > -1 && !name.empty()) { if (id > -1 && !name.empty()) {
return {nb, id, name, app_id}; return {nb, id, name, app_id};
} }