Hyprland/src/events/Popups.cpp

169 lines
5.7 KiB
C++
Raw Normal View History

2022-03-21 15:17:04 +01:00
#include "Events.hpp"
#include "../Compositor.hpp"
#include "../helpers/WLClasses.hpp"
#include "../managers/InputManager.hpp"
#include "../render/Renderer.hpp"
// --------------------------------------------- //
// _____ ____ _____ _ _ _____ _____ //
// | __ \ / __ \| __ \| | | | __ \ / ____| //
// | |__) | | | | |__) | | | | |__) | (___ //
// | ___/| | | | ___/| | | | ___/ \___ \ //
// | | | |__| | | | |__| | | ____) | //
// |_| \____/|_| \____/|_| |_____/ //
// //
// --------------------------------------------- //
2022-03-27 17:25:20 +02:00
void addPopupGlobalCoords(void* pPopup, int* x, int* y) {
SXDGPopup *const PPOPUP = (SXDGPopup*)pPopup;
2022-04-03 10:32:21 +02:00
int px = 0;
int py = 0;
2022-03-27 17:25:20 +02:00
auto curPopup = PPOPUP;
while (true) {
px += curPopup->popup->geometry.x;
py += curPopup->popup->geometry.y;
if (curPopup->parentPopup) {
curPopup = curPopup->parentPopup;
} else {
break;
}
}
2022-04-02 13:41:15 +02:00
px += PPOPUP->lx;
py += PPOPUP->ly;
2022-03-21 15:17:04 +01:00
2022-03-27 17:25:20 +02:00
*x += px;
*y += py;
}
2022-03-21 15:17:04 +01:00
2022-03-27 17:25:20 +02:00
void createNewPopup(wlr_xdg_popup* popup, SXDGPopup* pHyprPopup) {
pHyprPopup->popup = popup;
2022-03-21 15:17:04 +01:00
2022-03-28 22:31:39 +02:00
pHyprPopup->hyprListener_destroyPopupXDG.initCallback(&popup->base->surface->events.destroy, &Events::listener_destroyPopupXDG, pHyprPopup, "HyprPopup");
pHyprPopup->hyprListener_mapPopupXDG.initCallback(&popup->base->events.map, &Events::listener_mapPopupXDG, pHyprPopup, "HyprPopup");
pHyprPopup->hyprListener_unmapPopupXDG.initCallback(&popup->base->events.unmap, &Events::listener_unmapPopupXDG, pHyprPopup, "HyprPopup");
pHyprPopup->hyprListener_newPopupFromPopupXDG.initCallback(&popup->base->events.new_popup, &Events::listener_newPopupFromPopupXDG, pHyprPopup, "HyprPopup");
2022-03-21 15:17:04 +01:00
2022-03-27 17:25:20 +02:00
const auto PMONITOR = g_pCompositor->m_pLastMonitor;
2022-03-21 15:17:04 +01:00
2022-04-07 16:42:16 +02:00
double lx = pHyprPopup->lx, ly = pHyprPopup->ly;
2022-04-06 19:24:20 +02:00
wlr_output_layout_output_coords(g_pCompositor->m_sWLROutputLayout, PMONITOR->output, &lx, &ly);
wlr_box box = {.x = lx, .y = ly, .width = PMONITOR->vecSize.x, .height = PMONITOR->vecSize.y};
2022-03-21 15:17:04 +01:00
2022-03-27 17:25:20 +02:00
wlr_xdg_popup_unconstrain_from_box(popup, &box);
2022-04-02 13:41:15 +02:00
pHyprPopup->monitor = PMONITOR;
2022-04-07 16:42:16 +02:00
Debug::log(LOG, "Popup: Coords %ix%i, at %i %i", popup->geometry.width, popup->geometry.height, popup->geometry.x, popup->geometry.y);
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_newPopup(void* owner, void* data) {
SLayerSurface* layersurface = (SLayerSurface*)owner;
2022-03-21 15:17:04 +01:00
2022-03-31 21:58:33 +02:00
ASSERT(layersurface);
2022-03-24 21:34:24 +01:00
Debug::log(LOG, "New layer popup created from surface %x", layersurface);
2022-03-21 15:17:04 +01:00
const auto WLRPOPUP = (wlr_xdg_popup*)data;
g_pCompositor->m_lXDGPopups.push_back(SXDGPopup());
const auto PNEWPOPUP = &g_pCompositor->m_lXDGPopups.back();
2022-04-02 13:41:15 +02:00
const auto PMONITOR = g_pCompositor->getMonitorFromID(layersurface->monitorID);
2022-03-27 17:25:20 +02:00
PNEWPOPUP->popup = WLRPOPUP;
2022-04-03 10:32:21 +02:00
PNEWPOPUP->lx = layersurface->position.x - PMONITOR->vecPosition.x;
PNEWPOPUP->ly = layersurface->position.y - PMONITOR->vecPosition.y;
2022-04-02 13:41:15 +02:00
PNEWPOPUP->monitor = PMONITOR;
2022-03-27 17:25:20 +02:00
createNewPopup(WLRPOPUP, PNEWPOPUP);
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_newPopupXDG(void* owner, void* data) {
CWindow* PWINDOW = (CWindow*)owner;
2022-03-21 15:17:04 +01:00
2022-03-31 21:58:33 +02:00
ASSERT(PWINDOW);
2022-03-24 21:34:24 +01:00
Debug::log(LOG, "New layer popup created from XDG window %x -> %s", PWINDOW, PWINDOW->m_szTitle.c_str());
2022-03-21 15:17:04 +01:00
const auto WLRPOPUP = (wlr_xdg_popup*)data;
2022-03-27 17:25:20 +02:00
g_pCompositor->m_lXDGPopups.push_back(SXDGPopup());
const auto PNEWPOPUP = &g_pCompositor->m_lXDGPopups.back();
2022-04-02 13:41:15 +02:00
const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
2022-03-27 17:25:20 +02:00
PNEWPOPUP->popup = WLRPOPUP;
2022-04-03 10:32:21 +02:00
PNEWPOPUP->lx = PWINDOW->m_vEffectivePosition.x - PMONITOR->vecPosition.x;
PNEWPOPUP->ly = PWINDOW->m_vEffectivePosition.y - PMONITOR->vecPosition.y;
2022-03-31 21:55:21 +02:00
PNEWPOPUP->parentWindow = PWINDOW;
2022-04-02 13:41:15 +02:00
PNEWPOPUP->monitor = PMONITOR;
2022-03-27 17:25:20 +02:00
createNewPopup(WLRPOPUP, PNEWPOPUP);
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_newPopupFromPopupXDG(void* owner, void* data) {
SXDGPopup* PPOPUP = (SXDGPopup*)owner;
2022-03-21 15:17:04 +01:00
2022-03-31 21:58:33 +02:00
ASSERT(PPOPUP);
if (PPOPUP->parentWindow)
Debug::log(LOG, "New popup created from XDG Window popup %x -> %s", PPOPUP, PPOPUP->parentWindow->m_szTitle.c_str());
else
Debug::log(LOG, "New popup created from Non-Window popup %x", PPOPUP);
2022-03-24 21:34:24 +01:00
2022-03-21 15:17:04 +01:00
const auto WLRPOPUP = (wlr_xdg_popup*)data;
2022-03-27 17:25:20 +02:00
g_pCompositor->m_lXDGPopups.push_back(SXDGPopup());
const auto PNEWPOPUP = &g_pCompositor->m_lXDGPopups.back();
PNEWPOPUP->popup = WLRPOPUP;
PNEWPOPUP->parentPopup = PPOPUP;
PNEWPOPUP->lx = PPOPUP->lx;
PNEWPOPUP->ly = PPOPUP->ly;
2022-03-31 21:58:33 +02:00
PNEWPOPUP->parentWindow = PPOPUP->parentWindow;
2022-04-02 13:41:15 +02:00
PNEWPOPUP->monitor = PPOPUP->monitor;
2022-03-27 17:25:20 +02:00
createNewPopup(WLRPOPUP, PNEWPOPUP);
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_mapPopupXDG(void* owner, void* data) {
SXDGPopup* PPOPUP = (SXDGPopup*)owner;
2022-03-27 17:25:20 +02:00
2022-03-31 21:58:33 +02:00
ASSERT(PPOPUP);
2022-04-02 13:41:15 +02:00
Debug::log(LOG, "New XDG Popup mapped at %d %d", (int)PPOPUP->lx, (int)PPOPUP->ly);
2022-03-27 17:25:20 +02:00
PPOPUP->pSurfaceTree = SubsurfaceTree::createTreeRoot(PPOPUP->popup->base->surface, addPopupGlobalCoords, PPOPUP);
2022-03-28 21:16:23 +02:00
Debug::log(LOG, "XDG Popup got assigned a surfaceTreeNode %x", PPOPUP->pSurfaceTree);
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_unmapPopupXDG(void* owner, void* data) {
SXDGPopup* PPOPUP = (SXDGPopup*)owner;
2022-03-24 21:34:24 +01:00
Debug::log(LOG, "XDG Popup unmapped");
2022-03-27 17:25:20 +02:00
2022-03-31 21:58:33 +02:00
ASSERT(PPOPUP);
2022-03-27 17:25:20 +02:00
SubsurfaceTree::destroySurfaceTree(PPOPUP->pSurfaceTree);
PPOPUP->pSurfaceTree = nullptr;
2022-03-21 15:17:04 +01:00
}
2022-03-28 22:31:39 +02:00
void Events::listener_destroyPopupXDG(void* owner, void* data) {
SXDGPopup* PPOPUP = (SXDGPopup*)owner;
2022-03-21 15:17:04 +01:00
2022-03-31 21:58:33 +02:00
ASSERT(PPOPUP);
2022-03-24 21:34:24 +01:00
Debug::log(LOG, "Destroyed popup XDG %x", PPOPUP);
2022-03-27 17:25:20 +02:00
if (PPOPUP->pSurfaceTree) {
SubsurfaceTree::destroySurfaceTree(PPOPUP->pSurfaceTree);
PPOPUP->pSurfaceTree = nullptr;
}
2022-03-21 15:17:04 +01:00
g_pCompositor->m_lXDGPopups.remove(*PPOPUP);
}