From 004534c8e7e16c6414b6f7203be81829b0650411 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 25 May 2022 20:36:50 -0500 Subject: [PATCH] Squashed 'deps/nfde/' content from commit 28ade5a5c git-subtree-dir: deps/nfde git-subtree-split: 28ade5a5cc5d17cea8fe4034572cac8fd54eb53f --- .clang-format | 11 + .github/workflows/cmake.yml | 142 +++ .gitignore | 7 + CMakeLists.txt | 37 + LICENSE | 16 + README.md | 286 ++++++ screens/open_gtk3.png | Bin 0 -> 33502 bytes screens/open_gtk3_dark.png | Bin 0 -> 34551 bytes screens/open_macos_10.13_icons.png | Bin 0 -> 46322 bytes screens/open_macos_10.13_list.png | Bin 0 -> 49890 bytes screens/open_macos_10.13_tree.png | Bin 0 -> 82185 bytes screens/open_macos_11.0.png | Bin 0 -> 46991 bytes screens/open_macos_11.0_dark.png | Bin 0 -> 47064 bytes screens/open_win10.png | Bin 0 -> 24860 bytes screens/open_win10_dark.png | Bin 0 -> 24491 bytes src/CMakeLists.txt | 79 ++ src/include/nfd.h | 281 +++++ src/include/nfd.hpp | 311 ++++++ src/nfd_cocoa.m | 321 ++++++ src/nfd_gtk.cpp | 631 ++++++++++++ src/nfd_portal.cpp | 1414 ++++++++++++++++++++++++++ src/nfd_win.cpp | 969 ++++++++++++++++++ test/CMakeLists.txt | 18 + test/test_opendialog.c | 36 + test/test_opendialog_cpp.cpp | 29 + test/test_opendialogmultiple.c | 50 + test/test_opendialogmultiple_cpp.cpp | 40 + test/test_opendialogmultiple_enum.c | 53 + test/test_pickfolder.c | 33 + test/test_pickfolder_cpp.cpp | 27 + test/test_savedialog.c | 36 + 31 files changed, 4827 insertions(+) create mode 100644 .clang-format create mode 100644 .github/workflows/cmake.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 screens/open_gtk3.png create mode 100644 screens/open_gtk3_dark.png create mode 100644 screens/open_macos_10.13_icons.png create mode 100644 screens/open_macos_10.13_list.png create mode 100644 screens/open_macos_10.13_tree.png create mode 100644 screens/open_macos_11.0.png create mode 100644 screens/open_macos_11.0_dark.png create mode 100644 screens/open_win10.png create mode 100644 screens/open_win10_dark.png create mode 100644 src/CMakeLists.txt create mode 100644 src/include/nfd.h create mode 100644 src/include/nfd.hpp create mode 100644 src/nfd_cocoa.m create mode 100644 src/nfd_gtk.cpp create mode 100644 src/nfd_portal.cpp create mode 100644 src/nfd_win.cpp create mode 100644 test/CMakeLists.txt create mode 100644 test/test_opendialog.c create mode 100644 test/test_opendialog_cpp.cpp create mode 100644 test/test_opendialogmultiple.c create mode 100644 test/test_opendialogmultiple_cpp.cpp create mode 100644 test/test_opendialogmultiple_enum.c create mode 100644 test/test_pickfolder.c create mode 100644 test/test_pickfolder_cpp.cpp create mode 100644 test/test_savedialog.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..56badbe5 --- /dev/null +++ b/.clang-format @@ -0,0 +1,11 @@ +--- +BasedOnStyle: Chromium +IndentWidth: 4 +BinPackArguments: false +ColumnLimit: 100 +AllowShortIfStatementsOnASingleLine: WithoutElse +AllowShortLoopsOnASingleLine: true +--- +Language: Cpp +--- +Language: ObjC diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 00000000..dfe102ac --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,142 @@ +name: build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + clang-format: + + name: ClangFormat check + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Format code + run: find src/ test/ -iname '*.c' -or -iname '*.cpp' -or -iname '*.m' -or -iname '*.mm' -or -iname '*.h' -or -iname '*.hpp' | xargs clang-format -i -style=file + - name: Check diff + run: git diff --exit-code + + build-ubuntu: + + name: Ubuntu (${{ matrix.os }}, ${{ matrix.portal.name }}, ${{ matrix.compiler.c }}, C++${{ matrix.cppstd }}) + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [ubuntu-latest, ubuntu-18.04] + portal: [ {flag: OFF, dep: libgtk-3-dev, name: GTK}, {flag: ON, dep: libdbus-1-dev, name: Portal} ] # The NFD_PORTAL setting defaults to OFF (i.e. uses GTK) + compiler: [ {c: gcc, cpp: g++}, {c: clang, cpp: clang++} ] # The default compiler is gcc/g++ + cppstd: [23, 11] + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Installing Dependencies + run: sudo apt-get update && sudo apt-get install ${{ matrix.portal.dep }} + - name: Configure + run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=${{ matrix.compiler.c }} -DCMAKE_CXX_COMPILER=${{ matrix.compiler.cpp }} -DCMAKE_CXX_STANDARD=${{ matrix.cppstd }} -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DNFD_PORTAL=${{ matrix.portal.flag }} -DNFD_BUILD_TESTS=ON .. + - name: Build + run: cmake --build build --target install + - name: Upload test binaries + uses: actions/upload-artifact@v2 + with: + name: $${{ matrix.os }} - $${{ matrix.compiler.c }} + path: | + build/src/libnfd.a + build/test/test_* + + build-macos-clang: + + name: MacOS latest - Clang + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Configure + run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DNFD_BUILD_TESTS=ON .. + - name: Build + run: cmake --build build --target install + - name: Upload test binaries + uses: actions/upload-artifact@v2 + with: + name: MacOS latest - Clang + path: | + build/src/libnfd.a + build/test/test_* + + build-windows-msvc: + + name: Windows latest - MSVC + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Configure + run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DNFD_BUILD_TESTS=ON .. + - name: Build + run: cmake --build build --target install --config Release + - name: Upload test binaries + uses: actions/upload-artifact@v2 + with: + name: Windows latest - MSVC + path: | + build/src/Release/nfd.lib + build/test/Release/test_* + + build-windows-clang: + + name: Windows latest - Clang + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Configure + run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -T ClangCL -DNFD_BUILD_TESTS=ON .. + - name: Build + run: cmake --build build --target install --config Release + - name: Upload test binaries + uses: actions/upload-artifact@v2 + with: + name: Windows latest - Clang + path: | + build/src/Release/nfd.lib + build/test/Release/test_* + + build-windows-mingw: + + name: Windows latest - MinGW + runs-on: windows-latest + + defaults: + run: + shell: msys2 {0} + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up MinGW-w64 + uses: msys2/setup-msys2@v2 + with: + path-type: minimal + install: >- + base-devel + mingw-w64-x86_64-gcc + mingw-w64-x86_64-cmake + - name: Configure + run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -G 'MSYS Makefiles' -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -pedantic" -DNFD_BUILD_TESTS=ON .. + - name: Build + run: cmake --build build --target install + - name: Upload test binaries + uses: actions/upload-artifact@v2 + with: + name: Windows latest - MinGW + path: | + build/src/libnfd.a + build/test/test_* diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..747ae819 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# VS CMake default output +/.vs/ +/out/ +/CMakeSettings.json + +# Mac OS X rubbish +.DS_Store diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..b3c360bb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.2) +project(nativefiledialog-extended) + +set(nfd_PLATFORM Undefined) +if(WIN32) + set(nfd_PLATFORM PLATFORM_WIN32) +elseif(APPLE) + set(nfd_PLATFORM PLATFORM_MACOS) +elseif(UNIX AND NOT APPLE) + set(nfd_PLATFORM PLATFORM_LINUX) +endif() + +message("nfd Platform: ${nfd_PLATFORM}") + +set(nfd_COMPILER Undefined) +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") + # This is clang-cl, which has different compiler options + set(nfd_COMPILER COMPILER_CLANGCL) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(nfd_COMPILER COMPILER_MSVC) +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + set(nfd_COMPILER COMPILER_GNU) +endif() + +message("nfd Compiler: ${nfd_COMPILER}") + +# Use latest C++ by default (should be the best one), but let user override it +if(NOT DEFINED CMAKE_CXX_STANDARD) + set (CMAKE_CXX_STANDARD 23) +endif() + +add_subdirectory(src) + +option(NFD_BUILD_TESTS "Build tests for nfd" OFF) +if(${NFD_BUILD_TESTS}) + add_subdirectory(test) +endif() diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..3ab103c5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,16 @@ +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/README.md b/README.md new file mode 100644 index 00000000..77376c0b --- /dev/null +++ b/README.md @@ -0,0 +1,286 @@ + +# Native File Dialog Extended + +![GitHub Actions](https://github.com/btzy/nativefiledialog-extended/workflows/build/badge.svg) + +A small C library with that portably invokes native file open, folder select and file save dialogs. Write dialog code once and have it pop up native dialogs on all supported platforms. Avoid linking large dependencies like wxWidgets and Qt. + +This library is based on Michael Labbe's Native File Dialog ([mlabbe/nativefiledialog](https://github.com/mlabbe/nativefiledialog)). + +Features: + +- Lean C API, static library — no C++/ObjC runtime needed +- Supports Windows (MSVC, MinGW, Clang), MacOS (Clang), and Linux (GTK, portal) (GCC, Clang) +- Zlib licensed +- Friendly names for filters (e.g. `C/C++ Source files (*.c;*.cpp)` instead of `(*.c;*.cpp)`) on platforms that support it +- Automatically append file extension on platforms where users expect it +- Support for setting a default folder path +- Support for setting a default file name (e.g. `Untitled.c`) +- Consistent UTF-8 support on all platforms +- Native character set (UTF-16 `wchar_t`) support on Windows +- Initialization and de-initialization of platform library (e.g. COM (Windows) / GTK (Linux GTK) / D-Bus (Linux portal)) decoupled from dialog functions, so applications can choose when to initialize/de-initialize +- Multiple file selection support (for file open dialog) +- Support for Vista's modern `IFileDialog` on Windows +- No third party dependencies +- Modern CMake build system +- Works alongside [SDL2](http://www.libsdl.org) on all platforms +- Optional C++ wrapper with `unique_ptr` auto-freeing semantics and optional parameters, for those using this library from C++ + +**Comparison with original Native File Dialog:** + +The friendly names feature is the primary reason for breaking API compatibility with Michael Labbe's library (and hence this library probably will never be merged with it). There are also a number of tweaks that cause observable differences in this library. + +Features added in Native File Dialog Extended: + +- Friendly names for filters +- Automatically appending file extensions +- Support for setting a default file name +- Native character set (UTF-16 `wchar_t`) support on Windows +- xdg-desktop-portal support on Linux that opens the "native" file chooser (see "Usage" section below) +- Initialization and de-initialization of platform library decoupled from file dialog functions +- Modern CMake build system +- Optional C++ wrapper with `unique_ptr` auto-freeing semantics and optional parameters + +There is also significant code refractoring, especially for the Windows implementation. + +# Basic Usage + +```C +#include +#include +#include + +int main(void) +{ + + NFD_Init(); + + nfdchar_t *outPath; + nfdfilteritem_t filterItem[2] = { { "Source code", "c,cpp,cc" }, { "Headers", "h,hpp" } }; + nfdresult_t result = NFD_OpenDialog(&outPath, filterItem, 2, NULL); + if (result == NFD_OKAY) + { + puts("Success!"); + puts(outPath); + NFD_FreePath(outPath); + } + else if (result == NFD_CANCEL) + { + puts("User pressed cancel."); + } + else + { + printf("Error: %s\n", NFD_GetError()); + } + + NFD_Quit(); + return 0; +} +``` + +See [NFD.h](src/include/nfd.h) for more options. + +If you are using a platform abstraction framework such as SDL or GLFW, also see the "Usage" section below. + +# Screenshots # + +![Windows 10](screens/open_win10.png?raw=true) +![MacOS 10.13](screens/open_macos_11.0.png?raw=true) +![GTK3 on Ubuntu 20.04](screens/open_gtk3.png?raw=true) + +# Building + +## CMake Projects +If your project uses CMake, +simply add the following lines to your CMakeLists.txt: +``` +add_subdirectory(path/to/nativefiledialog-extended) +target_link_libraries(MyProgram PRIVATE nfd) +``` +Make sure that you also have the needed [dependencies](#dependencies). + +## Standalone Library +If you want to build the standalone static library, +execute the following commands (starting from the project root directory): +``` +mkdir build +cd build +cmake -DCMAKE_BUILD_TYPE=Release .. +cmake --build . +``` + +The above commands will make a `build` directory, +and build the project (in release mode) there. +If you are developing NFDe, you may want to do `-DCMAKE_BUILD_TYPE=Debug` +to build a debug version of the library instead. + +If you want to build the sample programs, +add `-DNFD_BUILD_TESTS=ON` (sample programs are not built by default). + +On Linux, if you want to use the Flatpak desktop portal instead of GTK, add `-DNFD_PORTAL=ON`. (Otherwise, GTK will be used.) See the "Usage" section below for more information. + +See the [CI build file](.github/workflows/cmake.yml) for some example build commands. + +### Visual Studio on Windows +Recent versions of Visual Studio have CMake support built into the IDE. +You should be able to "Open Folder" in the project root directory, +and Visual Studio will recognize and configure the project appropriately. +From there, you will be able to set configurations for Debug vs Release, +and for x86 vs x64. +For more information, see [the Microsoft Docs page]([https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=vs-2019](https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=vs-2019)). +This has been tested to work on Visual Studio 2019, +and it probably works on Visual Studio 2017 too. + +### Compiling Your Programs + + 1. Add `src/include` to your include search path. + 2. Add `nfd.lib` or `nfd_d.lib` to the list of static libraries to link against (for release or debug, respectively). + 3. Add `build//` to the library search path. + +## Dependencies + +### Linux + +#### GTK (default) +Make sure `libgtk-3-dev` is installed on your system. + +#### Portal +Make sure `libdbus-1-dev` is installed on your system. + +### MacOS +On MacOS, add `AppKit` to the list of frameworks. + +### Windows +On Windows (both MSVC and MinGW), ensure you are building against `ole32.lib` and `uuid.lib`. + +# Usage + +See `NFD.h` for API calls. See the `test` directory for example code (both C and C++). + +If you turned on the option to build the `test` directory (`-DNFD_BUILD_TESTS=ON`), then `build/bin` will contain the compiled test programs. + +## File Filter Syntax + +Files can be filtered by file extension groups: + +```C +nfdfilteritem_t filterItem[2] = { { "Source code", "c,cpp,cc" }, { "Headers", "h,hpp" } }; +``` + +A file filter is a pair of strings comprising the friendly name and the specification (multiple file extensions are comma-separated). + +A list of file filters can be passed as an argument when invoking the library. + +A wildcard filter is always added to every dialog. + +*Note: On MacOS, the file dialogs do not have friendly names and there is no way to switch between filters, so the filter specifications are combined (e.g. "c,cpp,cc,h,hpp"). The filter specification is also never explicitly shown to the user. This is usual MacOS behaviour and users expect it.* + +*Note 2: You must ensure that the specification string is non-empty and that every file extension has at least one character. Otherwise, bad things might ensue (i.e. undefined behaviour).* + +*Note 3: On Linux, the file extension is appended (if missing) when the user presses down the "Save" button. The appended file extension will remain visible to the user, even if an overwrite prompt is shown and the user then presses "Cancel".* + +*Note 4: On Windows, the default folder parameter is only used if there is no recently used folder available. Otherwise, the default folder will be the folder that was last used. Internally, the Windows implementation calls [IFileDialog::SetDefaultFolder(IShellItem)](https://docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/nf-shobjidl_core-ifiledialog-setdefaultfolder). This is usual Windows behaviour and users expect it.* + +## Iterating Over PathSets + +A file open dialog that supports multiple selection produces a PathSet, which is a thin abstraction over the platform-specific collection. There are two ways to iterate over a PathSet: + +### Accessing by index + +This method does array-like access on the PathSet, and is the easiest to use. +However, on certain platforms (Linux, and possibly Windows), +it takes O(N2) time in total to iterate the entire PathSet, +because the underlying platform-specific implementation uses a linked list. + +See [test_opendialogmultiple.c](test/test_opendialogmultiple.c). + +### Using an enumerator (experimental) + +This method uses an enumerator object to iterate the paths in the PathSet. +It is guaranteed to take O(N) time in total to iterate the entire PathSet. + +See [test_opendialogmultiple_enum.c](test/test_opendialogmultiple_enum.c). + +This API is experimental, and subject to change. + +## Customization Macros + +You can define the following macros *before* including `nfd.h`/`nfd.hpp`: + +- `NFD_NATIVE`: Define this before including `nfd.h` to make non-suffixed function names and typedefs (e.g. `NFD_OpenDialog`) aliases for the native functions (e.g. `NFD_OpenDialogN`) instead of aliases for the UTF-8 functions (e.g. `NFD_OpenDialogU8`). This macro does not affect the C++ wrapper `nfd.hpp`. +- `NFD_THROWS_EXCEPTIONS`: (C++ only) Define this before including `nfd.hpp` to make `NFD::Guard` construction throw `std::runtime_error` if `NFD_Init` fails. Otherwise, there is no way to detect failure in `NFD::Guard` construction. + +Macros that might be defined by `nfd.h`: + +- `NFD_DIFFERENT_NATIVE_FUNCTIONS`: Defined if the native and UTF-8 versions of functions are different (i.e. compiling for Windows); not defined otherwise. If `NFD_DIFFERENT_NATIVE_FUNCTIONS` is not defined, then the UTF-8 versions of functions are aliases for the native versions. This might be useful if you are writing a function that wants to provide overloads depending on whether the native functions and UTF-8 functions are the same. (Native is UTF-16 (`wchar_t`) for Windows and UTF-8 (`char`) for Mac/Linux.) + +## Usage with a Platform Abstraction Framework + +NFDe is known to work with SDL2 and GLFW, and should also work with other platform abstraction framworks. However, you should initialize NFDe _after_ initializing the framework, and probably should deinitialize NFDe _before_ deinitializing the framework. This is because some frameworks expect to be initialized on a "clean slate", and they may configure the system in a different way from NFDe. `NFD_Init` is generally very careful not to disrupt the existing configuration unless necessary, and `NFD_Quit` restores the configuration back exactly to what it was before initialization. + +An example with SDL2: + +``` +// Initialize SDL2 first +if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) != 0) { + // display some error here +} + +// Then initialize NFDe +if (NFD_Init() != NFD_OKAY) { + // display some error here +} + +/* +Your main program goes here +*/ + +NFD_Quit(); // deinitialize NFDe first + +SDL_Quit(); // Then deinitialize SDL2 +``` + +## Using xdg-desktop-portal on Linux + +On Linux, you can use the portal implementation instead of GTK, which will open the "native" file chooser selected by the OS or customized by the user. The user must have `xdg-desktop-portal` and a suitable backend installed (this comes pre-installed with most common desktop distros), otherwise `NFD_ERROR` will be returned. + +The portal implementation is much less battle-tested than the GTK implementation. There may be bugs — please report them on the issue tracker. + +To use the portal implementation, add `-DNFD_PORTAL=ON` to the build command. + +*Note: Setting a default path is not supported by the portal implementation, and any default path passed to NFDe will be ignored. This is a limitation of the portal API, so there is no way NFDe can work around it.* + +### What is a portal? + +Unlike Windows and MacOS, Linux does not have a file chooser baked into the operating system. Linux applications that want a file chooser usually link with a library that provides one (such as GTK, as in the Linux screenshot above). This is a mostly acceptable solution that many applications use, but may make the file chooser look foreign on non-GTK distros. + +Flatpak was introduced in 2015, and with it came a standardized interface to open a file chooser. Applications using this interface did not need to come with a file chooser, and could use the one provided by Flatpak. This interface became known as the desktop portal, and its use expanded to non-Flatpak applications. Now, most major desktop Linux distros come with the desktop portal installed, with file choosers that fit the theme of the distro. Users can also install a different portal backend if desired. There are currently two known backends: GTK and KDE. (XFCE does not currently seem to have a portal backend.) + +# Known Limitations # + + - No support for Windows XP's legacy dialogs such as `GetOpenFileName`. (There are no plans to support this; you shouldn't be still using Windows XP anyway.) + - No Emscripten (WebAssembly) bindings. (This might get implemented if I decide to port Circuit Sandbox for the web, but I don't think there is any way to implement a web-based folder picker.) + - GTK dialogs don't set the existing window as parent, so if users click the existing window while the dialog is open then the dialog will go behind it. GTK writes a warning to stdout or stderr about this. + - Portal dialogs (the alternative to GTK on Linux) don't support a default path. Any default path you supply will be ignored. + - This library is not compatible with the original Native File Dialog library. Things might break if you use both in the same project. (There are no plans to support this; you have to use one or the other.) + - This library does not explicitly dispatch calls to the UI thread. This may lead to crashes if you call functions from other threads when the platform does not support it (e.g. MacOS). Users are generally expected to call NFDe from an appropriate UI thread (i.e. the thread performing the UI event loop). + +# Reporting Bugs # + +Please use the GitHub issue tracker to report bugs or to contribute to this repository. Feel free to submit bug reports of any kind. + +# Credit # + +Bernard Teo (me) and other contributors for everything that wasn't from Michael Labbe's [Native File Dialog](https://github.com/mlabbe/nativefiledialog). + +[Michael Labbe](https://github.com/mlabbe) for his awesome Native File Dialog library, and the other contributors to that library. + +Much of this README has also been copied from the README of original Native File Dialog repository. + +## License ## + +Everything in this repository is distributed under the ZLib license, as is the original Native File Dialog library. + +## Support ## + +I don't provide any paid support. [Michael Labbe](https://github.com/mlabbe) appears to provide paid support for his [library](https://github.com/mlabbe/nativefiledialog) at the time of writing. diff --git a/screens/open_gtk3.png b/screens/open_gtk3.png new file mode 100644 index 0000000000000000000000000000000000000000..76dfe9754983b59d9fe68961e1b1427e0b442c0c GIT binary patch literal 33502 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 literal 0 HcmV?d00001 diff --git a/screens/open_macos_10.13_icons.png b/screens/open_macos_10.13_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9ca293d45fc433b4638b4cc0709bffc93004b6 GIT binary patch literal 46322 zcmY(q1yoyIv@MLg6)g^JaVuUN0)^u4?heJ>t+-n$?(R_B-8~d{3+~$g^t<={Z#)=` zkenoE>soWoId`~%oCG=w5egI(6uRU$F(oJ{SPCd8=uIRT;FVd^tUTZW+DSpYJr;mz*Co4PliF0iHs;PZchJC65dm^9Beyp570@r>*Tk%2= zi)XLX)o}UxZ$^+yfUbr?0K9KDwfFf%MsqzZ#5+Abb8mRhFUybumo99;YU)M zIXGI>V1`-@kaW&kaM-x16dhv-U(aGl z9ivncnID~+3iA&+LIIivDgiZURZ0~G%9vVPqngrw2Raf0qD%ra|7$p?LF{1$;ZbWZyuN2AlEO`w!pO#=Y z3wAgh474_P0mOxYkFA$J*&S)kVvl(^B_ef9cMB1dOiWyynubQS##Bp6NFf|wxoIVg z+;=!7>Ym$_#0T%x9xV#iouBN}gJW0ncm~tx`oq5IcI!gB)-qAaSsgfgmq@Lz>r2Yx zw%G_v%WXK_N;-;$+u3S>oQ@#=Yrcz(Q8Au=-Z zXX;>~rpDiFixWwl0pyIYVbkR3O++grzp>>5G`ITu#b{Ul{9%iJiXr85-5ErGzkE|^ zf|4%N&WJK-Y;IO{FZc`X28Jf&#~O@CuEs#?Oj?)<&5sI?U-vzK-yEwKi5a(B9d0E_=g zr%-9R)y0}N^_8>|V_cp%Sm;L>C^yb>o^`DCNGP~Pyv^(0?#R~X@7rr%7-nkxip<{y zdT3wy#Y*iVwee4af}N6y)HVYoY3BDATcQtwL@#QADNNd+mL}ivs7mdL^0mrt#w!5>G6FRywIJJB;}jQTd~>p1 zoqSHa`LxQD@Te%0P8@WcdQ<*YfhZpa0RjGWK^tXsBeEqhFhhUVfEhCKHDf#gy1TH* zf^q#L zXXM~|If61dMt{K}qK1CSAo+AMlTS`g&Zh92nHjZ{<6_SJx)-o`%vYLhZAz8UsS_o*Id&B#Bvj?_GDNC(VYa)X?wlb+W z0$RFKZKKnNILqLAe`2{vX%s^vmRu;5WUfe-See-u@qJBH?e2yv>M|4IDpB^^bB$>v z)B_H(uMC9=ayYdhr|H7j8MSX&a-9NQjn%Y0bGdm8xlpI?>r<@I+e71$o^i&_f9)+_ z9s2>w)o8F#oXQda+Qjb)0prlfb;pcs4sh(%jT3NRSE)KXJG;AofnepXR%q65Zf;_b z@_w!-`T}&Mrj!SZB?`Xc?(|Q6@>LX>fah2WlTC

(}Ba&BCu=B?!?piYkZ;%C(#A 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 F{{p5KM412p literal 0 HcmV?d00001 diff --git a/screens/open_macos_10.13_tree.png b/screens/open_macos_10.13_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..e39af98820c72f2627390561ac5cc3f0b486a282 GIT binary patch literal 82185 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 z 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 literal 0 HcmV?d00001 diff --git a/screens/open_macos_11.0.png b/screens/open_macos_11.0.png new file mode 100644 index 0000000000000000000000000000000000000000..61bff05d36e109a31610c8c5bd83e6a6bd0c87f0 GIT binary patch literal 46991 zcma%ibyQVR_br07lr#tkNH-GF(nxnVA`Q}A0@5YY-OZ&tq#LBWyE`P`=KFr{k2l79 zV?2h6SI<57u+Ls|%{Avd!Sb@=C`bfIP*6}PUnE2np`c*iLqWY-MSuqXGH#rf1-`wq zR}>e5DjRvX2VT535tI>xf~tr_elUOquMxjXXxKwRp?1Ffe${JJ@D&QG?!y-mL1h=+ z!zFkZER{~!Rja+0&$Q_89fXiX8-Ez~{>Wf^g-q)d0!{0Lp^Sxb3G+%&Flo|mK ztqcq@W%DtwGR92hyPygb@C~5C7&CBx3R1v9O=bk4PU7V=$Z40VhFUuW5qyT%zuOHU zOAC)tGa&Bj5^QFp4L4e3^>p}tm%^VPNtSQ(&Tk_A`(2L#m#1vo?d2G$7%oxXUTAQJ zmNW@@)>|SUT^BJ0X+10kdis*mQY%YK`7Y}BV$tbURaIjFYo}pjtRFv4OiWabPmE3A zY-niAEzE~-{rUI}!w)fm{9k0J^69UhS6vRLVPAs(VX}`iiy4k|L1hJ*$m$XF6r}8B z!`O0gb2WJ0UmI5H6D&=V>dP{FI$#wuaqz-*cFDkC5#oiQFwy!>;QoJpYuBC_?d$ve zbpU+z_Y3ye+1gfARdrJ1VYEvT5I>%hyg$gz&81kZU)$c?JY4lDH1D1aca=#aUgEk9 zI~COaBC)&JP^B#@A|mq4UEN1!6WmEgLqnqm(RH-5vvYK;sje2`yDN&?VC%v3K07-r z3=V!mA*lcKNnd$VU%Bv$Nh2BfYV3DlL*7FgWn^UZ_4S2?g$+{t_wQejo+1;tFVG!o zx~i(ea&oo_BA3}b&?MrM-Ju4(ksH3KSX;#4gO%?kdW)5d;uy5{9U7~v**-A%)9tON z9UdOu)_>ANL!;3=bD1KFjgNQUKb)JqblAug=Hr$Z$z4ni3JNl(sGcv?s*{zK9T^=J zU;fp)5?H;pwjbiv&A6K7t>+;9<{YBUEQAqj=lh?dZ5zwK#8CFBgNrO$TwFXHlE$T? zdMrKSUc%T*Ote$O$W?udfuUfvvA>@bAFrmaUNA5^sz%Tz)Yqw2U+;nW&wef z_T@CHOmHzlMWb_b8c6DP!T)(7u06)Mgg+?1zT^1vy1@L>t;Hi-0gnFV3{~hAl8s~3 zOn+Wpup+;v_iKOuIQ#J_=HNfax`AUIUQ028Yrs&b`GVUpm_xNu{rwMSAh=jqSU5OoeC{0V z>?+5C+myK$e(kp?feYxu1KF`+Z{DNnFtX(E5@2AA=^(91HaMRwt9p5Hm#UT(`;?T> zhix4nAMfvnkWr4;+Zv4_4^xF?HPLUq@zd2To$lx$qoOjoIbLGWs=d6ph`EpDFcj4- zv*vnB%;>ySWF&#`r2h3c9U@{Xk8_+w@oUWXWcr}L5FD@?5& i5!-n5Uv=6U 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

TBR)LX3$CY7Q|qbrt8L?rn`=xf%XN1} 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 IjyzVCI-2Un!cG*~PZW>>`a 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 literal 0 HcmV?d00001 diff --git a/screens/open_macos_11.0_dark.png b/screens/open_macos_11.0_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..436ea93b53d1b5f1249de05421b43f9b88234457 GIT binary patch literal 47064 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 + +#ifdef _WIN32 +/* denotes UTF-16 char */ +typedef wchar_t nfdnchar_t; +#else +/* denotes UTF-8 char */ +typedef char nfdnchar_t; +#endif // _WIN32 + +/* opaque data structure -- see NFD_PathSet_* */ +typedef void nfdpathset_t; +#ifndef NFD_PORTAL +typedef struct { + void* ptr; +} nfdpathsetenum_t; +#else +typedef struct { + void* d1; + void* d2; + unsigned int d3; + int d4; + int d5; + int d6; + int d7; + int d8; + int d9; + int d10; + int d11; + int p1; + void* p2; + void* p3; +} nfdpathsetenum_t; +#endif + +typedef unsigned int nfdfiltersize_t; + +typedef enum { + NFD_ERROR, /* programmatic error */ + NFD_OKAY, /* user pressed okay, or successful return */ + NFD_CANCEL /* user pressed cancel */ +} nfdresult_t; + +typedef struct { + const nfdnchar_t* name; + const nfdnchar_t* spec; +} nfdnfilteritem_t; + +/* free a file path that was returned by the dialogs */ +/* Note: use NFD_PathSet_FreePath to free path from pathset instead of this function */ +void NFD_FreePathN(nfdnchar_t* filePath); + +/* initialize NFD - call this for every thread that might use NFD, before calling any other NFD + * functions on that thread */ +nfdresult_t NFD_Init(void); + +/* call this to de-initialize NFD, if NFD_Init returned NFD_OKAY */ +void NFD_Quit(void); + +/* single file open dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns + * NFD_OKAY */ +/* If filterCount is zero, filterList is ignored (you can use NULL) */ +/* If defaultPath is NULL, the operating system will decide */ +nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath); + +/* multiple file open dialog */ +/* It is the caller's responsibility to free `outPaths` via NFD_PathSet_Free() if this function + * returns NFD_OKAY */ +/* If filterCount is zero, filterList is ignored (you can use NULL) */ +/* If defaultPath is NULL, the operating system will decide */ +nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath); + +/* save dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns + * NFD_OKAY */ +/* If filterCount is zero, filterList is ignored (you can use NULL) */ +/* If defaultPath is NULL, the operating system will decide */ +nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName); + +/* select folder dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns + * NFD_OKAY */ +/* If defaultPath is NULL, the operating system will decide */ +nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath); + +/* Get last error -- set when nfdresult_t returns NFD_ERROR */ +/* Returns the last error that was set, or NULL if there is no error. */ +/* The memory is owned by NFD and should not be freed by user code. */ +/* This is *always* ASCII printable characters, so it can be interpreted as UTF-8 without any + * conversion. */ +const char* NFD_GetError(void); +/* clear the error */ +void NFD_ClearError(void); + +/* path set operations */ +#ifdef _WIN32 +typedef unsigned long nfdpathsetsize_t; +#elif __APPLE__ +typedef unsigned long nfdpathsetsize_t; +#else +typedef unsigned int nfdpathsetsize_t; +#endif // _WIN32, __APPLE__ + +/* Gets the number of entries stored in pathSet */ +/* note that some paths might be invalid (NFD_ERROR will be returned by NFD_PathSet_GetPath), so we + * might not actually have this number of usable paths */ +nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count); +/* Gets the UTF-8 path at offset index */ +/* It is the caller's responsibility to free `outPath` via NFD_PathSet_FreePathN() if this function + * returns NFD_OKAY */ +nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t** outPath); +/* Free the path gotten by NFD_PathSet_GetPathN */ +#ifdef _WIN32 +#define NFD_PathSet_FreePathN NFD_FreePathN +#elif __APPLE__ +#define NFD_PathSet_FreePathN NFD_FreePathN +#else +void NFD_PathSet_FreePathN(const nfdnchar_t* filePath); +#endif // _WIN32, __APPLE__ + +/* Gets an enumerator of the path set. */ +/* It is the caller's responsibility to free `enumerator` via NFD_PathSet_FreeEnum() if this + * function returns NFD_OKAY, and it should be freed before freeing the pathset. */ +nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, nfdpathsetenum_t* outEnumerator); +/* Frees an enumerator of the path set. */ +void NFD_PathSet_FreeEnum(nfdpathsetenum_t* enumerator); +/* Gets the next item from the path set enumerator. + * If there are no more items, then *outPaths will be set to NULL. */ +/* It is the caller's responsibility to free `*outPath` via NFD_PathSet_FreePath() if this + * function returns NFD_OKAY and `*outPath` is not null */ +nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_t** outPath); + +/* Free the pathSet */ +void NFD_PathSet_Free(const nfdpathset_t* pathSet); + +#ifdef _WIN32 + +/* say that the U8 versions of functions are not just #defined to be the native versions */ +#define NFD_DIFFERENT_NATIVE_FUNCTIONS + +typedef char nfdu8char_t; + +typedef struct { + const nfdu8char_t* name; + const nfdu8char_t* spec; +} nfdu8filteritem_t; + +/* UTF-8 compatibility functions */ + +/* free a file path that was returned */ +void NFD_FreePathU8(nfdu8char_t* outPath); + +/* single file open dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_OpenDialogU8(nfdu8char_t** outPath, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath); + +/* multiple file open dialog */ +/* It is the caller's responsibility to free `outPaths` via NFD_PathSet_Free() if this function + * returns NFD_OKAY */ +nfdresult_t NFD_OpenDialogMultipleU8(const nfdpathset_t** outPaths, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath); + +/* save dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_SaveDialogU8(nfdu8char_t** outPath, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath, + const nfdu8char_t* defaultName); + +/* select folder dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath); + +/* Get the UTF-8 path at offset index */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdu8char_t** outPath); + +/* Gets the next item from the path set enumerator. + * If there are no more items, then *outPaths will be set to NULL. */ +/* It is the caller's responsibility to free `*outPath` via NFD_PathSet_FreePathU8() if this + * function returns NFD_OKAY and `*outPath` is not null */ +nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath); + +#define NFD_PathSet_FreePathU8 NFD_FreePathU8 + +#ifdef NFD_NATIVE +typedef nfdnchar_t nfdchar_t; +typedef nfdnfilteritem_t nfdfilteritem_t; +#define NFD_FreePath NFD_FreePathN +#define NFD_OpenDialog NFD_OpenDialogN +#define NFD_OpenDialogMultiple NFD_OpenDialogMultipleN +#define NFD_SaveDialog NFD_SaveDialogN +#define NFD_PickFolder NFD_PickFolderN +#define NFD_PathSet_GetPath NFD_PathSet_GetPathN +#define NFD_PathSet_FreePath NFD_PathSet_FreePathN +#define NFD_PathSet_EnumNext NFD_PathSet_EnumNextN +#else +typedef nfdu8char_t nfdchar_t; +typedef nfdu8filteritem_t nfdfilteritem_t; +#define NFD_FreePath NFD_FreePathU8 +#define NFD_OpenDialog NFD_OpenDialogU8 +#define NFD_OpenDialogMultiple NFD_OpenDialogMultipleU8 +#define NFD_SaveDialog NFD_SaveDialogU8 +#define NFD_PickFolder NFD_PickFolderU8 +#define NFD_PathSet_GetPath NFD_PathSet_GetPathU8 +#define NFD_PathSet_FreePath NFD_PathSet_FreePathU8 +#define NFD_PathSet_EnumNext NFD_PathSet_EnumNextU8 +#endif // NFD_NATIVE + +#else // _WIN32 + +/* the native charset is already UTF-8 */ +typedef nfdnchar_t nfdchar_t; +typedef nfdnfilteritem_t nfdfilteritem_t; +#define NFD_FreePath NFD_FreePathN +#define NFD_OpenDialog NFD_OpenDialogN +#define NFD_OpenDialogMultiple NFD_OpenDialogMultipleN +#define NFD_SaveDialog NFD_SaveDialogN +#define NFD_PickFolder NFD_PickFolderN +#define NFD_PathSet_GetPath NFD_PathSet_GetPathN +#define NFD_PathSet_FreePath NFD_PathSet_FreePathN +#define NFD_PathSet_EnumNext NFD_PathSet_EnumNextN +typedef nfdnchar_t nfdu8char_t; +typedef nfdnfilteritem_t nfdu8filteritem_t; +#define NFD_FreePathU8 NFD_FreePathN +#define NFD_OpenDialogU8 NFD_OpenDialogN +#define NFD_OpenDialogMultipleU8 NFD_OpenDialogMultipleN +#define NFD_SaveDialogU8 NFD_SaveDialogN +#define NFD_PickFolderU8 NFD_PickFolderN +#define NFD_PathSet_GetPathU8 NFD_PathSet_GetPathN +#define NFD_PathSet_FreePathU8 NFD_PathSet_FreePathN +#define NFD_PathSet_EnumNextU8 NFD_PathSet_EnumNextN + +#endif // _WIN32 + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // _NFD_H diff --git a/src/include/nfd.hpp b/src/include/nfd.hpp new file mode 100644 index 00000000..bbce108a --- /dev/null +++ b/src/include/nfd.hpp @@ -0,0 +1,311 @@ +/* + Native File Dialog Extended + Repository: https://github.com/btzy/nativefiledialog-extended + License: Zlib + Author: Bernard Teo + + This header is a thin C++ wrapper for nfd.h. + C++ projects can choose to use this header instead of nfd.h directly. + + Refer to documentation on nfd.h for instructions on how to use these functions. +*/ + +#ifndef _NFD_HPP +#define _NFD_HPP + +#include +#include // for std::size_t +#include // for std::unique_ptr +#ifdef NFD_THROWS_EXCEPTIONS +#include +#endif + +namespace NFD { + +inline nfdresult_t Init() noexcept { + return ::NFD_Init(); +} + +inline void Quit() noexcept { + ::NFD_Quit(); +} + +inline void FreePath(nfdnchar_t* outPath) noexcept { + ::NFD_FreePathN(outPath); +} + +inline nfdresult_t OpenDialog(nfdnchar_t*& outPath, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr) noexcept { + return ::NFD_OpenDialogN(&outPath, filterList, filterCount, defaultPath); +} + +inline nfdresult_t OpenDialogMultiple(const nfdpathset_t*& outPaths, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr) noexcept { + return ::NFD_OpenDialogMultipleN(&outPaths, filterList, filterCount, defaultPath); +} + +inline nfdresult_t SaveDialog(nfdnchar_t*& outPath, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr, + const nfdnchar_t* defaultName = nullptr) noexcept { + return ::NFD_SaveDialogN(&outPath, filterList, filterCount, defaultPath, defaultName); +} + +inline nfdresult_t PickFolder(nfdnchar_t*& outPath, + const nfdnchar_t* defaultPath = nullptr) noexcept { + return ::NFD_PickFolderN(&outPath, defaultPath); +} + +inline const char* GetError() noexcept { + return ::NFD_GetError(); +} + +inline void ClearError() noexcept { + ::NFD_ClearError(); +} + +namespace PathSet { +inline nfdresult_t Count(const nfdpathset_t* pathSet, nfdpathsetsize_t& count) noexcept { + return ::NFD_PathSet_GetCount(pathSet, &count); +} + +inline nfdresult_t GetPath(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t*& outPath) noexcept { + return ::NFD_PathSet_GetPathN(pathSet, index, &outPath); +} + +inline void FreePath(nfdnchar_t* filePath) noexcept { + ::NFD_PathSet_FreePathN(filePath); +} + +inline void Free(const nfdpathset_t* pathSet) noexcept { + ::NFD_PathSet_Free(pathSet); +} +} // namespace PathSet + +#ifdef NFD_DIFFERENT_NATIVE_FUNCTIONS +/* we need the C++ bindings for the UTF-8 functions as well, because there are different functions + * for them */ + +inline void FreePath(nfdu8char_t* outPath) noexcept { + ::NFD_FreePathU8(outPath); +} + +inline nfdresult_t OpenDialog(nfdu8char_t*& outPath, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t count = 0, + const nfdu8char_t* defaultPath = nullptr) noexcept { + return ::NFD_OpenDialogU8(&outPath, filterList, count, defaultPath); +} + +inline nfdresult_t OpenDialogMultiple(const nfdpathset_t*& outPaths, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t count = 0, + const nfdu8char_t* defaultPath = nullptr) noexcept { + return ::NFD_OpenDialogMultipleU8(&outPaths, filterList, count, defaultPath); +} + +inline nfdresult_t SaveDialog(nfdu8char_t*& outPath, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t count = 0, + const nfdu8char_t* defaultPath = nullptr, + const nfdu8char_t* defaultName = nullptr) noexcept { + return ::NFD_SaveDialogU8(&outPath, filterList, count, defaultPath, defaultName); +} + +inline nfdresult_t PickFolder(nfdu8char_t*& outPath, + const nfdu8char_t* defaultPath = nullptr) noexcept { + return ::NFD_PickFolderU8(&outPath, defaultPath); +} + +namespace PathSet { +inline nfdresult_t GetPath(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdu8char_t*& outPath) noexcept { + return ::NFD_PathSet_GetPathU8(pathSet, index, &outPath); +} +inline void FreePath(nfdu8char_t* filePath) noexcept { + ::NFD_PathSet_FreePathU8(filePath); +} +} // namespace PathSet +#endif + +// smart objects + +class Guard { + public: +#ifndef NFD_THROWS_EXCEPTIONS + inline Guard() noexcept { + Init(); // always assume that initialization succeeds + } +#else + inline Guard() { + if (!Init()) { + throw std::runtime_error(GetError()); + } + } +#endif + inline ~Guard() noexcept { Quit(); } + + // Not allowed to copy or move this class + Guard(const Guard&) = delete; + Guard& operator=(const Guard&) = delete; +}; + +template +struct PathDeleter { + inline void operator()(T* ptr) const noexcept { FreePath(ptr); } +}; + +typedef std::unique_ptr> UniquePath; +typedef std::unique_ptr> UniquePathN; +typedef std::unique_ptr> UniquePathU8; + +struct PathSetDeleter { + inline void operator()(const nfdpathset_t* ptr) const noexcept { PathSet::Free(ptr); } +}; + +typedef std::unique_ptr UniquePathSet; + +template +struct PathSetPathDeleter { + inline void operator()(T* ptr) const noexcept { PathSet::FreePath(ptr); } +}; + +typedef std::unique_ptr> UniquePathSetPath; +typedef std::unique_ptr> UniquePathSetPathN; +typedef std::unique_ptr> UniquePathSetPathU8; + +inline nfdresult_t OpenDialog(UniquePathN& outPath, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr) noexcept { + nfdnchar_t* out; + nfdresult_t res = OpenDialog(out, filterList, filterCount, defaultPath); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} + +inline nfdresult_t OpenDialogMultiple(UniquePathSet& outPaths, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr) noexcept { + const nfdpathset_t* out; + nfdresult_t res = OpenDialogMultiple(out, filterList, filterCount, defaultPath); + if (res == NFD_OKAY) { + outPaths.reset(out); + } + return res; +} + +inline nfdresult_t SaveDialog(UniquePathN& outPath, + const nfdnfilteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdnchar_t* defaultPath = nullptr, + const nfdnchar_t* defaultName = nullptr) noexcept { + nfdnchar_t* out; + nfdresult_t res = SaveDialog(out, filterList, filterCount, defaultPath, defaultName); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} + +inline nfdresult_t PickFolder(UniquePathN& outPath, + const nfdnchar_t* defaultPath = nullptr) noexcept { + nfdnchar_t* out; + nfdresult_t res = PickFolder(out, defaultPath); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} + +#ifdef NFD_DIFFERENT_NATIVE_FUNCTIONS +inline nfdresult_t OpenDialog(UniquePathU8& outPath, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdu8char_t* defaultPath = nullptr) noexcept { + nfdu8char_t* out; + nfdresult_t res = OpenDialog(out, filterList, filterCount, defaultPath); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} + +inline nfdresult_t OpenDialogMultiple(UniquePathSet& outPaths, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdu8char_t* defaultPath = nullptr) noexcept { + const nfdpathset_t* out; + nfdresult_t res = OpenDialogMultiple(out, filterList, filterCount, defaultPath); + if (res == NFD_OKAY) { + outPaths.reset(out); + } + return res; +} + +inline nfdresult_t SaveDialog(UniquePathU8& outPath, + const nfdu8filteritem_t* filterList = nullptr, + nfdfiltersize_t filterCount = 0, + const nfdu8char_t* defaultPath = nullptr, + const nfdu8char_t* defaultName = nullptr) noexcept { + nfdu8char_t* out; + nfdresult_t res = SaveDialog(out, filterList, filterCount, defaultPath, defaultName); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} + +inline nfdresult_t PickFolder(UniquePathU8& outPath, + const nfdu8char_t* defaultPath = nullptr) noexcept { + nfdu8char_t* out; + nfdresult_t res = PickFolder(out, defaultPath); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} +#endif + +namespace PathSet { +inline nfdresult_t Count(const UniquePathSet& uniquePathSet, nfdpathsetsize_t& count) noexcept { + return Count(uniquePathSet.get(), count); +} +inline nfdresult_t GetPath(const UniquePathSet& uniquePathSet, + nfdpathsetsize_t index, + UniquePathSetPathN& outPath) noexcept { + nfdnchar_t* out; + nfdresult_t res = GetPath(uniquePathSet.get(), index, out); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} +#ifdef NFD_DIFFERENT_NATIVE_FUNCTIONS +inline nfdresult_t GetPath(const UniquePathSet& uniquePathSet, + nfdpathsetsize_t index, + UniquePathSetPathU8& outPath) noexcept { + nfdu8char_t* out; + nfdresult_t res = GetPath(uniquePathSet.get(), index, out); + if (res == NFD_OKAY) { + outPath.reset(out); + } + return res; +} +#endif +} // namespace PathSet + +} // namespace NFD + +#endif diff --git a/src/nfd_cocoa.m b/src/nfd_cocoa.m new file mode 100644 index 00000000..5d74b13d --- /dev/null +++ b/src/nfd_cocoa.m @@ -0,0 +1,321 @@ +/* + Native File Dialog Extended + Repository: https://github.com/btzy/nativefiledialog-extended + License: Zlib + Authors: Bernard Teo, Michael Labbe + */ + +#include +#include "nfd.h" + +static const char* g_errorstr = NULL; + +static void NFDi_SetError(const char* msg) { + g_errorstr = msg; +} + +static void* NFDi_Malloc(size_t bytes) { + void* ptr = malloc(bytes); + if (!ptr) NFDi_SetError("NFDi_Malloc failed."); + + return ptr; +} + +static void NFDi_Free(void* ptr) { + assert(ptr); + free(ptr); +} + +static NSArray* BuildAllowedFileTypes(const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + // Commas and semicolons are the same thing on this platform + + NSMutableArray* buildFilterList = [[NSMutableArray alloc] init]; + + for (nfdfiltersize_t filterIndex = 0; filterIndex != filterCount; ++filterIndex) { + // this is the spec to parse (we don't use the friendly name on OS X) + const nfdnchar_t* filterSpec = filterList[filterIndex].spec; + + const nfdnchar_t* p_currentFilterBegin = filterSpec; + for (const nfdnchar_t* p_filterSpec = filterSpec; *p_filterSpec; ++p_filterSpec) { + if (*p_filterSpec == ',') { + // add the extension to the array + NSString* filterStr = [[[NSString alloc] + initWithBytes:(const void*)p_currentFilterBegin + length:(sizeof(nfdnchar_t) * (p_filterSpec - p_currentFilterBegin)) + encoding:NSUTF8StringEncoding] autorelease]; + [buildFilterList addObject:filterStr]; + p_currentFilterBegin = p_filterSpec + 1; + } + } + // add the extension to the array + NSString* filterStr = [NSString stringWithUTF8String:p_currentFilterBegin]; + [buildFilterList addObject:filterStr]; + } + + NSArray* returnArray = [NSArray arrayWithArray:buildFilterList]; + + [buildFilterList release]; + + assert([returnArray count] != 0); + + return returnArray; +} + +static void AddFilterListToDialog(NSSavePanel* dialog, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + // note: NSOpenPanel inherits from NSSavePanel. + + if (!filterCount) return; + + assert(filterList); + + // make NSArray of file types + NSArray* allowedFileTypes = BuildAllowedFileTypes(filterList, filterCount); + + // set it on the dialog + [dialog setAllowedFileTypes:allowedFileTypes]; +} + +static void SetDefaultPath(NSSavePanel* dialog, const nfdnchar_t* defaultPath) { + if (!defaultPath || !*defaultPath) return; + + NSString* defaultPathString = [NSString stringWithUTF8String:defaultPath]; + NSURL* url = [NSURL fileURLWithPath:defaultPathString isDirectory:YES]; + [dialog setDirectoryURL:url]; +} + +static void SetDefaultName(NSSavePanel* dialog, const nfdnchar_t* defaultName) { + if (!defaultName || !*defaultName) return; + + NSString* defaultNameString = [NSString stringWithUTF8String:defaultName]; + [dialog setNameFieldStringValue:defaultNameString]; +} + +static nfdresult_t CopyUtf8String(const char* utf8Str, nfdnchar_t** out) { + // byte count, not char count + size_t len = strlen(utf8Str); + + // Too bad we have to use additional memory for all the result paths, + // because we cannot reconstitute an NSString from a char* to release it properly. + *out = (nfdnchar_t*)NFDi_Malloc(len + 1); + if (*out) { + strcpy(*out, utf8Str); + return NFD_OKAY; + } + + return NFD_ERROR; +} + +/* public */ + +const char* NFD_GetError(void) { + return g_errorstr; +} + +void NFD_FreePathN(nfdnchar_t* filePath) { + NFDi_Free((void*)filePath); +} + +static NSApplicationActivationPolicy old_app_policy; + +nfdresult_t NFD_Init(void) { + NSApplication* app = [NSApplication sharedApplication]; + old_app_policy = [app activationPolicy]; + if (old_app_policy == NSApplicationActivationPolicyProhibited) { + if (![app setActivationPolicy:NSApplicationActivationPolicyAccessory]) { + NFDi_SetError("Failed to set activation policy."); + return NFD_ERROR; + } + } + return NFD_OKAY; +} + +/* call this to de-initialize NFD, if NFD_Init returned NFD_OKAY */ +void NFD_Quit(void) { + [[NSApplication sharedApplication] setActivationPolicy:old_app_policy]; +} + +nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + nfdresult_t result = NFD_CANCEL; + @autoreleasepool { + NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow]; + + NSOpenPanel* dialog = [NSOpenPanel openPanel]; + [dialog setAllowsMultipleSelection:NO]; + + // Build the filter list + AddFilterListToDialog(dialog, filterList, filterCount); + + // Set the starting directory + SetDefaultPath(dialog, defaultPath); + + if ([dialog runModal] == NSModalResponseOK) { + const NSURL* url = [dialog URL]; + const char* utf8Path = [[url path] UTF8String]; + result = CopyUtf8String(utf8Path, outPath); + } + + // return focus to the key window (i.e. main window) + [keyWindow makeKeyAndOrderFront:nil]; + } + return result; +} + +nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + nfdresult_t result = NFD_CANCEL; + @autoreleasepool { + NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow]; + + NSOpenPanel* dialog = [NSOpenPanel openPanel]; + [dialog setAllowsMultipleSelection:YES]; + + // Build the filter list + AddFilterListToDialog(dialog, filterList, filterCount); + + // Set the starting directory + SetDefaultPath(dialog, defaultPath); + + if ([dialog runModal] == NSModalResponseOK) { + const NSArray* urls = [dialog URLs]; + + if ([urls count] > 0) { + // have at least one URL, we return this NSArray + [urls retain]; + *outPaths = (const nfdpathset_t*)urls; + result = NFD_OKAY; + } + } + + // return focus to the key window (i.e. main window) + [keyWindow makeKeyAndOrderFront:nil]; + } + return result; +} + +nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + nfdresult_t result = NFD_CANCEL; + @autoreleasepool { + NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow]; + + NSSavePanel* dialog = [NSSavePanel savePanel]; + [dialog setExtensionHidden:NO]; + // allow other file types, to give the user an escape hatch since you can't select "*.*" on + // Mac + [dialog setAllowsOtherFileTypes:TRUE]; + + // Build the filter list + AddFilterListToDialog(dialog, filterList, filterCount); + + // Set the starting directory + SetDefaultPath(dialog, defaultPath); + + // Set the default file name + SetDefaultName(dialog, defaultName); + + if ([dialog runModal] == NSModalResponseOK) { + const NSURL* url = [dialog URL]; + const char* utf8Path = [[url path] UTF8String]; + result = CopyUtf8String(utf8Path, outPath); + } + + // return focus to the key window (i.e. main window) + [keyWindow makeKeyAndOrderFront:nil]; + } + return result; +} + +nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { + nfdresult_t result = NFD_CANCEL; + @autoreleasepool { + NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow]; + + NSOpenPanel* dialog = [NSOpenPanel openPanel]; + [dialog setAllowsMultipleSelection:NO]; + [dialog setCanChooseDirectories:YES]; + [dialog setCanCreateDirectories:YES]; + [dialog setCanChooseFiles:NO]; + + // Set the starting directory + SetDefaultPath(dialog, defaultPath); + + if ([dialog runModal] == NSModalResponseOK) { + const NSURL* url = [dialog URL]; + const char* utf8Path = [[url path] UTF8String]; + result = CopyUtf8String(utf8Path, outPath); + } + + // return focus to the key window (i.e. main window) + [keyWindow makeKeyAndOrderFront:nil]; + } + return result; +} + +nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count) { + const NSArray* urls = (const NSArray*)pathSet; + *count = [urls count]; + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t** outPath) { + const NSArray* urls = (const NSArray*)pathSet; + + @autoreleasepool { + // autoreleasepool needed because UTF8String method might use the pool + const NSURL* url = [urls objectAtIndex:index]; + const char* utf8Path = [[url path] UTF8String]; + return CopyUtf8String(utf8Path, outPath); + } +} + +void NFD_PathSet_Free(const nfdpathset_t* pathSet) { + const NSArray* urls = (const NSArray*)pathSet; + [urls release]; +} + +nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, nfdpathsetenum_t* outEnumerator) { + const NSArray* urls = (const NSArray*)pathSet; + + @autoreleasepool { + // autoreleasepool needed because NSEnumerator uses it + NSEnumerator* enumerator = [urls objectEnumerator]; + [enumerator retain]; + outEnumerator->ptr = (void*)enumerator; + } + + return NFD_OKAY; +} + +void NFD_PathSet_FreeEnum(nfdpathsetenum_t* enumerator) { + NSEnumerator* real_enum = (NSEnumerator*)enumerator->ptr; + [real_enum release]; +} + +nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_t** outPath) { + NSEnumerator* real_enum = (NSEnumerator*)enumerator->ptr; + + @autoreleasepool { + // autoreleasepool needed because NSURL uses it + const NSURL* url = [real_enum nextObject]; + if (url) { + const char* utf8Path = [[url path] UTF8String]; + return CopyUtf8String(utf8Path, outPath); + } else { + *outPath = NULL; + return NFD_OKAY; + } + } +} diff --git a/src/nfd_gtk.cpp b/src/nfd_gtk.cpp new file mode 100644 index 00000000..dda56a88 --- /dev/null +++ b/src/nfd_gtk.cpp @@ -0,0 +1,631 @@ +/* + Native File Dialog Extended + Repository: https://github.com/btzy/nativefiledialog-extended + License: Zlib + Authors: Bernard Teo, Michael Labbe + + Note: We do not check for malloc failure on Linux - Linux overcommits memory! +*/ + +#include +#include +#if defined(GDK_WINDOWING_X11) +#include +#endif +#include +#include +#include +#include + +#include "nfd.h" + +namespace { + +template +struct Free_Guard { + T* data; + Free_Guard(T* freeable) noexcept : data(freeable) {} + ~Free_Guard() { NFDi_Free(data); } +}; + +template +struct FreeCheck_Guard { + T* data; + FreeCheck_Guard(T* freeable = nullptr) noexcept : data(freeable) {} + ~FreeCheck_Guard() { + if (data) NFDi_Free(data); + } +}; + +/* current error */ +const char* g_errorstr = nullptr; + +void NFDi_SetError(const char* msg) { + g_errorstr = msg; +} + +template +T* NFDi_Malloc(size_t bytes) { + void* ptr = malloc(bytes); + if (!ptr) NFDi_SetError("NFDi_Malloc failed."); + + return static_cast(ptr); +} + +template +void NFDi_Free(T* ptr) { + assert(ptr); + free(static_cast(ptr)); +} + +template +T* copy(const T* begin, const T* end, T* out) { + for (; begin != end; ++begin) { + *out++ = *begin; + } + return out; +} + +// Does not own the filter and extension. +struct Pair_GtkFileFilter_FileExtension { + GtkFileFilter* filter; + const nfdnchar_t* extensionBegin; + const nfdnchar_t* extensionEnd; +}; + +struct ButtonClickedArgs { + Pair_GtkFileFilter_FileExtension* map; + GtkFileChooser* chooser; +}; + +void AddFiltersToDialog(GtkFileChooser* chooser, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + if (filterCount) { + assert(filterList); + + // we have filters to add ... format and add them + + for (nfdfiltersize_t index = 0; index != filterCount; ++index) { + GtkFileFilter* filter = gtk_file_filter_new(); + + // count number of file extensions + size_t sep = 1; + for (const nfdnchar_t* p_spec = filterList[index].spec; *p_spec; ++p_spec) { + if (*p_spec == L',') { + ++sep; + } + } + + // friendly name conversions: "png,jpg" -> "Image files + // (png, jpg)" + + // calculate space needed (including the trailing '\0') + size_t nameSize = + sep + strlen(filterList[index].spec) + 3 + strlen(filterList[index].name); + + // malloc the required memory + nfdnchar_t* nameBuf = NFDi_Malloc(sizeof(nfdnchar_t) * nameSize); + + nfdnchar_t* p_nameBuf = nameBuf; + for (const nfdnchar_t* p_filterName = filterList[index].name; *p_filterName; + ++p_filterName) { + *p_nameBuf++ = *p_filterName; + } + *p_nameBuf++ = ' '; + *p_nameBuf++ = '('; + const nfdnchar_t* p_extensionStart = filterList[index].spec; + for (const nfdnchar_t* p_spec = filterList[index].spec; true; ++p_spec) { + if (*p_spec == ',' || !*p_spec) { + if (*p_spec == ',') { + *p_nameBuf++ = ','; + *p_nameBuf++ = ' '; + } + + // +1 for the trailing '\0' + nfdnchar_t* extnBuf = NFDi_Malloc(sizeof(nfdnchar_t) * + (p_spec - p_extensionStart + 3)); + nfdnchar_t* p_extnBufEnd = extnBuf; + *p_extnBufEnd++ = '*'; + *p_extnBufEnd++ = '.'; + p_extnBufEnd = copy(p_extensionStart, p_spec, p_extnBufEnd); + *p_extnBufEnd++ = '\0'; + assert((size_t)(p_extnBufEnd - extnBuf) == + sizeof(nfdnchar_t) * (p_spec - p_extensionStart + 3)); + gtk_file_filter_add_pattern(filter, extnBuf); + NFDi_Free(extnBuf); + + if (*p_spec) { + // update the extension start point + p_extensionStart = p_spec + 1; + } else { + // reached the '\0' character + break; + } + } else { + *p_nameBuf++ = *p_spec; + } + } + *p_nameBuf++ = ')'; + *p_nameBuf++ = '\0'; + assert((size_t)(p_nameBuf - nameBuf) == sizeof(nfdnchar_t) * nameSize); + + // add to the filter + gtk_file_filter_set_name(filter, nameBuf); + + // free the memory + NFDi_Free(nameBuf); + + // add filter to chooser + gtk_file_chooser_add_filter(chooser, filter); + } + } + + /* always append a wildcard option to the end*/ + + GtkFileFilter* filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, "All files"); + gtk_file_filter_add_pattern(filter, "*"); + gtk_file_chooser_add_filter(chooser, filter); +} + +// returns null-terminated map (trailing .filter is null) +Pair_GtkFileFilter_FileExtension* AddFiltersToDialogWithMap(GtkFileChooser* chooser, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + Pair_GtkFileFilter_FileExtension* map = NFDi_Malloc( + sizeof(Pair_GtkFileFilter_FileExtension) * (filterCount + 1)); + + if (filterCount) { + assert(filterList); + + // we have filters to add ... format and add them + + for (nfdfiltersize_t index = 0; index != filterCount; ++index) { + GtkFileFilter* filter = gtk_file_filter_new(); + + // store filter in map + map[index].filter = filter; + map[index].extensionBegin = filterList[index].spec; + map[index].extensionEnd = nullptr; + + // count number of file extensions + size_t sep = 1; + for (const nfdnchar_t* p_spec = filterList[index].spec; *p_spec; ++p_spec) { + if (*p_spec == L',') { + ++sep; + } + } + + // friendly name conversions: "png,jpg" -> "Image files + // (png, jpg)" + + // calculate space needed (including the trailing '\0') + size_t nameSize = + sep + strlen(filterList[index].spec) + 3 + strlen(filterList[index].name); + + // malloc the required memory + nfdnchar_t* nameBuf = NFDi_Malloc(sizeof(nfdnchar_t) * nameSize); + + nfdnchar_t* p_nameBuf = nameBuf; + for (const nfdnchar_t* p_filterName = filterList[index].name; *p_filterName; + ++p_filterName) { + *p_nameBuf++ = *p_filterName; + } + *p_nameBuf++ = ' '; + *p_nameBuf++ = '('; + const nfdnchar_t* p_extensionStart = filterList[index].spec; + for (const nfdnchar_t* p_spec = filterList[index].spec; true; ++p_spec) { + if (*p_spec == ',' || !*p_spec) { + if (*p_spec == ',') { + *p_nameBuf++ = ','; + *p_nameBuf++ = ' '; + } + + // +1 for the trailing '\0' + nfdnchar_t* extnBuf = NFDi_Malloc(sizeof(nfdnchar_t) * + (p_spec - p_extensionStart + 3)); + nfdnchar_t* p_extnBufEnd = extnBuf; + *p_extnBufEnd++ = '*'; + *p_extnBufEnd++ = '.'; + p_extnBufEnd = copy(p_extensionStart, p_spec, p_extnBufEnd); + *p_extnBufEnd++ = '\0'; + assert((size_t)(p_extnBufEnd - extnBuf) == + sizeof(nfdnchar_t) * (p_spec - p_extensionStart + 3)); + gtk_file_filter_add_pattern(filter, extnBuf); + NFDi_Free(extnBuf); + + // store current pointer in map (if it's + // the first one) + if (map[index].extensionEnd == nullptr) { + map[index].extensionEnd = p_spec; + } + + if (*p_spec) { + // update the extension start point + p_extensionStart = p_spec + 1; + } else { + // reached the '\0' character + break; + } + } else { + *p_nameBuf++ = *p_spec; + } + } + *p_nameBuf++ = ')'; + *p_nameBuf++ = '\0'; + assert((size_t)(p_nameBuf - nameBuf) == sizeof(nfdnchar_t) * nameSize); + + // add to the filter + gtk_file_filter_set_name(filter, nameBuf); + + // free the memory + NFDi_Free(nameBuf); + + // add filter to chooser + gtk_file_chooser_add_filter(chooser, filter); + } + } + // set trailing map index to null + map[filterCount].filter = nullptr; + + /* always append a wildcard option to the end*/ + GtkFileFilter* filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, "All files"); + gtk_file_filter_add_pattern(filter, "*"); + gtk_file_chooser_add_filter(chooser, filter); + + return map; +} + +void SetDefaultPath(GtkFileChooser* chooser, const char* defaultPath) { + if (!defaultPath || !*defaultPath) return; + + /* GTK+ manual recommends not specifically setting the default path. + We do it anyway in order to be consistent across platforms. + + If consistency with the native OS is preferred, this is the line + to comment out. -ml */ + gtk_file_chooser_set_current_folder(chooser, defaultPath); +} + +void SetDefaultName(GtkFileChooser* chooser, const char* defaultName) { + if (!defaultName || !*defaultName) return; + + gtk_file_chooser_set_current_name(chooser, defaultName); +} + +void WaitForCleanup() { + while (gtk_events_pending()) gtk_main_iteration(); +} + +struct Widget_Guard { + GtkWidget* data; + Widget_Guard(GtkWidget* widget) : data(widget) {} + ~Widget_Guard() { + WaitForCleanup(); + gtk_widget_destroy(data); + WaitForCleanup(); + } +}; + +void FileActivatedSignalHandler(GtkButton* saveButton, void* userdata) { + (void)saveButton; // silence the unused arg warning + + ButtonClickedArgs* args = static_cast(userdata); + GtkFileChooser* chooser = args->chooser; + char* currentFileName = gtk_file_chooser_get_current_name(chooser); + if (*currentFileName) { // string is not empty + + // find a '.' in the file name + const char* p_period = currentFileName; + for (; *p_period; ++p_period) { + if (*p_period == '.') { + break; + } + } + + if (!*p_period) { // there is no '.', so append the default extension + Pair_GtkFileFilter_FileExtension* filterMap = + static_cast(args->map); + GtkFileFilter* currentFilter = gtk_file_chooser_get_filter(chooser); + if (currentFilter) { + for (; filterMap->filter; ++filterMap) { + if (filterMap->filter == currentFilter) break; + } + } + if (filterMap->filter) { + // memory for appended string (including '.' and + // trailing '\0') + char* appendedFileName = NFDi_Malloc( + sizeof(char) * ((p_period - currentFileName) + + (filterMap->extensionEnd - filterMap->extensionBegin) + 2)); + char* p_fileName = copy(currentFileName, p_period, appendedFileName); + *p_fileName++ = '.'; + p_fileName = copy(filterMap->extensionBegin, filterMap->extensionEnd, p_fileName); + *p_fileName++ = '\0'; + + assert(p_fileName - appendedFileName == + (p_period - currentFileName) + + (filterMap->extensionEnd - filterMap->extensionBegin) + 2); + + // set the appended file name + gtk_file_chooser_set_current_name(chooser, appendedFileName); + + // free the memory + NFDi_Free(appendedFileName); + } + } + } + + // free the memory + g_free(currentFileName); +} + +// wrapper for gtk_dialog_run() that brings the dialog to the front +// see issues at: +// https://github.com/btzy/nativefiledialog-extended/issues/31 +// https://github.com/mlabbe/nativefiledialog/pull/92 +// https://github.com/guillaumechereau/noc/pull/11 +gint RunDialogWithFocus(GtkDialog* dialog) { +#if defined(GDK_WINDOWING_X11) + gtk_widget_show_all(GTK_WIDGET(dialog)); // show the dialog so that it gets a display + if (GDK_IS_X11_DISPLAY(gtk_widget_get_display(GTK_WIDGET(dialog)))) { + GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(dialog)); + gdk_window_set_events( + window, + static_cast(gdk_window_get_events(window) | GDK_PROPERTY_CHANGE_MASK)); + gtk_window_present_with_time(GTK_WINDOW(dialog), gdk_x11_get_server_time(window)); + } +#endif + return gtk_dialog_run(dialog); +} + +} // namespace + +const char* NFD_GetError(void) { + return g_errorstr; +} + +void NFD_ClearError(void) { + NFDi_SetError(nullptr); +} + +/* public */ + +nfdresult_t NFD_Init(void) { + // Init GTK + if (!gtk_init_check(NULL, NULL)) { + NFDi_SetError("Failed to initialize GTK+ with gtk_init_check."); + return NFD_ERROR; + } + return NFD_OKAY; +} +void NFD_Quit(void) { + // do nothing, GTK cannot be de-initialized +} + +void NFD_FreePathN(nfdnchar_t* filePath) { + assert(filePath); + g_free(filePath); +} + +nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + GtkWidget* widget = gtk_file_chooser_dialog_new("Open File", + nullptr, + GTK_FILE_CHOOSER_ACTION_OPEN, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Open", + GTK_RESPONSE_ACCEPT, + nullptr); + + // guard to destroy the widget when returning from this function + Widget_Guard widgetGuard(widget); + + /* Build the filter list */ + AddFiltersToDialog(GTK_FILE_CHOOSER(widget), filterList, filterCount); + + /* Set the default path */ + SetDefaultPath(GTK_FILE_CHOOSER(widget), defaultPath); + + if (RunDialogWithFocus(GTK_DIALOG(widget)) == GTK_RESPONSE_ACCEPT) { + // write out the file name + *outPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + + return NFD_OKAY; + } else { + return NFD_CANCEL; + } +} + +nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + GtkWidget* widget = gtk_file_chooser_dialog_new("Open Files", + nullptr, + GTK_FILE_CHOOSER_ACTION_OPEN, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Open", + GTK_RESPONSE_ACCEPT, + nullptr); + + // guard to destroy the widget when returning from this function + Widget_Guard widgetGuard(widget); + + // set select multiple + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(widget), TRUE); + + /* Build the filter list */ + AddFiltersToDialog(GTK_FILE_CHOOSER(widget), filterList, filterCount); + + /* Set the default path */ + SetDefaultPath(GTK_FILE_CHOOSER(widget), defaultPath); + + if (RunDialogWithFocus(GTK_DIALOG(widget)) == GTK_RESPONSE_ACCEPT) { + // write out the file name + GSList* fileList = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widget)); + + *outPaths = static_cast(fileList); + return NFD_OKAY; + } else { + return NFD_CANCEL; + } +} + +nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + GtkWidget* widget = gtk_file_chooser_dialog_new("Save File", + nullptr, + GTK_FILE_CHOOSER_ACTION_SAVE, + "_Cancel", + GTK_RESPONSE_CANCEL, + nullptr); + + // guard to destroy the widget when returning from this function + Widget_Guard widgetGuard(widget); + + GtkWidget* saveButton = gtk_dialog_add_button(GTK_DIALOG(widget), "_Save", GTK_RESPONSE_ACCEPT); + + // Prompt on overwrite + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(widget), TRUE); + + /* Build the filter list */ + ButtonClickedArgs buttonClickedArgs; + buttonClickedArgs.chooser = GTK_FILE_CHOOSER(widget); + buttonClickedArgs.map = + AddFiltersToDialogWithMap(GTK_FILE_CHOOSER(widget), filterList, filterCount); + + /* Set the default path */ + SetDefaultPath(GTK_FILE_CHOOSER(widget), defaultPath); + + /* Set the default file name */ + SetDefaultName(GTK_FILE_CHOOSER(widget), defaultName); + + /* set the handler to add file extension */ + gulong handlerID = g_signal_connect(G_OBJECT(saveButton), + "pressed", + G_CALLBACK(FileActivatedSignalHandler), + static_cast(&buttonClickedArgs)); + + /* invoke the dialog (blocks until dialog is closed) */ + gint result = RunDialogWithFocus(GTK_DIALOG(widget)); + /* unset the handler */ + g_signal_handler_disconnect(G_OBJECT(saveButton), handlerID); + + /* free the filter map */ + NFDi_Free(buttonClickedArgs.map); + + if (result == GTK_RESPONSE_ACCEPT) { + // write out the file name + *outPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + + return NFD_OKAY; + } else { + return NFD_CANCEL; + } +} + +nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { + GtkWidget* widget = gtk_file_chooser_dialog_new("Select folder", + nullptr, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Select", + GTK_RESPONSE_ACCEPT, + nullptr); + + // guard to destroy the widget when returning from this function + Widget_Guard widgetGuard(widget); + + /* Set the default path */ + SetDefaultPath(GTK_FILE_CHOOSER(widget), defaultPath); + + if (RunDialogWithFocus(GTK_DIALOG(widget)) == GTK_RESPONSE_ACCEPT) { + // write out the file name + *outPath = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + + return NFD_OKAY; + } else { + return NFD_CANCEL; + } +} + +nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count) { + assert(pathSet); + // const_cast because methods on GSList aren't const, but it should act + // like const to the caller + GSList* fileList = const_cast(static_cast(pathSet)); + + *count = g_slist_length(fileList); + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t** outPath) { + assert(pathSet); + // const_cast because methods on GSList aren't const, but it should act + // like const to the caller + GSList* fileList = const_cast(static_cast(pathSet)); + + // Note: this takes linear time... but should be good enough + *outPath = static_cast(g_slist_nth_data(fileList, index)); + + return NFD_OKAY; +} + +void NFD_PathSet_FreePathN(const nfdnchar_t* filePath) { + assert(filePath); + (void)filePath; // prevent warning in release build + // no-op, because NFD_PathSet_Free does the freeing for us +} + +void NFD_PathSet_Free(const nfdpathset_t* pathSet) { + assert(pathSet); + // const_cast because methods on GSList aren't const, but it should act + // like const to the caller + GSList* fileList = const_cast(static_cast(pathSet)); + + // free all the nodes + for (GSList* node = fileList; node; node = node->next) { + assert(node->data); + g_free(node->data); + } + + // free the path set memory + g_slist_free(fileList); +} + +nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, nfdpathsetenum_t* outEnumerator) { + // The pathset (GSList) is already a linked list, so the enumeration is itself + outEnumerator->ptr = const_cast(pathSet); + + return NFD_OKAY; +} + +void NFD_PathSet_FreeEnum(nfdpathsetenum_t*) { + // Do nothing, because the enumeration is the pathset itself +} + +nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_t** outPath) { + const GSList* fileList = static_cast(enumerator->ptr); + + if (fileList) { + *outPath = static_cast(fileList->data); + enumerator->ptr = static_cast(fileList->next); + } else { + *outPath = nullptr; + } + + return NFD_OKAY; +} diff --git a/src/nfd_portal.cpp b/src/nfd_portal.cpp new file mode 100644 index 00000000..f5a9302f --- /dev/null +++ b/src/nfd_portal.cpp @@ -0,0 +1,1414 @@ +/* + Native File Dialog Extended + Repository: https://github.com/btzy/nativefiledialog-extended + License: Zlib + Authors: Bernard Teo + + Note: We do not check for malloc failure on Linux - Linux overcommits memory! +*/ + +#include +#include +#include +#include +#include +#include +#include +#include // for the random token string +#include // for access() + +#include "nfd.h" + +/* +Define NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION to 0 if you don't want the file extension to be +appended when missing. Linux programs usually doesn't append the file extension, but for consistency +with other OSes we append it by default. +*/ +#ifndef NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION +#define NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION 1 +#endif + +namespace { + +template +T* NFDi_Malloc(size_t bytes) { + void* ptr = malloc(bytes); + assert(ptr); // Linux malloc never fails + + return static_cast(ptr); +} + +template +void NFDi_Free(T* ptr) { + assert(ptr); + free(static_cast(ptr)); +} + +template +struct Free_Guard { + T* data; + Free_Guard(T* freeable) noexcept : data(freeable) {} + ~Free_Guard() { NFDi_Free(data); } +}; + +template +struct FreeCheck_Guard { + T* data; + FreeCheck_Guard(T* freeable = nullptr) noexcept : data(freeable) {} + ~FreeCheck_Guard() { + if (data) NFDi_Free(data); + } +}; + +struct DBusMessage_Guard { + DBusMessage* data; + DBusMessage_Guard(DBusMessage* freeable) noexcept : data(freeable) {} + ~DBusMessage_Guard() { dbus_message_unref(data); } +}; + +/* D-Bus connection handle */ +DBusConnection* dbus_conn; +/* current D-Bus error */ +DBusError dbus_err; +/* current error (may be a pointer to the D-Bus error message above, or a pointer to some string + * literal) */ +const char* err_ptr = nullptr; +/* the unique name of our connection, used for the Request handle; owned by D-Bus so we don't free + * it */ +const char* dbus_unique_name; + +void NFDi_SetError(const char* msg) { + err_ptr = msg; +} + +template +T* copy(const T* begin, const T* end, T* out) { + for (; begin != end; ++begin) { + *out++ = *begin; + } + return out; +} + +template +T* transform(const T* begin, const T* end, T* out, Callback callback) { + for (; begin != end; ++begin) { + *out++ = callback(*begin); + } + return out; +} + +constexpr const char* STR_EMPTY = ""; +constexpr const char* STR_OPEN_FILE = "Open File"; +constexpr const char* STR_OPEN_FILES = "Open Files"; +constexpr const char* STR_SAVE_FILE = "Save File"; +constexpr const char* STR_SELECT_FOLDER = "Select Folder"; +constexpr const char* STR_HANDLE_TOKEN = "handle_token"; +constexpr const char* STR_MULTIPLE = "multiple"; +constexpr const char* STR_DIRECTORY = "directory"; +constexpr const char* STR_FILTERS = "filters"; +constexpr const char* STR_CURRENT_FILTER = "current_filter"; +constexpr const char* STR_CURRENT_NAME = "current_name"; +constexpr const char* STR_CURRENT_FOLDER = "current_folder"; +constexpr const char* STR_CURRENT_FILE = "current_file"; +constexpr const char* STR_ALL_FILES = "All files"; +constexpr const char* STR_ASTERISK = "*"; + +template +void AppendOpenFileQueryTitle(DBusMessageIter&); +template <> +void AppendOpenFileQueryTitle(DBusMessageIter& iter) { + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_OPEN_FILE); +} +template <> +void AppendOpenFileQueryTitle(DBusMessageIter& iter) { + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_OPEN_FILES); +} +template <> +void AppendOpenFileQueryTitle(DBusMessageIter& iter) { + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_SELECT_FOLDER); +} + +void AppendSaveFileQueryTitle(DBusMessageIter& iter) { + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_SAVE_FILE); +} + +void AppendOpenFileQueryDictEntryHandleToken(DBusMessageIter& sub_iter, const char* handle_token) { + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_HANDLE_TOKEN); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "s", &variant_iter); + dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &handle_token); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} + +template +void AppendOpenFileQueryDictEntryMultiple(DBusMessageIter&); +template <> +void AppendOpenFileQueryDictEntryMultiple(DBusMessageIter& sub_iter) { + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_MULTIPLE); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "b", &variant_iter); + { + int b = true; + dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_BOOLEAN, &b); + } + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} +template <> +void AppendOpenFileQueryDictEntryMultiple(DBusMessageIter&) {} + +template +void AppendOpenFileQueryDictEntryDirectory(DBusMessageIter&); +template <> +void AppendOpenFileQueryDictEntryDirectory(DBusMessageIter& sub_iter) { + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_DIRECTORY); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "b", &variant_iter); + { + int b = true; + dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_BOOLEAN, &b); + } + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} +template <> +void AppendOpenFileQueryDictEntryDirectory(DBusMessageIter&) {} + +void AppendSingleFilter(DBusMessageIter& base_iter, const nfdnfilteritem_t& filter) { + DBusMessageIter filter_list_struct_iter; + DBusMessageIter filter_sublist_iter; + DBusMessageIter filter_sublist_struct_iter; + dbus_message_iter_open_container( + &base_iter, DBUS_TYPE_STRUCT, nullptr, &filter_list_struct_iter); + // count number of file extensions + size_t sep = 1; + for (const char* p = filter.spec; *p; ++p) { + if (*p == L',') { + ++sep; + } + } + { + const size_t name_len = strlen(filter.name); + const size_t spec_len = strlen(filter.spec); + char* buf = static_cast(alloca(sep + name_len + 2 + spec_len + 1)); + char* buf_end = buf; + buf_end = copy(filter.name, filter.name + name_len, buf_end); + *buf_end++ = ' '; + *buf_end++ = '('; + const char* spec_ptr = filter.spec; + do { + *buf_end++ = *spec_ptr; + if (*spec_ptr == ',') *buf_end++ = ' '; + ++spec_ptr; + } while (*spec_ptr != '\0'); + *buf_end++ = ')'; + *buf_end = '\0'; + dbus_message_iter_append_basic(&filter_list_struct_iter, DBUS_TYPE_STRING, &buf); + } + { + dbus_message_iter_open_container( + &filter_list_struct_iter, DBUS_TYPE_ARRAY, "(us)", &filter_sublist_iter); + const char* extn_begin = filter.spec; + const char* extn_end = extn_begin; + while (true) { + dbus_message_iter_open_container( + &filter_sublist_iter, DBUS_TYPE_STRUCT, nullptr, &filter_sublist_struct_iter); + { + const unsigned zero = 0; + dbus_message_iter_append_basic( + &filter_sublist_struct_iter, DBUS_TYPE_UINT32, &zero); + } + do { + ++extn_end; + } while (*extn_end != ',' && *extn_end != '\0'); + char* buf = static_cast(alloca(2 + (extn_end - extn_begin) + 1)); + char* buf_end = buf; + *buf_end++ = '*'; + *buf_end++ = '.'; + buf_end = copy(extn_begin, extn_end, buf_end); + *buf_end = '\0'; + dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &buf); + dbus_message_iter_close_container(&filter_sublist_iter, &filter_sublist_struct_iter); + if (*extn_end == '\0') { + break; + } + extn_begin = extn_end + 1; + extn_end = extn_begin; + } + } + dbus_message_iter_close_container(&filter_list_struct_iter, &filter_sublist_iter); + dbus_message_iter_close_container(&base_iter, &filter_list_struct_iter); +} + +bool AppendSingleFilterCheckExtn(DBusMessageIter& base_iter, + const nfdnfilteritem_t& filter, + const nfdnchar_t* match_extn) { + DBusMessageIter filter_list_struct_iter; + DBusMessageIter filter_sublist_iter; + DBusMessageIter filter_sublist_struct_iter; + dbus_message_iter_open_container( + &base_iter, DBUS_TYPE_STRUCT, nullptr, &filter_list_struct_iter); + // count number of file extensions + size_t sep = 1; + for (const char* p = filter.spec; *p; ++p) { + if (*p == L',') { + ++sep; + } + } + { + const size_t name_len = strlen(filter.name); + const size_t spec_len = strlen(filter.spec); + char* buf = static_cast(alloca(sep + name_len + 2 + spec_len + 1)); + char* buf_end = buf; + buf_end = copy(filter.name, filter.name + name_len, buf_end); + *buf_end++ = ' '; + *buf_end++ = '('; + const char* spec_ptr = filter.spec; + do { + *buf_end++ = *spec_ptr; + if (*spec_ptr == ',') *buf_end++ = ' '; + ++spec_ptr; + } while (*spec_ptr != '\0'); + *buf_end++ = ')'; + *buf_end = '\0'; + dbus_message_iter_append_basic(&filter_list_struct_iter, DBUS_TYPE_STRING, &buf); + } + bool extn_matched = false; + { + dbus_message_iter_open_container( + &filter_list_struct_iter, DBUS_TYPE_ARRAY, "(us)", &filter_sublist_iter); + const char* extn_begin = filter.spec; + const char* extn_end = extn_begin; + while (true) { + dbus_message_iter_open_container( + &filter_sublist_iter, DBUS_TYPE_STRUCT, nullptr, &filter_sublist_struct_iter); + { + const unsigned zero = 0; + dbus_message_iter_append_basic( + &filter_sublist_struct_iter, DBUS_TYPE_UINT32, &zero); + } + do { + ++extn_end; + } while (*extn_end != ',' && *extn_end != '\0'); + char* buf = static_cast(alloca(2 + (extn_end - extn_begin) + 1)); + char* buf_end = buf; + *buf_end++ = '*'; + *buf_end++ = '.'; + buf_end = copy(extn_begin, extn_end, buf_end); + *buf_end = '\0'; + dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &buf); + dbus_message_iter_close_container(&filter_sublist_iter, &filter_sublist_struct_iter); + if (!extn_matched) { + const char* match_extn_p; + const char* p; + for (p = extn_begin, match_extn_p = match_extn; p != extn_end && *match_extn_p; + ++p, ++match_extn_p) { + if (*p != *match_extn_p) break; + } + if (p == extn_end && !*match_extn_p) { + extn_matched = true; + } + } + if (*extn_end == '\0') { + break; + } + extn_begin = extn_end + 1; + extn_end = extn_begin; + } + } + dbus_message_iter_close_container(&filter_list_struct_iter, &filter_sublist_iter); + dbus_message_iter_close_container(&base_iter, &filter_list_struct_iter); + return extn_matched; +} + +void AppendWildcardFilter(DBusMessageIter& base_iter) { + DBusMessageIter filter_list_struct_iter; + DBusMessageIter filter_sublist_iter; + DBusMessageIter filter_sublist_struct_iter; + dbus_message_iter_open_container( + &base_iter, DBUS_TYPE_STRUCT, nullptr, &filter_list_struct_iter); + dbus_message_iter_append_basic(&filter_list_struct_iter, DBUS_TYPE_STRING, &STR_ALL_FILES); + dbus_message_iter_open_container( + &filter_list_struct_iter, DBUS_TYPE_ARRAY, "(us)", &filter_sublist_iter); + dbus_message_iter_open_container( + &filter_sublist_iter, DBUS_TYPE_STRUCT, nullptr, &filter_sublist_struct_iter); + { + const unsigned zero = 0; + dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_UINT32, &zero); + } + dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &STR_ASTERISK); + dbus_message_iter_close_container(&filter_sublist_iter, &filter_sublist_struct_iter); + dbus_message_iter_close_container(&filter_list_struct_iter, &filter_sublist_iter); + dbus_message_iter_close_container(&base_iter, &filter_list_struct_iter); +} + +template +void AppendOpenFileQueryDictEntryFilters(DBusMessageIter&, + const nfdnfilteritem_t*, + nfdfiltersize_t); +template <> +void AppendOpenFileQueryDictEntryFilters(DBusMessageIter& sub_iter, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + if (filterCount != 0) { + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + DBusMessageIter filter_list_iter; + + // filters + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_FILTERS); + dbus_message_iter_open_container( + &sub_sub_iter, DBUS_TYPE_VARIANT, "a(sa(us))", &variant_iter); + dbus_message_iter_open_container( + &variant_iter, DBUS_TYPE_ARRAY, "(sa(us))", &filter_list_iter); + for (nfdfiltersize_t i = 0; i != filterCount; ++i) { + AppendSingleFilter(filter_list_iter, filterList[i]); + } + AppendWildcardFilter(filter_list_iter); + dbus_message_iter_close_container(&variant_iter, &filter_list_iter); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); + + // current_filter + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_CURRENT_FILTER); + dbus_message_iter_open_container( + &sub_sub_iter, DBUS_TYPE_VARIANT, "(sa(us))", &variant_iter); + AppendSingleFilter(variant_iter, filterList[0]); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); + } +} +template <> +void AppendOpenFileQueryDictEntryFilters(DBusMessageIter&, + const nfdnfilteritem_t*, + nfdfiltersize_t) {} + +void AppendSaveFileQueryDictEntryFilters(DBusMessageIter& sub_iter, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultName) { + if (filterCount != 0) { + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + DBusMessageIter filter_list_iter; + + // The extension of the defaultName (without the '.'). If NULL, it means that there is no + // extension. + const nfdnchar_t* extn = NULL; + if (defaultName) { + const nfdnchar_t* p = defaultName; + while (*p) ++p; + while (*--p != '.') + ; + ++p; + if (*p) extn = p; + } + bool extn_matched = false; + size_t selected_filter_index; + + // filters + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_FILTERS); + dbus_message_iter_open_container( + &sub_sub_iter, DBUS_TYPE_VARIANT, "a(sa(us))", &variant_iter); + dbus_message_iter_open_container( + &variant_iter, DBUS_TYPE_ARRAY, "(sa(us))", &filter_list_iter); + for (nfdfiltersize_t i = 0; i != filterCount; ++i) { + if (!extn_matched && extn) { + extn_matched = AppendSingleFilterCheckExtn(filter_list_iter, filterList[i], extn); + if (extn_matched) selected_filter_index = i; + } else { + AppendSingleFilter(filter_list_iter, filterList[i]); + } + } + AppendWildcardFilter(filter_list_iter); + dbus_message_iter_close_container(&variant_iter, &filter_list_iter); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); + + // current_filter + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_CURRENT_FILTER); + dbus_message_iter_open_container( + &sub_sub_iter, DBUS_TYPE_VARIANT, "(sa(us))", &variant_iter); + if (extn_matched) { + AppendSingleFilter(variant_iter, filterList[selected_filter_index]); + } else { + AppendWildcardFilter(variant_iter); + } + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); + } +} + +void AppendSaveFileQueryDictEntryCurrentName(DBusMessageIter& sub_iter, const char* name) { + if (!name) return; + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_CURRENT_NAME); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "s", &variant_iter); + dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &name); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} + +void AppendSaveFileQueryDictEntryCurrentFolder(DBusMessageIter& sub_iter, const char* path) { + if (!path) return; + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + DBusMessageIter array_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_CURRENT_FOLDER); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "ay", &variant_iter); + dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, "y", &array_iter); + // Append string as byte array, including the terminating null byte as required by the portal. + const char* p = path; + do { + dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_BYTE, p); + } while (*p++); + dbus_message_iter_close_container(&variant_iter, &array_iter); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} + +void AppendSaveFileQueryDictEntryCurrentFile(DBusMessageIter& sub_iter, + const char* path, + const char* name) { + if (!path || !name) return; + const size_t path_len = strlen(path); + const size_t name_len = strlen(name); + char* pathname; + char* pathname_end; + size_t pathname_len; + if (path_len && path[path_len - 1] == '/') { + pathname_len = path_len + name_len; + pathname = NFDi_Malloc(pathname_len + 1); + pathname_end = pathname; + pathname_end = copy(path, path + path_len, pathname_end); + pathname_end = copy(name, name + name_len, pathname_end); + *pathname_end++ = '\0'; + } else { + pathname_len = path_len + 1 + name_len; + pathname = NFDi_Malloc(pathname_len + 1); + pathname_end = pathname; + pathname_end = copy(path, path + path_len, pathname_end); + *pathname_end++ = '/'; + pathname_end = copy(name, name + name_len, pathname_end); + *pathname_end++ = '\0'; + } + Free_Guard guard(pathname); + if (access(pathname, F_OK) != 0) return; + DBusMessageIter sub_sub_iter; + DBusMessageIter variant_iter; + DBusMessageIter array_iter; + dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_DICT_ENTRY, nullptr, &sub_sub_iter); + dbus_message_iter_append_basic(&sub_sub_iter, DBUS_TYPE_STRING, &STR_CURRENT_FILE); + dbus_message_iter_open_container(&sub_sub_iter, DBUS_TYPE_VARIANT, "ay", &variant_iter); + dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, "y", &array_iter); + // This includes the terminating null character, which is required by the portal. + for (const char* p = pathname; p != pathname_end; ++p) { + dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_BYTE, p); + } + dbus_message_iter_close_container(&variant_iter, &array_iter); + dbus_message_iter_close_container(&sub_sub_iter, &variant_iter); + dbus_message_iter_close_container(&sub_iter, &sub_sub_iter); +} + +// Append OpenFile() portal params to the given query. +template +void AppendOpenFileQueryParams(DBusMessage* query, + const char* handle_token, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + DBusMessageIter iter; + dbus_message_iter_init_append(query, &iter); + + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_EMPTY); + + AppendOpenFileQueryTitle(iter); + + DBusMessageIter sub_iter; + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub_iter); + AppendOpenFileQueryDictEntryHandleToken(sub_iter, handle_token); + AppendOpenFileQueryDictEntryMultiple(sub_iter); + AppendOpenFileQueryDictEntryDirectory(sub_iter); + AppendOpenFileQueryDictEntryFilters(sub_iter, filterList, filterCount); + dbus_message_iter_close_container(&iter, &sub_iter); +} + +// Append SaveFile() portal params to the given query. +void AppendSaveFileQueryParams(DBusMessage* query, + const char* handle_token, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + DBusMessageIter iter; + dbus_message_iter_init_append(query, &iter); + + dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_EMPTY); + + AppendSaveFileQueryTitle(iter); + + DBusMessageIter sub_iter; + dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "{sv}", &sub_iter); + AppendOpenFileQueryDictEntryHandleToken(sub_iter, handle_token); + AppendSaveFileQueryDictEntryFilters(sub_iter, filterList, filterCount, defaultName); + AppendSaveFileQueryDictEntryCurrentName(sub_iter, defaultName); + AppendSaveFileQueryDictEntryCurrentFolder(sub_iter, defaultPath); + AppendSaveFileQueryDictEntryCurrentFile(sub_iter, defaultPath, defaultName); + dbus_message_iter_close_container(&iter, &sub_iter); +} + +nfdresult_t ReadDictImpl(const char*, DBusMessageIter&) { + return NFD_OKAY; +} + +template +nfdresult_t ReadDictImpl(const char* key, + DBusMessageIter& iter, + const char*& candidate_key, + Callback& candidate_callback, + Args&... args) { + if (strcmp(key, candidate_key) == 0) { + // this is the correct callback + return candidate_callback(iter); + } else { + return ReadDictImpl(key, iter, args...); + } +} + +// Read a dictionary from the given iterator. The type of the element under this iterator will be +// checked. The args are alternately key and callback. Key is a const char*, and callback is a +// function that returns nfdresult_t. Return NFD_ERROR to stop processing and return immediately. +template +nfdresult_t ReadDict(DBusMessageIter iter, Args... args) { + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { + NFDi_SetError("D-Bus response signal argument is not an array."); + return NFD_ERROR; + } + DBusMessageIter sub_iter; + dbus_message_iter_recurse(&iter, &sub_iter); + while (dbus_message_iter_get_arg_type(&sub_iter) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter de_iter; + dbus_message_iter_recurse(&sub_iter, &de_iter); + if (dbus_message_iter_get_arg_type(&de_iter) != DBUS_TYPE_STRING) { + NFDi_SetError("D-Bus response signal dict entry does not start with a string."); + return NFD_ERROR; + } + const char* key; + dbus_message_iter_get_basic(&de_iter, &key); + if (!dbus_message_iter_next(&de_iter)) { + NFDi_SetError("D-Bus response signal dict entry is missing one or more arguments."); + return NFD_ERROR; + } + // unwrap the variant + if (dbus_message_iter_get_arg_type(&de_iter) != DBUS_TYPE_VARIANT) { + NFDi_SetError("D-Bus response signal dict entry value is not a variant."); + return NFD_ERROR; + } + DBusMessageIter de_variant_iter; + dbus_message_iter_recurse(&de_iter, &de_variant_iter); + if (ReadDictImpl(key, de_variant_iter, args...) == NFD_ERROR) return NFD_ERROR; + if (!dbus_message_iter_next(&sub_iter)) break; + } + return NFD_OKAY; +} + +// Read the message, returning an iterator to the `results` dictionary of the response. If response +// was okay, then returns NFD_OKAY and set `resultsIter` to the results dictionary iterator (this is +// the iterator to the entire dictionary (which has type DBUS_TYPE_ARRAY), not an iterator to the +// first item in the dictionary). It does not check that this iterator is DBUS_TYPE_ARRAY; you +// should use ReadDict() which will check it. Otherwise, returns NFD_CANCEL or NFD_ERROR as +// appropriate, and does not modify `resultsIter`. `resultsIter` can be copied by value. +nfdresult_t ReadResponseResults(DBusMessage* msg, DBusMessageIter& resultsIter) { + DBusMessageIter iter; + if (!dbus_message_iter_init(msg, &iter)) { + NFDi_SetError("D-Bus response signal is missing one or more arguments."); + return NFD_ERROR; + } + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_UINT32) { + NFDi_SetError("D-Bus response signal argument is not a uint32."); + return NFD_ERROR; + } + dbus_uint32_t resp_code; + dbus_message_iter_get_basic(&iter, &resp_code); + if (resp_code != 0) { + if (resp_code == 1) { + // User pressed cancel + return NFD_CANCEL; + } else { + // Some error occurred + NFDi_SetError("D-Bus file dialog interaction was ended abruptly."); + return NFD_ERROR; + } + } + // User successfully responded + if (!dbus_message_iter_next(&iter)) { + NFDi_SetError("D-Bus response signal is missing one or more arguments."); + return NFD_ERROR; + } + resultsIter = iter; + return NFD_OKAY; +} + +// Read the message. If response was okay, then returns NFD_OKAY and set `uriIter` to the URI array +// iterator. Otherwise, returns NFD_CANCEL or NFD_ERROR as appropriate, and does not modify +// `uriIter`. `uriIter` can be copied by value. +nfdresult_t ReadResponseUris(DBusMessage* msg, DBusMessageIter& uriIter) { + DBusMessageIter iter; + const nfdresult_t res = ReadResponseResults(msg, iter); + if (res != NFD_OKAY) return res; + bool has_uris = false; + if (ReadDict(iter, "uris", [&uriIter, &has_uris](DBusMessageIter& uris_iter) { + if (dbus_message_iter_get_arg_type(&uris_iter) != DBUS_TYPE_ARRAY) { + NFDi_SetError("D-Bus response signal URI iter is not an array."); + return NFD_ERROR; + } + dbus_message_iter_recurse(&uris_iter, &uriIter); + has_uris = true; + return NFD_OKAY; + }) == NFD_ERROR) + return NFD_ERROR; + + if (!has_uris) { + NFDi_SetError("D-Bus response signal has no URI field."); + return NFD_ERROR; + } + return NFD_OKAY; +} + +// Same as ReadResponseUris, but does not perform any message type checks. +// You should only use this if you previously used ReadResponseUris and it returned NFD_OKAY! +void ReadResponseUrisUnchecked(DBusMessage* msg, DBusMessageIter& uriIter) { + DBusMessageIter iter; + dbus_message_iter_init(msg, &iter); + dbus_message_iter_next(&iter); + ReadDict(iter, "uris", [&uriIter](DBusMessageIter& uris_iter) { + dbus_message_iter_recurse(&uris_iter, &uriIter); + return NFD_OKAY; + }); +} +nfdpathsetsize_t ReadResponseUrisUncheckedGetArraySize(DBusMessage* msg) { + DBusMessageIter iter; + dbus_message_iter_init(msg, &iter); + dbus_message_iter_next(&iter); + nfdpathsetsize_t sz = 0; // Initialization will never be used, but we initialize it to prevent + // the uninitialized warning otherwise. + ReadDict(iter, "uris", [&sz](DBusMessageIter& uris_iter) { + sz = dbus_message_iter_get_element_count(&uris_iter); + return NFD_OKAY; + }); + return sz; +} + +// Read the response URI. If response was okay, then returns NFD_OKAY and set file to it (the +// pointer is set to some string owned by msg, so you should not manually free it). Otherwise, +// returns NFD_CANCEL or NFD_ERROR as appropriate, and does not modify `file`. +nfdresult_t ReadResponseUrisSingle(DBusMessage* msg, const char*& file) { + DBusMessageIter uri_iter; + const nfdresult_t res = ReadResponseUris(msg, uri_iter); + if (res != NFD_OKAY) return res; // can be NFD_CANCEL or NFD_ERROR + if (dbus_message_iter_get_arg_type(&uri_iter) != DBUS_TYPE_STRING) { + NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_ERROR; + } + dbus_message_iter_get_basic(&uri_iter, &file); + return NFD_OKAY; +} + +#if NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION == 1 +// Read the response URI and selected extension (in the form "*.abc" or "*") (if any). If response +// was okay, then returns NFD_OKAY and set file and extn to them (the pointer is set to some string +// owned by msg, so you should not manually free it). `file` is the user-entered file name, and +// `extn` is the selected file extension (the first one if there are multiple extensions in the +// selected option) (this is NULL if "All files" is selected). Otherwise, returns NFD_CANCEL or +// NFD_ERROR as appropriate, and does not modify `file` and `extn`. +nfdresult_t ReadResponseUrisSingleAndCurrentExtension(DBusMessage* msg, + const char*& file, + const char*& extn) { + DBusMessageIter iter; + const nfdresult_t res = ReadResponseResults(msg, iter); + if (res != NFD_OKAY) return res; + const char* tmp_file = nullptr; + const char* tmp_extn = nullptr; + if (ReadDict( + iter, + "uris", + [&tmp_file](DBusMessageIter& uris_iter) { + if (dbus_message_iter_get_arg_type(&uris_iter) != DBUS_TYPE_ARRAY) { + NFDi_SetError("D-Bus response signal URI iter is not an array."); + return NFD_ERROR; + } + DBusMessageIter uri_iter; + dbus_message_iter_recurse(&uris_iter, &uri_iter); + if (dbus_message_iter_get_arg_type(&uri_iter) != DBUS_TYPE_STRING) { + NFDi_SetError("D-Bus response signal URI sub iter is not a string."); + return NFD_ERROR; + } + dbus_message_iter_get_basic(&uri_iter, &tmp_file); + return NFD_OKAY; + }, + "current_filter", + [&tmp_extn](DBusMessageIter& current_filter_iter) { + // current_filter is best_effort, so if we fail, we still return NFD_OKAY. + if (dbus_message_iter_get_arg_type(¤t_filter_iter) != DBUS_TYPE_STRUCT) { + // NFDi_SetError("D-Bus response signal current_filter iter is not a struct."); + return NFD_OKAY; + } + DBusMessageIter current_filter_struct_iter; + dbus_message_iter_recurse(¤t_filter_iter, ¤t_filter_struct_iter); + if (!dbus_message_iter_next(¤t_filter_struct_iter)) { + // NFDi_SetError("D-Bus response signal current_filter struct iter ended + // prematurely."); + return NFD_OKAY; + } + if (dbus_message_iter_get_arg_type(¤t_filter_struct_iter) != + DBUS_TYPE_ARRAY) { + // NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_OKAY; + } + DBusMessageIter current_filter_array_iter; + dbus_message_iter_recurse(¤t_filter_struct_iter, ¤t_filter_array_iter); + if (dbus_message_iter_get_arg_type(¤t_filter_array_iter) != + DBUS_TYPE_STRUCT) { + // NFDi_SetError("D-Bus response signal current_filter iter is not a struct."); + return NFD_OKAY; + } + DBusMessageIter current_filter_extn_iter; + dbus_message_iter_recurse(¤t_filter_array_iter, ¤t_filter_extn_iter); + if (dbus_message_iter_get_arg_type(¤t_filter_extn_iter) != DBUS_TYPE_UINT32) { + // NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_OKAY; + } + dbus_uint32_t type; + dbus_message_iter_get_basic(¤t_filter_extn_iter, &type); + if (type != 0) { + // NFDi_SetError("Wrong filter type."); + return NFD_OKAY; + } + if (!dbus_message_iter_next(¤t_filter_extn_iter)) { + // NFDi_SetError("D-Bus response signal current_filter struct iter ended + // prematurely."); + return NFD_OKAY; + } + if (dbus_message_iter_get_arg_type(¤t_filter_extn_iter) != DBUS_TYPE_STRING) { + // NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_OKAY; + } + dbus_message_iter_get_basic(¤t_filter_extn_iter, &tmp_extn); + return NFD_OKAY; + }) == NFD_ERROR) + return NFD_ERROR; + + if (!tmp_file) { + NFDi_SetError("D-Bus response signal has no URI field."); + return NFD_ERROR; + } + file = tmp_file; + extn = tmp_extn; + return NFD_OKAY; +} +#endif + +// Appends up to 64 random chars to the given pointer. Returns the end of the appended chars. +char* Generate64RandomChars(char* out) { + size_t amount = 32; + while (amount > 0) { + unsigned char buf[32]; + ssize_t res = getrandom(buf, amount, 0); + if (res == -1) { + if (errno == EINTR) + continue; + else + break; // too bad, urandom isn't working well + } + amount -= res; + // we encode each random char using two chars, since they must be [A-Z][a-z][0-9]_ + for (size_t i = 0; i != static_cast(res); ++i) { + *out++ = 'A' + static_cast(buf[i] & 15); + *out++ = 'A' + static_cast(buf[i] >> 4); + } + } + return out; +} + +constexpr const char STR_RESPONSE_HANDLE_PREFIX[] = "/org/freedesktop/portal/desktop/request/"; +constexpr size_t STR_RESPONSE_HANDLE_PREFIX_LEN = + sizeof(STR_RESPONSE_HANDLE_PREFIX) - 1; // -1 to remove the \0. + +// Allocates and returns a path like "/org/freedesktop/portal/desktop/request/SENDER/TOKEN" with +// randomly generated TOKEN as recommended by flatpak. `handle_token_ptr` is a pointer to the +// TOKEN part. +char* MakeUniqueObjectPath(const char** handle_token_ptr) { + const char* sender = dbus_unique_name; + if (*sender == ':') ++sender; + const size_t sender_len = strlen(sender); + const size_t sz = STR_RESPONSE_HANDLE_PREFIX_LEN + sender_len + 1 + + 64; // 1 for '/', followed by 64 random chars + char* path = NFDi_Malloc(sz + 1); + char* path_ptr = path; + path_ptr = copy(STR_RESPONSE_HANDLE_PREFIX, + STR_RESPONSE_HANDLE_PREFIX + STR_RESPONSE_HANDLE_PREFIX_LEN, + path_ptr); + path_ptr = transform( + sender, sender + sender_len, path_ptr, [](char ch) { return ch != '.' ? ch : '_'; }); + *path_ptr++ = '/'; + *handle_token_ptr = path_ptr; + path_ptr = Generate64RandomChars(path_ptr); + *path_ptr = '\0'; + return path; +} + +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_1[] = + "type='signal',sender='org.freedesktop.portal.Desktop',path='"; +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_1_LEN = + sizeof(STR_RESPONSE_SUBSCRIPTION_PATH_1) - 1; +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_2[] = + "',interface='org.freedesktop.portal.Request',member='Response',destination='"; +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_2_LEN = + sizeof(STR_RESPONSE_SUBSCRIPTION_PATH_2) - 1; +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_3[] = "'"; +constexpr const char STR_RESPONSE_SUBSCRIPTION_PATH_3_LEN = + sizeof(STR_RESPONSE_SUBSCRIPTION_PATH_3) - 1; + +class DBusSignalSubscriptionHandler { + private: + char* sub_cmd; + + public: + DBusSignalSubscriptionHandler() : sub_cmd(nullptr) {} + ~DBusSignalSubscriptionHandler() { + if (sub_cmd) Unsubscribe(); + } + + nfdresult_t Subscribe(const char* handle_path) { + if (sub_cmd) Unsubscribe(); + sub_cmd = MakeResponseSubscriptionPath(handle_path, dbus_unique_name); + DBusError err; + dbus_error_init(&err); + dbus_bus_add_match(dbus_conn, sub_cmd, &err); + if (dbus_error_is_set(&err)) { + dbus_error_free(&dbus_err); + dbus_move_error(&err, &dbus_err); + NFDi_SetError(dbus_err.message); + return NFD_ERROR; + } + return NFD_OKAY; + } + + void Unsubscribe() { + DBusError err; + dbus_error_init(&err); + dbus_bus_remove_match(dbus_conn, sub_cmd, &err); + NFDi_Free(sub_cmd); + sub_cmd = nullptr; + dbus_error_free( + &err); // silence unsubscribe errors, because this is intuitively part of 'cleanup' + } + + private: + static char* MakeResponseSubscriptionPath(const char* handle_path, const char* unique_name) { + const size_t handle_path_len = strlen(handle_path); + const size_t unique_name_len = strlen(unique_name); + const size_t sz = STR_RESPONSE_SUBSCRIPTION_PATH_1_LEN + handle_path_len + + STR_RESPONSE_SUBSCRIPTION_PATH_2_LEN + unique_name_len + + STR_RESPONSE_SUBSCRIPTION_PATH_3_LEN; + char* res = NFDi_Malloc(sz + 1); + char* res_ptr = res; + res_ptr = copy(STR_RESPONSE_SUBSCRIPTION_PATH_1, + STR_RESPONSE_SUBSCRIPTION_PATH_1 + STR_RESPONSE_SUBSCRIPTION_PATH_1_LEN, + res_ptr); + res_ptr = copy(handle_path, handle_path + handle_path_len, res_ptr); + res_ptr = copy(STR_RESPONSE_SUBSCRIPTION_PATH_2, + STR_RESPONSE_SUBSCRIPTION_PATH_2 + STR_RESPONSE_SUBSCRIPTION_PATH_2_LEN, + res_ptr); + res_ptr = copy(unique_name, unique_name + unique_name_len, res_ptr); + res_ptr = copy(STR_RESPONSE_SUBSCRIPTION_PATH_3, + STR_RESPONSE_SUBSCRIPTION_PATH_3 + STR_RESPONSE_SUBSCRIPTION_PATH_3_LEN, + res_ptr); + *res_ptr = '\0'; + return res; + } +}; + +constexpr const char FILE_URI_PREFIX[] = "file://"; +constexpr size_t FILE_URI_PREFIX_LEN = sizeof(FILE_URI_PREFIX) - 1; + +// If fileUri starts with "file://", strips that prefix and copies it to a new buffer, and make +// outPath point to it, and returns NFD_OKAY. Otherwise, does not modify outPath and returns +// NFD_ERROR (with the correct error set) +nfdresult_t AllocAndCopyFilePath(const char* fileUri, char*& outPath) { + const char* prefix_begin = FILE_URI_PREFIX; + const char* const prefix_end = FILE_URI_PREFIX + FILE_URI_PREFIX_LEN; + for (; prefix_begin != prefix_end; ++prefix_begin, ++fileUri) { + if (*prefix_begin != *fileUri) { + NFDi_SetError("D-Bus freedesktop portal returned a URI that is not a file URI."); + return NFD_ERROR; + } + } + size_t len = strlen(fileUri); + char* path_without_prefix = NFDi_Malloc(len + 1); + copy(fileUri, fileUri + (len + 1), path_without_prefix); + outPath = path_without_prefix; + return NFD_OKAY; +} + +#if NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION == 1 +bool TryGetValidExtension(const char* extn, + const char*& trimmed_extn, + const char*& trimmed_extn_end) { + if (!extn) return false; + if (*extn != '*') return false; + ++extn; + if (*extn != '.') return false; + trimmed_extn = extn; + for (++extn; *extn != '\0'; ++extn) + ; + ++extn; + trimmed_extn_end = extn; + return true; +} + +// Like AllocAndCopyFilePath, but if `fileUri` has no extension and `extn` is usable, appends the +// extension. `extn` could be null, in which case no extension will ever be appended. `extn` is +// expected to be either in the form "*.abc" or "*", but this function will check for it, and ignore +// the extension if it is not in the correct form. +nfdresult_t AllocAndCopyFilePathWithExtn(const char* fileUri, const char* extn, char*& outPath) { + const char* prefix_begin = FILE_URI_PREFIX; + const char* const prefix_end = FILE_URI_PREFIX + FILE_URI_PREFIX_LEN; + for (; prefix_begin != prefix_end; ++prefix_begin, ++fileUri) { + if (*prefix_begin != *fileUri) { + NFDi_SetError("D-Bus freedesktop portal returned a URI that is not a file URI."); + return NFD_ERROR; + } + } + + const char* file_end = fileUri; + for (; *file_end != '\0'; ++file_end) + ; + const char* file_it = file_end; + do { + --file_it; + } while (*file_it != '/' && *file_it != '.'); + const char* trimmed_extn; // includes the '.' + const char* trimmed_extn_end; // includes the '\0' + if (*file_it == '.' || !TryGetValidExtension(extn, trimmed_extn, trimmed_extn_end)) { + // has file extension already or no valid extension in `extn` + ++file_end; // includes the '\0' + char* path_without_prefix = NFDi_Malloc(file_end - fileUri); + copy(fileUri, file_end, path_without_prefix); + outPath = path_without_prefix; + } else { + // no file extension and we have a valid extension + char* path_without_prefix = + NFDi_Malloc((file_end - fileUri) + (trimmed_extn_end - trimmed_extn)); + char* out = copy(fileUri, file_end, path_without_prefix); + copy(trimmed_extn, trimmed_extn_end, out); + outPath = path_without_prefix; + } + return NFD_OKAY; +} +#endif + +// DBus wrapper function that helps invoke the portal for all OpenFile() variants. +// This function returns NFD_OKAY iff outMsg gets set (to the returned message). +// Caller is responsible for freeing the outMsg using dbus_message_unref() (or use +// DBusMessage_Guard). +template +nfdresult_t NFD_DBus_OpenFile(DBusMessage*& outMsg, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + const char* handle_token_ptr; + char* handle_obj_path = MakeUniqueObjectPath(&handle_token_ptr); + Free_Guard handle_obj_path_guard(handle_obj_path); + + DBusError err; // need a separate error object because we don't want to mess with the old one + // if it's stil set + dbus_error_init(&err); + + // Subscribe to the signal using the handle_obj_path + DBusSignalSubscriptionHandler signal_sub; + nfdresult_t res = signal_sub.Subscribe(handle_obj_path); + if (res != NFD_OKAY) return res; + + // TODO: use XOpenDisplay()/XGetInputFocus() to find xid of window... but what should one do on + // Wayland? + + DBusMessage* query = dbus_message_new_method_call("org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.FileChooser", + "OpenFile"); + DBusMessage_Guard query_guard(query); + AppendOpenFileQueryParams( + query, handle_token_ptr, filterList, filterCount); + + DBusMessage* reply = + dbus_connection_send_with_reply_and_block(dbus_conn, query, DBUS_TIMEOUT_INFINITE, &err); + if (!reply) { + dbus_error_free(&dbus_err); + dbus_move_error(&err, &dbus_err); + NFDi_SetError(dbus_err.message); + return NFD_ERROR; + } + DBusMessage_Guard reply_guard(reply); + + // Check the reply and update our signal subscription if necessary + { + DBusMessageIter iter; + if (!dbus_message_iter_init(reply, &iter)) { + NFDi_SetError("D-Bus reply is missing an argument."); + return NFD_ERROR; + } + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) { + NFDi_SetError("D-Bus reply is not an object path."); + return NFD_ERROR; + } + + const char* path; + dbus_message_iter_get_basic(&iter, &path); + if (strcmp(path, handle_obj_path) != 0) { + // needs to change our signal subscription + signal_sub.Subscribe(path); + } + } + + // Wait and read the response + // const char* file = nullptr; + do { + while (true) { + DBusMessage* msg = dbus_connection_pop_message(dbus_conn); + if (!msg) break; + + if (dbus_message_is_signal(msg, "org.freedesktop.portal.Request", "Response")) { + // this is the response we're looking for + outMsg = msg; + return NFD_OKAY; + } + + dbus_message_unref(msg); + } + } while (dbus_connection_read_write(dbus_conn, -1)); + + NFDi_SetError("D-Bus freedesktop portal did not give us a reply."); + return NFD_ERROR; +} + +// DBus wrapper function that helps invoke the portal for the SaveFile() API. +// This function returns NFD_OKAY iff outMsg gets set (to the returned message). +// Caller is responsible for freeing the outMsg using dbus_message_unref() (or use +// DBusMessage_Guard). +nfdresult_t NFD_DBus_SaveFile(DBusMessage*& outMsg, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + const char* handle_token_ptr; + char* handle_obj_path = MakeUniqueObjectPath(&handle_token_ptr); + Free_Guard handle_obj_path_guard(handle_obj_path); + + DBusError err; // need a separate error object because we don't want to mess with the old one + // if it's stil set + dbus_error_init(&err); + + // Subscribe to the signal using the handle_obj_path + DBusSignalSubscriptionHandler signal_sub; + nfdresult_t res = signal_sub.Subscribe(handle_obj_path); + if (res != NFD_OKAY) return res; + + // TODO: use XOpenDisplay()/XGetInputFocus() to find xid of window... but what should one do on + // Wayland? + + DBusMessage* query = dbus_message_new_method_call("org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.FileChooser", + "SaveFile"); + DBusMessage_Guard query_guard(query); + AppendSaveFileQueryParams( + query, handle_token_ptr, filterList, filterCount, defaultPath, defaultName); + + DBusMessage* reply = + dbus_connection_send_with_reply_and_block(dbus_conn, query, DBUS_TIMEOUT_INFINITE, &err); + if (!reply) { + dbus_error_free(&dbus_err); + dbus_move_error(&err, &dbus_err); + NFDi_SetError(dbus_err.message); + return NFD_ERROR; + } + DBusMessage_Guard reply_guard(reply); + + // Check the reply and update our signal subscription if necessary + { + DBusMessageIter iter; + if (!dbus_message_iter_init(reply, &iter)) { + NFDi_SetError("D-Bus reply is missing an argument."); + return NFD_ERROR; + } + if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) { + NFDi_SetError("D-Bus reply is not an object path."); + return NFD_ERROR; + } + + const char* path; + dbus_message_iter_get_basic(&iter, &path); + if (strcmp(path, handle_obj_path) != 0) { + // needs to change our signal subscription + signal_sub.Subscribe(path); + } + } + + // Wait and read the response + // const char* file = nullptr; + do { + while (true) { + DBusMessage* msg = dbus_connection_pop_message(dbus_conn); + if (!msg) break; + + if (dbus_message_is_signal(msg, "org.freedesktop.portal.Request", "Response")) { + // this is the response we're looking for + outMsg = msg; + return NFD_OKAY; + } + + dbus_message_unref(msg); + } + } while (dbus_connection_read_write(dbus_conn, -1)); + + NFDi_SetError("D-Bus freedesktop portal did not give us a reply."); + return NFD_ERROR; +} + +} // namespace + +/* public */ + +const char* NFD_GetError(void) { + return err_ptr; +} + +void NFD_ClearError(void) { + NFDi_SetError(nullptr); + dbus_error_free(&dbus_err); +} + +nfdresult_t NFD_Init(void) { + // Initialize dbus_error + dbus_error_init(&dbus_err); + // Get DBus connection + dbus_conn = dbus_bus_get(DBUS_BUS_SESSION, &dbus_err); + if (!dbus_conn) { + NFDi_SetError(dbus_err.message); + return NFD_ERROR; + } + dbus_unique_name = dbus_bus_get_unique_name(dbus_conn); + if (!dbus_unique_name) { + NFDi_SetError("Unable to get the unique name of our D-Bus connection."); + return NFD_ERROR; + } + return NFD_OKAY; +} +void NFD_Quit(void) { + dbus_connection_unref(dbus_conn); + // Note: We do not free dbus_error since NFD_Init might set it. + // To avoid leaking memory, the caller should explicitly call NFD_ClearError after reading the + // error. +} + +void NFD_FreePathN(nfdnchar_t* filePath) { + assert(filePath); + NFDi_Free(filePath); +} + +nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + (void)defaultPath; // Default path not supported for portal backend + + DBusMessage* msg; + { + const nfdresult_t res = NFD_DBus_OpenFile(msg, filterList, filterCount); + if (res != NFD_OKAY) { + return res; + } + } + DBusMessage_Guard msg_guard(msg); + + const char* file; + { + const nfdresult_t res = ReadResponseUrisSingle(msg, file); + if (res != NFD_OKAY) { + return res; + } + } + + return AllocAndCopyFilePath(file, *outPath); +} + +nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + (void)defaultPath; // Default path not supported for portal backend + + DBusMessage* msg; + { + const nfdresult_t res = NFD_DBus_OpenFile(msg, filterList, filterCount); + if (res != NFD_OKAY) { + return res; + } + } + + DBusMessageIter uri_iter; + const nfdresult_t res = ReadResponseUris(msg, uri_iter); + if (res != NFD_OKAY) { + dbus_message_unref(msg); + return res; + } + + *outPaths = msg; + return NFD_OKAY; +} + +nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + DBusMessage* msg; + { + const nfdresult_t res = + NFD_DBus_SaveFile(msg, filterList, filterCount, defaultPath, defaultName); + if (res != NFD_OKAY) { + return res; + } + } + DBusMessage_Guard msg_guard(msg); + +#if NFD_PORTAL_AUTO_APPEND_FILE_EXTENSION == 1 + const char* file; + const char* extn; + { + const nfdresult_t res = ReadResponseUrisSingleAndCurrentExtension(msg, file, extn); + if (res != NFD_OKAY) { + return res; + } + } + + return AllocAndCopyFilePathWithExtn(file, extn, *outPath); +#else + const char* file; + { + const nfdresult_t res = ReadResponseUrisSingle(msg, file); + if (res != NFD_OKAY) { + return res; + } + } + + return AllocAndCopyFilePath(file, *outPath); +#endif +} + +nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { + (void)defaultPath; // Default path not supported for portal backend + + DBusMessage* msg; + { + const nfdresult_t res = NFD_DBus_OpenFile(msg, nullptr, 0); + if (res != NFD_OKAY) { + return res; + } + } + DBusMessage_Guard msg_guard(msg); + + const char* file; + { + const nfdresult_t res = ReadResponseUrisSingle(msg, file); + if (res != NFD_OKAY) { + return res; + } + } + + return AllocAndCopyFilePath(file, *outPath); +} + +nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count) { + assert(pathSet); + DBusMessage* msg = const_cast(static_cast(pathSet)); + *count = ReadResponseUrisUncheckedGetArraySize(msg); + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t** outPath) { + assert(pathSet); + DBusMessage* msg = const_cast(static_cast(pathSet)); + DBusMessageIter uri_iter; + ReadResponseUrisUnchecked(msg, uri_iter); + while (index > 0) { + --index; + if (!dbus_message_iter_next(&uri_iter)) { + NFDi_SetError("Index out of bounds."); + return NFD_ERROR; + } + } + if (dbus_message_iter_get_arg_type(&uri_iter) != DBUS_TYPE_STRING) { + NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_ERROR; + } + const char* file; + dbus_message_iter_get_basic(&uri_iter, &file); + return AllocAndCopyFilePath(file, *outPath); +} + +void NFD_PathSet_FreePathN(const nfdnchar_t* filePath) { + assert(filePath); + NFD_FreePathN(const_cast(filePath)); +} + +void NFD_PathSet_Free(const nfdpathset_t* pathSet) { + assert(pathSet); + DBusMessage* msg = const_cast(static_cast(pathSet)); + dbus_message_unref(msg); +} + +nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, nfdpathsetenum_t* outEnumerator) { + assert(pathSet); + DBusMessage* msg = const_cast(static_cast(pathSet)); + ReadResponseUrisUnchecked(msg, *reinterpret_cast(outEnumerator)); + return NFD_OKAY; +} + +void NFD_PathSet_FreeEnum(nfdpathsetenum_t*) { + // Do nothing, because the enumeration is just a message iterator +} + +nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_t** outPath) { + DBusMessageIter& uri_iter = *reinterpret_cast(enumerator); + const int arg_type = dbus_message_iter_get_arg_type(&uri_iter); + if (arg_type == DBUS_TYPE_INVALID) { + *outPath = nullptr; + return NFD_OKAY; + } + if (arg_type != DBUS_TYPE_STRING) { + NFDi_SetError("D-Bus response signal URI sub iter is not an string."); + return NFD_ERROR; + } + const char* file; + dbus_message_iter_get_basic(&uri_iter, &file); + const nfdresult_t res = AllocAndCopyFilePath(file, *outPath); + if (res != NFD_OKAY) return res; + dbus_message_iter_next(&uri_iter); + return NFD_OKAY; +} diff --git a/src/nfd_win.cpp b/src/nfd_win.cpp new file mode 100644 index 00000000..772dfb27 --- /dev/null +++ b/src/nfd_win.cpp @@ -0,0 +1,969 @@ +/* + Native File Dialog Extended + Repository: https://github.com/btzy/nativefiledialog-extended + License: Zlib + Author: Bernard Teo + */ + +/* only locally define UNICODE in this compilation unit */ +#ifndef UNICODE +#define UNICODE +#endif + +#ifdef __MINGW32__ +// Explicitly setting NTDDI version, this is necessary for the MinGW compiler +#define NTDDI_VERSION NTDDI_VISTA +#define _WIN32_WINNT _WIN32_WINNT_VISTA +#endif + +#if _MSC_VER +// see +// https://developercommunity.visualstudio.com/content/problem/185399/error-c2760-in-combaseapih-with-windows-sdk-81-and.html +struct IUnknown; // Workaround for "combaseapi.h(229): error C2187: syntax error: 'identifier' was + // unexpected here" when using /permissive- +#endif + +#include +#include +#include +#include +#include +#include "nfd.h" + +namespace { + +/* current error */ +const char* g_errorstr = nullptr; + +void NFDi_SetError(const char* msg) { + g_errorstr = msg; +} + +template +T* NFDi_Malloc(size_t bytes) { + void* ptr = malloc(bytes); + if (!ptr) NFDi_SetError("NFDi_Malloc failed."); + + return static_cast(ptr); +} + +template +void NFDi_Free(T* ptr) { + assert(ptr); + free(static_cast(ptr)); +} + +/* guard objects */ +template +struct Release_Guard { + T* data; + Release_Guard(T* releasable) noexcept : data(releasable) {} + ~Release_Guard() { data->Release(); } +}; + +template +struct Free_Guard { + T* data; + Free_Guard(T* freeable) noexcept : data(freeable) {} + ~Free_Guard() { NFDi_Free(data); } +}; + +template +struct FreeCheck_Guard { + T* data; + FreeCheck_Guard(T* freeable = nullptr) noexcept : data(freeable) {} + ~FreeCheck_Guard() { + if (data) NFDi_Free(data); + } +}; + +/* helper functions */ +nfdresult_t AddFiltersToDialog(::IFileDialog* fileOpenDialog, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + /* filterCount plus 1 because we hardcode the *.* wildcard after the while loop */ + COMDLG_FILTERSPEC* specList = + NFDi_Malloc(sizeof(COMDLG_FILTERSPEC) * (filterCount + 1)); + if (!specList) { + return NFD_ERROR; + } + + /* ad-hoc RAII object to free memory when destructing */ + struct COMDLG_FILTERSPEC_Guard { + COMDLG_FILTERSPEC* _specList; + nfdfiltersize_t index; + COMDLG_FILTERSPEC_Guard(COMDLG_FILTERSPEC* specList) noexcept + : _specList(specList), index(0) {} + ~COMDLG_FILTERSPEC_Guard() { + for (--index; index != static_cast(-1); --index) { + NFDi_Free(const_cast(_specList[index].pszSpec)); + } + NFDi_Free(_specList); + } + }; + + COMDLG_FILTERSPEC_Guard specListGuard(specList); + + if (filterCount) { + assert(filterList); + + // we have filters to add ... format and add them + + // use the index that comes from the RAII object (instead of making a copy), so the RAII + // object will know which memory to free + nfdfiltersize_t& index = specListGuard.index; + + for (; index != filterCount; ++index) { + // set the friendly name of this filter + specList[index].pszName = filterList[index].name; + + // set the specification of this filter... + + // count number of file extensions + size_t sep = 1; + for (const nfdnchar_t* p_spec = filterList[index].spec; *p_spec; ++p_spec) { + if (*p_spec == L',') { + ++sep; + } + } + + // calculate space needed (including the trailing '\0') + size_t specSize = sep * 2 + wcslen(filterList[index].spec) + 1; + + // malloc the required memory and populate it + nfdnchar_t* specBuf = NFDi_Malloc(sizeof(nfdnchar_t) * specSize); + + if (!specBuf) { + // automatic freeing of memory via COMDLG_FILTERSPEC_Guard + return NFD_ERROR; + } + + // convert "png,jpg" to "*.png;*.jpg" as required by Windows ... + nfdnchar_t* p_specBuf = specBuf; + *p_specBuf++ = L'*'; + *p_specBuf++ = L'.'; + for (const nfdnchar_t* p_spec = filterList[index].spec; *p_spec; ++p_spec) { + if (*p_spec == L',') { + *p_specBuf++ = L';'; + *p_specBuf++ = L'*'; + *p_specBuf++ = L'.'; + } else { + *p_specBuf++ = *p_spec; + } + } + *p_specBuf++ = L'\0'; + + // assert that we had allocated exactly the correct amount of memory that we used + assert(static_cast(p_specBuf - specBuf) == specSize); + + // save the buffer to the guard object + specList[index].pszSpec = specBuf; + } + } + + /* Add wildcard */ + specList[filterCount].pszName = L"All files"; + specList[filterCount].pszSpec = L"*.*"; + + // add the filter to the dialog + if (!SUCCEEDED(fileOpenDialog->SetFileTypes(filterCount + 1, specList))) { + NFDi_SetError("Failed to set the allowable file types for the drop-down menu."); + return NFD_ERROR; + } + + // automatic freeing of memory via COMDLG_FILTERSPEC_Guard + return NFD_OKAY; +} + +/* call after AddFiltersToDialog */ +nfdresult_t SetDefaultExtension(::IFileDialog* fileOpenDialog, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount) { + // if there are no filters, then don't set default extensions + if (!filterCount) { + return NFD_OKAY; + } + + assert(filterList); + + // set the first item as the default index, and set the default extension + if (!SUCCEEDED(fileOpenDialog->SetFileTypeIndex(1))) { + NFDi_SetError("Failed to set the selected file type index."); + return NFD_ERROR; + } + + // set the first item as the default file extension + const nfdnchar_t* p_spec = filterList[0].spec; + for (; *p_spec; ++p_spec) { + if (*p_spec == ',') { + break; + } + } + if (*p_spec) { + // multiple file extensions for this type (need to allocate memory) + size_t numChars = p_spec - filterList[0].spec; + // allocate one more char space for the '\0' + nfdnchar_t* extnBuf = NFDi_Malloc(sizeof(nfdnchar_t) * (numChars + 1)); + if (!extnBuf) { + return NFD_ERROR; + } + Free_Guard extnBufGuard(extnBuf); + + // copy the extension + for (size_t i = 0; i != numChars; ++i) { + extnBuf[i] = filterList[0].spec[i]; + } + // pad with trailing '\0' + extnBuf[numChars] = L'\0'; + + if (!SUCCEEDED(fileOpenDialog->SetDefaultExtension(extnBuf))) { + NFDi_SetError("Failed to set default extension."); + return NFD_ERROR; + } + } else { + // single file extension for this type (no need to allocate memory) + if (!SUCCEEDED(fileOpenDialog->SetDefaultExtension(filterList[0].spec))) { + NFDi_SetError("Failed to set default extension."); + return NFD_ERROR; + } + } + + return NFD_OKAY; +} + +nfdresult_t SetDefaultPath(IFileDialog* dialog, const nfdnchar_t* defaultPath) { + if (!defaultPath || !*defaultPath) return NFD_OKAY; + + IShellItem* folder; + HRESULT result = SHCreateItemFromParsingName(defaultPath, nullptr, IID_PPV_ARGS(&folder)); + + // Valid non results. + if (result == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || + result == HRESULT_FROM_WIN32(ERROR_INVALID_DRIVE)) { + return NFD_OKAY; + } + + if (!SUCCEEDED(result)) { + NFDi_SetError("Failed to create ShellItem for setting the default path."); + return NFD_ERROR; + } + + Release_Guard folderGuard(folder); + + // SetDefaultFolder() might use another recently used folder if available, so the user doesn't + // need to keep navigating back to the default folder (recommended by Windows). change to + // SetFolder() if you always want to use the default folder + if (!SUCCEEDED(dialog->SetDefaultFolder(folder))) { + NFDi_SetError("Failed to set default path."); + return NFD_ERROR; + } + + return NFD_OKAY; +} + +nfdresult_t SetDefaultName(IFileDialog* dialog, const nfdnchar_t* defaultName) { + if (!defaultName || !*defaultName) return NFD_OKAY; + + if (!SUCCEEDED(dialog->SetFileName(defaultName))) { + NFDi_SetError("Failed to set default file name."); + return NFD_ERROR; + } + + return NFD_OKAY; +} + +nfdresult_t AddOptions(IFileDialog* dialog, FILEOPENDIALOGOPTIONS options) { + FILEOPENDIALOGOPTIONS existingOptions; + if (!SUCCEEDED(dialog->GetOptions(&existingOptions))) { + NFDi_SetError("Failed to get options."); + return NFD_ERROR; + } + if (!SUCCEEDED(dialog->SetOptions(existingOptions | options))) { + NFDi_SetError("Failed to set options."); + return NFD_ERROR; + } + return NFD_OKAY; +} +} // namespace + +const char* NFD_GetError(void) { + return g_errorstr; +} + +void NFD_ClearError(void) { + NFDi_SetError(nullptr); +} + +/* public */ + +namespace { +// The user might have initialized with COINIT_MULTITHREADED before, +// in which case we will fail to do CoInitializeEx(), but file dialogs will still work. +// See https://github.com/mlabbe/nativefiledialog/issues/72 for more information. +bool needs_uninitialize; +} // namespace + +nfdresult_t NFD_Init(void) { + // Init COM library. + HRESULT result = + ::CoInitializeEx(nullptr, ::COINIT_APARTMENTTHREADED | ::COINIT_DISABLE_OLE1DDE); + + if (SUCCEEDED(result)) { + needs_uninitialize = true; + return NFD_OKAY; + } else if (result == RPC_E_CHANGED_MODE) { + // If this happens, the user already initialized COM using COINIT_MULTITHREADED, + // so COM will still work, but we shouldn't uninitialize it later. + needs_uninitialize = false; + return NFD_OKAY; + } else { + NFDi_SetError("Failed to initialize COM."); + return NFD_ERROR; + } +} +void NFD_Quit(void) { + if (needs_uninitialize) ::CoUninitialize(); +} + +void NFD_FreePathN(nfdnchar_t* filePath) { + assert(filePath); + ::CoTaskMemFree(filePath); +} + +nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + ::IFileOpenDialog* fileOpenDialog; + + // Create dialog + HRESULT result = ::CoCreateInstance(::CLSID_FileOpenDialog, + nullptr, + CLSCTX_ALL, + ::IID_IFileOpenDialog, + reinterpret_cast(&fileOpenDialog)); + + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not create dialog."); + return NFD_ERROR; + } + + // make sure we remember to free the dialog + Release_Guard<::IFileOpenDialog> fileOpenDialogGuard(fileOpenDialog); + + // Build the filter list + if (!AddFiltersToDialog(fileOpenDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set auto-completed default extension + if (!SetDefaultExtension(fileOpenDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set the default path + if (!SetDefaultPath(fileOpenDialog, defaultPath)) { + return NFD_ERROR; + } + + // Only show file system items + if (!AddOptions(fileOpenDialog, ::FOS_FORCEFILESYSTEM)) { + return NFD_ERROR; + } + + // Show the dialog. + result = fileOpenDialog->Show(nullptr); + if (SUCCEEDED(result)) { + // Get the file name + ::IShellItem* psiResult; + result = fileOpenDialog->GetResult(&psiResult); + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not get shell item from dialog."); + return NFD_ERROR; + } + Release_Guard<::IShellItem> psiResultGuard(psiResult); + + nfdnchar_t* filePath; + result = psiResult->GetDisplayName(::SIGDN_FILESYSPATH, &filePath); + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not get file path from shell item returned by dialog."); + return NFD_ERROR; + } + + *outPath = filePath; + + return NFD_OKAY; + } else if (result == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { + return NFD_CANCEL; + } else { + NFDi_SetError("File dialog box show failed."); + return NFD_ERROR; + } +} + +nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath) { + ::IFileOpenDialog* fileOpenDialog(nullptr); + + // Create dialog + HRESULT result = ::CoCreateInstance(::CLSID_FileOpenDialog, + nullptr, + CLSCTX_ALL, + ::IID_IFileOpenDialog, + reinterpret_cast(&fileOpenDialog)); + + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not create dialog."); + return NFD_ERROR; + } + + // make sure we remember to free the dialog + Release_Guard<::IFileOpenDialog> fileOpenDialogGuard(fileOpenDialog); + + // Build the filter list + if (!AddFiltersToDialog(fileOpenDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set auto-completed default extension + if (!SetDefaultExtension(fileOpenDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set the default path + if (!SetDefaultPath(fileOpenDialog, defaultPath)) { + return NFD_ERROR; + } + + // Set a flag for multiple options and file system items only + if (!AddOptions(fileOpenDialog, ::FOS_FORCEFILESYSTEM | ::FOS_ALLOWMULTISELECT)) { + return NFD_ERROR; + } + + // Show the dialog. + result = fileOpenDialog->Show(nullptr); + if (SUCCEEDED(result)) { + ::IShellItemArray* shellItems; + result = fileOpenDialog->GetResults(&shellItems); + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not get shell items."); + return NFD_ERROR; + } + + // save the path set to the output + *outPaths = static_cast(shellItems); + + return NFD_OKAY; + } else if (result == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { + return NFD_CANCEL; + } else { + NFDi_SetError("File dialog box show failed."); + return NFD_ERROR; + } +} + +nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, + const nfdnfilteritem_t* filterList, + nfdfiltersize_t filterCount, + const nfdnchar_t* defaultPath, + const nfdnchar_t* defaultName) { + ::IFileSaveDialog* fileSaveDialog; + + // Create dialog + HRESULT result = ::CoCreateInstance(::CLSID_FileSaveDialog, + nullptr, + CLSCTX_ALL, + ::IID_IFileSaveDialog, + reinterpret_cast(&fileSaveDialog)); + + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not create dialog."); + return NFD_ERROR; + } + + // make sure we remember to free the dialog + Release_Guard<::IFileSaveDialog> fileSaveDialogGuard(fileSaveDialog); + + // Build the filter list + if (!AddFiltersToDialog(fileSaveDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set default extension + if (!SetDefaultExtension(fileSaveDialog, filterList, filterCount)) { + return NFD_ERROR; + } + + // Set the default path + if (!SetDefaultPath(fileSaveDialog, defaultPath)) { + return NFD_ERROR; + } + + // Set the default name + if (!SetDefaultName(fileSaveDialog, defaultName)) { + return NFD_ERROR; + } + + // Only show file system items + if (!AddOptions(fileSaveDialog, ::FOS_FORCEFILESYSTEM)) { + return NFD_ERROR; + } + + // Show the dialog. + result = fileSaveDialog->Show(nullptr); + if (SUCCEEDED(result)) { + // Get the file name + ::IShellItem* psiResult; + result = fileSaveDialog->GetResult(&psiResult); + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not get shell item from dialog."); + return NFD_ERROR; + } + Release_Guard<::IShellItem> psiResultGuard(psiResult); + + nfdnchar_t* filePath; + result = psiResult->GetDisplayName(::SIGDN_FILESYSPATH, &filePath); + if (!SUCCEEDED(result)) { + NFDi_SetError("Could not get file path from shell item returned by dialog."); + return NFD_ERROR; + } + + *outPath = filePath; + + return NFD_OKAY; + } else if (result == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { + return NFD_CANCEL; + } else { + NFDi_SetError("File dialog box show failed."); + return NFD_ERROR; + } +} + +nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { + ::IFileOpenDialog* fileOpenDialog; + + // Create dialog + if (!SUCCEEDED(::CoCreateInstance(::CLSID_FileOpenDialog, + nullptr, + CLSCTX_ALL, + ::IID_IFileOpenDialog, + reinterpret_cast(&fileOpenDialog)))) { + NFDi_SetError("Could not create dialog."); + return NFD_ERROR; + } + + Release_Guard<::IFileOpenDialog> fileOpenDialogGuard(fileOpenDialog); + + // Set the default path + if (!SetDefaultPath(fileOpenDialog, defaultPath)) { + return NFD_ERROR; + } + + // Only show items that are folders and on the file system + if (!AddOptions(fileOpenDialog, ::FOS_FORCEFILESYSTEM | ::FOS_PICKFOLDERS)) { + return NFD_ERROR; + } + + // Show the dialog to the user + const HRESULT result = fileOpenDialog->Show(nullptr); + if (result == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { + return NFD_CANCEL; + } else if (!SUCCEEDED(result)) { + NFDi_SetError("File dialog box show failed."); + return NFD_ERROR; + } + + // Get the shell item result + ::IShellItem* psiResult; + if (!SUCCEEDED(fileOpenDialog->GetResult(&psiResult))) { + return NFD_ERROR; + } + + Release_Guard<::IShellItem> psiResultGuard(psiResult); + + // Finally get the path + nfdnchar_t* filePath; + // Why are we not using SIGDN_FILESYSPATH? + if (!SUCCEEDED(psiResult->GetDisplayName(::SIGDN_DESKTOPABSOLUTEPARSING, &filePath))) { + NFDi_SetError("Could not get file path from shell item returned by dialog."); + return NFD_ERROR; + } + + *outPath = filePath; + + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count) { + assert(pathSet); + // const_cast because methods on IShellItemArray aren't const, but it should act like const to + // the caller + ::IShellItemArray* psiaPathSet = + const_cast<::IShellItemArray*>(static_cast(pathSet)); + + DWORD numPaths; + if (!SUCCEEDED(psiaPathSet->GetCount(&numPaths))) { + NFDi_SetError("Could not get path count."); + return NFD_ERROR; + } + *count = numPaths; + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdnchar_t** outPath) { + assert(pathSet); + // const_cast because methods on IShellItemArray aren't const, but it should act like const to + // the caller + ::IShellItemArray* psiaPathSet = + const_cast<::IShellItemArray*>(static_cast(pathSet)); + + ::IShellItem* psiPath; + if (!SUCCEEDED(psiaPathSet->GetItemAt(index, &psiPath))) { + NFDi_SetError("Could not get shell item."); + return NFD_ERROR; + } + + Release_Guard<::IShellItem> psiPathGuard(psiPath); + + nfdnchar_t* name; + if (!SUCCEEDED(psiPath->GetDisplayName(::SIGDN_FILESYSPATH, &name))) { + NFDi_SetError("Could not get file path from shell item."); + return NFD_ERROR; + } + + *outPath = name; + return NFD_OKAY; +} + +nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, nfdpathsetenum_t* outEnumerator) { + assert(pathSet); + // const_cast because methods on IShellItemArray aren't const, but it should act like const to + // the caller + ::IShellItemArray* psiaPathSet = + const_cast<::IShellItemArray*>(static_cast(pathSet)); + + ::IEnumShellItems* pesiPaths; + if (!SUCCEEDED(psiaPathSet->EnumItems(&pesiPaths))) { + NFDi_SetError("Could not get enumerator."); + return NFD_ERROR; + } + + outEnumerator->ptr = static_cast(pesiPaths); + return NFD_OKAY; +} + +void NFD_PathSet_FreeEnum(nfdpathsetenum_t* enumerator) { + assert(enumerator->ptr); + + ::IEnumShellItems* pesiPaths = static_cast<::IEnumShellItems*>(enumerator->ptr); + + // free the enumerator memory + pesiPaths->Release(); +} + +nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_t** outPath) { + assert(enumerator->ptr); + + ::IEnumShellItems* pesiPaths = static_cast<::IEnumShellItems*>(enumerator->ptr); + + ::IShellItem* psiPath; + HRESULT res = pesiPaths->Next(1, &psiPath, NULL); + if (!SUCCEEDED(res)) { + NFDi_SetError("Could not get next item of enumerator."); + return NFD_ERROR; + } + if (res != S_OK) { + *outPath = nullptr; + return NFD_OKAY; + } + + Release_Guard<::IShellItem> psiPathGuard(psiPath); + + nfdnchar_t* name; + if (!SUCCEEDED(psiPath->GetDisplayName(::SIGDN_FILESYSPATH, &name))) { + NFDi_SetError("Could not get file path from shell item."); + return NFD_ERROR; + } + + *outPath = name; + return NFD_OKAY; +} + +void NFD_PathSet_Free(const nfdpathset_t* pathSet) { + assert(pathSet); + // const_cast because methods on IShellItemArray aren't const, but it should act like const to + // the caller + ::IShellItemArray* psiaPathSet = + const_cast<::IShellItemArray*>(static_cast(pathSet)); + + // free the path set memory + psiaPathSet->Release(); +} + +namespace { +// allocs the space in outStr -- call NFDi_Free() +nfdresult_t CopyCharToWChar(const nfdu8char_t* inStr, nfdnchar_t*& outStr) { + int charsNeeded = MultiByteToWideChar(CP_UTF8, 0, inStr, -1, nullptr, 0); + assert(charsNeeded); + + nfdnchar_t* tmp_outStr = NFDi_Malloc(sizeof(nfdnchar_t) * charsNeeded); + if (!tmp_outStr) { + return NFD_ERROR; + } + + int ret = MultiByteToWideChar(CP_UTF8, 0, inStr, -1, tmp_outStr, charsNeeded); + assert(ret && ret == charsNeeded); + (void)ret; // prevent warning in release build + outStr = tmp_outStr; + return NFD_OKAY; +} + +// allocs the space in outPath -- call NFDi_Free() +nfdresult_t CopyWCharToNFDChar(const nfdnchar_t* inStr, nfdu8char_t*& outStr) { + int bytesNeeded = WideCharToMultiByte(CP_UTF8, 0, inStr, -1, nullptr, 0, nullptr, nullptr); + assert(bytesNeeded); + + nfdu8char_t* tmp_outStr = NFDi_Malloc(sizeof(nfdu8char_t) * bytesNeeded); + if (!tmp_outStr) { + return NFD_ERROR; + } + + int ret = WideCharToMultiByte(CP_UTF8, 0, inStr, -1, tmp_outStr, bytesNeeded, nullptr, nullptr); + assert(ret && ret == bytesNeeded); + (void)ret; // prevent warning in release build + outStr = tmp_outStr; + return NFD_OKAY; +} + +struct FilterItem_Guard { + nfdnfilteritem_t* data; + nfdfiltersize_t index; + FilterItem_Guard() noexcept : data(nullptr), index(0) {} + ~FilterItem_Guard() { + assert(data || index == 0); + for (--index; index != static_cast(-1); --index) { + NFDi_Free(const_cast(data[index].spec)); + NFDi_Free(const_cast(data[index].name)); + } + if (data) NFDi_Free(data); + } +}; + +nfdresult_t CopyFilterItem(const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + FilterItem_Guard& filterItemsNGuard) { + if (count) { + nfdnfilteritem_t*& filterItemsN = filterItemsNGuard.data; + filterItemsN = NFDi_Malloc(sizeof(nfdnfilteritem_t) * count); + if (!filterItemsN) { + return NFD_ERROR; + } + + nfdfiltersize_t& index = filterItemsNGuard.index; + for (; index != count; ++index) { + nfdresult_t res = CopyCharToWChar(filterList[index].name, + const_cast(filterItemsN[index].name)); + if (!res) { + return NFD_ERROR; + } + res = CopyCharToWChar(filterList[index].spec, + const_cast(filterItemsN[index].spec)); + if (!res) { + // remember to free the name, because we also created it (and it won't be protected + // by the guard, because we have not incremented the index) + NFDi_Free(const_cast(filterItemsN[index].name)); + return NFD_ERROR; + } + } + } + return NFD_OKAY; +} +nfdresult_t ConvertU8ToNative(const nfdu8char_t* u8Text, FreeCheck_Guard& nativeText) { + if (u8Text) { + nfdresult_t res = CopyCharToWChar(u8Text, nativeText.data); + if (!res) { + return NFD_ERROR; + } + } + return NFD_OKAY; +} +void NormalizePathSeparator(nfdnchar_t* path) { + if (path) { + for (; *path; ++path) { + if (*path == L'/') *path = L'\\'; + } + } +} +} // namespace + +void NFD_FreePathU8(nfdu8char_t* outPath) { + NFDi_Free(outPath); +} + +nfdresult_t NFD_OpenDialogU8(nfdu8char_t** outPath, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath) { + // populate the real nfdnfilteritem_t + FilterItem_Guard filterItemsNGuard; + if (!CopyFilterItem(filterList, count, filterItemsNGuard)) { + return NFD_ERROR; + } + + // convert and normalize the default path, but only if it is not nullptr + FreeCheck_Guard defaultPathNGuard; + ConvertU8ToNative(defaultPath, defaultPathNGuard); + NormalizePathSeparator(defaultPathNGuard.data); + + // call the native function + nfdnchar_t* outPathN; + nfdresult_t res = + NFD_OpenDialogN(&outPathN, filterItemsNGuard.data, count, defaultPathNGuard.data); + + if (res != NFD_OKAY) { + return res; + } + + // convert the outPath to UTF-8 + res = CopyWCharToNFDChar(outPathN, *outPath); + + // free the native out path, and return the result + NFD_FreePathN(outPathN); + return res; +} + +/* multiple file open dialog */ +/* It is the caller's responsibility to free `outPaths` via NFD_PathSet_Free() if this function + * returns NFD_OKAY */ +nfdresult_t NFD_OpenDialogMultipleU8(const nfdpathset_t** outPaths, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath) { + // populate the real nfdnfilteritem_t + FilterItem_Guard filterItemsNGuard; + if (!CopyFilterItem(filterList, count, filterItemsNGuard)) { + return NFD_ERROR; + } + + // convert and normalize the default path, but only if it is not nullptr + FreeCheck_Guard defaultPathNGuard; + ConvertU8ToNative(defaultPath, defaultPathNGuard); + NormalizePathSeparator(defaultPathNGuard.data); + + // call the native function + return NFD_OpenDialogMultipleN(outPaths, filterItemsNGuard.data, count, defaultPathNGuard.data); +} + +/* save dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_SaveDialogU8(nfdu8char_t** outPath, + const nfdu8filteritem_t* filterList, + nfdfiltersize_t count, + const nfdu8char_t* defaultPath, + const nfdu8char_t* defaultName) { + // populate the real nfdnfilteritem_t + FilterItem_Guard filterItemsNGuard; + if (!CopyFilterItem(filterList, count, filterItemsNGuard)) { + return NFD_ERROR; + } + + // convert and normalize the default path, but only if it is not nullptr + FreeCheck_Guard defaultPathNGuard; + ConvertU8ToNative(defaultPath, defaultPathNGuard); + NormalizePathSeparator(defaultPathNGuard.data); + + // convert the default name, but only if it is not nullptr + FreeCheck_Guard defaultNameNGuard; + ConvertU8ToNative(defaultName, defaultNameNGuard); + + // call the native function + nfdnchar_t* outPathN; + nfdresult_t res = NFD_SaveDialogN( + &outPathN, filterItemsNGuard.data, count, defaultPathNGuard.data, defaultNameNGuard.data); + + if (res != NFD_OKAY) { + return res; + } + + // convert the outPath to UTF-8 + res = CopyWCharToNFDChar(outPathN, *outPath); + + // free the native out path, and return the result + NFD_FreePathN(outPathN); + return res; +} + +/* select folder dialog */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath) { + // convert and normalize the default path, but only if it is not nullptr + FreeCheck_Guard defaultPathNGuard; + ConvertU8ToNative(defaultPath, defaultPathNGuard); + NormalizePathSeparator(defaultPathNGuard.data); + + // call the native function + nfdnchar_t* outPathN; + nfdresult_t res = NFD_PickFolderN(&outPathN, defaultPathNGuard.data); + + if (res != NFD_OKAY) { + return res; + } + + // convert the outPath to UTF-8 + res = CopyWCharToNFDChar(outPathN, *outPath); + + // free the native out path, and return the result + NFD_FreePathN(outPathN); + return res; +} + +/* Get the UTF-8 path at offset index */ +/* It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function returns + * NFD_OKAY */ +nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, + nfdpathsetsize_t index, + nfdu8char_t** outPath) { + // call the native function + nfdnchar_t* outPathN; + nfdresult_t res = NFD_PathSet_GetPathN(pathSet, index, &outPathN); + + if (res != NFD_OKAY) { + return res; + } + + // convert the outPath to UTF-8 + res = CopyWCharToNFDChar(outPathN, *outPath); + + // free the native out path, and return the result + NFD_FreePathN(outPathN); + return res; +} + +nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath) { + // call the native function + nfdnchar_t* outPathN; + nfdresult_t res = NFD_PathSet_EnumNextN(enumerator, &outPathN); + + if (res != NFD_OKAY) { + return res; + } + + if (outPathN) { + // convert the outPath to UTF-8 + res = CopyWCharToNFDChar(outPathN, *outPath); + + // free the native out path, and return the result + NFD_FreePathN(outPathN); + } else { + *outPath = nullptr; + res = NFD_OKAY; + } + + return res; +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..7af0a59e --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,18 @@ + +set(TEST_LIST + test_opendialog.c + test_opendialog_cpp.cpp + test_opendialogmultiple.c + test_opendialogmultiple_cpp.cpp + test_opendialogmultiple_enum.c + test_pickfolder.c + test_pickfolder_cpp.cpp + test_savedialog.c) + +foreach (TEST ${TEST_LIST}) + string(REPLACE "." "_" CLEAN_TEST_NAME ${TEST}) + add_executable(${CLEAN_TEST_NAME} + ${TEST}) + target_link_libraries(${CLEAN_TEST_NAME} + PUBLIC nfd) +endforeach() \ No newline at end of file diff --git a/test/test_opendialog.c b/test/test_opendialog.c new file mode 100644 index 00000000..412d0196 --- /dev/null +++ b/test/test_opendialog.c @@ -0,0 +1,36 @@ +#include + +#include +#include + +/* this test should compile on all supported platforms */ + +int main(void) { + // initialize NFD + // either call NFD_Init at the start of your program and NFD_Quit at the end of your program, + // or before/after every time you want to show a file dialog. + NFD_Init(); + + nfdchar_t* outPath; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD_OpenDialog(&outPath, filterItem, 2, NULL); + if (result == NFD_OKAY) { + puts("Success!"); + puts(outPath); + // remember to free the memory (since NFD_OKAY is returned) + NFD_FreePath(outPath); + } else if (result == NFD_CANCEL) { + puts("User pressed cancel."); + } else { + printf("Error: %s\n", NFD_GetError()); + } + + // Quit NFD + NFD_Quit(); + + return 0; +} diff --git a/test/test_opendialog_cpp.cpp b/test/test_opendialog_cpp.cpp new file mode 100644 index 00000000..089e97a6 --- /dev/null +++ b/test/test_opendialog_cpp.cpp @@ -0,0 +1,29 @@ +#include +#include "nfd.hpp" + +/* this test should compile on all supported platforms */ +/* this demonstrates the thin C++ wrapper */ + +int main() { + // initialize NFD + NFD::Guard nfdGuard; + + // auto-freeing memory + NFD::UniquePath outPath; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD::OpenDialog(outPath, filterItem, 2); + if (result == NFD_OKAY) { + std::cout << "Success!" << std::endl << outPath.get() << std::endl; + } else if (result == NFD_CANCEL) { + std::cout << "User pressed cancel." << std::endl; + } else { + std::cout << "Error: " << NFD::GetError() << std::endl; + } + + // NFD::Guard will automatically quit NFD. + return 0; +} diff --git a/test/test_opendialogmultiple.c b/test/test_opendialogmultiple.c new file mode 100644 index 00000000..6b1d1898 --- /dev/null +++ b/test/test_opendialogmultiple.c @@ -0,0 +1,50 @@ +#include + +#include +#include + +/* this test should compile on all supported platforms */ + +int main(void) { + // initialize NFD + // either call NFD_Init at the start of your program and NFD_Quit at the end of your program, + // or before/after every time you want to show a file dialog. + NFD_Init(); + + const nfdpathset_t* outPaths; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD_OpenDialogMultiple(&outPaths, filterItem, 2, NULL); + + if (result == NFD_OKAY) { + puts("Success!"); + + nfdpathsetsize_t numPaths; + NFD_PathSet_GetCount(outPaths, &numPaths); + + nfdpathsetsize_t i; + for (i = 0; i < numPaths; ++i) { + nfdchar_t* path; + NFD_PathSet_GetPath(outPaths, i, &path); + printf("Path %i: %s\n", (int)i, path); + + // remember to free the pathset path with NFD_PathSet_FreePath (not NFD_FreePath!) + NFD_PathSet_FreePath(path); + } + + // remember to free the pathset memory (since NFD_OKAY is returned) + NFD_PathSet_Free(outPaths); + } else if (result == NFD_CANCEL) { + puts("User pressed cancel."); + } else { + printf("Error: %s\n", NFD_GetError()); + } + + // Quit NFD + NFD_Quit(); + + return 0; +} diff --git a/test/test_opendialogmultiple_cpp.cpp b/test/test_opendialogmultiple_cpp.cpp new file mode 100644 index 00000000..09edb746 --- /dev/null +++ b/test/test_opendialogmultiple_cpp.cpp @@ -0,0 +1,40 @@ +#include "nfd.hpp" + +#include + +/* this test should compile on all supported platforms */ +/* this demonstrates the thin C++ wrapper */ + +int main() { + // initialize NFD + NFD::Guard nfdGuard; + + // auto-freeing memory + NFD::UniquePathSet outPaths; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD::OpenDialogMultiple(outPaths, filterItem, 2); + if (result == NFD_OKAY) { + std::cout << "Success!" << std::endl; + + nfdpathsetsize_t numPaths; + NFD::PathSet::Count(outPaths, numPaths); + + nfdpathsetsize_t i; + for (i = 0; i < numPaths; ++i) { + NFD::UniquePathSetPath path; + NFD::PathSet::GetPath(outPaths, i, path); + std::cout << "Path " << i << ": " << path.get() << std::endl; + } + } else if (result == NFD_CANCEL) { + std::cout << "User pressed cancel." << std::endl; + } else { + std::cout << "Error: " << NFD::GetError() << std::endl; + } + + // NFD::Guard will automatically quit NFD. + return 0; +} diff --git a/test/test_opendialogmultiple_enum.c b/test/test_opendialogmultiple_enum.c new file mode 100644 index 00000000..827029c1 --- /dev/null +++ b/test/test_opendialogmultiple_enum.c @@ -0,0 +1,53 @@ +#include + +#include +#include + +/* this test should compile on all supported platforms */ + +int main(void) { + // initialize NFD + // either call NFD_Init at the start of your program and NFD_Quit at the end of your program, + // or before/after every time you want to show a file dialog. + NFD_Init(); + + const nfdpathset_t* outPaths; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD_OpenDialogMultiple(&outPaths, filterItem, 2, NULL); + + if (result == NFD_OKAY) { + puts("Success!"); + + // declare enumerator (not a pointer) + nfdpathsetenum_t enumerator; + + NFD_PathSet_GetEnum(outPaths, &enumerator); + nfdchar_t* path; + unsigned i = 0; + while (NFD_PathSet_EnumNext(&enumerator, &path) && path) { + printf("Path %u: %s\n", i++, path); + + // remember to free the pathset path with NFD_PathSet_FreePath (not NFD_FreePath!) + NFD_PathSet_FreePath(path); + } + + // remember to free the pathset enumerator memory (before freeing the pathset) + NFD_PathSet_FreeEnum(&enumerator); + + // remember to free the pathset memory (since NFD_OKAY is returned) + NFD_PathSet_Free(outPaths); + } else if (result == NFD_CANCEL) { + puts("User pressed cancel."); + } else { + printf("Error: %s\n", NFD_GetError()); + } + + // Quit NFD + NFD_Quit(); + + return 0; +} diff --git a/test/test_pickfolder.c b/test/test_pickfolder.c new file mode 100644 index 00000000..12df1995 --- /dev/null +++ b/test/test_pickfolder.c @@ -0,0 +1,33 @@ +#include + +#include +#include + +/* this test should compile on all supported platforms */ + +int main(void) { + // initialize NFD + // either call NFD_Init at the start of your program and NFD_Quit at the end of your program, + // or before/after every time you want to show a file dialog. + NFD_Init(); + + nfdchar_t* outPath; + + // show the dialog + nfdresult_t result = NFD_PickFolder(&outPath, NULL); + if (result == NFD_OKAY) { + puts("Success!"); + puts(outPath); + // remember to free the memory (since NFD_OKAY is returned) + NFD_FreePath(outPath); + } else if (result == NFD_CANCEL) { + puts("User pressed cancel."); + } else { + printf("Error: %s\n", NFD_GetError()); + } + + // Quit NFD + NFD_Quit(); + + return 0; +} diff --git a/test/test_pickfolder_cpp.cpp b/test/test_pickfolder_cpp.cpp new file mode 100644 index 00000000..747f3506 --- /dev/null +++ b/test/test_pickfolder_cpp.cpp @@ -0,0 +1,27 @@ +#include "nfd.hpp" + +#include + +/* this test should compile on all supported platforms */ +/* this demonstrates the thin C++ wrapper */ + +int main() { + // initialize NFD + NFD::Guard nfdGuard; + + // auto-freeing memory + NFD::UniquePath outPath; + + // show the dialog + nfdresult_t result = NFD::PickFolder(outPath); + if (result == NFD_OKAY) { + std::cout << "Success!" << std::endl << outPath.get() << std::endl; + } else if (result == NFD_CANCEL) { + std::cout << "User pressed cancel." << std::endl; + } else { + std::cout << "Error: " << NFD::GetError() << std::endl; + } + + // NFD::Guard will automatically quit NFD. + return 0; +} diff --git a/test/test_savedialog.c b/test/test_savedialog.c new file mode 100644 index 00000000..42ff5950 --- /dev/null +++ b/test/test_savedialog.c @@ -0,0 +1,36 @@ +#include + +#include +#include + +/* this test should compile on all supported platforms */ + +int main(void) { + // initialize NFD + // either call NFD_Init at the start of your program and NFD_Quit at the end of your program, + // or before/after every time you want to show a file dialog. + NFD_Init(); + + nfdchar_t* savePath; + + // prepare filters for the dialog + nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Header", "h,hpp"}}; + + // show the dialog + nfdresult_t result = NFD_SaveDialog(&savePath, filterItem, 2, NULL, "Untitled.c"); + if (result == NFD_OKAY) { + puts("Success!"); + puts(savePath); + // remember to free the memory (since NFD_OKAY is returned) + NFD_FreePath(savePath); + } else if (result == NFD_CANCEL) { + puts("User pressed cancel."); + } else { + printf("Error: %s\n", NFD_GetError()); + } + + // Quit NFD + NFD_Quit(); + + return 0; +}