From 5eef409e6ada31031f29239c4d3ec4f4626dc7e8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 11 Mar 2015 01:19:05 -0400 Subject: Add a demo for OpenType font features gtk3-font-features is a simple application that lets you explore OpenType font features interactively. --- configure.ac | 1 + demos/Makefile.am | 2 +- demos/font-features/Makefile.am | 30 + demos/font-features/font-features.c | 186 ++++ demos/font-features/font-features.gresource.xml | 7 + demos/font-features/font-features.ui | 1346 +++++++++++++++++++++++ 6 files changed, 1571 insertions(+), 1 deletion(-) create mode 100644 demos/font-features/Makefile.am create mode 100644 demos/font-features/font-features.c create mode 100644 demos/font-features/font-features.gresource.xml create mode 100644 demos/font-features/font-features.ui diff --git a/configure.ac b/configure.ac index 6720d5296b..c7944a665e 100644 --- a/configure.ac +++ b/configure.ac @@ -1851,6 +1851,7 @@ demos/gtk-demo/Makefile demos/gtk-demo/geninclude.pl demos/widget-factory/Makefile demos/icon-browser/Makefile +demos/font-features/Makefile examples/Makefile examples/bp/Makefile examples/application1/Makefile diff --git a/demos/Makefile.am b/demos/Makefile.am index 5c4873cc10..9717f9ae1b 100644 --- a/demos/Makefile.am +++ b/demos/Makefile.am @@ -1,6 +1,6 @@ ## Makefile.am for gtk+/demos include $(top_srcdir)/Makefile.decl -SUBDIRS = gtk-demo widget-factory icon-browser +SUBDIRS = gtk-demo widget-factory icon-browser font-features -include $(top_srcdir)/git.mk diff --git a/demos/font-features/Makefile.am b/demos/font-features/Makefile.am new file mode 100644 index 0000000000..09af9cf315 --- /dev/null +++ b/demos/font-features/Makefile.am @@ -0,0 +1,30 @@ +AM_CPPFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/gdk \ + -I$(top_builddir)/gdk \ + $(GTK_DEBUG_FLAGS) \ + $(GTK_DEP_CFLAGS) + +LDADD = \ + $(top_builddir)/gtk/libgtk-3.la \ + $(top_builddir)/gdk/libgdk-3.la \ + $(GTK_DEP_LIBS) + +bin_PROGRAMS = gtk3-font-features + +gtk3_font_features_SOURCES = \ + font-features.c \ + resources.c + +BUILT_SOURCES = \ + resources.c + +resources.c: font-features.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/font-features.gresource.xml) + $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/font-features.gresource.xml \ + --target=$@ --sourcedir=$(srcdir) --generate-source + +EXTRA_DIST = \ + font-features.gresource.xml \ + font-features.ui + +-include $(top_srcdir)/git.mk diff --git a/demos/font-features/font-features.c b/demos/font-features/font-features.c new file mode 100644 index 0000000000..26679fb4fb --- /dev/null +++ b/demos/font-features/font-features.c @@ -0,0 +1,186 @@ +#include + +static GtkWidget *label; +static GtkWidget *settings; +static GtkWidget *font; +static GtkWidget *resetbutton; +static GtkWidget *numcasedefault; +static GtkWidget *numspacedefault; +static GtkWidget *fractiondefault; +static GtkWidget *stack; +static GtkWidget *entry; + +static GtkWidget *toggle[24]; + +static void +update (void) +{ + GString *s; + char *font_desc; + char *font_settings; + const char *text; + gboolean has_feature; + int i; + + text = gtk_entry_get_text (GTK_ENTRY (entry)); + + font_desc = gtk_font_chooser_get_font (GTK_FONT_CHOOSER (font)); + + s = g_string_new (""); + + has_feature = FALSE; + for (i = 0; i < 24; i++) + { + if (!gtk_widget_is_sensitive (toggle[i])) + continue; + + if (GTK_IS_RADIO_BUTTON (toggle[i])) + { + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle[i]))) + { + if (has_feature) + g_string_append (s, ", "); + g_string_append (s, gtk_buildable_get_name (GTK_BUILDABLE (toggle[i]))); + g_string_append (s, " 1"); + has_feature = TRUE; + } + } + else + { + if (has_feature) + g_string_append (s, ", "); + g_string_append (s, gtk_buildable_get_name (GTK_BUILDABLE (toggle[i]))); + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle[i]))) + g_string_append (s, " 1"); + else + g_string_append (s, " 0"); + has_feature = TRUE; + } + } + + font_settings = g_string_free (s, FALSE); + + gtk_label_set_text (GTK_LABEL (settings), font_settings); + + s = g_string_new (""); + g_string_append_printf (s, "%s", font_desc, font_settings, text); + + gtk_label_set_markup (GTK_LABEL (label), s->str); + + g_string_free (s, TRUE); + + g_free (font_desc); + g_free (font_settings); +} + +static void +reset (void) +{ + int i; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (numcasedefault), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (numspacedefault), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fractiondefault), TRUE); + for (i = 0; i < 24; i++) + { + if (!GTK_IS_RADIO_BUTTON (toggle[i])) + { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle[i]), FALSE); + gtk_widget_set_sensitive (toggle[i], FALSE); + } + } +} + +static char *text; + +static void +switch_to_entry (void) +{ + text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + gtk_stack_set_visible_child_name (GTK_STACK (stack), "entry"); +} + +static void +switch_to_label (void) +{ + g_free (text); + text = NULL; + gtk_stack_set_visible_child_name (GTK_STACK (stack), "label"); + update (); +} + +static gboolean +entry_key_press (GtkEntry *entry, GdkEventKey *event) +{ + if (event->keyval == GDK_KEY_Escape) + { + gtk_entry_set_text (GTK_ENTRY (entry), text); + switch_to_label (); + return GDK_EVENT_STOP; + } + + return GDK_EVENT_PROPAGATE; +} + +int main (int argc, char *argv[]) +{ + GtkBuilder *builder; + GtkWidget *window; + int i; + + gtk_init (NULL, NULL); + + builder = gtk_builder_new_from_resource("/org/gtk/font-features/font-features.ui"); + + gtk_builder_add_callback_symbol (builder, "update", update); + gtk_builder_add_callback_symbol (builder, "reset", reset); + gtk_builder_add_callback_symbol (builder, "switch_to_entry", switch_to_entry); + gtk_builder_add_callback_symbol (builder, "switch_to_label", switch_to_label); + gtk_builder_add_callback_symbol (builder, "entry_key_press", G_CALLBACK (entry_key_press)); + gtk_builder_connect_signals (builder, NULL); + + window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); + label = GTK_WIDGET (gtk_builder_get_object (builder, "label")); + settings = GTK_WIDGET (gtk_builder_get_object (builder, "settings")); + resetbutton = GTK_WIDGET (gtk_builder_get_object (builder, "reset")); + font = GTK_WIDGET (gtk_builder_get_object (builder, "font")); + numcasedefault = GTK_WIDGET (gtk_builder_get_object (builder, "numcasedefault")); + numspacedefault = GTK_WIDGET (gtk_builder_get_object (builder, "numspacedefault")); + fractiondefault = GTK_WIDGET (gtk_builder_get_object (builder, "fractiondefault")); + stack = GTK_WIDGET (gtk_builder_get_object (builder, "stack")); + entry = GTK_WIDGET (gtk_builder_get_object (builder, "entry")); + + i = 0; + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "kern")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "liga")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "dlig")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "hlig")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "clig")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "smcp")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "c2sc")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "lnum")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "onum")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "pnum")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "tnum")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "frac")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "afrc")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "zero")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "nalt")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "swsh")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "calt")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "hist")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "salt")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "ss01")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "ss02")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "ss03")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "ss04")); + toggle[i++] = GTK_WIDGET (gtk_builder_get_object (builder, "ss05")); + + update (); + + gtk_window_present (GTK_WINDOW (window)); + + gtk_main (); + + return 0; +} diff --git a/demos/font-features/font-features.gresource.xml b/demos/font-features/font-features.gresource.xml new file mode 100644 index 0000000000..3ea50993cf --- /dev/null +++ b/demos/font-features/font-features.gresource.xml @@ -0,0 +1,7 @@ + + + + font-features.ui + + + diff --git a/demos/font-features/font-features.ui b/demos/font-features/font-features.ui new file mode 100644 index 0000000000..b378a10005 --- /dev/null +++ b/demos/font-features/font-features.ui @@ -0,0 +1,1346 @@ + + + + + + False + 600 + 500 + + + True + True + Font Features + + + True + True + True + Reset + + + + True + False + view-refresh-symbolic + + + + + start + + + + + + + True + False + + + True + True + never + + + True + False + + + True + False + 10 + 10 + 10 + 10 + vertical + 6 + + + True + True + True + Sans 12 + + + + False + True + 0 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Enabled + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + + + True + False + Kerning + + + + + False + True + 1 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Common + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Discretionary + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Historical + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Contextual + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 3 + + + + + + + True + False + Ligatures + + + + + False + True + 2 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Small Caps + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Small Caps from Caps + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + True + False + Letter Case + + + + + False + True + 3 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + Default + True + True + False + 0 + True + True + + + + False + True + 0 + + + + + Lining + True + True + False + 0 + True + True + numcasedefault + + + + False + True + 1 + + + + + Old-Style + True + True + False + 0 + True + True + numcasedefault + + + + False + True + 2 + + + + + + + True + False + Number Case + + + + + False + True + 4 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + Default + True + True + False + 0 + True + True + + + + False + True + 0 + + + + + Proportional + True + True + False + 0 + True + True + numspacedefault + + + + False + True + 1 + + + + + Tabular + True + True + False + 0 + True + True + numspacedefault + + + + False + True + 2 + + + + + + + True + False + Number Spacing + + + + + False + True + 5 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + Off + True + True + False + 0 + True + True + + + + False + True + 0 + + + + + Normal + True + True + False + 0 + True + True + fractiondefault + + + + False + True + 1 + + + + + Alternate + True + True + False + 0 + True + True + fractiondefault + + + + False + True + 2 + + + + + + + True + False + Fractions + + + + + False + True + 6 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Slashed Zero + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Alt. Annotation + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + True + False + Numeric Extras + + + + + False + True + 7 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Swash + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Contextual + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Historical + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Stylistic + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 3 + + + + + + + True + False + Character Alternatives + + + + + False + True + 8 + + + + + True + True + + + True + False + 20 + 20 + 10 + vertical + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Set 1 + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Set 2 + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 1 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Set 3 + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 2 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Set 4 + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 3 + + + + + True + False + + + True + True + False + 0 + True + + + + False + True + 0 + + + + + Set 5 + True + True + False + 0 + True + + + + + False + True + 1 + + + + + False + True + 4 + + + + + + + True + False + Alternative Stylistic Sets + + + + + False + True + 9 + + + + + + + + + + False + True + 0 + + + + + True + False + vertical + + + True + 20 + 20 + 20 + 20 + + + True + + + + True + False + True + 0 + 0 + start + + + + + label + + + + + True + Lucky affluent actor asks to feast on giant 10.34" cheese-filled quiche in fjord. + + + start + + + entry + + + + + True + True + 0 + + + + + True + False + 20 + 20 + 20 + 0 + + + False + True + 1 + + + + + True + True + 1 + + + + + + -- cgit v1.2.1