feat: Enumerate fonts on Linux using Fontconfig when available (#1821)
### Problem description The fonts list on Linux does not show all system fonts, and does not show font names at all. ### Implementation description Use Fontconfig to make the list less bad if Fontconfig headers are available. ### Additional things I like fonts. --------- Co-authored-by: Nik <werwolv98@gmail.com>
This commit is contained in:
parent
09b6c2ab5b
commit
c1c51e0baf
1
dist/AppImageBuilder.yml
vendored
1
dist/AppImageBuilder.yml
vendored
@ -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
|
||||
|
1
dist/Arch/Dockerfile
vendored
1
dist/Arch/Dockerfile
vendored
@ -13,6 +13,7 @@ RUN pacman -S --needed --noconfirm \
|
||||
glfw-x11 \
|
||||
file \
|
||||
mbedtls \
|
||||
fontconfig \
|
||||
freetype2 \
|
||||
curl \
|
||||
dbus \
|
||||
|
2
dist/Arch/PKGBUILD
vendored
2
dist/Arch/PKGBUILD
vendored
@ -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)
|
||||
|
2
dist/DEBIAN/control.in
vendored
2
dist/DEBIAN/control.in
vendored
@ -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 <hey@werwolv.net>
|
||||
Description: ImHex Hex Editor
|
||||
A Hex Editor for Reverse Engineers, Programmers and
|
||||
|
1
dist/get_deps_archlinux.sh
vendored
1
dist/get_deps_archlinux.sh
vendored
@ -5,6 +5,7 @@ pacman -S $@ --needed \
|
||||
gcc \
|
||||
lld \
|
||||
glfw \
|
||||
fontconfig \
|
||||
file \
|
||||
mbedtls \
|
||||
freetype2 \
|
||||
|
1
dist/get_deps_debian.sh
vendored
1
dist/get_deps_debian.sh
vendored
@ -18,6 +18,7 @@ apt install -y \
|
||||
libglm-dev \
|
||||
libmagic-dev \
|
||||
libmbedtls-dev \
|
||||
libfontconfig-dev \
|
||||
libfreetype-dev \
|
||||
libdbus-1-dev \
|
||||
libcurl4-gnutls-dev \
|
||||
|
1
dist/get_deps_fedora.sh
vendored
1
dist/get_deps_fedora.sh
vendored
@ -4,6 +4,7 @@ dnf install -y \
|
||||
cmake \
|
||||
dbus-devel \
|
||||
file-devel \
|
||||
fontconfig-devel \
|
||||
freetype-devel \
|
||||
libcurl-devel \
|
||||
gcc-c++ \
|
||||
|
1
dist/get_deps_tumbleweed.sh
vendored
1
dist/get_deps_tumbleweed.sh
vendored
@ -5,6 +5,7 @@ zypper install \
|
||||
ninja \
|
||||
gcc12 \
|
||||
gcc12-c++ \
|
||||
fontconfig-devel \
|
||||
freetype2-devel \
|
||||
libcurl-devel \
|
||||
dbus-1-devel \
|
||||
|
1
dist/rpm/imhex.spec
vendored
1
dist/rpm/imhex.spec
vendored
@ -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++
|
||||
|
@ -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)
|
||||
|
@ -22,6 +22,10 @@
|
||||
#include <string.h>
|
||||
#include <ranges>
|
||||
|
||||
#if defined(IMHEX_HAS_FONTCONFIG)
|
||||
#include <fontconfig/fontconfig.h>
|
||||
#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<const char *>(fullName), reinterpret_cast<const char *>(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",
|
||||
|
Loading…
Reference in New Issue
Block a user