2022-03-21 15:17:04 +01:00
# include "../Compositor.hpp"
# include "../helpers/WLClasses.hpp"
# include "../managers/InputManager.hpp"
# include "../render/Renderer.hpp"
# include "Events.hpp"
// --------------------------------------------- //
// _ __ ________ _____ _____ //
// | | /\\ \ / / ____| __ \ / ____| //
// | | / \\ \_/ /| |__ | |__) | (___ //
// | | / /\ \\ / | __| | _ / \___ \ //
// | |____ / ____ \| | | |____| | \ \ ____) | //
// |______/_/ \_\_| |______|_| \_\_____/ //
// //
// --------------------------------------------- //
void Events : : listener_newLayerSurface ( wl_listener * listener , void * data ) {
const auto WLRLAYERSURFACE = ( wlr_layer_surface_v1 * ) data ;
if ( ! WLRLAYERSURFACE - > output ) {
const auto PMONITOR = g_pCompositor - > getMonitorFromCursor ( ) ;
if ( ! PMONITOR ) {
Debug : : log ( ERR , " No monitor at cursor on new layer without a monitor. Ignoring. " ) ;
wlr_layer_surface_v1_destroy ( WLRLAYERSURFACE ) ;
return ;
}
Debug : : log ( LOG , " New LayerSurface has no preferred monitor. Assigning Monitor %s " , PMONITOR - > szName ) ;
WLRLAYERSURFACE - > output = PMONITOR - > output ;
}
const auto PMONITOR = ( SMonitor * ) g_pCompositor - > getMonitorFromOutput ( WLRLAYERSURFACE - > output ) ;
PMONITOR - > m_aLayerSurfaceLists [ WLRLAYERSURFACE - > pending . layer ] . push_back ( new SLayerSurface ( ) ) ;
SLayerSurface * layerSurface = PMONITOR - > m_aLayerSurfaceLists [ WLRLAYERSURFACE - > pending . layer ] . back ( ) ;
if ( ! WLRLAYERSURFACE - > output ) {
WLRLAYERSURFACE - > output = g_pCompositor - > m_lMonitors . front ( ) . output ; // TODO: current mon
}
2022-03-28 22:31:39 +02:00
layerSurface - > hyprListener_commitLayerSurface . initCallback ( & WLRLAYERSURFACE - > surface - > events . commit , & Events : : listener_commitLayerSurface , layerSurface , " layerSurface " ) ;
layerSurface - > hyprListener_destroyLayerSurface . initCallback ( & WLRLAYERSURFACE - > surface - > events . destroy , & Events : : listener_destroyLayerSurface , layerSurface , " layerSurface " ) ;
layerSurface - > hyprListener_mapLayerSurface . initCallback ( & WLRLAYERSURFACE - > events . map , & Events : : listener_mapLayerSurface , layerSurface , " layerSurface " ) ;
layerSurface - > hyprListener_unmapLayerSurface . initCallback ( & WLRLAYERSURFACE - > events . unmap , & Events : : listener_unmapLayerSurface , layerSurface , " layerSurface " ) ;
layerSurface - > hyprListener_newPopup . initCallback ( & WLRLAYERSURFACE - > events . new_popup , & Events : : listener_newPopup , layerSurface , " layerSurface " ) ;
2022-03-21 15:17:04 +01:00
layerSurface - > layerSurface = WLRLAYERSURFACE ;
2022-03-21 22:34:25 +01:00
layerSurface - > layer = WLRLAYERSURFACE - > current . layer ;
2022-03-21 15:17:04 +01:00
WLRLAYERSURFACE - > data = layerSurface ;
layerSurface - > monitorID = PMONITOR - > ID ;
2022-03-22 21:59:14 +01:00
Debug : : log ( LOG , " LayerSurface %x (namespace %s layer %d) created on monitor %s " , layerSurface - > layerSurface , layerSurface - > layerSurface - > _namespace , layerSurface - > layer , PMONITOR - > szName . c_str ( ) ) ;
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events : : listener_destroyLayerSurface ( void * owner , void * data ) {
SLayerSurface * layersurface = ( SLayerSurface * ) owner ;
2022-03-21 15:17:04 +01:00
2022-03-24 21:34:24 +01:00
Debug : : log ( LOG , " LayerSurface %x destroyed " , layersurface - > layerSurface ) ;
2022-03-21 15:17:04 +01:00
if ( layersurface - > layerSurface - > mapped )
2022-03-21 16:33:38 +01:00
layersurface - > layerSurface - > mapped = false ;
2022-03-21 15:17:04 +01:00
if ( layersurface - > layerSurface - > surface = = g_pCompositor - > m_pLastFocus )
g_pCompositor - > m_pLastFocus = nullptr ;
2022-03-28 22:31:39 +02:00
layersurface - > hyprListener_commitLayerSurface . removeCallback ( ) ;
layersurface - > hyprListener_destroyLayerSurface . removeCallback ( ) ;
layersurface - > hyprListener_mapLayerSurface . removeCallback ( ) ;
layersurface - > hyprListener_unmapLayerSurface . removeCallback ( ) ;
layersurface - > hyprListener_newPopup . removeCallback ( ) ;
2022-03-21 15:17:04 +01:00
const auto PMONITOR = g_pCompositor - > getMonitorFromID ( layersurface - > monitorID ) ;
// remove the layersurface as it's not used anymore
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layer ] . remove ( layersurface ) ;
delete layersurface ;
2022-03-21 16:33:38 +01:00
// rearrange to fix the reserved areas
if ( PMONITOR ) {
g_pHyprRenderer - > arrangeLayersForMonitor ( PMONITOR - > ID ) ;
g_pLayoutManager - > getCurrentLayout ( ) - > recalculateMonitor ( PMONITOR - > ID ) ;
2022-04-24 12:04:16 +02:00
// and damage
wlr_box geomFixed = { layersurface - > geometry . x + PMONITOR - > vecPosition . x , layersurface - > geometry . y + PMONITOR - > vecPosition . y , layersurface - > geometry . width , layersurface - > geometry . height } ;
g_pHyprRenderer - > damageBox ( & geomFixed ) ;
2022-03-21 16:33:38 +01:00
}
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events : : listener_mapLayerSurface ( void * owner , void * data ) {
SLayerSurface * layersurface = ( SLayerSurface * ) owner ;
2022-03-21 15:17:04 +01:00
2022-03-24 21:34:24 +01:00
Debug : : log ( LOG , " LayerSurface %x mapped " , layersurface - > layerSurface ) ;
2022-03-21 16:33:38 +01:00
layersurface - > layerSurface - > mapped = true ;
2022-03-21 15:17:04 +01:00
wlr_surface_send_enter ( layersurface - > layerSurface - > surface , layersurface - > layerSurface - > output ) ;
// fix if it changed its mon
const auto PMONITOR = g_pCompositor - > getMonitorFromOutput ( layersurface - > layerSurface - > output ) ;
2022-04-24 12:04:16 +02:00
if ( ! PMONITOR )
return ;
2022-03-21 15:17:04 +01:00
if ( ( uint64_t ) layersurface - > monitorID ! = PMONITOR - > ID ) {
const auto POLDMON = g_pCompositor - > getMonitorFromID ( layersurface - > monitorID ) ;
POLDMON - > m_aLayerSurfaceLists [ layersurface - > layer ] . remove ( layersurface ) ;
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layer ] . push_back ( layersurface ) ;
layersurface - > monitorID = PMONITOR - > ID ;
g_pLayoutManager - > getCurrentLayout ( ) - > recalculateMonitor ( POLDMON - > ID ) ;
g_pHyprRenderer - > arrangeLayersForMonitor ( POLDMON - > ID ) ;
}
g_pHyprRenderer - > arrangeLayersForMonitor ( PMONITOR - > ID ) ;
2022-03-22 21:59:14 +01:00
if ( layersurface - > layerSurface - > current . keyboard_interactive )
2022-03-21 15:17:04 +01:00
g_pCompositor - > focusSurface ( layersurface - > layerSurface - > surface ) ;
2022-03-27 17:25:20 +02:00
layersurface - > position = Vector2D ( layersurface - > geometry . x , layersurface - > geometry . y ) ;
2022-04-24 12:04:16 +02:00
wlr_box geomFixed = { layersurface - > geometry . x + PMONITOR - > vecPosition . x , layersurface - > geometry . y + PMONITOR - > vecPosition . y , layersurface - > geometry . width , layersurface - > geometry . height } ;
g_pHyprRenderer - > damageBox ( & geomFixed ) ;
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events : : listener_unmapLayerSurface ( void * owner , void * data ) {
SLayerSurface * layersurface = ( SLayerSurface * ) owner ;
2022-03-21 15:17:04 +01:00
2022-03-24 21:34:24 +01:00
Debug : : log ( LOG , " LayerSurface %x unmapped " , layersurface - > layerSurface ) ;
2022-03-21 15:17:04 +01:00
if ( layersurface - > layerSurface - > mapped )
2022-03-21 16:33:38 +01:00
layersurface - > layerSurface - > mapped = false ;
2022-03-21 15:17:04 +01:00
if ( layersurface - > layerSurface - > surface = = g_pCompositor - > m_pLastFocus )
g_pCompositor - > m_pLastFocus = nullptr ;
2022-04-24 12:04:16 +02:00
const auto PMONITOR = g_pCompositor - > getMonitorFromOutput ( layersurface - > layerSurface - > output ) ;
if ( ! PMONITOR )
return ;
wlr_box geomFixed = { layersurface - > geometry . x + PMONITOR - > vecPosition . x , layersurface - > geometry . y + PMONITOR - > vecPosition . y , layersurface - > geometry . width , layersurface - > geometry . height } ;
g_pHyprRenderer - > damageBox ( & geomFixed ) ;
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events : : listener_commitLayerSurface ( void * owner , void * data ) {
SLayerSurface * layersurface = ( SLayerSurface * ) owner ;
2022-03-21 15:17:04 +01:00
if ( ! layersurface - > layerSurface | | ! layersurface - > layerSurface - > output )
return ;
const auto PMONITOR = g_pCompositor - > getMonitorFromOutput ( layersurface - > layerSurface - > output ) ;
if ( ! PMONITOR )
return ;
2022-04-24 12:04:16 +02:00
wlr_box geomFixed = { layersurface - > geometry . x + PMONITOR - > vecPosition . x , layersurface - > geometry . y + PMONITOR - > vecPosition . y , layersurface - > geometry . width , layersurface - > geometry . height } ;
g_pHyprRenderer - > damageBox ( & geomFixed ) ;
2022-03-21 15:17:04 +01:00
// fix if it changed its mon
if ( ( uint64_t ) layersurface - > monitorID ! = PMONITOR - > ID ) {
const auto POLDMON = g_pCompositor - > getMonitorFromID ( layersurface - > monitorID ) ;
POLDMON - > m_aLayerSurfaceLists [ layersurface - > layer ] . remove ( layersurface ) ;
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layer ] . push_back ( layersurface ) ;
layersurface - > monitorID = PMONITOR - > ID ;
g_pLayoutManager - > getCurrentLayout ( ) - > recalculateMonitor ( POLDMON - > ID ) ;
g_pHyprRenderer - > arrangeLayersForMonitor ( POLDMON - > ID ) ;
}
2022-04-17 10:46:04 +02:00
if ( layersurface - > layerSurface - > current . committed ! = 0 ) {
g_pHyprRenderer - > arrangeLayersForMonitor ( PMONITOR - > ID ) ;
2022-03-21 15:17:04 +01:00
2022-04-17 10:46:04 +02:00
if ( layersurface - > layer ! = layersurface - > layerSurface - > current . layer ) {
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layer ] . remove ( layersurface ) ;
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layerSurface - > current . layer ] . push_back ( layersurface ) ;
layersurface - > layer = layersurface - > layerSurface - > current . layer ;
}
2022-03-21 15:17:04 +01:00
2022-04-17 10:46:04 +02:00
g_pLayoutManager - > getCurrentLayout ( ) - > recalculateMonitor ( PMONITOR - > ID ) ;
}
2022-03-21 15:17:04 +01:00
2022-03-27 17:25:20 +02:00
layersurface - > position = Vector2D ( layersurface - > geometry . x , layersurface - > geometry . y ) ;
2022-04-14 20:22:14 +02:00
2022-05-05 13:48:22 +02:00
// TODO: optimize this. This does NOT need to be here but it prevents some issues with full DT.
g_pHyprRenderer - > damageMonitor ( PMONITOR ) ;
2022-03-21 15:17:04 +01:00
}