feat(hyprland/workspaces): added options move-to-monitor and active-per-monitor

This commit is contained in:
Tom Benham
2024-03-04 13:17:30 +01:00
parent 26af1066e1
commit df7f1fffcf
3 changed files with 74 additions and 6 deletions

View File

@ -83,6 +83,16 @@ auto Workspaces::parseConfig(const Json::Value &config) -> void {
m_activeOnly = configActiveOnly.asBool();
}
auto configMoveToMonitor = config_["move-to-monitor"];
if (configMoveToMonitor.isBool()) {
m_moveToMonitor = configMoveToMonitor.asBool();
}
auto configActivePerMonitor = config_["active-per-monitor"];
if (configActivePerMonitor.isBool()) {
m_activePerMonitor = configActivePerMonitor.asBool();
}
auto configSortBy = config_["sort-by"];
if (configSortBy.isString()) {
auto sortByStr = configSortBy.asString();
@ -321,7 +331,14 @@ void Workspaces::onEvent(const std::string &ev) {
}
void Workspaces::onWorkspaceActivated(std::string const &payload) {
m_activeWorkspaceName = payload;
if (!m_activePerMonitor) {
m_activeWorkspaceName = payload;
return;
}
auto activeWorkspace = gIPC->getSocket1JsonReply("activeworkspace");
if (m_bar.output->name == activeWorkspace["monitor"].asString()) {
m_activeWorkspaceName = payload;
}
}
void Workspaces::onSpecialWorkspaceActivated(std::string const &payload) {
@ -374,6 +391,16 @@ void Workspaces::onWorkspaceMoved(std::string const &payload) {
if (m_bar.output->name == monitorName) {
Json::Value clientsData = gIPC->getSocket1JsonReply("clients");
onWorkspaceCreated(workspaceName, clientsData);
if (m_activePerMonitor) {
for (Json::Value &monitor : gIPC->getSocket1JsonReply("monitors")) {
if (m_bar.output->name == monitor["name"].asString()) {
auto ws = monitor["activeWorkspace"];
if (ws.isObject() && (ws["name"].isString())) {
m_activeWorkspaceName = ws["name"].asString();
}
}
}
}
} else {
spdlog::debug("Removing workspace because it was moved to another monitor: {}");
onWorkspaceDestroyed(workspaceName);
@ -399,10 +426,13 @@ void Workspaces::onWorkspaceRenamed(std::string const &payload) {
void Workspaces::onMonitorFocused(std::string const &payload) {
spdlog::trace("Monitor focused: {}", payload);
m_activeWorkspaceName = payload.substr(payload.find(',') + 1);
auto monitorName = payload.substr(0, payload.find(','));
if (!m_activePerMonitor || m_bar.output->name == monitorName) {
m_activeWorkspaceName = payload.substr(payload.find(',') + 1);
}
for (Json::Value &monitor : gIPC->getSocket1JsonReply("monitors")) {
if (monitor["name"].asString() == payload.substr(0, payload.find(','))) {
if (monitor["name"].asString() == monitorName) {
auto name = monitor["specialWorkspace"]["name"].asString();
m_activeSpecialWorkspaceName = !name.starts_with("special:") ? name : name.substr(8);
}
@ -804,7 +834,18 @@ void Workspaces::extendOrphans(int workspaceId, Json::Value const &clientsJson)
}
void Workspaces::init() {
m_activeWorkspaceName = (gIPC->getSocket1JsonReply("activeworkspace"))["name"].asString();
if (!m_activePerMonitor) {
m_activeWorkspaceName = (gIPC->getSocket1JsonReply("activeworkspace"))["name"].asString();
} else {
for (Json::Value &monitor : gIPC->getSocket1JsonReply("monitors")) {
if (m_bar.output->name == monitor["name"].asString()) {
auto ws = monitor["activeWorkspace"];
if (ws.isObject() && (ws["name"].isString())) {
m_activeWorkspaceName = ws["name"].asString();
}
}
}
}
initializeWorkspaces();
updateWindowCount();
@ -1019,9 +1060,17 @@ bool Workspace::handleClicked(GdkEventButton *bt) const {
if (bt->type == GDK_BUTTON_PRESS) {
try {
if (id() > 0) { // normal
gIPC->getSocket1Reply("dispatch workspace " + std::to_string(id()));
if (m_workspaceManager.moveToMonitor()) {
gIPC->getSocket1Reply("dispatch focusworkspaceoncurrentmonitor " + std::to_string(id()));
} else {
gIPC->getSocket1Reply("dispatch workspace " + std::to_string(id()));
}
} else if (!isSpecial()) { // named (this includes persistent)
gIPC->getSocket1Reply("dispatch workspace name:" + name());
if (m_workspaceManager.moveToMonitor()) {
gIPC->getSocket1Reply("dispatch focusworkspaceoncurrentmonitor name:" + name());
} else {
gIPC->getSocket1Reply("dispatch workspace name:" + name());
}
} else if (id() != -99) { // named special
gIPC->getSocket1Reply("dispatch togglespecialworkspace " + name());
} else { // special