Hello Stewart, I didn't know how to answer your question, but I've found an implementation of the same call. See the send of #listFamilies:count: message in: https://github.com/pharo-spec/gtk-bindings/blob/9cda0f563023c68714c6c54e6c5f77f3c57b6c90/src/Pango/PangoFontMap.class.st#L53
Cheers, Martìn On Tue, Jan 25, 2022 at 7:36 AM Stewart MacLean <[email protected]> wrote: > > Hi, > > I'm trying to figure out how to implement code to retrieve a list of font > families using the Pango libraries. The key function definition is: > > https://docs.gtk.org/Pango/method.FontMap.list_families.html > > void > pango_font_map_list_families ( > PangoFontMap* fontmap, > PangoFontFamily*** families, > int* n_families > ) > > I've found some C code, which is shown below. The tricky bit is the ***. > I've managed to get this working in VisualWorks (code also below), but can't > figure out how to do this using the Pharo FFI. > > I've managed to get the basic Pango functionality going, but I can't figure > out how to use ExternalAddress to do this. Running on a MacMini M1. > > Any pointers (:)) appreciated! > > Thanks, > > Stew > > C Version > ---------------- > #include <glib.h> > #include <pango/pangocairo.h> > > static void > list_fonts () > { > int i; > PangoFontFamily ** families; > int n_families; > PangoFontMap * fontmap; > > fontmap = pango_cairo_font_map_get_default(); > pango_font_map_list_families (fontmap, & families, & n_families); > printf ("There are %d families\n", n_families); > for (i = 0; i < n_families; i++) { > PangoFontFamily * family = families[i]; > const char * family_name; > > family_name = pango_font_family_get_name (family); > printf ("Family %d: %s\n", i, family_name); > } > g_free (families); > } > > int main (int argc, char ** argv) > { > list_fonts (); > return 0; > } > > ================================= > VisualWorks Version > --------------------------- > availableFamilyNames > " > Transcript clear. > (FontFamily availableFamilyNames asSortedCollection: [: a : b | a < b]) do: > [: each | Transcript cr; show: each]. > > NamedFontSelector open > " > > "08/09/20 SIM. Modified to work on 64bit. > Clues obtained from: > XSurface class >>displaySurface: > DisplaySurface>>cairoVisual > PDFSurface class>>versions" > > | listPointer sizePointer ffPointers result | > > ObjectMemory is64Bit > ifTrue: > [listPointer := CIntegerType unsignedLongLong gcMalloc. > sizePointer := listPointer sizeof gcCopyToHeap] > ifFalse: > [listPointer := 0 gcCopyToHeap. > sizePointer := 0 gcCopyToHeap]. > > LibPango default > pango_font_map_list_families: LibPango default > pango_cairo_font_map_get_default > with: listPointer > with: sizePointer. > > ffPointers := > (ObjectMemory is64Bit > ifTrue: [CIntegerType unsignedLongLong] > ifFalse: [ CIntegerType unsignedInt]) > newPointerToAddress: listPointer contents. > > result := OrderedCollection new: sizePointer contents. > sizePointer contents timesRepeat: > [result > add: (LibPango default pango_font_family_get_name: ffPointers > contents) utf8. > ffPointers += 1]. > LibPango default g_free: listPointer contents. > ^result > >
