// 14 april 2016 #include "uipriv_unix.h" #include "attrstr.h" struct uiFontButton { uiUnixControl c; GtkWidget *widget; GtkButton *button; GtkFontButton *fb; GtkFontChooser *fc; void (*onChanged)(uiFontButton *, void *); void *onChangedData; }; uiUnixControlAllDefaults(uiFontButton) // TODO NOTE no need to inhibit the signal; font-set is documented as only being sent when the user changes the font static void onFontSet(GtkFontButton *button, gpointer data) { uiFontButton *b = uiFontButton(data); (*(b->onChanged))(b, b->onChangedData); } static void defaultOnChanged(uiFontButton *b, void *data) { // do nothing } void uiFontButtonFont(uiFontButton *b, uiFontDescriptor *desc) { PangoFontDescription *pdesc; pdesc = gtk_font_chooser_get_font_desc(b->fc); uiprivFontDescriptorFromPangoFontDescription(pdesc, desc); // pdesc is transfer-full and thus is a copy pango_font_description_free(pdesc); } void uiFontButtonOnChanged(uiFontButton *b, void (*f)(uiFontButton *, void *), void *data) { b->onChanged = f; b->onChangedData = data; } uiFontButton *uiNewFontButton(void) { uiFontButton *b; uiUnixNewControl(uiFontButton, b); b->widget = gtk_font_button_new(); b->button = GTK_BUTTON(b->widget); b->fb = GTK_FONT_BUTTON(b->widget); b->fc = GTK_FONT_CHOOSER(b->widget); // match behavior on other platforms gtk_font_button_set_show_style(b->fb, TRUE); gtk_font_button_set_show_size(b->fb, TRUE); gtk_font_button_set_use_font(b->fb, FALSE); gtk_font_button_set_use_size(b->fb, FALSE); // other customizations gtk_font_chooser_set_show_preview_entry(b->fc, TRUE); g_signal_connect(b->widget, "font-set", G_CALLBACK(onFontSet), b); uiFontButtonOnChanged(b, defaultOnChanged, NULL); return b; } void uiFreeFontButtonFont(uiFontDescriptor *desc) { // TODO ensure this is synchronized with fontmatch.c uiFreeText((char *) (desc->Family)); }