mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 06:49:49 +01:00
Added workspace fade transition
This commit is contained in:
parent
25979fac1d
commit
f09de365d5
5 changed files with 37 additions and 13 deletions
|
@ -23,6 +23,8 @@ CWorkspace::CWorkspace(int monitorID) {
|
||||||
|
|
||||||
m_vRenderOffset.m_pWorkspace = this;
|
m_vRenderOffset.m_pWorkspace = this;
|
||||||
m_vRenderOffset.create(AVARTYPE_VECTOR, &g_pConfigManager->getConfigValuePtr("animations:workspaces_speed")->floatValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces")->intValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces_curve")->strValue, nullptr, AVARDAMAGE_ENTIRE);
|
m_vRenderOffset.create(AVARTYPE_VECTOR, &g_pConfigManager->getConfigValuePtr("animations:workspaces_speed")->floatValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces")->intValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces_curve")->strValue, nullptr, AVARDAMAGE_ENTIRE);
|
||||||
|
m_fAlpha.create(AVARTYPE_FLOAT, &g_pConfigManager->getConfigValuePtr("animations:workspaces_speed")->floatValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces")->intValue, &g_pConfigManager->getConfigValuePtr("animations:workspaces_curve")->strValue, nullptr, AVARDAMAGE_ENTIRE);
|
||||||
|
m_fAlpha.setValueAndWarp(255.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
CWorkspace::~CWorkspace() {
|
CWorkspace::~CWorkspace() {
|
||||||
|
@ -34,3 +36,27 @@ CWorkspace::~CWorkspace() {
|
||||||
m_pWlrHandle = nullptr;
|
m_pWlrHandle = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWorkspace::startAnim(bool in, bool left) {
|
||||||
|
const auto ANIMSTYLE = g_pConfigManager->getString("animations:workspaces_style");
|
||||||
|
|
||||||
|
if (ANIMSTYLE == "fade") {
|
||||||
|
if (in) {
|
||||||
|
m_fAlpha.setValueAndWarp(0.f);
|
||||||
|
m_fAlpha = 255.f;
|
||||||
|
} else {
|
||||||
|
m_fAlpha.setValueAndWarp(255.f);
|
||||||
|
m_fAlpha = 0.f;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// fallback is slide
|
||||||
|
const auto PMONITOR = g_pCompositor->getMonitorFromID(m_iMonitorID);
|
||||||
|
|
||||||
|
if (in) {
|
||||||
|
m_vRenderOffset.setValueAndWarp(Vector2D(left ? PMONITOR->vecSize.x : -PMONITOR->vecSize.x, 0));
|
||||||
|
m_vRenderOffset = Vector2D(0, 0);
|
||||||
|
} else {
|
||||||
|
m_vRenderOffset = Vector2D(left ? -PMONITOR->vecSize.x : PMONITOR->vecSize.x, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,4 +21,7 @@ public:
|
||||||
|
|
||||||
// for animations
|
// for animations
|
||||||
CAnimatedVariable m_vRenderOffset;
|
CAnimatedVariable m_vRenderOffset;
|
||||||
|
CAnimatedVariable m_fAlpha;
|
||||||
|
|
||||||
|
void startAnim(bool in, bool left);
|
||||||
};
|
};
|
|
@ -209,11 +209,10 @@ void CKeybindManager::changeworkspace(std::string args) {
|
||||||
const auto ANIMTOLEFT = workspaceToChangeTo > OLDWORKSPACEID;
|
const auto ANIMTOLEFT = workspaceToChangeTo > OLDWORKSPACEID;
|
||||||
|
|
||||||
// start anim on old workspace
|
// start anim on old workspace
|
||||||
g_pCompositor->getWorkspaceByID(OLDWORKSPACEID)->m_vRenderOffset = Vector2D(ANIMTOLEFT ? -PMONITOR->vecSize.x : PMONITOR->vecSize.x, 0);
|
g_pCompositor->getWorkspaceByID(OLDWORKSPACEID)->startAnim(false, ANIMTOLEFT);
|
||||||
|
|
||||||
// start anim on new workspace
|
// start anim on new workspace
|
||||||
g_pCompositor->getWorkspaceByID(workspaceToChangeTo)->m_vRenderOffset.setValueAndWarp(Vector2D(ANIMTOLEFT ? PMONITOR->vecSize.x : -PMONITOR->vecSize.x, 0));
|
g_pCompositor->getWorkspaceByID(workspaceToChangeTo)->startAnim(true, ANIMTOLEFT);
|
||||||
g_pCompositor->getWorkspaceByID(workspaceToChangeTo)->m_vRenderOffset = Vector2D(0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -250,14 +249,13 @@ void CKeybindManager::changeworkspace(std::string args) {
|
||||||
const auto ANIMTOLEFT = workspaceToChangeTo > OLDWORKSPACE;
|
const auto ANIMTOLEFT = workspaceToChangeTo > OLDWORKSPACE;
|
||||||
|
|
||||||
// start anim on old workspace
|
// start anim on old workspace
|
||||||
g_pCompositor->getWorkspaceByID(OLDWORKSPACE)->m_vRenderOffset = Vector2D(ANIMTOLEFT ? -PMONITOR->vecSize.x : PMONITOR->vecSize.x, 0);
|
g_pCompositor->getWorkspaceByID(OLDWORKSPACE)->startAnim(false, ANIMTOLEFT);
|
||||||
|
|
||||||
g_pCompositor->m_lWorkspaces.emplace_back(PMONITOR->ID);
|
g_pCompositor->m_lWorkspaces.emplace_back(PMONITOR->ID);
|
||||||
const auto PWORKSPACE = &g_pCompositor->m_lWorkspaces.back();
|
const auto PWORKSPACE = &g_pCompositor->m_lWorkspaces.back();
|
||||||
|
|
||||||
// start anim on new workspace
|
// start anim on new workspace
|
||||||
PWORKSPACE->m_vRenderOffset.setValueAndWarp(Vector2D(ANIMTOLEFT ? PMONITOR->vecSize.x : -PMONITOR->vecSize.x, 0));
|
PWORKSPACE->startAnim(true, ANIMTOLEFT);
|
||||||
PWORKSPACE->m_vRenderOffset = Vector2D(0, 0);
|
|
||||||
|
|
||||||
// We are required to set the name here immediately
|
// We are required to set the name here immediately
|
||||||
wlr_ext_workspace_handle_v1_set_name(PWORKSPACE->m_pWlrHandle, workspaceName.c_str());
|
wlr_ext_workspace_handle_v1_set_name(PWORKSPACE->m_pWlrHandle, workspaceName.c_str());
|
||||||
|
|
|
@ -565,9 +565,6 @@ void CHyprOpenGLImpl::renderBorder(wlr_box* box, const CColor& col, int thick, i
|
||||||
|
|
||||||
wlr_matrix_transpose(glMatrix, glMatrix);
|
wlr_matrix_transpose(glMatrix, glMatrix);
|
||||||
|
|
||||||
if (col.a == 255.f)
|
|
||||||
glDisable(GL_BLEND);
|
|
||||||
else
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
glUseProgram(m_shQUAD.program);
|
glUseProgram(m_shQUAD.program);
|
||||||
|
|
|
@ -41,7 +41,7 @@ bool shouldRenderWindow(CWindow* pWindow, SMonitor* pMonitor) {
|
||||||
|
|
||||||
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID);
|
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(pWindow->m_iWorkspaceID);
|
||||||
// if not, check if it maybe is active on a different monitor. vvv might be animation in progress
|
// if not, check if it maybe is active on a different monitor. vvv might be animation in progress
|
||||||
if (g_pCompositor->isWorkspaceVisible(pWindow->m_iWorkspaceID) || (PWORKSPACE && PWORKSPACE->m_iMonitorID == pMonitor->ID && PWORKSPACE->m_vRenderOffset.isBeingAnimated()))
|
if (g_pCompositor->isWorkspaceVisible(pWindow->m_iWorkspaceID) || (PWORKSPACE && PWORKSPACE->m_iMonitorID == pMonitor->ID && (PWORKSPACE->m_vRenderOffset.isBeingAnimated() || PWORKSPACE->m_fAlpha.isBeingAnimated())))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -96,7 +96,7 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec*
|
||||||
renderdata.w = pWindow->m_vRealSize.vec().x;
|
renderdata.w = pWindow->m_vRealSize.vec().x;
|
||||||
renderdata.h = pWindow->m_vRealSize.vec().y;
|
renderdata.h = pWindow->m_vRealSize.vec().y;
|
||||||
renderdata.dontRound = pWindow->m_bIsFullscreen;
|
renderdata.dontRound = pWindow->m_bIsFullscreen;
|
||||||
renderdata.fadeAlpha = pWindow->m_fAlpha.fl();
|
renderdata.fadeAlpha = pWindow->m_fAlpha.fl() * (PWORKSPACE->m_fAlpha.fl() / 255.f);
|
||||||
renderdata.alpha = pWindow == g_pCompositor->m_pLastWindow ? g_pConfigManager->getFloat("decoration:active_opacity") : g_pConfigManager->getFloat("decoration:inactive_opacity");
|
renderdata.alpha = pWindow == g_pCompositor->m_pLastWindow ? g_pConfigManager->getFloat("decoration:active_opacity") : g_pConfigManager->getFloat("decoration:inactive_opacity");
|
||||||
|
|
||||||
// apply window special data
|
// apply window special data
|
||||||
|
@ -106,7 +106,7 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec*
|
||||||
|
|
||||||
// border
|
// border
|
||||||
if (decorate && !pWindow->m_bX11DoesntWantBorders)
|
if (decorate && !pWindow->m_bX11DoesntWantBorders)
|
||||||
drawBorderForWindow(pWindow, pMonitor, pWindow->m_fAlpha.fl() * renderdata.alpha, PWORKSPACE->m_vRenderOffset.vec());
|
drawBorderForWindow(pWindow, pMonitor, renderdata.alpha * renderdata.fadeAlpha, PWORKSPACE->m_vRenderOffset.vec());
|
||||||
|
|
||||||
if (pWindow->m_bIsX11) {
|
if (pWindow->m_bIsX11) {
|
||||||
if (pWindow->m_uSurface.xwayland->surface) {
|
if (pWindow->m_uSurface.xwayland->surface) {
|
||||||
|
|
Loading…
Reference in a new issue