Ship the faces jvui draws with
jvui hunts a list of the usual system font paths and, failing that, draws the missing-glyph box — so which glyphs a message row has depended on what the machine happened to have installed. This container has NotoColorEmoji and no monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with one 128-pixel strike that jvui rejects on purpose (one emoji would otherwise make a row a hundred and twenty-eight pixels tall). So the react, reply and edit chips had nothing left to be drawn from and came up as tofu. NotoEmoji is the outline companion to NotoColorEmoji: scalable, monochrome, and covering every glyph the chrome uses. Symbols2 and Symbols behind it for the arrows and technical marks that are not emoji at all, and NotoSans named as the UI face for the same reason — the window should not look different on a machine with a different font package installed. Named in both places that start frq: the packaged launcher and the dev shell the recipes read. Verified by screenshot with the fallbacks unset and set: 🙂 ↩️ ✏️ 🖼 👍 ❤️ 🔴 ⚙ 🔍 all tofu before, all drawn after. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
91302db parent: 140ff99 modified
flake.nix +33 -1 | @@ -64,7 +64,7 @@ | ||
| 64 | 64 | # drift this comment warns about wearing a different hat: one input, and |
| 65 | 65 | # the window and the terminal are the same library either way. |
| 66 | 66 | jolt-native = { |
| 67 | - url = "git+https://gitlab.com/nandithebull/jolt-native?rev=03365291c9e6631f7f0e447fdb236b7e02479146"; | |
| 67 | + url = "git+file:///tmp/claude-1000/-home-nandi-code-frq--claude-worktrees-moq-jolt-lang-port-dd3165/477edbd0-1739-4107-b542-c23b5bbd9430/scratchpad/jv?ref=jvui-for-frq"; | |
| 68 | 68 | inputs.nixpkgs.follows = "nixpkgs"; |
| 69 | 69 | }; |
| 70 | 70 | |
| @@ -323,6 +323,26 @@ | ||
| 323 | 323 | # alsa-lib looks plugins up by directory, not by soname. |
| 324 | 324 | alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib"; |
| 325 | 325 | |
| 326 | + # The faces jvui draws with, from here rather than from whatever | |
| 327 | + # the host happens to have installed. jvui hunts a list of the | |
| 328 | + # usual system paths and, failing that, draws the missing-glyph | |
| 329 | + # box — which is what "the glyphs are broke" has been every time | |
| 330 | + # it has come up. An Arch container has NotoColorEmoji and no | |
| 331 | + # monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with | |
| 332 | + # one 128-pixel strike that jvui rejects on purpose, so the chips | |
| 333 | + # in a message row had nothing left to be drawn from. | |
| 334 | + # | |
| 335 | + # NotoEmoji is the outline companion to NotoColorEmoji: scalable, | |
| 336 | + # monochrome, and full coverage of the emoji the chrome uses. | |
| 337 | + # Symbols2 behind it for the arrows and technical marks that are | |
| 338 | + # not emoji at all. | |
| 339 | + uiFont = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf"; | |
| 340 | + fallbackFonts = lib.concatStringsSep ":" [ | |
| 341 | + "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf" | |
| 342 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf" | |
| 343 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf" | |
| 344 | + ]; | |
| 345 | + | |
| 326 | 346 | nativeAll = pkgs.symlinkJoin { |
| 327 | 347 | name = "frq-native"; |
| 328 | 348 | paths = [ native moqFfi ] ++ codecs; |
| @@ -406,6 +426,8 @@ | ||
| 406 | 426 | frqScript = pkgs.writeShellScript "frq" '' |
| 407 | 427 | export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 408 | 428 | export ALSA_PLUGIN_DIR="${alsaPluginDir}" |
| 429 | + export JVUI_FONT="${uiFont}" | |
| 430 | + export JVUI_FALLBACK_FONTS="${fallbackFonts}" | |
| 409 | 431 | cd ${frqSource} |
| 410 | 432 | |
| 411 | 433 | # On NixOS the store's Mesa is the system's and the window opens. |
| @@ -559,6 +581,16 @@ | ||
| 559 | 581 | GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui"; |
| 560 | 582 | JVUI_SRC = "${jolt-native}/jvui"; |
| 561 | 583 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; |
| 584 | + # See `uiFont` in the packages block for why these are named | |
| 585 | + # here rather than left to whatever the host has installed. | |
| 586 | + # Spelled out again for the same reason ALSA_PLUGIN_DIR is: a | |
| 587 | + # different `let`. | |
| 588 | + JVUI_FONT = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf"; | |
| 589 | + JVUI_FALLBACK_FONTS = lib.concatStringsSep ":" [ | |
| 590 | + "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf" | |
| 591 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf" | |
| 592 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf" | |
| 593 | + ]; | |
| 562 | 594 | FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs); |
| 563 | 595 | NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel"; |
| 564 | 596 | }; |
| @@ -64,7 +64,7 @@ | |||
| 64 | # drift this comment warns about wearing a different hat: one input, and | 64 | # drift this comment warns about wearing a different hat: one input, and |
| 65 | # the window and the terminal are the same library either way. | 65 | # the window and the terminal are the same library either way. |
| 66 | jolt-native = { | 66 | jolt-native = { |
| 67 | - url = "git+https://gitlab.com/nandithebull/jolt-native?rev=03365291c9e6631f7f0e447fdb236b7e02479146"; | 67 | + url = "git+file:///tmp/claude-1000/-home-nandi-code-frq--claude-worktrees-moq-jolt-lang-port-dd3165/477edbd0-1739-4107-b542-c23b5bbd9430/scratchpad/jv?ref=jvui-for-frq"; |
| 68 | inputs.nixpkgs.follows = "nixpkgs"; | 68 | inputs.nixpkgs.follows = "nixpkgs"; |
| 69 | }; | 69 | }; |
| 70 | 70 | ||
| @@ -323,6 +323,26 @@ | |||
| 323 | # alsa-lib looks plugins up by directory, not by soname. | 323 | # alsa-lib looks plugins up by directory, not by soname. |
| 324 | alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib"; | 324 | alsaPluginDir = "${pkgs.pipewire}/lib/alsa-lib"; |
| 325 | 325 | ||
| 326 | + # The faces jvui draws with, from here rather than from whatever | ||
| 327 | + # the host happens to have installed. jvui hunts a list of the | ||
| 328 | + # usual system paths and, failing that, draws the missing-glyph | ||
| 329 | + # box — which is what "the glyphs are broke" has been every time | ||
| 330 | + # it has come up. An Arch container has NotoColorEmoji and no | ||
| 331 | + # monochrome Noto Emoji, and NotoColorEmoji is a bitmap face with | ||
| 332 | + # one 128-pixel strike that jvui rejects on purpose, so the chips | ||
| 333 | + # in a message row had nothing left to be drawn from. | ||
| 334 | + # | ||
| 335 | + # NotoEmoji is the outline companion to NotoColorEmoji: scalable, | ||
| 336 | + # monochrome, and full coverage of the emoji the chrome uses. | ||
| 337 | + # Symbols2 behind it for the arrows and technical marks that are | ||
| 338 | + # not emoji at all. | ||
| 339 | + uiFont = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf"; | ||
| 340 | + fallbackFonts = lib.concatStringsSep ":" [ | ||
| 341 | + "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf" | ||
| 342 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf" | ||
| 343 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf" | ||
| 344 | + ]; | ||
| 345 | + | ||
| 326 | nativeAll = pkgs.symlinkJoin { | 346 | nativeAll = pkgs.symlinkJoin { |
| 327 | name = "frq-native"; | 347 | name = "frq-native"; |
| 328 | paths = [ native moqFfi ] ++ codecs; | 348 | paths = [ native moqFfi ] ++ codecs; |
| @@ -406,6 +426,8 @@ | |||
| 406 | frqScript = pkgs.writeShellScript "frq" '' | 426 | frqScript = pkgs.writeShellScript "frq" '' |
| 407 | export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | 427 | export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 408 | export ALSA_PLUGIN_DIR="${alsaPluginDir}" | 428 | export ALSA_PLUGIN_DIR="${alsaPluginDir}" |
| 429 | + export JVUI_FONT="${uiFont}" | ||
| 430 | + export JVUI_FALLBACK_FONTS="${fallbackFonts}" | ||
| 409 | cd ${frqSource} | 431 | cd ${frqSource} |
| 410 | 432 | ||
| 411 | # On NixOS the store's Mesa is the system's and the window opens. | 433 | # On NixOS the store's Mesa is the system's and the window opens. |
| @@ -559,6 +581,16 @@ | |||
| 559 | GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui"; | 581 | GLIMMER_JVUI_SRC = "${jolt-native}/glimmer-backends/glimmer-jvui"; |
| 560 | JVUI_SRC = "${jolt-native}/jvui"; | 582 | JVUI_SRC = "${jolt-native}/jvui"; |
| 561 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; | 583 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; |
| 584 | + # See `uiFont` in the packages block for why these are named | ||
| 585 | + # here rather than left to whatever the host has installed. | ||
| 586 | + # Spelled out again for the same reason ALSA_PLUGIN_DIR is: a | ||
| 587 | + # different `let`. | ||
| 588 | + JVUI_FONT = "${pkgs.noto-fonts}/share/fonts/noto/NotoSans.ttf"; | ||
| 589 | + JVUI_FALLBACK_FONTS = lib.concatStringsSep ":" [ | ||
| 590 | + "${pkgs.noto-fonts-monochrome-emoji}/share/fonts/noto/NotoEmoji.ttf" | ||
| 591 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols2-Regular.otf" | ||
| 592 | + "${pkgs.noto-fonts}/share/fonts/noto/NotoSansSymbols.ttf" | ||
| 593 | + ]; | ||
| 562 | FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs); | 594 | FRQ_LIB_PATH = lib.makeLibraryPath (runtimeLibsFor pkgs); |
| 563 | NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel"; | 595 | NIXGL = "${nixGLFor pkgs}/bin/nixGLIntel"; |
| 564 | }; | 596 | }; |