From 69b8568ccff1cc225c5ad4b341c8a09bdf9f8654 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Sat, 6 Aug 2022 20:57:38 +0200 Subject: better foreign toplevel protocol obedience --- src/Window.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'src/Window.cpp') diff --git a/src/Window.cpp b/src/Window.cpp index fb1cebed..176e8bb9 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -112,4 +112,63 @@ IHyprWindowDecoration* CWindow::getDecorationByType(eDecorationType type) { } return nullptr; +} + +void CWindow::createToplevelHandle() { + if (m_bIsX11 && (m_bX11DoesntWantBorders || m_iX11Type == 2)) + return; // don't create a toplevel + + m_phForeignToplevel = wlr_foreign_toplevel_handle_v1_create(g_pCompositor->m_sWLRToplevelMgr); + + wlr_foreign_toplevel_handle_v1_set_app_id(m_phForeignToplevel, g_pXWaylandManager->getAppIDClass(this).c_str()); + wlr_foreign_toplevel_handle_v1_output_enter(m_phForeignToplevel, g_pCompositor->getMonitorFromID(m_iMonitorID)->output); + wlr_foreign_toplevel_handle_v1_set_title(m_phForeignToplevel, m_szTitle.c_str()); + wlr_foreign_toplevel_handle_v1_set_maximized(m_phForeignToplevel, false); + wlr_foreign_toplevel_handle_v1_set_minimized(m_phForeignToplevel, false); + wlr_foreign_toplevel_handle_v1_set_fullscreen(m_phForeignToplevel, false); + + // handle events + hyprListener_toplevelActivate.initCallback(&m_phForeignToplevel->events.request_activate, [&](void* owner, void* data) { + + g_pCompositor->focusWindow(this); + + }, this, "Toplevel"); + + hyprListener_toplevelFullscreen.initCallback(&m_phForeignToplevel->events.request_fullscreen, [&](void* owner, void* data) { + + const auto EV = (wlr_foreign_toplevel_handle_v1_fullscreen_event*)data; + + g_pCompositor->setWindowFullscreen(this, EV->fullscreen, FULLSCREEN_FULL); + + }, this, "Toplevel"); + + hyprListener_toplevelClose.initCallback(&m_phForeignToplevel->events.request_close, [&](void* owner, void* data) { + + g_pCompositor->closeWindow(this); + + }, this, "Toplevel"); + + m_iLastToplevelMonitorID = m_iMonitorID; +} + +void CWindow::destroyToplevelHandle() { + hyprListener_toplevelActivate.removeCallback(); + hyprListener_toplevelClose.removeCallback(); + hyprListener_toplevelFullscreen.removeCallback(); + + wlr_foreign_toplevel_handle_v1_destroy(m_phForeignToplevel); + m_phForeignToplevel = nullptr; +} + +void CWindow::updateToplevel() { + wlr_foreign_toplevel_handle_v1_set_app_id(m_phForeignToplevel, g_pXWaylandManager->getAppIDClass(this).c_str()); + wlr_foreign_toplevel_handle_v1_set_title(m_phForeignToplevel, m_szTitle.c_str()); + wlr_foreign_toplevel_handle_v1_set_fullscreen(m_phForeignToplevel, m_bIsFullscreen); + + if (m_iLastToplevelMonitorID != m_iMonitorID) { + wlr_foreign_toplevel_handle_v1_output_leave(m_phForeignToplevel, g_pCompositor->getMonitorFromID(m_iLastToplevelMonitorID)->output); + wlr_foreign_toplevel_handle_v1_output_enter(m_phForeignToplevel, g_pCompositor->getMonitorFromID(m_iMonitorID)->output); + + m_iLastToplevelMonitorID = m_iMonitorID; + } } \ No newline at end of file -- cgit v1.2.3