diff --git a/dist/AppImageBuilder.yml b/dist/AppImageBuilder.yml index 4f9eb6a7bd773..2497e0d4c7bdb 100644 --- a/dist/AppImageBuilder.yml +++ b/dist/AppImageBuilder.yml @@ -30,6 +30,7 @@ AppDir: - libbz2-1.0:amd64 - libcap2:amd64 - libdbus-1-3:amd64 + - libfontconfig1:amd64 - libgpg-error0:amd64 - liblzma5:amd64 - libnss-mdns:amd64 diff --git a/dist/Arch/Dockerfile b/dist/Arch/Dockerfile index 16aa72acaf57c..dbfeb3840f80d 100644 --- a/dist/Arch/Dockerfile +++ b/dist/Arch/Dockerfile @@ -13,6 +13,7 @@ RUN pacman -S --needed --noconfirm \ glfw-x11 \ file \ mbedtls \ + fontconfig \ freetype2 \ curl \ dbus \ diff --git a/dist/Arch/PKGBUILD b/dist/Arch/PKGBUILD index 10240701c8e1a..59bc3a7ec2cc4 100644 --- a/dist/Arch/PKGBUILD +++ b/dist/Arch/PKGBUILD @@ -8,7 +8,7 @@ pkgdesc="A Hex Editor for Reverse Engineers, Programmers and people who value th arch=("x86_64") url="https://github.com/WerWolv/ImHex" license=('GPL2') -depends=(glfw mbedtls freetype2 libglvnd dbus gtk3 curl fmt yara nlohmann-json zlib bzip2 xz zstd) +depends=(glfw mbedtls fontconfig freetype2 libglvnd dbus gtk3 curl fmt yara nlohmann-json zlib bzip2 xz zstd) makedepends=(git) provides=(imhex) conflicts=(imhex) diff --git a/dist/DEBIAN/control.in b/dist/DEBIAN/control.in index 263e7ed539be7..96c43fc1373ba 100644 --- a/dist/DEBIAN/control.in +++ b/dist/DEBIAN/control.in @@ -4,7 +4,7 @@ Section: editors Priority: optional Architecture: amd64 License: GNU GPL-2 -Depends: libglfw3 | libglfw3-wayland, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal +Depends: libfontconfig1, libglfw3 | libglfw3-wayland, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal Maintainer: WerWolv Description: ImHex Hex Editor A Hex Editor for Reverse Engineers, Programmers and diff --git a/dist/get_deps_archlinux.sh b/dist/get_deps_archlinux.sh index 15377e87689bb..8d5f3f4a6390a 100755 --- a/dist/get_deps_archlinux.sh +++ b/dist/get_deps_archlinux.sh @@ -5,6 +5,7 @@ pacman -S $@ --needed \ gcc \ lld \ glfw \ + fontconfig \ file \ mbedtls \ freetype2 \ diff --git a/dist/get_deps_debian.sh b/dist/get_deps_debian.sh index 286b42aa17183..a0449dbad9d20 100755 --- a/dist/get_deps_debian.sh +++ b/dist/get_deps_debian.sh @@ -18,6 +18,7 @@ apt install -y \ libglm-dev \ libmagic-dev \ libmbedtls-dev \ + libfontconfig-dev \ libfreetype-dev \ libdbus-1-dev \ libcurl4-gnutls-dev \ diff --git a/dist/get_deps_fedora.sh b/dist/get_deps_fedora.sh index 683ddd2d4849f..c5f006e7be148 100755 --- a/dist/get_deps_fedora.sh +++ b/dist/get_deps_fedora.sh @@ -4,6 +4,7 @@ dnf install -y \ cmake \ dbus-devel \ file-devel \ + fontconfig-devel \ freetype-devel \ libcurl-devel \ gcc-c++ \ diff --git a/dist/get_deps_tumbleweed.sh b/dist/get_deps_tumbleweed.sh index cbb8813ea51dd..61bd4159a9b9c 100755 --- a/dist/get_deps_tumbleweed.sh +++ b/dist/get_deps_tumbleweed.sh @@ -5,6 +5,7 @@ zypper install \ ninja \ gcc12 \ gcc12-c++ \ + fontconfig-devel \ freetype2-devel \ libcurl-devel \ dbus-1-devel \ diff --git a/dist/rpm/imhex.spec b/dist/rpm/imhex.spec index 5e56b62000daa..17ce0ad973714 100644 --- a/dist/rpm/imhex.spec +++ b/dist/rpm/imhex.spec @@ -16,6 +16,7 @@ BuildRequires: cmake BuildRequires: desktop-file-utils BuildRequires: dbus-devel BuildRequires: file-devel +BuildRequires: fontconfig-devel BuildRequires: freetype-devel BuildRequires: fmt-devel BuildRequires: gcc-c++ diff --git a/main/gui/CMakeLists.txt b/main/gui/CMakeLists.txt index c5a6e0362dc62..d2f8a835f3eb0 100644 --- a/main/gui/CMakeLists.txt +++ b/main/gui/CMakeLists.txt @@ -63,6 +63,15 @@ if (WIN32) target_link_libraries(main PRIVATE usp10 wsock32 ws2_32 Dwmapi.lib Winmm.lib) else () target_link_libraries(main PRIVATE pthread) + + if (NOT APPLE) + find_package(Fontconfig) + if (TARGET Fontconfig::Fontconfig) + message(STATUS "Using Fontconfig version: ${Fontconfig_VERSION}") + target_link_libraries(main PRIVATE Fontconfig::Fontconfig) + target_compile_definitions(main PRIVATE IMHEX_HAS_FONTCONFIG) + endif () + endif () endif () precompileHeaders(main ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/main/gui/source/window/linux_window.cpp b/main/gui/source/window/linux_window.cpp index 60fbbdd8e7e3b..93c54911e182e 100644 --- a/main/gui/source/window/linux_window.cpp +++ b/main/gui/source/window/linux_window.cpp @@ -22,6 +22,10 @@ #include #include + #if defined(IMHEX_HAS_FONTCONFIG) + #include + #endif + namespace hex { bool isFileInPath(const std::fs::path &filename) { @@ -48,7 +52,43 @@ namespace hex { } // Hopefully one of these commands is installed } + #if defined(IMHEX_HAS_FONTCONFIG) + static bool enumerateFontConfig() { + if (!FcInit()) + return false; + + ON_SCOPE_EXIT { FcFini(); }; + + auto fonts = FcConfigGetFonts(nullptr, FcSetSystem); + if (fonts == nullptr) + return false; + + for (int i = 0; i < fonts->nfont; ++i) { + auto font = fonts->fonts[i]; + FcChar8 *file, *fullName; + + if (FcPatternGetString(font, FC_FILE, 0, &file) != FcResultMatch) { + continue; + } + + if (FcPatternGetString(font, FC_FULLNAME, 0, &fullName) != FcResultMatch + && FcPatternGetString(font, FC_FAMILY, 0, &fullName) != FcResultMatch) { + continue; + } + + registerFont(reinterpret_cast(fullName), reinterpret_cast(file)); + } + + return true; + } + #endif + void enumerateFonts() { + #if defined(IMHEX_HAS_FONTCONFIG) + if (enumerateFontConfig()) + return; + #endif + const std::array FontDirectories = { "/usr/share/fonts", "/usr/local/share/fonts",