mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-07 03:50:11 +02:00
Support the older XDND versions 3 and 4
This is needed for Tracktion Waveform and other JUCE based hosts.
This commit is contained in:
@@ -418,7 +418,9 @@ void WineXdndProxy::run_xdnd_loop() {
|
||||
|
||||
last_pointer_x = xdnd_window_query->root_x;
|
||||
last_pointer_y = xdnd_window_query->root_y;
|
||||
if (!is_xdnd_aware(xdnd_window_query->child)) {
|
||||
const std::optional<unsigned char> supported_xdnd_version =
|
||||
is_xdnd_aware(xdnd_window_query->child);
|
||||
if (!supported_xdnd_version) {
|
||||
maybe_leave_last_window();
|
||||
last_xdnd_window.reset();
|
||||
continue;
|
||||
@@ -459,9 +461,14 @@ void WineXdndProxy::run_xdnd_loop() {
|
||||
// `text/plain` we should cover most applications, and this is also
|
||||
// the recommended format for links/paths elsewhere:
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Recommended_drag_types#link
|
||||
send_xdnd_message(xdnd_window_query->child, xcb_xdnd_enter_message,
|
||||
5 << 24, xcb_mime_text_uri_list,
|
||||
xcb_mime_text_plain, XCB_NONE);
|
||||
// NOTE: In theory everything should support XDND version 5 since
|
||||
// the spec dates from 2002, but JUCE only supports version 3.
|
||||
// We'll just pretend no other changes are required.
|
||||
send_xdnd_message(
|
||||
xdnd_window_query->child, xcb_xdnd_enter_message,
|
||||
std::clamp(static_cast<int>(*supported_xdnd_version), 3, 5)
|
||||
<< 24,
|
||||
xcb_mime_text_uri_list, xcb_mime_text_plain, XCB_NONE);
|
||||
}
|
||||
|
||||
// When the pointer is being moved inside of a window, we should
|
||||
@@ -610,7 +617,8 @@ WineXdndProxy::query_xdnd_aware_window_at_pointer(
|
||||
return query_pointer_reply;
|
||||
}
|
||||
|
||||
bool WineXdndProxy::is_xdnd_aware(xcb_window_t window) const noexcept {
|
||||
std::optional<uint8_t> WineXdndProxy::is_xdnd_aware(
|
||||
xcb_window_t window) const noexcept {
|
||||
// Respect `XdndProxy`, if that's set
|
||||
window = get_xdnd_proxy(window).value_or(window);
|
||||
|
||||
@@ -627,9 +635,12 @@ bool WineXdndProxy::is_xdnd_aware(xcb_window_t window) const noexcept {
|
||||
|
||||
// Since the spec dates from 2002, we won't even bother checking the
|
||||
// supported version
|
||||
return property_reply->type != XCB_NONE &&
|
||||
*static_cast<xcb_atom_t*>(
|
||||
xcb_get_property_value(property_reply.get())) != 0;
|
||||
if (property_reply->type == XCB_NONE) {
|
||||
return std::nullopt;
|
||||
} else {
|
||||
return *static_cast<xcb_atom_t*>(
|
||||
xcb_get_property_value(property_reply.get()));
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<xcb_window_t> WineXdndProxy::get_xdnd_proxy(
|
||||
|
||||
@@ -182,12 +182,12 @@ class WineXdndProxy {
|
||||
query_xdnd_aware_window_at_pointer(xcb_window_t window) const noexcept;
|
||||
|
||||
/**
|
||||
* Check whether a window is XDND-aware, respecting `XdndProxy`. We should
|
||||
* be checking the supported version as well and change our handling
|
||||
* accordingly, but the XDND spec was last updated in 2002 so we'll just
|
||||
* assume this won't cause any issues.
|
||||
* Check whether a window is XDND-aware, respecting `XdndProxy`. This will
|
||||
* return the supported XDND version. In theory we could just assume that
|
||||
* everything supports version 5 of the spec since that came out in 20020,
|
||||
* but for some reason JUCE only supports version 3 from 1998.
|
||||
*/
|
||||
bool is_xdnd_aware(xcb_window_t window) const noexcept;
|
||||
std::optional<uint8_t> is_xdnd_aware(xcb_window_t window) const noexcept;
|
||||
|
||||
/**
|
||||
* Return the XDND proxy window for `window` as specified in the `XdndProxy`
|
||||
|
||||
Reference in New Issue
Block a user