summaryrefslogtreecommitdiffstats
path: root/subprojects/libhandy/examples
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/libhandy/examples')
-rwxr-xr-xsubprojects/libhandy/examples/example.py32
-rw-r--r--subprojects/libhandy/examples/handy-demo.c65
-rw-r--r--subprojects/libhandy/examples/handy-demo.gresources.xml27
-rw-r--r--subprojects/libhandy/examples/hdy-demo-preferences-window.c56
-rw-r--r--subprojects/libhandy/examples/hdy-demo-preferences-window.h13
-rw-r--r--subprojects/libhandy/examples/hdy-demo-preferences-window.ui256
-rw-r--r--subprojects/libhandy/examples/hdy-demo-window.c573
-rw-r--r--subprojects/libhandy/examples/hdy-demo-window.h13
-rw-r--r--subprojects/libhandy/examples/hdy-demo-window.ui2352
-rw-r--r--subprojects/libhandy/examples/hdy-view-switcher-demo-window.c30
-rw-r--r--subprojects/libhandy/examples/hdy-view-switcher-demo-window.h13
-rw-r--r--subprojects/libhandy/examples/hdy-view-switcher-demo-window.ui109
-rw-r--r--subprojects/libhandy/examples/icons/dark-mode-symbolic.svg68
-rw-r--r--subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic-rtl.svg179
-rw-r--r--subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic.svg179
-rw-r--r--subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic-rtl.svg187
-rw-r--r--subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic.svg187
-rw-r--r--subprojects/libhandy/examples/icons/gnome-smartphone-symbolic.svg59
-rw-r--r--subprojects/libhandy/examples/icons/light-mode-symbolic.svg6
-rw-r--r--subprojects/libhandy/examples/icons/widget-carousel-symbolic.svg66
-rw-r--r--subprojects/libhandy/examples/icons/widget-clamp-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-deck-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-keypad-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-leaflet-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-list-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-search-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-view-switcher-symbolic.svg1
-rw-r--r--subprojects/libhandy/examples/icons/widget-window-symbolic.svg3
-rw-r--r--subprojects/libhandy/examples/meson.build26
-rw-r--r--subprojects/libhandy/examples/sm.puri.Handy.Demo.json29
-rw-r--r--subprojects/libhandy/examples/style.css8
31 files changed, 4543 insertions, 0 deletions
diff --git a/subprojects/libhandy/examples/example.py b/subprojects/libhandy/examples/example.py
new file mode 100755
index 0000000..2a6f27a
--- /dev/null
+++ b/subprojects/libhandy/examples/example.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python3
+
+import gi
+
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
+gi.require_version('Handy', '1')
+from gi.repository import Handy
+import sys
+
+
+window = Gtk.Window(title = "Keypad Example with Python")
+vbox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
+entry = Gtk.Entry()
+keypad = Handy.Keypad()
+
+vbox.add(entry) # widget to show dialed number
+vbox.add(keypad)
+vbox.set_halign(Gtk.Align.CENTER)
+vbox.set_valign(Gtk.Align.CENTER)
+
+vbox.props.margin = 18
+vbox.props.spacing = 18
+keypad.set_row_spacing(6)
+keypad.set_column_spacing(6)
+
+keypad.set_entry(entry) # attach the entry widget
+
+window.connect("destroy", Gtk.main_quit)
+window.add(vbox)
+window.show_all()
+Gtk.main()
diff --git a/subprojects/libhandy/examples/handy-demo.c b/subprojects/libhandy/examples/handy-demo.c
new file mode 100644
index 0000000..052ce4c
--- /dev/null
+++ b/subprojects/libhandy/examples/handy-demo.c
@@ -0,0 +1,65 @@
+#include <gtk/gtk.h>
+#include <handy.h>
+
+#include "hdy-demo-preferences-window.h"
+#include "hdy-demo-window.h"
+
+static void
+show_preferences (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ GtkApplication *app = GTK_APPLICATION (user_data);
+ GtkWindow *window = gtk_application_get_active_window (app);
+ HdyDemoPreferencesWindow *preferences = hdy_demo_preferences_window_new ();
+
+ gtk_window_set_transient_for (GTK_WINDOW (preferences), window);
+ gtk_widget_show (GTK_WIDGET (preferences));
+}
+
+static void
+startup (GtkApplication *app)
+{
+ GtkCssProvider *css_provider = gtk_css_provider_new ();
+
+ hdy_init ();
+
+ gtk_css_provider_load_from_resource (css_provider, "/sm/puri/Handy/Demo/ui/style.css");
+ gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+ GTK_STYLE_PROVIDER (css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+ g_object_unref (css_provider);
+}
+
+static void
+show_window (GtkApplication *app)
+{
+ HdyDemoWindow *window;
+
+ window = hdy_demo_window_new (app);
+
+ gtk_widget_show (GTK_WIDGET (window));
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GtkApplication *app;
+ int status;
+ static GActionEntry app_entries[] = {
+ { "preferences", show_preferences, NULL, NULL, NULL },
+ };
+
+ app = gtk_application_new ("sm.puri.Handy.Demo", G_APPLICATION_FLAGS_NONE);
+ g_action_map_add_action_entries (G_ACTION_MAP (app),
+ app_entries, G_N_ELEMENTS (app_entries),
+ app);
+ g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
+ g_signal_connect (app, "activate", G_CALLBACK (show_window), NULL);
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+ g_object_unref (app);
+
+ return status;
+}
diff --git a/subprojects/libhandy/examples/handy-demo.gresources.xml b/subprojects/libhandy/examples/handy-demo.gresources.xml
new file mode 100644
index 0000000..e0825c1
--- /dev/null
+++ b/subprojects/libhandy/examples/handy-demo.gresources.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/sm/puri/Handy/Demo">
+ <file preprocess="xml-stripblanks">icons/dark-mode-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/gesture-touchscreen-swipe-back-symbolic-rtl.svg</file>
+ <file preprocess="xml-stripblanks">icons/gesture-touchscreen-swipe-back-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/gesture-touchpad-swipe-back-symbolic-rtl.svg</file>
+ <file preprocess="xml-stripblanks">icons/gesture-touchpad-swipe-back-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/gnome-smartphone-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/light-mode-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-carousel-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-clamp-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-deck-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-keypad-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-leaflet-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-list-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-search-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-view-switcher-symbolic.svg</file>
+ <file preprocess="xml-stripblanks">icons/widget-window-symbolic.svg</file>
+ </gresource>
+ <gresource prefix="/sm/puri/Handy/Demo/ui">
+ <file preprocess="xml-stripblanks">hdy-demo-preferences-window.ui</file>
+ <file preprocess="xml-stripblanks">hdy-demo-window.ui</file>
+ <file preprocess="xml-stripblanks">hdy-view-switcher-demo-window.ui</file>
+ <file compressed="true">style.css</file>
+ </gresource>
+</gresources>
diff --git a/subprojects/libhandy/examples/hdy-demo-preferences-window.c b/subprojects/libhandy/examples/hdy-demo-preferences-window.c
new file mode 100644
index 0000000..4481664
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-preferences-window.c
@@ -0,0 +1,56 @@
+#include "hdy-demo-preferences-window.h"
+
+struct _HdyDemoPreferencesWindow
+{
+ HdyPreferencesWindow parent_instance;
+
+ GtkWidget *subpage1;
+ GtkWidget *subpage2;
+};
+
+G_DEFINE_TYPE (HdyDemoPreferencesWindow, hdy_demo_preferences_window, HDY_TYPE_PREFERENCES_WINDOW)
+
+HdyDemoPreferencesWindow *
+hdy_demo_preferences_window_new (void)
+{
+ return g_object_new (HDY_TYPE_DEMO_PREFERENCES_WINDOW, NULL);
+}
+
+static void
+return_to_preferences_cb (HdyDemoPreferencesWindow *self)
+{
+ hdy_preferences_window_close_subpage (HDY_PREFERENCES_WINDOW (self));
+}
+
+static void
+subpage1_activated_cb (HdyDemoPreferencesWindow *self)
+{
+ hdy_preferences_window_present_subpage (HDY_PREFERENCES_WINDOW (self), self->subpage1);
+}
+
+static void
+subpage2_activated_cb (HdyDemoPreferencesWindow *self)
+{
+ hdy_preferences_window_present_subpage (HDY_PREFERENCES_WINDOW (self), self->subpage2);
+}
+
+static void
+hdy_demo_preferences_window_class_init (HdyDemoPreferencesWindowClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/Handy/Demo/ui/hdy-demo-preferences-window.ui");
+
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoPreferencesWindow, subpage1);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoPreferencesWindow, subpage2);
+
+ gtk_widget_class_bind_template_callback (widget_class, return_to_preferences_cb);
+ gtk_widget_class_bind_template_callback (widget_class, subpage1_activated_cb);
+ gtk_widget_class_bind_template_callback (widget_class, subpage2_activated_cb);
+}
+
+static void
+hdy_demo_preferences_window_init (HdyDemoPreferencesWindow *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
diff --git a/subprojects/libhandy/examples/hdy-demo-preferences-window.h b/subprojects/libhandy/examples/hdy-demo-preferences-window.h
new file mode 100644
index 0000000..accb7b5
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-preferences-window.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <handy.h>
+
+G_BEGIN_DECLS
+
+#define HDY_TYPE_DEMO_PREFERENCES_WINDOW (hdy_demo_preferences_window_get_type())
+
+G_DECLARE_FINAL_TYPE (HdyDemoPreferencesWindow, hdy_demo_preferences_window, HDY, DEMO_PREFERENCES_WINDOW, HdyPreferencesWindow)
+
+HdyDemoPreferencesWindow *hdy_demo_preferences_window_new (void);
+
+G_END_DECLS
diff --git a/subprojects/libhandy/examples/hdy-demo-preferences-window.ui b/subprojects/libhandy/examples/hdy-demo-preferences-window.ui
new file mode 100644
index 0000000..83c83a9
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-preferences-window.ui
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <template class="HdyDemoPreferencesWindow" parent="HdyPreferencesWindow">
+ <property name="can-swipe-back">True</property>
+ <child>
+ <object class="HdyPreferencesPage">
+ <property name="icon_name">edit-select-all-symbolic</property>
+ <property name="title">Layout</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyPreferencesRow">
+ <property name="title" bind-source="welcome_label" bind-property="label" bind-flags="sync-create"/>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel" id="welcome_label">
+ <property name="ellipsize">end</property>
+ <property name="label" translatable="yes">This is a preferences window</property>
+ <property name="margin">12</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="description" translatable="yes">Preferences are organized in pages, this example has the following pages:</property>
+ <property name="title" translatable="yes">Pages</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Layout</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Search</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="description" translatable="yes">Preferences are grouped together, a group can have a tile and a description. Descriptions will be wrapped if they are too long. This page has the following groups:</property>
+ <property name="title" translatable="yes">Groups</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">An untitled group</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Pages</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Groups</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Preferences</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="title" translatable="yes">Preferences</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Preferences rows are appended to the list box</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <style>
+ <class name="inline-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkLabel">
+ <property name="ellipsize">end</property>
+ <property name="label" translatable="yes">Other widgets are appended after the list box</property>
+ <property name="margin">12</property>
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="description" translatable="yes">Preferences windows can have subpages.</property>
+ <property name="title" translatable="yes">Subpages</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Go to a subpage</property>
+ <property name="visible">True</property>
+ <property name="activatable">True</property>
+ <signal name="activated" handler="subpage1_activated_cb" swapped="yes"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon_name">go-next-symbolic</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Go to another subpage</property>
+ <property name="visible">True</property>
+ <property name="activatable">True</property>
+ <signal name="activated" handler="subpage2_activated_cb" swapped="yes"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon_name">go-next-symbolic</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesPage">
+ <property name="icon_name">edit-find-symbolic</property>
+ <property name="title">Search</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyPreferencesGroup">
+ <property name="description">Preferences can be searched, do so using one of the following ways:</property>
+ <property name="title">Searching</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Activate the search button</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyPreferencesRow">
+ <property name="title" translatable="yes">Ctrl + F</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkShortcutLabel">
+ <property name="accelerator">&lt;ctrl&gt;f</property>
+ <property name="margin">12</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Directly type your search</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkBox" id="subpage1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">This is a subpage</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="opacity">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Return to the preferences</property>
+ <signal name="clicked" handler="return_to_preferences_cb" swapped="yes"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <object class="GtkBox" id="subpage2">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">This is another subpage</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="opacity">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Return to the preferences</property>
+ <signal name="clicked" handler="return_to_preferences_cb" swapped="yes"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/subprojects/libhandy/examples/hdy-demo-window.c b/subprojects/libhandy/examples/hdy-demo-window.c
new file mode 100644
index 0000000..55c872f
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-window.c
@@ -0,0 +1,573 @@
+#include "hdy-demo-window.h"
+
+#include <glib/gi18n.h>
+#include "hdy-view-switcher-demo-window.h"
+
+struct _HdyDemoWindow
+{
+ HdyApplicationWindow parent_instance;
+
+ HdyLeaflet *content_box;
+ GtkStack *header_revealer;
+ GtkStack *header_stack;
+ GtkImage *theme_variant_image;
+ GtkStackSidebar *sidebar;
+ GtkStack *stack;
+ HdyComboRow *leaflet_transition_row;
+ HdyDeck *content_deck;
+ HdyComboRow *deck_transition_row;
+ GtkWidget *box_keypad;
+ GtkListBox *keypad_listbox;
+ HdyKeypad *keypad;
+ HdySearchBar *search_bar;
+ GtkEntry *search_entry;
+ GtkListBox *lists_listbox;
+ HdyComboRow *combo_row;
+ HdyComboRow *enum_combo_row;
+ HdyCarousel *carousel;
+ GtkBox *carousel_box;
+ GtkListBox *carousel_listbox;
+ GtkStack *carousel_indicators_stack;
+ HdyComboRow *carousel_orientation_row;
+ HdyComboRow *carousel_indicators_row;
+ GListStore *carousel_indicators_model;
+ HdyAvatar *avatar;
+ GtkEntry *avatar_text;
+ GtkFileChooserButton *avatar_filechooser;
+ GtkListBox *avatar_contacts;
+};
+
+G_DEFINE_TYPE (HdyDemoWindow, hdy_demo_window, HDY_TYPE_APPLICATION_WINDOW)
+
+static void
+theme_variant_button_clicked_cb (HdyDemoWindow *self)
+{
+ GtkSettings *settings = gtk_settings_get_default ();
+ gboolean prefer_dark_theme;
+
+ g_object_get (settings, "gtk-application-prefer-dark-theme", &prefer_dark_theme, NULL);
+ g_object_set (settings, "gtk-application-prefer-dark-theme", !prefer_dark_theme, NULL);
+}
+
+static gboolean
+prefer_dark_theme_to_icon_name_cb (GBinding *binding,
+ const GValue *from_value,
+ GValue *to_value,
+ gpointer user_data)
+{
+ g_value_set_string (to_value,
+ g_value_get_boolean (from_value) ? "light-mode-symbolic" :
+ "dark-mode-symbolic");
+
+ return TRUE;
+}
+
+static gboolean
+hdy_demo_window_key_pressed_cb (GtkWidget *sender,
+ GdkEvent *event,
+ HdyDemoWindow *self)
+{
+ GdkModifierType default_modifiers = gtk_accelerator_get_default_mod_mask ();
+ guint keyval;
+ GdkModifierType state;
+
+ gdk_event_get_keyval (event, &keyval);
+ gdk_event_get_state (event, &state);
+
+ if ((keyval == GDK_KEY_q || keyval == GDK_KEY_Q) &&
+ (state & default_modifiers) == GDK_CONTROL_MASK) {
+ gtk_widget_destroy (GTK_WIDGET (self));
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+update (HdyDemoWindow *self)
+{
+ const gchar *header_bar_name = "default";
+
+ if (g_strcmp0 (gtk_stack_get_visible_child_name (self->stack), "deck") == 0)
+ header_bar_name = "deck";
+ else if (g_strcmp0 (gtk_stack_get_visible_child_name (self->stack), "search-bar") == 0)
+ header_bar_name = "search-bar";
+
+ gtk_stack_set_visible_child_name (self->header_stack, header_bar_name);
+}
+
+static void
+hdy_demo_window_notify_deck_visible_child_cb (HdyDemoWindow *self)
+{
+ update (self);
+}
+
+static void
+hdy_demo_window_notify_visible_child_cb (GObject *sender,
+ GParamSpec *pspec,
+ HdyDemoWindow *self)
+{
+ update (self);
+
+ hdy_leaflet_navigate (self->content_box, HDY_NAVIGATION_DIRECTION_FORWARD);
+}
+
+static void
+hdy_demo_window_back_clicked_cb (GtkWidget *sender,
+ HdyDemoWindow *self)
+{
+ hdy_leaflet_navigate (self->content_box, HDY_NAVIGATION_DIRECTION_BACK);
+}
+
+static void
+hdy_demo_window_deck_back_clicked_cb (GtkWidget *sender,
+ HdyDemoWindow *self)
+{
+ hdy_deck_navigate (self->content_deck, HDY_NAVIGATION_DIRECTION_BACK);
+}
+
+static gchar *
+leaflet_transition_name (HdyEnumValueObject *value,
+ gpointer user_data)
+{
+ g_return_val_if_fail (HDY_IS_ENUM_VALUE_OBJECT (value), NULL);
+
+ switch (hdy_enum_value_object_get_value (value)) {
+ case HDY_LEAFLET_TRANSITION_TYPE_OVER:
+ return g_strdup (_("Over"));
+ case HDY_LEAFLET_TRANSITION_TYPE_UNDER:
+ return g_strdup (_("Under"));
+ case HDY_LEAFLET_TRANSITION_TYPE_SLIDE:
+ return g_strdup (_("Slide"));
+ default:
+ return NULL;
+ }
+}
+
+static void
+notify_leaflet_transition_cb (GObject *sender,
+ GParamSpec *pspec,
+ HdyDemoWindow *self)
+{
+ HdyComboRow *row = HDY_COMBO_ROW (sender);
+
+ g_assert (HDY_IS_COMBO_ROW (row));
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ hdy_leaflet_set_transition_type (HDY_LEAFLET (self->content_box), hdy_combo_row_get_selected_index (row));
+}
+
+static gchar *
+deck_transition_name (HdyEnumValueObject *value,
+ gpointer user_data)
+{
+ g_return_val_if_fail (HDY_IS_ENUM_VALUE_OBJECT (value), NULL);
+
+ switch (hdy_enum_value_object_get_value (value)) {
+ case HDY_DECK_TRANSITION_TYPE_OVER:
+ return g_strdup (_("Over"));
+ case HDY_DECK_TRANSITION_TYPE_UNDER:
+ return g_strdup (_("Under"));
+ case HDY_DECK_TRANSITION_TYPE_SLIDE:
+ return g_strdup (_("Slide"));
+ default:
+ return NULL;
+ }
+}
+
+static void
+notify_deck_transition_cb (GObject *sender,
+ GParamSpec *pspec,
+ HdyDemoWindow *self)
+{
+ HdyComboRow *row = HDY_COMBO_ROW (sender);
+
+ g_assert (HDY_IS_COMBO_ROW (row));
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ hdy_deck_set_transition_type (HDY_DECK (self->content_deck), hdy_combo_row_get_selected_index (row));
+}
+
+static void
+deck_go_next_row_activated_cb (HdyDemoWindow *self)
+{
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ hdy_deck_navigate (self->content_deck, HDY_NAVIGATION_DIRECTION_FORWARD);
+}
+
+static void
+view_switcher_demo_clicked_cb (GtkButton *btn,
+ HdyDemoWindow *self)
+{
+ HdyViewSwitcherDemoWindow *window = hdy_view_switcher_demo_window_new ();
+
+ gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (self));
+ gtk_widget_show (GTK_WIDGET (window));
+}
+
+static gchar *
+carousel_orientation_name (HdyEnumValueObject *value,
+ gpointer user_data)
+{
+ g_return_val_if_fail (HDY_IS_ENUM_VALUE_OBJECT (value), NULL);
+
+ switch (hdy_enum_value_object_get_value (value)) {
+ case GTK_ORIENTATION_HORIZONTAL:
+ return g_strdup (_("Horizontal"));
+ case GTK_ORIENTATION_VERTICAL:
+ return g_strdup (_("Vertical"));
+ default:
+ return NULL;
+ }
+}
+
+static void
+notify_carousel_orientation_cb (GObject *sender,
+ GParamSpec *pspec,
+ HdyDemoWindow *self)
+{
+ HdyComboRow *row = HDY_COMBO_ROW (sender);
+
+ g_assert (HDY_IS_COMBO_ROW (row));
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self->carousel_box),
+ 1 - hdy_combo_row_get_selected_index (row));
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self->carousel),
+ hdy_combo_row_get_selected_index (row));
+}
+
+static gchar *
+carousel_indicators_name (HdyValueObject *value)
+{
+ const gchar *style;
+
+ g_assert (HDY_IS_VALUE_OBJECT (value));
+
+ style = hdy_value_object_get_string (value);
+
+ if (!g_strcmp0 (style, "dots"))
+ return g_strdup (_("Dots"));
+
+ if (!g_strcmp0 (style, "lines"))
+ return g_strdup (_("Lines"));
+
+ return NULL;
+}
+
+static void
+notify_carousel_indicators_cb (GObject *sender,
+ GParamSpec *pspec,
+ HdyDemoWindow *self)
+{
+ HdyComboRow *row = HDY_COMBO_ROW (sender);
+ HdyValueObject *obj;
+
+ g_assert (HDY_IS_COMBO_ROW (row));
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ obj = g_list_model_get_item (G_LIST_MODEL (self->carousel_indicators_model),
+ hdy_combo_row_get_selected_index (row));
+
+ gtk_stack_set_visible_child_name (self->carousel_indicators_stack,
+ hdy_value_object_get_string (obj));
+}
+
+static void
+carousel_return_clicked_cb (GtkButton *btn,
+ HdyDemoWindow *self)
+{
+ g_autoptr (GList) children =
+ gtk_container_get_children (GTK_CONTAINER (self->carousel));
+
+ hdy_carousel_scroll_to (self->carousel, GTK_WIDGET (children->data));
+}
+
+HdyDemoWindow *
+hdy_demo_window_new (GtkApplication *application)
+{
+ return g_object_new (HDY_TYPE_DEMO_WINDOW, "application", application, NULL);
+}
+
+static void
+avatar_file_remove_cb (HdyDemoWindow *self)
+{
+ g_autofree gchar *file = NULL;
+
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ g_signal_handlers_disconnect_by_data (self->avatar, self);
+ file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->avatar_filechooser));
+ if (file)
+ gtk_file_chooser_unselect_filename (GTK_FILE_CHOOSER (self->avatar_filechooser), file);
+ hdy_avatar_set_image_load_func (self->avatar, NULL, NULL, NULL);
+}
+
+static GdkPixbuf *
+avatar_load_file (gint size, HdyDemoWindow *self)
+{
+ g_autoptr (GError) error = NULL;
+ g_autoptr (GdkPixbuf) pixbuf = NULL;
+ g_autofree gchar *file = NULL;
+ gint width, height;
+
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (self->avatar_filechooser));
+
+ gdk_pixbuf_get_file_info (file, &width, &height);
+
+ pixbuf = gdk_pixbuf_new_from_file_at_scale (file,
+ (width <= height) ? size : -1,
+ (width >= height) ? size : -1,
+ TRUE,
+ &error);
+ if (error != NULL) {
+ g_critical ("Failed to create pixbuf from file: %s", error->message);
+
+ return NULL;
+ }
+
+ return g_steal_pointer (&pixbuf);
+}
+
+static void
+avatar_file_set_cb (HdyDemoWindow *self)
+{
+ g_assert (HDY_IS_DEMO_WINDOW (self));
+
+ hdy_avatar_set_image_load_func (self->avatar, (HdyAvatarImageLoadFunc) avatar_load_file, self, NULL);
+}
+
+static gchar *
+avatar_new_random_name (void)
+{
+ static const char *first_names[] = {
+ "Adam",
+ "Adrian",
+ "Anna",
+ "Charlotte",
+ "Frédérique",
+ "Ilaria",
+ "Jakub",
+ "Jennyfer",
+ "Julia",
+ "Justin",
+ "Mario",
+ "Miriam",
+ "Mohamed",
+ "Nourimane",
+ "Owen",
+ "Peter",
+ "Petra",
+ "Rachid",
+ "Rebecca",
+ "Sarah",
+ "Thibault",
+ "Wolfgang",
+ };
+ static const char *last_names[] = {
+ "Bailey",
+ "Berat",
+ "Chen",
+ "Farquharson",
+ "Ferber",
+ "Franco",
+ "Galinier",
+ "Han",
+ "Lawrence",
+ "Lepied",
+ "Lopez",
+ "Mariotti",
+ "Rossi",
+ "Urasawa",
+ "Zwickelman",
+ };
+
+ return g_strdup_printf ("%s %s",
+ first_names[g_random_int_range (0, G_N_ELEMENTS (first_names))],
+ last_names[g_random_int_range (0, G_N_ELEMENTS (last_names))]);
+}
+
+static void
+avatar_update_contacts (HdyDemoWindow *self)
+{
+ g_autoptr (GList) children = gtk_container_get_children (GTK_CONTAINER (self->avatar_contacts));
+
+ for (GList *child = children; child; child = child->next)
+ gtk_container_remove (GTK_CONTAINER (self->avatar_contacts), child->data);
+
+ for (int i = 0; i < 30; i++) {
+ g_autofree gchar *name = avatar_new_random_name ();
+ GtkWidget *contact = hdy_action_row_new ();
+ GtkWidget *avatar = hdy_avatar_new (40, name, TRUE);
+
+ gtk_widget_show (contact);
+ gtk_widget_show (avatar);
+
+ gtk_widget_set_margin_top (avatar, 12);
+ gtk_widget_set_margin_bottom (avatar, 12);
+
+ hdy_preferences_row_set_title (HDY_PREFERENCES_ROW (contact), name);
+ hdy_action_row_add_prefix (HDY_ACTION_ROW (contact), avatar);
+ gtk_container_add (GTK_CONTAINER (self->avatar_contacts), contact);
+ }
+}
+
+static void
+hdy_demo_window_constructed (GObject *object)
+{
+ HdyDemoWindow *self = HDY_DEMO_WINDOW (object);
+
+ G_OBJECT_CLASS (hdy_demo_window_parent_class)->constructed (object);
+
+ hdy_search_bar_connect_entry (self->search_bar, self->search_entry);
+}
+
+
+static void
+hdy_demo_window_class_init (HdyDemoWindowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->constructed = hdy_demo_window_constructed;
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/Handy/Demo/ui/hdy-demo-window.ui");
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, content_box);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, header_revealer);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, header_stack);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, theme_variant_image);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, sidebar);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, stack);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, leaflet_transition_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, content_deck);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, deck_transition_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, box_keypad);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, keypad_listbox);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, keypad);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, search_bar);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, search_entry);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, lists_listbox);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, combo_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, enum_combo_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel_box);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel_listbox);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel_indicators_stack);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel_orientation_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, carousel_indicators_row);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, avatar);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, avatar_text);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, avatar_filechooser);
+ gtk_widget_class_bind_template_child (widget_class, HdyDemoWindow, avatar_contacts);
+ gtk_widget_class_bind_template_callback_full (widget_class, "key_pressed_cb", G_CALLBACK(hdy_demo_window_key_pressed_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_visible_child_cb", G_CALLBACK(hdy_demo_window_notify_visible_child_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_deck_visible_child_cb", G_CALLBACK(hdy_demo_window_notify_deck_visible_child_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "back_clicked_cb", G_CALLBACK(hdy_demo_window_back_clicked_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "deck_back_clicked_cb", G_CALLBACK(hdy_demo_window_deck_back_clicked_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_leaflet_transition_cb", G_CALLBACK(notify_leaflet_transition_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_deck_transition_cb", G_CALLBACK(notify_deck_transition_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "deck_go_next_row_activated_cb", G_CALLBACK(deck_go_next_row_activated_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "theme_variant_button_clicked_cb", G_CALLBACK(theme_variant_button_clicked_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "view_switcher_demo_clicked_cb", G_CALLBACK(view_switcher_demo_clicked_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_carousel_orientation_cb", G_CALLBACK(notify_carousel_orientation_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "notify_carousel_indicators_cb", G_CALLBACK(notify_carousel_indicators_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "carousel_return_clicked_cb", G_CALLBACK(carousel_return_clicked_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "avatar_file_remove_cb", G_CALLBACK(avatar_file_remove_cb));
+ gtk_widget_class_bind_template_callback_full (widget_class, "avatar_file_set_cb", G_CALLBACK(avatar_file_set_cb));
+}
+
+static void
+lists_page_init (HdyDemoWindow *self)
+{
+ GListStore *list_store;
+ HdyValueObject *obj;
+
+ list_store = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+
+ obj = hdy_value_object_new_string ("Foo");
+ g_list_store_insert (list_store, 0, obj);
+ g_clear_object (&obj);
+
+ obj = hdy_value_object_new_string ("Bar");
+ g_list_store_insert (list_store, 1, obj);
+ g_clear_object (&obj);
+
+ obj = hdy_value_object_new_string ("Baz");
+ g_list_store_insert (list_store, 2, obj);
+ g_clear_object (&obj);
+
+ hdy_combo_row_bind_name_model (self->combo_row, G_LIST_MODEL (list_store), (HdyComboRowGetNameFunc) hdy_value_object_dup_string, NULL, NULL);
+
+ hdy_combo_row_set_for_enum (self->enum_combo_row, GTK_TYPE_LICENSE, hdy_enum_value_row_name, NULL, NULL);
+ update (self);
+}
+
+static void
+carousel_page_init (HdyDemoWindow *self)
+{
+ HdyValueObject *obj;
+
+ hdy_combo_row_set_for_enum (self->carousel_orientation_row,
+ GTK_TYPE_ORIENTATION,
+ carousel_orientation_name,
+ NULL,
+ NULL);
+
+ self->carousel_indicators_model = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+
+ obj = hdy_value_object_new_string ("dots");
+ g_list_store_insert (self->carousel_indicators_model, 0, obj);
+ g_clear_object (&obj);
+
+ obj = hdy_value_object_new_string ("lines");
+ g_list_store_insert (self->carousel_indicators_model, 1, obj);
+ g_clear_object (&obj);
+
+ hdy_combo_row_bind_name_model (self->carousel_indicators_row,
+ G_LIST_MODEL (self->carousel_indicators_model),
+ (HdyComboRowGetNameFunc) carousel_indicators_name,
+ NULL,
+ NULL);
+}
+
+static void
+avatar_page_init (HdyDemoWindow *self)
+{
+ g_autofree gchar *name = avatar_new_random_name ();
+
+ gtk_entry_set_text (self->avatar_text, name);
+
+ avatar_update_contacts (self);
+}
+
+static void
+hdy_demo_window_init (HdyDemoWindow *self)
+{
+ GtkSettings *settings = gtk_settings_get_default ();
+
+ gtk_widget_init_template (GTK_WIDGET (self));
+
+ g_object_bind_property_full (settings, "gtk-application-prefer-dark-theme",
+ self->theme_variant_image, "icon-name",
+ G_BINDING_SYNC_CREATE,
+ prefer_dark_theme_to_icon_name_cb,
+ NULL,
+ NULL,
+ NULL);
+
+ hdy_combo_row_set_for_enum (self->leaflet_transition_row, HDY_TYPE_LEAFLET_TRANSITION_TYPE, leaflet_transition_name, NULL, NULL);
+ hdy_combo_row_set_selected_index (self->leaflet_transition_row, HDY_LEAFLET_TRANSITION_TYPE_OVER);
+
+ hdy_combo_row_set_for_enum (self->deck_transition_row, HDY_TYPE_DECK_TRANSITION_TYPE, deck_transition_name, NULL, NULL);
+ hdy_combo_row_set_selected_index (self->deck_transition_row, HDY_DECK_TRANSITION_TYPE_OVER);
+
+ lists_page_init (self);
+ carousel_page_init (self);
+ avatar_page_init (self);
+
+ hdy_leaflet_set_visible_child_name (self->content_box, "content");
+}
diff --git a/subprojects/libhandy/examples/hdy-demo-window.h b/subprojects/libhandy/examples/hdy-demo-window.h
new file mode 100644
index 0000000..d263e13
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-window.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <handy.h>
+
+G_BEGIN_DECLS
+
+#define HDY_TYPE_DEMO_WINDOW (hdy_demo_window_get_type())
+
+G_DECLARE_FINAL_TYPE (HdyDemoWindow, hdy_demo_window, HDY, DEMO_WINDOW, HdyApplicationWindow)
+
+HdyDemoWindow *hdy_demo_window_new (GtkApplication *application);
+
+G_END_DECLS
diff --git a/subprojects/libhandy/examples/hdy-demo-window.ui b/subprojects/libhandy/examples/hdy-demo-window.ui
new file mode 100644
index 0000000..9d00588
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-demo-window.ui
@@ -0,0 +1,2352 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.1 -->
+<interface>
+ <requires lib="gtk+" version="3.16"/>
+ <requires lib="libhandy" version="1.0"/>
+ <menu id="primary_menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Preferences</attribute>
+ <attribute name="action">app.preferences</attribute>
+ </item>
+ </section>
+ </menu>
+ <template class="HdyDemoWindow" parent="HdyApplicationWindow">
+ <property name="can_focus">False</property>
+ <property name="title">Handy Demo</property>
+ <property name="default_width">800</property>
+ <property name="default_height">576</property>
+ <signal name="key-press-event" handler="key_pressed_cb" after="yes" swapped="no"/>
+ <child>
+ <object class="HdyLeaflet" id="content_box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="can-swipe-back">True</property>
+ <property name="width-request">360</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRevealer" id="header_revealer">
+ <property name="visible">True</property>
+ <property name="transition-type">slide-down</property>
+ <property name="reveal-child" bind-source="window_header_revealer_switch" bind-property="state" bind-flags="sync-create | bidirectional"/>
+ <child>
+ <object class="HdyHeaderBar" id="header_bar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title">Handy Demo</property>
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <signal name="clicked" handler="theme_variant_button_clicked_cb" swapped="yes"/>
+ <child>
+ <object class="GtkImage" id="theme_variant_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuButton" id="menu_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="focus_on_click">False</property>
+ <property name="menu_model">primary_menu</property>
+ <property name="use_popover">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">open-menu-symbolic</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStackSidebar" id="sidebar">
+ <property name="width_request">270</property>
+ <property name="visible">True</property>
+ <property name="vexpand">True</property>
+ <property name="can_focus">False</property>
+ <property name="stack">stack</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">sidebar</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRevealer">
+ <property name="visible">True</property>
+ <property name="transition-type" bind-source="header_revealer" bind-property="transition-type" bind-flags="bidirectional|sync-create"/>
+ <property name="reveal-child" bind-source="header_revealer" bind-property="reveal-child" bind-flags="bidirectional|sync-create"/>
+ <child>
+ <object class="HdyWindowHandle" id="header_separator">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkSeparator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <style>
+ <class name="sidebar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">True</property>
+ <style>
+ <class name="sidebar"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="navigatable">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="right_box">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRevealer">
+ <property name="visible">True</property>
+ <property name="transition-type" bind-source="header_revealer" bind-property="transition-type" bind-flags="bidirectional|sync-create"/>
+ <property name="reveal-child" bind-source="header_revealer" bind-property="reveal-child" bind-flags="bidirectional|sync-create"/>
+ <child>
+ <object class="GtkStack" id="header_stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">False</property>
+ <property name="transition-type" bind-source="stack" bind-property="transition-type" bind-flags="sync-create"/>
+ <child>
+ <object class="HdyHeaderBar" id="default_header_bar">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkButton" id="back">
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="use-underline">True</property>
+ <property name="visible" bind-source="content_box" bind-property="folded" bind-flags="sync-create"/>
+ <signal name="clicked" handler="back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-back">
+ <property name="accessible-name" translatable="yes">Back</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="back_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">default</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyDeck" id="header_deck">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="can-swipe-back">True</property>
+ <property name="transition-type" bind-source="content_deck" bind-property="transition-type" bind-flags="sync-create"/>
+ <child>
+ <object class="HdyHeaderBar" id="deck_header_bar">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkButton" id="deck-back">
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="use-underline">True</property>
+ <property name="visible" bind-source="content_box" bind-property="folded" bind-flags="sync-create"/>
+ <signal name="clicked" handler="back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-deck-back">
+ <property name="accessible-name" translatable="yes">Back</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyHeaderBar" id="deck_sub_header_bar">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkButton" id="deck-sub-back">
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="use-underline">True</property>
+ <property name="visible">True</property>
+ <signal name="clicked" handler="deck_back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-deck-sub-back">
+ <property name="accessible-name" translatable="yes">Back</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">deck</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyHeaderBar" id="search_bar_header_bar">
+ <property name="visible">True</property>
+ <property name="expand">True</property>
+ <property name="show_close_button">True</property>
+ <child>
+ <object class="GtkButton">
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="use-underline">True</property>
+ <property name="visible" bind-source="content_box" bind-property="folded" bind-flags="sync-create"/>
+ <signal name="clicked" handler="back_clicked_cb"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child internal-child="accessible">
+ <object class="AtkObject">
+ <property name="accessible-name" translatable="yes">Back</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">go-previous-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="receives_default">False</property>
+ <property name="valign">center</property>
+ <property name="use-underline">True</property>
+ <property name="active" bind-source="search_bar" bind-property="search-mode-enabled" bind-flags="sync-create|bidirectional"/>
+ <style>
+ <class name="image-button"/>
+ </style>
+ <child internal-child="accessible">
+ <object class="AtkObject" id="a11y-search">
+ <property name="accessible-name" translatable="yes">Search</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="search_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">edit-find-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="pack_type">end</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="name">search-bar</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolled_window">
+ <property name="visible">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vexpand">True</property>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vhomogeneous">False</property>
+ <signal name="notify::visible-child" handler="notify_visible_child_cb" after="yes" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="welcome">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkImage" id="icon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_bottom">18</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">gnome-smartphone-symbolic</property>
+ <property name="icon_size">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <child>
+ <object class="GtkLabel" id="label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="halign">center</property>
+ <property name="margin_bottom">12</property>
+ <property name="label" translatable="yes">Welcome to Handy Demo</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="empty-state-label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="label" translatable="yes">This is a tour of the features the library has to offer.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="name">welcome</property>
+ <property name="title">Welcome</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-leaflet-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Leaflet</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A widget showing either all its children or only one, depending on the available space. This window is using a leaflet, you can control it with the settings below.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="label" translatable="yes">Leaflet</property>
+ <property name="justify">left</property>
+ <property name="halign">start</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyComboRow" id="leaflet_transition_row">
+ <property name="subtitle" translatable="yes">The type of transition to use when the leaflet adapts its size or when changing the visible child</property>
+ <property name="title" translatable="yes">Transition type</property>
+ <property name="visible">True</property>
+ <signal name="notify::selected-index" handler="notify_leaflet_transition_cb" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">leaflet</property>
+ <property name="title">Leaflet</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyDeck" id="content_deck">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="transition-type">over</property>
+ <property name="can-swipe-back">True</property>
+ <signal name="notify::visible-child" handler="notify_deck_visible_child_cb" after="yes" swapped="yes"/>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-deck-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Deck</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A widget showing only one of its children at a time. This page is using decks, you can control them with the settings below.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="label" translatable="yes">Deck</property>
+ <property name="justify">left</property>
+ <property name="halign">start</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyComboRow" id="deck_transition_row">
+ <property name="subtitle" translatable="yes">The type of transition to use when the decks adapt their size or when changing the visible child</property>
+ <property name="title" translatable="yes">Transition type</property>
+ <property name="visible">True</property>
+ <signal name="notify::selected-index" handler="notify_deck_transition_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Go to the next page of the deck</property>
+ <property name="use_underline">True</property>
+ <property name="visible">True</property>
+ <property name="activatable">True</property>
+ <signal name="activated" handler="deck_go_next_row_activated_cb" swapped="yes"/>
+ <child>
+ <object class="GtkImage">
+ <property name="icon_name">go-next-symbolic</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ <property name="margin">12</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="halign">center</property>
+ <property name="label" translatable="yes">Go back</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gesture-touchscreen-swipe-back-symbolic</property>
+ <property name="pixel-size">128</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gesture-touchpad-swipe-back-symbolic</property>
+ <property name="pixel-size">128</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">sub</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="name">deck</property>
+ <property name="title">Deck</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-keypad-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Keypad</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A number keypad.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="maximum-size">300</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox" id="box_keypad">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkListBox" id="keypad_listbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Show letters</property>
+ <property name="activatable_widget">keypad_letters_visible</property>
+ <child>
+ <object class="GtkSwitch" id="keypad_letters_visible">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="state">True</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Show symbols</property>
+ <property name="activatable_widget">keypad_symbols_visible</property>
+ <child>
+ <object class="GtkSwitch" id="keypad_symbols_visible">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="state">True</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="entry_keypad">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyKeypad" id="keypad">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="entry">entry_keypad</property>
+ <property name="symbols-visible" bind-source="keypad_symbols_visible" bind-property="state" bind-flags="sync-create | bidirectional"/>
+ <property name="letters-visible" bind-source="keypad_letters_visible" bind-property="state" bind-flags="sync-create | bidirectional"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">keypad</property>
+ <property name="title">Keypad</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size" bind-source="clamp_maximum_size_adjustment" bind-property="value" bind-flags="sync-create"/>
+ <property name="tightening-threshold" bind-source="clamp_tightening_threshold_adjustment" bind-property="value" bind-flags="sync-create"/>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-clamp-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Clamp</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">This page is clamped to smoothly grow up to a maximum width.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="label" translatable="yes">Clamp</property>
+ <property name="justify">left</property>
+ <property name="halign">start</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="clamp_listbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Maximum width</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkSpinButton">
+ <property name="adjustment">clamp_maximum_size_adjustment</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Tightening threshold</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkSpinButton">
+ <property name="adjustment">clamp_tightening_threshold_adjustment</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">clamp</property>
+ <property name="title">Clamp</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-list-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Lists</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Rows and helpers for &lt;i&gt;GtkListBox&lt;/i&gt;.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="label" translatable="yes">Lists</property>
+ <property name="justify">left</property>
+ <property name="halign">start</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="lists_listbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="icon_name" translatable="yes">preferences-other-symbolic</property>
+ <property name="subtitle" translatable="yes">They also have a subtitle and an icon</property>
+ <property name="title" translatable="yes">Rows have a title</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="activatable_widget">frobnicate</property>
+ <property name="title" translatable="yes">Rows can have action widgets</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkButton" id="frobnicate">
+ <property name="can_focus">True</property>
+ <property name="halign">end</property>
+ <property name="label" translatable="yes">Frobnicate</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ <style>
+ <class name="list-button"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="activatable_widget">radio_button_1</property>
+ <property name="title" translatable="yes">Rows can have prefix widgets</property>
+ <property name="visible">True</property>
+ <child type="prefix">
+ <object class="GtkRadioButton" id="radio_button_1">
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="activatable_widget">radio_button_2</property>
+ <property name="title" translatable="yes">Rows can have prefix widgets</property>
+ <property name="visible">True</property>
+ <child type="prefix">
+ <object class="GtkRadioButton" id="radio_button_2">
+ <property name="can_focus">False</property>
+ <property name="group">radio_button_1</property>
+ <property name="valign">center</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyComboRow" id="combo_row">
+ <property name="title" translatable="yes">Combo row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyComboRow" id="enum_combo_row">
+ <property name="subtitle" translatable="yes">This combo row was created from an enumeration</property>
+ <property name="title" translatable="yes">Enumeration combo row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow" id="expander_row">
+ <property name="title" translatable="yes">Expander row</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkListBoxRow">
+ <property name="activatable">False</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Hello, world!</property>
+ <property name="margin">12</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow" id="action_expander_row">
+ <property name="title" translatable="yes">Expander row with an action</property>
+ <property name="visible">True</property>
+ <child type="action">
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="list-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">edit-copy-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">A nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Another nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow">
+ <property name="title" translatable="yes">Expander row with a prefix</property>
+ <property name="visible">True</property>
+ <child type="prefix">
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="list-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">system-shutdown-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">A nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Another nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow">
+ <property name="title" translatable="yes">Expander row with a prefix and icon</property>
+ <property name="visible">True</property>
+ <property name="icon-name">action-unavailable-symbolic</property>
+ <child type="prefix">
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="list-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">system-shutdown-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">A nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Another nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow" id="enable_expander_row">
+ <property name="show_enable_switch">True</property>
+ <property name="title" translatable="yes">Toggleable expander row</property>
+ <property name="visible">True</property>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">A nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Another nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyExpanderRow" id="action_switch_expander_row">
+ <property name="show_enable_switch">True</property>
+ <property name="title" translatable="yes">Toggleable expander row with an action</property>
+ <property name="visible">True</property>
+ <child type="action">
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="valign">center</property>
+ <style>
+ <class name="list-button"/>
+ </style>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="icon-name">edit-copy-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">A nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="title" translatable="yes">Another nested row</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">lists</property>
+ <property name="title">Lists</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkOverlay">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child type="overlay">
+ <object class="HdySearchBar" id="search_bar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">start</property>
+ <property name="hexpand">True</property>
+ <property name="show-close-button">True</property>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkSearchEntry" id="search_entry">
+ <property name="visible">True</property>
+ <property name="hexpand">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_bottom">18</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-search-symbolic</property>
+ <property name="icon_size">0</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="halign">center</property>
+ <property name="margin_bottom">12</property>
+ <property name="label" translatable="yes">Search bar</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="margin_bottom">6</property>
+ <property name="label" translatable="yes">A search bar that gives your search entry all the space it needs.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="opacity">0.5</property>
+ <property name="label" translatable="yes">Try using it with an horizontaly expanded clamp to make your search entry adaptive.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">search-bar</property>
+ <property name="title">Search bar</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-view-switcher-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">View Switcher</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Widgets to switch the window's view.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Run the demo</property>
+ <signal name="clicked" handler="view_switcher_demo_clicked_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">view-switcher</property>
+ <property name="title">View Switcher</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="carousel_box">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="carousel_empty_box">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="HdyCarousel" id="carousel">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-carousel-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ <class name="carousel-icon"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Carousel</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A widget for paginated scrolling.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkListBox" id="carousel_listbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyComboRow" id="carousel_orientation_row">
+ <property name="title" translatable="yes">Orientation</property>
+ <property name="visible">True</property>
+ <signal name="notify::selected-index" handler="notify_carousel_orientation_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="HdyComboRow" id="carousel_indicators_row">
+ <property name="title" translatable="yes">Page Indicators</property>
+ <property name="visible">True</property>
+ <signal name="notify::selected-index" handler="notify_carousel_indicators_cb" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">24</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Another page</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="opacity">0.5</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Return to the first page</property>
+ <property name="use-underline">True</property>
+ <signal name="clicked" handler="carousel_return_clicked_cb" swapped="no"/>
+ <style>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="carousel_indicators_stack">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="margin">6</property>
+ <child>
+ <object class="HdyCarouselIndicatorDots">
+ <property name="visible">True</property>
+ <property name="carousel">carousel</property>
+ <property name="orientation" bind-source="carousel" bind-property="orientation" bind-flags="sync-create"/>
+ </object>
+ <packing>
+ <property name="name">dots</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyCarouselIndicatorLines">
+ <property name="visible">True</property>
+ <property name="carousel">carousel</property>
+ <property name="orientation" bind-source="carousel" bind-property="orientation" bind-flags="sync-create"/>
+ </object>
+ <packing>
+ <property name="name">lines</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">carousel</property>
+ <property name="title">Carousel</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="HdyAvatar" id="avatar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="halign">center</property>
+ <property name="size" bind-source="avatar_size" bind-property="value" bind-flags="sync-create"></property>
+ <property name="margin-bottom">18</property>
+ <property name="show-initials" bind-source="avatar_show_initials" bind-property="state" bind-flags="sync-create"/>
+ <property name="text" bind-source="avatar_text" bind-property="text" bind-flags="sync-create"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Avatar</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A user avatar with generated fallback.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="hexpand">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Text</property>
+ <child>
+ <object class="GtkEntry" id="avatar_text">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Show initials</property>
+ <property name="activatable_widget">avatar_show_initials</property>
+ <child>
+ <object class="GtkSwitch" id="avatar_show_initials">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="state">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">File</property>
+ <child>
+ <object class="GtkFileChooserButton" id="avatar_filechooser">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="title" translatable="yes"/>
+ <signal name="file-set" swapped="yes" handler="avatar_file_set_cb"/>
+ <property name="filter">avatar_file_filter</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <signal name="clicked" swapped="yes" handler="avatar_file_remove_cb"/>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">user-trash-symbolic</property>
+ <property name="icon_size">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Size</property>
+ <child>
+ <object class="GtkSpinButton" id="avatar_size">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="valign">center</property>
+ <property name="numeric">True</property>
+ <property name="adjustment">avatar_adjustment</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox" id="avatar_contacts">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">avatar</property>
+ <property name="title">Avatar</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyClamp">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">fill</property>
+ <property name="margin-bottom">32</property>
+ <property name="margin-start">12</property>
+ <property name="margin-end">12</property>
+ <property name="margin-top">32</property>
+ <property name="expand">True</property>
+ <property name="maximum-size">400</property>
+ <property name="tightening-threshold">300</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-bottom">32</property>
+ <property name="expand">True</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="pixel_size">128</property>
+ <property name="icon_name">widget-window-symbolic</property>
+ <property name="icon-size">0</property>
+ <property name="margin-bottom">18</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Window</property>
+ <property name="halign">center</property>
+ <property name="xalign">0</property>
+ <property name="margin-bottom">6</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">A freeform window.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ <property name="margin-bottom">6</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="opacity">0.5</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">It allows to have headerbar in content area, incl. above content, and round corners on the bottom. This window is an example, try hiding the titlebar.</property>
+ <property name="justify">center</property>
+ <property name="use_markup">true</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="label" translatable="yes">Window</property>
+ <property name="justify">left</property>
+ <property name="halign">start</property>
+ <property name="margin-bottom">12</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">Show titlebar</property>
+ <property name="activatable_widget">window_header_revealer_switch</property>
+ <child>
+ <object class="GtkSwitch" id="window_header_revealer_switch">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="state">True</property>
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="HdyWindowHandle">
+ <property name="visible">True</property>
+ <property name="margin-top">12</property>
+ <child>
+ <object class="GtkListBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="expand">True</property>
+ <property name="selection-mode">none</property>
+ <style>
+ <class name="content"/>
+ </style>
+ <child>
+ <object class="HdyActionRow">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">This row acts as a titlebar</property>
+ <property name="subtitle" translatable="yes">Try dragging or right clicking it.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">window</property>
+ <property name="title">Window</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="name">content</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkSizeGroup">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="header_bar"/>
+ <widget name="header_separator"/>
+ <widget name="header_stack"/>
+ </widgets>
+ </object>
+ <object class="HdyHeaderGroup" id="header_group">
+ <property name="decorate-all" bind-source="content_box" bind-property="folded" bind-flags="sync-create"/>
+ <headerbars>
+ <headerbar name="header_bar"/>
+ <headerbar name="default_header_bar"/>
+ <headerbar name="search_bar_header_bar"/>
+ <headerbar name="deck_header_bar"/>
+ <headerbar name="deck_sub_header_bar"/>
+ </headerbars>
+ </object>
+ <object class="HdySwipeGroup" id="deck_swipe_group">
+ <swipeables>
+ <swipeable name="header_deck"/>
+ <swipeable name="content_deck"/>
+ </swipeables>
+ </object>
+ <object class="GtkAdjustment" id="clamp_maximum_size_adjustment">
+ <property name="lower">0</property>
+ <property name="upper">10000</property>
+ <property name="value">600</property>
+ <property name="page-increment">100</property>
+ <property name="step-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="clamp_tightening_threshold_adjustment">
+ <property name="lower">0</property>
+ <property name="upper">10000</property>
+ <property name="value">500</property>
+ <property name="page-increment">100</property>
+ <property name="step-increment">10</property>
+ </object>
+ <object class="GtkSizeGroup">
+ <property name="mode">both</property>
+ <widgets>
+ <widget name="carousel_empty_box"/>
+ <widget name="carousel_indicators_stack"/>
+ </widgets>
+ </object>
+ <object class="GtkAdjustment" id="avatar_adjustment">
+ <property name="lower">24</property>
+ <property name="upper">320</property>
+ <property name="value">128</property>
+ <property name="page-increment">8</property>
+ <property name="step-increment">8</property>
+ </object>
+ <object class="GtkFileFilter" id="avatar_file_filter">
+ <mime-types>
+ <mime-type>image/png</mime-type>
+ <mime-type>image/jpeg</mime-type>
+ <mime-type>image/jpg</mime-type>
+ <mime-type>image/gif</mime-type>
+ </mime-types>
+ </object>
+</interface>
diff --git a/subprojects/libhandy/examples/hdy-view-switcher-demo-window.c b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.c
new file mode 100644
index 0000000..2251658
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.c
@@ -0,0 +1,30 @@
+#include "hdy-view-switcher-demo-window.h"
+
+#include <glib/gi18n.h>
+
+struct _HdyViewSwitcherDemoWindow
+{
+ HdyWindow parent_instance;
+};
+
+G_DEFINE_TYPE (HdyViewSwitcherDemoWindow, hdy_view_switcher_demo_window, HDY_TYPE_WINDOW)
+
+static void
+hdy_view_switcher_demo_window_class_init (HdyViewSwitcherDemoWindowClass *klass)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/Handy/Demo/ui/hdy-view-switcher-demo-window.ui");
+}
+
+static void
+hdy_view_switcher_demo_window_init (HdyViewSwitcherDemoWindow *self)
+{
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+HdyViewSwitcherDemoWindow *
+hdy_view_switcher_demo_window_new (void)
+{
+ return g_object_new (HDY_TYPE_VIEW_SWITCHER_DEMO_WINDOW, NULL);
+}
diff --git a/subprojects/libhandy/examples/hdy-view-switcher-demo-window.h b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.h
new file mode 100644
index 0000000..76dcdd7
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <handy.h>
+
+G_BEGIN_DECLS
+
+#define HDY_TYPE_VIEW_SWITCHER_DEMO_WINDOW (hdy_view_switcher_demo_window_get_type())
+
+G_DECLARE_FINAL_TYPE (HdyViewSwitcherDemoWindow, hdy_view_switcher_demo_window, HDY, VIEW_SWITCHER_DEMO_WINDOW, HdyWindow)
+
+HdyViewSwitcherDemoWindow *hdy_view_switcher_demo_window_new (void);
+
+G_END_DECLS
diff --git a/subprojects/libhandy/examples/hdy-view-switcher-demo-window.ui b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.ui
new file mode 100644
index 0000000..d6cc82e
--- /dev/null
+++ b/subprojects/libhandy/examples/hdy-view-switcher-demo-window.ui
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.22.0 -->
+<interface>
+ <requires lib="gtk+" version="3.20"/>
+ <requires lib="libhandy" version="0.0"/>
+ <template class="HdyViewSwitcherDemoWindow" parent="HdyWindow">
+ <property name="can_focus">False</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="HdyHeaderBar">
+ <property name="visible">True</property>
+ <property name="centering_policy">strict</property>
+ <property name="can_focus">False</property>
+ <property name="show_close_button">True</property>
+ <property name="title">HdyViewSwitcher Demo</property>
+ <child type="title">
+ <object class="HdyViewSwitcherTitle" id="switcher_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stack">stack</property>
+ <property name="title" translatable="yes">View Switcher Example</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin">24</property>
+ <property name="label" translatable="yes">World</property>
+ </object>
+ <packing>
+ <property name="name">page1</property>
+ <property name="title" translatable="yes">World</property>
+ <property name="icon_name">help-about-symbolic</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin">24</property>
+ <property name="label" translatable="yes">Alarm</property>
+ </object>
+ <packing>
+ <property name="name">page2</property>
+ <property name="title" translatable="yes">Alarm</property>
+ <property name="icon_name">alarm-symbolic</property>
+ <property name="position">1</property>
+ <property name="needs_attention">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin">24</property>
+ <property name="label" translatable="yes">Stopwatch</property>
+ </object>
+ <packing>
+ <property name="name">page3</property>
+ <property name="title" translatable="yes">Stopwatch</property>
+ <property name="icon_name">document-print-symbolic</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin">24</property>
+ <property name="label" translatable="yes">Timer</property>
+ </object>
+ <packing>
+ <property name="name">page0</property>
+ <property name="title" translatable="yes">Timer</property>
+ <property name="icon_name">weather-clear-symbolic</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyViewSwitcherBar" id="switcher_bar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stack">stack</property>
+ <property name="reveal" bind-source="switcher_title" bind-property="title-visible" bind-flags="sync-create"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/subprojects/libhandy/examples/icons/dark-mode-symbolic.svg b/subprojects/libhandy/examples/icons/dark-mode-symbolic.svg
new file mode 100644
index 0000000..256ca41
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/dark-mode-symbolic.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0beta2 (2b71d25d45, 2019-12-03)"
+ sodipodi:docname="dark-mode-symbolic.svg"
+ id="svg8"
+ version="1.1"
+ height="16"
+ width="16">
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <sodipodi:namedview
+ inkscape:current-layer="g6"
+ inkscape:window-maximized="1"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:cy="9.636866"
+ inkscape:cx="14.061833"
+ inkscape:zoom="35.858323"
+ showgrid="true"
+ id="namedview10"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ inkscape:document-rotation="0"
+ bordercolor="#666666"
+ pagecolor="#ffffff">
+ <inkscape:grid
+ id="grid841"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <g
+ id="g6"
+ fill="#2e3436">
+ <path
+ d="M 8 4.0058594 C 5.805 4.0058594 4 5.8108594 4 8.0058594 C 4 10.200859 5.805 12.005859 8 12.005859 C 10.195 12.005859 12 10.200859 12 8.0058594 C 12 5.8108594 10.195 4.0058594 8 4.0058594 z M 8 6 C 9.1007925 6 10.005859 6.9050669 10.005859 8.0058594 C 10.005859 9.1066519 9.1007925 10.011719 8 10.011719 C 6.8992075 10.011719 5.9941406 9.1066519 5.9941406 8.0058594 C 5.9941406 6.9050669 6.8992075 6 8 6 z "
+ style="line-height:normal;-inkscape-font-specification:Sans;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;marker:none"
+ id="path2" />
+ <path
+ style="fill:#2e3436;fill-opacity:1"
+ d="m 12.596194,2.6966997 0.707107,0.7071067 c 0.195869,0.1958686 0.195869,0.5112382 0,0.7071068 L 12.596194,4.81802 c -0.195868,0.1958686 -0.511238,0.1958686 -0.707106,0 L 11.181981,4.1109132 c -0.195817,-0.1950323 -0.195817,-0.5120745 0,-0.7071068 l 0.707107,-0.7071067 c 0.195868,-0.1958686 0.511238,-0.1958686 0.707106,0 z m -8.4852811,8.4852813 0.7071068,0.707107 c 0.1958686,0.195868 0.1958686,0.511238 0,0.707107 l -0.7071068,0.707106 c -0.1958686,0.195869 -0.5112382,0.195869 -0.7071068,0 L 2.6966994,12.596195 c -0.1958161,-0.195033 -0.1958166,-0.512075 0,-0.707107 l 0.7071067,-0.707107 c 0.1958686,-0.195869 0.5112382,-0.195869 0.7071068,0 z M 7.5000757,1.0005015 h 0.999849 C 8.7762374,0.99998906 9.0003616,1.2241133 8.9998492,1.500426 V 2.500124 C 9.0003616,2.7764366 8.7762374,3.0005609 8.4999247,3.0000485 H 7.5000757 C 7.2237631,3.0005609 6.9996388,2.7764366 7.0001512,2.500124 V 1.500426 C 6.9996388,1.2241133 7.2237631,0.99998906 7.5000757,1.0005015 Z M 7.4993686,13.00066 8.4999247,12.999953 c 0.2763126,-5.13e-4 0.5004372,0.223611 0.4999245,0.499924 l 7.071e-4,1.000405 c 5.127e-4,0.276313 -0.2236119,0.500437 -0.4999245,0.499925 L 7.5000757,14.9995 C 7.2237631,15.000012 6.9996386,14.775888 7.0001512,14.499575 V 13.499877 C 6.9996386,13.223564 7.2237631,12.99944 7.5000757,12.999953 Z M 1.0005012,8.499925 V 7.500076 C 0.99998861,7.2237635 1.2241132,6.9996389 1.5004257,7.0001515 h 0.999698 C 2.7764364,6.999639 3.0005607,7.2237633 3.0000482,7.500076 V 8.499925 C 3.0005607,8.7762375 2.7764362,9.0003621 2.5001237,8.9998495 H 1.5004257 C 1.224113,9.000362 0.99998869,8.7762377 1.0005012,8.499925 Z M 13.000659,8.5006321 12.999952,7.500076 C 12.99944,7.2237633 13.223564,6.999639 13.499877,7.0001515 h 0.999698 c 0.276312,-5.126e-4 0.500437,0.223612 0.499924,0.4999245 l 7.07e-4,1.0005561 c 5.13e-4,0.2763127 -0.223611,0.500437 -0.499924,0.4999245 L 13.499877,8.9998495 C 13.223564,9.0003621 12.99944,8.7762375 12.999952,8.499925 Z m 0.302642,4.0955629 -0.707107,0.707106 c -0.195868,0.195869 -0.511238,0.195869 -0.707106,0 l -0.707107,-0.707106 c -0.195817,-0.195033 -0.195816,-0.512075 0,-0.707107 l 0.707107,-0.707107 c 0.195868,-0.195869 0.511238,-0.195869 0.707106,0 l 0.707107,0.707107 c 0.195869,0.195868 0.195869,0.511238 0,0.707107 z M 4.8180197,4.1109132 4.1109129,4.81802 c -0.1958686,0.1958686 -0.5112382,0.1958686 -0.7071068,0 L 2.6966994,4.1109132 c -0.1958164,-0.1950323 -0.1958164,-0.5120745 0,-0.7071068 L 3.4038061,2.6966997 c 0.1958686,-0.1958686 0.5112382,-0.1958686 0.7071068,0 l 0.7071068,0.7071067 c 0.1958686,0.1958686 0.1958686,0.5112382 0,0.7071068 z"
+ id="path844"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssssccsssssssccssccccccccccccccccccccccccccccccccccccccsssccsssssssccssss" />
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic-rtl.svg b/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic-rtl.svg
new file mode 100644
index 0000000..e25947c
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic-rtl.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64.000001"
+ id="svg6535"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="two-finger-swipe-left.svg">
+ <defs
+ id="defs6537" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="0.8190337"
+ inkscape:cy="13.44962"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid7931" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata6540">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(180,-470.14793)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 38.271484 6.0039062 C 37.981892 5.9956378 37.692703 6.0019094 37.40625 6.0214844 C 34.246377 6.2374271 31.332975 8.1249345 29.902344 11.082031 C 29.173793 10.990041 28.447857 10.978702 27.738281 11.0625 C 24.36672 11.460668 21.373919 13.762084 20.242188 17.148438 L 12 17.148438 L 12 10.148438 L 2 19.648438 L 12 29.148438 L 12 22.148438 L 20.048828 22.148438 C 20.694441 24.742195 22.473591 26.994506 25 28.162109 L 25 47 L 24 47 L 24 39.185547 C 24 36.866788 22.215997 35 20 35 C 17.784003 35 16 36.866788 16 39.185547 L 16 47 L 16 55.814453 L 16 60 L 20 60 L 45 60 L 56 60 C 58.215997 60 60 58.133212 60 55.814453 L 60 43.185547 L 60 34.185547 C 60 31.866788 58.215997 30 56 30 C 53.784003 30 52 31.866788 52 34.185547 L 52 39 L 51 39 L 51 28.185547 C 51 25.866788 49.215997 24 47 24 C 44.784003 24 43 25.866788 43 28.185547 L 43 39 L 42 39 L 42 23.042969 C 44.136586 21.978813 45.853243 20.084457 46.603516 17.640625 C 48.028796 12.998095 45.481769 8.0270562 40.880859 6.4726562 C 40.018187 6.1812063 39.140263 6.0287116 38.271484 6.0039062 z M 38.171875 8.9980469 C 38.752124 9.0164906 39.339992 9.1204781 39.919922 9.3164062 C 43.012882 10.361346 44.694478 13.640769 43.736328 16.761719 C 43.402083 17.85044 42.787396 18.769252 42 19.474609 L 42 15.185547 C 42 12.866788 40.215997 11 38 11 C 35.784003 11 34 12.866788 34 15.185547 L 34 22.945312 C 33.72503 23.436938 33.386634 23.876948 33 24.261719 L 33 20.185547 C 33 17.866788 31.215997 16 29 16 C 26.784003 16 25 17.866788 25 20.185547 L 25 24.666016 C 23.150282 23.179661 22.297135 20.683826 23.027344 18.265625 C 23.981604 15.105485 27.261604 13.320305 30.433594 14.234375 A 1.50015 1.50015 0 0 0 32.361328 12.945312 A 1.50015 1.50015 0 0 0 32.371094 12.921875 C 33.289974 10.433529 35.657461 8.9181241 38.171875 8.9980469 z M 34 27.302734 L 34 39 L 33 39 L 33 27.925781 C 33.346618 27.7409 33.679606 27.531269 34 27.302734 z "
+ transform="translate(-180,470.14793)"
+ id="rect7308" />
+ <g
+ style="display:inline"
+ transform="translate(80,114.14791)"
+ id="g7391">
+ <g
+ id="g7393">
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="391"
+ x="-324"
+ height="24.999994"
+ width="7.99999"
+ id="rect7395"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7397"
+ width="7.99999"
+ height="43.999989"
+ x="-315"
+ y="372.00003"
+ ry="4.1854858"
+ rx="3.999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="367"
+ x="-306"
+ height="49.000015"
+ width="7.99999"
+ id="rect7399"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7401"
+ width="7.99999"
+ height="36.000011"
+ x="-297"
+ y="380"
+ ry="4.1854858"
+ rx="3.999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="386"
+ x="-288"
+ height="30.000006"
+ width="7.99999"
+ id="rect7403"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7405"
+ width="28.999994"
+ height="12.99999"
+ x="-324"
+ y="403" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7407"
+ width="34.999985"
+ height="21"
+ x="-315"
+ y="395"
+ ry="4.1854858"
+ rx="3.999995" />
+ <path
+ sodipodi:open="true"
+ d="m -309.03562,368.40192 a 7.4999938,7.5000024 0 0 1 9.43617,-4.50737 7.4999938,7.5000024 0 0 1 4.76917,9.30661 7.4999938,7.5000024 0 0 1 -9.16976,5.02725"
+ sodipodi:end="1.8407347"
+ sodipodi:start="3.4953343"
+ sodipodi:ry="7.5000024"
+ sodipodi:rx="7.4999938"
+ sodipodi:cy="371"
+ sodipodi:cx="-302"
+ sodipodi:type="arc"
+ id="path7409"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <path
+ sodipodi:open="true"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path7411"
+ sodipodi:type="arc"
+ sodipodi:cx="-311.22797"
+ sodipodi:cy="375.99963"
+ sodipodi:rx="7.4999938"
+ sodipodi:ry="7.5000024"
+ sodipodi:start="0.31864739"
+ sodipodi:end="4.9929531"
+ d="m -304.10552,378.34925 a 7.4999938,7.5000024 0 0 1 -9.38146,4.80209 7.4999938,7.5000024 0 0 1 -4.92078,-9.31976 7.4999938,7.5000024 0 0 1 9.25653,-5.03869" />
+ </g>
+ </g>
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ d="m -248,499.29695 -10,-9.5 10,-9.5 z"
+ id="path7413"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <rect
+ transform="scale(-1,-1)"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7415"
+ width="13.061281"
+ height="4.9999938"
+ x="238.62494"
+ y="-492.29697" />
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic.svg b/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic.svg
new file mode 100644
index 0000000..e27b4b1
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/gesture-touchpad-swipe-back-symbolic.svg
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64.000001"
+ id="svg6535"
+ version="1.1"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="two-finger-swipe-right.svg">
+ <defs
+ id="defs6537" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="15.562966"
+ inkscape:cy="0.15090121"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid7931" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata6540">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(180,-470.14793)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m -129,475.29637 0,7 -14.48047,0 c -0.8685,-2.58098 -2.88029,-4.74387 -5.63867,-5.67578 -1.15023,-0.3886 -2.3288,-0.52948 -3.47461,-0.45118 -3.16004,0.21596 -6.07335,2.10345 -7.50391,5.06055 -0.72859,-0.0926 -1.45444,-0.10529 -2.16406,-0.0215 -3.45482,0.40801 -6.51775,2.81143 -7.58203,6.33594 -1.30748,4.32992 0.83762,8.91584 4.84375,10.76757 l 0,18.83594 -1,0 0,-7.81445 c 0,-2.31876 -1.784,-4.18555 -4,-4.18555 -2.216,0 -4,1.86679 -4,4.18555 l 0,7.81445 0,8.81445 0,4.18555 4,0 25,0 11,0 c 2.216,0 4,-1.86679 4,-4.18555 l 0,-12.6289 0,-9 c 0,-2.31876 -1.784,-4.18555 -4,-4.18555 -2.216,0 -4,1.86679 -4,4.18555 l 0,4.81445 -1,0 0,-10.81445 c 0,-2.31876 -1.784,-4.18555 -4,-4.18555 -2.216,0 -4,1.86679 -4,4.18555 l 0,10.81445 -1,0 0,-15.95703 c 2.13659,-1.06416 3.85324,-2.95852 4.60352,-5.40235 0.0502,-0.16362 0.0846,-0.32791 0.125,-0.49218 l 14.27148,0 0,7 10,-9.5 -10,-9.5 z m -22.82812,3.84961 c 0.58024,0.0183 1.16811,0.12047 1.74804,0.3164 2.47175,0.83508 4.03799,3.09857 4.08008,5.56641 l 0,0.23242 c -0.012,0.54544 -0.0952,1.09784 -0.26367,1.64649 -0.33419,1.08853 -0.94913,2.00757 -1.73633,2.71289 l 0,-4.28711 c 0,-2.31876 -1.784,-4.18555 -4,-4.18555 -2.216,0 -4,1.86679 -4,4.18555 l 0,7.75976 c -0.27497,0.49163 -0.61337,0.93164 -1,1.31641 l 0,-4.07617 c 0,-2.31876 -1.784,-4.18555 -4,-4.18555 -2.216,0 -4,1.86679 -4,4.18555 l 0,4.48242 c -1.84972,-1.48636 -2.70286,-3.98414 -1.97266,-6.40235 0.95426,-3.16014 4.23426,-4.94531 7.40625,-4.03125 a 1.50015,1.50015 0 0 0 1.92774,-1.28906 1.5004025,1.5004025 0 0 0 0.01,-0.0234 c 0.91888,-2.48834 3.28636,-4.00326 5.80078,-3.92383 z M -156,497.45066 l 0,11.69727 -1,0 0,-11.07227 c 0.34667,-0.1849 0.67956,-0.39643 1,-0.625 z"
+ id="rect6513"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g7304"
+ transform="translate(18,114.14791)"
+ style="display:inline">
+ <g
+ id="g7306">
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7308"
+ width="7.99999"
+ height="24.999994"
+ x="-324"
+ y="391"
+ ry="4.1854858"
+ rx="3.999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="372.00003"
+ x="-315"
+ height="43.999989"
+ width="7.99999"
+ id="rect7310"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7312"
+ width="7.99999"
+ height="49.000015"
+ x="-306"
+ y="367"
+ ry="4.1854858"
+ rx="3.999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="380"
+ x="-297"
+ height="36.000011"
+ width="7.99999"
+ id="rect7314"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect7316"
+ width="7.99999"
+ height="30.000006"
+ x="-288"
+ y="386"
+ ry="4.1854858"
+ rx="3.999995" />
+ <rect
+ y="403"
+ x="-324"
+ height="12.99999"
+ width="28.999994"
+ id="rect7318"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="395"
+ x="-315"
+ height="21"
+ width="34.999985"
+ id="rect7320"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ id="path7322"
+ sodipodi:type="arc"
+ sodipodi:cx="-302"
+ sodipodi:cy="371"
+ sodipodi:rx="7.4999938"
+ sodipodi:ry="7.5000024"
+ sodipodi:start="3.4953343"
+ sodipodi:end="1.8407347"
+ d="m -309.03562,368.40192 a 7.4999938,7.5000024 0 0 1 9.43617,-4.50737 7.4999938,7.5000024 0 0 1 4.76917,9.30661 7.4999938,7.5000024 0 0 1 -9.16976,5.02725"
+ sodipodi:open="true" />
+ <path
+ d="m -304.10552,378.34925 a 7.4999938,7.5000024 0 0 1 -9.38146,4.80209 7.4999938,7.5000024 0 0 1 -4.92078,-9.31976 7.4999938,7.5000024 0 0 1 9.25653,-5.03869"
+ sodipodi:end="4.9929531"
+ sodipodi:start="0.31864739"
+ sodipodi:ry="7.5000024"
+ sodipodi:rx="7.4999938"
+ sodipodi:cy="375.99963"
+ sodipodi:cx="-311.22797"
+ sodipodi:type="arc"
+ id="path7324"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
+ sodipodi:open="true" />
+ </g>
+ </g>
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path7326"
+ d="m -260.99992,494.29695 10,-9.5 -10,-9.5 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
+ <rect
+ y="-487.29697"
+ x="-278"
+ height="4.9999919"
+ width="20.686279"
+ id="rect7328"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ transform="scale(1,-1)" />
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic-rtl.svg b/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic-rtl.svg
new file mode 100644
index 0000000..a395bf5
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic-rtl.svg
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64.000001"
+ id="svg6535"
+ version="1.1"
+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
+ sodipodi:docname="gesture-palm-swipe-right-rtl-symbolic.svg">
+ <defs
+ id="defs6537" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6.7670154"
+ inkscape:cx="32.723254"
+ inkscape:cy="14.119354"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1280"
+ inkscape:window-height="1376"
+ inkscape:window-x="1280"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="false"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4193" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata6540">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(180,-470.14793)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 9.6542969 6.9921875 C 8.6081142 6.96848 7.5705827 7.347386 6.7871094 8.1308594 C 5.2201627 9.697806 5.2783584 12.278358 6.9179688 13.917969 L 10 17 L 10 7.0332031 C 9.8847052 7.0208034 9.7697279 6.9948033 9.6542969 6.9921875 z M 6.1171875 16.185547 C 5.0710043 16.16184 4.0354273 16.538791 3.2519531 17.322266 C 1.6850047 18.889214 1.7432022 21.471718 3.3828125 23.111328 L 10 29.728516 L 10 18.414062 L 9.0390625 17.453125 C 8.2192573 16.63332 7.1633707 16.209254 6.1171875 16.185547 z M 6.8242188 29.621094 C 5.778036 29.597386 4.7424577 29.974339 3.9589844 30.757812 C 2.3920377 32.324759 2.4502333 34.905312 4.0898438 36.544922 L 10 42.455078 L 10 31.142578 L 9.7460938 30.888672 C 8.9262885 30.068867 7.8704014 29.644801 6.8242188 29.621094 z "
+ transform="translate(-180,470.14793)"
+ id="rect7306" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 54 10 L 54 49 L 62 49 L 62 34 L 54 10 z "
+ transform="translate(-180,470.14793)"
+ id="path838" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.95433986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="M 10 7 L 10 57 L 12 57 L 12 7 L 10 7 z M 52 7 L 52 57 L 54 57 L 54 7 L 52 7 z "
+ transform="translate(-180,470.14793)"
+ id="rect869" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m -148,493.14844 c -4.95279,0 -9,4.0472 -9,9 0,4.95279 4.04721,9 9,9 4.95279,0 9,-4.04721 9,-9 0,-4.9528 -4.04721,-9 -9,-9 z m 0,3 c 3.33147,0 6,2.66852 6,6 0,3.33148 -2.66853,6 -6,6 -3.33147,0 -6,-2.66852 -6,-6 0,-3.33148 2.66853,-6 6,-6 z"
+ id="ellipse7314"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="m -148,498.14793 c -2.20914,0 -4,1.79086 -4,4 0.001,1.06041 0.42341,2.07695 1.17383,2.82617 l -0.002,0.002 22.17192,22.17183 H -122 c 2.216,0 4,-1.784 4,-4 v -8 c 0,-2.216 -1.784,-4 -4,-4 h -11.34375 l -11.78711,-11.78711 -0.041,-0.041 -0.002,0.002 c -0.74917,-0.75046 -1.76571,-1.17267 -2.82612,-1.17387 z"
+ id="path831"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsscccccc" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ d="m -159,494.64792 -8,7.5 8,7.5 v -5 h 3.5 v -5 h -3.5 z"
+ id="path7413"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ id="g1107"
+ transform="translate(-64)">
+ <g
+ id="g1080"
+ transform="rotate(-45,-191.43501,474.81355)"
+ style="fill:#000000;fill-opacity:1">
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="490.14792"
+ x="-185"
+ height="34"
+ width="7.99999"
+ id="rect1074"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect1076"
+ width="7.999999"
+ height="30"
+ x="-194"
+ y="494.14792"
+ ry="4.1854858"
+ rx="3.9999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="504.14792"
+ x="-203"
+ height="20"
+ width="7.99999"
+ id="rect1078"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -134,480.14793 v 39 h 16.00021 v -15 l -8.00013,-24 z"
+ id="path1082"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ style="opacity:1;fill:#1a5fb4;fill-opacity:1;stroke:none;stroke-width:1.95433986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ id="rect1084"
+ width="44"
+ height="50"
+ x="-170"
+ y="477.14792" />
+ <rect
+ y="477.14792"
+ x="-168"
+ height="50"
+ width="40"
+ id="rect1086"
+ style="opacity:1;fill:#26a269;fill-opacity:1;stroke:none;stroke-width:1.86338997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
+ <ellipse
+ cx="-148"
+ cy="502.14792"
+ rx="7.4999938"
+ ry="7.5000024"
+ id="ellipse1088"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="m -148,498.14793 c -2.20914,0 -4,1.79086 -4,4 0.001,1.06041 0.42341,2.07695 1.17383,2.82617 l -0.002,0.002 22.17192,22.17183 H -122 c 2.216,0 4,-1.784 4,-4 v -8 c 0,-2.216 -1.784,-4 -4,-4 h -11.34375 l -11.78711,-11.78711 -0.041,-0.041 -0.002,0.002 c -0.74917,-0.75046 -1.76571,-1.17267 -2.82612,-1.17387 z"
+ id="path1090"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsscccccc" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ d="m -159,494.64792 -8,7.5 8,7.5 v -5 h 3.5 v -5 h -3.5 z"
+ id="path1092"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path1094"
+ d="m -137,494.64792 8,7.5 -8,7.5 v -5 h -3.5 v -5 h 3.5 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic.svg b/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic.svg
new file mode 100644
index 0000000..74b3e39
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/gesture-touchscreen-swipe-back-symbolic.svg
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="64"
+ height="64"
+ viewBox="0 0 64 64.000001"
+ id="svg6535"
+ version="1.1"
+ inkscape:version="0.92.4 5da689c313, 2019-01-14"
+ sodipodi:docname="gesture-palm-swipe-right-symbolic.svg">
+ <defs
+ id="defs6537" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="6.7670154"
+ inkscape:cx="32.723254"
+ inkscape:cy="14.119354"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:showpageshadow="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1280"
+ inkscape:window-height="1376"
+ inkscape:window-x="1280"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:object-paths="true"
+ inkscape:snap-intersection-paths="true"
+ inkscape:object-nodes="true"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="false"
+ inkscape:bbox-paths="true"
+ inkscape:bbox-nodes="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid4193" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata6540">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(180,-470.14793)">
+ <path
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="M 9.6542969 6.9921875 C 8.6081142 6.96848 7.5705827 7.347386 6.7871094 8.1308594 C 5.2201627 9.697806 5.2783584 12.278358 6.9179688 13.917969 L 10 17 L 10 7.0332031 C 9.8847052 7.0208034 9.7697279 6.9948033 9.6542969 6.9921875 z M 6.1171875 16.185547 C 5.0710043 16.16184 4.0354273 16.538791 3.2519531 17.322266 C 1.6850047 18.889214 1.7432022 21.471718 3.3828125 23.111328 L 10 29.728516 L 10 18.414062 L 9.0390625 17.453125 C 8.2192573 16.63332 7.1633707 16.209254 6.1171875 16.185547 z M 6.8242188 29.621094 C 5.778036 29.597386 4.7424577 29.974339 3.9589844 30.757812 C 2.3920377 32.324759 2.4502333 34.905312 4.0898438 36.544922 L 10 42.455078 L 10 31.142578 L 9.7460938 30.888672 C 8.9262885 30.068867 7.8704014 29.644801 6.8242188 29.621094 z "
+ transform="translate(-180,470.14793)"
+ id="rect7306" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 54 10 L 54 49 L 62 49 L 62 34 L 54 10 z "
+ transform="translate(-180,470.14793)"
+ id="path838" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.95433986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="M 10 7 L 10 57 L 12 57 L 12 7 L 10 7 z M 52 7 L 52 57 L 54 57 L 54 7 L 52 7 z "
+ transform="translate(-180,470.14793)"
+ id="rect869" />
+ <path
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ d="m -148,493.14844 c -4.95279,0 -9,4.0472 -9,9 0,4.95279 4.04721,9 9,9 4.95279,0 9,-4.04721 9,-9 0,-4.9528 -4.04721,-9 -9,-9 z m 0,3 c 3.33147,0 6,2.66852 6,6 0,3.33148 -2.66853,6 -6,6 -3.33147,0 -6,-2.66852 -6,-6 0,-3.33148 2.66853,-6 6,-6 z"
+ id="ellipse7314"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="m -148,498.14793 c -2.20914,0 -4,1.79086 -4,4 0.001,1.06041 0.42341,2.07695 1.17383,2.82617 l -0.002,0.002 22.17192,22.17183 H -122 c 2.216,0 4,-1.784 4,-4 v -8 c 0,-2.216 -1.784,-4 -4,-4 h -11.34375 l -11.78711,-11.78711 -0.041,-0.041 -0.002,0.002 c -0.74917,-0.75046 -1.76571,-1.17267 -2.82612,-1.17387 z"
+ id="path831"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsscccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path906"
+ d="m -137,494.64792 8,7.5 -8,7.5 v -5 h -3.5 v -5 h 3.5 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ id="g1107"
+ transform="translate(-64)">
+ <g
+ id="g1080"
+ transform="rotate(-45,-191.43501,474.81355)"
+ style="fill:#000000;fill-opacity:1">
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="490.14792"
+ x="-185"
+ height="34"
+ width="7.99999"
+ id="rect1074"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ <rect
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+ id="rect1076"
+ width="7.999999"
+ height="30"
+ x="-194"
+ y="494.14792"
+ ry="4.1854858"
+ rx="3.9999995" />
+ <rect
+ rx="3.999995"
+ ry="4.1854858"
+ y="504.14792"
+ x="-203"
+ height="20"
+ width="7.99999"
+ id="rect1078"
+ style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#4a90d9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00000656px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m -134,480.14793 v 39 h 16.00021 v -15 l -8.00013,-24 z"
+ id="path1082"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <rect
+ style="opacity:1;fill:#1a5fb4;fill-opacity:1;stroke:none;stroke-width:1.95433986;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ id="rect1084"
+ width="44"
+ height="50"
+ x="-170"
+ y="477.14792" />
+ <rect
+ y="477.14792"
+ x="-168"
+ height="50"
+ width="40"
+ id="rect1086"
+ style="opacity:1;fill:#26a269;fill-opacity:1;stroke:none;stroke-width:1.86338997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" />
+ <ellipse
+ cx="-148"
+ cy="502.14792"
+ rx="7.4999938"
+ ry="7.5000024"
+ id="ellipse1088"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
+ <path
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+ d="m -148,498.14793 c -2.20914,0 -4,1.79086 -4,4 0.001,1.06041 0.42341,2.07695 1.17383,2.82617 l -0.002,0.002 22.17192,22.17183 H -122 c 2.216,0 4,-1.784 4,-4 v -8 c 0,-2.216 -1.784,-4 -4,-4 h -11.34375 l -11.78711,-11.78711 -0.041,-0.041 -0.002,0.002 c -0.74917,-0.75046 -1.76571,-1.17267 -2.82612,-1.17387 z"
+ id="path1090"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccsscccccc" />
+ <path
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ d="m -159,494.64792 -8,7.5 8,7.5 v -5 h 3.5 v -5 h -3.5 z"
+ id="path1092"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path1094"
+ d="m -137,494.64792 8,7.5 -8,7.5 v -5 h -3.5 v -5 h 3.5 z"
+ style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
+ sodipodi:nodetypes="cccccccc" />
+ </g>
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/gnome-smartphone-symbolic.svg b/subprojects/libhandy/examples/icons/gnome-smartphone-symbolic.svg
new file mode 100644
index 0000000..39cc8cc
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/gnome-smartphone-symbolic.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="16"
+ height="16"
+ version="1.1"
+ id="svg4"
+ sodipodi:docname="gnome-smartphone-symbolic.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
+ <metadata
+ id="metadata10">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs8" />
+ <sodipodi:namedview
+ inkscape:document-rotation="0"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1376"
+ id="namedview6"
+ showgrid="true"
+ inkscape:zoom="90.509668"
+ inkscape:cx="7.1287622"
+ inkscape:cy="10.843601"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg4">
+ <inkscape:grid
+ type="xygrid"
+ id="grid855" />
+ </sodipodi:namedview>
+ <path
+ d="M 4.1972656 0 C 2.9868777 0.01088842 2.0086867 0.9907661 2 2.2011719 L 2 13.800781 C 2 14.999781 2.9952656 16 4.1972656 16 L 11.804688 16 C 13.015135 15.98964 13.992393 15.009296 14 13.798828 L 14 2.1992188 C 14 1.0002185 13.006687 -2.9605947e-16 11.804688 0 L 4.1972656 0 z M 4.1992188 2 L 11.800781 2 C 11.911581 2 12 2.0884187 12 2.1992188 L 12 11.800781 C 12 11.911581 11.911581 12 11.800781 12 L 4.1992188 12 C 4.0884187 12 4 11.911581 4 11.800781 L 4 2.1992188 C 4 2.0884187 4.0884187 2 4.1992188 2 z M 8 12.529297 L 9.9023438 14.431641 C 9.9625935 14.491891 10 14.573683 10 14.666016 L 10 15 L 9.6660156 15 C 9.5736826 15 9.4918906 14.962594 9.4316406 14.902344 L 8 13.470703 L 6.5683594 14.902344 C 6.5081094 14.962594 6.4263177 15 6.3339844 15 L 6 15 L 6 14.666016 C 6 14.573686 6.0374063 14.491891 6.0976562 14.431641 L 8 12.529297 z "
+ style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1;marker:none"
+ id="path2" />
+</svg>
diff --git a/subprojects/libhandy/examples/icons/light-mode-symbolic.svg b/subprojects/libhandy/examples/icons/light-mode-symbolic.svg
new file mode 100644
index 0000000..c2e769b
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/light-mode-symbolic.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <g fill="#2e3436">
+ <path d="M8 4.006c-2.195 0-4 1.805-4 4 0 2.195 1.805 4 4 4 2.195 0 4-1.805 4-4 0-2.195-1.805-4-4-4z" style="line-height:normal;-inkscape-font-specification:Sans;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;marker:none" color="#bebebe" font-weight="400" font-family="Sans" overflow="visible"/>
+ <path d="M7.5 0h1c.277 0 .5.223.5.5v2c0 .277-.223.5-.5.5h-1a.499.499 0 0 1-.5-.5v-2c0-.277.223-.5.5-.5zM7.5 13h1c.277 0 .5.223.5.5v2c0 .277-.223.5-.5.5h-1a.499.499 0 0 1-.5-.5v-2c0-.277.223-.5.5-.5zM1.99 2.697l.707-.707a.499.499 0 0 1 .707 0l1.414 1.414a.499.499 0 0 1 0 .707l-.707.707a.499.499 0 0 1-.707 0L1.99 3.404a.499.499 0 0 1 0-.707zM11.182 11.89l.707-.708a.499.499 0 0 1 .707 0l1.415 1.414a.499.499 0 0 1 0 .707l-.708.707a.499.499 0 0 1-.707 0l-1.414-1.414a.499.499 0 0 1 0-.707zM2.697 14.01l-.707-.707a.499.499 0 0 1 0-.707l1.414-1.414a.499.499 0 0 1 .707 0l.707.707a.499.499 0 0 1 0 .707L3.404 14.01a.499.499 0 0 1-.707 0zM11.89 4.818l-.708-.707a.499.499 0 0 1 0-.707l1.414-1.414a.499.499 0 0 1 .707 0l.708.707a.499.499 0 0 1 0 .707l-1.415 1.414a.499.499 0 0 1-.707 0zM16 7.5v1c0 .277-.223.5-.5.5h-2a.499.499 0 0 1-.5-.5v-1c0-.277.223-.5.5-.5h2c.277 0 .5.223.5.5zM3 7.5v1c0 .277-.223.5-.5.5h-2a.499.499 0 0 1-.5-.5v-1c0-.277.223-.5.5-.5h2c.277 0 .5.223.5.5z"/>
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/widget-carousel-symbolic.svg b/subprojects/libhandy/examples/icons/widget-carousel-symbolic.svg
new file mode 100644
index 0000000..2764cc2
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-carousel-symbolic.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="view-continuous-symbolic.svg"
+ id="svg8"
+ version="1.1"
+ height="16"
+ width="16">
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <sodipodi:namedview
+ inkscape:current-layer="svg8"
+ inkscape:window-maximized="0"
+ inkscape:window-y="23"
+ inkscape:window-x="26"
+ inkscape:cy="8"
+ inkscape:cx="8"
+ inkscape:zoom="32.480545"
+ showgrid="false"
+ id="namedview10"
+ inkscape:window-height="742"
+ inkscape:window-width="1230"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <g
+ transform="rotate(-90,8,8)"
+ id="g6"
+ fill="#474747"
+ color="#bebebe">
+ <path
+ id="path2"
+ opacity="0.35"
+ overflow="visible"
+ style="marker:none"
+ d="M 9.625,11 H 6.375 A 0.374,0.374 0 0 0 6,11.375 v 1.25 C 6,12.833 6.167,13 6.375,13 h 3.25 A 0.374,0.374 0 0 0 10,12.625 v -1.25 A 0.374,0.374 0 0 0 9.625,11 Z m 0,-11 H 6.375 A 0.374,0.374 0 0 0 6,0.375 v 1.25 C 6,1.833 6.167,2 6.375,2 h 3.25 A 0.374,0.374 0 0 0 10,1.625 V 0.375 A 0.374,0.374 0 0 0 9.625,0 Z m 0,14 H 6.375 A 0.374,0.374 0 0 0 6,14.375 v 1.25 C 6,15.833 6.167,16 6.375,16 h 3.25 A 0.374,0.374 0 0 0 10,15.625 v -1.25 A 0.374,0.374 0 0 0 9.625,14 Z m 0,-11 H 6.375 A 0.374,0.374 0 0 0 6,3.375 v 1.25 C 6,4.833 6.167,5 6.375,5 h 3.25 A 0.374,0.374 0 0 0 10,4.625 V 3.375 A 0.374,0.374 0 0 0 9.625,3 Z" />
+ <path
+ id="path4"
+ overflow="visible"
+ style="marker:none"
+ d="M 14,7 H 2 v 2 h 12 z" />
+ </g>
+</svg>
diff --git a/subprojects/libhandy/examples/icons/widget-clamp-symbolic.svg b/subprojects/libhandy/examples/icons/widget-clamp-symbolic.svg
new file mode 100644
index 0000000..9269c40
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-clamp-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g color="#000" fill="#474747"><path d="M12.293 5.293L9.586 8l2.707 2.707 1.414-1.414L12.414 8l1.293-1.293z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" font-weight="400" font-family="sans-serif" overflow="visible"/><path d="M13 10h1v1h-1zm0-5h1v1h-1z" style="marker:none" overflow="visible"/><path d="M13 5c.554 0 1 .446 1 1s-.446 1-1 1-1-.446-1-1 .446-1 1-1zm0 4c.554 0 1 .446 1 1s-.446 1-1 1-1-.446-1-1 .446-1 1-1z" style="marker:none" overflow="visible"/><path d="M3.707 5.293L2.293 6.707 3.586 8 2.293 9.293l1.414 1.414L6.414 8z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" font-weight="400" font-family="sans-serif" overflow="visible"/><path d="M3 10H2v1h1zm0-5H2v1h1z" style="marker:none" overflow="visible"/><path d="M3 5c-.554 0-1 .446-1 1s.446 1 1 1 1-.446 1-1-.446-1-1-1zm0 4c-.554 0-1 .446-1 1s.446 1 1 1 1-.446 1-1-.446-1-1-1z" style="marker:none" overflow="visible"/></g></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-deck-symbolic.svg b/subprojects/libhandy/examples/icons/widget-deck-symbolic.svg
new file mode 100644
index 0000000..3fe8afa
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-deck-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g color="#bebebe" fill="#474747"><path d="M1 0v13h12V0zm2 2h8v9H3z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" font-weight="400" font-family="sans-serif" overflow="visible"/><path d="M14 3v11H4v2h12V3z" style="line-height:normal;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" font-weight="400" font-family="Sans" overflow="visible"/><path d="M8.625 4h-3.25A.374.374 0 005 4.375v1.25c0 .208.167.375.375.375h3.25A.374.374 0 009 5.625v-1.25A.374.374 0 008.625 4zm0 3h-3.25A.374.374 0 005 7.375v1.25c0 .208.167.375.375.375h3.25A.374.374 0 009 8.625v-1.25A.374.374 0 008.625 7z" style="marker:none" overflow="visible" opacity=".35"/></g></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-keypad-symbolic.svg b/subprojects/libhandy/examples/icons/widget-keypad-symbolic.svg
new file mode 100644
index 0000000..f390fd6
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-keypad-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M2.5 1c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm-8 4c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm-8 4c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm4 0c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5zm-4 4c-.277 0-.5.223-.5.5v2c0 .277.223.5.5.5h2c.277 0 .5-.223.5-.5v-2c0-.277-.223-.5-.5-.5z" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-leaflet-symbolic.svg b/subprojects/libhandy/examples/icons/widget-leaflet-symbolic.svg
new file mode 100644
index 0000000..5763db7
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-leaflet-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g color="#bebebe" fill="#474747"><path d="M0 1v13h6c.176 0 .535.14.822.332.288.192.467.371.467.371l.719.727.711-.735S9.615 14 10 14h6V1h-6c-.901 0-1.572.353-2.043.701-.025-.017-.018-.018-.045-.035C7.452 1.362 6.828 1 6 1zm2 2h4c.138 0 .515.138.813.334.297.196.492.385.492.385l.717.693.695-.715S9.619 3 10 3h4v9h-4c-.89 0-1.562.348-2.033.693-.018-.012-.013-.013-.031-.025C7.476 12.36 6.836 12 6 12H2z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" font-weight="400" font-family="sans-serif" overflow="visible"/><path d="M5.625 5h-2.25A.374.374 0 003 5.375v1.25c0 .207.167.375.375.375h2.25A.374.374 0 006 6.625v-1.25A.374.374 0 005.625 5zm0 3h-2.25A.374.374 0 003 8.375v1.25c0 .208.167.375.375.375h2.25A.374.374 0 006 9.625v-1.25A.374.374 0 005.625 8zm7-3h-2.25a.374.374 0 00-.375.375v1.25c0 .208.167.375.375.375h2.25A.374.374 0 0013 6.625v-1.25A.374.374 0 0012.625 5zm0 3h-2.25a.374.374 0 00-.375.375v1.25c0 .208.167.375.375.375h2.25A.374.374 0 0013 9.625v-1.25A.374.374 0 0012.625 8z" style="marker:none" overflow="visible" opacity=".35"/></g></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-list-symbolic.svg b/subprojects/libhandy/examples/icons/widget-list-symbolic.svg
new file mode 100644
index 0000000..c9fec6a
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-list-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M3 3h10v2H3zm0 4h10v2H3zm0 4h10v2H3z" style="marker:none" overflow="visible" color="#bebebe" fill="#474747"/></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-search-symbolic.svg b/subprojects/libhandy/examples/icons/widget-search-symbolic.svg
new file mode 100644
index 0000000..1a6200e
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-search-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><g color="#000" font-weight="400" font-family="sans-serif" fill="#474747"><path d="M6.508 1C3.48 1 1.002 3.474 1.002 6.5S3.48 12 6.508 12s5.505-2.474 5.505-5.5S9.536 1 6.508 1zm0 2a3.488 3.488 0 013.505 3.5c0 1.944-1.557 3.5-3.505 3.5a3.488 3.488 0 01-3.506-3.5c0-1.944 1.557-3.5 3.506-3.5z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" overflow="visible"/><path d="M10 8.99a1 1 0 00-.696 1.717l4.004 4a1 1 0 101.414-1.414l-4.003-4a1 1 0 00-.72-.303z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" overflow="visible"/></g></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-view-switcher-symbolic.svg b/subprojects/libhandy/examples/icons/widget-view-switcher-symbolic.svg
new file mode 100644
index 0000000..255754c
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-view-switcher-symbolic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M2 6.006a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2 2 2 0 012-2zm6 0a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2 2 2 0 012-2zm6 0a2 2 0 012 2 2 2 0 01-2 2 2 2 0 01-2-2 2 2 0 012-2z" fill="#2e3436"/></svg> \ No newline at end of file
diff --git a/subprojects/libhandy/examples/icons/widget-window-symbolic.svg b/subprojects/libhandy/examples/icons/widget-window-symbolic.svg
new file mode 100644
index 0000000..993fd89
--- /dev/null
+++ b/subprojects/libhandy/examples/icons/widget-window-symbolic.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+ <path d="M3.012 1.027c-1.215 0-1.994.779-1.995 1.95V14a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2.955c0-1.238-.8-1.928-1.972-1.928zm7.005 1.963h1v1h1v-1h1v1h-1v1h1v1h-1v-1h-1v1h-1v-1h1v-1h-1zm-7 4.076h10v5.935h-10z" style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;white-space:normal;shape-padding:0;isolation:auto;mix-blend-mode:normal;solid-color:#000;solid-opacity:1;marker:none" color="#000" font-weight="400" font-family="sans-serif" overflow="visible" fill="#2e3436"/>
+</svg>
diff --git a/subprojects/libhandy/examples/meson.build b/subprojects/libhandy/examples/meson.build
new file mode 100644
index 0000000..883607e
--- /dev/null
+++ b/subprojects/libhandy/examples/meson.build
@@ -0,0 +1,26 @@
+if get_option('examples')
+
+handy_demo_resources = gnome.compile_resources(
+ 'handy-demo-resources',
+ 'handy-demo.gresources.xml',
+
+ c_name: 'hdy',
+)
+
+handy_demo_sources = [
+ handy_demo_resources,
+ 'handy-demo.c',
+ 'hdy-demo-preferences-window.c',
+ 'hdy-demo-window.c',
+ 'hdy-view-switcher-demo-window.c',
+ libhandy_generated_headers,
+]
+
+handy_demo = executable('handy-@0@-demo'.format(apiversion),
+ handy_demo_sources,
+ dependencies: libhandy_dep,
+ gui_app: true,
+ install: true,
+)
+
+endif
diff --git a/subprojects/libhandy/examples/sm.puri.Handy.Demo.json b/subprojects/libhandy/examples/sm.puri.Handy.Demo.json
new file mode 100644
index 0000000..f59ea8f
--- /dev/null
+++ b/subprojects/libhandy/examples/sm.puri.Handy.Demo.json
@@ -0,0 +1,29 @@
+{
+ "app-id": "sm.puri.Handy.Demo",
+ "runtime": "org.gnome.Platform",
+ "runtime-version": "master",
+ "sdk": "org.gnome.Sdk",
+ "command": "handy-1-demo",
+ "finish-args": [
+ "--device=all",
+ "--share=ipc",
+ "--socket=wayland",
+ "--socket=x11"
+ ],
+ "modules": [
+ {
+ "name": "libhandy",
+ "buildsystem": "meson",
+ "builddir": true,
+ "config-opts": [
+ "-Dglade_catalog=disabled"
+ ],
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gitlab.gnome.org/GNOME/libhandy.git"
+ }
+ ]
+ }
+ ]
+}
diff --git a/subprojects/libhandy/examples/style.css b/subprojects/libhandy/examples/style.css
new file mode 100644
index 0000000..7182936
--- /dev/null
+++ b/subprojects/libhandy/examples/style.css
@@ -0,0 +1,8 @@
+stacksidebar list {
+ border-left-width: 0px;
+ border-right-width: 0px;
+}
+
+carousel.vertical .carousel-icon {
+ -gtk-icon-transform: rotate(90deg);
+}