From 4bcfd18d0b5fe99e8ce1ccc637485c1274dcf046 Mon Sep 17 00:00:00 2001 From: irisz64 Date: Tue, 22 Jul 2025 12:47:31 +0200 Subject: [PATCH] get rid of NFD dependency since im using SDL3 and its builtin functionality --- external/nfd/.clang-format | 11 - external/nfd/.github/workflows/cmake.yml | 279 --- external/nfd/.gitignore | 7 - external/nfd/CMakeLists.txt | 52 - external/nfd/LICENSE | 16 - external/nfd/README.md | 395 ---- external/nfd/screens/open_gtk3.png | Bin 33502 -> 0 bytes external/nfd/screens/open_gtk3_dark.png | Bin 34551 -> 0 bytes .../nfd/screens/open_macos_10.13_icons.png | Bin 46322 -> 0 bytes .../nfd/screens/open_macos_10.13_list.png | Bin 49890 -> 0 bytes .../nfd/screens/open_macos_10.13_tree.png | Bin 82185 -> 0 bytes external/nfd/screens/open_macos_11.0.png | Bin 46991 -> 0 bytes external/nfd/screens/open_macos_11.0_dark.png | Bin 47064 -> 0 bytes external/nfd/screens/open_win10.png | Bin 24860 -> 0 bytes external/nfd/screens/open_win10_dark.png | Bin 24491 -> 0 bytes external/nfd/src/CMakeLists.txt | 149 -- external/nfd/src/include/nfd.h | 564 ----- external/nfd/src/include/nfd.hpp | 375 ---- external/nfd/src/include/nfd_glfw3.h | 85 - external/nfd/src/include/nfd_sdl2.h | 76 - external/nfd/src/nfd_cocoa.m | 615 ------ external/nfd/src/nfd_gtk.cpp | 974 --------- external/nfd/src/nfd_portal.cpp | 1843 ----------------- external/nfd/src/nfd_win.cpp | 1185 ----------- external/nfd/test/CMakeLists.txt | 46 - external/nfd/test/test_opendialog.c | 36 - external/nfd/test/test_opendialog_cpp.cpp | 29 - external/nfd/test/test_opendialog_native.c | 49 - .../nfd/test/test_opendialog_native_with.c | 52 - external/nfd/test/test_opendialog_with.c | 39 - external/nfd/test/test_opendialogmultiple.c | 50 - .../nfd/test/test_opendialogmultiple_cpp.cpp | 40 - .../nfd/test/test_opendialogmultiple_enum.c | 53 - .../test_opendialogmultiple_enum_native.c | 62 - .../nfd/test/test_opendialogmultiple_native.c | 59 - external/nfd/test/test_pickfolder.c | 33 - external/nfd/test/test_pickfolder_cpp.cpp | 27 - external/nfd/test/test_pickfolder_native.c | 42 - .../nfd/test/test_pickfolder_native_with.c | 43 - external/nfd/test/test_pickfolder_with.c | 34 - external/nfd/test/test_pickfoldermultiple.c | 47 - .../nfd/test/test_pickfoldermultiple_native.c | 52 - external/nfd/test/test_savedialog.c | 36 - external/nfd/test/test_savedialog_native.c | 55 - .../nfd/test/test_savedialog_native_with.c | 59 - external/nfd/test/test_savedialog_with.c | 40 - external/nfd/test/test_sdl.c | 414 ---- external/nfd/test/test_sdl.manifest | 29 - src/frontend/CMakeLists.txt | 4 +- src/frontend/KaizenGui.cpp | 43 +- src/frontend/KaizenGui.hpp | 1 - src/frontend/SettingsWindow.cpp | 27 +- src/frontend/SettingsWindow.hpp | 5 +- 53 files changed, 39 insertions(+), 8093 deletions(-) delete mode 100644 external/nfd/.clang-format delete mode 100644 external/nfd/.github/workflows/cmake.yml delete mode 100644 external/nfd/.gitignore delete mode 100644 external/nfd/CMakeLists.txt delete mode 100644 external/nfd/LICENSE delete mode 100644 external/nfd/README.md delete mode 100644 external/nfd/screens/open_gtk3.png delete mode 100644 external/nfd/screens/open_gtk3_dark.png delete mode 100644 external/nfd/screens/open_macos_10.13_icons.png delete mode 100644 external/nfd/screens/open_macos_10.13_list.png delete mode 100644 external/nfd/screens/open_macos_10.13_tree.png delete mode 100644 external/nfd/screens/open_macos_11.0.png delete mode 100644 external/nfd/screens/open_macos_11.0_dark.png delete mode 100644 external/nfd/screens/open_win10.png delete mode 100644 external/nfd/screens/open_win10_dark.png delete mode 100644 external/nfd/src/CMakeLists.txt delete mode 100644 external/nfd/src/include/nfd.h delete mode 100644 external/nfd/src/include/nfd.hpp delete mode 100644 external/nfd/src/include/nfd_glfw3.h delete mode 100644 external/nfd/src/include/nfd_sdl2.h delete mode 100644 external/nfd/src/nfd_cocoa.m delete mode 100644 external/nfd/src/nfd_gtk.cpp delete mode 100644 external/nfd/src/nfd_portal.cpp delete mode 100644 external/nfd/src/nfd_win.cpp delete mode 100644 external/nfd/test/CMakeLists.txt delete mode 100644 external/nfd/test/test_opendialog.c delete mode 100644 external/nfd/test/test_opendialog_cpp.cpp delete mode 100644 external/nfd/test/test_opendialog_native.c delete mode 100644 external/nfd/test/test_opendialog_native_with.c delete mode 100644 external/nfd/test/test_opendialog_with.c delete mode 100644 external/nfd/test/test_opendialogmultiple.c delete mode 100644 external/nfd/test/test_opendialogmultiple_cpp.cpp delete mode 100644 external/nfd/test/test_opendialogmultiple_enum.c delete mode 100644 external/nfd/test/test_opendialogmultiple_enum_native.c delete mode 100644 external/nfd/test/test_opendialogmultiple_native.c delete mode 100644 external/nfd/test/test_pickfolder.c delete mode 100644 external/nfd/test/test_pickfolder_cpp.cpp delete mode 100644 external/nfd/test/test_pickfolder_native.c delete mode 100644 external/nfd/test/test_pickfolder_native_with.c delete mode 100644 external/nfd/test/test_pickfolder_with.c delete mode 100644 external/nfd/test/test_pickfoldermultiple.c delete mode 100644 external/nfd/test/test_pickfoldermultiple_native.c delete mode 100644 external/nfd/test/test_savedialog.c delete mode 100644 external/nfd/test/test_savedialog_native.c delete mode 100644 external/nfd/test/test_savedialog_native_with.c delete mode 100644 external/nfd/test/test_savedialog_with.c delete mode 100644 external/nfd/test/test_sdl.c delete mode 100644 external/nfd/test/test_sdl.manifest diff --git a/external/nfd/.clang-format b/external/nfd/.clang-format deleted file mode 100644 index 56badbe5..00000000 --- a/external/nfd/.clang-format +++ /dev/null @@ -1,11 +0,0 @@ ---- -BasedOnStyle: Chromium -IndentWidth: 4 -BinPackArguments: false -ColumnLimit: 100 -AllowShortIfStatementsOnASingleLine: WithoutElse -AllowShortLoopsOnASingleLine: true ---- -Language: Cpp ---- -Language: ObjC diff --git a/external/nfd/.github/workflows/cmake.yml b/external/nfd/.github/workflows/cmake.yml deleted file mode 100644 index 3ee22738..00000000 --- a/external/nfd/.github/workflows/cmake.yml +++ /dev/null @@ -1,279 +0,0 @@ -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@v4 - - 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 - - line-endings: - - name: Line endings check - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Dependencies - run: sudo apt-get update && sudo apt-get install dos2unix - - name: Convert to Unix line endings - run: dos2unix */* - - name: Check diff - run: git diff --exit-code - - build-ubuntu: - - name: Ubuntu ${{ matrix.os.name }} - ${{ matrix.compiler.name }}, ${{ matrix.portal.name }}, ${{ matrix.autoappend.name }}, ${{ matrix.casesensitive.name }}, ${{ matrix.shared_lib.name }}, C++${{ matrix.cppstd }} - runs-on: ${{ matrix.os.label }} - - strategy: - matrix: - os: [ {label: ubuntu-latest, name: latest}, {label: ubuntu-22.04, name: 22.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) - autoappend: [ {flag: OFF, name: NoAppendExtn} ] # By default the NFD_PORTAL mode does not append extensions, because it breaks some features of the portal - casesensitive: [ {flag: OFF, name: CaseInsensitive} ] # Case insensitive or case sensitive file filtering - compiler: [ {c: gcc, cpp: g++, name: GCC}, {c: clang, cpp: clang++, name: Clang} ] # The default compiler is gcc/g++ - cppstd: [20, 11] - shared_lib: [ {flag: OFF, name: Static} ] - include: - - os: {label: ubuntu-latest, name: latest} - portal: {flag: ON, dep: libdbus-1-dev, name: Portal} - autoappend: {flag: ON, name: AutoAppendExtn} - casesensitive: {flag: OFF, name: CaseInsensitive} - compiler: {c: gcc, cpp: g++, name: GCC} - cppstd: 11 - shared_lib: {flag: OFF, name: Static} - - os: {label: ubuntu-latest, name: latest} - portal: {flag: ON, dep: libdbus-1-dev, name: Portal} - autoappend: {flag: ON, name: AutoAppendExtn} - casesensitive: {flag: OFF, name: CaseInsensitive} - compiler: {c: clang, cpp: clang++, name: Clang} - cppstd: 11 - shared_lib: {flag: OFF, name: Static} - - os: {label: ubuntu-latest, name: latest} - portal: {flag: ON, dep: libdbus-1-dev, name: Portal} - autoappend: {flag: OFF, name: NoAppendExtn} - casesensitive: {flag: OFF, name: CaseInsensitive} - compiler: {c: gcc, cpp: g++, name: GCC} - cppstd: 11 - shared_lib: {flag: ON, name: Shared} - - os: {label: ubuntu-latest, name: latest} - portal: {flag: OFF, dep: libgtk-3-dev, name: GTK} - autoappend: {flag: OFF, name: NoAppendExtn} - casesensitive: {flag: ON, name: CaseSensitive} - compiler: {c: gcc, cpp: g++, name: GCC} - cppstd: 11 - shared_lib: {flag: OFF, name: Static} - - os: {label: ubuntu-latest, name: latest} - portal: {flag: ON, dep: libdbus-1-dev, name: Portal} - autoappend: {flag: OFF, name: NoAppendExtn} - casesensitive: {flag: ON, name: CaseSensitive} - compiler: {c: gcc, cpp: g++, name: GCC} - cppstd: 11 - shared_lib: {flag: OFF, name: Static} - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install 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_C_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DNFD_PORTAL=${{ matrix.portal.flag }} -DNFD_APPEND_EXTENSION=${{ matrix.autoappend.flag }} -DNFD_CASE_SENSITIVE_FILTER=${{ matrix.casesensitive.flag }} -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON .. - - name: Build - run: cmake --build build --target install - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: Ubuntu ${{ matrix.os.name }} - ${{ matrix.compiler.name }}, ${{ matrix.portal.name }}, ${{ matrix.autoappend.name }}, ${{ matrix.casesensitive.name }}, ${{ matrix.shared_lib.name }}, C++${{ matrix.cppstd }} - path: | - build/src/* - build/test/* - - build-macos-clang: - - name: MacOS ${{ matrix.os.name }} - Clang, ${{ matrix.shared_lib.name }} - runs-on: ${{ matrix.os.label }} - - strategy: - matrix: - os: [ {label: macos-latest, name: latest} ] - shared_lib: [ {flag: OFF, name: Static}, {flag: ON, name: Shared} ] - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Configure - run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON .. - - name: Build - run: cmake --build build --target install - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: MacOS ${{ matrix.os.name }} - Clang, ${{ matrix.shared_lib.name }} - path: | - build/src/* - build/test/* - - build-windows-msvc: - - name: Windows latest - MSVC, ${{ matrix.shared_lib.name }} - runs-on: windows-latest - - strategy: - matrix: - shared_lib: [ {flag: OFF, name: Static}, {flag: ON, name: Shared} ] - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Configure - run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DBUILD_SHARED_LIBS=${{ matrix.shared_lib.flag }} -DNFD_BUILD_TESTS=ON .. - - name: Build - run: cmake --build build --target install --config Release - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: Windows latest - MSVC, ${{ matrix.shared_lib.name }} - path: | - build/src/Release/* - build/test/Release/* - - build-windows-clang: - - name: Windows latest - Clang, Static - runs-on: windows-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Downgrade CMake # force downgrade CMake as later versions try to use the C++ standard flag to compile C programs, which cause an error. - run: choco install cmake --version 3.30.6 --allow-downgrade - - 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@v4 - with: - name: Windows latest - Clang, Static - path: | - build/src/Release/* - build/test/Release/* - - build-windows-mingw: - - name: Windows latest - MinGW, Static - runs-on: windows-latest - - defaults: - run: - shell: msys2 {0} - - steps: - - name: Checkout - uses: actions/checkout@v4 - - 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_C_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DNFD_BUILD_TESTS=ON .. - - name: Build - run: cmake --build build --target install - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: Windows latest - MinGW, Static - path: | - build/src/* - build/test/* - - build-ubuntu-sdl2: - - name: Ubuntu latest - GCC, ${{ matrix.portal.name }}, Static, SDL2 - runs-on: ubuntu-latest - - strategy: - matrix: - 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) - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Dependencies - run: sudo apt-get update && sudo apt-get install ${{ matrix.portal.dep }} libsdl2-dev libsdl2-ttf-dev - - name: Configure - run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DNFD_PORTAL=${{ matrix.portal.flag }} -DNFD_APPEND_EXTENSION=OFF -DNFD_BUILD_TESTS=OFF -DNFD_BUILD_SDL2_TESTS=ON .. - - name: Build - run: cmake --build build --target install - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: Ubuntu latest - GCC, ${{ matrix.portal.name }}, Static, SDL2 - path: | - build/src/* - build/test/* - - build-macos-sdl2: - - name: MacOS latest - Clang, Static, SDL2 - runs-on: macos-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install Dependencies - run: brew install sdl2 sdl2_ttf - - name: Configure - run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wshadow -Werror -pedantic" -DNFD_BUILD_TESTS=OFF -DNFD_BUILD_SDL2_TESTS=ON .. - - name: Build - run: cmake --build build --target install - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: MacOS latest - Clang, Static, SDL2 - path: | - build/src/* - build/test/* - - build-windows-sdl2: - - name: Windows latest - MSVC, Static, SDL2 - runs-on: windows-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install pkgconfiglite - run: choco install pkgconfiglite - - name: Install Dependencies - run: vcpkg integrate install && vcpkg install sdl2 sdl2-ttf --triplet=x64-windows-release - - name: Configure - run: mkdir build && mkdir install && cd build && cmake -DCMAKE_INSTALL_PREFIX="../install" -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-release" -DNFD_BUILD_TESTS=OFF -DNFD_BUILD_SDL2_TESTS=ON .. - - name: Build - run: cmake --build build --target install --config Release - - name: Upload test binaries - uses: actions/upload-artifact@v4 - with: - name: Windows latest - MSVC, Static, SDL2 - path: | - build/src/Release/* - build/test/Release/* diff --git a/external/nfd/.gitignore b/external/nfd/.gitignore deleted file mode 100644 index 747ae819..00000000 --- a/external/nfd/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# VS CMake default output -/.vs/ -/out/ -/CMakeSettings.json - -# Mac OS X rubbish -.DS_Store diff --git a/external/nfd/CMakeLists.txt b/external/nfd/CMakeLists.txt deleted file mode 100644 index 7520f4f5..00000000 --- a/external/nfd/CMakeLists.txt +++ /dev/null @@ -1,52 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(nativefiledialog-extended VERSION 1.2.1) - -set(nfd_ROOT_PROJECT OFF) -if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(nfd_ROOT_PROJECT ON) -endif () - -option(BUILD_SHARED_LIBS "Build a shared library instead of static" OFF) -option(NFD_BUILD_TESTS "Build tests for nfd" ${nfd_ROOT_PROJECT}) -option(NFD_BUILD_SDL2_TESTS "Build SDL2 tests for nfd" OFF) -option(NFD_INSTALL "Generate install target for nfd" ${nfd_ROOT_PROJECT}) - -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) - if(CMAKE_VERSION VERSION_LESS "3.12") - set (CMAKE_CXX_STANDARD 17) - elseif(CMAKE_VERSION VERSION_LESS "3.20") - set (CMAKE_CXX_STANDARD 20) - else() - set (CMAKE_CXX_STANDARD 23) - endif() -endif() - -add_subdirectory(src) - -if(${NFD_BUILD_TESTS} OR ${NFD_BUILD_SDL2_TESTS}) - add_subdirectory(test) -endif() diff --git a/external/nfd/LICENSE b/external/nfd/LICENSE deleted file mode 100644 index 3ab103c5..00000000 --- a/external/nfd/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -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/external/nfd/README.md b/external/nfd/README.md deleted file mode 100644 index 3b7c1938..00000000 --- a/external/nfd/README.md +++ /dev/null @@ -1,395 +0,0 @@ - -# Native File Dialog Extended - -![GitHub Actions](https://github.com/btzy/nativefiledialog-extended/workflows/build/badge.svg) - -A small C library 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 selection support (for file open and folder select dialogs) -- 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) -- Multiple folder selection support -- 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. - -The [wiki](https://github.com/btzy/nativefiledialog-extended/wiki) keeps track of known language bindings and known popular projects that depend on this library. - -# Basic Usage - -```C -#include -#include -#include - -int main(void) -{ - - NFD_Init(); - - nfdu8char_t *outPath; - nfdu8filteritem_t filters[2] = { { "Source code", "c,cpp,cc" }, { "Headers", "h,hpp" } }; - nfdopendialogu8args_t args = {0}; - args.filterList = filters; - args.filterCount = 2; - nfdresult_t result = NFD_OpenDialogU8_With(&outPath, &args); - if (result == NFD_OKAY) - { - puts("Success!"); - puts(outPath); - NFD_FreePathU8(outPath); - } - else if (result == NFD_CANCEL) - { - puts("User pressed cancel."); - } - else - { - printf("Error: %s\n", NFD_GetError()); - } - - NFD_Quit(); - return 0; -} -``` - -The `U8`/`u8` in NFDe refer to the API for UTF-8 characters (`char`), which most consumers probably want. An `N`/`n` version is also available, which uses the native character type (`wchar_t` on Windows and `char` on other platforms). - -For the full list of arguments that you can set on the `args` struct, see the "All Options" section below. - -If you are using a platform abstraction framework such as SDL or GLFW, also see the "Usage with a Platform Abstraction Framework" section below. - -# Screenshots # - -![Windows 10](screens/open_win10.png?raw=true#gh-light-mode-only) -![Windows 10](screens/open_win10_dark.png?raw=true#gh-dark-mode-only) -![macOS 10.13](screens/open_macos_11.0.png?raw=true#gh-light-mode-only) -![macOS 10.13](screens/open_macos_11.0_dark.png?raw=true#gh-dark-mode-only) -![GTK3 on Ubuntu 20.04](screens/open_gtk3.png?raw=true#gh-light-mode-only) -![GTK3 on Ubuntu 20.04](screens/open_gtk3_dark.png?raw=true#gh-dark-mode-only) - -# 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). - -When included as a subproject, sample programs are not built and the install target is disabled by default. -Add `-DNFD_BUILD_TESTS=ON` to build sample programs and `-DNFD_INSTALL=ON` to enable the install target. - -## Standalone Library -If you want to build the standalone static library, -execute the following commands (starting from the project root directory): - -For GCC and Clang: -``` -mkdir build -cd build -cmake -DCMAKE_BUILD_TYPE=Release .. -cmake --build . -``` - -For MSVC: -``` -mkdir build -cd build -cmake .. -cmake --build . --config Release -``` - -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`/`--config Debug` -to build a debug version of the library instead. - -When building as a standalone library, sample programs are built and the install target is enabled by default. -Add `-DNFD_BUILD_TESTS=OFF` to disable building sample programs and `-DNFD_INSTALL=OFF` to disable the install target. - -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` and `UniformTypeIdentifiers` to the list of frameworks. - -### Windows -On Windows (both MSVC and MinGW), ensure you are building against `ole32.lib`, `uuid.lib`, and `shell32.lib`. - -# Usage - -## All Options - -To open a dialog, you set options on a struct and then pass that struct to an NFDe function, e.g.: -```C -nfdopendialogu8args_t args = {0}; -args.filterList = filters; -args.filterCount = 2; -nfdresult_t result = NFD_OpenDialogU8_With(&outPath, &args); -``` - -All options are optional and may be set individually (zero initialization sets all options to reasonable defaults), except for `filterList` and `filterCount` which must be either both set or both left unset. - -**Future versions of NFDe may add additional options to the end of the arguments struct without bumping the major version number, so to ensure backward API compatibility, you should not assume that the struct has a specific length or number of fields.** You may assume that zero-initialization of the struct will continue to set all options to reasonable defaults, so assigning `{0}` to the struct is acceptable. For those building shared libraries of NFDe, backward ABI compatibility is ensured by an internal version index (`NFD_INTERFACE_VERSION`), which is expected to be transparent to consumers. - -**OpenDialog**/**OpenDialogMultiple**: -```C -typedef struct { - const nfdu8filteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdu8char_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdopendialogu8args_t; -``` - -**SaveDialog**: -```C -typedef struct { - const nfdu8filteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdu8char_t* defaultPath; - const nfdu8char_t* defaultName; - nfdwindowhandle_t parentWindow; -} nfdsavedialogu8args_t; -``` - -**PickFolder**/**PickFolderMultiple**: -```C -typedef struct { - const nfdu8char_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdpickfolderu8args_t; -``` - -- `filterList` and `filterCount`: Set these to customize the file filter (it appears as a dropdown menu on Windows and Linux, but simply hides files on macOS). Set `filterList` to a pointer to the start of the array of filter items and `filterCount` to the number of filter items in that array. See the "File Filter Syntax" section below for details. -- `defaultPath`: Set this to the default folder that the dialog should open to (on Windows, if there is a recently used folder, it opens to that folder instead of the folder you pass, unless the `NFD_OVERRIDE_RECENT_WITH_DEFAULT` build option is set to ON). -- `defaultName`: (For SaveDialog only) Set this to the file name that should be pre-filled on the dialog. -- `parentWindow`: Set this to the native window handle of the parent of this dialog. See the "Usage with a Platform Abstraction Framework" section for details. It is also possible to pass a handle even if you do not use a platform abstraction framework. - -## Examples - -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. - -There is also an SDL2 example, which needs to be enabled separately with `-DNFD_BUILD_SDL2_TESTS=ON`. It requires SDL2 to be installed on your machine. - -Compiled examples (including the SDL2 example) are also uploaded as artefacts to GitHub Actions, and may be downloaded from there. - -## File Filter Syntax - -Files can be filtered by file extension groups: - -```C -nfdu8filteritem_t filters[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, unless the `NFD_OVERRIDE_RECENT_WITH_DEFAULT` build option is set to ON. 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.* - -*Note 5: Linux is designed for case-sensitive file filters, but this is perhaps not what most users expect. A simple hack is used to make filters case-insensitive. To get case-sensitive filtering, set the `NFD_CASE_SENSITIVE_FILTER` build option to ON.* - -## 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. This section explains how to use NFDe properly with such frameworks. - -### Parent window handle - -The `parentWindow` argument allows the user to give the dialog a parent. - -If using SDL2, include `` and call the following function to set the parent window handle: -```C -NFD_GetNativeWindowFromSDLWindow(sdlWindow /* SDL_Window* */, &args.parentWindow); -``` - -If using GLFW3, define the appropriate `GLFW_EXPOSE_NATIVE_*` macros described on the [GLFW native access page](https://www.glfw.org/docs/latest/group__native.html), and then include `` and call the following function to set the parent window handle: -```C -NFD_GetNativeWindowFromGLFWWindow(glfwWindow /* GLFWwindow* */, &args.parentWindow); -``` - -If you are using another platform abstraction framework, or not using any such framework, you can set `args.parentWindow` manually. - -Win32 (Windows), Cocoa (macOS), and X11 (Linux) windows are supported. Passing a Wayland (Linux) window currently does nothing (i.e. the dialog acts as if it has no parent), but support is likely to be added in the future. - -#### Why pass a parent window handle? - -To make a window (in this case the file dialog) stay above another window, we need to declare the bottom window as the parent of the top window. This keeps the dialog window from disappearing behind the parent window if the user clicks on the parent window while the dialog is open. Keeping the dialog above the window that invoked it is the expected behaviour on all supported operating systems, and so passing the parent window handle is recommended if possible. - -### Initialization order - -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. - -To use the portal implementation, add `-DNFD_PORTAL=ON` to the build command. - -*Note: The folder picker is only supported on org.freedesktop.portal.FileChooser interface version >= 3, which corresponds to xdg-desktop-portal version >= 1.7.1. `NFD_PickFolder()` will query the interface version at runtime, and return `NFD_ERROR` if the version is too low. - -### 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 three known backends with file chooser support: GTK, KDE, and LXQt; Gnome and Xapp backends depend on the GTK one for this functionality. The Xapp backend has been designed for Cinnamon, MATE, and XFCE. Other desktop environments do not seem to currently have a portal backend. - -## Platform-specific Quirks - -### macOS - -- If the macOS deployment target is ≥ 11.0, the [allowedContentTypes](https://developer.apple.com/documentation/appkit/nssavepanel/3566857-allowedcontenttypes?language=objc) property of NSSavePanel is used instead of the deprecated [allowedFileTypes](https://developer.apple.com/documentation/appkit/nssavepanel/1534419-allowedfiletypes?language=objc) property for file filters. Thus, if you are filtering by a custom file extension specific to your application, you will need to define the data type in your `Info.plist` file as per the [Apple documentation](https://developer.apple.com/documentation/uniformtypeidentifiers/defining_file_and_data_types_for_your_app). (It is possible to force NFDe to use allowedFileTypes by adding `-DNFD_USE_ALLOWEDCONTENTTYPES_IF_AVAILABLE=OFF` to your CMake build command, but this is not recommended. If you need to support older macOS versions, you should be setting the correct deployment target instead.) - -# 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. - - 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/external/nfd/screens/open_gtk3.png b/external/nfd/screens/open_gtk3.png deleted file mode 100644 index 76dfe9754983b59d9fe68961e1b1427e0b442c0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33502 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%0Dcab8W?K@n^sFemzNEZc%jhcVz9o^Cc%E zj4aJ(tpD;n@T*w-PnQT=ZA;hCqn!(XwI`|kH`ARkJ@{#cr~bY3yJl2BU|W9KVCN0q zor;>5?(t{|-JA2f&guD?+Uc -Er~TWz`{S5+@u^ZA9(XCD@@$}cn)o9_Hg;!@Wt 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 %p*;Rh>$wcPr@2}pQUDZ}l^S4^3T2*?j_{xHP z=k8X2k^FP}&)vk8N0lx2gqv?WTPlC$_Ri}E0ylrVqhD#Y?u=_EmMdgFKR#FK|99v9 z;_~PFobODJ_xe{c#bb(y&>yGc=MFCVA>DCQGd#Rc>c;Jz>H7sIhtI1B`d7JolT~*R z^Y*jzKAcVv|5R1QFZFceyO0pEzYC0JTYR-HHS*-$C#yZ-+v-xV=j_~79!xzTF5*7x zkh}H&sG@xf?%qhXd;NUZiuU}-9dG^QR;Is>_%3aJKl}1D-p}n4N97}*imUi)J=#+p z{XeSmU+w0JpTpM9d3?=l>i7E${cBuPUD@0BnHK%cK3nzvXfXTsD~Wr5r1$2p$eO?3 zEbsm!)9Ms{?z{c{Pg&2;+xNgEGb?J&`Ust+Y_V?VV;^oU2}<8-eOoMl|7`#3(^sxJ zxAWt7`DK#)Gq<10zS?9s_sRRb*{0tUWWHWWH7k4-6`8ff&3$?Ooc~$VoZI;Q~p+y4z``?%!mqc;oc&n?|1`}_I|y|ZW6TKzN0-4U90;p}mh zxDBDcw{C9FOiN76wXgA!pWO69UBC6xzvX(%qxz!W7@k)Srho`3V@h5nCE#)%vZ zGtSJuzN@l(o9tR%%SCI>=uE3x9JY4tnOP>AOSA5;aG9j!^75pnQf{+VSINwT?1&rI zw{C99x?g=~3ix`9sphLxRvSlOy|JuTdiJ(&wa4|Mjm{{%JF?MQzGzmD+PZm-a@wXp z_aEFXb>i&V+&4EimMm-uTvp4Z{z1g2@U0kMzt`~k}WmU{> z|5h^Xg=x`kWyiXzs(CYx))!ZQpQO3CjkiG3peF7>w&HyC&Xhw-ez-W!O}oanw13|w z@voXY)Be_PI%#Y8dAsDj_Pishb-zLnKU%a%X=Br*q?y;_3wd5iZrHp@tL#6^%(p#H__5$%&FPV$<2Zct%Q8zjyeb%u!}qsO{M7eeFNKz*47T{mXUZTq(J`==9^M1SkI+xF~`FM4`psd{D7v^^VF z3TnT)(|G!!fAZr;^Y;HPSk%8Z@Bd|m$Kma^)8FnbdY<^?@a~E0x$I0%MucQ8S~B6X zc$0GSqj|P<9~2DRmo8iR@#4Xlot;ZJYUo+*`?LR^u-)ya_YRl7oqH+JpDobq!$f9r zruVJv^FG9t8SKkj&-gaFEiGgCP$^j z-+g3ReC$o?|2|$YH2*?I4(71W?Vyk?o#?v=ypdvtko)23Nm%4YxVz89{~jdnNtwefh7le07U z++sUWrRfH`MX^q2j@7w$%qIEo?}-OKvvlK(i}}L+H_tXYR3SE$)&Ad(`>cuP-x-f> zHA@GNuKmdnncX+Xc3W_4>!t633pBU=OMbtuQ`hT`PIsV_-&`|g+haF_p1WqNZd<=T zf9CcZpoKIW|87{$@laapv&h5y_5XVX!LvWGs=w!O+Vy*%7lT>}J<1QcKuL+A!E;iB zt3MM1!xf_#z3J+I`O+FzDcdNn=H7bY_> zFl_B?Y;-ItDhdh`I<|4arW0n)+hjKVm5`FU6skI*;OM<=xzfS$GQ127A7lkPU3Tu= zxpL)7OG`_qg=eaZn5MWXP1&_;*S>vrKO?KwoVtI1{@&W(Wo-Mcr5G3{1dg5p`hQa5G15`sxJ>0-nu0u($gAroVsw)cyS$z6&&7!LaYlzS`d&9}by%1QTcI|A$5Y`O~C&AH?KK9s`A$r>mdKI;Vst01~dbNdN!< diff --git a/external/nfd/screens/open_gtk3_dark.png b/external/nfd/screens/open_gtk3_dark.png deleted file mode 100644 index 8b551e3dc07f94da253025fd5b54e90899b381ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34551 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%0Av&CJzwRF#ox_v5d%*=J~ zU0im~HSB!s$tCODIwY@LT72Y&>Y;tL(s$HAJ^Hr`u4bJ+b&89d+gB|(;KJN$38&*b z%HBqmm2JD4_4e*=^SPSq&7S2?C_bNgdQDx|G!LfVGt=WU-ndmtZN8!Vr;MBPdWe4C zYM$2*|G9miG)YKNS2y>~jg5OiO~AK{HMq{or)~autXJA>w(s9d`|<@?8kZfDv#n}r zY5DQ{H>lO;6V{j)-}nFf^j*`Vek=~yz2}$o*WWBR)%bQ9DxZ?F{xdCJ*{1Lj3#fi> z_x`+d-RpfqN^9&h`by0W#?)U@pF?H6CnFq)a+ czWnlE`)5Vxb}iz2@E+tWPgg&ebxsLQ05$O{oB#j- diff --git a/external/nfd/screens/open_macos_10.13_list.png b/external/nfd/screens/open_macos_10.13_list.png deleted file mode 100644 index 47e288f70566420d76b53db3bc43133f2e9a8880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49890 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 z 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 Y?ZutDMQU54TtKaJPgg&ebxsLQ0Hzj1nE(I) diff --git a/external/nfd/screens/open_macos_10.13_tree.png b/external/nfd/screens/open_macos_10.13_tree.png deleted file mode 100644 index e39af98820c72f2627390561ac5cc3f0b486a282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82185 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%0DdLv}6QpyY$y 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 diff --git a/external/nfd/screens/open_macos_11.0.png b/external/nfd/screens/open_macos_11.0.png deleted file mode 100644 index 61bff05d36e109a31610c8c5bd83e6a6bd0c87f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46991 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

0IeyqFW$sym2 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 L>gTe~DWM4fyCh1k diff --git a/external/nfd/screens/open_macos_11.0_dark.png b/external/nfd/screens/open_macos_11.0_dark.png deleted file mode 100644 index 436ea93b53d1b5f1249de05421b43f9b88234457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47064 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π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 Y@kr<0jl#>mTY*G8UHx3vIVCg!0IB)7{r~^~ diff --git a/external/nfd/screens/open_win10.png b/external/nfd/screens/open_win10.png deleted file mode 100644 index 33d802ca2a427c29fe39727f8fa27f2193858cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24860 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 D)I~Qk diff --git a/external/nfd/screens/open_win10_dark.png b/external/nfd/screens/open_win10_dark.png deleted file mode 100644 index 7d2aab28feb889082d1fd1938600b001aee103b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24491 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A#K6FCDRtf=1_lPk;vjb?hIQv;UNSH+ zu%tWsIx;Y9?C1WI$jZRLz**oCSfP@j zIU6@fmW3#}OiB=#?j{($(2ILUf|gizU{FPl$nOlTjNeQ8`@b$+>XCi**0OC){vQgv z_gz|$u{4Rfvq8y8-Zkr0lR{(!PuC{NiK@4M+Z(4pTeowkr<(cBliwek&MAI&=1#Tx z$-VpM6dQGV`udtOFfcq&ViIFuXy{gnDZT8H#&gdtz z=JG5#6e`TChc z?OetbHo-#G_nO4Dv-SBuUL2ggwE6v&g}06-z0D}A4)8ZJ`o+q?u&7&f?IHhgr$eE^ z-FM30RrpVrSsZl!a_js%i7CgA9I5&2f6Sk&VfsparT#2k z*Tr?8xZUU}(rtE_`+If9(_Z|8<{( z{q1$lH9btv^oSO*c;ER`UTr#c-HqgcxYY9w)63brzpt2DF3G^K;4zm~is%-@30&d6 zEIJE=COg&9gL3=9SGjNA+i2U1yd7#J9)3vOUwV2E)$z{J2%Ac-t-bjh-1Vd3Gg zr5G3(qSWo|<_Y3buTzx2mQz^mg%HDnx4E~rcuto(u5EnF&mz9@(;Gzcb8wEx=rwzx8C|Q8On)unIEHD7#JAdVNFhYxA#@uX?GQ`{qenf+sU_2 zyX_)O!|ujO{r-1fZ_4dzZT*;!$1m>EW?*=+gd;*PJ0s&o`LQ!~hu6QhuW|eT@V>mk zqgjl~`^*!Ld}-{w%-**nE8x+Vi=KN+!x+VcP$})mW1F>9mC^gq@#6Eg-@D`gI2ldLE4sR)@UfcToQk`p*SCfr+cfXN z=JR&e85b1pir8@m^e)%l{3`9puXpA9qr<|&Qg3a^oZRA+`SU?D|C7b<5~WPDuI&H! zRsa3517i6Lx4T7LNEbPDzV4gx>zp(5Y;WH(JhS|9iE!`T-kB9A_wl0s3{rd0s`}%)BpEtAf=S}ZX{hn=mu=u=f z`Oi;J&&nRp;+VUxr%L?u)IF|u%kS6z|0w@|V#2C5Yo@UO-@gCv+d0MOCiVyZHGB5= z!QAweTrS_TJwKn#{{Nxf-e-ov!&+a;Yu4{6G+1L92-|Iiw{(HH6{A{NS2mY?l1eJ^*> zv_#-6cf`GyuWn_pw=HlR#F6KP%k zZp$gbYn#*0e|&tr{Pi`(XV)y%Zo4j5W&H891J+mY= z)A!h^lP7ondbN6f#iP!BwZHBD{dj!;_r33Re;&)f&Q-L0nf3eI+pz8@Q`6FQJOdV9 z3SH5YdUWMd@9Dp$Ht%|~>9n8a(EA@Ng-T1nnsXwPYeg0frRP<%;!HRy- zpS)GEMJH9S{Ymac-Jl6}_xSJKO8xfc z=4`XvUpLR!rG1^=WUQKH>+y4q?<|v(Hv{|Ld@s?t_jhS?`RPTj-D~XbSy$N`WUoGa zGth$nOlHisoX7`ze{=rdbJBR~^VfH#f91HoCNkNUd;i+1`3bXr&zy8TUzEu{wfFAI z?>9f|S*IVfJbx&_1F$2rUAbMEb}t-Bw&>e34BwPqO?6e?M*D?dGXb#?Xq%IC7H z3y*XNMn*<{vdRfvd}Cez>PPPJkIdIEOZ!-(#><>0cs1ot3+JWNtJvQtu)WyU;Ax$% zbY5r9dj7Xpb#Gi0c`xa(e$(CBS3m!r*|lsJ`D@y3YvQU zR({=Q>Fh~gCc4W_3{OvYe=YNC;_pxI>W|Bodz@zGxB2klFu!;A9oGkzAL|nCsUNI% z-?@8s-Y(B=W|b!P59e>UEPf_qS>(c}{bY}4_nc#=PI>+8n!28`bLuDEmwUGwp8e%x z$z-4U>8-%Oxm^p=-K757$%dtG(XTu@Isa$o_i}A_bql_13vjHPYd4M+OlYgmf~IQ&N-Hf zwhLFeoRwTxaoXaxkKv`0tHM9z@#?dd=jtUmIp?|kU*2%xP;Kkl_3PKKU3+zE$K>kreVnsH zf`f}6_nLdHdv$&N{F*7{YCkPK^RwsdF}Hqs%1igrWq*|Mtiyq)Ep7C{@189jZs=G%o?UuPDv)Sa4Dx?JhS z%!$X+YJUkxK7IO>onKDIBxAzVjcZC&Lo=uN?h1ZAr|Q+pPpwa=a^{?b#*|+B0 zSylUgY?JaWcLv}5bu)dw?e{yy$NOYATeTlP74gYRE^U|4r_Ep2*Z!ygfZ9HcfS1b4)DbY5J+svwy!RGCet3c6C*# z-?5@gQ%%fXms+s=oN4(YwC>i6OZI0CR7&rhI6U>(jx}qvbs{6D^WS>3_r+ezzCFMD z-(KZRk7)J{t-85;L)(fkPCq8Sz548%#)ID?7p4?2Pn(dx;q|)Ren!_;1TI$jIH&AZ zW|gz_1o=MIYbVM}xi3w1HM%DM|HpBI%TqHlGA7Kw_!lHJ?d#*}h&2|XI+Hng9HEJ(s_{x%v5&_WCJJ zreT6RZk)btzVBo2ks~gZ=i@e~_3kNob#24Ry{D5WxGQ}Z{q_3Q)9LZk)=Zu?E30>| z$EhjDCI4Ls0;S^ZWt@+Krj_kaTqVGN#%jtOLrrf!>&HFDPefYnq82=xXU=&?fA5z` zHnp+ld;k4<{Yl}l4d>cFK9){*GB2!Ou^?UT!{tW4L)OVV=dC;Pe15&2X8n;4!CiTi zR+*g2-nY*E-h?aKdj5L#sbB5?ZQQk?;H#J`*IEDY^m+OI3s!Da-g@uv3Gu6K=}G~G zVux1ig-xEWynFSk+TYvVRxFlXw{DyJ;&V36{S!|t{_3MQ?``InYOV|~W2R{qB`*S4 zjKW@D4z&)txN>62Qai8auNQegmHj@U+@Et}!@*gHC+&Iq*Zb?F1EAXb&oZ%{r=NfM z`F#F%wL>Zz7Mr8g{pLtm7A-M3CCJ6a^&}&#Iv{#`-qvd|+uzvUo@F^{{p$EXkHkL( z={-Frw`b4#^4Hhi{`mO#+T)4+pT5=nd^-K~W08gPS8}}3*Dc~(yIfvg{=H4D_XFnQ zi1uAyuSKW2cYeC$8093d8}Q@#S*v9~zHQ(C*4$8i{z3VFAKEYFm2%kbyL#&U6y+mx z+5UEMRi!Q27&+h0Wzyu0ExTWO?fLy~_a{+{%u7p_ELkEkS!9V;?w;LW$ zS#scfv{}K{*WDG_TDfger&8kV60a|t^tNqYf^m4-+p75M`V$u{{rU)3;sj=1_9obTq&2^X%+(JKd66@|YI+<`>Vc{;~cr ztp73L$=dWsM>;od+<48#IVL71Hg@ix1v`@4|GNtP`LXwjncA7WD2H84Qo_%sPy3^C zbB~}-w`t$jgo91nJi;Hn-G0CB>(%hvhOt}QEGb}s_{MFj)_e^@IU84E0KVfUc?4AV1 zMDBW)?uM&THPXxttqrYy`hOa(PSSK@U|?u*!0gMRbn>QWX282^t(7y`VwvuUJxi4W zckA;WS%G@@*t=thZog0LvWHJjPTs}Fz|e55v%5Q)g_s^?;Y>CLh6_vQzOj8$@n@!b zHUHZ87sFTG&FVWQ`+H6J*L6FR=SR!V($>@KYhYz?cwTM;q8rwH(ssYEq~|YXOGnVfAh;%ufMqWFsL`Xz|J(&r*QluP zKh|Ep{lc(GZvWMCE`}FN^8VdriZ$way~pI*CC1oqXF1Ou4+}~TcRp`Dv0~=bbz*T7 zH`Lv``8wbF_j-FN(*@-@&fDLqpPNyT^kL^E-}e_})=D3owEYwNB>A0LpZ31@biH)J z`=#oxOR6Vd?l9e{wDQlxCGu-OY?-q4&y*FPv+q2V(G9rpc>5N0u%y{9C1XH|T7 z6kZAuI5@KLjtGM&jqSt}0MOVL__sjeL=g7D7{&hS4 zr^N0(<+8TW=HHoH2Up%RZoXgrWwB@dy|Rb3@Aq#0zB+&YRsYhgjEs(#fz}^%Uanbn z_F`8<>AldGp4s8m{Ok675At;V6sZ++reaId-NpUuE(@n+EjvH!<*w5+_fC?VH7_`L z_lmb_)m^7^Y|dLYoP6~@^V7`9n|=N~Q*AxyvHRV{GP^zBAAXwsUq)hMjr;~1!{3Fk zpRe$cKfih6H}+)`p62^g^1oSeJI>p@xAbmo`b)8g_0z7@M$Q*6HfC7BJu~(4*J)YP z&2R3iTD)$dW71TuEmpCellQh?`zrlziT2LDKh`^cDs*^%V`6i)*Re?@skv)kTl-ke zwl;NseJz1iGS1V>GFp7n={*0S&C$kkwJ)E2vYvG0t=lh=?8S*|eoV~r^xBpDRwVs^ z`paiiu7*WVdhcc&dog9 z|Bj<0;vav-(N|l8*KII5FM3kc?N{ik?Ji-5i`|~`ocz4D;>jwN;t3aur6#YdQu)bf zJvr0Szv#l|CHDGhk_;EN-r09X*!N44c5t$;;&pF0Y~VXIolk?17?7Q`#r*)bffmdd_#=T6^cCiR@<^*L{Ci zTe0@nb(6zVYpM=(#%$_-r~dNr2Dd{sXDYrh9_|T$HRIWZzS0JT{zC>~|Ne@;_uoHd zscZPHIg%UqC?`E&{o1k+=_FH-%sYNn$$dB_4j8c zh8I=;Y_#2`^E{5!@7-#m_9=hU*J}#XykDMrHhJBX$HM=o*%TF=_vEkp@TyP$joZ)d zs^4#RH7r$Q`Kr;gOpW)nJ=gQMzxV9Ew({!jN2}bmN}`2rKAzfiP3ml*R3yv0nqSJZ z*ZFA6)u{Yryx(bapIs;2f2r2g^>I;(Pp52leztmA)-N4KhFu(cnNBY?jS#Gxytdpr zwsf`St+zK4-DRO-h%#>xxJ%Xa2<%mG2i9 zRUh(S+hu;cXLInRH4F8oo?Nr+Le1l;GM7J`(P>kd|EXQR%HYyVuR!mAljS!Yf8J!1 zV4V2(XV}T`_bZD&iQ4;ePF;US`GrOHzp}>nueK+sTfW)M!tjFY3)h;k^#_YwKKWjI zyHQ*D-Hr5(SF874o;u^p19o$}&}VbkJ#l_>QR`*Swb=_xgIls@PWaeh$sU>*7oc!s zD`VK77knoZR~?_`Cz4Gb<_L_y(~9>wjDf{l(xlLG`}e z#K>~dmad3%#oV77LJxUen(3vwMl}A)=dE^OWN7H<`1U&CZ0*VaMj^`Odf88>-r=8LcXH$9{dJFcKF?YzwET&^XZWPv zx;;0&!ar?%zWo1-zb~gT&NtC_cl+i4bOkrR#dTFy28M}3qV?SyYX60tdr<5@&u*RK zvi9!*(`q_aT1$SvdE1shFZ<^FQ=JY6f)0n7ziti7c8;AU!@!`>^hLh+FUcWzFUBSfx%G#*MKXel3u2Fx!}nM#aLzr28Y*Q_U<-UD! z(+`D3M@!4g-`}2pf3bW2E47k@PcwIYJSIKA;t{7^{M+nPQ#7-$->TP@&29TEBN_YF zrhLWo)1@04zNx=_^=|k3d;9DE&n>^FnR=Itp(Bk&XMt_xOHli~?%U0D`T9SFMq&&l zd@MQ(?pnOe`upo^(AqU?RFWATo;w_1x^;Q;dAsbT+TBw(w(-fXdd<-A!sP(dt+N*w zyWg+*>>In$^O(>sCWa0_mNgn>U$2J07Ghv{;lUAc@swA1iVg#Vl>$>($ft9mxsx|8 zySF*-?yl-(uVyLfvTk4UitEDE8Ta|N^?l4usJCBsFX(}d((6R8v%3wa^nLYxTRhEI z_QkMi;d~!t$K{T zUS2W}YnHx=*j3US+Vq`?j%P@r0w5!dDGj{}_A4`Jct!#QdC_&aye}@H4?W{WrhPsFwCea>~a0-va-9iR8~`wad1Pn#!hOut<9d1}Da_WmjPC$CIA zyjK48*|}~iYAe?|h-_XS(Nv>+7FQbJLu9x0%Psckgq*!#&}1Zii*vZV0`e?s4|P z=BHt|^#jcnU#-!c@ZRaXdE%6twp}Z zTKw_*onDgOxTI?K##ysAEiPLBaHcQIqM4>g)An6$`4^XQcKY6(>+2p*t}(nPb9Rzj zHCy1;nbNZben>1i{ox@)&x@%-}l zEXVzdqdRlwnsG)EZ-wLdq7|K{6&`A(p2)5doNXKRWN zPMeXR!TpV3GZ}$?@shz)aR!)Ag zH^V>n)!_~Mtk%RUJ-D;Y%O@)yi#Fvi{jv*$qlDPXCJzHb>BSeE1!G2yNioiyf0l{=*j)s z&+=}^%WDGHcc;BraVz+I&r181=H9bbug-j7zUJL*bJICh)ABw|GqY9Rx#Wa3@6>fV zdj6iF%}$eI&GaG`EPrfsI4W!3c_E9C)VK5Itu$M4mz!(J`VwRQsms27d6T@=Q}GMq z;pg=-@7VK%Kl(N6 zMfI-*jG51m##a>nU21;yUPM6sHJ7``qbqNk#TKb7@447IXNpqstMw|D>fy_$E$T_i zb~3m=|F-2ZC@35TD2z$BcsA|{`p~#spRlCKfn!RuMcS-Dwx4wQ{CT}XMW#3IBc@xPjC zk@a8&_j!xYm%7<_r;VIcxBzZnSET{UOdGS+PbE$K^_w= zPfVUJmlA$-^X{p&Hcu?95>r!`%{b0icpyMIx=LJh@|u?i9~|E(e_-3DPbL06M%K3< zmuY>qEPq|OFHMwT7vJkiK6RTLv!8tyj}@@Jl`^q9C+EzB%fFY+F|LS6+Hbe~g=s`B z+ZS1*oPawgmBY3!++Q#CdDg|vD?JZyl3h5>Wa^8J3W7VXtm?eW{rOYyvy~?gRcg-r zaP2EPOV%IQz{bE}#c0kPw%&I3uQ@{M3tz4I-0pSY zm7w@)^BYOKj(+j>d11dI{7k3vv5yCiUVpYFcHU&GD|cotY%grmyc?Ld#N2LTy6;}r zXNvruC2nqcd2Taj$%TBqz|IpbaeU&GsWbD}=^Id6o5P96DKD447W#iCVY$`vi1U$a?_@nvWM*jSJOA{w$rp?I zp!4tVN?I4pSZDs|$n1LSkB{C<_3bR%KUaEsCWBJ*X%iQ==axo0e4MSjy1R=l6Bg=% z8a*9KdhzVs3=9lSI2H};=((@d!zB1y_t3+`?V$F<#f10w_U^hev0!G~3xSgjU(e>( z1&1>*ytr|%;&CsZ^ajXuwxn`I-~w6q4Rv2v$G@C3{qgaBaS@T4PbbxP@i915C$Mk_ z=0r6}8mFbCr_ZnZ^>P{T=`IttsyP`}+Ts?P>G#gf3ZC?)MK);Jz@=E%lC(s;4Mler?{* zXm<8ko6om4GM~|%*0t5UyFAME<*b-}TYfCKd^CHuXZekn4yXSRd&Yk<+fC~&2v|*k)QRy*qGnq+K0LgXP=jr)y~^iIse&8W9{DZY%|Mu zuI+!`pIoo%qkC^-x8eSpC-)ot=YHoju|L}WB>T*VUtC}Qwc-1ySXF3EmBD(~vi;%I*Pd%KR-9h5Km=*oQd)&l4J z*JqiRr}SKkZoRAcV8*MpuBwXbrzzAv(S1HGdQvaf=ZJkw=B+PsBu&rph4$Jjckkhk zn$7dq;mona%=$%IYUdfFJ#3$3vqvrWnG{@hOV zs%K@ZaW2hZ(P??TQ+nP;u6xC;d#k=~k~+M({{Qk_EH1sx`Foc>K6cQ#eQlGo($R(6 z=gJ>sU#jx@*15UY^w{}jjs9Pq!`FCRX6l@fz`Sj5?`*p2;TLGB_n_{qLP$(rXbo!~ z*Tu+*2aXl$^=*0;gLX5kBxlI|0A_ZxNhhtOn8a=!V!eKUx^?NRuis}DE$7>u z&h9_=i}30!iNnjDy;{3`=57{?vo90AvERDCppltR_EX(i`KdYlt2DHjBP35g?DX}T z!1v9NomZyfhTWDuoje~Z`8jvopC&oA@U&0$9*3Y)2ex;gUehIhKV9V3Lfw3MDeH4` zejD6oNS!VAoxIuj!0VKspXThEaQDjL8ImO}i#L8-w&J2u_r2J2i=N4xe`oypQR6Px zAMaP3t8;7Hvh_t`iKgbW2UEYhEO4%MHl6n0T82q%)UW`3I=a!lm@hlNV6 zl`}sltv^;b$GqYxH8HC#INs$eS)w z^XhpbV0~&Yk4?y?E9tC(;Y;f3F6@kHP2GI7Do4{eY8k%-YQed2G+-3uN8MbbkBx_q8?E_j5jPt^XT;W@(gTIlGeYQ`P@h zPiF-jeO-H?{EhqiEG_@A$5PjBum1laU_R7j|-01%I!4;8JH^pk)53A29i?!~)>ZMhhb%~wLXV>cUN26}O>Dd}J$26i{ z?-S4AvJw^@1`gkQi!S#HY0s%xVe&{aBs1krdiuv(T(93=UEloQaPM-~w=WMp_$6m;G9K*I@RW*rxmW zw=-V`{hAxSO|C5S;l>pE>Te#N=BLWo=0ppwneBTn`NGFV$8I?XzyI7e@0GE-_|^A& zXO^CSGfisg7Q4WgZae>aPhqq^boifbS<$JyzbzNsnL6XMJUU^?v>hHwdb5g)aq?@UvEvep8q3%uewv#ckbR-UIwef z*6#ZKZg(l`i$!j!XJmG$UO8PiS@wd2pRChMCvmB__s+hMOFmL&tde$ghWSFf8LXb+ zSGQ^vc^+7mAE0}06W6LgIWZd+IM^+D$rp92skgD$ZcqP{>%ni=wA!)d2rYEFFtnOYf0&(Q z35)lmi+eVm@fM%@YwF?WH@!cF1iEdsYgqMU%2Txz@mYH>iRnme&X^eb?#8V`7H)rFcxO zQjf0L8^5yk?KPK$yJkAagej&yp8R`W-Zd$m{QOVZnW^S0mWH<#t~vMPiT2}`o!7ip-IF}6 zbtJFq)8sHV9pkW>+Sez)l}P>gGNJoXi|9sBlPT)_Q`dJwv+qTJeNwG&|MTA}_0wJR z{(Rc1?w?n&>DgEHY;&8)@4qI0m7bq-3dFy`;?V^YnQKE@tT3*K=(o3(=jFng%xHz5e0#}+1H5A`@eeK>~%l?eSe}X$<5HPASSN) z>(`I>=gj^c@4vp{<ig}kDcX_7om0on2zwSeGQ&ZFC^LEkK4;wzd$hGm^y3Zwd zmDbkzHtIT5&#F3a<$X|hWsvXQr4HA(RxgYC+fov0>My=NSMBb>|1-MoKH0+ZQaNPx z|G=#Wd=;&t`!Cs)tVn-SDRSuhLROg@Hht%tbM4k2e^jor)Bn7!*}b(lpX_M-eq~eh zwu7ulDs*{iIX`DyR_mtqQ1OYRvJ9R`m|otqy1U)Fo`+Fd6i_obiz)MV;+ zJ@W9`sGz4tdnOM z`7u4^=4PAYw^ClPCz-vIv^%|Wh7Eg;;@1hEh1UkFzcW;;JU6#E&$-;${c_WKpVU{j zKZVVn`pnC(ReiPoKtuitzO!c=O7EY~&%5UPzD?uf9p3X1t)Lhwom^B?v*)VBye^|O z5y8?jo!C{6-HyJq4LhhfG3ouLrPd|7rI%P@qcdv3I-naC$S$_ck*-ho^e_F`C(#+xe zyG}CbmG0;CcYE*Gd5g|7eo&j|T;|+<`OSJCMM0msJ16-5ScTjVIPCuG$gjTBPqlY4 zs}=XX*DH1k@aOb8%^cjbWOn=}_5bH~XV1M?HEpMN!{)hs*HRW%o{@ZL!j!9`S$O20 z*Zb>#Rtmp$6m?By&{npz+33l6>7ZTOs}m2a%fcgkKdBih8J^Ud&Gc@2YR&TaXX<*h z_upGp@v+uz;ak0kZRKg(Z098O8njkj&uN-7S1?Zf^z`RfTHh>_b91~P*mvyK?4-VJ z73X~`pRJzr_+~9vp5)5tmj8XP-rO(lhqS{cpE;=Q-}G(KzJ*e!|I6|*a-aPG3UKpS zepS$9kLRPlt)AxpOWHO*at|`nlG}M|mg1a`FTBmC-(R@xe%=!Qi@Phlcl``|Tz3B5 zzTR-#q&t7ot$kT@S?-vBoo8KpxV=kc_BCt$Z&`1SS3bU;zh2n9qIb)Wk_{{}#vKK} zOeP;$%{jYC=F)q~pOeo%{$7zEzd7;qk4`MjGUc>qvm-rr7w^ft{yF5-Ur@U&ZC~Wv zn*Yx}hBbc)RL*)Nm+aIb`!ufY{l4@~*Tq?yBn^wx5;`{7JC;j*cR&AAIbosXy4s>` zcS@FWiuT*=aQeGD>1&koPo4dDitk09{PqnzHFWdY>PHiApIsVdxBGT)*8C+Rd-vF7 zC_m7fIz8>}xsNk92Q+KNy=UH+Z2wH>#FLZKYE{<~e)IFOS})sQ@T63!<(Z4Hdw^wnT=1a_a6KHQ?+M2bE_5Q^VoXazg%zOG>U%qbn{r6lJ z*&E8vcg>4eR!C5k@^rYYs_!V>cy03b7e9~LhFN_4;1i|U+w*tL%=-UnSlVT7=}V^*4X`a{9Nkpa=>ZFoQ9w`GD^#ymDFt|Y$s~f?XLZRzuE~3ae0>+r%5^Mr*}P`v`nq_7f;C=q z%f6>~+~#29ew%c(|6PRjQ^u`Ef6u#lZqPimKF(F}TR*)PcrwHK$?~$pIh)Ek>-Og^U+Vqxx`@vG$CnNz zpR9XT8*2Zw^mFgmY^HN-Ij)^mdv5rmA~5;w!j<1Eo&CSgoZS5?+~(}BKS%afv3U0e zMa^IF^O)N2=^D&sF2*bKJNBOYu*&xSs<3T4ZI|3m+cBwH~emjP7c~v{Pmx{ z-<$aGFF)<$Y`{}U;jJXsv~9h zt6#WmpK;^Hjd#bj>{eAhUFvVX_U|j<`PrWiUg~39t*n^9$gs${h3Q)6Wh3_`{<0G$ z-Ll=5UfvmY_t77wut(4g_?lYDjF8GZ44 zwGV$jKVJ4a?DmBPvzbEbOV?~Ey8r5Y()PZ+j^>q1bZwTY{wc~ha|tgEli zubv(*pUHc}`L6Tgc18wu@j0P;TC-@<^!6t! z_K58EPb+i_T)_~!>&2xOZ}F+GqJo=TL0decUGy&(xW&XgJMeG&9J`ET7wQ)Kz1&%K z{kXQh<%Xv&XAZur?UCDCvRr|SoBM3Nclnf=|9@$nId?|i|NIxuc9Fo35#T^R%{F_FZ|`MQxXLTob0wj0;Lh)s6&e`FpK0eq-Wx-s+ZeU|e%hqwpj<->ej!yB_B>H*I5o$;-g7YsWXvh_g$BebNG* z$|lr^#vqNNRvwEnEuNA8MCaq&H>b5UPHAjY6D#hm%$j{?=Vg`e@iXR5h)(hiIMsae z)LG5bTg_iOGcYvh=~*#Ni&9eUGLnwJC^upG9FwOHzi6JHpY10%O)o0u(QSQQ)1y*z zg(_cW&9;=-wqxVh$lIq*UH%*~ft7(_kE{EEOI(|a|9+a_nz~?<>^(t^A4?YI%ey{Z z$)H;0;bmf}mFl*C=P{v^$)J5A4Bo$4);O1b&95mvbYuJd6)P|LDyF2~yr`;eY+LY5 zfAs>5~?>vgS<9 zd(k)sh6Uc;83(K)qJQ6-s4u_b*PrRtcJ;qDXC+^jKGt@fmF|-MMBjRtEcU|GEHXX#Y`6lh6_hs9(ld%|NHrE`Re^OuTNZDHLEReV_{ME zTfOaa>utX55R^_YdB1es#S5$Z1??}qu)gu)UjB`{(_h;vyEg@Go_4`qB)o{7L7~g# zh1a{C^*{c`Z~IsLJv`pjq)xSb@w$5!WhQ0kx9yXbyR17=q~x6-1H%GWrSHe*Rrkn9 z{(t)=c%S9Q=Nnx13$D2#e7x$d_UqVh=jGV#uI*KJi)~Ry^`+9Gj!`&Xm_pt$E%h8zgX9-XM<}}V0tUO;gxjHVN=6N>*mZp6>&`@ z(O51p%rVeyqiN}k>@$-Mrc9k3JT3d0@Fwn3bz`@ul9%SpoeRo$XU$ff-L(6zt+Bo8 zdC%aJmY;ierY)Yhxut`ZfnnC_TBd1BR_7UNd9N%Hee4;Y)wSWIpw7}gIkQ=oUlGZ+ z@OrXTeR+@Jwy9H>S2s;kP44tcjH^7otV~~X(=BgtUA;hdgQ?HYn@&Ia+k}aMp=Gr! zQ&?%PPi`|;P|@U)r^X$k=R^{3ed&3!N%ogGv-g*VsS|j>1z*d~V?v%W-=@TGVp%qA znTqH^1_p*%+LsttFT3|+)3uJ?jrq^!EV%P%P2rkl%Q@Co+7>&kDsi7Vaa|f)t>>vz zpdQ`UTc^99$IZ(A!Jn=9?A^Jjb(Jr_WlWnm$MEi(HIwFC=3rnDSl7X}<`-LOEZff0 zd430s^0Q1%OC9M7y_)c5r9)|~c6#m9U%gI;?=3jC=FHYNPDVG9)_2Ey?tj#yRD7~3 zF|c#IM)v93Zw2t z4DPHa@iu3x$GLXCkzKyc&6jT2`p>Pu1B2C)6Rc}~RZU&WH-E+N^WpqFFK)igc77bTjDNzk>~%l?-KpIE z_ldfFu7R~lQu)C*h09u}-aMak^0h^BtkA!X8U}^~?kesZUh&Ue;a{J3|9={fZOx*( z>*A)Dz4`q0Esg$8RSw@@DXyZ7eQ z9=qOlEO)-~qipBubw2O^KYDs??feoB%ciHP)gP7+%a$+IwQ}^JdY#Hrr3# ztKXEjJA^%ZVwkbd>1wszMGGy9Ep{h7anhFZJXM)?smgZYjNPYRNrohSlX0u-b>)7`?YGbWdG*aWl-;y&V>(gpKpI955 zoDy8oeP?Z^qw)Kk^(#zlx;H-aF>&8~Ml|YM&%CFLyY7DDxU%J>@Y(v=X>xbITO>}L zV!At_{J;w_28I_-N)}D2d;xodf^zOI*{1S;pLm#E&HYL9?LXd0x~h0Zsl0ky-sw4A zH_sJJ`qg`ABKO&}t#PNarnMx;ojRD(r?T?p;m)w_Cy%jRRhN17psjY!vGyflYi}p$ z7tLRGeZMyoPkx^e14D`5#NW{^=65XApHGX<%E~T{{dk7!+lz~T|J}F!@QC~TYpa|; zpp3uBJ0>PZ#eKsSo(H$Wz4qj-UlYAL-;W)%saAZa;F{N)H|PKT*k7tTT78t`;uq2sK)vUZt0N85AG?qgtBa5<~L z;i+lOQnwAW_#zhB*c%_55uX;^MP8y`QdrG<9j({!f2wirG1n+HRf~ z{F33spZN5pj_Tbv$t&X0X79ROVm*aUzue;r(5nHlS>O$0|vf!5Ze7?Q>3=A3Sg0qy?{7rw@czyn_SD$O|C5PYJ zu5W+8JmGLKukSK#TjzAYBU9gL7=v=>(&)$jX@{bW{6B@R)LNeMY+1|H^-XfQK3x6;CeNtS%m^zxk|^rgzYc_ZuV_7+!QKZD(8kZ+`3i{r|39Wd6NJJR#EDGkku2 z#VL-d>n0UFk=TTN2#0&zv?t zQyn)cXqo#4uFb{Xm(J#S_axc6W~^_S{$_hc;OS$hK)c}uU+#CkF=3kNhfVU|WNmz| ztH#RSC@(l1yzxKR#C5xN{rdGQ&G*mVpU-B4bL}l}>p!}OW?VYNEIn`4znb}58N9iI zRAU(#8qTR)V)XWyWA))z@YVTmC(jnyHF+J#{7Za{-d}!%KRkGS{-oI=CBh604(S)| z7`>0|jn*)aWn^G@;c`nCoI%4N85FW?613zWZ38<*;#wZ#>&v_C|9qMLf7N@@^{*Ki z80Na}W?l0u?(eJLJQg!cI@d8XFqDYBwQ`jZuKpr@a~BT-!-dE#`3JfzXI9;O`2Js1 zxb)P}fY8v;2}`rLZDEyOy~<3_yzfF2=i%Tvp<(#gkb=8!Cp<&zQb&RhM+`Hji-6OZRuXp#m8l zDk*t+uTWT6T9v0~=Q_|i2MTX(noOS@{Bkc}*SzYuysWjex#=RE{K81Tb+*1Uwk5=Q z)x}L*x6;xj{nvTT*})xZ#bpCm2Q6v#HKRN^pmQ-?|2y)E+oB`-{5j)qkd0YRV?SilGKe8 z4Q)@)k;^H1;<+}|;5XmRx+aY0jQG4KEMoranEX znS3TGEN$1%^{zo-X?2xetFBv2Te9U-$^QEuEDQ_k)79(O>;Jxf<_UicI-IOn^0SNvDEJ6s(trX*yf3PhBGiMFwWd> z8WI1d|MuR{>7bU_#1pJ*_DTOY&pXcc_=fng>Fhm!MfYykk^gZ?{|o3S2tSpg>N4;E}0!7#TX0 z3JVJbxgs{FoxL=5nNIXJ9fgEc(U7N0Ul&!@JzLuC#jBiq@YtfBq}6wBf^6te68sx% z`Tw7b^JMe8rW_|jIh8=m{5C20N_mOL&bkn>Ym&pZi*HyM7%uQBiEm*0ZXR^rVBg=Z zGq{68EMKhkT-q%*T_xQ|-G-5&flsH1@pTt>vf8qvD*Wch=E@ppC!N_+Xt2J;9`(<;859ywkcgelDR=(g`=Irlyt+~phH&HaDc{>^XZ$A`@Sk>UUK;$rnIzbi+|&3_$x zHSgdI<)F||*GaX1!s3?tp7+p;yz^%3yD}edZ{LmlaZ{(yn`3nBMp)RqdB>$d{nn(3 z+!4RE_-f-S-#mUhe@gEEg2&G${g(T8^n9Il^2y-s_y6C}|1|CI%bVfxcjJEUdneTr z_vD^gvzKbs0k0DeuYURo=_!H+aT>%rVh%`6`Eu7$d3~4t-&2aqYril0y#D{Q8?W~p zKRkZ__qRLJ#{d5wJDnagXG%!?ZSV5jX_uxReflyhOMgdh>eH+Uual>?tpEC8X^Hzx z!IW~($eBN%YOd@_W@Knc>yA0l^?J6z_40`KKU(H3pHp_|#eD(uFRR;vlXe}Ivkd!O z`E_Hnd;fLQmK{FM9Ftm$PJdCEZ~81GBIJ=yQTYDy8S~QfPMdhGv8@qFTb*tH;_g+w zNY=288q3%GH120$V3@dTQuS*+lUr8{kvf786%&3!hCq}=HeB!mmFtTgjfk(VbR znI-bggM-cf^K4dT=RO0S$?)|`aCUZfwYi?Es_U;e_xH!YXO4DuJ}j9&XQ6iDj~|cw zU%!4`{q2pUxOjMQ@ZxAj1_zfT$BwzZ$QSfFQ1yQAcQ#%r6BFBb^Pj)gs62mgusO{9 zE{k-1w*Y8#<>G!*E<18cuY_9N5&h?A@NK*SW#>CCpx2*7l1perP@~Zr_K$7a!l>mw4u}U%NxA ztLjP3?z!9jUbU`1$oJ`S zQ(M2_;wino36h}ELgURPuFtg@7#jGrFDXYP-`9Nk|JuLL|90*B^1rH2Dmg@U-R@_v z{`QCVmRqp|?%H(2Gh$xNQ&Z^`%ebfZatEE=buw>FkZ@O>uH&pXpp${Fb$#Kuwj;m3 zq_n@(US@yR_00PH#h+(NhF`z)>ClP&wRg5I%d&hL#r_h&uo1V;xF_v4ZJ7f8Bj-?kp%+uL&)4JnMEd5oPCZ(F1 z`s}r)2LnUHweBw*Vc+M~?#Xvfv-y2@W_h1Q@vO@W4YOpY1#N8@leA~jRecwv<^}0$rft{SYI9oV$|)^_*P*VKsoguDFf%X|crIE0r0!Yi>e9)H zUsnD6G}-^2{Jr!C)0>0KZL3+si}HCO!<<_VPrZ}>uk7V_y*m}R8V)Z%CVTS7k6rKI zoqYT8-<d#M>ftzfBDooe@?J4~|@19;O^Z&nBreD9KX1?0iCz3UkHF8(ZHBggGbgypiLAUqE z0&2?hRV`=ScQ$U_#k{-!!^>xx->noF7&`nWazvCmpTDqFOjAe8^Zb@z_o%F{iE|8N z-Gx_9ot|q9s_F_}E(%($YZS6<^(hmtlF$^bxnM2 zg+Yt}m5aHnodJC)3p8q3ej zX`G#%vSjw$J<`HPpMyVz%=vW2H7#}7lDtPjliOqMf9$1vgKR3hWPk$H3sS*MmjJ&^Y^=YqI_?xA(Vhv&qaif1rK$ z)$2c>FE5M9<2U$exY$1|t7~fKl{ty0N@QzemONJq-4_+P;$3pj-1Tez7+;ULbVFp} z_bmw@o-9{mvF-jUYMPnhTX^frE}i{;3=9gtTr?8So|yIZS#^}2yOlwH^E7s`sA@&4Q^K}OJk?BrRqqGDs$ zX6HV8c}UdX=F^8xVRgS-Sy@?GzP#clbN-&VIXmyxmFH*e?Ejvh|NqlE>o0a2mguhd z|NPMU`oFJtNwt~ZuL<_csi~>Czpu7m&UO`~u0MLzHG@UF<=6Jt+y7-`-{1c0Rh4=o ze`V&{h@Ek}JRrII0>`!c@s)2spSN4PK0jl{bpBWNiFFwUXZ~NU=jC;7$`T{ zx@%j_Cd@MXw&}f(x6SuMrxqKsmreg_xvBiA@c-&JFQ!)+9}0+%|NnJ;eQfxl56@=j zU%Phg*zx1v-`@WI;^N|6q6`c!E-^7NxBC)&cRV`P`m?_-{n(j}&-+)ddl{C>GpFL~ z8GF0^StmM-OZgcX8vK^?GGDu{7Gw53e7~Gby;sfqd%ss@?>_!@jbW0!?!V^~4mRh- z6#QRs+3)&a1_lPJ>1I3;m-GIe>}&q|yYHI)hQ#-i^J`=39z^)$y!m*mt@r)gT~7`b z8?E0T`2F(6_8#S5L-$zNr^+4VWMFVHG-tkcv$*c{9ie@;uP@i< z>c#~Axh@{|{_duqAK3q|(Ysx@CM!QS*Z1i0`G2xb#=rZ0`EixG{cSN_z0;9G5*sgx z<*eBxlCtvQ>OCdOmdib^E=l6As^rb~tY3X~^J4$)O-z~JbM{oM9Y()`Qp66f`u=2y%mwyO7Coo5lZu{!_j zy}4EM8Cq}dWE9k1y+C8Jg|XvF(`ULjrh&RWQ=WT!mn9|!dR8ry?Ac@#e5$wSW!8Df zC|&XKIh$gNkDvK7#U?$>&~jp25hhTt=9SK0O#Y=QHz(w z-CgqZ$@KUWZ-2~tTN*EO;Wta@jOp+9-`aabsy*n>qJWoP#-S@~wr&bIrJ4MuMs!}v z$>@Izd7%!Uw8+nETGoYD|9;8%D=$hywHZ$v^vVBv^I}{59GzuBiBpUGF?0WzS?Da&iB86(qf%HgW6#oO1aie ztlJ^`b%Zv=`~!`>Gk~~=rknP!nA)#bccpOWFfuT_?Pw64x<^>_B^N_OUt5Fd+BGq* zyOC`x1A{ChqqbJ1y4EF81_oJPM(wD`on0lY3=Zrr2fC7$ zXfrTafhU_APJ`TyTEK0ZaplSt$7Z&dQVa|XQJ~IO4`>9Cq;m1G)8dSUpd-$vGb~81 zc(d_%$;!e#Weay6`nl^<@rMVFOkzycG~?}SxfHiy7TAyofJ_92EAF+wm)sX?e@A$a|3AO&c);} zx%xRLXD{onY-G>=q!+aMW$k>R%^^JbiH)Ku&0ze}n+BXk`OINjd)sC@sfH(z(J z-NM1Zky>(0CAs!v+2I@iE|@;Prkd)1#xKhJ-K_Q{iaNTtwRvvKSM4$SEtVa#cC+R0 zH=9dOdS5surjSsYa`0H`l|2iemWRJk>%RFj%=YYyH)*_zn!9%2e9KiUkXhXKe5d;U z-5FP3TzYq^D3+-~Oxo7!gn-utH}jQ_irw?J&z`pYby@TB^W582Uy424zj#*q>C=N@7ScKkfniUk-BRg54;Mn$=>iUdu!gOiL+{!2_LE}jeO*> zf61obFWt}H4O?G**TVRwmu3}*_olw&@0a(RJbx3i{qFj`Nq+Y&ceC7UP1&;H*^fVu z=DsQ0E)zd*;?C_)w!JRDyLQ|EOFyPvZ!WAznm?J3(V^z+)$nd{{doq7O_Mh+Q3%bP z;v43z{YG!Yp$Xdxny=beWiFY#SIqAUqceZvO+}wyZ}cLvj?H|_Z!4GOp1fUd?ynU| z-;cD;JGe0Ic5K0P%m3T6?y?=037d4``j?)B19A6yUoEs|)XGR!mp%09Y{a`|+Kvah ztg-?pi`leRdhRX#xt?cp{kO}zOQR)b6^qLqd^Fd&X!hRP+Znx#N1|8D-Se|nUfHp`r&_g^b@s_@aV;UX4|!kY zVqfRX=~0dG32$l;4K17U-pD4n*4JBZW`=H)*WN$TongVjOz#(kW^Z6PAnSLmD`3~H zxWLR8oesW9$KG}IFEOx6p7gbA)w6S7rrdsU``L@cwFhLGJx)#Pd1kF4k~HPS<}<4- zXWh{*3~JjMX*-wqbqOEOwH0iy&Zyt>jFdcmw?vgA;$rI8`c(T|ldS=#lfN$B^?kkj zJFaq;)icWl)lTMqI}`tEt@*9smK1Y_vk9qdJeFvuhOUchPg#Hd)a-&-pO?}chb}Ht3Osbx6e+?jQkZ;7Ou9k(d27@ znAPK)gHqO?8K$XSJaxB3H7O`Kn4MQ@Nw&j{yj?Gs9ha;22@eU`wbAHy)as{G_DY{k zD^|VnZu$IsrGK~AShL){dxx9h(Bt2Wu4q8YL)lX=ZpZDozGL;w=@AoZOe^R9w@Hym z*>5Sj`R_ZOjO1>)F!f23CkvmuK6QRGJHOBdtIo5t&0kNN{_*kg*Fn-8pSSWbC@H^U zo;EXeo@dn_%fgjQe`>vHQ1#7v7|H!^;pU9O14&&QCU2OwyrcvX(_EXBxiVDL((wE4=jW*6TtW7#K2|L^mAkm0tcj_WU&6=vks0 zK7IaNy7%?TlP5C^4fpE>@Y}&{y<` zGlGF(hvU6F;(a z;lr%Xz=~b!Wpl zYrP!(xc${BlcWwCJzu-*XeN(>Z@8F>U+pFDl9EGJm;jT+Pm(SyiegWh?q` zxz2`#k3li=pzW@x{L4wohA(wuPs~fcW14qo$4yqZZ+p`cW=#8jX35uUHIJN<`_2h; z-t>HZW*Tqj+@deqCp3e?p3ZviIPaUwZyy#*QK4mXg41}LS#8^8SwS_exkcuw!<-_Z z^%Uy-+wH&nVB38E#gd7W6z3VT$BX%GDZd-L;fl<|$gO$JiM@5DdX9b*J^2%L=d5_G z^dMvgb3*^^;0<0Mif;shnlBlqrivDYo4zlY%*8TQG_LZ%5~s%8!%oE?TtBYyezk|m ze`4yFTzwsrGr@+t6Sn7ZM<2Is2aRGy`S<$z#=Ka=GHcp*pKS}-6I~uH;VHH`71_RJ z@1jc|&a{{EUeo*(rEB_Y+wCPaVL^*bFD>`$+o~vGJpbpMjeWIz;FwDceYd0am{akg ztkYtqYLEYTElhl~&SzJ+sr}^Gofo7sBd4yumK^yxTDG9G?Dm9UlidkRYWud`$rd@i zGh%DV{Eq6$TF$)*x%Dq*wNCveY3v`-Zr5(Oa^=cqHr`973=CFVudWXN{{DXbogIa{ z+w6we)SDkC|{M7k_ z&Fqo~nHUyqU1K<9K?#3}A=uleqtaxjyld10^;R8bM@@abSB5*585Aw3Cx;(Pm11Cs z?I@ke7W;D5EC>}Pe(baup7*w#+N&082x&(h zlLDPCZoZL?n}K0L>ztX6%O8N!6~m4mP^X!}+|ZSSf#HJ9xt4^4gP`s-LxE&4=-}|Y tq%Hvlh6A-(EZ*Xb3=9{l+CKhgT-U)-)_PpPj)8%J!PC{xWt~$(69CH+qHX{H diff --git a/external/nfd/src/CMakeLists.txt b/external/nfd/src/CMakeLists.txt deleted file mode 100644 index 1eb7c38c..00000000 --- a/external/nfd/src/CMakeLists.txt +++ /dev/null @@ -1,149 +0,0 @@ -set(TARGET_NAME nfd) - -set(PUBLIC_HEADER_FILES - include/nfd.h - include/nfd.hpp - include/nfd_sdl2.h - include/nfd_glfw3.h) - -set(SOURCE_FILES ${PUBLIC_HEADER_FILES}) - -if(nfd_PLATFORM STREQUAL PLATFORM_WIN32) - list(APPEND SOURCE_FILES nfd_win.cpp) -endif() - -if(nfd_PLATFORM STREQUAL PLATFORM_LINUX) - find_package(PkgConfig REQUIRED) - # for Linux, we support GTK3 and xdg-desktop-portal - option(NFD_PORTAL "Use xdg-desktop-portal instead of GTK" OFF) - if(NOT NFD_PORTAL) - pkg_check_modules(GTK3 REQUIRED gtk+-3.0) - message("Using GTK version: ${GTK3_VERSION}") - list(APPEND SOURCE_FILES nfd_gtk.cpp) - else() - pkg_check_modules(DBUS REQUIRED dbus-1) - message("Using DBUS version: ${DBUS_VERSION}") - list(APPEND SOURCE_FILES nfd_portal.cpp) - endif() -endif() - -if(nfd_PLATFORM STREQUAL PLATFORM_MACOS) - # For setting the filter list, macOS introduced allowedContentTypes in version 11.0 and deprecated allowedFileTypes in 12.0. - # By default (set to ON), NFDe will use allowedContentTypes when targeting macOS >= 11.0. - # Set this option to OFF to always use allowedFileTypes regardless of the target macOS version. - # This is mainly needed for applications that are built on macOS >= 11.0 but should be able to run on lower versions - # and should not be used otherwise. - option(NFD_USE_ALLOWEDCONTENTTYPES_IF_AVAILABLE "Use allowedContentTypes for filter lists on macOS >= 11.0" ON) - - find_library(APPKIT_LIBRARY AppKit) - if(NFD_USE_ALLOWEDCONTENTTYPES_IF_AVAILABLE) - include(CheckCXXSourceCompiles) - check_cxx_source_compiles( - " - #include - #if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || !defined(__MAC_11_0) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_11_0 - static_assert(false); - #endif - int main() { return 0; } - " - NFD_USE_ALLOWEDCONTENTTYPES - ) - if(NFD_USE_ALLOWEDCONTENTTYPES) - find_library(UNIFORMTYPEIDENTIFIERS_LIBRARY UniformTypeIdentifiers) - if(NOT UNIFORMTYPEIDENTIFIERS_LIBRARY) - message(FATAL_ERROR "UniformTypeIdentifiers framework is not available even though we are targeting macOS >= 11.0") - endif() - endif() - endif() - list(APPEND SOURCE_FILES nfd_cocoa.m) -endif() - -# Define the library -add_library(${TARGET_NAME} ${SOURCE_FILES}) - -# Define alias library to fail early in dependent projects -add_library(${TARGET_NAME}::${TARGET_NAME} ALIAS ${TARGET_NAME}) - -if (BUILD_SHARED_LIBS) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_EXPORT INTERFACE NFD_SHARED) -endif () - -# Allow includes from include/ -target_include_directories(${TARGET_NAME} - PUBLIC - $ - $ -) - -if(nfd_PLATFORM STREQUAL PLATFORM_LINUX) - if(NOT NFD_PORTAL) - target_include_directories(${TARGET_NAME} - PRIVATE ${GTK3_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} - PRIVATE ${GTK3_LINK_LIBRARIES}) - else() - target_include_directories(${TARGET_NAME} - PRIVATE ${DBUS_INCLUDE_DIRS}) - target_link_libraries(${TARGET_NAME} - PRIVATE ${DBUS_LINK_LIBRARIES}) - target_compile_definitions(${TARGET_NAME} - PUBLIC NFD_PORTAL) - endif() - - option(NFD_APPEND_EXTENSION "Automatically append file extension to an extensionless selection in SaveDialog()" OFF) - if(NFD_APPEND_EXTENSION) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_APPEND_EXTENSION) - endif() - option(NFD_CASE_SENSITIVE_FILTER "Make filters case sensitive" OFF) - if(NFD_CASE_SENSITIVE_FILTER) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_CASE_SENSITIVE_FILTER) - endif() -endif() - -if(nfd_PLATFORM STREQUAL PLATFORM_MACOS) - if(NFD_USE_ALLOWEDCONTENTTYPES) - target_link_libraries(${TARGET_NAME} PRIVATE ${APPKIT_LIBRARY} ${UNIFORMTYPEIDENTIFIERS_LIBRARY}) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_MACOS_ALLOWEDCONTENTTYPES=1) - else() - target_link_libraries(${TARGET_NAME} PRIVATE ${APPKIT_LIBRARY}) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_MACOS_ALLOWEDCONTENTTYPES=0) - endif() -endif() - -if(nfd_COMPILER STREQUAL COMPILER_MSVC) - string(REPLACE "/EHsc" "/EHs-c-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string(REPLACE "/GR" "/GR-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY STATIC_LIBRARY_OPTIONS /NODEFAULTLIB) -endif() - -if(nfd_COMPILER STREQUAL COMPILER_CLANGCL) - string(REPLACE "/EHsc" "/EHs-c-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string(REPLACE "/GR" "/GR-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -endif() - -if(nfd_COMPILER STREQUAL COMPILER_GNU) - target_compile_options(${TARGET_NAME} PRIVATE -nostdlib -fno-exceptions -fno-rtti) -endif() - -set_target_properties(${TARGET_NAME} PROPERTIES - PUBLIC_HEADER "${PUBLIC_HEADER_FILES}" - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR}) - -if (NFD_INSTALL) - include(GNUInstallDirs) - - install(TARGETS ${TARGET_NAME} EXPORT ${TARGET_NAME}-export - LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) - install(EXPORT ${TARGET_NAME}-export - DESTINATION lib/cmake/${TARGET_NAME} - NAMESPACE ${TARGET_NAME}:: - FILE ${TARGET_NAME}-config.cmake - ) -endif() - -option(NFD_OVERRIDE_RECENT_WITH_DEFAULT "Use defaultPath instead of recent folder on Windows" OFF) -if (NFD_OVERRIDE_RECENT_WITH_DEFAULT) - target_compile_definitions(${TARGET_NAME} PRIVATE NFD_OVERRIDE_RECENT_WITH_DEFAULT) -endif() diff --git a/external/nfd/src/include/nfd.h b/external/nfd/src/include/nfd.h deleted file mode 100644 index adb1c814..00000000 --- a/external/nfd/src/include/nfd.h +++ /dev/null @@ -1,564 +0,0 @@ -/* - Native File Dialog Extended - Repository: https://github.com/btzy/nativefiledialog-extended - License: Zlib - Authors: Bernard Teo, Michael Labbe - - This header contains the functions that can be called by user code. - */ - -#ifndef _NFD_H -#define _NFD_H - -#if defined(_WIN32) -#if defined(NFD_EXPORT) -#define NFD_API __declspec(dllexport) -#elif defined(NFD_SHARED) -#define NFD_API __declspec(dllimport) -#endif -#else -#if defined(NFD_EXPORT) || defined(NFD_SHARED) -#if defined(__GNUC__) || defined(__clang__) -#define NFD_API __attribute__((visibility("default"))) -#endif -#endif -#endif -#ifndef NFD_API -#define NFD_API -#endif - -#ifdef __cplusplus -extern "C" { -#define NFD_INLINE inline -#else -#define NFD_INLINE static inline -#endif // __cplusplus - -#include - -typedef char nfdu8char_t; - -#ifdef _WIN32 -/** @typedef UTF-16 character */ -typedef wchar_t nfdnchar_t; -#else -/** @typedef UTF-8 character */ -typedef nfdu8char_t nfdnchar_t; -#endif // _WIN32 - -/** @typedef 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 UTF-8 Filter Item */ -typedef struct { - const nfdu8char_t* name; - const nfdu8char_t* spec; -} nfdu8filteritem_t; - -#ifdef _WIN32 -/** @typedef UTF-16 Filter Item */ -typedef struct { - const nfdnchar_t* name; - const nfdnchar_t* spec; -} nfdnfilteritem_t; -#else -/** @typedef UTF-8 Filter Item */ -typedef nfdu8filteritem_t nfdnfilteritem_t; -#endif // _WIN32 - -// The native window handle type. -enum { - NFD_WINDOW_HANDLE_TYPE_UNSET = 0, - // Windows: handle is HWND (the Windows API typedefs this to void*) - NFD_WINDOW_HANDLE_TYPE_WINDOWS = 1, - // Cocoa: handle is NSWindow* - NFD_WINDOW_HANDLE_TYPE_COCOA = 2, - // X11: handle is Window - NFD_WINDOW_HANDLE_TYPE_X11 = 3, - // Wayland support will be implemented separately in the future -}; -// The native window handle. If using a platform abstraction framework (e.g. SDL2), this should be -// obtained using the corresponding NFD glue header (e.g. nfd_sdl2.h). -typedef struct { - size_t type; // this is one of the values of the enum above - void* handle; -} nfdwindowhandle_t; - -typedef size_t nfdversion_t; - -typedef struct { - const nfdu8filteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdu8char_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdopendialogu8args_t; - -#ifdef _WIN32 -typedef struct { - const nfdnfilteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdnchar_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdopendialognargs_t; -#else -typedef nfdopendialogu8args_t nfdopendialognargs_t; -#endif // _WIN32 - -typedef struct { - const nfdu8filteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdu8char_t* defaultPath; - const nfdu8char_t* defaultName; - nfdwindowhandle_t parentWindow; -} nfdsavedialogu8args_t; - -#ifdef _WIN32 -typedef struct { - const nfdnfilteritem_t* filterList; - nfdfiltersize_t filterCount; - const nfdnchar_t* defaultPath; - const nfdnchar_t* defaultName; - nfdwindowhandle_t parentWindow; -} nfdsavedialognargs_t; -#else -typedef nfdsavedialogu8args_t nfdsavedialognargs_t; -#endif // _WIN32 - -typedef struct { - const nfdu8char_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdpickfolderu8args_t; - -#ifdef _WIN32 -typedef struct { - const nfdnchar_t* defaultPath; - nfdwindowhandle_t parentWindow; -} nfdpickfoldernargs_t; -#else -typedef nfdpickfolderu8args_t nfdpickfoldernargs_t; -#endif // _WIN32 - -// This is a unique identifier tagged to all the NFD_*With() function calls, for backward -// compatibility purposes. There is usually no need to use this directly, unless you want to use -// NFD differently depending on the version you're building with. -#define NFD_INTERFACE_VERSION 1 - -/** Free a file path that was returned by the dialogs. - * - * Note: use NFD_PathSet_FreePathN() to free path from pathset instead of this function. */ -NFD_API void NFD_FreePathN(nfdnchar_t* filePath); - -/** Free a file path that was returned by the dialogs. - * - * Note: use NFD_PathSet_FreePathU8() to free path from pathset instead of this function. */ -NFD_API void NFD_FreePathU8(nfdu8char_t* filePath); - -/** Initialize NFD. Call this for every thread that might use NFD, before calling any other NFD - * functions on that thread. */ -NFD_API nfdresult_t NFD_Init(void); - -/** Call this to de-initialize NFD, if NFD_Init returned NFD_OKAY. */ -NFD_API void NFD_Quit(void); - -/** Single file open dialog - * - * It's the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns - * NFD_OKAY. - * @param[out] outPath - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath); - -/** Single file open dialog - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. - * @param[out] outPath - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_OpenDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath); - -/** This function is a library implementation detail. Please use NFD_OpenDialogN_With() instead. */ -NFD_API nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdopendialognargs_t* args); - -/** Single file open dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function - * returns NFD_OKAY. See documentation of nfdopendialognargs_t for details. */ -NFD_INLINE nfdresult_t NFD_OpenDialogN_With(nfdnchar_t** outPath, - const nfdopendialognargs_t* args) { - return NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** This function is a library implementation detail. Please use NFD_OpenDialogU8_With() instead. - */ -NFD_API nfdresult_t NFD_OpenDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdopendialogu8args_t* args); - -/** Single file open dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. See documentation of nfdopendialogu8args_t for details. */ -NFD_INLINE nfdresult_t NFD_OpenDialogU8_With(nfdu8char_t** outPath, - const nfdopendialogu8args_t* args) { - return NFD_OpenDialogU8_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** Multiple file open dialog - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeN() if this function - * returns NFD_OKAY. - * @param[out] outPaths - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, - 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_FreeU8() if this function - * returns NFD_OKAY. - * @param[out] outPaths - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_OpenDialogMultipleU8(const nfdpathset_t** outPaths, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath); - -/** This function is a library implementation detail. Please use NFD_OpenDialogMultipleN_With() - * instead. */ -NFD_API nfdresult_t NFD_OpenDialogMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args); - -/** Multiple file open dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeN() if this function - * returns NFD_OKAY. See documentation of nfdopendialognargs_t for details. */ -NFD_INLINE nfdresult_t NFD_OpenDialogMultipleN_With(const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args) { - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, args); -} - -/** This function is a library implementation detail. Please use NFD_OpenDialogU8_With() instead. - */ -NFD_API nfdresult_t NFD_OpenDialogMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args); - -/** Multiple file open dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeU8() if this function - * returns NFD_OKAY. See documentation of nfdopendialogu8args_t for details. */ -NFD_INLINE nfdresult_t NFD_OpenDialogMultipleU8_With(const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args) { - return NFD_OpenDialogMultipleU8_With_Impl(NFD_INTERFACE_VERSION, outPaths, args); -} - -/** Save dialog - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns - * NFD_OKAY. - * @param[out] outPath - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath, - const nfdnchar_t* defaultName); - -/** Save dialog - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. - * @param[out] outPath - * @param filterCount If zero, filterList is ignored (you can use null). - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_SaveDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath, - const nfdu8char_t* defaultName); - -/** This function is a library implementation detail. Please use NFD_SaveDialogN_With() instead. */ -NFD_API nfdresult_t NFD_SaveDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdsavedialognargs_t* args); - -/** Single file save dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function - * returns NFD_OKAY. See documentation of nfdsavedialognargs_t for details. */ -NFD_INLINE nfdresult_t NFD_SaveDialogN_With(nfdnchar_t** outPath, - const nfdsavedialognargs_t* args) { - return NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** This function is a library implementation detail. Please use NFD_SaveDialogU8_With() instead. - */ -NFD_API nfdresult_t NFD_SaveDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args); - -/** Single file save dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. See documentation of nfdsavedialogu8args_t for details. */ -NFD_INLINE nfdresult_t NFD_SaveDialogU8_With(nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args) { - return NFD_SaveDialogU8_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** Select single folder dialog - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function returns - * NFD_OKAY. - * @param[out] outPath - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath); - -/** Select single folder dialog - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. - * @param[out] outPath - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath); - -/** This function is a library implementation detail. Please use NFD_PickFolderN_With() instead. */ -NFD_API nfdresult_t NFD_PickFolderN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args); - -/** Select single folder dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathN() if this function - * returns NFD_OKAY. See documentation of nfdpickfoldernargs_t for details. */ -NFD_INLINE nfdresult_t NFD_PickFolderN_With(nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args) { - return NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** This function is a library implementation detail. Please use NFD_PickFolderU8_With() instead. - */ -NFD_API nfdresult_t NFD_PickFolderU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args); - -/** Select single folder dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPath` via NFD_FreePathU8() if this function - * returns NFD_OKAY. See documentation of nfdpickfolderu8args_t for details. */ -NFD_INLINE nfdresult_t NFD_PickFolderU8_With(nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args) { - return NFD_PickFolderU8_With_Impl(NFD_INTERFACE_VERSION, outPath, args); -} - -/** Select multiple folder dialog - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeN() if this function - * returns NFD_OKAY. - * @param[out] outPaths - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_PickFolderMultipleN(const nfdpathset_t** outPaths, - const nfdnchar_t* defaultPath); - -/** Select multiple folder dialog - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeU8() if this function - * returns NFD_OKAY. - * @param[out] outPaths - * @param defaultPath If null, the operating system will decide. */ -NFD_API nfdresult_t NFD_PickFolderMultipleU8(const nfdpathset_t** outPaths, - const nfdu8char_t* defaultPath); - -/** This function is a library implementation detail. Please use NFD_PickFolderMultipleN_With() - * instead. */ -NFD_API nfdresult_t NFD_PickFolderMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args); - -/** Select multiple folder dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeN() if this function - * returns NFD_OKAY. See documentation of nfdopendialogargs_t for details. */ -NFD_INLINE nfdresult_t NFD_PickFolderMultipleN_With(const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args) { - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, args); -} - -/** This function is a library implementation detail. Please use NFD_PickFolderMultipleU8_With() - * instead. - */ -NFD_API nfdresult_t NFD_PickFolderMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args); - -/** Select multiple folder dialog, with additional parameters. - * - * It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeU8() if this function - * returns NFD_OKAY. See documentation of nfdpickfolderargs_t for details. */ -NFD_INLINE nfdresult_t NFD_PickFolderMultipleU8_With(const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args) { - return NFD_PickFolderMultipleU8_With_Impl(NFD_INTERFACE_VERSION, outPaths, args); -} - -/** Get the last error - * - * This is set when a function returns NFD_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. - * @return The last error that was set, or null if there is no error. */ -NFD_API const char* NFD_GetError(void); - -/** Clear the error. */ -NFD_API 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__ - -/** Get the number of entries stored in pathSet. - * - * Note: 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. */ -NFD_API nfdresult_t NFD_PathSet_GetCount(const nfdpathset_t* pathSet, nfdpathsetsize_t* count); - -/** Get 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. */ -NFD_API nfdresult_t NFD_PathSet_GetPathN(const nfdpathset_t* pathSet, - nfdpathsetsize_t index, - nfdnchar_t** outPath); - -/** Get the native path at offset index. - * - * It is the caller's responsibility to free `outPath` via NFD_PathSet_FreePathU8() if this - * function returns NFD_OKAY. */ -NFD_API nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, - nfdpathsetsize_t index, - nfdu8char_t** outPath); - -/** Free the path gotten by NFD_PathSet_GetPathN(). */ -NFD_API void NFD_PathSet_FreePathN(const nfdnchar_t* filePath); - -/** Free the path gotten by NFD_PathSet_GetPathU8(). */ -NFD_API void NFD_PathSet_FreePathU8(const nfdu8char_t* filePath); - -/** 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. */ -NFD_API nfdresult_t NFD_PathSet_GetEnum(const nfdpathset_t* pathSet, - nfdpathsetenum_t* outEnumerator); - -/** Frees an enumerator of the path set. */ -NFD_API 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_FreePathN() - * if this function returns NFD_OKAY and `*outPath` is not null. */ -NFD_API nfdresult_t NFD_PathSet_EnumNextN(nfdpathsetenum_t* enumerator, nfdnchar_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. */ -NFD_API nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath); - -/** Free the pathSet */ -NFD_API void NFD_PathSet_Free(const nfdpathset_t* pathSet); - -#ifdef _WIN32 - -/* say that the U8 versions of functions are not just __attribute__((alias(""))) to the native - * versions */ -#define NFD_DIFFERENT_NATIVE_FUNCTIONS - -#endif // _WIN32 - -#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_PickFolderMultiple NFD_PickFolderMultipleN -#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_PickFolderMultiple NFD_PickFolderMultipleU8 -#define NFD_PathSet_GetPath NFD_PathSet_GetPathU8 -#define NFD_PathSet_FreePath NFD_PathSet_FreePathU8 -#define NFD_PathSet_EnumNext NFD_PathSet_EnumNextU8 -#endif // NFD_NATIVE - -#undef NFD_INLINE -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // _NFD_H diff --git a/external/nfd/src/include/nfd.hpp b/external/nfd/src/include/nfd.hpp deleted file mode 100644 index da232ae8..00000000 --- a/external/nfd/src/include/nfd.hpp +++ /dev/null @@ -1,375 +0,0 @@ -/* - 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, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdopendialognargs_t args{filterList, filterCount, defaultPath, parentWindow}; - return ::NFD_OpenDialogN_With(&outPath, &args); -} - -inline nfdresult_t OpenDialogMultiple(const nfdpathset_t*& outPaths, - const nfdnfilteritem_t* filterList = nullptr, - nfdfiltersize_t filterCount = 0, - const nfdnchar_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdopendialognargs_t args{filterList, filterCount, defaultPath, parentWindow}; - return ::NFD_OpenDialogMultipleN_With(&outPaths, &args); -} - -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, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdsavedialognargs_t args{ - filterList, filterCount, defaultPath, defaultName, parentWindow}; - return ::NFD_SaveDialogN_With(&outPath, &args); -} - -inline nfdresult_t PickFolder(nfdnchar_t*& outPath, - const nfdnchar_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpickfoldernargs_t args{defaultPath, parentWindow}; - return ::NFD_PickFolderN_With(&outPath, &args); -} - -inline nfdresult_t PickFolderMultiple(const nfdpathset_t*& outPaths, - const nfdnchar_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpickfoldernargs_t args{defaultPath, parentWindow}; - return ::NFD_PickFolderMultipleN_With(&outPaths, &args); -} - -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 filterCount = 0, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdopendialogu8args_t args{filterList, filterCount, defaultPath, parentWindow}; - return ::NFD_OpenDialogU8_With(&outPath, &args); -} - -inline nfdresult_t OpenDialogMultiple(const nfdpathset_t*& outPaths, - const nfdu8filteritem_t* filterList = nullptr, - nfdfiltersize_t filterCount = 0, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdopendialogu8args_t args{filterList, filterCount, defaultPath, parentWindow}; - return ::NFD_OpenDialogMultipleU8_With(&outPaths, &args); -} - -inline nfdresult_t SaveDialog(nfdu8char_t*& outPath, - const nfdu8filteritem_t* filterList = nullptr, - nfdfiltersize_t filterCount = 0, - const nfdu8char_t* defaultPath = nullptr, - const nfdu8char_t* defaultName = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdsavedialogu8args_t args{ - filterList, filterCount, defaultPath, defaultName, parentWindow}; - return ::NFD_SaveDialogU8_With(&outPath, &args); -} - -inline nfdresult_t PickFolder(nfdu8char_t*& outPath, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpickfolderu8args_t args{defaultPath, parentWindow}; - return ::NFD_PickFolderU8_With(&outPath, &args); -} - -inline nfdresult_t PickFolderMultiple(const nfdpathset_t*& outPaths, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpickfolderu8args_t args{defaultPath, parentWindow}; - return ::NFD_PickFolderMultipleU8_With(&outPaths, &args); -} - -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, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdnchar_t* out; - nfdresult_t res = OpenDialog(out, filterList, filterCount, defaultPath, parentWindow); - 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, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpathset_t* out; - nfdresult_t res = OpenDialogMultiple(out, filterList, filterCount, defaultPath, parentWindow); - 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, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdnchar_t* out; - nfdresult_t res = - SaveDialog(out, filterList, filterCount, defaultPath, defaultName, parentWindow); - if (res == NFD_OKAY) { - outPath.reset(out); - } - return res; -} - -inline nfdresult_t PickFolder(UniquePathN& outPath, - const nfdnchar_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdnchar_t* out; - nfdresult_t res = PickFolder(out, defaultPath, parentWindow); - if (res == NFD_OKAY) { - outPath.reset(out); - } - return res; -} - -inline nfdresult_t PickFolderMultiple(UniquePathSet& outPaths, - const nfdnchar_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpathset_t* out; - nfdresult_t res = PickFolderMultiple(out, defaultPath, parentWindow); - if (res == NFD_OKAY) { - outPaths.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, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdu8char_t* out; - nfdresult_t res = OpenDialog(out, filterList, filterCount, defaultPath, parentWindow); - 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, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpathset_t* out; - nfdresult_t res = OpenDialogMultiple(out, filterList, filterCount, defaultPath, parentWindow); - 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, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdu8char_t* out; - nfdresult_t res = - SaveDialog(out, filterList, filterCount, defaultPath, defaultName, parentWindow); - if (res == NFD_OKAY) { - outPath.reset(out); - } - return res; -} - -inline nfdresult_t PickFolder(UniquePathU8& outPath, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - nfdu8char_t* out; - nfdresult_t res = PickFolder(out, defaultPath, parentWindow); - if (res == NFD_OKAY) { - outPath.reset(out); - } - return res; -} - -inline nfdresult_t PickFolderMultiple(UniquePathSet& outPaths, - const nfdu8char_t* defaultPath = nullptr, - nfdwindowhandle_t parentWindow = {}) noexcept { - const nfdpathset_t* out; - nfdresult_t res = PickFolderMultiple(out, defaultPath, parentWindow); - if (res == NFD_OKAY) { - outPaths.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/external/nfd/src/include/nfd_glfw3.h b/external/nfd/src/include/nfd_glfw3.h deleted file mode 100644 index c4ec5307..00000000 --- a/external/nfd/src/include/nfd_glfw3.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - Native File Dialog Extended - Repository: https://github.com/btzy/nativefiledialog-extended - License: Zlib - Authors: Bernard Teo - - This header contains a function to convert a GLFW window handle to a native window handle for - passing to NFDe. - */ - -#ifndef _NFD_GLFW3_H -#define _NFD_GLFW3_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#define NFD_INLINE inline -#else -#define NFD_INLINE static inline -#endif // __cplusplus - -/** - * Converts a GLFW window handle to a native window handle that can be passed to NFDe. - * @param sdlWindow The GLFW window handle. - * @param[out] nativeWindow The output native window handle, populated if and only if this function - * returns true. - * @return Either true to indicate success, or false to indicate failure. It is intended that - * users ignore the error and simply pass a value-initialized nfdwindowhandle_t to NFDe if this - * function fails. */ -NFD_INLINE bool NFD_GetNativeWindowFromGLFWWindow(GLFWwindow* glfwWindow, - nfdwindowhandle_t* nativeWindow) { - GLFWerrorfun oldCallback = glfwSetErrorCallback(NULL); - bool success = false; -#if defined(GLFW_EXPOSE_NATIVE_WIN32) - if (!success) { - const HWND hwnd = glfwGetWin32Window(glfwWindow); - if (hwnd) { - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_WINDOWS; - nativeWindow->handle = (void*)hwnd; - success = true; - } - } -#endif -#if defined(GLFW_EXPOSE_NATIVE_COCOA) - if (!success) { - const id cocoa_window = glfwGetCocoaWindow(glfwWindow); - if (cocoa_window) { - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_COCOA; - nativeWindow->handle = (void*)cocoa_window; - success = true; - } - } -#endif -#if defined(GLFW_EXPOSE_NATIVE_X11) - if (!success) { - const Window x11_window = glfwGetX11Window(glfwWindow); - if (x11_window != None) { - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_X11; - nativeWindow->handle = (void*)x11_window; - success = true; - } - } -#endif -#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) - // For now we don't support Wayland, but we intend to support it eventually. - // Silence the warnings. - { - (void)glfwWindow; - (void)nativeWindow; - } -#endif - glfwSetErrorCallback(oldCallback); - return success; -} - -#undef NFD_INLINE -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // _NFD_GLFW3_H diff --git a/external/nfd/src/include/nfd_sdl2.h b/external/nfd/src/include/nfd_sdl2.h deleted file mode 100644 index 5703762e..00000000 --- a/external/nfd/src/include/nfd_sdl2.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - Native File Dialog Extended - Repository: https://github.com/btzy/nativefiledialog-extended - License: Zlib - Authors: Bernard Teo - - This header contains a function to convert an SDL window handle to a native window handle for - passing to NFDe. - - This is meant to be used with SDL2, but if there are incompatibilities with future SDL versions, - we can conditionally compile based on SDL_MAJOR_VERSION. - */ - -#ifndef _NFD_SDL2_H -#define _NFD_SDL2_H - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#define NFD_INLINE inline -#else -#define NFD_INLINE static inline -#endif // __cplusplus - -/** - * Converts an SDL window handle to a native window handle that can be passed to NFDe. - * @param sdlWindow The SDL window handle. - * @param[out] nativeWindow The output native window handle, populated if and only if this function - * returns true. - * @return Either true to indicate success, or false to indicate failure. If false is returned, - * you can call SDL_GetError() for more information. However, it is intended that users ignore the - * error and simply pass a value-initialized nfdwindowhandle_t to NFDe if this function fails. */ -NFD_INLINE bool NFD_GetNativeWindowFromSDLWindow(SDL_Window* sdlWindow, - nfdwindowhandle_t* nativeWindow) { - SDL_SysWMinfo info; - SDL_VERSION(&info.version); - if (!SDL_GetWindowWMInfo(sdlWindow, &info)) { - return false; - } - switch (info.subsystem) { -#if defined(SDL_VIDEO_DRIVER_WINDOWS) - case SDL_SYSWM_WINDOWS: - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_WINDOWS; - nativeWindow->handle = (void*)info.info.win.window; - return true; -#endif -#if defined(SDL_VIDEO_DRIVER_COCOA) - case SDL_SYSWM_COCOA: - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_COCOA; - nativeWindow->handle = (void*)info.info.cocoa.window; - return true; -#endif -#if defined(SDL_VIDEO_DRIVER_X11) - case SDL_SYSWM_X11: - nativeWindow->type = NFD_WINDOW_HANDLE_TYPE_X11; - nativeWindow->handle = (void*)info.info.x11.window; - return true; -#endif - default: - // Silence the warning in case we are not using a supported backend. - (void)nativeWindow; - SDL_SetError("Unsupported native window type."); - return false; - } -} - -#undef NFD_INLINE -#ifdef __cplusplus -} -#endif // __cplusplus - -#endif // _NFD_SDL2_H diff --git a/external/nfd/src/nfd_cocoa.m b/external/nfd/src/nfd_cocoa.m deleted file mode 100644 index 4bcea220..00000000 --- a/external/nfd/src/nfd_cocoa.m +++ /dev/null @@ -1,615 +0,0 @@ -/* - Native File Dialog Extended - Repository: https://github.com/btzy/nativefiledialog-extended - License: Zlib - Authors: Bernard Teo, Michael Labbe - */ - -#include -#include -#include "nfd.h" - -// MacOS is deprecating the allowedFileTypes property in favour of allowedContentTypes, so we have -// to introduce this breaking change. Define NFD_MACOS_ALLOWEDCONTENTTYPES to 1 to have it set the -// allowedContentTypes property of the SavePanel or OpenPanel. Define -// NFD_MACOS_ALLOWEDCONTENTTYPES to 0 to have it set the allowedFileTypes property of the SavePanel -// or OpenPanel. If NFD_MACOS_ALLOWEDCONTENTTYPES is undefined, then it will set it to 1 if -// __MAC_OS_X_VERSION_MIN_REQUIRED >= 11.0, and 0 otherwise. -#if !defined(NFD_MACOS_ALLOWEDCONTENTTYPES) -#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || !defined(__MAC_11_0) || \ - __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_11_0 -#define NFD_MACOS_ALLOWEDCONTENTTYPES 0 -#else -#define NFD_MACOS_ALLOWEDCONTENTTYPES 1 -#endif -#endif - -#if NFD_MACOS_ALLOWEDCONTENTTYPES == 1 -#include -#endif - -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); -} - -#if NFD_MACOS_ALLOWEDCONTENTTYPES == 1 -// Returns an NSArray of UTType representing the content types. -static NSArray* BuildAllowedContentTypes(const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount) { - 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]; - UTType* filterType = [UTType typeWithFilenameExtension:filterStr - conformingToType:UTTypeData]; - [filterStr release]; - if (filterType) [buildFilterList addObject:filterType]; - p_currentFilterBegin = p_filterSpec + 1; - } - } - // add the extension to the array - NSString* filterStr = [[NSString alloc] initWithUTF8String:p_currentFilterBegin]; - UTType* filterType = [UTType typeWithFilenameExtension:filterStr - conformingToType:UTTypeData]; - [filterStr release]; - if (filterType) [buildFilterList addObject:filterType]; - } - - NSArray* returnArray = [NSArray arrayWithArray:buildFilterList]; - - [buildFilterList release]; - - assert([returnArray count] != 0); - - return returnArray; -} -#else -// Returns an NSArray of NSString representing the file types. -static NSArray* BuildAllowedFileTypes(const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount) { - 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; -} -#endif - -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 and set it on the dialog -// We use setAllowedFileTypes or setAllowedContentTypes depending on the deployment target -#if NFD_MACOS_ALLOWEDCONTENTTYPES == 1 - NSArray* allowedContentTypes = BuildAllowedContentTypes(filterList, filterCount); - [dialog setAllowedContentTypes:allowedContentTypes]; -#else - NSArray* allowedFileTypes = BuildAllowedFileTypes(filterList, filterCount); - [dialog setAllowedFileTypes:allowedFileTypes]; -#endif -} - -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; -} - -static NSWindow* GetNativeWindowHandle(const nfdwindowhandle_t* parentWindow) { - if (parentWindow->type != NFD_WINDOW_HANDLE_TYPE_COCOA) { - return NULL; - } - return (NSWindow*)parentWindow->handle; -} - -/* public */ - -const char* NFD_GetError(void) { - return g_errorstr; -} - -void NFD_ClearError(void) { - NFDi_SetError(NULL); -} - -void NFD_FreePathN(nfdnchar_t* filePath) { - NFDi_Free((void*)filePath); -} - -void NFD_FreePathU8(nfdu8char_t* filePath) { - NFD_FreePathN(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) { - nfdopendialognargs_t args = {0}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - nfdresult_t result = NFD_CANCEL; - @autoreleasepool { - NSWindow* keyWindow = GetNativeWindowHandle(&args->parentWindow); - if (keyWindow) { - [keyWindow makeKeyAndOrderFront:nil]; - } else { - keyWindow = [[NSApplication sharedApplication] keyWindow]; - } - - NSOpenPanel* dialog = [NSOpenPanel openPanel]; - [dialog setAllowsMultipleSelection:NO]; - - // Build the filter list - AddFilterListToDialog(dialog, args->filterList, args->filterCount); - - // Set the starting directory - SetDefaultPath(dialog, args->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_OpenDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) { - return NFD_OpenDialogN(outPath, filterList, filterCount, defaultPath); -} - -nfdresult_t NFD_OpenDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdopendialogu8args_t* args) { - return NFD_OpenDialogN_With_Impl(version, outPath, args); -} - -nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath) { - nfdopendialognargs_t args = {0}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_OpenDialogMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - nfdresult_t result = NFD_CANCEL; - @autoreleasepool { - NSWindow* keyWindow = GetNativeWindowHandle(&args->parentWindow); - if (keyWindow) { - [keyWindow makeKeyAndOrderFront:nil]; - } else { - keyWindow = [[NSApplication sharedApplication] keyWindow]; - } - - NSOpenPanel* dialog = [NSOpenPanel openPanel]; - [dialog setAllowsMultipleSelection:YES]; - - // Build the filter list - AddFilterListToDialog(dialog, args->filterList, args->filterCount); - - // Set the starting directory - SetDefaultPath(dialog, args->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_OpenDialogMultipleU8(const nfdpathset_t** outPaths, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) { - return NFD_OpenDialogMultipleN(outPaths, filterList, filterCount, defaultPath); -} - -nfdresult_t NFD_OpenDialogMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args) { - return NFD_OpenDialogMultipleN_With_Impl(version, outPaths, args); -} - -nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath, - const nfdnchar_t* defaultName) { - nfdsavedialognargs_t args = {0}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - args.defaultName = defaultName; - return NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_SaveDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdsavedialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - nfdresult_t result = NFD_CANCEL; - @autoreleasepool { - NSWindow* keyWindow = GetNativeWindowHandle(&args->parentWindow); - if (keyWindow) { - [keyWindow makeKeyAndOrderFront:nil]; - } else { - 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, args->filterList, args->filterCount); - - // Set the starting directory - SetDefaultPath(dialog, args->defaultPath); - - // Set the default file name - SetDefaultName(dialog, args->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_SaveDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath, - const nfdu8char_t* defaultName) { - return NFD_SaveDialogN(outPath, filterList, filterCount, defaultPath, defaultName); -} - -nfdresult_t NFD_SaveDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args) { - return NFD_SaveDialogN_With_Impl(version, outPath, args); -} - -nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args = {0}; - args.defaultPath = defaultPath; - return NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_PickFolderN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - nfdresult_t result = NFD_CANCEL; - @autoreleasepool { - NSWindow* keyWindow = GetNativeWindowHandle(&args->parentWindow); - if (keyWindow) { - [keyWindow makeKeyAndOrderFront:nil]; - } else { - 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, args->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_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath) { - return NFD_PickFolderN(outPath, defaultPath); -} - -nfdresult_t NFD_PickFolderU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args) { - return NFD_PickFolderN_With_Impl(version, outPath, args); -} - -nfdresult_t NFD_PickFolderMultipleN(const nfdpathset_t** outPaths, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args = {0}; - args.defaultPath = defaultPath; - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_PickFolderMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - nfdresult_t result = NFD_CANCEL; - @autoreleasepool { - NSWindow* keyWindow = GetNativeWindowHandle(&args->parentWindow); - if (keyWindow) { - [keyWindow makeKeyAndOrderFront:nil]; - } else { - keyWindow = [[NSApplication sharedApplication] keyWindow]; - } - - NSOpenPanel* dialog = [NSOpenPanel openPanel]; - [dialog setAllowsMultipleSelection:YES]; - [dialog setCanChooseDirectories:YES]; - [dialog setCanCreateDirectories:YES]; - [dialog setCanChooseFiles:NO]; - - // Set the starting directory - SetDefaultPath(dialog, args->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_PickFolderMultipleU8(const nfdpathset_t** outPaths, - const nfdu8char_t* defaultPath) { - return NFD_PickFolderMultipleN(outPaths, defaultPath); -} - -nfdresult_t NFD_PickFolderMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args) { - return NFD_PickFolderMultipleN_With_Impl(version, outPaths, args); -} - -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); - } -} - -nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, - nfdpathsetsize_t index, - nfdu8char_t** outPath) { - return NFD_PathSet_GetPathN(pathSet, index, outPath); -} - -void NFD_PathSet_FreePathN(const nfdnchar_t* filePath) { - // const_cast not supported on Mac - union { - const nfdnchar_t* constPath; - nfdnchar_t* nonConstPath; - } pathUnion; - - pathUnion.constPath = filePath; - - NFD_FreePathN(pathUnion.nonConstPath); -} - -void NFD_PathSet_FreePathU8(const nfdu8char_t* filePath) { - // const_cast not supported on Mac - union { - const nfdu8char_t* constPath; - nfdu8char_t* nonConstPath; - } pathUnion; - - pathUnion.constPath = filePath; - - NFD_FreePathU8(pathUnion.nonConstPath); -} - -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; - } - } -} - -nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath) { - return NFD_PathSet_EnumNextN(enumerator, outPath); -} diff --git a/external/nfd/src/nfd_gtk.cpp b/external/nfd/src/nfd_gtk.cpp deleted file mode 100644 index bb7d3ccf..00000000 --- a/external/nfd/src/nfd_gtk.cpp +++ /dev/null @@ -1,974 +0,0 @@ -/* - 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" - -/* -Define NFD_CASE_SENSITIVE_FILTER if you want file filters to be case-sensitive. The default -is case-insensitive. While Linux uses a case-sensitive filesystem and is designed for -case-sensitive file extensions, perhaps in the vast majority of cases users actually expect the file -filters to be case-insensitive. -*/ - -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; -} - -#ifndef NFD_CASE_SENSITIVE_FILTER -nfdnchar_t* emit_case_insensitive_glob(const nfdnchar_t* begin, - const nfdnchar_t* end, - nfdnchar_t* out) { - // this code will only make regular Latin characters case-insensitive; other - // characters remain case sensitive - for (; begin != end; ++begin) { - if ((*begin >= 'A' && *begin <= 'Z') || (*begin >= 'a' && *begin <= 'z')) { - *out++ = '['; - *out++ = *begin; - // invert the case of the original character - *out++ = *begin ^ static_cast(0x20); - *out++ = ']'; - } else { - *out++ = *begin; - } - } - return out; -} -#endif - -// 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 == ',') { - ++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++ = ' '; - } - -#ifdef NFD_CASE_SENSITIVE_FILTER - // +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'; - gtk_file_filter_add_pattern(filter, extnBuf); - NFDi_Free(extnBuf); -#else - // Each character in the Latin alphabet is converted into 4 characters. E.g. - // 'a' is converted into "[Aa]". Other characters are preserved. Then we +1 - // for the trailing '\0'. - nfdnchar_t* extnBuf = NFDi_Malloc( - sizeof(nfdnchar_t) * ((p_spec - p_extensionStart) * 4 + 3)); - nfdnchar_t* p_extnBufEnd = extnBuf; - *p_extnBufEnd++ = '*'; - *p_extnBufEnd++ = '.'; - p_extnBufEnd = - emit_case_insensitive_glob(p_extensionStart, p_spec, p_extnBufEnd); - *p_extnBufEnd++ = '\0'; - gtk_file_filter_add_pattern(filter, extnBuf); - NFDi_Free(extnBuf); -#endif - - 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 == ',') { - ++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++ = ' '; - } - -#ifdef NFD_CASE_SENSITIVE_FILTER - // +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'; - gtk_file_filter_add_pattern(filter, extnBuf); - NFDi_Free(extnBuf); -#else - // Each character in the Latin alphabet is converted into 4 characters. E.g. - // 'a' is converted into "[Aa]". Other characters are preserved. Then we +1 - // for the trailing '\0'. - nfdnchar_t* extnBuf = NFDi_Malloc( - sizeof(nfdnchar_t) * ((p_spec - p_extensionStart) * 4 + 3)); - nfdnchar_t* p_extnBufEnd = extnBuf; - *p_extnBufEnd++ = '*'; - *p_extnBufEnd++ = '.'; - p_extnBufEnd = - emit_case_insensitive_glob(p_extensionStart, p_spec, p_extnBufEnd); - *p_extnBufEnd++ = '\0'; - gtk_file_filter_add_pattern(filter, extnBuf); - NFDi_Free(extnBuf); -#endif - - // 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); -} - -// Gets the GdkWindow from the given window handle. This function might fail even if parentWindow -// is set correctly, since it calls some failable GDK functions. If it fails, it will return -// nullptr. The caller is responsible for freeing ths returned GdkWindow, if not nullptr. -GdkWindow* GetAllocNativeWindowHandle(const nfdwindowhandle_t& parentWindow) { - switch (parentWindow.type) { -#if defined(GDK_WINDOWING_X11) - case NFD_WINDOW_HANDLE_TYPE_X11: { - const Window x11_handle = reinterpret_cast(parentWindow.handle); - // AFAIK, _any_ X11 display will do, because Windows are not associated to a specific - // Display. Supposedly, a Display is just a connection to the X server. - - // This will contain the X11 display we want to use. - GdkDisplay* x11_display = nullptr; - GdkDisplayManager* display_manager = gdk_display_manager_get(); - - // If we can find an existing X11 display, use it. - GSList* gdk_display_list = gdk_display_manager_list_displays(display_manager); - while (gdk_display_list) { - GSList* node = gdk_display_list; - GdkDisplay* display = GDK_DISPLAY(node->data); - if (GDK_IS_X11_DISPLAY(display)) { - g_slist_free(node); - x11_display = display; - break; - } else { - gdk_display_list = node->next; - g_slist_free_1(node); - } - } - - // Otherwise, we have to create our own X11 display. - if (!x11_display) { - // This is not very nice, because we are always resetting the allowed backends - // setting to NULL (which means all backends are allowed), even though we can't be - // sure that the user didn't call gdk_set_allowed_backends() earlier to force a - // specific backend. But well if the user doesn't have an X11 display already open - // and yet is telling us with have an X11 window as parent, they probably don't use - // GTK in their application at all so they probably won't notice this. - // - // There is no way, AFAIK, to get the allowed backends first so we can restore it - // later, and gdk_x11_display_open() is GTK4-only (the GTK3 version is a private - // implementation detail). - // - // Also, we don't close the display we specially opened, since GTK will need it to - // show the dialog. Though it probably doesn't matter very much if we want to free - // up resources and clean it up. - gdk_set_allowed_backends("x11"); - x11_display = gdk_display_manager_open_display(display_manager, NULL); - gdk_set_allowed_backends(NULL); - } - if (!x11_display) return nullptr; - GdkWindow* gdk_window = gdk_x11_window_foreign_new_for_display(x11_display, x11_handle); - return gdk_window; - } -#endif - default: - return nullptr; - } -} - -void RealizedSignalHandler(GtkWidget* window, void* userdata) { - GdkWindow* const parentWindow = static_cast(userdata); - gdk_window_set_transient_for(gtk_widget_get_window(window), parentWindow); -} - -struct NativeWindowParenter { - NativeWindowParenter(GtkWidget* w, const nfdwindowhandle_t& parentWindow) noexcept : widget(w) { - parent = GetAllocNativeWindowHandle(parentWindow); - - if (parent) { - // set the handler to the realize signal to set the transient GDK parent - handlerID = g_signal_connect(G_OBJECT(widget), - "realize", - G_CALLBACK(RealizedSignalHandler), - static_cast(parent)); - - // make the dialog window use the same GtkScreen as the parent (so that parenting works) - gtk_window_set_screen(GTK_WINDOW(widget), gdk_window_get_screen(parent)); - } - } - ~NativeWindowParenter() { - if (parent) { - // unset the handler and delete the parent GdkWindow - g_signal_handler_disconnect(G_OBJECT(widget), handlerID); - g_object_unref(parent); - } - } - GtkWidget* const widget; - GdkWindow* parent; - gulong handlerID; -}; - -} // 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); -} - -void NFD_FreePathU8(nfdu8char_t* filePath) __attribute__((alias("NFD_FreePathN"))); - -nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - 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), args->filterList, args->filterCount); - - /* Set the default path */ - SetDefaultPath(GTK_FILE_CHOOSER(widget), args->defaultPath); - - gint result; - { - /* Parent the window properly */ - NativeWindowParenter nativeWindowParenter(widget, args->parentWindow); - - /* invoke the dialog (blocks until dialog is closed) */ - result = RunDialogWithFocus(GTK_DIALOG(widget)); - } - - 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_OpenDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_OpenDialogN"))); - -nfdresult_t NFD_OpenDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdopendialogu8args_t* args) - __attribute__((alias("NFD_OpenDialogN_With_Impl"))); - -nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_OpenDialogMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - 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), args->filterList, args->filterCount); - - /* Set the default path */ - SetDefaultPath(GTK_FILE_CHOOSER(widget), args->defaultPath); - - gint result; - { - /* Parent the window properly */ - NativeWindowParenter nativeWindowParenter(widget, args->parentWindow); - - /* invoke the dialog (blocks until dialog is closed) */ - result = RunDialogWithFocus(GTK_DIALOG(widget)); - } - - if (result == 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_OpenDialogMultipleU8(const nfdpathset_t** outPaths, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_OpenDialogMultipleN"))); - -nfdresult_t NFD_OpenDialogMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args) - __attribute__((alias("NFD_OpenDialogMultipleN_With_Impl"))); - -nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath, - const nfdnchar_t* defaultName) { - nfdsavedialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - args.defaultName = defaultName; - return NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_SaveDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdsavedialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - 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), args->filterList, args->filterCount); - - /* Set the default path */ - SetDefaultPath(GTK_FILE_CHOOSER(widget), args->defaultPath); - - /* Set the default file name */ - SetDefaultName(GTK_FILE_CHOOSER(widget), args->defaultName); - - /* set the handler to add file extension */ - gulong handlerID = g_signal_connect(G_OBJECT(saveButton), - "pressed", - G_CALLBACK(FileActivatedSignalHandler), - static_cast(&buttonClickedArgs)); - - gint result; - { - /* Parent the window properly */ - NativeWindowParenter nativeWindowParenter(widget, args->parentWindow); - - /* invoke the dialog (blocks until dialog is closed) */ - 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_SaveDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath, - const nfdu8char_t* defaultName) - __attribute__((alias("NFD_SaveDialogN"))); - -nfdresult_t NFD_SaveDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args) - __attribute__((alias("NFD_SaveDialogN_With_Impl"))); - -nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_PickFolderN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - 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), args->defaultPath); - - gint result; - { - /* Parent the window properly */ - NativeWindowParenter nativeWindowParenter(widget, args->parentWindow); - - /* invoke the dialog (blocks until dialog is closed) */ - result = RunDialogWithFocus(GTK_DIALOG(widget)); - } - - 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_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_PickFolderN"))); - -nfdresult_t NFD_PickFolderU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args) - __attribute__((alias("NFD_PickFolderN_With_Impl"))); - -nfdresult_t NFD_PickFolderMultipleN(const nfdpathset_t** outPaths, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_PickFolderMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - GtkWidget* widget = gtk_file_chooser_dialog_new("Select Folders", - 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), args->defaultPath); - - gint result; - { - /* Parent the window properly */ - NativeWindowParenter nativeWindowParenter(widget, args->parentWindow); - - /* invoke the dialog (blocks until dialog is closed) */ - result = RunDialogWithFocus(GTK_DIALOG(widget)); - } - - if (result == 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_PickFolderMultipleU8(const nfdpathset_t** outPaths, const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_PickFolderMultipleN"))); - -nfdresult_t NFD_PickFolderMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args) - __attribute__((alias("NFD_PickFolderMultipleN_With_Impl"))); - -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; -} - -nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, - nfdpathsetsize_t index, - nfdu8char_t** outPath) - __attribute__((alias("NFD_PathSet_GetPathN"))); - -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_FreePathU8(const nfdu8char_t* filePath) - __attribute__((alias("NFD_PathSet_FreePathN"))); - -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; -} - -nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath) - __attribute__((alias("NFD_PathSet_EnumNextN"))); diff --git a/external/nfd/src/nfd_portal.cpp b/external/nfd/src/nfd_portal.cpp deleted file mode 100644 index 0ee222b2..00000000 --- a/external/nfd/src/nfd_portal.cpp +++ /dev/null @@ -1,1843 +0,0 @@ -/* - 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 -#include // for access() - -#if !defined(__has_include) || !defined(__linux__) -#include // for getrandom() - the random token string -#elif __has_include() -#include -#else // for GLIBC < 2.25 -#include -#define getrandom(buf, sz, flags) syscall(SYS_getrandom, buf, sz, flags) -#endif - -#include "nfd.h" - -/* -Define NFD_APPEND_EXTENSION if you want the file extension to be appended when missing. Linux -programs usually don't append the file extension, but for consistency with other OSes you might want -to append it. However, when using portals, the file overwrite prompt and the Flatpak sandbox won't -know that we appended an extension, so they will not check or whitelist the correct file. Enabling -NFD_APPEND_EXTENSION is not recommended for portals. -*/ - -/* -Define NFD_CASE_SENSITIVE_FILTER if you want file filters to be case-sensitive. The default -is case-insensitive. While Linux uses a case-sensitive filesystem and is designed for -case-sensitive file extensions, perhaps in the vast majority of cases users actually expect the file -filters to be case-insensitive. -*/ - -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 non D-Bus error */ -constexpr size_t OWNED_ERR_LEN = 1024; -char owned_err[OWNED_ERR_LEN]{}; -/* current error (may be a pointer to dbus_err.message, owned_err, 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; -} - -void NFDi_SetFormattedError(const char* format, ...) { - va_list args; - va_start(args, format); - vsnprintf(owned_err, OWNED_ERR_LEN, format, args); - va_end(args); - err_ptr = owned_err; -} - -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; -} - -template -T* reverse_copy(const T* begin, const T* end, T* out) { - while (begin != end) { - *out++ = *--end; - } - return out; -} - -#ifndef NFD_CASE_SENSITIVE_FILTER -nfdnchar_t* emit_case_insensitive_glob(const nfdnchar_t* begin, - const nfdnchar_t* end, - nfdnchar_t* out) { - // this code will only make regular Latin characters case-insensitive; other - // characters remain case sensitive - for (; begin != end; ++begin) { - if ((*begin >= 'A' && *begin <= 'Z') || (*begin >= 'a' && *begin <= 'z')) { - *out++ = '['; - *out++ = *begin; - // invert the case of the original character - *out++ = *begin ^ static_cast(0x20); - *out++ = ']'; - } else { - *out++ = *begin; - } - } - return out; -} -#endif - -// Returns true if ch is in [0-9A-Za-z], false otherwise. -bool IsHex(char ch) { - return ('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'F') || ('a' <= ch && ch <= 'f'); -} - -// Returns the hexadecimal value contained in the char. Precondition: IsHex(ch) -char ParseHexUnchecked(char ch) { - if ('0' <= ch && ch <= '9') return ch - '0'; - if ('A' <= ch && ch <= 'F') return ch - ('A' - 10); - if ('a' <= ch && ch <= 'f') return ch - ('a' - 10); -#if defined(__GNUC__) - __builtin_unreachable(); -#endif -} - -// Writes val as a hex string to out -char* FormatUIntToHexString(char* out, uintptr_t val) { - char tmp[sizeof(uintptr_t) * 2]; - char* tmp_end = tmp; - do { - const uintptr_t digit = val & 15u; - *tmp_end++ = digit < 10 ? '0' + digit : 'A' - 10 + digit; - val >>= 4; - } while (val != 0); - return reverse_copy(tmp, tmp_end, 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_SELECT_FOLDERS = "Select Folders"; -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 = "*"; -constexpr const char* DBUS_DESTINATION = "org.freedesktop.portal.Desktop"; -constexpr const char* DBUS_PATH = "/org/freedesktop/portal/desktop"; -constexpr const char* DBUS_FILECHOOSER_IFACE = "org.freedesktop.portal.FileChooser"; -constexpr const char* DBUS_REQUEST_IFACE = "org.freedesktop.portal.Request"; - -void AppendOpenFileQueryParentWindow(DBusMessageIter& iter, const nfdwindowhandle_t& parentWindow) { - switch (parentWindow.type) { - case NFD_WINDOW_HANDLE_TYPE_X11: { - constexpr size_t maxX11WindowStrLen = - 4 + sizeof(uintptr_t) * 2 + 1; // "x11:" + "" + "\0" - char serializedWindowBuf[maxX11WindowStrLen]; - char* serializedWindow = serializedWindowBuf; - const uintptr_t handle = reinterpret_cast(parentWindow.handle); - char* out = serializedWindowBuf; - *out++ = 'x'; - *out++ = '1'; - *out++ = '1'; - *out++ = ':'; - out = FormatUIntToHexString(out, handle); - *out = '\0'; - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &serializedWindow); - return; - } - default: { - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_EMPTY); - return; - } - } -} - -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); -} -template <> -void AppendOpenFileQueryTitle(DBusMessageIter& iter) { - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_SELECT_FOLDERS); -} - -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 == ',') { - ++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'); - { -#ifdef NFD_CASE_SENSITIVE_FILTER - 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); -#else - char* buf = static_cast(alloca(2 + (extn_end - extn_begin) * 4 + 1)); - char* buf_end = buf; - *buf_end++ = '*'; - *buf_end++ = '.'; - buf_end = emit_case_insensitive_glob(extn_begin, extn_end, buf_end); - *buf_end = '\0'; - dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &buf); -#endif - } - 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 == ',') { - ++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'); - { -#ifdef NFD_CASE_SENSITIVE_FILTER - 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); -#else - char* buf = static_cast(alloca(2 + (extn_end - extn_begin) * 4 + 1)); - char* buf_end = buf; - *buf_end++ = '*'; - *buf_end++ = '.'; - buf_end = emit_case_insensitive_glob(extn_begin, extn_end, buf_end); - *buf_end = '\0'; - dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &buf); -#endif - } - 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 AppendOpenFileQueryDictEntryCurrentFolder(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, - const nfdnchar_t* defaultPath, - const nfdwindowhandle_t& parentWindow) { - DBusMessageIter iter; - dbus_message_iter_init_append(query, &iter); - - AppendOpenFileQueryParentWindow(iter, parentWindow); - 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); - AppendOpenFileQueryDictEntryCurrentFolder(sub_iter, defaultPath); - 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, - const nfdwindowhandle_t& parentWindow) { - DBusMessageIter iter; - dbus_message_iter_init_append(query, &iter); - - AppendOpenFileQueryParentWindow(iter, parentWindow); - 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); - AppendOpenFileQueryDictEntryCurrentFolder(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_SetFormattedError( - "D-Bus file dialog interaction was ended abruptly with response code %u.", - resp_code); - 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 a string."); - return NFD_ERROR; - } - dbus_message_iter_get_basic(&uri_iter, &file); - return NFD_OKAY; -} - -#ifdef NFD_APPEND_EXTENSION -// 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) { - 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)) { - return NFD_OKAY; - } - if (dbus_message_iter_get_arg_type(¤t_filter_struct_iter) != - DBUS_TYPE_ARRAY) { - 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) { - 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) { - return NFD_OKAY; - } - dbus_uint32_t type; - dbus_message_iter_get_basic(¤t_filter_extn_iter, &type); - if (type != 0) { - return NFD_OKAY; - } - if (!dbus_message_iter_next(¤t_filter_extn_iter)) { - return NFD_OKAY; - } - if (dbus_message_iter_get_arg_type(¤t_filter_extn_iter) != DBUS_TYPE_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; - } -}; - -// Returns true if the given file URI is decodable (i.e. not malformed), and false otherwise. -// If this function returns true, then `out` will be populated with the length of the decoded URI -// and `fileUriEnd` will point to the trailing null byte of `fileUri`. Otherwise, `out` and -// `fileUriEnd` will be unmodified. -bool TryUriDecodeLen(const char* fileUri, size_t& out, const char*& fileUriEnd) { - size_t len = 0; - while (*fileUri) { - if (*fileUri != '%') { - ++fileUri; - } else { - if (*(fileUri + 1) == '\0' || *(fileUri + 2) == '\0') { - return false; - } - if (!IsHex(*(fileUri + 1)) || !IsHex(*(fileUri + 2))) { - return false; - } - fileUri += 3; - } - ++len; - } - out = len; - fileUriEnd = fileUri; - return true; -} - -// Decodes the given URI and writes it to `outPath`. The caller must ensure that the given URI is -// not malformed (typically with a prior call to `TryUriDecodeLen`). This function does not write -// any trailing null character. -char* UriDecodeUnchecked(const char* fileUri, const char* fileUriEnd, char* outPath) { - while (fileUri != fileUriEnd) { - if (*fileUri != '%') { - *outPath++ = *fileUri++; - } else { - ++fileUri; - const char high_nibble = ParseHexUnchecked(*fileUri++); - const char low_nibble = ParseHexUnchecked(*fileUri++); - *outPath++ = (high_nibble << 4) | low_nibble; - } - } - return outPath; -} - -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 URI-decodes the remaining part 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* file_uri_iter = fileUri; - 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, ++file_uri_iter) { - if (*prefix_begin != *file_uri_iter) { - NFDi_SetFormattedError( - "D-Bus freedesktop portal returned \"%s\", which is not a file URI.", fileUri); - return NFD_ERROR; - } - } - size_t decoded_len; - const char* file_uri_end; - if (!TryUriDecodeLen(file_uri_iter, decoded_len, file_uri_end)) { - NFDi_SetFormattedError("D-Bus freedesktop portal returned a malformed URI \"%s\".", - fileUri); - return NFD_ERROR; - } - char* const path_without_prefix = NFDi_Malloc(decoded_len + 1); - char* const out_end = UriDecodeUnchecked(file_uri_iter, file_uri_end, path_without_prefix); - *out_end = '\0'; - outPath = path_without_prefix; - return NFD_OKAY; -} - -#ifdef NFD_APPEND_EXTENSION -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* file_uri_iter = fileUri; - 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, ++file_uri_iter) { - if (*prefix_begin != *file_uri_iter) { - NFDi_SetFormattedError( - "D-Bus freedesktop portal returned \"%s\", which is not a file URI.", fileUri); - return NFD_ERROR; - } - } - - size_t decoded_len; - const char* file_uri_end; - if (!TryUriDecodeLen(file_uri_iter, decoded_len, file_uri_end)) { - NFDi_SetFormattedError("D-Bus freedesktop portal returned a malformed URI \"%s\".", - fileUri); - return NFD_ERROR; - } - - const char* file_it = file_uri_end; - // The following loop condition is safe because `FILE_URI_PREFIX` ends with '/', - // so we won't iterate past the beginning of the URI. - // Also in UTF-8 all non-ASCII code points are encoded using bytes 128-255 so every '.' or '/' - // is also '.' or '/' in UTF-8. - 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` - char* const path_without_prefix = NFDi_Malloc(decoded_len + 1); - char* const out_end = UriDecodeUnchecked(file_uri_iter, file_uri_end, path_without_prefix); - *out_end = '\0'; - outPath = path_without_prefix; - } else { - // no file extension and we have a valid extension - char* const path_without_prefix = - NFDi_Malloc(decoded_len + (trimmed_extn_end - trimmed_extn)); - char* const out_mid = UriDecodeUnchecked(file_uri_iter, file_uri_end, path_without_prefix); - char* const out_end = copy(trimmed_extn, trimmed_extn_end, out_mid); - *out_end = '\0'; - 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 nfdnchar_t* defaultPath, - const nfdwindowhandle_t& parentWindow) { - 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( - DBUS_DESTINATION, DBUS_PATH, DBUS_FILECHOOSER_IFACE, "OpenFile"); - DBusMessage_Guard query_guard(query); - AppendOpenFileQueryParams( - query, handle_token_ptr, filterList, filterCount, defaultPath, parentWindow); - - 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, DBUS_REQUEST_IFACE, "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 nfdwindowhandle_t& parentWindow) { - 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( - DBUS_DESTINATION, DBUS_PATH, DBUS_FILECHOOSER_IFACE, "SaveFile"); - DBusMessage_Guard query_guard(query); - AppendSaveFileQueryParams( - query, handle_token_ptr, filterList, filterCount, defaultPath, defaultName, parentWindow); - - 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, DBUS_REQUEST_IFACE, "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; -} - -nfdresult_t NFD_DBus_GetVersion(dbus_uint32_t& outVersion) { - 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); - - DBusMessage* query = dbus_message_new_method_call("org.freedesktop.portal.Desktop", - "/org/freedesktop/portal/desktop", - "org.freedesktop.DBus.Properties", - "Get"); - DBusMessage_Guard query_guard(query); - { - DBusMessageIter iter; - dbus_message_iter_init_append(query, &iter); - - constexpr const char* STR_INTERFACE = "org.freedesktop.portal.FileChooser"; - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_INTERFACE); - constexpr const char* STR_VERSION = "version"; - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &STR_VERSION); - } - - 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); - { - DBusMessageIter iter; - if (!dbus_message_iter_init(reply, &iter)) { - NFDi_SetError("D-Bus reply for version query is missing an argument."); - return NFD_ERROR; - } - if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) { - NFDi_SetError("D-Bus reply for version query is not a variant."); - return NFD_ERROR; - } - DBusMessageIter variant_iter; - dbus_message_iter_recurse(&iter, &variant_iter); - if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_UINT32) { - NFDi_SetError("D-Bus reply for version query is not a uint32."); - return NFD_ERROR; - } - dbus_message_iter_get_basic(&variant_iter, &outVersion); - } - - return NFD_OKAY; -} - -} // 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_err - 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); -} - -void NFD_FreePathU8(nfdu8char_t* filePath) __attribute__((alias("NFD_FreePathN"))); - -nfdresult_t NFD_OpenDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - DBusMessage* msg; - { - const nfdresult_t res = NFD_DBus_OpenFile( - msg, args->filterList, args->filterCount, args->defaultPath, args->parentWindow); - if (res != NFD_OKAY) { - return res; - } - } - DBusMessage_Guard msg_guard(msg); - - const char* uri; - { - const nfdresult_t res = ReadResponseUrisSingle(msg, uri); - if (res != NFD_OKAY) { - return res; - } - } - - return AllocAndCopyFilePath(uri, *outPath); -} - -nfdresult_t NFD_OpenDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_OpenDialogN"))); - -nfdresult_t NFD_OpenDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdopendialogu8args_t* args) - __attribute__((alias("NFD_OpenDialogN_With_Impl"))); - -nfdresult_t NFD_OpenDialogMultipleN(const nfdpathset_t** outPaths, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_OpenDialogMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - DBusMessage* msg; - { - const nfdresult_t res = NFD_DBus_OpenFile( - msg, args->filterList, args->filterCount, args->defaultPath, args->parentWindow); - 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_OpenDialogMultipleU8(const nfdpathset_t** outPaths, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_OpenDialogMultipleN"))); - -nfdresult_t NFD_OpenDialogMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args) - __attribute__((alias("NFD_OpenDialogMultipleN_With_Impl"))); - -nfdresult_t NFD_SaveDialogN(nfdnchar_t** outPath, - const nfdnfilteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdnchar_t* defaultPath, - const nfdnchar_t* defaultName) { - nfdsavedialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - args.defaultName = defaultName; - return NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_SaveDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdsavedialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - DBusMessage* msg; - { - const nfdresult_t res = NFD_DBus_SaveFile(msg, - args->filterList, - args->filterCount, - args->defaultPath, - args->defaultName, - args->parentWindow); - if (res != NFD_OKAY) { - return res; - } - } - DBusMessage_Guard msg_guard(msg); - -#ifdef NFD_APPEND_EXTENSION - const char* uri; - const char* extn; - { - const nfdresult_t res = ReadResponseUrisSingleAndCurrentExtension(msg, uri, extn); - if (res != NFD_OKAY) { - return res; - } - } - - return AllocAndCopyFilePathWithExtn(uri, extn, *outPath); -#else - const char* uri; - { - const nfdresult_t res = ReadResponseUrisSingle(msg, uri); - if (res != NFD_OKAY) { - return res; - } - } - - return AllocAndCopyFilePath(uri, *outPath); -#endif -} - -nfdresult_t NFD_SaveDialogU8(nfdu8char_t** outPath, - const nfdu8filteritem_t* filterList, - nfdfiltersize_t filterCount, - const nfdu8char_t* defaultPath, - const nfdu8char_t* defaultName) - __attribute__((alias("NFD_SaveDialogN"))); - -nfdresult_t NFD_SaveDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args) - __attribute__((alias("NFD_SaveDialogN_With_Impl"))); - -nfdresult_t NFD_PickFolderN(nfdnchar_t** outPath, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_PickFolderN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - { - dbus_uint32_t portal_version; - const nfdresult_t res = NFD_DBus_GetVersion(portal_version); - if (res != NFD_OKAY) { - return res; - } - if (portal_version < 3) { - NFDi_SetFormattedError( - "The xdg-desktop-portal installed on this system does not support a folder picker; " - "at least version 3 of the org.freedesktop.portal.FileChooser interface is " - "required but the installed interface version is %u.", - portal_version); - return NFD_ERROR; - } - } - - DBusMessage* msg; - { - const nfdresult_t res = - NFD_DBus_OpenFile(msg, nullptr, 0, args->defaultPath, args->parentWindow); - if (res != NFD_OKAY) { - return res; - } - } - DBusMessage_Guard msg_guard(msg); - - const char* uri; - { - const nfdresult_t res = ReadResponseUrisSingle(msg, uri); - if (res != NFD_OKAY) { - return res; - } - } - - return AllocAndCopyFilePath(uri, *outPath); -} - -nfdresult_t NFD_PickFolderU8(nfdu8char_t** outPath, const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_PickFolderN"))); - -nfdresult_t NFD_PickFolderU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args) - __attribute__((alias("NFD_PickFolderN_With_Impl"))); - -nfdresult_t NFD_PickFolderMultipleN(const nfdpathset_t** outPaths, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_PickFolderMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - { - dbus_uint32_t portal_version; - const nfdresult_t res = NFD_DBus_GetVersion(portal_version); - if (res != NFD_OKAY) { - return res; - } - if (portal_version < 3) { - NFDi_SetFormattedError( - "The xdg-desktop-portal installed on this system does not support a folder picker; " - "at least version 3 of the org.freedesktop.portal.FileChooser interface is " - "required but the installed interface version is %u.", - portal_version); - return NFD_ERROR; - } - } - - DBusMessage* msg; - { - const nfdresult_t res = - NFD_DBus_OpenFile(msg, nullptr, 0, args->defaultPath, args->parentWindow); - 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_PickFolderMultipleU8(const nfdpathset_t** outPaths, const nfdu8char_t* defaultPath) - __attribute__((alias("NFD_PickFolderMultipleN"))); - -nfdresult_t NFD_PickFolderMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args) - __attribute__((alias("NFD_PickFolderMultipleN_With_Impl"))); - -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); - nfdpathsetsize_t rem_index = index; - while (rem_index > 0) { - --rem_index; - if (!dbus_message_iter_next(&uri_iter)) { - NFDi_SetFormattedError( - "Index out of bounds; you asked for index %u but there are only %u file paths " - "available.", - index, - index - rem_index); - 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 a string."); - return NFD_ERROR; - } - const char* uri; - dbus_message_iter_get_basic(&uri_iter, &uri); - return AllocAndCopyFilePath(uri, *outPath); -} - -nfdresult_t NFD_PathSet_GetPathU8(const nfdpathset_t* pathSet, - nfdpathsetsize_t index, - nfdu8char_t** outPath) - __attribute__((alias("NFD_PathSet_GetPathN"))); - -void NFD_PathSet_FreePathN(const nfdnchar_t* filePath) { - assert(filePath); - NFD_FreePathN(const_cast(filePath)); -} - -void NFD_PathSet_FreePathU8(const nfdu8char_t* filePath) - __attribute__((alias("NFD_PathSet_FreePathN"))); - -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 a string."); - return NFD_ERROR; - } - const char* uri; - dbus_message_iter_get_basic(&uri_iter, &uri); - const nfdresult_t res = AllocAndCopyFilePath(uri, *outPath); - if (res != NFD_OKAY) return res; - dbus_message_iter_next(&uri_iter); - return NFD_OKAY; -} - -nfdresult_t NFD_PathSet_EnumNextU8(nfdpathsetenum_t* enumerator, nfdu8char_t** outPath) - __attribute__((alias("NFD_PathSet_EnumNextN"))); diff --git a/external/nfd/src/nfd_win.cpp b/external/nfd/src/nfd_win.cpp deleted file mode 100644 index 0170b02a..00000000 --- a/external/nfd/src/nfd_win.cpp +++ /dev/null @@ -1,1185 +0,0 @@ -/* - 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); - -#ifdef NFD_OVERRIDE_RECENT_WITH_DEFAULT - // Use SetFolder() if you always want to use the default folder - if (!SUCCEEDED(dialog->SetFolder(folder))) { - NFDi_SetError("Failed to set default path."); - return NFD_ERROR; - } -#else - // 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). - if (!SUCCEEDED(dialog->SetDefaultFolder(folder))) { - NFDi_SetError("Failed to set default path."); - return NFD_ERROR; - } -#endif - - 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; -} - -HWND GetNativeWindowHandle(const nfdwindowhandle_t& parentWindow) { - if (parentWindow.type != NFD_WINDOW_HANDLE_TYPE_WINDOWS) { - return nullptr; - } - return static_cast(parentWindow.handle); -} -} // 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) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_OpenDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - ::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, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set auto-completed default extension - if (!SetDefaultExtension(fileOpenDialog, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set the default path - if (!SetDefaultPath(fileOpenDialog, args->defaultPath)) { - return NFD_ERROR; - } - - // Only show file system items - if (!AddOptions(fileOpenDialog, ::FOS_FORCEFILESYSTEM)) { - return NFD_ERROR; - } - - // Show the dialog. - result = fileOpenDialog->Show(GetNativeWindowHandle(args->parentWindow)); - 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) { - nfdopendialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_OpenDialogMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - ::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, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set auto-completed default extension - if (!SetDefaultExtension(fileOpenDialog, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set the default path - if (!SetDefaultPath(fileOpenDialog, args->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(GetNativeWindowHandle(args->parentWindow)); - 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) { - nfdsavedialognargs_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - args.defaultName = defaultName; - return NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_SaveDialogN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdsavedialognargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - ::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, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set default extension - if (!SetDefaultExtension(fileSaveDialog, args->filterList, args->filterCount)) { - return NFD_ERROR; - } - - // Set the default path - if (!SetDefaultPath(fileSaveDialog, args->defaultPath)) { - return NFD_ERROR; - } - - // Set the default name - if (!SetDefaultName(fileSaveDialog, args->defaultName)) { - return NFD_ERROR; - } - - // Only show file system items - if (!AddOptions(fileSaveDialog, ::FOS_FORCEFILESYSTEM)) { - return NFD_ERROR; - } - - // Show the dialog. - result = fileSaveDialog->Show(GetNativeWindowHandle(args->parentWindow)); - 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) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_PickFolderN_With_Impl(nfdversion_t version, - nfdnchar_t** outPath, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - ::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, args->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(GetNativeWindowHandle(args->parentWindow)); - 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_PickFolderMultipleN(const nfdpathset_t** outPaths, const nfdnchar_t* defaultPath) { - nfdpickfoldernargs_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_PickFolderMultipleN_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfoldernargs_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - ::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, args->defaultPath)) { - return NFD_ERROR; - } - - // Allow multiple selection; only show items that are folders and on the file system - if (!AddOptions(fileOpenDialog, - ::FOS_FORCEFILESYSTEM | ::FOS_PICKFOLDERS | ::FOS_ALLOWMULTISELECT)) { - return NFD_ERROR; - } - - // Show the dialog. - const HRESULT result = fileOpenDialog->Show(GetNativeWindowHandle(args->parentWindow)); - if (SUCCEEDED(result)) { - ::IShellItemArray* shellItems; - if (!SUCCEEDED(fileOpenDialog->GetResults(&shellItems))) { - 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_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; -} - -void NFD_PathSet_FreePathN(const nfdnchar_t* filePath) { - NFD_FreePathN(const_cast(filePath)); -} - -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 filterCount, - const nfdu8char_t* defaultPath) { - nfdopendialogu8args_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogU8_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_OpenDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdopendialogu8args_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - // populate the real nfdnfilteritem_t - FilterItem_Guard filterItemsNGuard; - if (!CopyFilterItem(args->filterList, args->filterCount, filterItemsNGuard)) { - return NFD_ERROR; - } - - // convert and normalize the default path, but only if it is not nullptr - FreeCheck_Guard defaultPathNGuard; - ConvertU8ToNative(args->defaultPath, defaultPathNGuard); - NormalizePathSeparator(defaultPathNGuard.data); - - // call the native function - nfdnchar_t* outPathN; - const nfdopendialognargs_t argsN{ - filterItemsNGuard.data, args->filterCount, defaultPathNGuard.data, args->parentWindow}; - nfdresult_t res = NFD_OpenDialogN_With_Impl(NFD_INTERFACE_VERSION, &outPathN, &argsN); - - 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 filterCount, - const nfdu8char_t* defaultPath) { - nfdopendialogu8args_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - return NFD_OpenDialogMultipleU8_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_OpenDialogMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdopendialogu8args_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - // populate the real nfdnfilteritem_t - FilterItem_Guard filterItemsNGuard; - if (!CopyFilterItem(args->filterList, args->filterCount, filterItemsNGuard)) { - return NFD_ERROR; - } - - // convert and normalize the default path, but only if it is not nullptr - FreeCheck_Guard defaultPathNGuard; - ConvertU8ToNative(args->defaultPath, defaultPathNGuard); - NormalizePathSeparator(defaultPathNGuard.data); - - // call the native function - const nfdopendialognargs_t argsN{ - filterItemsNGuard.data, args->filterCount, defaultPathNGuard.data, args->parentWindow}; - return NFD_OpenDialogMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &argsN); -} - -/* 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 filterCount, - const nfdu8char_t* defaultPath, - const nfdu8char_t* defaultName) { - nfdsavedialogu8args_t args{}; - args.filterList = filterList; - args.filterCount = filterCount; - args.defaultPath = defaultPath; - args.defaultName = defaultName; - return NFD_SaveDialogU8_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_SaveDialogU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdsavedialogu8args_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - // populate the real nfdnfilteritem_t - FilterItem_Guard filterItemsNGuard; - if (!CopyFilterItem(args->filterList, args->filterCount, filterItemsNGuard)) { - return NFD_ERROR; - } - - // convert and normalize the default path, but only if it is not nullptr - FreeCheck_Guard defaultPathNGuard; - ConvertU8ToNative(args->defaultPath, defaultPathNGuard); - NormalizePathSeparator(defaultPathNGuard.data); - - // convert the default name, but only if it is not nullptr - FreeCheck_Guard defaultNameNGuard; - ConvertU8ToNative(args->defaultName, defaultNameNGuard); - - // call the native function - nfdnchar_t* outPathN; - const nfdsavedialognargs_t argsN{filterItemsNGuard.data, - args->filterCount, - defaultPathNGuard.data, - defaultNameNGuard.data, - args->parentWindow}; - nfdresult_t res = NFD_SaveDialogN_With_Impl(NFD_INTERFACE_VERSION, &outPathN, &argsN); - - 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) { - nfdpickfolderu8args_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderU8_With_Impl(NFD_INTERFACE_VERSION, outPath, &args); -} - -nfdresult_t NFD_PickFolderU8_With_Impl(nfdversion_t version, - nfdu8char_t** outPath, - const nfdpickfolderu8args_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - // convert and normalize the default path, but only if it is not nullptr - FreeCheck_Guard defaultPathNGuard; - ConvertU8ToNative(args->defaultPath, defaultPathNGuard); - NormalizePathSeparator(defaultPathNGuard.data); - - // call the native function - nfdnchar_t* outPathN; - const nfdpickfoldernargs_t argsN{defaultPathNGuard.data, args->parentWindow}; - nfdresult_t res = NFD_PickFolderN_With_Impl(NFD_INTERFACE_VERSION, &outPathN, &argsN); - - 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 multiple folders dialog */ -/* It is the caller's responsibility to free `outPaths` via NFD_PathSet_FreeU8() if this function - * returns NFD_OKAY. */ -nfdresult_t NFD_PickFolderMultipleU8(const nfdpathset_t** outPaths, - const nfdu8char_t* defaultPath) { - nfdpickfolderu8args_t args{}; - args.defaultPath = defaultPath; - return NFD_PickFolderMultipleU8_With_Impl(NFD_INTERFACE_VERSION, outPaths, &args); -} - -nfdresult_t NFD_PickFolderMultipleU8_With_Impl(nfdversion_t version, - const nfdpathset_t** outPaths, - const nfdpickfolderu8args_t* args) { - // We haven't needed to bump the interface version yet. - (void)version; - - // convert and normalize the default path, but only if it is not nullptr - FreeCheck_Guard defaultPathNGuard; - ConvertU8ToNative(args->defaultPath, defaultPathNGuard); - NormalizePathSeparator(defaultPathNGuard.data); - - // call the native function - const nfdpickfoldernargs_t argsN{defaultPathNGuard.data, args->parentWindow}; - return NFD_PickFolderMultipleN_With_Impl(NFD_INTERFACE_VERSION, outPaths, &argsN); -} - -/* 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; -} - -void NFD_PathSet_FreePathU8(const nfdu8char_t* filePath) { - NFD_FreePathU8(const_cast(filePath)); -} - -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/external/nfd/test/CMakeLists.txt b/external/nfd/test/CMakeLists.txt deleted file mode 100644 index 59d66816..00000000 --- a/external/nfd/test/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -if(${NFD_BUILD_TESTS}) - set(TEST_LIST - test_opendialog.c - test_opendialog_cpp.cpp - test_opendialog_native.c - test_opendialog_with.c - test_opendialog_native_with.c - test_opendialogmultiple.c - test_opendialogmultiple_cpp.cpp - test_opendialogmultiple_native.c - test_opendialogmultiple_enum.c - test_opendialogmultiple_enum_native.c - test_pickfolder.c - test_pickfolder_cpp.cpp - test_pickfolder_native.c - test_pickfolder_with.c - test_pickfolder_native_with.c - test_pickfoldermultiple.c - test_pickfoldermultiple_native.c - test_savedialog.c - test_savedialog_native.c - test_savedialog_with.c - test_savedialog_native_with.c) - - foreach (TEST ${TEST_LIST}) - string(REPLACE "." "_" CLEAN_TEST_NAME ${TEST}) - add_executable(${CLEAN_TEST_NAME} - ${TEST}) - target_link_libraries(${CLEAN_TEST_NAME} - PRIVATE nfd) - endforeach() -endif() - -if(${NFD_BUILD_SDL2_TESTS}) - find_package(PkgConfig REQUIRED) - pkg_check_modules(SDL2 REQUIRED sdl2 SDL2_ttf) - if(WIN32) - add_executable(test_sdl2 WIN32 test_sdl.c test_sdl.manifest) - else() - add_executable(test_sdl2 test_sdl.c) - endif() - target_link_libraries(test_sdl2 PRIVATE nfd) - target_include_directories(test_sdl2 PRIVATE ${SDL2_INCLUDE_DIRS}) - target_link_libraries(test_sdl2 PRIVATE ${SDL2_LINK_LIBRARIES}) - target_compile_options(test_sdl2 PUBLIC ${SDL2_CFLAGS_OTHER}) -endif() diff --git a/external/nfd/test/test_opendialog.c b/external/nfd/test/test_opendialog.c deleted file mode 100644 index 412d0196..00000000 --- a/external/nfd/test/test_opendialog.c +++ /dev/null @@ -1,36 +0,0 @@ -#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/external/nfd/test/test_opendialog_cpp.cpp b/external/nfd/test/test_opendialog_cpp.cpp deleted file mode 100644 index 089e97a6..00000000 --- a/external/nfd/test/test_opendialog_cpp.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#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/external/nfd/test/test_opendialog_native.c b/external/nfd/test/test_opendialog_native.c deleted file mode 100644 index e600b734..00000000 --- a/external/nfd/test/test_opendialog_native.c +++ /dev/null @@ -1,49 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - - // show the dialog - nfdresult_t result = NFD_OpenDialog(&outPath, filterItem, 2, NULL); - if (result == NFD_OKAY) { - puts("Success!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(outPath); -#else - fputws(outPath, stdin); -#endif -#else - puts(outPath); -#endif - // 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/external/nfd/test/test_opendialog_native_with.c b/external/nfd/test/test_opendialog_native_with.c deleted file mode 100644 index cb961906..00000000 --- a/external/nfd/test/test_opendialog_native_with.c +++ /dev/null @@ -1,52 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - - // show the dialog - nfdopendialognargs_t args = {0}; - args.filterList = filterItem; - args.filterCount = 2; - nfdresult_t result = NFD_OpenDialogN_With(&outPath, &args); - if (result == NFD_OKAY) { - puts("Success!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(outPath); -#else - fputws(outPath, stdin); -#endif -#else - puts(outPath); -#endif - // 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/external/nfd/test/test_opendialog_with.c b/external/nfd/test/test_opendialog_with.c deleted file mode 100644 index f8e0ada6..00000000 --- a/external/nfd/test/test_opendialog_with.c +++ /dev/null @@ -1,39 +0,0 @@ -#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 - nfdopendialogu8args_t args = {0}; - args.filterList = filterItem; - args.filterCount = 2; - nfdresult_t result = NFD_OpenDialogU8_With(&outPath, &args); - 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/external/nfd/test/test_opendialogmultiple.c b/external/nfd/test/test_opendialogmultiple.c deleted file mode 100644 index 6b1d1898..00000000 --- a/external/nfd/test/test_opendialogmultiple.c +++ /dev/null @@ -1,50 +0,0 @@ -#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/external/nfd/test/test_opendialogmultiple_cpp.cpp b/external/nfd/test/test_opendialogmultiple_cpp.cpp deleted file mode 100644 index 09edb746..00000000 --- a/external/nfd/test/test_opendialogmultiple_cpp.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#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/external/nfd/test/test_opendialogmultiple_enum.c b/external/nfd/test/test_opendialogmultiple_enum.c deleted file mode 100644 index 827029c1..00000000 --- a/external/nfd/test/test_opendialogmultiple_enum.c +++ /dev/null @@ -1,53 +0,0 @@ -#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/external/nfd/test/test_opendialogmultiple_enum_native.c b/external/nfd/test/test_opendialogmultiple_enum_native.c deleted file mode 100644 index 01802bcb..00000000 --- a/external/nfd/test/test_opendialogmultiple_enum_native.c +++ /dev/null @@ -1,62 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - - // 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) { -#ifdef _WIN32 - wprintf(L"Path %u: %s\n", i++, path); -#else - printf("Path %u: %s\n", i++, path); -#endif - - // 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/external/nfd/test/test_opendialogmultiple_native.c b/external/nfd/test/test_opendialogmultiple_native.c deleted file mode 100644 index b52ba270..00000000 --- a/external/nfd/test/test_opendialogmultiple_native.c +++ /dev/null @@ -1,59 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - - // 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); -#ifdef _WIN32 - wprintf(L"Path %i: %s\n", (int)i, path); -#else - printf("Path %i: %s\n", (int)i, path); -#endif - - // 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/external/nfd/test/test_pickfolder.c b/external/nfd/test/test_pickfolder.c deleted file mode 100644 index 12df1995..00000000 --- a/external/nfd/test/test_pickfolder.c +++ /dev/null @@ -1,33 +0,0 @@ -#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/external/nfd/test/test_pickfolder_cpp.cpp b/external/nfd/test/test_pickfolder_cpp.cpp deleted file mode 100644 index 747f3506..00000000 --- a/external/nfd/test/test_pickfolder_cpp.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#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/external/nfd/test/test_pickfolder_native.c b/external/nfd/test/test_pickfolder_native.c deleted file mode 100644 index e311acc5..00000000 --- a/external/nfd/test/test_pickfolder_native.c +++ /dev/null @@ -1,42 +0,0 @@ -#define NFD_NATIVE -#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!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(outPath); -#else - fputws(outPath, stdin); -#endif -#else - puts(outPath); -#endif - // 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/external/nfd/test/test_pickfolder_native_with.c b/external/nfd/test/test_pickfolder_native_with.c deleted file mode 100644 index c89502e3..00000000 --- a/external/nfd/test/test_pickfolder_native_with.c +++ /dev/null @@ -1,43 +0,0 @@ -#define NFD_NATIVE -#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 - nfdpickfoldernargs_t args = {0}; - nfdresult_t result = NFD_PickFolderN_With(&outPath, &args); - if (result == NFD_OKAY) { - puts("Success!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(outPath); -#else - fputws(outPath, stdin); -#endif -#else - puts(outPath); -#endif - // 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/external/nfd/test/test_pickfolder_with.c b/external/nfd/test/test_pickfolder_with.c deleted file mode 100644 index f6e864bf..00000000 --- a/external/nfd/test/test_pickfolder_with.c +++ /dev/null @@ -1,34 +0,0 @@ -#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 - nfdpickfolderu8args_t args = {0}; - nfdresult_t result = NFD_PickFolderU8_With(&outPath, &args); - 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/external/nfd/test/test_pickfoldermultiple.c b/external/nfd/test/test_pickfoldermultiple.c deleted file mode 100644 index 23ad4dbc..00000000 --- a/external/nfd/test/test_pickfoldermultiple.c +++ /dev/null @@ -1,47 +0,0 @@ -#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; - - // show the dialog - nfdresult_t result = NFD_PickFolderMultiple(&outPaths, 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/external/nfd/test/test_pickfoldermultiple_native.c b/external/nfd/test/test_pickfoldermultiple_native.c deleted file mode 100644 index 93c14494..00000000 --- a/external/nfd/test/test_pickfoldermultiple_native.c +++ /dev/null @@ -1,52 +0,0 @@ -#define NFD_NATIVE -#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; - - // show the dialog - nfdresult_t result = NFD_PickFolderMultiple(&outPaths, 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); -#ifdef _WIN32 - wprintf(L"Path %i: %s\n", (int)i, path); -#else - printf("Path %i: %s\n", (int)i, path); -#endif - - // 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/external/nfd/test/test_savedialog.c b/external/nfd/test/test_savedialog.c deleted file mode 100644 index 42ff5950..00000000 --- a/external/nfd/test/test_savedialog.c +++ /dev/null @@ -1,36 +0,0 @@ -#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; -} diff --git a/external/nfd/test/test_savedialog_native.c b/external/nfd/test/test_savedialog_native.c deleted file mode 100644 index d1ee09d6..00000000 --- a/external/nfd/test/test_savedialog_native.c +++ /dev/null @@ -1,55 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - -#ifdef _WIN32 - const wchar_t* defaultPath = L"Untitled.c"; -#else - const char* defaultPath = "Untitled.c"; -#endif - - // show the dialog - nfdresult_t result = NFD_SaveDialog(&savePath, filterItem, 2, NULL, defaultPath); - if (result == NFD_OKAY) { - puts("Success!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(savePath); -#else - fputws(savePath, stdin); -#endif -#else - puts(savePath); -#endif - // 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; -} diff --git a/external/nfd/test/test_savedialog_native_with.c b/external/nfd/test/test_savedialog_native_with.c deleted file mode 100644 index 8a86f541..00000000 --- a/external/nfd/test/test_savedialog_native_with.c +++ /dev/null @@ -1,59 +0,0 @@ -#define NFD_NATIVE -#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 -#ifdef _WIN32 - nfdfilteritem_t filterItem[2] = {{L"Source code", L"c,cpp,cc"}, {L"Headers", L"h,hpp"}}; -#else - nfdfilteritem_t filterItem[2] = {{"Source code", "c,cpp,cc"}, {"Headers", "h,hpp"}}; -#endif - -#ifdef _WIN32 - const wchar_t* defaultPath = L"Untitled.c"; -#else - const char* defaultPath = "Untitled.c"; -#endif - - // show the dialog - nfdsavedialognargs_t args = {0}; - args.filterList = filterItem; - args.filterCount = 2; - args.defaultName = defaultPath; - nfdresult_t result = NFD_SaveDialogN_With(&savePath, &args); - if (result == NFD_OKAY) { - puts("Success!"); -#ifdef _WIN32 -#ifdef _MSC_VER - _putws(savePath); -#else - fputws(savePath, stdin); -#endif -#else - puts(savePath); -#endif - // 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; -} diff --git a/external/nfd/test/test_savedialog_with.c b/external/nfd/test/test_savedialog_with.c deleted file mode 100644 index add5eb26..00000000 --- a/external/nfd/test/test_savedialog_with.c +++ /dev/null @@ -1,40 +0,0 @@ -#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 - nfdsavedialogu8args_t args = {0}; - args.filterList = filterItem; - args.filterCount = 2; - args.defaultName = "Untitled.c"; - nfdresult_t result = NFD_SaveDialogU8_With(&savePath, &args); - 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; -} diff --git a/external/nfd/test/test_sdl.c b/external/nfd/test/test_sdl.c deleted file mode 100644 index bc4ef8de..00000000 --- a/external/nfd/test/test_sdl.c +++ /dev/null @@ -1,414 +0,0 @@ -#define SDL_MAIN_HANDLED -#include -#include -#include -#include -#include -#include -#include - -// Small program meant to demonstrate and test nfd_sdl2.h with SDL2. Note that it quits immediately -// when it encounters an error, without calling the opposite destroy/quit function. A real-world -// application should call destroy/quit appropriately. - -void show_error(const char* message, SDL_Window* window) { - if (SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", message, window) != 0) { - printf("SDL_ShowSimpleMessageBox failed: %s\n", SDL_GetError()); - return; - } -} - -void show_path(const char* path, SDL_Window* window) { - if (SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Success", path, window) != 0) { - printf("SDL_ShowSimpleMessageBox failed: %s\n", SDL_GetError()); - return; - } -} - -void show_paths(const nfdpathset_t* paths, SDL_Window* window) { - size_t num_chars = 0; - - nfdpathsetsize_t num_paths; - if (NFD_PathSet_GetCount(paths, &num_paths) != NFD_OKAY) { - printf("NFD_PathSet_GetCount failed: %s\n", NFD_GetError()); - return; - } - - nfdpathsetsize_t i; - for (i = 0; i != num_paths; ++i) { - char* path; - if (NFD_PathSet_GetPathU8(paths, i, &path) != NFD_OKAY) { - printf("NFD_PathSet_GetPathU8 failed: %s\n", NFD_GetError()); - return; - } - num_chars += strlen(path) + 1; - NFD_PathSet_FreePathU8(path); - } - - // We should never return NFD_OKAY with zero paths, but GCC doesn't know this and will emit a - // warning that we're trying to malloc with size zero if we write the following line. - if (!num_paths) num_chars = 1; - - char* message = malloc(num_chars); - message[0] = '\0'; - - for (i = 0; i != num_paths; ++i) { - if (i != 0) { - strcat(message, "\n"); - } - char* path; - if (NFD_PathSet_GetPathU8(paths, i, &path) != NFD_OKAY) { - printf("NFD_PathSet_GetPathU8 failed: %s\n", NFD_GetError()); - free(message); - return; - } - strcat(message, path); - NFD_PathSet_FreePathU8(path); - } - - if (SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Success", message, window) != 0) { - printf("SDL_ShowSimpleMessageBox failed: %s\n", SDL_GetError()); - free(message); - return; - } - - free(message); -} - -void set_native_window(SDL_Window* sdlWindow, nfdwindowhandle_t* nativeWindow) { - if (!NFD_GetNativeWindowFromSDLWindow(sdlWindow, nativeWindow)) { - printf("NFD_GetNativeWindowFromSDLWindow failed: %s\n", SDL_GetError()); - } -} - -void opendialog_handler(SDL_Window* window) { - char* path; - nfdopendialogu8args_t args = {0}; - set_native_window(window, &args.parentWindow); - const nfdresult_t res = NFD_OpenDialogU8_With(&path, &args); - switch (res) { - case NFD_OKAY: - show_path(path, window); - NFD_FreePathU8(path); - break; - case NFD_ERROR: - show_error(NFD_GetError(), window); - break; - default: - break; - } -} - -void opendialogmultiple_handler(SDL_Window* window) { - const nfdpathset_t* paths; - nfdopendialogu8args_t args = {0}; - set_native_window(window, &args.parentWindow); - const nfdresult_t res = NFD_OpenDialogMultipleU8_With(&paths, &args); - switch (res) { - case NFD_OKAY: - show_paths(paths, window); - NFD_PathSet_Free(paths); - break; - case NFD_ERROR: - show_error(NFD_GetError(), window); - break; - default: - break; - } -} - -void savedialog_handler(SDL_Window* window) { - char* path; - nfdsavedialogu8args_t args = {0}; - set_native_window(window, &args.parentWindow); - const nfdresult_t res = NFD_SaveDialogU8_With(&path, &args); - switch (res) { - case NFD_OKAY: - show_path(path, window); - NFD_FreePathU8(path); - break; - case NFD_ERROR: - show_error(NFD_GetError(), window); - break; - default: - break; - } -} - -void pickfolder_handler(SDL_Window* window) { - char* path; - nfdpickfolderu8args_t args = {0}; - set_native_window(window, &args.parentWindow); - const nfdresult_t res = NFD_PickFolderU8_With(&path, &args); - switch (res) { - case NFD_OKAY: - show_path(path, window); - NFD_FreePathU8(path); - break; - case NFD_ERROR: - show_error(NFD_GetError(), window); - break; - default: - break; - } -} - -void pickfoldermultiple_handler(SDL_Window* window) { - const nfdpathset_t* paths; - nfdpickfolderu8args_t args = {0}; - set_native_window(window, &args.parentWindow); - const nfdresult_t res = NFD_PickFolderMultipleU8_With(&paths, &args); - switch (res) { - case NFD_OKAY: - show_paths(paths, window); - NFD_PathSet_Free(paths); - break; - case NFD_ERROR: - show_error(NFD_GetError(), window); - break; - default: - break; - } -} - -#if defined(_WIN32) -const char font_file[] = "C:\\Windows\\Fonts\\calibri.ttf"; -#elif defined(__APPLE__) -const char font_file[] = "/System/Library/Fonts/SFNS.ttf"; -#else -const char font_file[] = "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf"; -#endif - -#define NUM_STATES 3 -#define NUM_BUTTONS 5 -const char* button_text[NUM_BUTTONS] = {"Open File", - "Open Files", - "Save File", - "Select Folder", - "Select Folders"}; -const int BUTTON_WIDTH = 400; -const int BUTTON_HEIGHT = 40; - -void (*button_handler[NUM_BUTTONS])(SDL_Window*) = {&opendialog_handler, - &opendialogmultiple_handler, - &savedialog_handler, - &pickfolder_handler, - &pickfoldermultiple_handler}; - -#ifdef _WIN32 -int WINAPI WinMain(void) -#else -int main(void) -#endif -{ -#ifdef _WIN32 - // Enable DPI awareness on Windows - SDL_SetHint("SDL_HINT_WINDOWS_DPI_AWARENESS", "permonitorv2"); - SDL_SetHint("SDL_HINT_WINDOWS_DPI_SCALING", "1"); -#endif - - // initialize SDL - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - printf("SDL_Init failed: %s\n", SDL_GetError()); - return 0; - } - - // initialize SDL_ttf - if (TTF_Init() != 0) { - printf("TTF_Init failed: %s\n", TTF_GetError()); - return 0; - } - - // initialize NFD - if (NFD_Init() != NFD_OKAY) { - printf("NFD_Init failed: %s\n", NFD_GetError()); - return 0; - } - - // create window - SDL_Window* const window = SDL_CreateWindow("Welcome", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - BUTTON_WIDTH, - BUTTON_HEIGHT * NUM_BUTTONS, - SDL_WINDOW_ALLOW_HIGHDPI); - if (!window) { - printf("SDL_CreateWindow failed: %s\n", SDL_GetError()); - return 0; - } - - // create renderer - SDL_Renderer* const renderer = - SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (!renderer) { - printf("SDL_CreateRenderer failed: %s\n", SDL_GetError()); - return 0; - } - - // prepare the buttons and handlers - SDL_Texture* textures_normal[NUM_BUTTONS][NUM_STATES]; - - TTF_Font* const font = TTF_OpenFont(font_file, 20); - if (!font) { - printf("TTF_OpenFont failed: %s\n", TTF_GetError()); - return 0; - } - - const SDL_Color back_color[NUM_STATES] = {{0, 0, 0, SDL_ALPHA_OPAQUE}, - {51, 51, 51, SDL_ALPHA_OPAQUE}, - {102, 102, 102, SDL_ALPHA_OPAQUE}}; - const SDL_Color text_color = {255, 255, 255, SDL_ALPHA_OPAQUE}; - const uint8_t text_alpha[NUM_STATES] = {153, 204, 255}; - - for (size_t i = 0; i != NUM_BUTTONS; ++i) { - SDL_Surface* const text_surface = TTF_RenderUTF8_Blended(font, button_text[i], text_color); - if (!text_surface) { - printf("TTF_RenderUTF8_Blended failed: %s\n", TTF_GetError()); - return 0; - } - - if (SDL_SetSurfaceBlendMode(text_surface, SDL_BLENDMODE_BLEND) != 0) { - printf("SDL_SetSurfaceBlendMode failed: %s\n", SDL_GetError()); - return 0; - } - - for (size_t j = 0; j != NUM_STATES; ++j) { - SDL_Surface* button_surface = - SDL_CreateRGBSurface(0, BUTTON_WIDTH, BUTTON_HEIGHT, 32, 0, 0, 0, 0); - if (!button_surface) { - printf("SDL_CreateRGBSurface failed: %s\n", SDL_GetError()); - return 0; - } - - if (SDL_FillRect(button_surface, - NULL, - SDL_MapRGBA(button_surface->format, - back_color[j].r, - back_color[j].g, - back_color[j].b, - back_color[j].a)) != 0) { - printf("SDL_FillRect failed: %s\n", SDL_GetError()); - return 0; - } - - SDL_SetSurfaceAlphaMod(text_surface, text_alpha[j]); - - SDL_Rect dstrect = {(BUTTON_WIDTH - text_surface->w) / 2, - (BUTTON_HEIGHT - text_surface->h) / 2, - text_surface->w, - text_surface->h}; - if (SDL_BlitSurface(text_surface, NULL, button_surface, &dstrect) != 0) { - printf("SDL_BlitSurface failed: %s\n", SDL_GetError()); - return 0; - } - - SDL_Texture* const texture = SDL_CreateTextureFromSurface(renderer, button_surface); - if (!texture) { - printf("SDL_CreateTextureFromSurface failed: %s\n", SDL_GetError()); - return 0; - } - - SDL_FreeSurface(button_surface); - - textures_normal[i][j] = texture; - } - - SDL_FreeSurface(text_surface); - } - - TTF_CloseFont(font); - - // event loop - bool quit = false; - size_t button_index = (size_t)-1; - bool pressed = false; - do { - // render - for (size_t i = 0; i != NUM_BUTTONS; ++i) { - const SDL_Rect rect = {0, (int)i * BUTTON_HEIGHT, BUTTON_WIDTH, BUTTON_HEIGHT}; - SDL_RenderCopy( - renderer, textures_normal[i][button_index == i ? pressed ? 2 : 1 : 0], NULL, &rect); - } - SDL_RenderPresent(renderer); - - // process events - SDL_Event event; - if (SDL_WaitEvent(&event) == 0) { - printf("SDL_WaitEvent failed: %s\n", SDL_GetError()); - return 0; - } - do { - switch (event.type) { - case SDL_QUIT: { - quit = true; - break; - } - case SDL_WINDOWEVENT: { - switch (event.window.event) { - case SDL_WINDOWEVENT_CLOSE: - quit = true; - break; - case SDL_WINDOWEVENT_LEAVE: - button_index = (size_t)-1; - break; - } - break; - } - case SDL_MOUSEMOTION: { - if (event.motion.x < 0 || event.motion.x >= BUTTON_WIDTH || - event.motion.y < 0) { - button_index = (size_t)-1; - break; - } - const int index = event.motion.y / BUTTON_HEIGHT; - if (index < 0 || index >= NUM_BUTTONS) { - button_index = (size_t)-1; - break; - } - button_index = index; - pressed = event.motion.state & SDL_BUTTON(1); - break; - } - case SDL_MOUSEBUTTONDOWN: { - if (event.button.button == 1) { - pressed = true; - } - break; - } - case SDL_MOUSEBUTTONUP: { - if (event.button.button == 1) { - pressed = false; - if (button_index != (size_t)-1) { - (*button_handler[button_index])(window); - } - } - break; - } - } - } while (SDL_PollEvent(&event) != 0); - } while (!quit); - - // destroy textures - for (size_t i = 0; i != NUM_BUTTONS; ++i) { - for (size_t j = 0; j != NUM_STATES; ++j) { - SDL_DestroyTexture(textures_normal[i][j]); - } - } - - // destroy renderer - SDL_DestroyRenderer(renderer); - - // destroy window - SDL_DestroyWindow(window); - - // quit NFD - NFD_Quit(); - - // quit SDL_ttf - TTF_Quit(); - - // quit SDL - SDL_Quit(); - - return 0; -} diff --git a/external/nfd/test/test_sdl.manifest b/external/nfd/test/test_sdl.manifest deleted file mode 100644 index 05eb6c23..00000000 --- a/external/nfd/test/test_sdl.manifest +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - true - PerMonitorV2 - - - Example application for NFDe. - - - - - - diff --git a/src/frontend/CMakeLists.txt b/src/frontend/CMakeLists.txt index 6f2b8253..1c3d4cc2 100644 --- a/src/frontend/CMakeLists.txt +++ b/src/frontend/CMakeLists.txt @@ -46,7 +46,6 @@ include_directories( ../../external/capstone/include ../../external/imgui ../../external/imgui/backends - ../../external/nfd/src/include ../../external/cflags/include ../../external/mINI/src/ ImGuiImpl/ @@ -109,7 +108,6 @@ add_subdirectory(../../external/SDL SDL) add_subdirectory(../../external/cflags cflags) add_subdirectory(../../external/imgui imgui) add_subdirectory(../../external/mINI mINI) -add_subdirectory(../../external/nfd nfd) set(CAPSTONE_ARCHITECTURE_DEFAULT OFF) set(CAPSTONE_MIPS_SUPPORT ON) set(CAPSTONE_X86_SUPPORT ON) @@ -134,7 +132,7 @@ add_executable(kaizen Debugger.hpp Debugger.cpp) -target_link_libraries(kaizen PUBLIC imgui nfd SDL3::SDL3 SDL3::SDL3-static cflags::cflags discord-rpc mio parallel-rdp capstone backend) +target_link_libraries(kaizen PUBLIC imgui SDL3::SDL3 SDL3::SDL3-static cflags::cflags discord-rpc mio parallel-rdp capstone backend) target_compile_definitions(kaizen PUBLIC SDL_MAIN_HANDLED) file(COPY ../../resources/ DESTINATION ${PROJECT_BINARY_DIR}/resources/) diff --git a/src/frontend/KaizenGui.cpp b/src/frontend/KaizenGui.cpp index adafd11c..7c96bf73 100644 --- a/src/frontend/KaizenGui.cpp +++ b/src/frontend/KaizenGui.cpp @@ -1,11 +1,10 @@ #include -#include #include #include #include #include -KaizenGui::KaizenGui() noexcept : window("Kaizen", 800, 600), core(std::make_shared(static_cast(settingsWindow.cpuSettings.GetCPUType()))), vulkanWidget(core, window.getHandle()), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) { +KaizenGui::KaizenGui() noexcept : window("Kaizen", 800, 600), settingsWindow(window), core(std::make_shared(static_cast(settingsWindow.cpuSettings.GetCPUType()))), vulkanWidget(core, window.getHandle()), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) { gui::Initialize(core->parallel.wsi, window.getHandle()); SDL_InitSubSystem(SDL_INIT_GAMEPAD); @@ -34,22 +33,6 @@ void KaizenGui::QueryDevices(SDL_Event event) { } } -void KaizenGui::FileDialog() { - NFD::Guard guard; - NFD::UniquePath path; - static const std::vector filterItems = { - {"Nintendo 64 rom or rom archive", "rar,RAR,tar,TAR,zip,ZIP,7z,7Z,n64,z64,v64,N64,Z64,V64"} - }; - - auto result = NFD::OpenDialog(path, filterItems.data(), filterItems.size()); - if(result == NFD_ERROR) - panic("Error: {}", NFD::GetError()); - - if(result != NFD_CANCEL) { - LoadROM(path.get()); - } -} - void KaizenGui::HandleInput(SDL_Event event) { n64::PIF &pif = core->cpu->GetMem().mmio.si.pif; switch(event.type) { @@ -230,17 +213,31 @@ void KaizenGui::RenderUI() { ImGui::RenderPlatformWindowsDefault(); } + if(fileDialogOpen) { + fileDialogOpen = false; + const SDL_DialogFileFilter filters[] = {{"All files", "*"}, {"Nintendo 64 executable", "n64;z64;v64"}, {"Nintendo 64 executable archive", "rar;tar;zip;7z"}}; + SDL_ShowOpenFileDialog([](void *userdata, const char * const *filelist, int filter) { + KaizenGui* kaizen = (KaizenGui*)userdata; + + if (!filelist) { + panic("An error occured: %s", SDL_GetError()); + return; + } else if (!*filelist) { + warn("The user did not select any file."); + warn("Most likely, the dialog was canceled."); + return; + } + + kaizen->LoadROM(*filelist); + }, this, window.getHandle(), filters, 3, nullptr, false); + } + if(core->romLoaded) { core->parallel.UpdateScreen(*core.get()); return; } core->parallel.UpdateScreen(*core.get(), false); - - if(fileDialogOpen) { - fileDialogOpen = false; - FileDialog(); - } } void KaizenGui::LoadROM(const std::string &path) noexcept { diff --git a/src/frontend/KaizenGui.hpp b/src/frontend/KaizenGui.hpp index 148d0779..67ec78cc 100644 --- a/src/frontend/KaizenGui.hpp +++ b/src/frontend/KaizenGui.hpp @@ -29,7 +29,6 @@ private: bool fileDialogOpen = false; bool quit = false; std::function emuExitFunc; - void FileDialog(); void RenderUI(); void HandleInput(SDL_Event event); void QueryDevices(SDL_Event event); diff --git a/src/frontend/SettingsWindow.cpp b/src/frontend/SettingsWindow.cpp index f70bcbd7..6d4fbfa1 100644 --- a/src/frontend/SettingsWindow.cpp +++ b/src/frontend/SettingsWindow.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -20,18 +19,22 @@ bool SettingsWindow::render() { if(ImGui::BeginTabItem("General")) { if(ImGui::Button("Pick...")) { - NFD::Guard guard; - NFD::UniquePath outPath; + SDL_ShowOpenFolderDialog([](void *userdata, const char * const *filelist, int filter) { + SettingsWindow* settings = (SettingsWindow*)userdata; + + if (!filelist) { + panic("An error occured: %s", SDL_GetError()); + return; + } else if (!*filelist) { + warn("The user did not select any file."); + warn("Most likely, the dialog was canceled."); + return; + } - auto result = NFD::PickFolder(outPath); - if(result == NFD_ERROR) - panic("Error: {}", NFD::GetError()); - - if(result != NFD_CANCEL) { - savesPath = outPath.get(); - Options::GetInstance().SetValue("general", "savePath", savesPath); - applyEnabled = true; - } + settings->savesPath = *filelist; + Options::GetInstance().SetValue("general", "savePath", settings->savesPath); + settings->applyEnabled = true; + }, this, window.getHandle(), nullptr, false); } ImGui::SameLine(); ImGui::BeginDisabled(); diff --git a/src/frontend/SettingsWindow.hpp b/src/frontend/SettingsWindow.hpp index 24353dc7..1dc5aaf1 100644 --- a/src/frontend/SettingsWindow.hpp +++ b/src/frontend/SettingsWindow.hpp @@ -1,18 +1,19 @@ #pragma once #include #include -#include +#include #include class SettingsWindow final { AudioSettings audioSettings; std::string savesPath; bool applyEnabled = false; + gui::NativeWindow& window; public: CPUSettings cpuSettings; bool isOpen = false; bool render(); - SettingsWindow() = default; + SettingsWindow(gui::NativeWindow& window); [[nodiscard]] float getVolumeL() const { return audioSettings.volumeL / 100.f; } [[nodiscard]] float getVolumeR() const { return audioSettings.volumeR / 100.f; } };