RFR: 8374630: Replace GtkFileChooserDialog with GtkFileChooserNative to allow for better Flatpak integration
Frederic Thevenet
fthevenet at openjdk.org
Thu Jan 8 12:33:42 UTC 2026
On Thu, 8 Jan 2026 11:24:20 GMT, Lukasz Kostyra <lkostyra at openjdk.org> wrote:
>> Flatpak is a framework for distributing desktop applications across various Linux distributions, that runs each application into its own sandbox to limit its access to the host environment to the strict minimum, including access to the network, HW devices or the host file system.
>> To do so, it provides a specific set of APIs, known as "XDG Desktop Portal " that the guest application must be aware of to take full advantage of ; which is not the case for Java/JavaFX based applications.
>>
>> Fortunately, some level of support for XDG Desktop Portal is baked into GTK3, which JavaFX could easily take advantage of.
>> One such opportunity is replace explicit uses of GtkFileChooserDialog with GtkFileChooserNative.
>>
>> GtkFileChooserNative is an abstraction of a dialog box suitable for use with "File/Open" or "File/Save as" commands. By default, this just uses a GtkFileChooserDialog to implement the actual dialog. However, on certain platforms, such as Windows and macOS, the native platform file chooser is used instead.
>> When the application is running in a sandboxed environment without direct filesystem access (such as Flatpak), GtkFileChooserNative may call the proper APIs (portals) to let the user choose a file and make it available to the application.
>
> It's a small change but we'll have to thoroughly test it before integrating. I'll take a look at it, but a second pair of eyes will be needed for verification on Linux.
Thanks for looking into this, @lukostyra
Here's a thing that I noticed during my own testing that might be of interest: I have verified that when running a test app as a standard process, the file chooser dialog resulting from calling `GtkFileChooserNative` is a standard GTK dialog that is identical to the one produced via `GtkFileChooserDialog` (and when running the test through the XDG portal API, the dialog is indeed a "native" dialog that differs depending on when display environment, which is the whole point for this change).
There is, however, a visible difference in what is produced by this implementation compared to the previous one in JavaFX: the "Open/Save" and "Cancel" buttons do not show an icon besides the label:
<img width="1287" height="1021" alt="GtkFileChooser" src="https://github.com/user-attachments/assets/61e38ec8-64af-4ff7-8e97-9016b4716f2c" />
<img width="1287" height="1021" alt="GtkNativeFileChooser" src="https://github.com/user-attachments/assets/f807420f-4b84-4e6a-b318-9fde3e10bb2f" />
The reason for that is that `GtkFileChooserNative` does not appear to support using `GTK_STOCK_OPEN/CANCEL` that defines both the default (and localized) label and icon for these actions: instead it displays the raw string if passed, e.g. "gtk-cancel". It is perhaps unsurprising since GTK_STOCK_OPEN et al have been deprecated since v3.10[1], while `GtkNativeDialog` was introduced in 3.20.
I looked, but couldn't find an alternative way to add the icon in the new implementation (not that I personally think it is a big loss, but ideally this change shouldn't introduce any visual differences when used in the same context).
I have, however, verified that passing `NULL` as the buttons' label to use the default does result in properly localized labels when switching languages (a far more important point, IMO).
[1] https://docs.gtk.org/gtk3/const.STOCK_OPEN.html
-------------
PR Comment: https://git.openjdk.org/jfx/pull/2025#issuecomment-3723665290
More information about the openjfx-dev
mailing list