#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include #include "glib-2.0/gio/gio.h" FcConfig *old_system_config = NULL; void exd_fileformat_fontconfig__set_current_c(SV *self, char *font_dir) { if (old_system_config == NULL) { old_system_config = FcConfigGetCurrent(); } FcConfig *new_config = FcConfigCreate(); FcConfigAppFontAddDir(new_config, font_dir); FcConfigBuildFonts(new_config); FcConfigSetCurrent(new_config); } AV * exd_fileformat_fontconfig__list_fonts_c(SV *self, char *font_dir) { AV *return_array = newAV(); FcConfig *config = FcConfigCreate(); FcConfigAppFontAddDir(config, font_dir); FcConfigBuildFonts(config); FcFontSet *fonts = FcConfigGetFonts(config, FcSetApplication); if (fonts == NULL) { return return_array; } for (int i = 0; i < fonts->nfont; i++) { FcPattern *pattern = fonts->fonts[i]; FcChar8 *family; FcChar8 *style; FcChar8 *file; FcPatternGetString(pattern, FC_FAMILY, 0, &family); FcPatternGetString(pattern, FC_STYLE, 0, &style); FcPatternGetString(pattern, FC_FILE, 0, &file); char *familyKey; HV *hash = newHV(); SV *hash_ref = newRV_noinc((SV *) hash); hv_stores(hash, "family", newSVpv(family, 0)); hv_stores(hash, "style", newSVpv(style, 0)); hv_stores(hash, "file", newSVpv(file, 0)); av_push(return_array, hash_ref); } return return_array; } AV * exd_fontconfig__list_fonts_c(SV *self) { AV *return_array = newAV(); FcConfig *config = FcConfigGetCurrent(); FcFontSet *fonts = FcConfigGetFonts(config, FcSetSystem); if (fonts == NULL) { return return_array; } for (int i = 0; i < fonts->nfont; i++) { FcPattern *pattern = fonts->fonts[i]; FcChar8 *family; FcChar8 *style; FcChar8 *file; FcPatternGetString(pattern, FC_FAMILY, 0, &family); FcPatternGetString(pattern, FC_STYLE, 0, &style); FcPatternGetString(pattern, FC_FILE, 0, &file); char *familyKey; HV *hash = newHV(); SV *hash_ref = newRV_noinc((SV *) hash); hv_stores(hash, "family", newSVpv(family, 0)); hv_stores(hash, "style", newSVpv(style, 0)); hv_stores(hash, "file", newSVpv(file, 0)); av_push(return_array, hash_ref); } return return_array; } void exd_gui__get_first_file(SV *class, size_t int_files) { dSP; ENTER; SAVETMPS; GFile *file = (((GFile **)int_files)[0]); char *path = g_file_get_path(file); PUSHMARK(SP); EXTEND(SP, 2); PUSHs(class); PUSHs(sv_2mortal(newSVpv(path, 0))); PUTBACK; call_pv("_activate", G_DISCARD); FREETMPS; LEAVE; } MODULE = Exd PACKAGE = Exd::FileFormat::Fontconfig PREFIX = exd_fileformat_fontconfig_ AV * exd_fileformat_fontconfig__list_fonts_c(SV *self, char *font_dir) void exd_fileformat_fontconfig__set_current_c(SV *self, char *font_dir) MODULE = Exd PACKAGE = Exd::Fontconfig PREFIX = exd_fontconfig_ AV * exd_fontconfig__list_fonts_c(SV *self) MODULE = Exd PACKAGE = Exd::Gui PREFIX = exd_gui_ void exd_gui__get_first_file(SV *class, size_t int_files) MODULE = Exd PACKAGE = Exd PREFIX = exd_