2022-03-18 20:03:39 +01:00
|
|
|
#include "XWaylandManager.hpp"
|
|
|
|
#include "../Compositor.hpp"
|
|
|
|
#include "../events/Events.hpp"
|
2024-03-03 19:39:20 +01:00
|
|
|
#include "../config/ConfigValue.hpp"
|
2024-05-11 00:28:33 +02:00
|
|
|
#include "../protocols/XDGShell.hpp"
|
2024-06-08 10:07:59 +02:00
|
|
|
#include "../protocols/core/Compositor.hpp"
|
2024-05-25 22:43:51 +02:00
|
|
|
#include "../xwayland/XWayland.hpp"
|
2024-10-11 13:07:25 +02:00
|
|
|
#include <hyprutils/math/Vector2D.hpp>
|
2023-06-23 21:14:04 +02:00
|
|
|
|
|
|
|
#define OUTPUT_MANAGER_VERSION 3
|
|
|
|
#define OUTPUT_DONE_DEPRECATED_SINCE_VERSION 3
|
|
|
|
#define OUTPUT_DESCRIPTION_MUTABLE_SINCE_VERSION 3
|
2022-03-18 20:03:39 +01:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
CHyprXWaylandManager::CHyprXWaylandManager() = default;
|
2022-03-18 20:03:39 +01:00
|
|
|
|
2024-05-08 19:11:08 +02:00
|
|
|
CHyprXWaylandManager::~CHyprXWaylandManager() {
|
|
|
|
#ifndef NO_XWAYLAND
|
|
|
|
unsetenv("DISPLAY");
|
|
|
|
#endif
|
|
|
|
}
|
2022-03-18 20:03:39 +01:00
|
|
|
|
2024-06-08 10:07:59 +02:00
|
|
|
SP<CWLSurfaceResource> CHyprXWaylandManager::getWindowSurface(PHLWINDOW pWindow) {
|
2024-10-11 13:07:25 +02:00
|
|
|
return pWindow ? pWindow->m_pWLSurface->resource() : nullptr;
|
2022-03-18 20:03:39 +01:00
|
|
|
}
|
|
|
|
|
2024-06-08 10:07:59 +02:00
|
|
|
void CHyprXWaylandManager::activateSurface(SP<CWLSurfaceResource> pSurface, bool activate) {
|
2022-08-31 11:12:46 +02:00
|
|
|
if (!pSurface)
|
|
|
|
return;
|
|
|
|
|
2024-08-26 10:24:45 +02:00
|
|
|
auto HLSurface = CWLSurface::fromResource(pSurface);
|
|
|
|
if (!HLSurface) {
|
|
|
|
Debug::log(TRACE, "CHyprXWaylandManager::activateSurface on non-desktop surface, ignoring");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const auto PWINDOW = HLSurface->getWindow();
|
|
|
|
if (!PWINDOW) {
|
|
|
|
Debug::log(TRACE, "CHyprXWaylandManager::activateSurface on non-window surface, ignoring");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
if (PWINDOW->m_bIsX11) {
|
|
|
|
if (PWINDOW->m_pXWaylandSurface) {
|
|
|
|
if (activate) {
|
|
|
|
PWINDOW->m_pXWaylandSurface->setMinimized(false);
|
|
|
|
PWINDOW->m_pXWaylandSurface->restackToTop();
|
|
|
|
}
|
|
|
|
PWINDOW->m_pXWaylandSurface->activate(activate);
|
2024-08-25 16:37:03 +02:00
|
|
|
}
|
2024-10-11 13:07:25 +02:00
|
|
|
} else if (PWINDOW->m_pXDGSurface)
|
2024-08-26 10:24:45 +02:00
|
|
|
PWINDOW->m_pXDGSurface->toplevel->setActive(activate);
|
2022-03-18 20:03:39 +01:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::activateWindow(PHLWINDOW pWindow, bool activate) {
|
2022-04-05 18:29:58 +02:00
|
|
|
if (pWindow->m_bIsX11) {
|
2022-05-11 15:03:31 +02:00
|
|
|
|
2022-10-28 20:18:10 +02:00
|
|
|
if (activate) {
|
2024-10-11 13:07:25 +02:00
|
|
|
setWindowSize(pWindow, pWindow->m_vRealSize.value()); // update xwayland output pos
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->setMinimized(false);
|
2024-10-11 13:07:25 +02:00
|
|
|
|
2024-08-30 14:12:23 +02:00
|
|
|
if (!pWindow->isX11OverrideRedirect())
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->restackToTop();
|
2022-10-28 20:18:10 +02:00
|
|
|
}
|
2022-12-16 18:17:31 +01:00
|
|
|
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->activate(activate);
|
2024-10-11 13:07:25 +02:00
|
|
|
|
2024-05-11 00:28:33 +02:00
|
|
|
} else if (pWindow->m_pXDGSurface && pWindow->m_pXDGSurface->toplevel)
|
|
|
|
pWindow->m_pXDGSurface->toplevel->setActive(activate);
|
2022-04-02 18:57:09 +02:00
|
|
|
|
2022-10-25 15:19:24 +02:00
|
|
|
if (activate) {
|
2022-12-16 18:17:31 +01:00
|
|
|
g_pCompositor->m_pLastFocus = getWindowSurface(pWindow);
|
2022-10-25 15:19:24 +02:00
|
|
|
g_pCompositor->m_pLastWindow = pWindow;
|
|
|
|
}
|
2022-08-31 17:02:44 +02:00
|
|
|
|
2022-09-10 13:11:02 +02:00
|
|
|
if (!pWindow->m_bPinned)
|
2024-04-02 21:32:39 +02:00
|
|
|
pWindow->m_pWorkspace->m_pLastFocusedWindow = pWindow;
|
2022-04-02 18:57:09 +02:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::getGeometryForWindow(PHLWINDOW pWindow, CBox* pbox) {
|
2024-10-11 13:07:25 +02:00
|
|
|
if (!pWindow)
|
|
|
|
return;
|
|
|
|
|
2022-03-18 20:03:39 +01:00
|
|
|
if (pWindow->m_bIsX11) {
|
2024-05-25 22:43:51 +02:00
|
|
|
const auto SIZEHINTS = pWindow->m_pXWaylandSurface->sizeHints.get();
|
2022-10-17 12:18:45 +02:00
|
|
|
|
2024-08-30 14:12:23 +02:00
|
|
|
if (SIZEHINTS && !pWindow->isX11OverrideRedirect()) {
|
2024-07-21 17:41:26 +02:00
|
|
|
// WM_SIZE_HINTS' x,y,w,h is deprecated it seems.
|
|
|
|
// Source: https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html#wm_normal_hints_property
|
|
|
|
pbox->x = pWindow->m_pXWaylandSurface->geometry.x;
|
|
|
|
pbox->y = pWindow->m_pXWaylandSurface->geometry.y;
|
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
constexpr int ICCCM_USSize = 0x2;
|
|
|
|
constexpr int ICCCM_PSize = 0x8;
|
|
|
|
|
|
|
|
if ((SIZEHINTS->flags & ICCCM_USSize) || (SIZEHINTS->flags & ICCCM_PSize)) {
|
2024-07-21 17:41:26 +02:00
|
|
|
pbox->w = SIZEHINTS->base_width;
|
|
|
|
pbox->h = SIZEHINTS->base_height;
|
|
|
|
} else {
|
|
|
|
pbox->w = pWindow->m_pXWaylandSurface->geometry.w;
|
|
|
|
pbox->h = pWindow->m_pXWaylandSurface->geometry.h;
|
|
|
|
}
|
|
|
|
} else
|
2024-05-25 22:43:51 +02:00
|
|
|
*pbox = pWindow->m_pXWaylandSurface->geometry;
|
2024-07-21 17:41:26 +02:00
|
|
|
|
2024-05-11 00:28:33 +02:00
|
|
|
} else if (pWindow->m_pXDGSurface)
|
|
|
|
*pbox = pWindow->m_pXDGSurface->current.geometry;
|
2022-03-18 20:03:39 +01:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::sendCloseWindow(PHLWINDOW pWindow) {
|
2023-06-18 18:14:48 +02:00
|
|
|
if (pWindow->m_bIsX11)
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->close();
|
2024-05-11 00:28:33 +02:00
|
|
|
else if (pWindow->m_pXDGSurface && pWindow->m_pXDGSurface->toplevel)
|
|
|
|
pWindow->m_pXDGSurface->toplevel->close();
|
2022-03-18 20:03:39 +01:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::setWindowSize(PHLWINDOW pWindow, Vector2D size, bool force) {
|
2023-02-28 20:36:36 +01:00
|
|
|
|
2024-03-03 19:39:20 +01:00
|
|
|
static auto PXWLFORCESCALEZERO = CConfigValue<Hyprlang::INT>("xwayland:force_zero_scaling");
|
2023-08-15 19:15:37 +02:00
|
|
|
|
2024-03-03 19:39:20 +01:00
|
|
|
const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
|
2022-07-28 23:55:00 +02:00
|
|
|
|
2024-02-05 21:56:20 +01:00
|
|
|
size = size.clamp(Vector2D{0, 0}, Vector2D{std::numeric_limits<double>::infinity(), std::numeric_limits<double>::infinity()});
|
2024-02-05 15:08:08 +01:00
|
|
|
|
2023-08-15 19:15:37 +02:00
|
|
|
// calculate pos
|
|
|
|
// TODO: this should be decoupled from setWindowSize IMO
|
2024-03-02 01:35:17 +01:00
|
|
|
Vector2D windowPos = pWindow->m_vRealPosition.value();
|
2022-07-28 23:55:00 +02:00
|
|
|
|
2023-12-17 20:58:11 +01:00
|
|
|
if (pWindow->m_bIsX11 && PMONITOR) {
|
2024-10-11 13:07:25 +02:00
|
|
|
windowPos -= PMONITOR->vecPosition; // normalize to monitor
|
2024-03-03 19:39:20 +01:00
|
|
|
if (*PXWLFORCESCALEZERO)
|
2024-10-11 13:07:25 +02:00
|
|
|
windowPos *= PMONITOR->scale; // scale if applicable
|
|
|
|
windowPos += PMONITOR->vecXWaylandPosition; // move to correct position for xwayland
|
2023-08-15 19:15:37 +02:00
|
|
|
}
|
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
if (!force && pWindow->m_vPendingReportedSize == size && (windowPos == pWindow->m_vReportedPosition || !pWindow->m_bIsX11))
|
2023-08-15 19:15:37 +02:00
|
|
|
return;
|
|
|
|
|
2023-10-20 21:15:41 +02:00
|
|
|
pWindow->m_vReportedPosition = windowPos;
|
|
|
|
pWindow->m_vPendingReportedSize = size;
|
2023-06-11 21:52:13 +02:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
pWindow->m_fX11SurfaceScaledBy = 1.0f;
|
2023-06-11 21:52:13 +02:00
|
|
|
|
2024-03-03 19:39:20 +01:00
|
|
|
if (*PXWLFORCESCALEZERO && pWindow->m_bIsX11 && PMONITOR) {
|
2024-10-11 13:07:25 +02:00
|
|
|
size *= PMONITOR->scale;
|
2023-12-17 20:58:11 +01:00
|
|
|
pWindow->m_fX11SurfaceScaledBy = PMONITOR->scale;
|
2023-06-11 21:52:13 +02:00
|
|
|
}
|
|
|
|
|
2022-03-19 15:59:53 +01:00
|
|
|
if (pWindow->m_bIsX11)
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->configure({windowPos, size});
|
2024-05-11 00:28:33 +02:00
|
|
|
else if (pWindow->m_pXDGSurface->toplevel)
|
2024-10-11 13:07:25 +02:00
|
|
|
pWindow->m_vPendingSizeAcks.emplace_back(pWindow->m_pXDGSurface->toplevel->setSize(size), size.floor());
|
2022-03-18 20:03:39 +01:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
bool CHyprXWaylandManager::shouldBeFloated(PHLWINDOW pWindow, bool pending) {
|
2022-03-20 13:37:07 +01:00
|
|
|
if (pWindow->m_bIsX11) {
|
2024-10-11 13:07:25 +02:00
|
|
|
for (const auto& a : pWindow->m_pXWaylandSurface->atoms)
|
2024-05-25 22:43:51 +02:00
|
|
|
if (a == HYPRATOMS["_NET_WM_WINDOW_TYPE_DIALOG"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_SPLASH"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_TOOLBAR"] ||
|
|
|
|
a == HYPRATOMS["_NET_WM_WINDOW_TYPE_UTILITY"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_TOOLTIP"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_POPUP_MENU"] ||
|
|
|
|
a == HYPRATOMS["_NET_WM_WINDOW_TYPE_DOCK"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_MENU"] ||
|
|
|
|
a == HYPRATOMS["_KDE_NET_WM_WINDOW_TYPE_OVERRIDE"]) {
|
|
|
|
|
|
|
|
if (a == HYPRATOMS["_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_MENU"])
|
2022-12-16 18:17:31 +01:00
|
|
|
pWindow->m_bX11ShouldntFocus = true;
|
|
|
|
|
2024-03-03 01:18:53 +01:00
|
|
|
pWindow->m_bNoInitialFocus = true;
|
2022-12-16 18:17:31 +01:00
|
|
|
return true;
|
|
|
|
}
|
2022-03-20 19:26:16 +01:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
if (pWindow->isModal() || pWindow->m_pXWaylandSurface->transient ||
|
|
|
|
(pWindow->m_pXWaylandSurface->role.contains("task_dialog") || pWindow->m_pXWaylandSurface->role.contains("pop-up")) || pWindow->m_pXWaylandSurface->overrideRedirect)
|
2024-05-25 22:43:51 +02:00
|
|
|
return true;
|
|
|
|
|
|
|
|
const auto SIZEHINTS = pWindow->m_pXWaylandSurface->sizeHints.get();
|
|
|
|
if (pWindow->m_pXWaylandSurface->transient || pWindow->m_pXWaylandSurface->parent ||
|
|
|
|
(SIZEHINTS && (SIZEHINTS->min_width == SIZEHINTS->max_width) && (SIZEHINTS->min_height == SIZEHINTS->max_height)))
|
2022-03-20 19:26:16 +01:00
|
|
|
return true;
|
2022-03-21 17:24:41 +01:00
|
|
|
} else {
|
2024-05-11 00:28:33 +02:00
|
|
|
const auto PSTATE = pending ? &pWindow->m_pXDGSurface->toplevel->pending : &pWindow->m_pXDGSurface->toplevel->current;
|
2022-09-25 20:07:48 +02:00
|
|
|
|
2024-05-11 00:28:33 +02:00
|
|
|
if (pWindow->m_pXDGSurface->toplevel->parent ||
|
|
|
|
(PSTATE->minSize.x != 0 && PSTATE->minSize.y != 0 && (PSTATE->minSize.x == PSTATE->maxSize.x || PSTATE->minSize.y == PSTATE->maxSize.y)))
|
2022-03-21 17:24:41 +01:00
|
|
|
return true;
|
2022-03-20 13:37:07 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2022-03-20 19:14:17 +01:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::checkBorders(PHLWINDOW pWindow) {
|
2022-03-22 21:28:57 +01:00
|
|
|
if (!pWindow->m_bIsX11)
|
|
|
|
return;
|
|
|
|
|
2024-08-26 17:25:39 +02:00
|
|
|
for (auto const& a : pWindow->m_pXWaylandSurface->atoms) {
|
2024-05-25 22:43:51 +02:00
|
|
|
if (a == HYPRATOMS["_NET_WM_WINDOW_TYPE_POPUP_MENU"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_NOTIFICATION"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_DROPDOWN_MENU"] ||
|
|
|
|
a == HYPRATOMS["_NET_WM_WINDOW_TYPE_COMBO"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_MENU"] || a == HYPRATOMS["_NET_WM_WINDOW_TYPE_SPLASH"] ||
|
|
|
|
a == HYPRATOMS["_NET_WM_WINDOW_TYPE_TOOLTIP"]) {
|
2022-09-25 20:07:48 +02:00
|
|
|
|
2022-03-22 21:28:57 +01:00
|
|
|
pWindow->m_bX11DoesntWantBorders = true;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-30 14:12:23 +02:00
|
|
|
if (pWindow->isX11OverrideRedirect())
|
2022-03-22 21:28:57 +01:00
|
|
|
pWindow->m_bX11DoesntWantBorders = true;
|
2022-03-30 17:39:04 +02:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
void CHyprXWaylandManager::setWindowFullscreen(PHLWINDOW pWindow, bool fullscreen) {
|
2024-10-11 13:07:25 +02:00
|
|
|
if (!pWindow)
|
|
|
|
return;
|
|
|
|
|
2023-06-18 18:14:48 +02:00
|
|
|
if (pWindow->m_bIsX11)
|
2024-05-25 22:43:51 +02:00
|
|
|
pWindow->m_pXWaylandSurface->setFullscreen(fullscreen);
|
2024-05-11 00:28:33 +02:00
|
|
|
else if (pWindow->m_pXDGSurface && pWindow->m_pXDGSurface->toplevel)
|
|
|
|
pWindow->m_pXDGSurface->toplevel->setFullscreen(fullscreen);
|
2022-08-05 18:10:59 +02:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
Vector2D CHyprXWaylandManager::getMaxSizeForWindow(PHLWINDOW pWindow) {
|
2024-10-11 13:07:25 +02:00
|
|
|
constexpr int NO_MAX_SIZE_LIMIT = 99999;
|
|
|
|
if (!validMapped(pWindow) ||
|
|
|
|
((pWindow->m_bIsX11 && !pWindow->m_pXWaylandSurface->sizeHints) || (!pWindow->m_bIsX11 && !pWindow->m_pXDGSurface->toplevel) ||
|
|
|
|
pWindow->m_sWindowData.noMaxSize.valueOrDefault()))
|
|
|
|
return Vector2D(NO_MAX_SIZE_LIMIT, NO_MAX_SIZE_LIMIT);
|
2022-08-05 19:41:50 +02:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
Vector2D maxSize = pWindow->m_bIsX11 ? Vector2D(pWindow->m_pXWaylandSurface->sizeHints->max_width, pWindow->m_pXWaylandSurface->sizeHints->max_height) :
|
|
|
|
pWindow->m_pXDGSurface->toplevel->current.maxSize;
|
2022-08-05 18:10:59 +02:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
if (maxSize.x < 5)
|
|
|
|
maxSize.x = NO_MAX_SIZE_LIMIT;
|
|
|
|
if (maxSize.y < 5)
|
|
|
|
maxSize.y = NO_MAX_SIZE_LIMIT;
|
2022-08-05 18:10:59 +02:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
return maxSize;
|
2023-08-15 20:09:32 +02:00
|
|
|
}
|
|
|
|
|
2024-04-27 13:43:12 +02:00
|
|
|
Vector2D CHyprXWaylandManager::getMinSizeForWindow(PHLWINDOW pWindow) {
|
2024-10-11 13:07:25 +02:00
|
|
|
if (!validMapped(pWindow) || ((pWindow->m_bIsX11 && !pWindow->m_pXWaylandSurface->sizeHints) || (!pWindow->m_bIsX11 && !pWindow->m_pXDGSurface->toplevel)))
|
2024-03-02 16:25:32 +01:00
|
|
|
return Vector2D(0, 0);
|
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
Vector2D minSize = pWindow->m_bIsX11 ? Vector2D(pWindow->m_pXWaylandSurface->sizeHints->min_width, pWindow->m_pXWaylandSurface->sizeHints->min_height) :
|
|
|
|
pWindow->m_pXDGSurface->toplevel->current.minSize;
|
2024-03-02 16:25:32 +01:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
minSize = minSize.clamp({1, 1});
|
2024-03-02 16:25:32 +01:00
|
|
|
|
2024-10-11 13:07:25 +02:00
|
|
|
return minSize;
|
2024-03-02 16:25:32 +01:00
|
|
|
}
|
|
|
|
|
2023-08-15 20:09:32 +02:00
|
|
|
Vector2D CHyprXWaylandManager::xwaylandToWaylandCoords(const Vector2D& coord) {
|
|
|
|
|
2024-03-03 19:39:20 +01:00
|
|
|
static auto PXWLFORCESCALEZERO = CConfigValue<Hyprlang::INT>("xwayland:force_zero_scaling");
|
2023-08-15 20:09:32 +02:00
|
|
|
|
2024-03-03 19:39:20 +01:00
|
|
|
CMonitor* pMonitor = nullptr;
|
|
|
|
double bestDistance = __FLT_MAX__;
|
2024-10-11 13:07:25 +02:00
|
|
|
for (const auto& m : g_pCompositor->m_vMonitors) {
|
2024-03-03 19:39:20 +01:00
|
|
|
const auto SIZ = *PXWLFORCESCALEZERO ? m->vecTransformedSize : m->vecSize;
|
2023-09-04 17:30:44 +02:00
|
|
|
|
|
|
|
double distance =
|
2023-09-10 21:19:06 +02:00
|
|
|
vecToRectDistanceSquared(coord, {m->vecXWaylandPosition.x, m->vecXWaylandPosition.y}, {m->vecXWaylandPosition.x + SIZ.x - 1, m->vecXWaylandPosition.y + SIZ.y - 1});
|
2023-09-04 17:30:44 +02:00
|
|
|
|
|
|
|
if (distance < bestDistance) {
|
|
|
|
bestDistance = distance;
|
|
|
|
pMonitor = m.get();
|
2023-08-15 20:09:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!pMonitor)
|
|
|
|
return Vector2D{};
|
|
|
|
|
|
|
|
// get local coords
|
|
|
|
Vector2D result = coord - pMonitor->vecXWaylandPosition;
|
|
|
|
// if scaled, unscale
|
2024-03-03 19:39:20 +01:00
|
|
|
if (*PXWLFORCESCALEZERO)
|
2024-10-11 13:07:25 +02:00
|
|
|
result /= pMonitor->scale;
|
2023-08-15 20:09:32 +02:00
|
|
|
// add pos
|
2024-10-11 13:07:25 +02:00
|
|
|
result += pMonitor->vecPosition;
|
2023-08-15 20:09:32 +02:00
|
|
|
|
|
|
|
return result;
|
2024-10-11 13:07:25 +02:00
|
|
|
}
|