aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/events/Windows.cpp76
1 files changed, 34 insertions, 42 deletions
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index 9d5cd446..9ceae914 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -397,67 +397,59 @@ void Events::listener_mapWindow(void* owner, void* data) {
// verify swallowing
if (*PSWALLOW) {
- // check parent
- int ppid = getPPIDof(PWINDOW->getPID());
+ // don't swallow ourselves
+ std::regex rgx(*PSWALLOWREGEX);
+ if (!std::regex_match(g_pXWaylandManager->getAppIDClass(PWINDOW), rgx)) {
+ // check parent
+ int ppid = getPPIDof(PWINDOW->getPID());
- const auto PPPID = getPPIDof(ppid);
+ int curppid = 0;
- // why? no clue. Blame terminals.
- if (PPPID > 2) {
- ppid = PPPID;
- }
-
- if (ppid) {
- // get window by pid
- std::vector<CWindow*> found;
- CWindow* finalFound = nullptr;
- for (auto& w : g_pCompositor->m_vWindows) {
- if (!w->m_bIsMapped || w->m_bHidden)
- continue;
+ for (int i = 0; i < 5; ++i) {
+ curppid = getPPIDof(ppid);
- if (w->getPID() == ppid) {
- found.push_back(w.get());
+ if (curppid < 10) {
+ break;
}
+
+ ppid = curppid;
}
- if (found.size() > 1) {
- for (auto& w : found) {
- // try get the focus
- if (w == PFOCUSEDWINDOWPREV) {
- finalFound = w;
- break;
+ if (ppid) {
+ // get window by pid
+ std::vector<CWindow*> found;
+ CWindow* finalFound = nullptr;
+ for (auto& w : g_pCompositor->m_vWindows) {
+ if (!w->m_bIsMapped || w->m_bHidden)
+ continue;
+
+ if (w->getPID() == ppid) {
+ found.push_back(w.get());
}
}
- if (!finalFound) {
- // just get the closest (ws)
+ if (found.size() > 1) {
for (auto& w : found) {
- if (w->m_iWorkspaceID == g_pCompositor->m_pLastMonitor->activeWorkspace) {
+ // try get the focus, otherwise we'll ignore to avoid swallowing incorrect windows
+ if (w == PFOCUSEDWINDOWPREV) {
finalFound = w;
break;
}
}
- }
-
- if (!finalFound) {
- // what, just use 0
+ } else if (found.size() == 1) {
finalFound = found[0];
}
- } else if (found.size() == 1) {
- finalFound = found[0];
- }
-
- if (finalFound) {
- // check if it's the window we want
- std::regex rgx(*PSWALLOWREGEX);
- if (std::regex_match(g_pXWaylandManager->getAppIDClass(finalFound), rgx)) {
- // swallow
- PWINDOW->m_pSwallowed = finalFound;
+ if (finalFound) {
+ // check if it's the window we want
+ if (std::regex_match(g_pXWaylandManager->getAppIDClass(finalFound), rgx)) {
+ // swallow
+ PWINDOW->m_pSwallowed = finalFound;
- g_pLayoutManager->getCurrentLayout()->onWindowRemoved(finalFound);
+ g_pLayoutManager->getCurrentLayout()->onWindowRemoved(finalFound);
- finalFound->m_bHidden = true;
+ finalFound->m_bHidden = true;
+ }
}
}
}