xwayland: push invisible windows outside layout

fixes some xwl focus issues with special especially.
This commit is contained in:
Vaxry 2023-12-12 01:14:36 +00:00
parent ea7569d7e0
commit accb3d8d0b
3 changed files with 30 additions and 3 deletions

View file

@ -2773,4 +2773,4 @@ void CCompositor::setPreferredScaleForSurface(wlr_surface* pSurface, double scal
void CCompositor::setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform) { void CCompositor::setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform) {
wlr_surface_set_preferred_buffer_transform(pSurface, transform); wlr_surface_set_preferred_buffer_transform(pSurface, transform);
} }

View file

@ -565,6 +565,15 @@ void CMonitor::changeWorkspace(CWorkspace* const pWorkspace, bool internal, bool
g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace); g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace);
g_pConfigManager->ensureVRR(this); g_pConfigManager->ensureVRR(this);
for (auto& w : g_pCompositor->m_vWindows) {
if (w->m_iWorkspaceID != POLDWORKSPACE->m_iID || !w->m_bMappedX11 || !w->m_bIsX11 || w->isHidden() || w->m_iMonitorID != ID)
continue;
g_pXWaylandManager->moveXWaylandWindow(w.get(), {30000, 30000});
}
g_pCompositor->forceReportSizesToWindowsOnWorkspace(pWorkspace->m_iID);
} }
void CMonitor::changeWorkspace(const int& id, bool internal) { void CMonitor::changeWorkspace(const int& id, bool internal) {
@ -576,7 +585,9 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
if (!pWorkspace) { if (!pWorkspace) {
// remove special if exists // remove special if exists
if (const auto EXISTINGSPECIAL = g_pCompositor->getWorkspaceByID(specialWorkspaceID); EXISTINGSPECIAL) { const auto EXISTINGSPECIAL = g_pCompositor->getWorkspaceByID(specialWorkspaceID);
if (EXISTINGSPECIAL) {
EXISTINGSPECIAL->startAnim(false, false); EXISTINGSPECIAL->startAnim(false, false);
g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", "," + szName}); g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", "," + szName});
} }
@ -590,6 +601,18 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
else else
g_pInputManager->refocus(); g_pInputManager->refocus();
// for xwayland: yeet all the windows to narnia to avoid some focus fuckery. I hate xwayland.
// I'll avoid setting XCB_ICCCM_WM_STATE_ICONIC (aka minimized) so that the apps don't do stupid shit.
if (EXISTINGSPECIAL) {
for (auto& w : g_pCompositor->m_vWindows) {
if (w->m_iWorkspaceID != EXISTINGSPECIAL->m_iID || !w->m_bMappedX11 || !w->m_bIsX11 || w->isHidden() || w->m_iMonitorID != ID)
continue;
g_pXWaylandManager->moveXWaylandWindow(w.get(), {30000, 30000});
}
}
return; return;
} }
@ -631,6 +654,8 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", pWorkspace->m_szName + "," + szName}); g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", pWorkspace->m_szName + "," + szName});
g_pHyprRenderer->damageMonitor(this); g_pHyprRenderer->damageMonitor(this);
g_pCompositor->forceReportSizesToWindowsOnWorkspace(specialWorkspaceID);
} }
void CMonitor::setSpecialWorkspace(const int& id) { void CMonitor::setSpecialWorkspace(const int& id) {

View file

@ -262,7 +262,9 @@ void CHyprXWaylandManager::moveXWaylandWindow(CWindow* pWindow, const Vector2D&
if (!pWindow->m_bIsX11) if (!pWindow->m_bIsX11)
return; return;
wlr_xwayland_surface_configure(pWindow->m_uSurface.xwayland, pos.x, pos.y, pWindow->m_vRealSize.vec().x, pWindow->m_vRealSize.vec().y); Vector2D size = pWindow->m_vRealSize.goalv() * pWindow->m_fX11SurfaceScaledBy;
wlr_xwayland_surface_configure(pWindow->m_uSurface.xwayland, pos.x, pos.y, size.x, size.y);
} }
void CHyprXWaylandManager::checkBorders(CWindow* pWindow) { void CHyprXWaylandManager::checkBorders(CWindow* pWindow) {