diff options
Diffstat (limited to 'src/events/Events.cpp')
| -rw-r--r-- | src/events/Events.cpp | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/src/events/Events.cpp b/src/events/Events.cpp index a5b093f0..8bdaa232 100644 --- a/src/events/Events.cpp +++ b/src/events/Events.cpp @@ -1,11 +1,61 @@ #include "Events.hpp" #include "../input/InputManager.hpp" +#include "../Compositor.hpp" void Events::listener_activate(wl_listener* listener, void* data) { } void Events::listener_change(wl_listener* listener, void* data) { + // layout got changed, let's update monitors. + const auto CONFIG = wlr_output_configuration_v1_create(); + + const auto GEOMETRY = wlr_output_layout_get_box(g_pCompositor->m_sWLROutputLayout, NULL); +} + +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; + + 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); + + wl_signal_add(&OUTPUT->events.frame, &Events::listen_monitorFrame); + wl_signal_add(&OUTPUT->events.destroy, &Events::listen_monitorDestroy); + + 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); + + // add new monitor to our internal arr + newMonitor.ID = g_pCompositor->m_vMonitors.size(); + newMonitor.szName = OUTPUT->name; + newMonitor.vecPosition = monitorRule.offset; + newMonitor.vecSize = monitorRule.resolution; + + g_pCompositor->m_vMonitors.push_back(newMonitor); +} + +void Events::listener_monitorFrame(wl_listener* listener, void* data) { + +} + +void Events::listener_monitorDestroy(wl_listener* listener, void* data) { } @@ -41,10 +91,6 @@ void Events::listener_newLayerSurface(wl_listener* listener, void* data) { } -void Events::listener_newOutput(wl_listener* listener, void* data) { - -} - void Events::listener_newXDGSurface(wl_listener* listener, void* data) { } |
