internal: Protocol C++ Wraps + XDGOutput impl (#2733)

move to our own xdgoutput impl instead of wlr's
This commit is contained in:
Vaxry 2023-07-18 15:30:28 +02:00 committed by GitHub
parent 629e61c7a5
commit 8370a7fcc4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 284 additions and 88 deletions

View file

@ -1,9 +1,13 @@
#include "ProtocolManager.hpp"
#include "xdg-output-unstable-v1-protocol.h"
CProtocolManager::CProtocolManager() {
m_pToplevelExportProtocolManager = std::make_unique<CToplevelExportProtocolManager>();
m_pFractionalScaleProtocolManager = std::make_unique<CFractionalScaleProtocolManager>();
m_pTextInputV1ProtocolManager = std::make_unique<CTextInputV1ProtocolManager>();
m_pGlobalShortcutsProtocolManager = std::make_unique<CGlobalShortcutsProtocolManager>();
m_pScreencopyProtocolManager = std::make_unique<CScreencopyProtocolManager>();
}
m_pXDGOutputProtocol = std::make_unique<CXDGOutputProtocol>(&zxdg_output_manager_v1_interface, 3, "XDGOutput");
}

View file

@ -6,16 +6,21 @@
#include "../protocols/TextInputV1.hpp"
#include "../protocols/GlobalShortcuts.hpp"
#include "../protocols/Screencopy.hpp"
#include "../protocols/XDGOutput.hpp"
class CProtocolManager {
public:
CProtocolManager();
// TODO: rewrite to use the new protocol framework
std::unique_ptr<CToplevelExportProtocolManager> m_pToplevelExportProtocolManager;
std::unique_ptr<CFractionalScaleProtocolManager> m_pFractionalScaleProtocolManager;
std::unique_ptr<CTextInputV1ProtocolManager> m_pTextInputV1ProtocolManager;
std::unique_ptr<CGlobalShortcutsProtocolManager> m_pGlobalShortcutsProtocolManager;
std::unique_ptr<CScreencopyProtocolManager> m_pScreencopyProtocolManager;
// New protocols
std::unique_ptr<CXDGOutputProtocol> m_pXDGOutputProtocol;
};
inline std::unique_ptr<CProtocolManager> g_pProtocolManager;

View file

@ -295,73 +295,4 @@ Vector2D CHyprXWaylandManager::getMaxSizeForWindow(CWindow* pWindow) {
MAXSIZE.y = 99999;
return MAXSIZE;
}
void CHyprXWaylandManager::updateXWaylandScale() {
static auto* const PXWLFORCESCALEZERO = &g_pConfigManager->getConfigValuePtr("xwayland:force_zero_scaling")->intValue;
setXWaylandScale(*PXWLFORCESCALEZERO ? std::optional<double>{1.0} : std::optional<double>{});
}
void CHyprXWaylandManager::setXWaylandScale(std::optional<double> scale) {
Debug::log(LOG, "Overriding XWayland scale with %.2f", (float)scale.value_or(0.0));
#ifndef NO_XWAYLAND
wl_resource* res = nullptr;
for (auto& m : g_pCompositor->m_vMonitors) {
if (!m->output || !m->m_bEnabled)
continue;
const Vector2D LOGICALSIZE = m->vecTransformedSize / scale.value_or(m->scale);
wl_resource* outputResource = nullptr;
bool needsDone = false;
wl_list_for_each(res, &m->output->resources, link) {
const auto PCLIENT = wl_resource_get_client(res);
if (PCLIENT == m_sWLRXWayland->server->client) {
const auto VERSION = wl_resource_get_version(res);
wl_output_send_mode(res, WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED, (int32_t)LOGICALSIZE.x, (int32_t)LOGICALSIZE.y, m->output->refresh);
if (VERSION >= WL_OUTPUT_SCALE_SINCE_VERSION)
wl_output_send_scale(res, (uint32_t)ceil(scale.value_or(m->scale)));
wl_output_send_name(res, getFormat("HL-X11-%d", m->ID).c_str());
outputResource = res;
needsDone = true;
break;
}
}
wlr_xdg_output_v1* output;
wl_list_for_each(output, &g_pCompositor->m_sWLRXDGOutputMgr->outputs, link) {
if (output->layout_output->output == m->output) {
wl_list_for_each(res, &output->resources, link) {
const auto PCLIENT = wl_resource_get_client(res);
if (PCLIENT == m_sWLRXWayland->server->client) {
zxdg_output_v1_send_logical_size(res, LOGICALSIZE.x, LOGICALSIZE.y);
if (wl_resource_get_version(res) < OUTPUT_DONE_DEPRECATED_SINCE_VERSION)
zxdg_output_v1_send_done(res);
needsDone = true;
break;
}
}
break;
}
}
if (needsDone && outputResource)
wl_output_send_done(outputResource);
}
#endif
}
}

View file

@ -26,10 +26,6 @@ class CHyprXWaylandManager {
void moveXWaylandWindow(CWindow*, const Vector2D&);
void checkBorders(CWindow*);
Vector2D getMaxSizeForWindow(CWindow*);
void updateXWaylandScale();
private:
void setXWaylandScale(std::optional<double> scale);
};
inline std::unique_ptr<CHyprXWaylandManager> g_pXWaylandManager;