mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-11 03:10:09 +00:00
Add a font features demo
This started life as a standalone tool, but it is nicer to have it integrated in gtk3-demo.
This commit is contained in:
parent
a4dcc6bc52
commit
010a120351
@ -25,6 +25,7 @@ demos = \
|
||||
entry_completion.c \
|
||||
event_axes.c \
|
||||
expander.c \
|
||||
font_features.c \
|
||||
gestures.c \
|
||||
glarea.c \
|
||||
headerbar.c \
|
||||
|
@ -183,4 +183,7 @@
|
||||
<file>glarea-fragment.glsl</file>
|
||||
<file>glarea-vertex.glsl</file>
|
||||
</gresource>
|
||||
<gresource prefix="/font-features">
|
||||
<file>font-features.ui</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
|
1346
demos/gtk-demo/font-features.ui
Normal file
1346
demos/gtk-demo/font-features.ui
Normal file
File diff suppressed because it is too large
Load Diff
202
demos/gtk-demo/font_features.c
Normal file
202
demos/gtk-demo/font_features.c
Normal file
@ -0,0 +1,202 @@
|
||||
/* Font Features
|
||||
*
|
||||
* This demonstrates support for OpenType font features with
|
||||
* Pango attributes. The attributes can be used manually or
|
||||
* via Pango markup.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
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, "<span font_desc='%s' font_features='%s'>%s</span>", 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;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_font_features (GtkWidget *do_widget)
|
||||
{
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
if (!window)
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
int i;
|
||||
|
||||
builder = gtk_builder_new_from_resource ("/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 ();
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
{
|
||||
gtk_window_present (GTK_WINDOW (window));
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
Loading…
Reference in New Issue
Block a user