[gtk+/wip/matthiasc/font-variations: 257/260] Redo the features part of the font features demo



commit e3544861b840f82974abda13503766ba501421d7
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Sep 16 14:50:57 2017 -0400

    Redo the features part of the font features demo
    
    Use a new approach to creating all the controls programmatically,
    instead of putting them all in the .ui file. This saves space
    and is more extensibel. We now cover most of the registered
    feature tags.

 demos/gtk-demo/font-features.ui   | 1497 +------------------------------------
 demos/gtk-demo/font_features.c    |  322 +++++++--
 demos/gtk-demo/open-type-layout.h |  155 ++++
 3 files changed, 428 insertions(+), 1546 deletions(-)
---
diff --git a/demos/gtk-demo/font-features.ui b/demos/gtk-demo/font-features.ui
index 93910e1..a7c8fb0 100644
--- a/demos/gtk-demo/font-features.ui
+++ b/demos/gtk-demo/font-features.ui
@@ -87,1503 +87,8 @@
                           </object>
                         </child>
                         <child>
-                          <object class="GtkBox">
+                          <object class="GtkBox" id="feature_list">
                             <property name="orientation">vertical</property>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="margin-top">10</property>
-                                <property name="label" translatable="yes">Kerning</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="kern_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="kern_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="kern">
-                                        <property name="label" translatable="yes">Enabled</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="kern_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Ligatures</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="liga_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="liga_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="liga">
-                                        <property name="label" translatable="yes">Common Ligatures</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="liga_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="dlig_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="dlig_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="dlig">
-                                        <property name="label" translatable="yes">Discretionary 
Ligatures</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="dlig_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="hlig_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="hlig_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="hlig">
-                                        <property name="label" translatable="yes">Historical 
Ligatures</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="hlig_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="clig_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="clig_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="clig">
-                                        <property name="label" translatable="yes">Contextual 
Ligatures</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="clig_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Letter Case</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="smcp_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="smcp_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="smcp">
-                                        <property name="label" translatable="yes">Small Caps</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="valign">baseline</property>
-                                        <property name="sensitive" bind-source="smcp_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="c2sc_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="c2sc_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="c2sc">
-                                        <property name="label" translatable="yes">Small Caps from 
Caps</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="c2sc_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="pcap_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="pcap_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="pcap">
-                                        <property name="label" translatable="yes">Petite Caps</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="pcap_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="c2pc_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="c2pc_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="c2pc">
-                                        <property name="label" translatable="yes">Caps to Petite 
Caps</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="c2pc_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="unic_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="unic_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="unic">
-                                        <property name="label" translatable="yes">Unicase</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="unic_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="cpsp_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="cpsp_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="cpsp">
-                                        <property name="label" translatable="yes">Capital Spacing</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="cpsp_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="case_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="case_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="case">
-                                        <property name="label" translatable="yes">Case-sensitive 
Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="case_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Number Case</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="numcasedefault_pres">
-                                        <property name="visible">1</property>
-                                        <property name="opacity">0</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="numcasedefault">
-                                        <property name="label" translatable="yes">Default</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="lnum_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="lnum">
-                                        <property name="label" translatable="yes">Lining</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <property name="group">numcasedefault</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="onum_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="onum">
-                                        <property name="label" translatable="yes">Old-Style</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="valign">baseline</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="group">numcasedefault</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Number Spacing</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="numspacedefault_pres">
-                                        <property name="visible">1</property>
-                                        <property name="opacity">0</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="numspacedefault">
-                                        <property name="label" translatable="yes">Default</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="pnum_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="pnum">
-                                        <property name="label" translatable="yes">Proportional</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="group">numspacedefault</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="tnum_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="tnum">
-                                        <property name="label" translatable="yes">Tabular</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="group">numspacedefault</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Fractions</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="fractiondefault_pres">
-                                        <property name="visible">1</property>
-                                        <property name="opacity">0</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="fractiondefault">
-                                        <property name="label" translatable="yes">Off</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="frac_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="frac">
-                                        <property name="label" translatable="yes">Normal</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="group">fractiondefault</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="afrc_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkRadioButton" id="afrc">
-                                        <property name="label" translatable="yes">Alternate</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="active">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="group">fractiondefault</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Numeric Extras</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="zero_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="zero_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="zero">
-                                        <property name="label" translatable="yes">Slashed Zero</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="zero_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="nalt_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="nalt_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="nalt">
-                                        <property name="label" translatable="yes">Alternative 
Annotations</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="nalt_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="sinf_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="sinf_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="sinf">
-                                        <property name="label" translatable="yes">Scientific 
Inferiors</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="sinf_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Character Alternatives</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="swsh_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="swsh_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="swsh">
-                                        <property name="label" translatable="yes">Swash Glyphs</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="swsh_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="cswh_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="cswh_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="cswh">
-                                        <property name="label" translatable="yes">Contextual Swash</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="cswh_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="locl_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="locl_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="locl">
-                                        <property name="label" translatable="yes">Localized Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="locl_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="calt_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="calt_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="calt">
-                                        <property name="label" translatable="yes">Contextual 
Alternatives</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="calt_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="hist_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="hist_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="hist">
-                                        <property name="label" translatable="yes">Historical 
Alternatives</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="hist_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="salt_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="salt_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="salt">
-                                        <property name="label" translatable="yes">Stylistic 
Alternatives</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="salt_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="titl_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="titl_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="titl">
-                                        <property name="label" translatable="yes">Titling 
Alternatives</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="titl_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="rand_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="rand_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="rand">
-                                        <property name="label" translatable="yes">Randomize</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="rand_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="subs_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="subs_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="subs">
-                                        <property name="label" translatable="yes">Subscript</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="subs_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="sups_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="sups_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="sups">
-                                        <property name="label" translatable="yes">Superscript</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="sups_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Positional Alternatives</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="init_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="init_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="init">
-                                        <property name="label" translatable="yes">Initial Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="init_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="medi_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="medi_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="medi">
-                                        <property name="label" translatable="yes">Medial Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="medi_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="fina_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="fina_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="fina">
-                                        <property name="label" translatable="yes">Final Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="fina_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="isol_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="isol_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="isol">
-                                        <property name="label" translatable="yes">Isolated Forms</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="isol_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkLabel">
-                                <property name="visible">1</property>
-                                <property name="xalign">0</property>
-                                <property name="halign">start</property>
-                                <property name="label" translatable="yes">Alternative Stylistic 
Sets</property>
-                              </object>
-                            </child>
-                            <child>
-                              <object class="GtkBox">
-                                <property name="visible">1</property>
-                                <property name="halign">start</property>
-                                <property name="margin-start">20</property>
-                                <property name="margin-end">10</property>
-                                <property name="margin-top">10</property>
-                                <property name="margin-bottom">10</property>
-                                <property name="orientation">vertical</property>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="ss01_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss01_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss01">
-                                        <property name="label" translatable="yes">Set 1</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="ss01_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="ss02_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss02_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss02">
-                                        <property name="label" translatable="yes">Set 2</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="ss02_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="ss03_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss03_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss03">
-                                        <property name="label" translatable="yes">Set 3</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="ss03_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="ss04_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss04_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss04">
-                                        <property name="label" translatable="yes">Set 4</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="ss04_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkBox">
-                                    <property name="visible">1</property>
-                                    <child>
-                                      <object class="GtkImage" id="ss05_pres">
-                                        <property name="visible">1</property>
-                                        <property name="icon-name">object-select-symbolic</property>
-                                        <property name="icon-size">1</property>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss05_dflt">
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="ss05">
-                                        <property name="label" translatable="yes">Set 5</property>
-                                        <property name="visible">1</property>
-                                        <property name="can-focus">1</property>
-                                        <property name="draw-indicator">1</property>
-                                        <property name="valign">baseline</property>
-                                        <signal name="notify::active" handler="update_display" swapped="no"/>
-                                        <property name="sensitive" bind-source="ss05_dflt" 
bind-property="active" bind-flags="sync-create|bidirectional"/>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
                           </object>
                         </child>
                       </object>
diff --git a/demos/gtk-demo/font_features.c b/demos/gtk-demo/font_features.c
index 7582a86..e3768e4 100644
--- a/demos/gtk-demo/font_features.c
+++ b/demos/gtk-demo/font_features.c
@@ -19,6 +19,9 @@
 #include <freetype/ftmm.h>
 #include <freetype/ftsnames.h>
 #include <freetype/ttnameid.h>
+#include <glib/gi18n.h>
+
+#include "open-type-layout.h"
 
 static GtkWidget *label;
 static GtkWidget *settings;
@@ -26,28 +29,163 @@ static GtkWidget *description;
 static GtkWidget *font;
 static GtkWidget *script_lang;
 static GtkWidget *resetbutton;
-static GtkWidget *numcasedefault;
-static GtkWidget *numspacedefault;
-static GtkWidget *fractiondefault;
 static GtkWidget *stack;
 static GtkWidget *entry;
 static GtkWidget *variations_heading;
 static GtkWidget *variations_grid;
 static GtkWidget *instance_combo;
 
-#define num_features 40
+typedef struct {
+  unsigned int tag;
+  const char *name;
+  GtkWidget *icon;
+  GtkWidget *dflt;
+  GtkWidget *feat;
+} FeatureItem;
 
-static GtkWidget *toggle[num_features];
-static GtkWidget *icon[num_features];
-static const char *feature_names[num_features] = {
-  "kern", "liga", "dlig", "hlig", "clig", "smcp", "c2sc", "pcap", "c2pc", "unic",
-  "cpsp", "case", "lnum", "onum", "pnum", "tnum", "frac", "afrc", "zero", "nalt",
-  "sinf", "swsh", "cswh", "locl", "calt", "hist", "salt", "titl", "rand", "subs",
-  "sups", "init", "medi", "fina", "isol", "ss01", "ss02", "ss03", "ss04", "ss05"
-};
+static GList *feature_items;
 
 static void add_font_variations (GString *s);
 
+static const char *
+get_feature_display_name (unsigned int tag)
+{
+  int i;
+
+  for (i = 0; i < G_N_ELEMENTS (open_type_layout_features); i++)
+    {
+      if (tag == open_type_layout_features[i].tag)
+        return g_dpgettext2 (NULL, "OpenType layout", open_type_layout_features[i].name);
+    }
+
+  return NULL;
+}
+
+static void update_display (void);
+
+static void
+add_check_group (GtkWidget   *box,
+                 const char  *title,
+                 const char **tags)
+{
+  GtkWidget *label;
+  GtkWidget *group;
+  int i;
+
+  label = gtk_label_new (title);
+  gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+  gtk_widget_set_halign (label, GTK_ALIGN_START);
+  g_object_set (label, "margin-top", 10, NULL);
+  gtk_container_add (GTK_CONTAINER (box), label);
+
+  group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_widget_set_halign (group, GTK_ALIGN_START);
+  g_object_set (group,
+                "margin-start", 20,
+                "margin-end", 20,
+                "margin-top", 10,
+                "margin-top", 10,
+                NULL);
+  for (i = 0; tags[i]; i++)
+    {
+      unsigned int tag;
+      GtkWidget *row;
+      GtkWidget *icon;
+      GtkWidget *dflt;
+      GtkWidget *feat;
+      FeatureItem *item;
+
+      tag = hb_tag_from_string (tags[i], -1);
+
+      row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+      icon = gtk_image_new_from_icon_name ("object-select-symbolic", 1);
+      dflt = gtk_check_button_new ();
+      feat = gtk_check_button_new_with_label (get_feature_display_name (tag));
+
+      g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
+      g_object_bind_property (dflt, "active", feat, "sensitive", G_BINDING_SYNC_CREATE | 
G_BINDING_BIDIRECTIONAL);
+      g_signal_connect (dflt, "notify::active", G_CALLBACK (update_display), NULL);
+
+      gtk_container_add (GTK_CONTAINER (row), icon);
+      gtk_container_add (GTK_CONTAINER (row), dflt);
+      gtk_container_add (GTK_CONTAINER (row), feat);
+      gtk_container_add (GTK_CONTAINER (group), row);
+
+      item = g_new (FeatureItem, 1);
+      item->name = tags[i];
+      item->tag = tag;
+      item->icon = icon;
+      item->dflt = dflt;
+      item->feat = feat;
+
+      feature_items = g_list_prepend (feature_items, item);
+    }
+
+  gtk_container_add (GTK_CONTAINER (box), group);
+}
+
+static void
+add_radio_group (GtkWidget *box,
+                 const char  *title,
+                 const char **tags)
+{
+  GtkWidget *label;
+  GtkWidget *group;
+  int i;
+  GtkWidget *group_button = NULL;
+
+  label = gtk_label_new (title);
+  gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+  gtk_widget_set_halign (label, GTK_ALIGN_START);
+  g_object_set (label, "margin-top", 10, NULL);
+  gtk_container_add (GTK_CONTAINER (box), label);
+
+  group = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_widget_set_halign (group, GTK_ALIGN_START);
+  g_object_set (group,
+                "margin-start", 20,
+                "margin-end", 20,
+                "margin-top", 10,
+                "margin-top", 10,
+                NULL);
+  for (i = 0; tags[i]; i++)
+    {
+      unsigned int tag;
+      GtkWidget *row;
+      GtkWidget *icon;
+      GtkWidget *feat;
+      FeatureItem *item;
+      const char *name;
+
+      tag = hb_tag_from_string (tags[i], -1);
+      name = get_feature_display_name (tag);
+
+      row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+      icon = gtk_image_new_from_icon_name ("object-select-symbolic", 1);
+      feat = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (group_button),
+                                                          name ? name : _("Default"));
+      if (group_button == NULL)
+        group_button = feat;
+
+      g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
+
+      gtk_container_add (GTK_CONTAINER (row), icon);
+      gtk_container_add (GTK_CONTAINER (row), feat);
+      gtk_container_add (GTK_CONTAINER (group), row);
+
+      item = g_new (FeatureItem, 1);
+      item->name = tags[i];
+      item->tag = tag;
+      item->icon = icon;
+      item->dflt = NULL;
+      item->feat = feat;
+
+      feature_items = g_list_prepend (feature_items, item);
+    }
+
+  gtk_container_add (GTK_CONTAINER (box), group);
+}
+
 static void
 update_display (void)
 {
@@ -56,13 +194,13 @@ update_display (void)
   char *font_settings;
   const char *text;
   gboolean has_feature;
-  int i;
   hb_tag_t lang_tag;
   GtkTreeModel *model;
   GtkTreeIter iter;
   const char *lang;
   PangoFontDescription *desc;
   char *tmp;
+  GList *l;
 
   text = gtk_entry_get_text (GTK_ENTRY (entry));
 
@@ -83,31 +221,34 @@ update_display (void)
   s = g_string_new ("");
 
   has_feature = FALSE;
-  for (i = 0; i < num_features; i++)
+  for (l = feature_items; l; l = l->next)
     {
-      if (!gtk_widget_is_sensitive (toggle[i]))
+      FeatureItem *item = l->data;
+
+      if (!gtk_widget_is_sensitive (item->feat))
         continue;
 
-      if (GTK_IS_RADIO_BUTTON (toggle[i]))
+      if (GTK_IS_RADIO_BUTTON (item->feat))
         {
-          if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle[i])))
+          if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (item->feat)) &&
+              strcmp (item->name, "xxxx") != 0)
             {
               if (has_feature)
                 g_string_append (s, ", ");
-              g_string_append (s, gtk_buildable_get_name (GTK_BUILDABLE (toggle[i])));
+              g_string_append (s, item->name);
               g_string_append (s, " 1");
               has_feature = TRUE;
             }
         }
-      else
+      else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (item->dflt)))
         {
           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");
+          g_string_append (s, item->name);
+          if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (item->feat)))
+            g_string_append (s, " 1");
           else
-            g_string_append (s, " 0");
+            g_string_append (s, " 0");
           has_feature = TRUE;
         }
     }
@@ -364,16 +505,20 @@ update_script_combo (void)
 static void
 update_features (void)
 {
-  gint i, j, k;
+  gint i, j;
   GtkTreeModel *model;
   GtkTreeIter iter;
   guint script_index, lang_index;
   PangoFont *pango_font;
   FT_Face ft_face;
   hb_font_t *hb_font;
+  GList *l;
 
-  for (i = 0; i < num_features; i++)
-    gtk_widget_set_opacity (icon[i], 0);
+  for (l = feature_items; l; l = l->next)
+    {
+      FeatureItem *item = l->data;
+      gtk_widget_set_opacity (item->icon, 0);
+    }
 
   /* set feature presence checks from the font features */
 
@@ -412,10 +557,11 @@ update_features (void)
 
           for (j = 0; j < count; j++)
             {
-              for (k = 0; k < num_features; k++)
+              for (l = feature_items; l; l = l->next)
                 {
-                  if (hb_tag_from_string (feature_names[k], -1) == features[j])
-                    gtk_widget_set_opacity (icon[k], 0.5);
+                  FeatureItem *item = l->data;
+                  if (item->tag == features[j])
+                    gtk_widget_set_opacity (item->icon, 0.5);
                 }
             }
         }
@@ -1267,17 +1413,18 @@ script_changed (void)
 static void
 reset_features (void)
 {
-  int i;
+  GList *l;
 
-  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 < num_features; i++)
+  for (l = feature_items; l; l = l->next)
     {
-      if (!GTK_IS_RADIO_BUTTON (toggle[i]))
+      FeatureItem *item = l->data;
+
+      if (strcmp (item->name, "xxxx") == 0)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), TRUE);
+      else if (GTK_IS_CHECK_BUTTON (item->feat))
         {
-          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle[i]), FALSE);
-          gtk_widget_set_sensitive (toggle[i], FALSE);
+          gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), FALSE);
+          gtk_widget_set_sensitive (item->feat, FALSE);
         }
     }
 }
@@ -1325,7 +1472,7 @@ do_font_features (GtkWidget *do_widget)
   if (!window)
     {
       GtkBuilder *builder;
-      int i;
+      GtkWidget *feature_list;
 
       builder = gtk_builder_new_from_resource ("/font_features/font-features.ui");
 
@@ -1339,27 +1486,102 @@ do_font_features (GtkWidget *do_widget)
       gtk_builder_connect_signals (builder, NULL);
 
       window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
+      feature_list = GTK_WIDGET (gtk_builder_get_object (builder, "feature_list"));
       label = GTK_WIDGET (gtk_builder_get_object (builder, "label"));
       settings = GTK_WIDGET (gtk_builder_get_object (builder, "settings"));
       description = GTK_WIDGET (gtk_builder_get_object (builder, "description"));
       resetbutton = GTK_WIDGET (gtk_builder_get_object (builder, "reset"));
       font = GTK_WIDGET (gtk_builder_get_object (builder, "font"));
       script_lang = GTK_WIDGET (gtk_builder_get_object (builder, "script_lang"));
-      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"));
 
-      for (i = 0; i < num_features; i++)
-        {
-          char *iname;
-
-          toggle[i] = GTK_WIDGET (gtk_builder_get_object (builder, feature_names[i]));
-          iname = g_strconcat (feature_names[i], "_pres", NULL);
-          icon[i] = GTK_WIDGET (gtk_builder_get_object (builder, iname));
-          g_free (iname);
-        }
+      add_check_group (feature_list, _("Kerning"), (const char *[]){ "kern", NULL });
+      add_check_group (feature_list, _("Ligatures"), (const char *[]){ "liga",
+                                                                       "dlig",
+                                                                       "hlig",
+                                                                       "clig",
+                                                                       "rlig", NULL });
+      add_check_group (feature_list, _("Letter Case"), (const char *[]){ "smcp",
+                                                                         "c2sc",
+                                                                         "pcap",
+                                                                         "c2pc",
+                                                                         "unic",
+                                                                         "cpsp",
+                                                                         "case",NULL });
+      add_radio_group (feature_list, _("Number Case"), (const char *[]){ "xxxx",
+                                                                         "lnum",
+                                                                         "onum", NULL });
+      add_radio_group (feature_list, _("Number Spacing"), (const char *[]){ "xxxx",
+                                                                            "pnum",
+                                                                            "tnum", NULL });
+      add_radio_group (feature_list, _("Fractions"), (const char *[]){ "xxxx",
+                                                                       "frac",
+                                                                       "afrc", NULL });
+      add_check_group (feature_list, _("Numeric Extras"), (const char *[]){ "zero",
+                                                                            "nalt",
+                                                                            "sinf", NULL });
+      add_check_group (feature_list, _("Character Alternatives"), (const char *[]){ "swsh",
+                                                                                    "cswh",
+                                                                                    "locl",
+                                                                                    "calt",
+                                                                                    "falt",
+                                                                                    "hist",
+                                                                                    "salt",
+                                                                                    "jalt",
+                                                                                    "titl",
+                                                                                    "rand",
+                                                                                    "subs",
+                                                                                    "sups",
+                                                                                    "ordn",
+                                                                                    "ltra",
+                                                                                    "ltrm",
+                                                                                    "rtla",
+                                                                                    "rtlm",
+                                                                                    "rclt", NULL });
+      add_check_group (feature_list, _("Positional Alternatives"), (const char *[]){ "init",
+                                                                                     "medi",
+                                                                                     "med2",
+                                                                                     "fina",
+                                                                                     "fin2",
+                                                                                     "fin3",
+                                                                                     "isol", NULL });
+      add_check_group (feature_list, _("Width Variants"), (const char *[]){ "fwid",
+                                                                            "hwid",
+                                                                            "halt",
+                                                                            "pwid",
+                                                                            "palt",
+                                                                            "twid",
+                                                                            "qwid", NULL });
+      add_check_group (feature_list, _("Alternative Stylistic Sets"), (const char *[]){ "ss00",
+                                                                                        "ss01",
+                                                                                        "ss02",
+                                                                                        "ss03",
+                                                                                        "ss04",
+                                                                                        "ss05",
+                                                                                        "ss06",
+                                                                                        "ss07",
+                                                                                        "ss08",
+                                                                                        "ss09",
+                                                                                        "ss10",
+                                                                                        "ss11",
+                                                                                        "ss12",
+                                                                                        "ss13",
+                                                                                        "ss14",
+                                                                                        "ss15",
+                                                                                        "ss16",
+                                                                                        "ss17",
+                                                                                        "ss18",
+                                                                                        "ss19",
+                                                                                        "ss20", NULL });
+      add_check_group (feature_list, _("Mathematical"), (const char *[]){ "dtls",
+                                                                          "flac",
+                                                                          "mgrk",
+                                                                          "ssty", NULL });
+      add_check_group (feature_list, _("Optical Bounds"), (const char *[]){ "opbd",
+                                                                            "lfbd",
+                                                                            "rtbd", NULL });
+      feature_items = g_list_reverse (feature_items);
 
       variations_heading = GTK_WIDGET (gtk_builder_get_object (builder, "variations_heading"));
       variations_grid = GTK_WIDGET (gtk_builder_get_object (builder, "variations_grid"));
diff --git a/demos/gtk-demo/open-type-layout.h b/demos/gtk-demo/open-type-layout.h
new file mode 100644
index 0000000..22521f3
--- /dev/null
+++ b/demos/gtk-demo/open-type-layout.h
@@ -0,0 +1,155 @@
+/* Registered OpenType layout tags, see
+ * https://www.microsoft.com/typography/otspec/featuretags.htm
+ */
+
+typedef struct {
+  unsigned int tag;
+  const char *name;
+} NamedTag;
+
+#define MAKE_TAG(a,b,c,d) (unsigned int)(((a) << 24) | ((b) << 16) | ((c) <<  8) | (d))
+
+static NamedTag open_type_layout_features[] = {
+  { MAKE_TAG('a','a','l','t'), NC_("OpenType layout", "Access All Alternates") },
+  { MAKE_TAG('a','b','v','f'), NC_("OpenType layout", "Above-base Forms") },
+  { MAKE_TAG('a','b','v','m'), NC_("OpenType layout", "Above-base Mark Positioning") },
+  { MAKE_TAG('a','b','v','s'), NC_("OpenType layout", "Above-base Substitutions") },
+  { MAKE_TAG('a','f','r','c'), NC_("OpenType layout", "Alternative Fractions") },
+  { MAKE_TAG('a','k','h','n'), NC_("OpenType layout", "Akhands") },
+  { MAKE_TAG('b','l','w','f'), NC_("OpenType layout", "Below-base Forms") },
+  { MAKE_TAG('b','l','w','m'), NC_("OpenType layout", "Below-base Mark Positioning") },
+  { MAKE_TAG('b','l','w','s'), NC_("OpenType layout", "Below-base Substitutions") },
+  { MAKE_TAG('c','a','l','t'), NC_("OpenType layout", "Contextual Alternates") },
+  { MAKE_TAG('c','a','s','e'), NC_("OpenType layout", "Case-Sensitive Forms") },
+  { MAKE_TAG('c','c','m','p'), NC_("OpenType layout", "Glyph Composition / Decomposition") },
+  { MAKE_TAG('c','f','a','r'), NC_("OpenType layout", "Conjunct Form After Ro") },
+  { MAKE_TAG('c','j','c','t'), NC_("OpenType layout", "Conjunct Forms") },
+  { MAKE_TAG('c','l','i','g'), NC_("OpenType layout", "Contextual Ligatures") },
+  { MAKE_TAG('c','p','c','t'), NC_("OpenType layout", "Centered CJK Punctuation") },
+  { MAKE_TAG('c','p','s','p'), NC_("OpenType layout", "Capital Spacing") },
+  { MAKE_TAG('c','s','w','h'), NC_("OpenType layout", "Contextual Swash") },
+  { MAKE_TAG('c','u','r','s'), NC_("OpenType layout", "Cursive Positioning") },
+  { MAKE_TAG('c','2','p','c'), NC_("OpenType layout", "Petite Capitals From Capitals") },
+  { MAKE_TAG('c','2','s','c'), NC_("OpenType layout", "Small Capitals From Capitals") },
+  { MAKE_TAG('d','i','s','t'), NC_("OpenType layout", "Distances") },
+  { MAKE_TAG('d','l','i','g'), NC_("OpenType layout", "Discretionary Ligatures") },
+  { MAKE_TAG('d','n','o','m'), NC_("OpenType layout", "Denominators") },
+  { MAKE_TAG('d','t','l','s'), NC_("OpenType layout", "Dotless Forms") },
+  { MAKE_TAG('e','x','p','t'), NC_("OpenType layout", "Expert Forms") },
+  { MAKE_TAG('f','a','l','t'), NC_("OpenType layout", "Final Glyph on Line Alternates") },
+  { MAKE_TAG('f','i','n','2'), NC_("OpenType layout", "Terminal Forms #2") },
+  { MAKE_TAG('f','i','n','3'), NC_("OpenType layout", "Terminal Forms #3") },
+  { MAKE_TAG('f','i','n','a'), NC_("OpenType layout", "Terminal Forms") },
+  { MAKE_TAG('f','l','a','c'), NC_("OpenType layout", "Flattened accent forms") },
+  { MAKE_TAG('f','r','a','c'), NC_("OpenType layout", "Fractions") },
+  { MAKE_TAG('f','w','i','d'), NC_("OpenType layout", "Full Widths") },
+  { MAKE_TAG('h','a','l','f'), NC_("OpenType layout", "Half Forms") },
+  { MAKE_TAG('h','a','l','n'), NC_("OpenType layout", "Halant Forms") },
+  { MAKE_TAG('h','a','l','t'), NC_("OpenType layout", "Alternate Half Widths") },
+  { MAKE_TAG('h','i','s','t'), NC_("OpenType layout", "Historical Forms") },
+  { MAKE_TAG('h','k','n','a'), NC_("OpenType layout", "Horizontal Kana Alternates") },
+  { MAKE_TAG('h','l','i','g'), NC_("OpenType layout", "Historical Ligatures") },
+  { MAKE_TAG('h','n','g','l'), NC_("OpenType layout", "Hangul") },
+  { MAKE_TAG('h','o','j','o'), NC_("OpenType layout", "Hojo Kanji Forms") },
+  { MAKE_TAG('h','w','i','d'), NC_("OpenType layout", "Half Widths") },
+  { MAKE_TAG('i','n','i','t'), NC_("OpenType layout", "Initial Forms") },
+  { MAKE_TAG('i','s','o','l'), NC_("OpenType layout", "Isolated Forms") },
+  { MAKE_TAG('i','t','a','l'), NC_("OpenType layout", "Italics") },
+  { MAKE_TAG('j','a','l','t'), NC_("OpenType layout", "Justification Alternates") },
+  { MAKE_TAG('j','p','7','8'), NC_("OpenType layout", "JIS78 Forms") },
+  { MAKE_TAG('j','p','8','3'), NC_("OpenType layout", "JIS83 Forms") },
+  { MAKE_TAG('j','p','9','0'), NC_("OpenType layout", "JIS90 Forms") },
+  { MAKE_TAG('j','p','0','4'), NC_("OpenType layout", "JIS2004 Forms") },
+  { MAKE_TAG('k','e','r','n'), NC_("OpenType layout", "Kerning") },
+  { MAKE_TAG('l','f','b','d'), NC_("OpenType layout", "Left Bounds") },
+  { MAKE_TAG('l','i','g','a'), NC_("OpenType layout", "Standard Ligatures") },
+  { MAKE_TAG('l','j','m','o'), NC_("OpenType layout", "Leading Jamo Forms") },
+  { MAKE_TAG('l','n','u','m'), NC_("OpenType layout", "Lining Figures") },
+  { MAKE_TAG('l','o','c','l'), NC_("OpenType layout", "Localized Forms") },
+  { MAKE_TAG('l','t','r','a'), NC_("OpenType layout", "Left-to-right alternates") },
+  { MAKE_TAG('l','t','r','m'), NC_("OpenType layout", "Left-to-right mirrored forms") },
+  { MAKE_TAG('m','a','r','k'), NC_("OpenType layout", "Mark Positioning") },
+  { MAKE_TAG('m','e','d','2'), NC_("OpenType layout", "Medial Forms #2") },
+  { MAKE_TAG('m','e','d','i'), NC_("OpenType layout", "Medial Forms") },
+  { MAKE_TAG('m','g','r','k'), NC_("OpenType layout", "Mathematical Greek") },
+  { MAKE_TAG('m','k','m','k'), NC_("OpenType layout", "Mark to Mark Positioning") },
+  { MAKE_TAG('m','s','e','t'), NC_("OpenType layout", "Mark Positioning via Substitution") },
+  { MAKE_TAG('n','a','l','t'), NC_("OpenType layout", "Alternate Annotation Forms") },
+  { MAKE_TAG('n','l','c','k'), NC_("OpenType layout", "NLC Kanji Forms") },
+  { MAKE_TAG('n','u','k','t'), NC_("OpenType layout", "Nukta Forms") },
+  { MAKE_TAG('n','u','m','r'), NC_("OpenType layout", "Numerators") },
+  { MAKE_TAG('o','n','u','m'), NC_("OpenType layout", "Oldstyle Figures") },
+  { MAKE_TAG('o','p','b','d'), NC_("OpenType layout", "Optical Bounds") },
+  { MAKE_TAG('o','r','d','n'), NC_("OpenType layout", "Ordinals") },
+  { MAKE_TAG('o','r','n','m'), NC_("OpenType layout", "Ornaments") },
+  { MAKE_TAG('p','a','l','t'), NC_("OpenType layout", "Proportional Alternate Widths") },
+  { MAKE_TAG('p','c','a','p'), NC_("OpenType layout", "Petite Capitals") },
+  { MAKE_TAG('p','k','n','a'), NC_("OpenType layout", "Proportional Kana") },
+  { MAKE_TAG('p','n','u','m'), NC_("OpenType layout", "Proportional Figures") },
+  { MAKE_TAG('p','r','e','f'), NC_("OpenType layout", "Pre-Base Forms") },
+  { MAKE_TAG('p','r','e','s'), NC_("OpenType layout", "Pre-base Substitutions") },
+  { MAKE_TAG('p','s','t','f'), NC_("OpenType layout", "Post-base Forms") },
+  { MAKE_TAG('p','s','t','s'), NC_("OpenType layout", "Post-base Substitutions") },
+  { MAKE_TAG('p','w','i','d'), NC_("OpenType layout", "Proportional Widths") },
+  { MAKE_TAG('q','w','i','d'), NC_("OpenType layout", "Quarter Widths") },
+  { MAKE_TAG('r','a','n','d'), NC_("OpenType layout", "Randomize") },
+  { MAKE_TAG('r','c','l','t'), NC_("OpenType layout", "Required Contextual Alternates") },
+  { MAKE_TAG('r','k','r','f'), NC_("OpenType layout", "Rakar Forms") },
+  { MAKE_TAG('r','l','i','g'), NC_("OpenType layout", "Required Ligatures") },
+  { MAKE_TAG('r','p','h','f'), NC_("OpenType layout", "Reph Forms") },
+  { MAKE_TAG('r','t','b','d'), NC_("OpenType layout", "Right Bounds") },
+  { MAKE_TAG('r','t','l','a'), NC_("OpenType layout", "Right-to-left alternates") },
+  { MAKE_TAG('r','t','l','m'), NC_("OpenType layout", "Right-to-left mirrored forms") },
+  { MAKE_TAG('r','u','b','y'), NC_("OpenType layout", "Ruby Notation Forms") },
+  { MAKE_TAG('r','v','r','n'), NC_("OpenType layout", "Required Variation Alternates") },
+  { MAKE_TAG('s','a','l','t'), NC_("OpenType layout", "Stylistic Alternates") },
+  { MAKE_TAG('s','i','n','f'), NC_("OpenType layout", "Scientific Inferiors") },
+  { MAKE_TAG('s','i','z','e'), NC_("OpenType layout", "Optical size") },
+  { MAKE_TAG('s','m','c','p'), NC_("OpenType layout", "Small Capitals") },
+  { MAKE_TAG('s','m','p','l'), NC_("OpenType layout", "Simplified Forms") },
+  { MAKE_TAG('s','s','0','1'), NC_("OpenType layout", "Stylistic Set 1") },
+  { MAKE_TAG('s','s','0','2'), NC_("OpenType layout", "Stylistic Set 2") },
+  { MAKE_TAG('s','s','0','3'), NC_("OpenType layout", "Stylistic Set 3") },
+  { MAKE_TAG('s','s','0','4'), NC_("OpenType layout", "Stylistic Set 4") },
+  { MAKE_TAG('s','s','0','5'), NC_("OpenType layout", "Stylistic Set 5") },
+  { MAKE_TAG('s','s','0','6'), NC_("OpenType layout", "Stylistic Set 6") },
+  { MAKE_TAG('s','s','0','7'), NC_("OpenType layout", "Stylistic Set 7") },
+  { MAKE_TAG('s','s','0','8'), NC_("OpenType layout", "Stylistic Set 8") },
+  { MAKE_TAG('s','s','0','9'), NC_("OpenType layout", "Stylistic Set 9") },
+  { MAKE_TAG('s','s','1','0'), NC_("OpenType layout", "Stylistic Set 10") },
+  { MAKE_TAG('s','s','1','1'), NC_("OpenType layout", "Stylistic Set 11") },
+  { MAKE_TAG('s','s','1','2'), NC_("OpenType layout", "Stylistic Set 12") },
+  { MAKE_TAG('s','s','1','3'), NC_("OpenType layout", "Stylistic Set 13") },
+  { MAKE_TAG('s','s','1','4'), NC_("OpenType layout", "Stylistic Set 14") },
+  { MAKE_TAG('s','s','1','5'), NC_("OpenType layout", "Stylistic Set 15") },
+  { MAKE_TAG('s','s','1','6'), NC_("OpenType layout", "Stylistic Set 16") },
+  { MAKE_TAG('s','s','1','7'), NC_("OpenType layout", "Stylistic Set 17") },
+  { MAKE_TAG('s','s','1','8'), NC_("OpenType layout", "Stylistic Set 18") },
+  { MAKE_TAG('s','s','1','9'), NC_("OpenType layout", "Stylistic Set 19") },
+  { MAKE_TAG('s','s','2','0'), NC_("OpenType layout", "Stylistic Set 20") },
+  { MAKE_TAG('s','s','t','y'), NC_("OpenType layout", "Math script style alternates") },
+  { MAKE_TAG('s','t','c','h'), NC_("OpenType layout", "Stretching Glyph Decomposition") },
+  { MAKE_TAG('s','u','b','s'), NC_("OpenType layout", "Subscript") },
+  { MAKE_TAG('s','u','p','s'), NC_("OpenType layout", "Superscript") },
+  { MAKE_TAG('s','w','s','h'), NC_("OpenType layout", "Swash") },
+  { MAKE_TAG('t','i','t','l'), NC_("OpenType layout", "Titling") },
+  { MAKE_TAG('t','j','m','o'), NC_("OpenType layout", "Trailing Jamo Forms") },
+  { MAKE_TAG('t','n','a','m'), NC_("OpenType layout", "Traditional Name Forms") },
+  { MAKE_TAG('t','n','u','m'), NC_("OpenType layout", "Tabular Figures") },
+  { MAKE_TAG('t','r','a','d'), NC_("OpenType layout", "Traditional Forms") },
+  { MAKE_TAG('t','w','i','d'), NC_("OpenType layout", "Third Widths") },
+  { MAKE_TAG('u','n','i','c'), NC_("OpenType layout", "Unicase") },
+  { MAKE_TAG('v','a','l','t'), NC_("OpenType layout", "Alternate Vertical Metrics") },
+  { MAKE_TAG('v','a','t','u'), NC_("OpenType layout", "Vattu Variants") },
+  { MAKE_TAG('v','e','r','t'), NC_("OpenType layout", "Vertical Writing") },
+  { MAKE_TAG('v','h','a','l'), NC_("OpenType layout", "Alternate Vertical Half Metrics") },
+  { MAKE_TAG('v','j','m','o'), NC_("OpenType layout", "Vowel Jamo Forms") },
+  { MAKE_TAG('v','k','n','a'), NC_("OpenType layout", "Vertical Kana Alternates") },
+  { MAKE_TAG('v','k','r','n'), NC_("OpenType layout", "Vertical Kerning") },
+  { MAKE_TAG('v','p','a','l'), NC_("OpenType layout", "Proportional Alternate Vertical Metrics") },
+  { MAKE_TAG('v','r','t','2'), NC_("OpenType layout", "Vertical Alternates and Rotation") },
+  { MAKE_TAG('v','r','t','r'), NC_("OpenType layout", "Vertical Alternates for Rotation") },
+  { MAKE_TAG('z','e','r','o'), NC_("OpenType layout", "Slashed Zero") },
+};
+
+#undef MAKE_TAG



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]