Skip to content

Commit 5e77d93

Browse files
committed
Merge pull request #98194 from bruvzg/fd_parent
Improve native file dialog parent window selection.
2 parents 490854e + 3e4e6e6 commit 5e77d93

18 files changed

+330
-241
lines changed

doc/classes/DisplayServer.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
<param index="4" name="mode" type="int" enum="DisplayServer.FileDialogMode" />
144144
<param index="5" name="filters" type="PackedStringArray" />
145145
<param index="6" name="callback" type="Callable" />
146+
<param index="7" name="parent_window_id" type="int" default="0" />
146147
<description>
147148
Displays OS native dialog for selecting files or directories in the file system.
148149
Each filter string in the [param filters] array should be formatted like this: [code]*.png,*.jpg,*.jpeg;Image Files;image/png,image/jpeg[/code]. The description text of the filter is optional and can be omitted. It is recommended to set both file extension and MIME type. See also [member FileDialog.filters].
@@ -166,6 +167,7 @@
166167
<param index="6" name="filters" type="PackedStringArray" />
167168
<param index="7" name="options" type="Dictionary[]" />
168169
<param index="8" name="callback" type="Callable" />
170+
<param index="9" name="parent_window_id" type="int" default="0" />
169171
<description>
170172
Displays OS native dialog for selecting files or directories in the file system with additional user selectable options.
171173
Each filter string in the [param filters] array should be formatted like this: [code]*.png,*.jpg,*.jpeg;Image Files;image/png,image/jpeg[/code]. The description text of the filter is optional and can be omitted. It is recommended to set both file extension and MIME type. See also [member FileDialog.filters].

editor/gui/editor_file_dialog.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,15 @@ void EditorFileDialog::_native_popup() {
6565
} else if (access == ACCESS_USERDATA) {
6666
root = OS::get_singleton()->get_user_data_dir();
6767
}
68-
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), processed_filters, _get_options(), callable_mp(this, &EditorFileDialog::_native_dialog_cb));
68+
69+
// Attach native file dialog to first persistent parent window.
70+
Window *w = (is_transient() || is_transient_to_focused()) ? get_parent_visible_window() : nullptr;
71+
while (w && w->get_flag(FLAG_POPUP) && w->get_parent_visible_window()) {
72+
w = w->get_parent_visible_window();
73+
}
74+
DisplayServer::WindowID wid = w ? w->get_window_id() : DisplayServer::INVALID_WINDOW_ID;
75+
76+
DisplayServer::get_singleton()->file_dialog_with_options_show(get_translated_title(), ProjectSettings::get_singleton()->globalize_path(dir->get_text()), root, file->get_text().get_file(), show_hidden_files, DisplayServer::FileDialogMode(mode), processed_filters, _get_options(), callable_mp(this, &EditorFileDialog::_native_dialog_cb), wid);
6977
}
7078

7179
void EditorFileDialog::popup(const Rect2i &p_rect) {

misc/extension_api_validation/4.4-stable.expected

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,10 @@ should instead be used to justify these changes and describe how users should wo
77
Add new entries at the end of the file.
88

99
## Changes between 4.4-stable and 4.5-stable
10+
11+
GH-98194
12+
--------
13+
Validate extension JSON: Error: Field 'classes/DisplayServer/methods/file_dialog_show/arguments': size changed value in new API, from 7 to 8.
14+
Validate extension JSON: Error: Field 'classes/DisplayServer/methods/file_dialog_with_options_show/arguments': size changed value in new API, from 9 to 10.
15+
16+
Optional argument added. Compatibility methods registered.

platform/android/display_server_android.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void DisplayServerAndroid::emit_input_dialog_callback(String p_text) {
204204
}
205205
}
206206

207-
Error DisplayServerAndroid::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) {
207+
Error DisplayServerAndroid::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) {
208208
GodotJavaWrapper *godot_java = OS_Android::get_singleton()->get_godot_java();
209209
ERR_FAIL_NULL_V(godot_java, FAILED);
210210
file_picker_callback = p_callback;

platform/android/display_server_android.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class DisplayServerAndroid : public DisplayServer {
131131
virtual Error dialog_input_text(String p_title, String p_description, String p_partial, const Callable &p_callback) override;
132132
void emit_input_dialog_callback(String p_text);
133133

134-
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, const FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) override;
134+
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, const FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) override;
135135
void emit_file_picker_callback(bool p_ok, const Vector<String> &p_selected_paths);
136136

137137
virtual Color get_accent_color() const override;

platform/linuxbsd/wayland/display_server_wayland.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,15 +306,15 @@ void DisplayServerWayland::set_system_theme_change_callback(const Callable &p_ca
306306
portal_desktop->set_system_theme_change_callback(p_callable);
307307
}
308308

309-
Error DisplayServerWayland::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) {
309+
Error DisplayServerWayland::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) {
310310
WindowID window_id = MAIN_WINDOW_ID;
311311
// TODO: Use window IDs for multiwindow support.
312312

313313
WaylandThread::WindowState *ws = wayland_thread.wl_surface_get_window_state(wayland_thread.window_get_wl_surface(window_id));
314314
return portal_desktop->file_dialog_show(window_id, (ws ? ws->exported_handle : String()), p_title, p_current_directory, String(), p_filename, p_mode, p_filters, TypedArray<Dictionary>(), p_callback, false);
315315
}
316316

317-
Error DisplayServerWayland::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback) {
317+
Error DisplayServerWayland::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) {
318318
WindowID window_id = MAIN_WINDOW_ID;
319319
// TODO: Use window IDs for multiwindow support.
320320

platform/linuxbsd/wayland/display_server_wayland.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ class DisplayServerWayland : public DisplayServer {
187187
virtual bool is_dark_mode() const override;
188188
virtual void set_system_theme_change_callback(const Callable &p_callable) override;
189189

190-
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) override;
191-
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback) override;
190+
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) override;
191+
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) override;
192192
#endif
193193

194194
virtual void beep() const override;

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -402,26 +402,26 @@ void DisplayServerX11::set_system_theme_change_callback(const Callable &p_callab
402402
portal_desktop->set_system_theme_change_callback(p_callable);
403403
}
404404

405-
Error DisplayServerX11::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) {
406-
WindowID window_id = last_focused_window;
405+
Error DisplayServerX11::file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) {
406+
WindowID window_id = p_window_id;
407407

408-
if (!windows.has(window_id)) {
408+
if (!windows.has(window_id) && !windows[window_id].is_popup) {
409409
window_id = MAIN_WINDOW_ID;
410410
}
411411

412412
String xid = vformat("x11:%x", (uint64_t)windows[window_id].x11_window);
413-
return portal_desktop->file_dialog_show(last_focused_window, xid, p_title, p_current_directory, String(), p_filename, p_mode, p_filters, TypedArray<Dictionary>(), p_callback, false);
413+
return portal_desktop->file_dialog_show(p_window_id, xid, p_title, p_current_directory, String(), p_filename, p_mode, p_filters, TypedArray<Dictionary>(), p_callback, false);
414414
}
415415

416-
Error DisplayServerX11::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback) {
417-
WindowID window_id = last_focused_window;
416+
Error DisplayServerX11::file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) {
417+
WindowID window_id = p_window_id;
418418

419-
if (!windows.has(window_id)) {
419+
if (!windows.has(window_id) && !windows[window_id].is_popup) {
420420
window_id = MAIN_WINDOW_ID;
421421
}
422422

423423
String xid = vformat("x11:%x", (uint64_t)windows[window_id].x11_window);
424-
return portal_desktop->file_dialog_show(last_focused_window, xid, p_title, p_current_directory, p_root, p_filename, p_mode, p_filters, p_options, p_callback, true);
424+
return portal_desktop->file_dialog_show(p_window_id, xid, p_title, p_current_directory, p_root, p_filename, p_mode, p_filters, p_options, p_callback, true);
425425
}
426426

427427
#endif

platform/linuxbsd/x11/display_server_x11.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,8 @@ class DisplayServerX11 : public DisplayServer {
422422
virtual bool is_dark_mode() const override;
423423
virtual void set_system_theme_change_callback(const Callable &p_callable) override;
424424

425-
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) override;
426-
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback) override;
425+
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) override;
426+
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) override;
427427
#endif
428428

429429
virtual void beep() const override;

platform/macos/display_server_macos.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class DisplayServerMacOS : public DisplayServer {
236236

237237
static NSCursor *_cursor_from_selector(SEL p_selector, SEL p_fallback = nil);
238238

239-
Error _file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, bool p_options_in_cb);
239+
Error _file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, bool p_options_in_cb, WindowID p_window_id);
240240

241241
public:
242242
void menu_callback(id p_sender);
@@ -303,8 +303,8 @@ class DisplayServerMacOS : public DisplayServer {
303303
virtual Error dialog_show(String p_title, String p_description, Vector<String> p_buttons, const Callable &p_callback) override;
304304
virtual Error dialog_input_text(String p_title, String p_description, String p_partial, const Callable &p_callback) override;
305305

306-
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) override;
307-
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback) override;
306+
virtual Error file_dialog_show(const String &p_title, const String &p_current_directory, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback, WindowID p_window_id) override;
307+
virtual Error file_dialog_with_options_show(const String &p_title, const String &p_current_directory, const String &p_root, const String &p_filename, bool p_show_hidden, FileDialogMode p_mode, const Vector<String> &p_filters, const TypedArray<Dictionary> &p_options, const Callable &p_callback, WindowID p_window_id) override;
308308

309309
virtual void beep() const override;
310310

0 commit comments

Comments
 (0)