diff --git a/unix/CMakeLists.txt b/unix/CMakeLists.txt index 1684e2ce..9300bcb7 100644 --- a/unix/CMakeLists.txt +++ b/unix/CMakeLists.txt @@ -22,7 +22,7 @@ list(APPEND _LIBUI_SOURCES unix/drawtext.c unix/editablecombo.c unix/entry.c -# unix/fontbutton.c + unix/fontbutton.c unix/form.c unix/future.c unix/graphemes.c diff --git a/unix/drawtext.c b/unix/drawtext.c index 175403ad..4cbe3c71 100644 --- a/unix/drawtext.c +++ b/unix/drawtext.c @@ -280,3 +280,25 @@ void caretDrawParams(uiDrawContext *c, double height, struct caretDrawParams *p) p->xoff = xoff; p->width = width; } + +// TODO split this and the other font description stuff into their own file? +void fontdescFromPangoFontDescription(PangoFontDescription *pdesc, uiDrawFontDescriptor *uidesc) +{ + PangoStyle pitalic; + PangoStretch pstretch; + + uidesc->Family = uiUnixStrdupText(pango_font_description_get_family(pdesc)); + pitalic = pango_font_description_get_style(pdesc); + // TODO reverse the above misalignment if it is corrected + uidesc->Weight = pango_font_description_get_weight(pdesc); + pstretch = pango_font_description_get_stretch(pdesc); + // absolute size does not matter because, as above, 1 device unit == 1 cairo point + uidesc->Size = pango_units_to_double(pango_font_description_get_size(pdesc)); + + for (uidesc->Italic = uiDrawTextItalicNormal; uidesc->Italic < uiDrawTextItalicItalic; uidesc->Italic++) + if (pangoItalics[uidesc->Italic] == pitalic) + break; + for (uidesc->Stretch = uiDrawTextStretchUltraCondensed; uidesc->Stretch < uiDrawTextStretchUltraExpanded; uidesc->Stretch++) + if (pangoStretches[uidesc->Stretch] == pstretch) + break; +} diff --git a/unix/fontbutton.c b/unix/fontbutton.c index f8047e08..9a2552b1 100644 --- a/unix/fontbutton.c +++ b/unix/fontbutton.c @@ -26,16 +26,14 @@ static void defaultOnChanged(uiFontButton *b, void *data) // do nothing } -uiDrawTextFont *uiFontButtonFont(uiFontButton *b) +void uiFontButtonFont(uiFontButton *b, uiDrawFontDescriptor *desc) { - PangoFont *f; - PangoFontDescription *desc; + PangoFontDescription *pdesc; - desc = gtk_font_chooser_get_font_desc(b->fc); - f = pangoDescToPangoFont(desc); + pdesc = gtk_font_chooser_get_font_desc(b->fc); + fontdescFromPangoFontDescription(pdesc, desc); // desc is transfer-full and thus is a copy - pango_font_description_free(desc); - return mkTextFont(f, FALSE); // we hold the initial reference; no need to ref + pango_font_description_free(pdesc); } void uiFontButtonOnChanged(uiFontButton *b, void (*f)(uiFontButton *, void *), void *data) diff --git a/unix/uipriv_unix.h b/unix/uipriv_unix.h index 3764f8ef..aaae8b34 100644 --- a/unix/uipriv_unix.h +++ b/unix/uipriv_unix.h @@ -45,12 +45,6 @@ extern void childSetMargined(struct child *c, int margined); extern uiDrawContext *newContext(cairo_t *cr, GtkStyleContext *style); extern void freeContext(uiDrawContext *); -// drawtext.c -#if 0 /* TODO */ -extern uiDrawTextFont *mkTextFont(PangoFont *f, gboolean add); -extern PangoFont *pangoDescToPangoFont(PangoFontDescription *pdesc); -#endif - // image.c /*TODO remove this*/typedef struct uiImage uiImage; extern cairo_surface_t *imageAppropriateSurface(uiImage *i, GtkWidget *w); @@ -62,3 +56,6 @@ extern GtkCellRenderer *newCellRendererButton(void); extern void loadFutures(void); extern PangoAttribute *FUTURE_pango_attr_foreground_alpha_new(guint16 alpha); extern gboolean FUTURE_gtk_widget_path_iter_set_object_name(GtkWidgetPath *path, gint pos, const char *name); + +// drawtext.c +extern void fontdescFromPangoFontDescription(PangoFontDescription *pdesc, uiDrawFontDescriptor *uidesc);