Skip to content

Commit

Permalink
feat: Enumerate fonts on Linux using Fontconfig when available (#1821)
Browse files Browse the repository at this point in the history
### 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 <[email protected]>
  • Loading branch information
csnover and WerWolv authored Jul 21, 2024
1 parent 09b6c2a commit c1c51e0
Show file tree
Hide file tree
Showing 11 changed files with 58 additions and 2 deletions.
1 change: 1 addition & 0 deletions dist/AppImageBuilder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions dist/Arch/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ RUN pacman -S --needed --noconfirm \
glfw-x11 \
file \
mbedtls \
fontconfig \
freetype2 \
curl \
dbus \
Expand Down
2 changes: 1 addition & 1 deletion dist/Arch/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion dist/DEBIAN/control.in
Original file line number Diff line number Diff line change
Expand Up @@ -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 <[email protected]>
Description: ImHex Hex Editor
A Hex Editor for Reverse Engineers, Programmers and
Expand Down
1 change: 1 addition & 0 deletions dist/get_deps_archlinux.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pacman -S $@ --needed \
gcc \
lld \
glfw \
fontconfig \
file \
mbedtls \
freetype2 \
Expand Down
1 change: 1 addition & 0 deletions dist/get_deps_debian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ apt install -y \
libglm-dev \
libmagic-dev \
libmbedtls-dev \
libfontconfig-dev \
libfreetype-dev \
libdbus-1-dev \
libcurl4-gnutls-dev \
Expand Down
1 change: 1 addition & 0 deletions dist/get_deps_fedora.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ dnf install -y \
cmake \
dbus-devel \
file-devel \
fontconfig-devel \
freetype-devel \
libcurl-devel \
gcc-c++ \
Expand Down
1 change: 1 addition & 0 deletions dist/get_deps_tumbleweed.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ zypper install \
ninja \
gcc12 \
gcc12-c++ \
fontconfig-devel \
freetype2-devel \
libcurl-devel \
dbus-1-devel \
Expand Down
1 change: 1 addition & 0 deletions dist/rpm/imhex.spec
Original file line number Diff line number Diff line change
Expand Up @@ -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++
Expand Down
9 changes: 9 additions & 0 deletions main/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
40 changes: 40 additions & 0 deletions main/gui/source/window/linux_window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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",
Expand Down

0 comments on commit c1c51e0

Please sign in to comment.