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