diff --git a/man/waybar-sway-workspaces.5.scd b/man/waybar-sway-workspaces.5.scd index b90f860c..d7050ddc 100644 --- a/man/waybar-sway-workspaces.5.scd +++ b/man/waybar-sway-workspaces.5.scd @@ -88,6 +88,10 @@ Addressed by *sway/workspaces* typeof: bool ++ Whether to disable *workspace_auto_back_and_forth* when clicking on workspaces. If this is set to *true*, clicking on a workspace you are already on won't do anything, even if *workspace_auto_back_and_forth* is enabled in the Sway configuration. +*no-switch-output*: ++ + typeof: bool ++ + Whether to disable switching output when clicking on workspaces. If this is set to *true*, then clicking on a workspace on a different output will bring it to the current output instead of switching to that output. + *alphabetical_sort*: ++ typeof: bool ++ Whether to sort workspaces alphabetically. Please note this can make "swaymsg workspace prev/next" move to workspaces inconsistent with the ordering shown in Waybar. diff --git a/src/modules/sway/workspaces.cpp b/src/modules/sway/workspaces.cpp index 3fc410d2..957187a0 100644 --- a/src/modules/sway/workspaces.cpp +++ b/src/modules/sway/workspaces.cpp @@ -359,7 +359,7 @@ auto Workspaces::update() -> void { if ((*it)["output"].isString()) { // Simply attempt to remove all output classes every time to reset output classes. This works // even if a class has not been previously added to the style context. - for (const auto &oclass : config_["output-classes"]) { + for (const auto& oclass : config_["output-classes"]) { button.get_style_context()->remove_class(oclass.asString()); } // If output-classes contains a class for output associated with current workspace button, add @@ -437,13 +437,19 @@ Gtk::Button& Workspaces::addButton(const Json::Value& node) { node["name"].asString(), node["target_output"].asString(), "--no-auto-back-and-forth", node["name"].asString())); } else { - std::string flag = config_["disable-auto-back-and-forth"].asBool() - ? "--no-auto-back-and-forth" - : ""; - if (node["num"].asInt() >= 0) { - ipc_.sendCmd(IPC_COMMAND, fmt::format(workspace_switch_number_cmd_, flag, node["num"].asInt())); + std::string flag = + config_["disable-auto-back-and-forth"].asBool() ? "--no-auto-back-and-forth" : ""; + if (config_["no-switch-output"].asBool()) { + ipc_.sendCmd(IPC_COMMAND, + fmt::format("[workspace=\"^{}$\"] move workspace to output current; " + "workspace number {} \"{}\"", + node["name"].asString(), flag, node["name"].asString())); + } else if (node["num"].asInt() >= 0) { + ipc_.sendCmd(IPC_COMMAND, + fmt::format(workspace_switch_number_cmd_, flag, node["num"].asInt())); } else { - ipc_.sendCmd(IPC_COMMAND, fmt::format(workspace_switch_cmd_, flag, node["name"].asString())); + ipc_.sendCmd(IPC_COMMAND, + fmt::format(workspace_switch_cmd_, flag, node["name"].asString())); } } } catch (const std::exception& e) {