summaryrefslogtreecommitdiff
path: root/src/events/Windows.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-06-15 18:20:09 +0200
committerVaxry <vaxry@vaxry.net>2024-06-15 18:20:41 +0200
commit91fe58f8f278d126852877eadc87c50ca7b9b78d (patch)
treee8fddf5d2659a432b36d1272548a07b2a482a8ff /src/events/Windows.cpp
parent77f44bfcab6c3e553d26a776c011613efbfe6cfd (diff)
window: improve swallowing functionality
cleanups, fixes, etc. ref #6095
Diffstat (limited to 'src/events/Windows.cpp')
-rw-r--r--src/events/Windows.cpp69
1 files changed, 7 insertions, 62 deletions
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index becff152..d37ba12b 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -44,7 +44,6 @@ void Events::listener_mapWindow(void* owner, void* data) {
static auto PDIMSTRENGTH = CConfigValue<Hyprlang::FLOAT>("decoration:dim_strength");
static auto PSWALLOW = CConfigValue<Hyprlang::INT>("misc:enable_swallow");
static auto PSWALLOWREGEX = CConfigValue<std::string>("misc:swallow_regex");
- static auto PSWALLOWEXREGEX = CConfigValue<std::string>("misc:swallow_exception_regex");
static auto PNEWTAKESOVERFS = CConfigValue<Hyprlang::INT>("misc:new_window_takes_over_fullscreen");
static auto PINITIALWSTRACKING = CConfigValue<Hyprlang::INT>("misc:initial_workspace_tracking");
@@ -527,71 +526,17 @@ void Events::listener_mapWindow(void* owner, void* data) {
// verify swallowing
if (*PSWALLOW && std::string{*PSWALLOWREGEX} != STRVAL_EMPTY) {
- // don't swallow ourselves
- std::regex rgx(*PSWALLOWREGEX);
- if (!std::regex_match(PWINDOW->m_szClass, rgx)) {
- // check parent
- int ppid = getPPIDof(PWINDOW->getPID());
+ const auto SWALLOWER = PWINDOW->getSwallower();
- int curppid = 0;
+ if (SWALLOWER) {
+ // swallow
+ PWINDOW->m_pSwallowed = SWALLOWER;
- for (int i = 0; i < 5; ++i) {
- curppid = getPPIDof(ppid);
+ g_pLayoutManager->getCurrentLayout()->onWindowRemoved(SWALLOWER);
- if (curppid < 10) {
- break;
- }
-
- ppid = curppid;
- }
-
- if (ppid) {
- // get window by pid
- std::vector<PHLWINDOW> found;
- PHLWINDOW finalFound;
- for (auto& w : g_pCompositor->m_vWindows) {
- if (!w->m_bIsMapped || w->isHidden())
- continue;
-
- if (w->getPID() == ppid) {
- found.push_back(w);
- }
- }
-
- if (found.size() > 1) {
- for (auto& w : found) {
- // try get the focus, otherwise we'll ignore to avoid swallowing incorrect windows
- if (w == PFOCUSEDWINDOWPREV) {
- finalFound = w;
- break;
- }
- }
- } else if (found.size() == 1) {
- finalFound = found[0];
- }
-
- if (finalFound) {
- bool valid = std::regex_match(PWINDOW->m_szClass, rgx);
-
- if (std::string{*PSWALLOWEXREGEX} != STRVAL_EMPTY) {
- std::regex exc(*PSWALLOWEXREGEX);
-
- valid = valid && !std::regex_match(PWINDOW->m_szTitle, exc);
- }
-
- // check if it's the window we want & not exempt from getting swallowed
- if (valid) {
- // swallow
- PWINDOW->m_pSwallowed = finalFound;
+ SWALLOWER->setHidden(true);
- g_pLayoutManager->getCurrentLayout()->onWindowRemoved(finalFound);
-
- finalFound->setHidden(true);
-
- g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->m_iMonitorID);
- }
- }
- }
+ g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->m_iMonitorID);
}
}