galaaz 2.1.10.pre.4 → 2.1.10.pre.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/galaaz/cli.rb +50 -7
- data/logos/icon-font/README.md +5 -2
- data/logos/icon-font/build_font.py +136 -55
- data/script/omarchy/README.md +2 -1
- data/script/omarchy/fonts/galaaz.ttf +0 -0
- data/script/omarchy/fonts/omarchy-with-galaaz.ttf +0 -0
- data/script/omarchy/install-galaaz.sh +23 -5
- data/script/omarchy/omarchy-menu.jsonc +21 -21
- data/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b0c59c52dee0210e7429fd3e8e25b7b529c48bd1c4ef5dd93129a447f75f7cea
|
|
4
|
+
data.tar.gz: c288f1de871ea48cf8004fb12f40b25c966494a4056c8e12b21c41f7ad15b867
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2d6ad40a8fe7d8bf9f9bc76f28af74ba64e740f2178607c2d63586af0cdcb4194a54941eda2132ab61a17acb6f899c189ba0416a5e4432bf5b2fe2fc431d7b19
|
|
7
|
+
data.tar.gz: e281f2595077ed37709e596d123966461eca7aaa189eb2f6a1e72a17346cc96ebb36f49cc610ae5a503a7d8642e2bb6443c352aae4f7e75a48e8094970b1fe77
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 2.1.10.pre.5
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Omarchy menu icons: use `"iconFont": "omarchy"` + **U+E90E** via shipped
|
|
10
|
+
`omarchy-with-galaaz.ttf` (Omarchy brand font + Galaaz R/gem). A custom
|
|
11
|
+
family `galaaz` alone rendered as missing-glyph tofu (`//'`) because Qt
|
|
12
|
+
does not load that family for the menu.
|
|
13
|
+
|
|
5
14
|
## 2.1.10.pre.4
|
|
6
15
|
|
|
7
16
|
### Fixed
|
data/lib/galaaz/cli.rb
CHANGED
|
@@ -30,8 +30,12 @@ module Galaaz
|
|
|
30
30
|
['debug-galaaz.sh', 'omarchy-galaaz-debug', true]
|
|
31
31
|
].freeze
|
|
32
32
|
OMARCHY_MENU_FILE = 'omarchy-menu.jsonc'
|
|
33
|
+
# Standalone family "galaaz" (debug). Menu uses the merged Omarchy brand font.
|
|
33
34
|
OMARCHY_FONT_REL = File.join('fonts', 'galaaz.ttf')
|
|
34
|
-
|
|
35
|
+
OMARCHY_MERGED_FONT_REL = File.join('fonts', 'omarchy-with-galaaz.ttf')
|
|
36
|
+
# Menu rows use iconFont "omarchy" + U+E90E (Qt already loads family omarchy).
|
|
37
|
+
OMARCHY_MENU_FONT_FAMILY = 'omarchy'
|
|
38
|
+
OMARCHY_MENU_CODEPOINT = 0xE90E
|
|
35
39
|
BLOGS_MARKER = '.galaaz-blogs'
|
|
36
40
|
EXAMPLES_MARKER = '.galaaz-examples'
|
|
37
41
|
CRAN = 'https://cloud.r-project.org'
|
|
@@ -152,7 +156,8 @@ module Galaaz
|
|
|
152
156
|
Writes:
|
|
153
157
|
~/.local/bin/omarchy-install-galaaz (and add/remove/guide/gknit/debug)
|
|
154
158
|
~/.config/omarchy/extensions/omarchy-menu.jsonc
|
|
155
|
-
~/.local/share/fonts/galaaz/galaaz.ttf
|
|
159
|
+
~/.local/share/fonts/galaaz/galaaz.ttf
|
|
160
|
+
~/.local/share/fonts/omarchy-with-galaaz.ttf (family omarchy + U+E90E)
|
|
156
161
|
|
|
157
162
|
Then: Super+Space → Install → Development → Galaaz
|
|
158
163
|
HELP
|
|
@@ -199,7 +204,9 @@ module Galaaz
|
|
|
199
204
|
end
|
|
200
205
|
puts " menu: #{File.file?(menu) ? menu : 'MISSING'}"
|
|
201
206
|
font = File.expand_path('~/.local/share/fonts/galaaz/galaaz.ttf')
|
|
202
|
-
puts " font: #{File.file?(font) ? font : 'MISSING'}"
|
|
207
|
+
puts " font galaaz: #{File.file?(font) ? font : 'MISSING'}"
|
|
208
|
+
merged = File.expand_path('~/.local/share/fonts/omarchy-with-galaaz.ttf')
|
|
209
|
+
puts " font omarchy+galaaz: #{File.file?(merged) ? merged : 'MISSING'}"
|
|
203
210
|
bundled = File.join(root, 'script', 'omarchy')
|
|
204
211
|
puts " gem overlay: #{File.directory?(bundled) ? bundled : 'MISSING (reinstall gem)'}"
|
|
205
212
|
0
|
|
@@ -211,7 +218,8 @@ module Galaaz
|
|
|
211
218
|
abort_unless(
|
|
212
219
|
File.file?(File.join(d, 'install-galaaz.sh')) &&
|
|
213
220
|
File.file?(File.join(d, OMARCHY_MENU_FILE)) &&
|
|
214
|
-
File.file?(File.join(d, OMARCHY_FONT_REL))
|
|
221
|
+
File.file?(File.join(d, OMARCHY_FONT_REL)) &&
|
|
222
|
+
File.file?(File.join(d, OMARCHY_MERGED_FONT_REL)),
|
|
215
223
|
"incomplete Omarchy overlay in gem (#{d})"
|
|
216
224
|
)
|
|
217
225
|
d
|
|
@@ -222,7 +230,7 @@ module Galaaz
|
|
|
222
230
|
tmp = Dir.mktmpdir('galaaz-omarchy-')
|
|
223
231
|
base = "https://raw.githubusercontent.com/#{OMARCHY_GITHUB_REPO}/#{ref}/script/omarchy"
|
|
224
232
|
puts "galaaz omarchy: fetching #{base}/…"
|
|
225
|
-
names = OMARCHY_BIN_FILES.map(&:first) + [OMARCHY_MENU_FILE, OMARCHY_FONT_REL]
|
|
233
|
+
names = OMARCHY_BIN_FILES.map(&:first) + [OMARCHY_MENU_FILE, OMARCHY_FONT_REL, OMARCHY_MERGED_FONT_REL]
|
|
226
234
|
names.uniq.each do |name|
|
|
227
235
|
url = "#{base}/#{name}"
|
|
228
236
|
dest = File.join(tmp, name)
|
|
@@ -262,18 +270,53 @@ module Galaaz
|
|
|
262
270
|
end
|
|
263
271
|
|
|
264
272
|
def install_omarchy_font_from!(src_dir)
|
|
273
|
+
# 1) Standalone galaaz.ttf (family galaaz) — debugging / fc-list checks.
|
|
265
274
|
src = File.join(src_dir, OMARCHY_FONT_REL)
|
|
266
275
|
abort_unless(File.file?(src), "missing #{src} (rebuild with logos/icon-font/build_font.py)")
|
|
267
276
|
fonts = File.expand_path('~/.local/share/fonts/galaaz')
|
|
268
277
|
FileUtils.mkdir_p(fonts)
|
|
269
278
|
dest = File.join(fonts, 'galaaz.ttf')
|
|
270
279
|
FileUtils.cp(src, dest)
|
|
271
|
-
puts "galaaz omarchy: #{dest} (family
|
|
280
|
+
puts "galaaz omarchy: #{dest} (family galaaz, debug)"
|
|
281
|
+
|
|
282
|
+
# 2) Merged Omarchy brand font with Galaaz at U+E90E. Menu uses
|
|
283
|
+
# iconFont "omarchy" — the same family Cursor/Grok icons use, which Qt
|
|
284
|
+
# already loads. A custom family "galaaz" alone shows missing-glyph tofu.
|
|
285
|
+
merged_src = File.join(src_dir, OMARCHY_MERGED_FONT_REL)
|
|
286
|
+
abort_unless(
|
|
287
|
+
File.file?(merged_src),
|
|
288
|
+
"missing #{merged_src} (rebuild with logos/icon-font/build_font.py)"
|
|
289
|
+
)
|
|
290
|
+
# Prefer user font over /usr/share/fonts/**/omarchy.ttf
|
|
291
|
+
user_fonts = File.expand_path('~/.local/share/fonts')
|
|
292
|
+
FileUtils.mkdir_p(user_fonts)
|
|
293
|
+
merged_dest = File.join(user_fonts, 'omarchy-with-galaaz.ttf')
|
|
294
|
+
FileUtils.cp(merged_src, merged_dest)
|
|
295
|
+
puts "galaaz omarchy: #{merged_dest} (family #{OMARCHY_MENU_FONT_FAMILY}, U+#{OMARCHY_MENU_CODEPOINT.to_s(16).upcase})"
|
|
296
|
+
|
|
297
|
+
conf_dir = File.expand_path('~/.config/fontconfig/conf.d')
|
|
298
|
+
FileUtils.mkdir_p(conf_dir)
|
|
299
|
+
conf = File.join(conf_dir, '99-galaaz-omarchy-brand.conf')
|
|
300
|
+
File.write(conf, <<~XML)
|
|
301
|
+
<?xml version="1.0"?>
|
|
302
|
+
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
|
303
|
+
<fontconfig>
|
|
304
|
+
<!-- Prefer Galaaz-extended Omarchy brand font (adds U+E90E). -->
|
|
305
|
+
<selectfont>
|
|
306
|
+
<rejectfont>
|
|
307
|
+
<glob>*/omarchy/omarchy.ttf</glob>
|
|
308
|
+
</rejectfont>
|
|
309
|
+
</selectfont>
|
|
310
|
+
</fontconfig>
|
|
311
|
+
XML
|
|
312
|
+
puts "galaaz omarchy: #{conf}"
|
|
313
|
+
|
|
272
314
|
if command_present?('fc-cache')
|
|
273
315
|
system('fc-cache', '-r')
|
|
274
316
|
system('fc-cache', '-f', fonts)
|
|
317
|
+
system('fc-cache', '-f', user_fonts)
|
|
275
318
|
end
|
|
276
|
-
warn 'galaaz omarchy: restart the Omarchy shell
|
|
319
|
+
warn 'galaaz omarchy: fully restart the Omarchy shell (logout/login or kill omarchy-shell) so Qt reloads fonts' \
|
|
277
320
|
if ENV['OMARCHY_PATH'] || File.directory?(File.expand_path('~/.config/omarchy'))
|
|
278
321
|
end
|
|
279
322
|
|
data/logos/icon-font/README.md
CHANGED
|
@@ -4,9 +4,12 @@ Private TrueType font (`family: galaaz`) with one private-use glyph:
|
|
|
4
4
|
|
|
5
5
|
| Codepoint | Name | Role |
|
|
6
6
|
|-----------|------|------|
|
|
7
|
-
| `U+
|
|
7
|
+
| `U+E90E` | `galaaz` | R + gem in **family omarchy** (`omarchy-with-galaaz.ttf`) |
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Menu rows must use `"iconFont": "omarchy"` (not `"galaaz"`). Qt already loads
|
|
10
|
+
the Omarchy brand family; a custom family alone renders as missing-glyph tofu.
|
|
11
|
+
|
|
12
|
+
Do **not** reuse `U+E900`–`U+E90D` — Omarchy's private font already maps those
|
|
10
13
|
(waybar logo is `\ue900`).
|
|
11
14
|
|
|
12
15
|
## Sources
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Build
|
|
2
|
+
"""Build Galaaz Omarchy menu fonts from logos/icon-font/galaaz-mark.svg.
|
|
3
|
+
|
|
4
|
+
Produces:
|
|
5
|
+
script/omarchy/fonts/galaaz.ttf
|
|
6
|
+
Standalone family "galaaz" (previews / debugging).
|
|
7
|
+
script/omarchy/fonts/omarchy-with-galaaz.ttf
|
|
8
|
+
Omarchy brand font + Galaaz glyph at U+E90E (family still "omarchy").
|
|
9
|
+
Menu rows must use iconFont "omarchy" — Qt already loads that family.
|
|
10
|
+
"""
|
|
3
11
|
from __future__ import annotations
|
|
4
12
|
|
|
5
13
|
import re
|
|
6
14
|
import sys
|
|
15
|
+
import urllib.request
|
|
7
16
|
from pathlib import Path
|
|
8
17
|
|
|
9
18
|
from fontTools.fontBuilder import FontBuilder
|
|
@@ -17,11 +26,17 @@ from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates
|
|
|
17
26
|
ROOT = Path(__file__).resolve().parents[2]
|
|
18
27
|
SVG = ROOT / "logos" / "icon-font" / "galaaz-mark.svg"
|
|
19
28
|
OUT = ROOT / "script" / "omarchy" / "fonts" / "galaaz.ttf"
|
|
29
|
+
OUT_MERGED = ROOT / "script" / "omarchy" / "fonts" / "omarchy-with-galaaz.ttf"
|
|
20
30
|
PREVIEW_DIR = ROOT / "logos" / "icon-font" / "preview"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
OMARCHY_TTF_URL = (
|
|
32
|
+
"https://raw.githubusercontent.com/basecamp/omarchy/quattro/"
|
|
33
|
+
"default/fonts/omarchy/omarchy.ttf"
|
|
34
|
+
)
|
|
35
|
+
# Standalone family uses E920 (outside Omarchy E900–E90D).
|
|
36
|
+
STANDALONE_CODEPOINT = 0xE920
|
|
37
|
+
# Merged into family "omarchy" at first free slot after Omarchy's E90D.
|
|
38
|
+
OMARCHY_CODEPOINT = 0xE90E
|
|
39
|
+
GLYPH_NAME = "galaaz"
|
|
25
40
|
MIN_HOLE_AREA_RATIO = 0.04
|
|
26
41
|
|
|
27
42
|
|
|
@@ -57,7 +72,6 @@ def fix_hole_windings(glyph: TTGlyph) -> None:
|
|
|
57
72
|
pts = coords[start : end + 1]
|
|
58
73
|
fl = flags[start : end + 1]
|
|
59
74
|
area = signed_area(pts)
|
|
60
|
-
# Contour 0 = outer (CW); contour 1 = gem hole (CCW). Extra contours = CW fills.
|
|
61
75
|
want_cw = i != 1
|
|
62
76
|
is_cw = area < 0
|
|
63
77
|
if want_cw != is_cw:
|
|
@@ -73,8 +87,41 @@ def fix_hole_windings(glyph: TTGlyph) -> None:
|
|
|
73
87
|
glyph.numberOfContours = len(new_ends)
|
|
74
88
|
|
|
75
89
|
|
|
76
|
-
def
|
|
77
|
-
|
|
90
|
+
def build_glyph() -> TTGlyph:
|
|
91
|
+
d = extract_path_d(SVG.read_text(encoding="utf-8"))
|
|
92
|
+
transform = Transform(1, 0, 0, -1, 0, 1000)
|
|
93
|
+
pen = TTGlyphPen(glyphSet=None)
|
|
94
|
+
SVGPath.fromstring(
|
|
95
|
+
f'<path d="{d}" fill-rule="evenodd"/>', transform=transform
|
|
96
|
+
).draw(pen)
|
|
97
|
+
glyph = pen.glyph()
|
|
98
|
+
fix_hole_windings(glyph)
|
|
99
|
+
return glyph
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def assert_hole_ok(glyph: TTGlyph) -> None:
|
|
103
|
+
coords = list(glyph.coordinates)
|
|
104
|
+
ends = list(glyph.endPtsOfContours)
|
|
105
|
+
start = 0
|
|
106
|
+
areas = []
|
|
107
|
+
for i, end in enumerate(ends):
|
|
108
|
+
pts = coords[start : end + 1]
|
|
109
|
+
a = signed_area(pts)
|
|
110
|
+
areas.append(a)
|
|
111
|
+
print(f" contour {i}: {'CW' if a < 0 else 'CCW'} area={a:.0f}")
|
|
112
|
+
start = end + 1
|
|
113
|
+
if len(areas) < 2:
|
|
114
|
+
raise SystemExit("expected outer + gem hole contours")
|
|
115
|
+
ratio = abs(areas[1]) / abs(areas[0]) if areas[0] else 0.0
|
|
116
|
+
print(f" hole/outer area ratio: {ratio:.3f} (min {MIN_HOLE_AREA_RATIO})")
|
|
117
|
+
if ratio < MIN_HOLE_AREA_RATIO:
|
|
118
|
+
raise SystemExit(
|
|
119
|
+
f"gem cutout too small for menu size ({ratio:.3f} < {MIN_HOLE_AREA_RATIO}); "
|
|
120
|
+
"enlarge the hole in galaaz-mark.svg"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def write_previews(ttf_path: Path, codepoint: int) -> None:
|
|
78
125
|
try:
|
|
79
126
|
from PIL import Image, ImageDraw, ImageFont
|
|
80
127
|
except ImportError:
|
|
@@ -87,7 +134,7 @@ def write_previews(ttf_path: Path) -> None:
|
|
|
87
134
|
img = Image.new("RGBA", (canvas, canvas), (30, 30, 30, 255))
|
|
88
135
|
draw = ImageDraw.Draw(img)
|
|
89
136
|
font = ImageFont.truetype(str(ttf_path), size)
|
|
90
|
-
ch = chr(
|
|
137
|
+
ch = chr(codepoint)
|
|
91
138
|
bbox = draw.textbbox((0, 0), ch, font=font)
|
|
92
139
|
w, h = bbox[2] - bbox[0], bbox[3] - bbox[1]
|
|
93
140
|
x = (canvas - w) // 2 - bbox[0]
|
|
@@ -98,22 +145,12 @@ def write_previews(ttf_path: Path) -> None:
|
|
|
98
145
|
print(f" preview: {out}")
|
|
99
146
|
|
|
100
147
|
|
|
101
|
-
def
|
|
102
|
-
d = extract_path_d(SVG.read_text(encoding="utf-8"))
|
|
103
|
-
transform = Transform(1, 0, 0, -1, 0, 1000)
|
|
104
|
-
|
|
105
|
-
pen = TTGlyphPen(glyphSet=None)
|
|
106
|
-
SVGPath.fromstring(
|
|
107
|
-
f'<path d="{d}" fill-rule="evenodd"/>', transform=transform
|
|
108
|
-
).draw(pen)
|
|
109
|
-
glyph = pen.glyph()
|
|
110
|
-
fix_hole_windings(glyph)
|
|
111
|
-
|
|
148
|
+
def build_standalone(glyph: TTGlyph) -> None:
|
|
112
149
|
fb = FontBuilder(1000, isTTF=True)
|
|
113
|
-
fb.setupGlyphOrder([".notdef",
|
|
114
|
-
fb.setupCharacterMap({
|
|
115
|
-
fb.setupGlyf({".notdef": TTGlyph(),
|
|
116
|
-
fb.setupHorizontalMetrics({".notdef": (600, 0),
|
|
150
|
+
fb.setupGlyphOrder([".notdef", GLYPH_NAME])
|
|
151
|
+
fb.setupCharacterMap({STANDALONE_CODEPOINT: GLYPH_NAME})
|
|
152
|
+
fb.setupGlyf({".notdef": TTGlyph(), GLYPH_NAME: glyph})
|
|
153
|
+
fb.setupHorizontalMetrics({".notdef": (600, 0), GLYPH_NAME: (1000, 0)})
|
|
117
154
|
fb.setupHorizontalHeader(ascent=1000, descent=0)
|
|
118
155
|
fb.setupOS2(
|
|
119
156
|
sTypoAscender=1000,
|
|
@@ -129,43 +166,87 @@ def main() -> int:
|
|
|
129
166
|
{
|
|
130
167
|
"familyName": "galaaz",
|
|
131
168
|
"styleName": "Regular",
|
|
132
|
-
"uniqueFontIdentifier": "galaaz
|
|
133
|
-
"fullName": "galaaz
|
|
134
|
-
"psName": "galaaz
|
|
135
|
-
"version": "Version 1.
|
|
169
|
+
"uniqueFontIdentifier": "galaaz",
|
|
170
|
+
"fullName": "galaaz",
|
|
171
|
+
"psName": "galaaz",
|
|
172
|
+
"version": "Version 1.003",
|
|
136
173
|
"manufacturer": "Galaaz",
|
|
137
|
-
"description": "
|
|
174
|
+
"description": "Standalone Galaaz mark (U+E920). Menu uses omarchy-with-galaaz.ttf.",
|
|
138
175
|
}
|
|
139
176
|
)
|
|
140
177
|
OUT.parent.mkdir(parents=True, exist_ok=True)
|
|
141
178
|
fb.save(OUT)
|
|
179
|
+
assert TTFont(OUT).getBestCmap().get(STANDALONE_CODEPOINT) == GLYPH_NAME
|
|
180
|
+
print(f"wrote {OUT} glyph U+{STANDALONE_CODEPOINT:04X} family=galaaz")
|
|
181
|
+
write_previews(OUT, STANDALONE_CODEPOINT)
|
|
142
182
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
183
|
+
|
|
184
|
+
def scale_glyph(glyph: TTGlyph, factor: float) -> TTGlyph:
|
|
185
|
+
if glyph.numberOfContours <= 0:
|
|
186
|
+
return glyph
|
|
187
|
+
coords = GlyphCoordinates(list(glyph.coordinates))
|
|
188
|
+
coords.scale((factor, factor))
|
|
189
|
+
glyph.coordinates = coords
|
|
190
|
+
if hasattr(glyph, "xMin"):
|
|
191
|
+
glyph.recalcBounds(glyph)
|
|
192
|
+
return glyph
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def fetch_omarchy_ttf() -> Path:
|
|
196
|
+
cache = Path("/tmp/omarchy-brand.ttf")
|
|
197
|
+
if cache.is_file() and cache.stat().st_size > 1000:
|
|
198
|
+
return cache
|
|
199
|
+
print(f" fetching {OMARCHY_TTF_URL}")
|
|
200
|
+
urllib.request.urlretrieve(OMARCHY_TTF_URL, cache)
|
|
201
|
+
return cache
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def build_merged(glyph_1000: TTGlyph) -> None:
|
|
205
|
+
from copy import deepcopy
|
|
206
|
+
|
|
207
|
+
base_path = fetch_omarchy_ttf()
|
|
208
|
+
base = TTFont(str(base_path))
|
|
209
|
+
upem = base["head"].unitsPerEm
|
|
210
|
+
glyph = deepcopy(glyph_1000)
|
|
211
|
+
scale = upem / 1000.0
|
|
212
|
+
if scale != 1.0:
|
|
213
|
+
scale_glyph(glyph, scale)
|
|
214
|
+
advance = int(round(1000 * scale))
|
|
215
|
+
|
|
216
|
+
order = list(base.getGlyphOrder())
|
|
217
|
+
if GLYPH_NAME in order:
|
|
218
|
+
order.remove(GLYPH_NAME)
|
|
219
|
+
order.append(GLYPH_NAME)
|
|
220
|
+
base.setGlyphOrder(order)
|
|
221
|
+
base["glyf"][GLYPH_NAME] = glyph
|
|
222
|
+
base["hmtx"][GLYPH_NAME] = (advance, 0)
|
|
223
|
+
|
|
224
|
+
for table in base["cmap"].tables:
|
|
225
|
+
if table.isUnicode():
|
|
226
|
+
table.cmap[OMARCHY_CODEPOINT] = GLYPH_NAME
|
|
227
|
+
|
|
228
|
+
for rec in base["name"].names:
|
|
229
|
+
if rec.nameID == 5: # version
|
|
230
|
+
rec.string = "Version 1.2+galaaz"
|
|
231
|
+
if rec.nameID == 3: # unique
|
|
232
|
+
rec.string = "omarchy+galaaz"
|
|
233
|
+
|
|
234
|
+
OUT_MERGED.parent.mkdir(parents=True, exist_ok=True)
|
|
235
|
+
base.save(OUT_MERGED)
|
|
236
|
+
merged = TTFont(OUT_MERGED)
|
|
237
|
+
assert merged.getBestCmap().get(OMARCHY_CODEPOINT) == GLYPH_NAME
|
|
238
|
+
assert merged["name"].getDebugName(1) == "omarchy"
|
|
239
|
+
print(
|
|
240
|
+
f"wrote {OUT_MERGED} glyph U+{OMARCHY_CODEPOINT:04X} family=omarchy "
|
|
241
|
+
f"(from {base_path.name}, upem={upem})"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def main() -> int:
|
|
246
|
+
glyph = build_glyph()
|
|
247
|
+
assert_hole_ok(glyph)
|
|
248
|
+
build_standalone(glyph)
|
|
249
|
+
build_merged(glyph)
|
|
169
250
|
return 0
|
|
170
251
|
|
|
171
252
|
|
data/script/omarchy/README.md
CHANGED
|
@@ -31,7 +31,8 @@ Then Super+Space → Install → Development → **Galaaz**.
|
|
|
31
31
|
| `debug-galaaz.sh` | Snapshot doctor/PATH/gem/bridge |
|
|
32
32
|
| `remove-galaaz.sh` | Uninstall gem + marked blogs; leave R |
|
|
33
33
|
| `omarchy-menu.jsonc` | Menu overlay submenu under Install → Development |
|
|
34
|
-
| `fonts/galaaz.ttf` |
|
|
34
|
+
| `fonts/galaaz.ttf` | Standalone family `galaaz` (debug/previews) |
|
|
35
|
+
| `fonts/omarchy-with-galaaz.ttf` | Omarchy brand font + Galaaz at U+E90E (`iconFont: omarchy`) |
|
|
35
36
|
|
|
36
37
|
Menu rows use the Galaaz icon font (not the Ruby-on-Rails Nerd Font gem). Source SVG
|
|
37
38
|
and rebuild script live under `logos/icon-font/`.
|
|
Binary file
|
|
Binary file
|
|
@@ -276,12 +276,30 @@ if [[ -f "${SCRIPT_DIR}/omarchy-menu.jsonc" ]]; then
|
|
|
276
276
|
cp "${SCRIPT_DIR}/omarchy-menu.jsonc" "${HOME}/.config/omarchy/extensions/omarchy-menu.jsonc"
|
|
277
277
|
fi
|
|
278
278
|
if [[ -f "${SCRIPT_DIR}/fonts/galaaz.ttf" ]]; then
|
|
279
|
+
mkdir -p "${HOME}/.local/share/fonts/galaaz"
|
|
279
280
|
cp "${SCRIPT_DIR}/fonts/galaaz.ttf" "${HOME}/.local/share/fonts/galaaz/galaaz.ttf"
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
281
|
+
log "menu font (debug family galaaz): ${HOME}/.local/share/fonts/galaaz/galaaz.ttf"
|
|
282
|
+
fi
|
|
283
|
+
if [[ -f "${SCRIPT_DIR}/fonts/omarchy-with-galaaz.ttf" ]]; then
|
|
284
|
+
mkdir -p "${HOME}/.local/share/fonts" "${HOME}/.config/fontconfig/conf.d"
|
|
285
|
+
cp "${SCRIPT_DIR}/fonts/omarchy-with-galaaz.ttf" "${HOME}/.local/share/fonts/omarchy-with-galaaz.ttf"
|
|
286
|
+
cat >"${HOME}/.config/fontconfig/conf.d/99-galaaz-omarchy-brand.conf" <<'XML'
|
|
287
|
+
<?xml version="1.0"?>
|
|
288
|
+
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
|
289
|
+
<fontconfig>
|
|
290
|
+
<!-- Prefer Galaaz-extended Omarchy brand font (adds U+E90E). -->
|
|
291
|
+
<selectfont>
|
|
292
|
+
<rejectfont>
|
|
293
|
+
<glob>*/omarchy/omarchy.ttf</glob>
|
|
294
|
+
</rejectfont>
|
|
295
|
+
</selectfont>
|
|
296
|
+
</fontconfig>
|
|
297
|
+
XML
|
|
298
|
+
log "menu font (family omarchy + U+E90E): ${HOME}/.local/share/fonts/omarchy-with-galaaz.ttf"
|
|
299
|
+
fi
|
|
300
|
+
if command -v fc-cache >/dev/null 2>&1; then
|
|
301
|
+
fc-cache -r >/dev/null 2>&1 || true
|
|
302
|
+
fc-cache -f "${HOME}/.local/share/fonts" >/dev/null 2>&1 || true
|
|
285
303
|
fi
|
|
286
304
|
cp "${BASH_SOURCE[0]}" "${HOME}/.local/bin/omarchy-install-galaaz"
|
|
287
305
|
chmod +x "${HOME}/.local/bin/omarchy-install-galaaz"
|
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
// Use ~/.local/bin/galaaz (installer wrapper). Do not quote the whole
|
|
6
6
|
// "galaaz add …" as one word — omarchy-launch-tui then does nothing useful.
|
|
7
7
|
//
|
|
8
|
-
// Brand mark: U+
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
8
|
+
// Brand mark: U+E90E in family "omarchy" (same iconFont Cursor/Grok use).
|
|
9
|
+
// Omarchy's stock font owns E900–E90D; we ship omarchy-with-galaaz.ttf which
|
|
10
|
+
// is that font plus our R+gem at E90E, installed to
|
|
11
|
+
// ~/.local/share/fonts/omarchy-with-galaaz.ttf. A separate family "galaaz"
|
|
12
|
+
// alone shows missing-glyph tofu in Qt — do not use iconFont "galaaz" here.
|
|
13
13
|
|
|
14
14
|
"install.development.galaaz": {
|
|
15
|
-
"icon": "\
|
|
16
|
-
"iconFont": "
|
|
15
|
+
"icon": "\uE90E",
|
|
16
|
+
"iconFont": "omarchy",
|
|
17
17
|
"label": "Galaaz",
|
|
18
18
|
"description": "R on Rails"
|
|
19
19
|
},
|
|
20
20
|
"install.development.galaaz.core": {
|
|
21
|
-
"icon": "\
|
|
22
|
-
"iconFont": "
|
|
21
|
+
"icon": "\uE90E",
|
|
22
|
+
"iconFont": "omarchy",
|
|
23
23
|
"label": "Galaaz (core)",
|
|
24
24
|
"description": "gem + setup + blogs (not just gem install)",
|
|
25
25
|
"action": "omarchy-launch-tui omarchy-install-galaaz",
|
|
@@ -47,45 +47,45 @@
|
|
|
47
47
|
"when": "test -f ~/.config/galaaz/profiles/core"
|
|
48
48
|
},
|
|
49
49
|
"install.development.galaaz.knit": {
|
|
50
|
-
"icon": "\
|
|
51
|
-
"iconFont": "
|
|
50
|
+
"icon": "\uE90E",
|
|
51
|
+
"iconFont": "omarchy",
|
|
52
52
|
"label": "Knit (HTML + PDF blogs)",
|
|
53
53
|
"description": "pandoc + knitr/rmarkdown + TinyTeX",
|
|
54
54
|
"action": "omarchy-launch-tui omarchy-galaaz-add knit",
|
|
55
55
|
"disabled": "test -f ~/.config/galaaz/profiles/knit"
|
|
56
56
|
},
|
|
57
57
|
"install.development.galaaz.arrow": {
|
|
58
|
-
"icon": "\
|
|
59
|
-
"iconFont": "
|
|
58
|
+
"icon": "\uE90E",
|
|
59
|
+
"iconFont": "omarchy",
|
|
60
60
|
"label": "Arrow",
|
|
61
61
|
"action": "omarchy-launch-tui omarchy-galaaz-add arrow",
|
|
62
62
|
"disabled": "test -f ~/.config/galaaz/profiles/arrow"
|
|
63
63
|
},
|
|
64
64
|
"install.development.galaaz.bio": {
|
|
65
|
-
"icon": "\
|
|
66
|
-
"iconFont": "
|
|
65
|
+
"icon": "\uE90E",
|
|
66
|
+
"iconFont": "omarchy",
|
|
67
67
|
"label": "Bioconductor (DESeq2)",
|
|
68
68
|
"action": "omarchy-launch-tui omarchy-galaaz-add bio",
|
|
69
69
|
"disabled": "test -f ~/.config/galaaz/profiles/bio"
|
|
70
70
|
},
|
|
71
71
|
"install.development.galaaz.examples": {
|
|
72
|
-
"icon": "\
|
|
73
|
-
"iconFont": "
|
|
72
|
+
"icon": "\uE90E",
|
|
73
|
+
"iconFont": "omarchy",
|
|
74
74
|
"label": "Examples",
|
|
75
75
|
"action": "omarchy-launch-tui omarchy-galaaz-add examples",
|
|
76
76
|
"disabled": "test -f ~/.config/galaaz/profiles/examples"
|
|
77
77
|
},
|
|
78
78
|
"install.development.galaaz.ledger": {
|
|
79
|
-
"icon": "\
|
|
80
|
-
"iconFont": "
|
|
79
|
+
"icon": "\uE90E",
|
|
80
|
+
"iconFont": "omarchy",
|
|
81
81
|
"label": "Ledger (R-on-Rails demo)",
|
|
82
82
|
"description": "Clone app, seed, bin/dev",
|
|
83
83
|
"action": "omarchy-launch-tui omarchy-galaaz-add ledger",
|
|
84
84
|
"disabled": "test -f ~/.config/galaaz/profiles/ledger"
|
|
85
85
|
},
|
|
86
86
|
"remove.development.galaaz": {
|
|
87
|
-
"icon": "\
|
|
88
|
-
"iconFont": "
|
|
87
|
+
"icon": "\uE90E",
|
|
88
|
+
"iconFont": "omarchy",
|
|
89
89
|
"label": "Galaaz",
|
|
90
90
|
"description": "Core gem (add-on R packages stay)",
|
|
91
91
|
"action": "omarchy-launch-tui omarchy-remove-galaaz"
|
data/version.rb
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
$gem_name = "galaaz"
|
|
2
|
-
$version="2.1.10.pre.
|
|
2
|
+
$version="2.1.10.pre.5"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: galaaz
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.1.10.pre.
|
|
4
|
+
version: 2.1.10.pre.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rodrigo Botafogo
|
|
@@ -444,6 +444,7 @@ files:
|
|
|
444
444
|
- script/omarchy/README.md
|
|
445
445
|
- script/omarchy/debug-galaaz.sh
|
|
446
446
|
- script/omarchy/fonts/galaaz.ttf
|
|
447
|
+
- script/omarchy/fonts/omarchy-with-galaaz.ttf
|
|
447
448
|
- script/omarchy/galaaz-add.sh
|
|
448
449
|
- script/omarchy/galaaz-gknit.sh
|
|
449
450
|
- script/omarchy/galaaz-guide.sh
|