aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authorVaxry <[email protected]>2024-05-10 23:28:33 +0100
committerVaxry <[email protected]>2024-05-14 23:02:24 +0100
commit0cfdde3d1acbfbf698af17f6986fbc4d644214da (patch)
tree579ac53bc228db6d0feb373448c8e5557d3285d4 /src/Compositor.cpp
parent121d3a72137d4780602cf245704615f63357ea22 (diff)
downloadHyprland-0cfdde3d1acbfbf698af17f6986fbc4d644214da.tar.gz
Hyprland-0cfdde3d1acbfbf698af17f6986fbc4d644214da.zip
xdg-shell: move to new impl
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp51
1 files changed, 27 insertions, 24 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index efc02a5f..c56dd280 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -18,6 +18,7 @@
#include "protocols/FractionalScale.hpp"
#include "protocols/PointerConstraints.hpp"
#include "protocols/LayerShell.hpp"
+#include "protocols/XDGShell.hpp"
#include "desktop/LayerSurface.hpp"
#include <sys/types.h>
@@ -229,8 +230,6 @@ void CCompositor::initServer() {
// wlr_primary_selection_v1_device_manager_create(m_sWLDisplay);
wlr_viewporter_create(m_sWLDisplay);
- m_sWLRXDGShell = wlr_xdg_shell_create(m_sWLDisplay, 6);
-
m_sWRLDRMLeaseMgr = wlr_drm_lease_v1_manager_create(m_sWLDisplay, m_sWLRBackend);
if (!m_sWRLDRMLeaseMgr) {
Debug::log(INFO, "Failed to create wlr_drm_lease_v1_manager");
@@ -253,7 +252,6 @@ void CCompositor::initServer() {
void CCompositor::initAllSignals() {
addWLSignal(&m_sWLRBackend->events.new_output, &Events::listen_newOutput, m_sWLRBackend, "Backend");
- addWLSignal(&m_sWLRXDGShell->events.new_toplevel, &Events::listen_newXDGToplevel, m_sWLRXDGShell, "XDG Shell");
addWLSignal(&m_sWLRBackend->events.new_input, &Events::listen_newInput, m_sWLRBackend, "Backend");
// addWLSignal(&m_sSeat.seat->events.request_set_selection, &Events::listen_requestSetSel, &m_sSeat, "Seat");
// addWLSignal(&m_sSeat.seat->events.request_start_drag, &Events::listen_requestDrag, &m_sSeat, "Seat");
@@ -271,7 +269,6 @@ void CCompositor::initAllSignals() {
void CCompositor::removeAllSignals() {
removeWLSignal(&Events::listen_newOutput);
- removeWLSignal(&Events::listen_newXDGToplevel);
removeWLSignal(&Events::listen_newInput);
removeWLSignal(&Events::listen_requestSetSel);
removeWLSignal(&Events::listen_requestDrag);
@@ -805,22 +802,28 @@ wlr_surface* CCompositor::vectorWindowToSurface(const Vector2D& pos, PHLWINDOW p
RASSERT(!pWindow->m_bIsX11, "Cannot call vectorWindowToSurface on an X11 window!");
- const auto PSURFACE = pWindow->m_uSurface.xdg;
+ double subx, suby;
+
+ CBox geom = pWindow->m_pXDGSurface->current.geometry;
- double subx, suby;
+ // try popups first
+ const auto PPOPUP = pWindow->m_pPopupHead->at(pos);
- // calc for oversized windows... fucking bullshit, again.
- CBox geom;
- wlr_xdg_surface_get_geometry(pWindow->m_uSurface.xdg, geom.pWlr());
- geom.applyFromWlr();
+ wlr_surface* found = PPOPUP ? PPOPUP->m_sWLSurface.wlr() : nullptr;
- const auto PFOUND =
- wlr_xdg_surface_surface_at(PSURFACE, pos.x - pWindow->m_vRealPosition.value().x + geom.x, pos.y - pWindow->m_vRealPosition.value().y + geom.y, &subx, &suby);
+ if (!PPOPUP)
+ found = wlr_surface_surface_at(pWindow->m_pWLSurface.wlr(), pos.x - pWindow->m_vRealPosition.value().x + geom.x, pos.y - pWindow->m_vRealPosition.value().y + geom.y, &subx,
+ &suby);
+ else {
+ const auto OFF = PPOPUP->coordsRelativeToParent();
+ subx = pos.x - OFF.x + geom.x - pWindow->m_vRealPosition.goal().x;
+ suby = pos.y - OFF.y + geom.y - pWindow->m_vRealPosition.goal().y;
+ }
- if (PFOUND) {
+ if (found) {
sl.x = subx;
sl.y = suby;
- return PFOUND;
+ return found;
}
sl.x = pos.x - pWindow->m_vRealPosition.value().x;
@@ -829,7 +832,7 @@ wlr_surface* CCompositor::vectorWindowToSurface(const Vector2D& pos, PHLWINDOW p
sl.x += geom.x;
sl.y += geom.y;
- return PSURFACE->surface;
+ return pWindow->m_pWLSurface.wlr();
}
Vector2D CCompositor::vectorToSurfaceLocal(const Vector2D& vec, PHLWINDOW pWindow, wlr_surface* pSurface) {
@@ -839,12 +842,14 @@ Vector2D CCompositor::vectorToSurfaceLocal(const Vector2D& vec, PHLWINDOW pWindo
if (pWindow->m_bIsX11)
return vec - pWindow->m_vRealPosition.goal();
- const auto PSURFACE = pWindow->m_uSurface.xdg;
+ const auto PPOPUP = pWindow->m_pPopupHead->at(vec);
+ if (PPOPUP)
+ return vec - PPOPUP->coordsGlobal();
std::tuple<wlr_surface*, int, int> iterData = {pSurface, -1337, -1337};
- wlr_xdg_surface_for_each_surface(
- PSURFACE,
+ wlr_surface_for_each_surface(
+ pWindow->m_pWLSurface.wlr(),
[](wlr_surface* surf, int x, int y, void* data) {
const auto PDATA = (std::tuple<wlr_surface*, int, int>*)data;
if (surf == std::get<0>(*PDATA)) {
@@ -854,9 +859,7 @@ Vector2D CCompositor::vectorToSurfaceLocal(const Vector2D& vec, PHLWINDOW pWindo
},
&iterData);
- CBox geom = {};
- wlr_xdg_surface_get_geometry(PSURFACE, geom.pWlr());
- geom.applyFromWlr();
+ CBox geom = pWindow->m_pXDGSurface->current.geometry;
if (std::get<1>(iterData) == -1337 && std::get<2>(iterData) == -1337)
return vec - pWindow->m_vRealPosition.goal();
@@ -993,7 +996,7 @@ void CCompositor::focusWindow(PHLWINDOW pWindow, wlr_surface* pSurface) {
pWindow->m_bIsUrgent = false;
// Send an event
- g_pEventManager->postEvent(SHyprIPCEvent{"activewindow", g_pXWaylandManager->getAppIDClass(pWindow) + "," + pWindow->m_szTitle});
+ g_pEventManager->postEvent(SHyprIPCEvent{"activewindow", pWindow->m_szClass + "," + pWindow->m_szTitle});
g_pEventManager->postEvent(SHyprIPCEvent{"activewindowv2", std::format("{:x}", (uintptr_t)pWindow.get())});
EMIT_HOOK_EVENT("activeWindow", pWindow);
@@ -2310,7 +2313,7 @@ PHLWINDOW CCompositor::getWindowByRegex(const std::string& regexp) {
switch (mode) {
case MODE_CLASS_REGEX: {
- const auto windowClass = g_pXWaylandManager->getAppIDClass(w);
+ const auto windowClass = w->m_szClass;
if (!std::regex_search(windowClass, regexCheck))
continue;
break;
@@ -2322,7 +2325,7 @@ PHLWINDOW CCompositor::getWindowByRegex(const std::string& regexp) {
break;
}
case MODE_TITLE_REGEX: {
- const auto windowTitle = g_pXWaylandManager->getTitle(w);
+ const auto windowTitle = w->m_szTitle;
if (!std::regex_search(windowTitle, regexCheck))
continue;
break;