Work around wrong offset in plugin windows

This commit is contained in:
Jakob Steltner
2026-01-03 23:06:36 +01:00
committed by Robbert van der Helm
parent cca3189855
commit 44d047e9e2
2 changed files with 31 additions and 1 deletions
+26 -1
View File
@@ -417,6 +417,27 @@ void Editor::show() noexcept {
ShowWindow(win32_window_.handle_, SW_SHOWNORMAL); ShowWindow(win32_window_.handle_, SW_SHOWNORMAL);
} }
std::array<int16_t, 2> Editor::get_parent_window_offset() {
xcb_generic_error_t* error = nullptr;
const xcb_window_t root =
get_root_window(*x11_connection_, parent_window_);
const xcb_translate_coordinates_cookie_t coord_cookie =
xcb_translate_coordinates(x11_connection_.get(), parent_window_, root, 0, 0);
const std::unique_ptr<xcb_translate_coordinates_reply_t> coord_reply(
xcb_translate_coordinates_reply(x11_connection_.get(), coord_cookie, &error));
THROW_X11_ERROR(error);
logger_.log_editor_trace([&]() {
return "DEBUG: Parent window offset " +
std::to_string(coord_reply->dst_x) +
"x" +
std::to_string(coord_reply->dst_y);
});
return {coord_reply->dst_x, coord_reply->dst_y};
}
void Editor::handle_x11_events() noexcept { void Editor::handle_x11_events() noexcept {
// NOTE: Ardour will unmap the window instead of closing the editor. When // NOTE: Ardour will unmap the window instead of closing the editor. When
// the window is unmapped `wine_window_` doesn't exist and any X11 // the window is unmapped `wine_window_` doesn't exist and any X11
@@ -454,7 +475,6 @@ void Editor::handle_x11_events() noexcept {
", generated from " + ", generated from " +
std::to_string(event->event); std::to_string(event->event);
}); });
redetect_host_window(); redetect_host_window();
// If the `editor_force_dnd` option is set, we'll strip // If the `editor_force_dnd` option is set, we'll strip
@@ -560,6 +580,11 @@ void Editor::handle_x11_events() noexcept {
translated_event.x += host_window_config_.x; translated_event.x += host_window_config_.x;
translated_event.y += host_window_config_.y; translated_event.y += host_window_config_.y;
} }
if (!is_synthetic_event) {
const std::array<int16_t, 2> offset = get_parent_window_offset();
translated_event.x = offset[0];
translated_event.y = offset[1];
}
logger_.log_editor_trace([&]() { logger_.log_editor_trace([&]() {
return "DEBUG: Translated coords: " + return "DEBUG: Translated coords: " +
std::to_string(translated_event.window) + std::to_string(translated_event.window) +
+5
View File
@@ -311,6 +311,11 @@ class Editor {
*/ */
void redetect_host_window() noexcept; void redetect_host_window() noexcept;
/**
* Get offset of parent window to fix mouse coordinates.
*/
std::array<int16_t, 2> get_parent_window_offset();
/** /**
* Reparent `child` to `new_parent`. This includes the flush. * Reparent `child` to `new_parent`. This includes the flush.
*/ */