summaryrefslogtreecommitdiff
path: root/src/Window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Window.cpp')
-rw-r--r--src/Window.cpp59
1 files changed, 59 insertions, 0 deletions
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