summaryrefslogtreecommitdiff
path: root/src/managers/XWaylandManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-18 20:03:39 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-03-18 20:03:39 +0100
commita9773bd91a2c01982cc9b9807233c95303feada1 (patch)
tree3d5936042a0e7330ee9bda9f49601f09beb86b17 /src/managers/XWaylandManager.cpp
parent854c827911b898d38fd54cdfab6bbd57296d3842 (diff)
XWayland and moved managers
Diffstat (limited to 'src/managers/XWaylandManager.cpp')
-rw-r--r--src/managers/XWaylandManager.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp
new file mode 100644
index 00000000..5a0a38aa
--- /dev/null
+++ b/src/managers/XWaylandManager.cpp
@@ -0,0 +1,84 @@
+#include "XWaylandManager.hpp"
+#include "../Compositor.hpp"
+#include "../events/Events.hpp"
+
+CHyprXWaylandManager::CHyprXWaylandManager() {
+ m_sWLRXWayland = wlr_xwayland_create(g_pCompositor->m_sWLDisplay, g_pCompositor->m_sWLRCompositor, 1);
+
+ if (!m_sWLRXWayland) {
+ Debug::log(ERR, "Couldn't start up the XWaylandManager because wlr_xwayland_create returned a nullptr!");
+ return;
+ }
+
+ wl_signal_add(&m_sWLRXWayland->events.ready, &Events::listen_readyXWayland);
+ wl_signal_add(&m_sWLRXWayland->events.new_surface, &Events::listen_surfaceXWayland);
+
+ setenv("DISPLAY", m_sWLRXWayland->display_name, 1);
+
+ Debug::log(LOG, "CHyprXWaylandManager started on display %s", m_sWLRXWayland->display_name);
+}
+
+CHyprXWaylandManager::~CHyprXWaylandManager() {
+
+}
+
+wlr_surface* CHyprXWaylandManager::getWindowSurface(CWindow* pWindow) {
+ if (pWindow->m_bIsX11)
+ return pWindow->m_uSurface.xwayland->surface;
+
+ return pWindow->m_uSurface.xdg->surface;
+}
+
+void CHyprXWaylandManager::activateSurface(wlr_surface* pSurface, bool activate) {
+ if (wlr_surface_is_xdg_surface(pSurface))
+ wlr_xdg_toplevel_set_activated(wlr_xdg_surface_from_wlr_surface(pSurface)->toplevel, activate);
+
+ else if (wlr_surface_is_xwayland_surface(pSurface))
+ wlr_xwayland_surface_activate(wlr_xwayland_surface_from_wlr_surface(pSurface), activate);
+}
+
+void CHyprXWaylandManager::getGeometryForWindow(CWindow* pWindow, wlr_box* pbox) {
+ if (pWindow->m_bIsX11) {
+ pbox->x = pWindow->m_uSurface.xwayland->x;
+ pbox->y = pWindow->m_uSurface.xwayland->y;
+ pbox->width = pWindow->m_uSurface.xwayland->width;
+ pbox->height = pWindow->m_uSurface.xwayland->height;
+ } else {
+ wlr_xdg_surface_get_geometry(pWindow->m_uSurface.xdg, pbox);
+ }
+}
+
+std::string CHyprXWaylandManager::getTitle(CWindow* pWindow) {
+ if (pWindow->m_bIsX11)
+ return pWindow->m_uSurface.xwayland->title;
+
+ return pWindow->m_uSurface.xdg->toplevel->title;
+}
+
+void CHyprXWaylandManager::sendCloseWindow(CWindow* pWindow) {
+ if (pWindow->m_bIsX11) {
+ wlr_xwayland_surface_close(pWindow->m_uSurface.xwayland);
+ } else {
+ wlr_xdg_toplevel_send_close(pWindow->m_uSurface.xdg->toplevel);
+ }
+}
+
+void CHyprXWaylandManager::setWindowSize(CWindow* pWindow, const Vector2D& size) {
+ if (pWindow->m_bIsX11)
+ wlr_xwayland_surface_configure(pWindow->m_uSurface.xwayland, pWindow->m_vPosition.x, pWindow->m_vPosition.y, size.x, size.y);
+
+ else
+ wlr_xdg_toplevel_set_size(pWindow->m_uSurface.xdg->toplevel, size.x, size.y);
+}
+
+void CHyprXWaylandManager::setWindowStyleTiled(CWindow* pWindow, uint32_t edgez) {
+ if (!pWindow->m_bIsX11)
+ wlr_xdg_toplevel_set_tiled(pWindow->m_uSurface.xdg->toplevel, edgez);
+}
+
+wlr_surface* CHyprXWaylandManager::surfaceAt(CWindow* pWindow, const Vector2D& client, Vector2D& server) {
+ if (pWindow->m_bIsX11)
+ return wlr_surface_surface_at(pWindow->m_uSurface.xwayland->surface, client.x, client.y, &server.x, &server.y);
+
+ return wlr_xdg_surface_surface_at(pWindow->m_uSurface.xdg, client.x, client.y, &server.x, &server.y);
+} \ No newline at end of file