mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-10 08:25:58 +01:00
Added window swallowing
This commit is contained in:
parent
355366714e
commit
a97621b1cb
5 changed files with 90 additions and 0 deletions
|
@ -146,6 +146,9 @@ public:
|
||||||
// animated tint
|
// animated tint
|
||||||
CAnimatedVariable m_fDimPercent;
|
CAnimatedVariable m_fDimPercent;
|
||||||
|
|
||||||
|
// swallowing
|
||||||
|
CWindow* m_pSwallowed = nullptr;
|
||||||
|
|
||||||
// for toplevel monitor events
|
// for toplevel monitor events
|
||||||
uint64_t m_iLastToplevelMonitorID = -1;
|
uint64_t m_iLastToplevelMonitorID = -1;
|
||||||
uint64_t m_iLastSurfaceMonitorID = -1;
|
uint64_t m_iLastSurfaceMonitorID = -1;
|
||||||
|
|
|
@ -58,6 +58,8 @@ void CConfigManager::setDefaultVars() {
|
||||||
configValues["misc:layers_hog_keyboard_focus"].intValue = 1;
|
configValues["misc:layers_hog_keyboard_focus"].intValue = 1;
|
||||||
configValues["misc:animate_manual_resizes"].intValue = 0;
|
configValues["misc:animate_manual_resizes"].intValue = 0;
|
||||||
configValues["misc:disable_autoreload"].intValue = 0;
|
configValues["misc:disable_autoreload"].intValue = 0;
|
||||||
|
configValues["misc:enable_swallow"].intValue = 0;
|
||||||
|
configValues["misc:swallow_regex"].strValue = STRVAL_EMPTY;
|
||||||
|
|
||||||
configValues["debug:int"].intValue = 0;
|
configValues["debug:int"].intValue = 0;
|
||||||
configValues["debug:log_damage"].intValue = 0;
|
configValues["debug:log_damage"].intValue = 0;
|
||||||
|
|
|
@ -49,6 +49,8 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
static auto *const PINACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:inactive_opacity")->floatValue;
|
static auto *const PINACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:inactive_opacity")->floatValue;
|
||||||
static auto *const PACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:active_opacity")->floatValue;
|
static auto *const PACTIVEALPHA = &g_pConfigManager->getConfigValuePtr("decoration:active_opacity")->floatValue;
|
||||||
static auto *const PDIMSTRENGTH = &g_pConfigManager->getConfigValuePtr("decoration:dim_strength")->floatValue;
|
static auto *const PDIMSTRENGTH = &g_pConfigManager->getConfigValuePtr("decoration:dim_strength")->floatValue;
|
||||||
|
static auto *const PSWALLOW = &g_pConfigManager->getConfigValuePtr("misc:enable_swallow")->intValue;
|
||||||
|
static auto *const PSWALLOWREGEX = &g_pConfigManager->getConfigValuePtr("misc:swallow_regex")->strValue;
|
||||||
|
|
||||||
const auto PMONITOR = g_pCompositor->m_pLastMonitor;
|
const auto PMONITOR = g_pCompositor->m_pLastMonitor;
|
||||||
const auto PWORKSPACE = PMONITOR->specialWorkspaceOpen ? g_pCompositor->getWorkspaceByID(SPECIAL_WORKSPACE_ID) : g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);
|
const auto PWORKSPACE = PMONITOR->specialWorkspaceOpen ? g_pCompositor->getWorkspaceByID(SPECIAL_WORKSPACE_ID) : g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);
|
||||||
|
@ -376,6 +378,46 @@ void Events::listener_mapWindow(void* owner, void* data) {
|
||||||
g_pCompositor->focusWindow(nullptr);
|
g_pCompositor->focusWindow(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// verify swallowing
|
||||||
|
if (*PSWALLOW) {
|
||||||
|
// check parent
|
||||||
|
int ppid = getPPIDof(PWINDOW->getPID());
|
||||||
|
|
||||||
|
const auto PPPID = getPPIDof(ppid);
|
||||||
|
|
||||||
|
// why? no clue. Blame terminals.
|
||||||
|
if (PPPID > 2) {
|
||||||
|
ppid = PPPID;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ppid) {
|
||||||
|
// get window by pid
|
||||||
|
CWindow* found = nullptr;
|
||||||
|
for (auto& w : g_pCompositor->m_vWindows) {
|
||||||
|
if (!w->m_bIsMapped || w->m_bHidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (w->getPID() == ppid) {
|
||||||
|
found = w.get();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
// check if it's the window we want
|
||||||
|
std::regex rgx(*PSWALLOWREGEX);
|
||||||
|
if (std::regex_match(g_pXWaylandManager->getAppIDClass(found), rgx)) {
|
||||||
|
// swallow
|
||||||
|
PWINDOW->m_pSwallowed = found;
|
||||||
|
|
||||||
|
g_pLayoutManager->getCurrentLayout()->onWindowRemoved(found);
|
||||||
|
|
||||||
|
found->m_bHidden = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y);
|
Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y);
|
||||||
|
|
||||||
auto workspaceID = requestedWorkspace != "" ? requestedWorkspace : PWORKSPACE->m_szName;
|
auto workspaceID = requestedWorkspace != "" ? requestedWorkspace : PWORKSPACE->m_szName;
|
||||||
|
@ -415,6 +457,13 @@ void Events::listener_unmapWindow(void* owner, void* data) {
|
||||||
// Allow the renderer to catch the last frame.
|
// Allow the renderer to catch the last frame.
|
||||||
g_pHyprOpenGL->makeWindowSnapshot(PWINDOW);
|
g_pHyprOpenGL->makeWindowSnapshot(PWINDOW);
|
||||||
|
|
||||||
|
// swallowing
|
||||||
|
if (PWINDOW->m_pSwallowed && g_pCompositor->windowExists(PWINDOW->m_pSwallowed)) {
|
||||||
|
PWINDOW->m_pSwallowed->m_bHidden = false;
|
||||||
|
g_pLayoutManager->getCurrentLayout()->onWindowCreated(PWINDOW->m_pSwallowed);
|
||||||
|
PWINDOW->m_pSwallowed = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool wasLastWindow = false;
|
bool wasLastWindow = false;
|
||||||
|
|
||||||
if (PWINDOW == g_pCompositor->m_pLastWindow) {
|
if (PWINDOW == g_pCompositor->m_pLastWindow) {
|
||||||
|
|
|
@ -354,3 +354,38 @@ void matrixProjection(float mat[9], int w, int h, wl_output_transform tr) {
|
||||||
// Identity
|
// Identity
|
||||||
mat[8] = 1.0f;
|
mat[8] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t getPPIDof(int64_t pid) {
|
||||||
|
std::string dir = "/proc/" + std::to_string(pid) + "/status";
|
||||||
|
FILE* infile;
|
||||||
|
|
||||||
|
infile = fopen(dir.c_str(), "r");
|
||||||
|
if (!infile)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
char* line = nullptr;
|
||||||
|
size_t len = 0;
|
||||||
|
ssize_t len2 = 0;
|
||||||
|
|
||||||
|
std::string pidstr;
|
||||||
|
|
||||||
|
while ((len2 = getline(&line, &len, infile)) != -1) {
|
||||||
|
if (strstr(line, "PPid:")) {
|
||||||
|
pidstr = std::string(line, len2);
|
||||||
|
const auto tabpos = pidstr.find_last_of('\t');
|
||||||
|
if (tabpos != std::string::npos)
|
||||||
|
pidstr = pidstr.substr(tabpos);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(infile);
|
||||||
|
if (line)
|
||||||
|
free(line);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return std::stoll(pidstr);
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ int getWorkspaceIDFromString(const std::string&, std::string&);
|
||||||
float vecToRectDistanceSquared(const Vector2D& vec, const Vector2D& p1, const Vector2D& p2);
|
float vecToRectDistanceSquared(const Vector2D& vec, const Vector2D& p1, const Vector2D& p2);
|
||||||
void logSystemInfo();
|
void logSystemInfo();
|
||||||
std::string execAndGet(const char*);
|
std::string execAndGet(const char*);
|
||||||
|
int64_t getPPIDof(int64_t pid);
|
||||||
|
|
||||||
float getPlusMinusKeywordResult(std::string in, float relative);
|
float getPlusMinusKeywordResult(std::string in, float relative);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue