diff options
Diffstat (limited to 'src/libui_sdl/libui/unix/fontbutton.c')
-rw-r--r-- | src/libui_sdl/libui/unix/fontbutton.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/unix/fontbutton.c b/src/libui_sdl/libui/unix/fontbutton.c new file mode 100644 index 0000000..f8047e0 --- /dev/null +++ b/src/libui_sdl/libui/unix/fontbutton.c @@ -0,0 +1,70 @@ +// 14 april 2016 +#include "uipriv_unix.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 +} + +uiDrawTextFont *uiFontButtonFont(uiFontButton *b) +{ + PangoFont *f; + PangoFontDescription *desc; + + desc = gtk_font_chooser_get_font_desc(b->fc); + f = pangoDescToPangoFont(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 +} + +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; +} |