protocols: allow xdg share pickers to reconcile with hyprctl

This commit is contained in:
Aetherall 2025-01-03 16:35:35 +01:00
parent b0cd9972e8
commit d4c5be7fd0
4 changed files with 21 additions and 2 deletions

View file

@ -1145,6 +1145,12 @@ inline static const std::vector<SConfigOptionDescription> CONFIG_OPTIONS = {
.type = CONFIG_OPTION_INT, .type = CONFIG_OPTION_INT,
.data = SConfigOptionDescription::SRangeData{1000, 0, 5000}, .data = SConfigOptionDescription::SRangeData{1000, 0, 5000},
}, },
SConfigOptionDescription{
.value = "misc:xdg_portal_window_address_forwarding",
.description = "forwards the window address in the title of the xdg portal window.",
.type = CONFIG_OPTION_BOOL,
.data = SConfigOptionDescription::SBoolData{false},
},
/* /*
* binds: * binds:

View file

@ -389,6 +389,7 @@ CConfigManager::CConfigManager() {
m_pConfig->addConfigValue("misc:disable_xdg_env_checks", Hyprlang::INT{0}); m_pConfig->addConfigValue("misc:disable_xdg_env_checks", Hyprlang::INT{0});
m_pConfig->addConfigValue("misc:disable_hyprland_qtutils_check", Hyprlang::INT{0}); m_pConfig->addConfigValue("misc:disable_hyprland_qtutils_check", Hyprlang::INT{0});
m_pConfig->addConfigValue("misc:lockdead_screen_delay", Hyprlang::INT{1000}); m_pConfig->addConfigValue("misc:lockdead_screen_delay", Hyprlang::INT{1000});
m_pConfig->addConfigValue("misc:xdg_portal_window_address_forwarding", Hyprlang::INT{0});
m_pConfig->addConfigValue("group:insert_after_current", Hyprlang::INT{1}); m_pConfig->addConfigValue("group:insert_after_current", Hyprlang::INT{1});
m_pConfig->addConfigValue("group:focus_removed_window", Hyprlang::INT{1}); m_pConfig->addConfigValue("group:focus_removed_window", Hyprlang::INT{1});

View file

@ -1,6 +1,7 @@
#include "ForeignToplevelWlr.hpp" #include "ForeignToplevelWlr.hpp"
#include <algorithm> #include <algorithm>
#include "../Compositor.hpp" #include "../Compositor.hpp"
#include "../config/ConfigValue.hpp"
#include "protocols/core/Output.hpp" #include "protocols/core/Output.hpp"
#include "render/Renderer.hpp" #include "render/Renderer.hpp"
@ -204,9 +205,11 @@ void CForeignToplevelWlrManager::onMap(PHLWINDOW pWindow) {
} }
LOGM(LOG, "Newly mapped window {:016x}", (uintptr_t)pWindow.get()); LOGM(LOG, "Newly mapped window {:016x}", (uintptr_t)pWindow.get());
resource->sendToplevel(NEWHANDLE->resource.get()); resource->sendToplevel(NEWHANDLE->resource.get());
NEWHANDLE->resource->sendAppId(pWindow->m_szClass.c_str()); NEWHANDLE->resource->sendAppId(pWindow->m_szClass.c_str());
NEWHANDLE->resource->sendTitle(pWindow->m_szTitle.c_str()); NEWHANDLE->resource->sendTitle(getWindowTitle(pWindow).c_str());
if (const auto PMONITOR = pWindow->m_pMonitor.lock(); PMONITOR) if (const auto PMONITOR = pWindow->m_pMonitor.lock(); PMONITOR)
NEWHANDLE->sendMonitor(PMONITOR); NEWHANDLE->sendMonitor(PMONITOR);
NEWHANDLE->sendState(); NEWHANDLE->sendState();
@ -229,7 +232,7 @@ void CForeignToplevelWlrManager::onTitle(PHLWINDOW pWindow) {
if (!H || H->closed) if (!H || H->closed)
return; return;
H->resource->sendTitle(pWindow->m_szTitle.c_str()); H->resource->sendTitle(getWindowTitle(pWindow).c_str());
H->resource->sendDone(); H->resource->sendDone();
} }
@ -310,6 +313,14 @@ bool CForeignToplevelWlrManager::good() {
return resource->resource(); return resource->resource();
} }
std::string CForeignToplevelWlrManager::getWindowTitle(PHLWINDOW pWindow) {
// forward window address so xdg-portal custom pickers can reconcile with hyprctl
if (*CConfigValue<Hyprlang::INT>("misc:xdg_portal_window_address_forwarding"))
return std::format("0x{:x} {}", (uintptr_t)pWindow.get(), pWindow->m_szTitle);
return pWindow->m_szTitle;
}
CForeignToplevelWlrProtocol::CForeignToplevelWlrProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) { CForeignToplevelWlrProtocol::CForeignToplevelWlrProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
static auto P = g_pHookSystem->hookDynamic("openWindow", [this](void* self, SCallbackInfo& info, std::any data) { static auto P = g_pHookSystem->hookDynamic("openWindow", [this](void* self, SCallbackInfo& info, std::any data) {
const auto PWINDOW = std::any_cast<PHLWINDOW>(data); const auto PWINDOW = std::any_cast<PHLWINDOW>(data);

View file

@ -48,6 +48,7 @@ class CForeignToplevelWlrManager {
PHLWINDOWREF lastFocus; // READ-ONLY PHLWINDOWREF lastFocus; // READ-ONLY
SP<CForeignToplevelHandleWlr> handleForWindow(PHLWINDOW pWindow); SP<CForeignToplevelHandleWlr> handleForWindow(PHLWINDOW pWindow);
std::string getWindowTitle(PHLWINDOW pWindow);
std::vector<WP<CForeignToplevelHandleWlr>> handles; std::vector<WP<CForeignToplevelHandleWlr>> handles;
}; };