Merge pull request #80952 from bruvzg/nfdlg_refocus
[Native File Dialogs] Refocus last focused window on close.
This commit is contained in:
commit
31dbbc2c5a
5 changed files with 22 additions and 4 deletions
|
@ -266,7 +266,7 @@ bool FreeDesktopPortalDesktop::file_chooser_parse_response(DBusMessageIter *p_it
|
|||
return true;
|
||||
}
|
||||
|
||||
Error FreeDesktopPortalDesktop::file_dialog_show(const String &p_xid, const String &p_title, const String &p_current_directory, const String &p_filename, DisplayServer::FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) {
|
||||
Error FreeDesktopPortalDesktop::file_dialog_show(DisplayServer::WindowID p_window_id, const String &p_xid, const String &p_title, const String &p_current_directory, const String &p_filename, DisplayServer::FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback) {
|
||||
if (unsupported) {
|
||||
return FAILED;
|
||||
}
|
||||
|
@ -277,6 +277,7 @@ Error FreeDesktopPortalDesktop::file_dialog_show(const String &p_xid, const Stri
|
|||
// Open connection and add signal handler.
|
||||
FileDialogData fd;
|
||||
fd.callback = p_callback;
|
||||
fd.prev_focus = p_window_id;
|
||||
|
||||
CryptoCore::RandomGenerator rng;
|
||||
ERR_FAIL_COND_V_MSG(rng.init(), FAILED, "Failed to initialize random number generator.");
|
||||
|
@ -416,6 +417,9 @@ void FreeDesktopPortalDesktop::_thread_file_dialog_monitor(void *p_ud) {
|
|||
Variant *v_args[2] = { &v_status, &v_files };
|
||||
fd.callback.call_deferredp((const Variant **)&v_args, 2);
|
||||
}
|
||||
if (fd.prev_focus != DisplayServer::INVALID_WINDOW_ID) {
|
||||
callable_mp(DisplayServer::get_singleton(), &DisplayServer::window_move_to_foreground).call_deferred(fd.prev_focus);
|
||||
}
|
||||
}
|
||||
dbus_message_unref(msg);
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ private:
|
|||
|
||||
struct FileDialogData {
|
||||
DBusConnection *connection = nullptr;
|
||||
DisplayServer::WindowID prev_focus = DisplayServer::INVALID_WINDOW_ID;
|
||||
Callable callback;
|
||||
String path;
|
||||
};
|
||||
|
@ -73,7 +74,7 @@ public:
|
|||
|
||||
bool is_supported() { return !unsupported; }
|
||||
|
||||
Error file_dialog_show(const String &p_xid, const String &p_title, const String &p_current_directory, const String &p_filename, DisplayServer::FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback);
|
||||
Error file_dialog_show(DisplayServer::WindowID p_window_id, const String &p_xid, const String &p_title, const String &p_current_directory, const String &p_filename, DisplayServer::FileDialogMode p_mode, const Vector<String> &p_filters, const Callable &p_callback);
|
||||
|
||||
// Retrieve the system's preferred color scheme.
|
||||
// 0: No preference or unknown.
|
||||
|
|
|
@ -364,14 +364,14 @@ bool DisplayServerX11::is_dark_mode() const {
|
|||
}
|
||||
|
||||
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 window_id = _get_focused_window_or_popup();
|
||||
WindowID window_id = last_focused_window;
|
||||
|
||||
if (!windows.has(window_id)) {
|
||||
window_id = MAIN_WINDOW_ID;
|
||||
}
|
||||
|
||||
String xid = vformat("x11:%x", (uint64_t)windows[window_id].x11_window);
|
||||
return portal_desktop->file_dialog_show(xid, p_title, p_current_directory, p_filename, p_mode, p_filters, p_callback);
|
||||
return portal_desktop->file_dialog_show(last_focused_window, xid, p_title, p_current_directory, p_filename, p_mode, p_filters, p_callback);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1887,6 +1887,8 @@ Error DisplayServerMacOS::file_dialog_show(const String &p_title, const String &
|
|||
}
|
||||
}
|
||||
|
||||
WindowID prev_focus = last_focused_window;
|
||||
|
||||
Callable callback = p_callback; // Make a copy for async completion handler.
|
||||
switch (p_mode) {
|
||||
case FILE_DIALOG_MODE_SAVE_FILE: {
|
||||
|
@ -1954,6 +1956,9 @@ Error DisplayServerMacOS::file_dialog_show(const String &p_title, const String &
|
|||
callback.callp((const Variant **)&v_args, 2, ret, ce);
|
||||
}
|
||||
}
|
||||
if (prev_focus != INVALID_WINDOW_ID) {
|
||||
callable_mp(DisplayServer::get_singleton(), &DisplayServer::window_move_to_foreground).call_deferred(prev_focus);
|
||||
}
|
||||
}];
|
||||
} break;
|
||||
case FILE_DIALOG_MODE_OPEN_ANY:
|
||||
|
@ -2033,6 +2038,9 @@ Error DisplayServerMacOS::file_dialog_show(const String &p_title, const String &
|
|||
callback.callp((const Variant **)&v_args, 2, ret, ce);
|
||||
}
|
||||
}
|
||||
if (prev_focus != INVALID_WINDOW_ID) {
|
||||
callable_mp(DisplayServer::get_singleton(), &DisplayServer::window_move_to_foreground).call_deferred(prev_focus);
|
||||
}
|
||||
}];
|
||||
} break;
|
||||
}
|
||||
|
|
|
@ -240,6 +240,8 @@ Error DisplayServerWindows::file_dialog_show(const String &p_title, const String
|
|||
filters.push_back({ (LPCWSTR)filter_names[i].ptr(), (LPCWSTR)filter_exts[i].ptr() });
|
||||
}
|
||||
|
||||
WindowID prev_focus = last_focused_window;
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
IFileDialog *pfd = nullptr;
|
||||
if (p_mode == FILE_DIALOG_MODE_SAVE_FILE) {
|
||||
|
@ -340,6 +342,9 @@ Error DisplayServerWindows::file_dialog_show(const String &p_title, const String
|
|||
}
|
||||
}
|
||||
pfd->Release();
|
||||
if (prev_focus != INVALID_WINDOW_ID) {
|
||||
callable_mp(DisplayServer::get_singleton(), &DisplayServer::window_move_to_foreground).call_deferred(prev_focus);
|
||||
}
|
||||
|
||||
return OK;
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue