Fix deadlock on workspace scrolling

Make the mutex guard lifecycle finish before the send ipc command
by adding scope around the code.

Fixes #395 .
This commit is contained in:
sheenobu 2019-07-05 20:19:50 -07:00
parent 67ad0e69ce
commit a6c0bc5a52
1 changed files with 18 additions and 16 deletions

View File

@ -218,23 +218,25 @@ bool Workspaces::handleScroll(GdkEventScroll *e) {
if (dir == SCROLL_DIR::NONE) { if (dir == SCROLL_DIR::NONE) {
return true; return true;
} }
std::lock_guard<std::mutex> lock(mutex_);
auto it = std::find_if(workspaces_.begin(), workspaces_.end(), [](const auto &workspace) {
return workspace["focused"].asBool();
});
if (it == workspaces_.end()) {
return true;
}
std::string name; std::string name;
if (dir == SCROLL_DIR::DOWN || dir == SCROLL_DIR::RIGHT) { {
name = getCycleWorkspace(it, false); std::lock_guard<std::mutex> lock(mutex_);
} else if (dir == SCROLL_DIR::UP || dir == SCROLL_DIR::LEFT) { auto it = std::find_if(workspaces_.begin(), workspaces_.end(), [](const auto &workspace) {
name = getCycleWorkspace(it, true); return workspace["focused"].asBool();
} else { });
return true; if (it == workspaces_.end()) {
} return true;
if (name == (*it)["name"].asString()) { }
return true; if (dir == SCROLL_DIR::DOWN || dir == SCROLL_DIR::RIGHT) {
name = getCycleWorkspace(it, false);
} else if (dir == SCROLL_DIR::UP || dir == SCROLL_DIR::LEFT) {
name = getCycleWorkspace(it, true);
} else {
return true;
}
if (name == (*it)["name"].asString()) {
return true;
}
} }
try { try {
ipc_.sendCmd(IPC_COMMAND, fmt::format("workspace \"{}\"", name)); ipc_.sendCmd(IPC_COMMAND, fmt::format("workspace \"{}\"", name));