2022-03-16 21:37:21 +01:00
# include "Events.hpp"
2022-03-17 18:25:16 +01:00
2022-03-17 16:56:33 +01:00
# include "../Compositor.hpp"
2022-03-17 18:25:16 +01:00
# include "../helpers/WLClasses.hpp"
2022-03-18 20:03:39 +01:00
# include "../managers/InputManager.hpp"
2022-03-17 20:22:29 +01:00
# include "../render/Renderer.hpp"
2022-03-16 21:37:21 +01:00
2022-03-20 10:37:31 +01:00
// --------------------------------------------------------- //
// __ __ ____ _ _ _____ _______ ____ _____ _____ //
// | \/ |/ __ \| \ | |_ _|__ __/ __ \| __ \ / ____| //
// | \ / | | | | \| | | | | | | | | | |__) | (___ //
// | |\/| | | | | . ` | | | | | | | | | _ / \___ \ //
// | | | | |__| | |\ |_| |_ | | | |__| | | \ \ ____) | //
// |_| |_|\____/|_| \_|_____| |_| \____/|_| \_\_____/ //
// //
// --------------------------------------------------------- //
2022-03-17 15:53:45 +01:00
void Events : : listener_change ( wl_listener * listener , void * data ) {
2022-03-17 16:56:33 +01:00
// layout got changed, let's update monitors.
const auto CONFIG = wlr_output_configuration_v1_create ( ) ;
2022-03-18 22:35:51 +01:00
for ( auto & m : g_pCompositor - > m_lMonitors ) {
2022-03-17 18:25:16 +01:00
const auto CONFIGHEAD = wlr_output_configuration_head_v1_create ( CONFIG , m . output ) ;
// TODO: clients off of disabled
2022-03-17 19:03:15 +01:00
wlr_box BOX ;
wlr_output_layout_get_box ( g_pCompositor - > m_sWLROutputLayout , m . output , & BOX ) ;
2022-03-17 18:25:16 +01:00
2022-03-17 19:03:15 +01:00
m . vecSize . x = BOX . width ;
m . vecSize . y = BOX . height ;
m . vecPosition . x = BOX . x ;
m . vecPosition . y = BOX . y ;
2022-03-17 18:25:16 +01:00
CONFIGHEAD - > state . enabled = m . output - > enabled ;
CONFIGHEAD - > state . mode = m . output - > current_mode ;
CONFIGHEAD - > state . x = m . vecPosition . x ;
CONFIGHEAD - > state . y = m . vecPosition . y ;
2022-03-19 21:46:29 +01:00
wlr_output_set_custom_mode ( m . output , m . vecSize . x , m . vecSize . y , ( int ) ( round ( m . refreshRate * 1000 ) ) ) ;
2022-03-17 18:25:16 +01:00
}
wlr_output_manager_v1_set_configuration ( g_pCompositor - > m_sWLROutputMgr , CONFIG ) ;
2022-03-20 10:37:31 +01:00
}
2022-03-17 16:56:33 +01:00
void Events : : listener_newOutput ( wl_listener * listener , void * data ) {
// new monitor added, let's accomodate for that.
const auto OUTPUT = ( wlr_output * ) data ;
SMonitor newMonitor ;
2022-03-17 18:25:16 +01:00
newMonitor . output = OUTPUT ;
2022-03-18 22:35:51 +01:00
newMonitor . ID = g_pCompositor - > m_lMonitors . size ( ) ;
2022-03-17 18:25:16 +01:00
newMonitor . szName = OUTPUT - > name ;
2022-03-17 16:56:33 +01:00
wlr_output_init_render ( OUTPUT , g_pCompositor - > m_sWLRAllocator , g_pCompositor - > m_sWLRRenderer ) ;
// get monitor rule that matches
SMonitorRule monitorRule = g_pConfigManager - > getMonitorRuleFor ( OUTPUT - > name ) ;
wlr_output_set_scale ( OUTPUT , monitorRule . scale ) ;
wlr_xcursor_manager_load ( g_pCompositor - > m_sWLRXCursorMgr , monitorRule . scale ) ;
wlr_output_set_transform ( OUTPUT , WL_OUTPUT_TRANSFORM_NORMAL ) ; // TODO: support other transforms
wlr_output_set_mode ( OUTPUT , wlr_output_preferred_mode ( OUTPUT ) ) ;
wlr_output_enable_adaptive_sync ( OUTPUT , 1 ) ;
2022-03-17 18:25:16 +01:00
// create it in the arr
newMonitor . vecPosition = monitorRule . offset ;
newMonitor . vecSize = monitorRule . resolution ;
2022-03-19 21:46:29 +01:00
newMonitor . refreshRate = monitorRule . refreshRate ;
2022-03-18 22:35:51 +01:00
g_pCompositor - > m_lMonitors . push_back ( newMonitor ) ;
2022-03-17 18:25:16 +01:00
//
2022-03-18 22:35:51 +01:00
wl_signal_add ( & OUTPUT - > events . frame , & g_pCompositor - > m_lMonitors . back ( ) . listen_monitorFrame ) ;
wl_signal_add ( & OUTPUT - > events . destroy , & g_pCompositor - > m_lMonitors . back ( ) . listen_monitorDestroy ) ;
2022-03-17 16:56:33 +01:00
wlr_output_enable ( OUTPUT , 1 ) ;
if ( ! wlr_output_commit ( OUTPUT ) ) {
Debug : : log ( ERR , " Couldn't commit output named %s " , OUTPUT - > name ) ;
return ;
}
wlr_output_layout_add ( g_pCompositor - > m_sWLROutputLayout , OUTPUT , monitorRule . offset . x , monitorRule . offset . y ) ;
2022-03-19 21:46:29 +01:00
wlr_output_set_custom_mode ( OUTPUT , OUTPUT - > width , OUTPUT - > height , ( int ) ( round ( monitorRule . refreshRate * 1000 ) ) ) ;
Debug : : log ( LOG , " Added new monitor with name %s at %i,%i with size %ix%i@%i, pointer %x " , OUTPUT - > name , ( int ) monitorRule . offset . x , ( int ) monitorRule . offset . y , ( int ) monitorRule . resolution . x , ( int ) monitorRule . resolution . y , ( int ) monitorRule . refreshRate , OUTPUT ) ;
2022-03-17 16:56:33 +01:00
}
void Events : : listener_monitorFrame ( wl_listener * listener , void * data ) {
2022-03-17 18:25:16 +01:00
SMonitor * const PMONITOR = wl_container_of ( listener , PMONITOR , listen_monitorFrame ) ;
2022-03-17 19:03:15 +01:00
timespec now ;
clock_gettime ( CLOCK_MONOTONIC , & now ) ;
2022-03-17 18:25:16 +01:00
const float bgcol [ 4 ] = { 0.1f , 0.1f , 0.1f , 1.f } ;
2022-03-17 16:56:33 +01:00
2022-03-17 19:03:15 +01:00
if ( ! wlr_output_attach_render ( PMONITOR - > output , nullptr ) )
return ;
2022-03-17 18:25:16 +01:00
2022-03-17 19:03:15 +01:00
wlr_renderer_begin ( g_pCompositor - > m_sWLRRenderer , PMONITOR - > vecSize . x , PMONITOR - > vecSize . y ) ;
wlr_renderer_clear ( g_pCompositor - > m_sWLRRenderer , bgcol ) ;
2022-03-17 18:25:16 +01:00
2022-03-17 20:22:29 +01:00
g_pHyprRenderer - > renderAllClientsForMonitor ( PMONITOR - > ID , & now ) ;
2022-03-17 18:25:16 +01:00
2022-03-17 19:03:15 +01:00
wlr_output_render_software_cursors ( PMONITOR - > output , NULL ) ;
2022-03-17 18:25:16 +01:00
2022-03-17 19:03:15 +01:00
wlr_renderer_end ( g_pCompositor - > m_sWLRRenderer ) ;
wlr_output_commit ( PMONITOR - > output ) ;
2022-03-17 16:56:33 +01:00
}
void Events : : listener_monitorDestroy ( wl_listener * listener , void * data ) {
2022-03-17 18:25:16 +01:00
const auto OUTPUT = ( wlr_output * ) data ;
2022-03-18 22:35:51 +01:00
SMonitor * pMonitor = nullptr ;
2022-03-17 15:53:45 +01:00
2022-03-18 22:35:51 +01:00
for ( auto & m : g_pCompositor - > m_lMonitors ) {
if ( m . szName = = OUTPUT - > name ) {
pMonitor = & m ;
break ;
}
2022-03-17 18:25:16 +01:00
}
2022-03-18 22:35:51 +01:00
if ( ! pMonitor )
return ;
g_pCompositor - > m_lMonitors . remove ( * pMonitor ) ;
2022-03-17 18:25:16 +01:00
// TODO: cleanup windows
2022-03-17 15:53:45 +01:00
}
2022-03-20 10:37:31 +01:00
// --------------------------------------------- //
// _ __ ________ _____ _____ //
// | | /\\ \ / / ____| __ \ / ____| //
// | | / \\ \_/ /| |__ | |__) | (___ //
// | | / /\ \\ / | __| | _ / \___ \ //
// | |____ / ____ \| | | |____| | \ \ ____) | //
// |______/_/ \_\_| |______|_| \_\_____/ //
// //
// --------------------------------------------- //
2022-03-17 18:25:16 +01:00
void Events : : listener_newLayerSurface ( wl_listener * listener , void * data ) {
const auto WLRLAYERSURFACE = ( wlr_layer_surface_v1 * ) data ;
2022-03-20 10:43:39 +01:00
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 ;
2022-03-19 20:56:19 +01:00
}
2022-03-20 10:43:39 +01:00
const auto PMONITOR = ( SMonitor * ) g_pCompositor - > getMonitorFromOutput ( WLRLAYERSURFACE - > output ) ;
2022-03-19 14:00:24 +01:00
PMONITOR - > m_aLayerSurfaceLists [ WLRLAYERSURFACE - > pending . layer ] . push_back ( new SLayerSurface ( ) ) ;
SLayerSurface * layerSurface = PMONITOR - > m_aLayerSurfaceLists [ WLRLAYERSURFACE - > pending . layer ] . back ( ) ;
2022-03-17 18:25:16 +01:00
if ( ! WLRLAYERSURFACE - > output ) {
2022-03-18 22:35:51 +01:00
WLRLAYERSURFACE - > output = g_pCompositor - > m_lMonitors . front ( ) . output ; // TODO: current mon
2022-03-17 18:25:16 +01:00
}
wl_signal_add ( & WLRLAYERSURFACE - > surface - > events . commit , & layerSurface - > listen_commitLayerSurface ) ;
wl_signal_add ( & WLRLAYERSURFACE - > surface - > events . destroy , & layerSurface - > listen_destroyLayerSurface ) ;
wl_signal_add ( & WLRLAYERSURFACE - > events . map , & layerSurface - > listen_mapLayerSurface ) ;
wl_signal_add ( & WLRLAYERSURFACE - > events . unmap , & layerSurface - > listen_unmapLayerSurface ) ;
2022-03-20 12:11:57 +01:00
wl_signal_add ( & WLRLAYERSURFACE - > events . new_popup , & layerSurface - > listen_newPopup ) ;
2022-03-17 18:25:16 +01:00
layerSurface - > layerSurface = WLRLAYERSURFACE ;
WLRLAYERSURFACE - > data = layerSurface ;
2022-03-18 22:35:51 +01:00
layerSurface - > monitorID = PMONITOR - > ID ;
2022-03-17 18:25:16 +01:00
// todo: arrange
2022-03-20 10:43:39 +01:00
Debug : : log ( LOG , " LayerSurface %x (namespace %s layer %d) created on monitor %s " , layerSurface , layerSurface - > layerSurface - > _namespace , layerSurface - > layer , PMONITOR - > szName . c_str ( ) ) ;
2022-03-20 10:37:31 +01:00
}
2022-03-17 18:25:16 +01:00
void Events : : listener_destroyLayerSurface ( wl_listener * listener , void * data ) {
2022-03-18 22:35:51 +01:00
SLayerSurface * layersurface = wl_container_of ( listener , layersurface , listen_destroyLayerSurface ) ;
if ( layersurface - > layerSurface - > mapped )
layersurface - > layerSurface - > mapped = 0 ;
2022-03-19 13:54:24 +01:00
2022-03-18 22:35:51 +01:00
wl_list_remove ( & layersurface - > listen_destroyLayerSurface . link ) ;
wl_list_remove ( & layersurface - > listen_mapLayerSurface . link ) ;
wl_list_remove ( & layersurface - > listen_unmapLayerSurface . link ) ;
wl_list_remove ( & layersurface - > listen_commitLayerSurface . link ) ;
const auto PMONITOR = g_pCompositor - > getMonitorFromID ( layersurface - > monitorID ) ;
// remove the layersurface as it's not used anymore
2022-03-19 21:46:29 +01:00
PMONITOR - > m_aLayerSurfaceLists [ layersurface - > layer ] . remove ( layersurface ) ;
2022-03-19 14:00:24 +01:00
delete layersurface ;
2022-03-19 13:54:24 +01:00
2022-03-18 22:35:51 +01:00
Debug : : log ( LOG , " LayerSurface %x destroyed " , layersurface ) ;
2022-03-17 18:25:16 +01:00
}
void Events : : listener_mapLayerSurface ( wl_listener * listener , void * data ) {
2022-03-18 22:35:51 +01:00
SLayerSurface * layersurface = wl_container_of ( listener , layersurface , listen_mapLayerSurface ) ;
wlr_surface_send_enter ( layersurface - > layerSurface - > surface , layersurface - > layerSurface - > output ) ;
2022-03-17 18:25:16 +01:00
2022-03-18 22:35:51 +01:00
Debug : : log ( LOG , " LayerSurface %x mapped " , layersurface ) ;
2022-03-17 18:25:16 +01:00
}
void Events : : listener_unmapLayerSurface ( wl_listener * listener , void * data ) {
2022-03-18 22:35:51 +01:00
SLayerSurface * layersurface = wl_container_of ( listener , layersurface , listen_unmapLayerSurface ) ;
2022-03-17 15:53:45 +01:00
2022-03-18 22:35:51 +01:00
if ( layersurface - > layerSurface - > mapped )
layersurface - > layerSurface - > mapped = 0 ;
Debug : : log ( LOG , " LayerSurface %x unmapped " , layersurface ) ;
2022-03-17 15:53:45 +01:00
}
2022-03-17 18:25:16 +01:00
void Events : : listener_commitLayerSurface ( wl_listener * listener , void * data ) {
2022-03-18 22:35:51 +01:00
SLayerSurface * layersurface = wl_container_of ( listener , layersurface , listen_commitLayerSurface ) ;
2022-03-19 22:03:40 +01:00
if ( ! layersurface - > layerSurface | | ! layersurface - > layerSurface - > output )
2022-03-18 22:35:51 +01:00
return ;
2022-03-19 20:56:19 +01:00
const auto PMONITOR = g_pCompositor - > getMonitorFromOutput ( layersurface - > layerSurface - > output ) ;
2022-03-19 21:46:29 +01:00
if ( ! PMONITOR )
return ;
2022-03-19 20:56:19 +01:00
// fix if it changed its mon
2022-03-20 12:11:57 +01:00
if ( ( uint64_t ) layersurface - > monitorID ! = PMONITOR - > ID ) {
2022-03-19 20:56:19 +01:00
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 ) ;
}
2022-03-19 14:37:40 +01:00
g_pHyprRenderer - > arrangeLayersForMonitor ( PMONITOR - > ID ) ;
2022-03-19 14:00:24 +01: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-19 20:56:19 +01:00
g_pLayoutManager - > getCurrentLayout ( ) - > recalculateMonitor ( PMONITOR - > ID ) ;
2022-03-17 18:25:16 +01:00
}
2022-03-20 10:37:31 +01:00
void Events : : listener_surfaceXWayland ( wl_listener * listener , void * data ) {
const auto XWSURFACE = ( wlr_xwayland_surface * ) data ;
g_pCompositor - > m_lWindows . push_back ( CWindow ( ) ) ;
const auto PNEWWINDOW = & g_pCompositor - > m_lWindows . back ( ) ;
PNEWWINDOW - > m_uSurface . xwayland = XWSURFACE ;
PNEWWINDOW - > m_iX11Type = XWSURFACE - > override_redirect ? 2 : 1 ;
PNEWWINDOW - > m_bIsX11 = true ;
wl_signal_add ( & XWSURFACE - > events . map , & PNEWWINDOW - > listen_mapWindow ) ;
wl_signal_add ( & XWSURFACE - > events . unmap , & PNEWWINDOW - > listen_unmapWindow ) ;
wl_signal_add ( & XWSURFACE - > events . request_activate , & PNEWWINDOW - > listen_activateX11 ) ;
wl_signal_add ( & XWSURFACE - > events . request_configure , & PNEWWINDOW - > listen_configureX11 ) ;
wl_signal_add ( & XWSURFACE - > events . set_title , & PNEWWINDOW - > listen_setTitleWindow ) ;
wl_signal_add ( & XWSURFACE - > events . destroy , & PNEWWINDOW - > listen_destroyWindow ) ;
wl_signal_add ( & XWSURFACE - > events . request_fullscreen , & PNEWWINDOW - > listen_fullscreenWindow ) ;
Debug : : log ( LOG , " New XWayland Surface created. " ) ;
}
void Events : : listener_newXDGSurface ( wl_listener * listener , void * data ) {
// A window got opened
const auto XDGSURFACE = ( wlr_xdg_surface * ) data ;
if ( XDGSURFACE - > role ! = WLR_XDG_SURFACE_ROLE_TOPLEVEL )
return ; // TODO: handle?
g_pCompositor - > m_lWindows . push_back ( CWindow ( ) ) ;
const auto PNEWWINDOW = & g_pCompositor - > m_lWindows . back ( ) ;
PNEWWINDOW - > m_uSurface . xdg = XDGSURFACE ;
wl_signal_add ( & XDGSURFACE - > surface - > events . commit , & PNEWWINDOW - > listen_commitWindow ) ;
wl_signal_add ( & XDGSURFACE - > events . map , & PNEWWINDOW - > listen_mapWindow ) ;
wl_signal_add ( & XDGSURFACE - > events . unmap , & PNEWWINDOW - > listen_unmapWindow ) ;
wl_signal_add ( & XDGSURFACE - > events . destroy , & PNEWWINDOW - > listen_destroyWindow ) ;
wl_signal_add ( & XDGSURFACE - > toplevel - > events . set_title , & PNEWWINDOW - > listen_setTitleWindow ) ;
wl_signal_add ( & XDGSURFACE - > toplevel - > events . request_fullscreen , & PNEWWINDOW - > listen_fullscreenWindow ) ;
Debug : : log ( LOG , " New XDG Surface created. " ) ;
}
2022-03-20 12:11:57 +01:00
// --------------------------------------------- //
// _____ ____ _____ _ _ _____ _____ //
// | __ \ / __ \| __ \| | | | __ \ / ____| //
// | |__) | | | | |__) | | | | |__) | (___ //
// | ___/| | | | ___/| | | | ___/ \___ \ //
// | | | |__| | | | |__| | | ____) | //
// |_| \____/|_| \____/|_| |_____/ //
// //
// --------------------------------------------- //
void createNewPopup ( wlr_xdg_popup * popup , void * parent , bool parentIsLayer ) {
if ( ! popup )
return ;
g_pCompositor - > m_lLayerPopups . push_back ( SLayerPopup ( ) ) ;
const auto PNEWPOPUP = & g_pCompositor - > m_lLayerPopups . back ( ) ;
PNEWPOPUP - > popup = popup ;
if ( parentIsLayer )
PNEWPOPUP - > parentSurface = ( SLayerSurface * ) parent ;
else
PNEWPOPUP - > parentPopup = ( wlr_xdg_popup * ) parent ;
wl_signal_add ( & popup - > base - > events . map , & PNEWPOPUP - > listen_mapPopup ) ;
wl_signal_add ( & popup - > base - > events . unmap , & PNEWPOPUP - > listen_unmapPopup ) ;
wl_signal_add ( & popup - > base - > events . destroy , & PNEWPOPUP - > listen_destroyPopup ) ;
wl_signal_add ( & popup - > base - > events . new_popup , & PNEWPOPUP - > listen_newPopupFromPopup ) ;
wl_signal_add ( & popup - > base - > surface - > events . commit , & PNEWPOPUP - > listen_commitPopup ) ;
const auto PLAYER = g_pCompositor - > getLayerForPopup ( PNEWPOPUP ) ;
const auto PMONITOR = g_pCompositor - > getMonitorFromOutput ( PLAYER - > layerSurface - > output ) ;
wlr_box box = { . x = - PLAYER - > geometry . x , . y = - PLAYER - > geometry . y , . width = PMONITOR - > vecSize . x , . height = PMONITOR - > vecSize . y } ;
wlr_xdg_popup_unconstrain_from_box ( PNEWPOPUP - > popup , & box ) ;
}
void Events : : listener_newPopup ( wl_listener * listener , void * data ) {
SLayerSurface * layersurface = wl_container_of ( listener , layersurface , listen_newPopup ) ;
const auto WLRPOPUP = ( wlr_xdg_popup * ) data ;
createNewPopup ( WLRPOPUP , layersurface , true ) ;
Debug : : log ( LOG , " New layer popup created from surface %x " , layersurface ) ;
}
void Events : : listener_newPopupFromPopup ( wl_listener * listener , void * data ) {
SLayerPopup * layerPopup = wl_container_of ( listener , layerPopup , listen_newPopupFromPopup ) ;
const auto WLRPOPUP = ( wlr_xdg_popup * ) data ;
createNewPopup ( WLRPOPUP , layerPopup , true ) ;
Debug : : log ( LOG , " New layer popup created from popup %x " , layerPopup ) ;
}
void Events : : listener_destroyPopup ( wl_listener * listener , void * data ) {
SLayerPopup * layerPopup = wl_container_of ( listener , layerPopup , listen_destroyPopup ) ;
wl_list_remove ( & layerPopup - > listen_mapPopup . link ) ;
wl_list_remove ( & layerPopup - > listen_unmapPopup . link ) ;
wl_list_remove ( & layerPopup - > listen_destroyPopup . link ) ;
wl_list_remove ( & layerPopup - > listen_commitPopup . link ) ;
g_pCompositor - > m_lLayerPopups . remove ( * layerPopup ) ;
Debug : : log ( LOG , " Destroyed popup %x " , layerPopup ) ;
}
void Events : : listener_mapPopup ( wl_listener * listener , void * data ) {
SLayerPopup * layerPopup = wl_container_of ( listener , layerPopup , listen_mapPopup ) ;
const auto PLAYER = g_pCompositor - > getLayerForPopup ( layerPopup ) ;
wlr_surface_send_enter ( layerPopup - > popup - > base - > surface , PLAYER - > layerSurface - > output ) ;
Debug : : log ( LOG , " Mapped popup %x " , layerPopup ) ;
}
void Events : : listener_unmapPopup ( wl_listener * listener , void * data ) {
SLayerPopup * layerPopup = wl_container_of ( listener , layerPopup , listen_unmapPopup ) ;
}
void Events : : listener_commitPopup ( wl_listener * listener , void * data ) {
SLayerPopup * layerPopup = wl_container_of ( listener , layerPopup , listen_commitPopup ) ;
}
2022-03-20 10:37:31 +01:00
// ------------------------------------------------------------ //
// __ _______ _ _ _____ ______ _______ //
// \ \ / /_ _| \ | | __ \ / __ \ \ / / ____| //
// \ \ /\ / / | | | \| | | | | | | \ \ /\ / / (___ //
// \ \/ \/ / | | | . ` | | | | | | |\ \/ \/ / \___ \ //
// \ /\ / _| |_| |\ | |__| | |__| | \ /\ / ____) | //
// \/ \/ |_____|_| \_|_____/ \____/ \/ \/ |_____/ //
// //
// ------------------------------------------------------------ //
2022-03-17 20:22:29 +01:00
void Events : : listener_mapWindow ( wl_listener * listener , void * data ) {
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_mapWindow ) ;
const auto PMONITOR = g_pCompositor - > getMonitorFromCursor ( ) ;
PWINDOW - > m_iMonitorID = PMONITOR - > ID ;
2022-03-18 23:16:15 +01:00
PWINDOW - > m_bMappedX11 = true ;
2022-03-17 20:22:29 +01:00
2022-03-20 13:37:07 +01:00
if ( g_pXWaylandManager - > shouldBeFloated ( PWINDOW ) )
g_pLayoutManager - > getCurrentLayout ( ) - > onWindowCreatedFloating ( PWINDOW ) ;
else
g_pLayoutManager - > getCurrentLayout ( ) - > onWindowCreated ( PWINDOW ) ;
2022-03-19 15:59:53 +01:00
2022-03-18 23:06:45 +01:00
g_pCompositor - > focusWindow ( PWINDOW ) ;
2022-03-17 20:55:04 +01:00
2022-03-19 20:30:21 +01:00
Debug : : log ( LOG , " Map request dispatched, monitor %s, xywh: %f %f %f %f " , PMONITOR - > szName . c_str ( ) , PWINDOW - > m_vRealPosition . x , PWINDOW - > m_vRealPosition . y , PWINDOW - > m_vRealSize . x , PWINDOW - > m_vRealSize . y ) ;
2022-03-17 20:22:29 +01:00
}
void Events : : listener_unmapWindow ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_unmapWindow ) ;
2022-03-17 20:55:04 +01:00
2022-03-19 15:59:53 +01:00
g_pLayoutManager - > getCurrentLayout ( ) - > onWindowRemoved ( PWINDOW ) ;
2022-03-18 22:35:51 +01:00
g_pCompositor - > removeWindowFromVectorSafe ( PWINDOW ) ;
2022-03-17 20:22:29 +01:00
2022-03-18 22:35:51 +01:00
Debug : : log ( LOG , " Window %x unmapped " , PWINDOW ) ;
2022-03-17 20:22:29 +01:00
}
void Events : : listener_commitWindow ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_commitWindow ) ;
2022-03-17 20:22:29 +01:00
2022-03-19 11:27:19 +01:00
PWINDOW ;
2022-03-17 20:22:29 +01:00
}
void Events : : listener_destroyWindow ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_destroyWindow ) ;
2022-03-18 22:35:51 +01:00
2022-03-19 17:00:52 +01:00
g_pLayoutManager - > getCurrentLayout ( ) - > onWindowRemoved ( PWINDOW ) ;
2022-03-18 22:35:51 +01:00
g_pCompositor - > removeWindowFromVectorSafe ( PWINDOW ) ;
Debug : : log ( LOG , " Window %x destroyed " , PWINDOW ) ;
2022-03-17 20:22:29 +01:00
}
void Events : : listener_setTitleWindow ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_setTitleWindow ) ;
2022-03-18 22:35:51 +01:00
PWINDOW - > m_szTitle = g_pXWaylandManager - > getTitle ( PWINDOW ) ;
2022-03-18 23:52:36 +01:00
Debug : : log ( LOG , " Window %x set title to %s " , PWINDOW , PWINDOW - > m_szTitle . c_str ( ) ) ;
2022-03-17 20:22:29 +01:00
}
void Events : : listener_fullscreenWindow ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_fullscreenWindow ) ;
2022-03-18 22:35:51 +01:00
PWINDOW - > m_bIsFullscreen = ! PWINDOW - > m_bIsFullscreen ;
// todo: do it
Debug : : log ( LOG , " Window %x fullscreen to %i " , PWINDOW , PWINDOW - > m_bIsFullscreen ) ;
2022-03-17 20:22:29 +01:00
}
2022-03-17 18:25:16 +01:00
2022-03-20 10:37:31 +01:00
void Events : : listener_activate ( wl_listener * listener , void * data ) {
// TODO
2022-03-17 18:25:16 +01:00
}
2022-03-18 20:03:39 +01:00
void Events : : listener_activateX11 ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_activateX11 ) ;
2022-03-18 20:03:39 +01:00
if ( PWINDOW - > m_iX11Type = = 1 /* Managed */ ) {
wlr_xwayland_surface_activate ( PWINDOW - > m_uSurface . xwayland , 1 ) ;
}
}
void Events : : listener_configureX11 ( wl_listener * listener , void * data ) {
2022-03-18 20:20:49 +01:00
CWindow * PWINDOW = wl_container_of ( listener , PWINDOW , listen_configureX11 ) ;
2022-03-18 20:03:39 +01:00
const auto E = ( wlr_xwayland_surface_configure_event * ) data ;
// TODO: ignore if tiled?
wlr_xwayland_surface_configure ( PWINDOW - > m_uSurface . xwayland , E - > x , E - > y , E - > width , E - > height ) ;
}
2022-03-20 10:37:31 +01:00
// ---------------------------------------------------- //
// _____ ________ _______ _____ ______ _____ //
// | __ \| ____\ \ / /_ _/ ____| ____|/ ____| //
// | | | | |__ \ \ / / | || | | |__ | (___ //
// | | | | __| \ \/ / | || | | __| \___ \ //
// | |__| | |____ \ / _| || |____| |____ ____) | //
// |_____/|______| \/ |_____\_____|______|_____/ //
// //
// ---------------------------------------------------- //
2022-03-18 20:03:39 +01:00
2022-03-18 23:25:26 +01:00
void Events : : listener_keyboardDestroy ( wl_listener * listener , void * data ) {
SKeyboard * PKEYBOARD = wl_container_of ( listener , PKEYBOARD , listen_keyboardDestroy ) ;
g_pInputManager - > destroyKeyboard ( PKEYBOARD ) ;
Debug : : log ( LOG , " Destroyed keyboard %x " , PKEYBOARD ) ;
}
2022-03-17 20:55:04 +01:00
void Events : : listener_keyboardKey ( wl_listener * listener , void * data ) {
2022-03-18 23:06:45 +01:00
SKeyboard * PKEYBOARD = wl_container_of ( listener , PKEYBOARD , listen_keyboardKey ) ;
g_pInputManager - > onKeyboardKey ( ( wlr_event_keyboard_key * ) data , PKEYBOARD ) ;
2022-03-17 20:55:04 +01:00
}
void Events : : listener_keyboardMod ( wl_listener * listener , void * data ) {
2022-03-18 23:06:45 +01:00
SKeyboard * PKEYBOARD = wl_container_of ( listener , PKEYBOARD , listen_keyboardMod ) ;
g_pInputManager - > onKeyboardMod ( data , PKEYBOARD ) ;
2022-03-17 20:55:04 +01:00
}
2022-03-17 15:53:45 +01:00
void Events : : listener_mouseFrame ( wl_listener * listener , void * data ) {
2022-03-17 19:03:15 +01:00
wlr_seat_pointer_notify_frame ( g_pCompositor - > m_sWLRSeat ) ;
2022-03-17 15:53:45 +01:00
}
void Events : : listener_mouseMove ( wl_listener * listener , void * data ) {
g_pInputManager - > onMouseMoved ( ( wlr_event_pointer_motion * ) data ) ;
}
void Events : : listener_mouseMoveAbsolute ( wl_listener * listener , void * data ) {
2022-03-17 19:03:15 +01:00
g_pInputManager - > onMouseWarp ( ( wlr_event_pointer_motion_absolute * ) data ) ;
2022-03-17 15:53:45 +01:00
}
2022-03-18 23:52:36 +01:00
void Events : : listener_mouseButton ( wl_listener * listener , void * data ) {
g_pInputManager - > onMouseButton ( ( wlr_event_pointer_button * ) data ) ;
}
2022-03-20 10:37:31 +01:00
void Events : : listener_mouseAxis ( wl_listener * listener , void * data ) {
const auto E = ( wlr_event_pointer_axis * ) data ;
wlr_seat_pointer_notify_axis ( g_pCompositor - > m_sWLRSeat , E - > time_msec , E - > orientation , E - > delta , E - > delta_discrete , E - > source ) ;
}
void Events : : listener_requestMouse ( wl_listener * listener , void * data ) {
const auto EVENT = ( wlr_seat_pointer_request_set_cursor_event * ) data ;
if ( EVENT - > seat_client = = g_pCompositor - > m_sWLRSeat - > pointer_state . focused_client )
wlr_cursor_set_surface ( g_pCompositor - > m_sWLRCursor , EVENT - > surface , EVENT - > hotspot_x , EVENT - > hotspot_y ) ;
}
2022-03-17 15:53:45 +01:00
void Events : : listener_newInput ( wl_listener * listener , void * data ) {
2022-03-17 19:03:15 +01:00
const auto DEVICE = ( wlr_input_device * ) data ;
switch ( DEVICE - > type ) {
case WLR_INPUT_DEVICE_KEYBOARD :
Debug : : log ( LOG , " Attached a keyboard with name %s " , DEVICE - > name ) ;
2022-03-17 20:55:04 +01:00
g_pInputManager - > newKeyboard ( DEVICE ) ;
2022-03-17 19:03:15 +01:00
break ;
case WLR_INPUT_DEVICE_POINTER :
Debug : : log ( LOG , " Attached a mouse with name %s " , DEVICE - > name ) ;
2022-03-18 22:53:27 +01:00
g_pInputManager - > newMouse ( DEVICE ) ;
2022-03-17 19:03:15 +01:00
break ;
default :
break ;
}
2022-03-19 13:28:02 +01:00
uint32_t capabilities = WL_SEAT_CAPABILITY_POINTER | WL_SEAT_CAPABILITY_KEYBOARD ;
2022-03-17 15:53:45 +01:00
2022-03-17 19:03:15 +01:00
wlr_seat_set_capabilities ( g_pCompositor - > m_sWLRSeat , capabilities ) ;
2022-03-17 15:53:45 +01:00
}
2022-03-20 10:37:31 +01:00
// ------------------------------ //
// __ __ _____ _____ _____ //
// | \/ |_ _|/ ____|/ ____| //
// | \ / | | | | (___ | | //
// | |\/| | | | \___ \| | //
// | | | |_| |_ ____) | |____ //
// |_| |_|_____|_____/ \_____| //
// //
// ------------------------------ //
2022-03-17 15:53:45 +01:00
void Events : : listener_outputMgrApply ( wl_listener * listener , void * data ) {
2022-03-17 20:55:04 +01:00
const auto CONFIG = ( wlr_output_configuration_v1 * ) data ;
2022-03-19 14:07:18 +01:00
g_pHyprRenderer - > outputMgrApplyTest ( CONFIG , false ) ;
2022-03-17 15:53:45 +01:00
}
void Events : : listener_outputMgrTest ( wl_listener * listener , void * data ) {
2022-03-17 20:55:04 +01:00
const auto CONFIG = ( wlr_output_configuration_v1 * ) data ;
2022-03-19 14:07:18 +01:00
g_pHyprRenderer - > outputMgrApplyTest ( CONFIG , true ) ;
2022-03-17 15:53:45 +01:00
}
void Events : : listener_requestSetPrimarySel ( wl_listener * listener , void * data ) {
2022-03-17 20:55:04 +01:00
const auto EVENT = ( wlr_seat_request_set_primary_selection_event * ) data ;
wlr_seat_set_primary_selection ( g_pCompositor - > m_sWLRSeat , EVENT - > source , EVENT - > serial ) ;
2022-03-17 15:53:45 +01:00
}
void Events : : listener_requestSetSel ( wl_listener * listener , void * data ) {
2022-03-17 20:55:04 +01:00
const auto EVENT = ( wlr_seat_request_set_selection_event * ) data ;
wlr_seat_set_selection ( g_pCompositor - > m_sWLRSeat , EVENT - > source , EVENT - > serial ) ;
2022-03-20 10:37:31 +01:00
}
void Events : : listener_readyXWayland ( wl_listener * listener , void * data ) {
const auto XCBCONNECTION = xcb_connect ( g_pXWaylandManager - > m_sWLRXWayland - > display_name , NULL ) ;
const auto ERR = xcb_connection_has_error ( XCBCONNECTION ) ;
if ( ERR ) {
2022-03-20 13:37:07 +01:00
Debug : : log ( LogLevel : : ERR , " XWayland -> xcb_connection_has_error failed with %i " , ERR ) ;
2022-03-20 10:37:31 +01:00
return ;
}
2022-03-20 13:37:07 +01:00
for ( auto & ATOM : HYPRATOMS ) {
xcb_intern_atom_cookie_t cookie = xcb_intern_atom ( XCBCONNECTION , 0 , ATOM . first . length ( ) , ATOM . first . c_str ( ) ) ;
xcb_intern_atom_reply_t * reply = xcb_intern_atom_reply ( XCBCONNECTION , cookie , NULL ) ;
if ( ! reply ) {
Debug : : log ( LogLevel : : ERR , " XWayland -> Atom failed: %s " , ATOM . first . c_str ( ) ) ;
continue ;
}
ATOM . second = reply - > atom ;
}
2022-03-20 10:37:31 +01:00
wlr_xwayland_set_seat ( g_pXWaylandManager - > m_sWLRXWayland , g_pCompositor - > m_sWLRSeat ) ;
const auto XCURSOR = wlr_xcursor_manager_get_xcursor ( g_pCompositor - > m_sWLRXCursorMgr , " left_ptr " , 1 ) ;
if ( XCURSOR ) {
wlr_xwayland_set_cursor ( g_pXWaylandManager - > m_sWLRXWayland , XCURSOR - > images [ 0 ] - > buffer , XCURSOR - > images [ 0 ] - > width * 4 , XCURSOR - > images [ 0 ] - > width , XCURSOR - > images [ 0 ] - > height , XCURSOR - > images [ 0 ] - > hotspot_x , XCURSOR - > images [ 0 ] - > hotspot_y ) ;
}
xcb_disconnect ( XCBCONNECTION ) ;
2022-03-16 21:37:21 +01:00
}