1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Merge pull request #108604 from deralmas/fitting-shenanigans

Wayland: Workaround tooltip issues
This commit is contained in:
Thaddeus Crews
2025-07-15 08:04:27 -05:00
3 changed files with 35 additions and 31 deletions

View File

@@ -4655,26 +4655,28 @@ void EditorHelpBitTooltip::popup_under_cursor() {
vr = window->get_usable_parent_rect();
}
if (r.size.x + r.position.x > vr.size.x + vr.position.x) {
// Place it in the opposite direction. If it fails, just hug the border.
r.position.x = mouse_pos.x - r.size.x - tooltip_offset.x;
if (!DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_SELF_FITTING_WINDOWS) || is_embedded()) {
if (r.size.x + r.position.x > vr.size.x + vr.position.x) {
// Place it in the opposite direction. If it fails, just hug the border.
r.position.x = mouse_pos.x - r.size.x - tooltip_offset.x;
if (r.position.x < vr.position.x) {
r.position.x = vr.position.x + vr.size.x - r.size.x;
if (r.position.x < vr.position.x) {
r.position.x = vr.position.x + vr.size.x - r.size.x;
}
} else if (r.position.x < vr.position.x) {
r.position.x = vr.position.x;
}
} else if (r.position.x < vr.position.x) {
r.position.x = vr.position.x;
}
if (r.size.y + r.position.y > vr.size.y + vr.position.y) {
// Same as above.
r.position.y = mouse_pos.y - r.size.y - tooltip_offset.y;
if (r.size.y + r.position.y > vr.size.y + vr.position.y) {
// Same as above.
r.position.y = mouse_pos.y - r.size.y - tooltip_offset.y;
if (r.position.y < vr.position.y) {
r.position.y = vr.position.y + vr.size.y - r.size.y;
if (r.position.y < vr.position.y) {
r.position.y = vr.position.y + vr.size.y - r.size.y;
}
} else if (r.position.y < vr.position.y) {
r.position.y = vr.position.y;
}
} else if (r.position.y < vr.position.y) {
r.position.y = vr.position.y;
}
// When `FLAG_POPUP` is false, it prevents the editor from losing focus when displaying the tooltip.

View File

@@ -1049,7 +1049,7 @@ void DisplayServerWayland::window_set_drop_files_callback(const Callable &p_call
}
int DisplayServerWayland::window_get_current_screen(DisplayServer::WindowID p_window_id) const {
ERR_FAIL_COND_V(p_window_id != MAIN_WINDOW_ID, INVALID_SCREEN);
ERR_FAIL_COND_V(!windows.has(p_window_id), INVALID_SCREEN);
// Standard Wayland APIs don't support getting the screen of a window.
return 0;
}

View File

@@ -1678,26 +1678,28 @@ void Viewport::_gui_show_tooltip_at(const Point2i &p_pos) {
r.size = r.size.ceil();
r.size = r.size.min(panel->get_max_size());
if (r.size.x + r.position.x > vr.size.x + vr.position.x) {
// Place it in the opposite direction. If it fails, just hug the border.
r.position.x = gui.tooltip_pos.x - r.size.x - tooltip_offset.x;
if (!DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_SELF_FITTING_WINDOWS) || gui.tooltip_popup->is_embedded()) {
if (r.size.x + r.position.x > vr.size.x + vr.position.x) {
// Place it in the opposite direction. If it fails, just hug the border.
r.position.x = gui.tooltip_pos.x - r.size.x - tooltip_offset.x;
if (r.position.x < vr.position.x) {
r.position.x = vr.position.x + vr.size.x - r.size.x;
if (r.position.x < vr.position.x) {
r.position.x = vr.position.x + vr.size.x - r.size.x;
}
} else if (r.position.x < vr.position.x) {
r.position.x = vr.position.x;
}
} else if (r.position.x < vr.position.x) {
r.position.x = vr.position.x;
}
if (r.size.y + r.position.y > vr.size.y + vr.position.y) {
// Same as above.
r.position.y = gui.tooltip_pos.y - r.size.y - tooltip_offset.y;
if (r.size.y + r.position.y > vr.size.y + vr.position.y) {
// Same as above.
r.position.y = gui.tooltip_pos.y - r.size.y - tooltip_offset.y;
if (r.position.y < vr.position.y) {
r.position.y = vr.position.y + vr.size.y - r.size.y;
if (r.position.y < vr.position.y) {
r.position.y = vr.position.y + vr.size.y - r.size.y;
}
} else if (r.position.y < vr.position.y) {
r.position.y = vr.position.y;
}
} else if (r.position.y < vr.position.y) {
r.position.y = vr.position.y;
}
DisplayServer::WindowID active_popup = DisplayServer::get_singleton()->window_get_active_popup();