diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2022-12-12 14:56:42 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-12 14:56:42 +0000 |
| commit | 111d209bff5448c3a55e07f344cf89715536bba4 (patch) | |
| tree | 4b21cff5e0e3a52eac48b9b8fb39b50b0c4c9417 /src/protocols/ToplevelExport.cpp | |
| parent | b45a2134135d6d6269ba374372c93361c799d6b8 (diff) | |
Added toplevel handle sharing Rev2 (#1203)
* Added toplevel handle sharing
* nix: fix build
* update hyprland-protocols
Co-authored-by: Mihai Fufezan <fufexan@protonmail.com>
Diffstat (limited to 'src/protocols/ToplevelExport.cpp')
| -rw-r--r-- | src/protocols/ToplevelExport.cpp | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index d7e49ab0..e579e1a7 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -6,7 +6,7 @@ #include "ToplevelExportWlrFuncs.hpp" -#define TOPLEVEL_EXPORT_VERSION 1 +#define TOPLEVEL_EXPORT_VERSION 2 static void bindManagerInt(wl_client* client, void* data, uint32_t version, uint32_t id) { g_pProtocolManager->m_pToplevelExportProtocolManager->bindManager(client, data, version, id); @@ -41,8 +41,17 @@ CToplevelExportProtocolManager::CToplevelExportProtocolManager() { Debug::log(LOG, "ToplevelExportManager started successfully!"); } +wlr_foreign_toplevel_handle_v1* zwlrHandleFromResource(wl_resource* resource) { + // we can't assert here, but it doesnt matter. + return (wlr_foreign_toplevel_handle_v1*)wl_resource_get_user_data(resource); +} + void handleCaptureToplevel(wl_client* client, wl_resource* resource, uint32_t frame, int32_t overlay_cursor, uint32_t handle) { - g_pProtocolManager->m_pToplevelExportProtocolManager->captureToplevel(client, resource, frame, overlay_cursor, handle); + g_pProtocolManager->m_pToplevelExportProtocolManager->captureToplevel(client, resource, frame, overlay_cursor, g_pCompositor->getWindowFromHandle(handle)); +} + +void handleCaptureToplevelWithWlr(wl_client* client, wl_resource* resource, uint32_t frame, int32_t overlay_cursor, wl_resource* handle) { + g_pProtocolManager->m_pToplevelExportProtocolManager->captureToplevel(client, resource, frame, overlay_cursor, g_pCompositor->getWindowFromZWLRHandle(handle)); } void handleDestroy(wl_client* client, wl_resource* resource) { @@ -59,7 +68,8 @@ void handleDestroyFrame(wl_client* client, wl_resource* resource) { static const struct hyprland_toplevel_export_manager_v1_interface toplevelExportManagerImpl = { .capture_toplevel = handleCaptureToplevel, - .destroy = handleDestroy + .destroy = handleDestroy, + .capture_toplevel_with_wlr_toplevel_handle = handleCaptureToplevelWithWlr, }; static const struct hyprland_toplevel_export_frame_v1_interface toplevelFrameImpl = { @@ -133,26 +143,24 @@ void CToplevelExportProtocolManager::removeFrame(SToplevelFrame* frame, bool for m_lFrames.remove(*frame); } -void CToplevelExportProtocolManager::captureToplevel(wl_client* client, wl_resource* resource, uint32_t frame, int32_t overlay_cursor, uint32_t handle) { +void CToplevelExportProtocolManager::captureToplevel(wl_client* client, wl_resource* resource, uint32_t frame, int32_t overlay_cursor, CWindow* pWindow) { const auto PCLIENT = clientFromResource(resource); - const auto PWINDOW = g_pCompositor->getWindowFromHandle(handle); - // create a frame const auto PFRAME = &m_lFrames.emplace_back(); PFRAME->overlayCursor = !!overlay_cursor; PFRAME->resource = wl_resource_create(client, &hyprland_toplevel_export_frame_v1_interface, wl_resource_get_version(resource), frame); - PFRAME->pWindow = PWINDOW; + PFRAME->pWindow = pWindow; - if (!PWINDOW) { - Debug::log(ERR, "Client requested sharing of window handle %x which does not exist!", handle); + if (!PFRAME->pWindow) { + Debug::log(ERR, "Client requested sharing of window handle %x which does not exist!", PFRAME->pWindow); hyprland_toplevel_export_frame_v1_send_failed(PFRAME->resource); removeFrame(PFRAME); return; } - if (!PWINDOW->m_bIsMapped || PWINDOW->isHidden()) { - Debug::log(ERR, "Client requested sharing of window handle %x which is not shareable!", handle); + if (!PFRAME->pWindow->m_bIsMapped || PFRAME->pWindow->isHidden()) { + Debug::log(ERR, "Client requested sharing of window handle %x which is not shareable!", PFRAME->pWindow); hyprland_toplevel_export_frame_v1_send_failed(PFRAME->resource); removeFrame(PFRAME); return; @@ -170,7 +178,7 @@ void CToplevelExportProtocolManager::captureToplevel(wl_client* client, wl_resou PFRAME->client = PCLIENT; PCLIENT->ref++; - const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID); + const auto PMONITOR = g_pCompositor->getMonitorFromID(PFRAME->pWindow->m_iMonitorID); PFRAME->shmFormat = wlr_output_preferred_read_format(PMONITOR->output); if (PFRAME->shmFormat == DRM_FORMAT_INVALID) { @@ -194,7 +202,7 @@ void CToplevelExportProtocolManager::captureToplevel(wl_client* client, wl_resou PFRAME->dmabufFormat = DRM_FORMAT_INVALID; } - PFRAME->box = { 0, 0, (int)(PWINDOW->m_vRealSize.vec().x * PMONITOR->scale), (int)(PWINDOW->m_vRealSize.vec().y * PMONITOR->scale) }; + PFRAME->box = { 0, 0, (int)(PFRAME->pWindow->m_vRealSize.vec().x * PMONITOR->scale), (int)(PFRAME->pWindow->m_vRealSize.vec().y * PMONITOR->scale) }; int ow, oh; wlr_output_effective_resolution(PMONITOR->output, &ow, &oh); wlr_box_transform(&PFRAME->box, &PFRAME->box, PMONITOR->transform, ow, oh); |
