2022-03-30 21:18:42 +02:00
# include "Window.hpp"
# include "Compositor.hpp"
2022-06-25 20:28:40 +02:00
# include "render/decorations/CHyprDropShadowDecoration.hpp"
2022-03-30 21:18:42 +02:00
2022-04-23 14:16:02 +02:00
CWindow : : CWindow ( ) {
2022-05-05 14:02:30 +02:00
m_vRealPosition . create ( AVARTYPE_VECTOR , & g_pConfigManager - > getConfigValuePtr ( " animations:windows_speed " ) - > floatValue , & g_pConfigManager - > getConfigValuePtr ( " animations:windows " ) - > intValue , & g_pConfigManager - > getConfigValuePtr ( " animations:windows_curve " ) - > strValue , ( void * ) this , AVARDAMAGE_ENTIRE ) ;
m_vRealSize . create ( AVARTYPE_VECTOR , & g_pConfigManager - > getConfigValuePtr ( " animations:windows_speed " ) - > floatValue , & g_pConfigManager - > getConfigValuePtr ( " animations:windows " ) - > intValue , & g_pConfigManager - > getConfigValuePtr ( " animations:windows_curve " ) - > strValue , ( void * ) this , AVARDAMAGE_ENTIRE ) ;
m_cRealBorderColor . create ( AVARTYPE_COLOR , & g_pConfigManager - > getConfigValuePtr ( " animations:borders_speed " ) - > floatValue , & g_pConfigManager - > getConfigValuePtr ( " animations:borders " ) - > intValue , & g_pConfigManager - > getConfigValuePtr ( " animations:borders_curve " ) - > strValue , ( void * ) this , AVARDAMAGE_BORDER ) ;
m_fAlpha . create ( AVARTYPE_FLOAT , & g_pConfigManager - > getConfigValuePtr ( " animations:fadein_speed " ) - > floatValue , & g_pConfigManager - > getConfigValuePtr ( " animations:fadein " ) - > intValue , & g_pConfigManager - > getConfigValuePtr ( " animations:fadein_curve " ) - > strValue , ( void * ) this , AVARDAMAGE_ENTIRE ) ;
2022-06-25 20:28:40 +02:00
m_dWindowDecorations . emplace_back ( std : : make_unique < CHyprDropShadowDecoration > ( this ) ) ; // put the shadow so it's the first deco (has to be rendered first)
2022-04-23 14:16:02 +02:00
}
2022-03-30 21:18:42 +02:00
CWindow : : ~ CWindow ( ) {
2022-04-02 18:57:09 +02:00
if ( g_pCompositor - > isWindowActive ( this ) ) {
2022-03-30 21:18:42 +02:00
g_pCompositor - > m_pLastFocus = nullptr ;
2022-04-02 18:57:09 +02:00
g_pCompositor - > m_pLastWindow = nullptr ;
}
2022-05-30 14:55:42 +02:00
}
wlr_box CWindow : : getFullWindowBoundingBox ( ) {
2022-06-25 20:28:40 +02:00
static auto * const PBORDERSIZE = & g_pConfigManager - > getConfigValuePtr ( " general:border_size " ) - > intValue ;
2022-05-30 14:55:42 +02:00
2022-06-25 20:28:40 +02:00
SWindowDecorationExtents maxExtents = { { * PBORDERSIZE + 1 , * PBORDERSIZE + 1 } , { * PBORDERSIZE + 1 , * PBORDERSIZE + 1 } } ;
2022-05-30 14:55:42 +02:00
for ( auto & wd : m_dWindowDecorations ) {
const auto EXTENTS = wd - > getWindowDecorationExtents ( ) ;
if ( EXTENTS . topLeft . x > maxExtents . topLeft . x )
maxExtents . topLeft . x = EXTENTS . topLeft . x ;
if ( EXTENTS . topLeft . y > maxExtents . topLeft . y )
maxExtents . topLeft . y = EXTENTS . topLeft . y ;
if ( EXTENTS . bottomRight . x > maxExtents . bottomRight . x )
maxExtents . bottomRight . x = EXTENTS . bottomRight . x ;
if ( EXTENTS . bottomRight . y > maxExtents . bottomRight . y )
maxExtents . bottomRight . y = EXTENTS . bottomRight . y ;
}
// Add extents to the real base BB and return
wlr_box finalBox = { m_vRealPosition . vec ( ) . x - maxExtents . topLeft . x ,
m_vRealPosition . vec ( ) . y - maxExtents . topLeft . y ,
m_vRealSize . vec ( ) . x + maxExtents . topLeft . x + maxExtents . bottomRight . x ,
m_vRealSize . vec ( ) . y + maxExtents . topLeft . y + maxExtents . bottomRight . y } ;
return finalBox ;
2022-06-23 20:39:48 +02:00
}
wlr_box CWindow : : getWindowIdealBoundingBoxIgnoreReserved ( ) {
const auto PMONITOR = g_pCompositor - > getMonitorFromID ( m_iMonitorID ) ;
auto POS = m_vPosition ;
auto SIZE = m_vSize ;
if ( DELTALESSTHAN ( POS . y - PMONITOR - > vecPosition . y , PMONITOR - > vecReservedTopLeft . y , 1 ) ) {
POS . y = PMONITOR - > vecPosition . y ;
SIZE . y + = PMONITOR - > vecReservedTopLeft . y ;
}
if ( DELTALESSTHAN ( POS . x - PMONITOR - > vecPosition . x , PMONITOR - > vecReservedTopLeft . x , 1 ) ) {
POS . x = PMONITOR - > vecPosition . x ;
SIZE . x + = PMONITOR - > vecReservedTopLeft . x ;
}
if ( DELTALESSTHAN ( POS . x + SIZE . x - PMONITOR - > vecPosition . x , PMONITOR - > vecSize . x - PMONITOR - > vecReservedBottomRight . x , 1 ) ) {
SIZE . x + = PMONITOR - > vecReservedBottomRight . x ;
}
if ( DELTALESSTHAN ( POS . y + SIZE . y - PMONITOR - > vecPosition . y , PMONITOR - > vecSize . y - PMONITOR - > vecReservedBottomRight . y , 1 ) ) {
SIZE . y + = PMONITOR - > vecReservedBottomRight . y ;
}
return wlr_box { ( int ) POS . x , ( int ) POS . y , ( int ) SIZE . x , ( int ) SIZE . y } ;
2022-03-30 21:18:42 +02:00
}