mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 03:09:48 +01:00
fixes for xwayland popups, autofloat pop-up and task_dialog
This commit is contained in:
parent
86bb95c125
commit
c35517d44e
4 changed files with 23 additions and 2 deletions
|
@ -761,3 +761,12 @@ CWorkspace* CCompositor::getWorkspaceByString(const std::string& str) {
|
|||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool CCompositor::isPointOnAnyMonitor(const Vector2D& point) {
|
||||
for (auto& m : m_lMonitors) {
|
||||
if (VECINRECT(point, m.vecPosition.x, m.vecPosition.y, m.vecSize.x + m.vecPosition.x, m.vecSize.y + m.vecPosition.y))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
|
@ -111,6 +111,7 @@ public:
|
|||
void deactivateAllWLRWorkspaces();
|
||||
CWindow* getNextWindowOnWorkspace(CWindow*);
|
||||
int getNextAvailableNamedWorkspace();
|
||||
bool isPointOnAnyMonitor(const Vector2D&);
|
||||
|
||||
private:
|
||||
void initAllSignals();
|
||||
|
|
|
@ -551,8 +551,8 @@ void CHyprDwindleLayout::onWindowCreatedFloating(CWindow* pWindow) {
|
|||
// check if it's on the correct monitor!
|
||||
Vector2D middlePoint = Vector2D(desiredGeometry.x, desiredGeometry.y) + Vector2D(desiredGeometry.width, desiredGeometry.height) / 2.f;
|
||||
|
||||
// TODO: detect a popup in a more consistent way.
|
||||
if ((g_pCompositor->getMonitorFromVector(middlePoint) && g_pCompositor->getMonitorFromVector(middlePoint)->ID != pWindow->m_iMonitorID) || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) {
|
||||
// TODO: detect a popup in a more consistent way.
|
||||
if (!g_pCompositor->isPointOnAnyMonitor(middlePoint) || (desiredGeometry.x == 0 && desiredGeometry.y == 0)) {
|
||||
// if it's not, fall back to the center placement
|
||||
pWindow->m_vRealPosition = PMONITOR->vecPosition + Vector2D((PMONITOR->vecSize.x - desiredGeometry.width) / 2.f, (PMONITOR->vecSize.y - desiredGeometry.height) / 2.f);
|
||||
} else {
|
||||
|
|
|
@ -145,6 +145,17 @@ bool CHyprXWaylandManager::shouldBeFloated(CWindow* pWindow) {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (pWindow->m_uSurface.xwayland->role) {
|
||||
try {
|
||||
std::string winrole = std::string(pWindow->m_uSurface.xwayland->role);
|
||||
if (winrole.find("pop-up") != std::string::npos || winrole.find("task_dialog") != std::string::npos) {
|
||||
return true;
|
||||
}
|
||||
} catch (std::exception& e) {
|
||||
Debug::log(ERR, "Error in shouldBeFloated, winrole threw %s", e.what());
|
||||
}
|
||||
}
|
||||
|
||||
if (pWindow->m_uSurface.xwayland->modal) {
|
||||
pWindow->m_bIsModal = true;
|
||||
return true;
|
||||
|
|
Loading…
Reference in a new issue