[gtk+/wip/matthiasc/emoji-picker: 11/11] more wip



commit dabf36f71a6bc84f187216ef5676f3ecc5935a21
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Aug 7 07:57:19 2017 -0400

    more wip

 tests/gtkemojipicker.c   | 1288 ++++++++++++++++++++++++++--------------------
 tests/gtkemojipicker.css |    1 +
 tests/gtkemojipicker.ui  |   41 ++-
 3 files changed, 775 insertions(+), 555 deletions(-)
---
diff --git a/tests/gtkemojipicker.c b/tests/gtkemojipicker.c
index 2ec4e68..c21f477 100644
--- a/tests/gtkemojipicker.c
+++ b/tests/gtkemojipicker.c
@@ -7,574 +7,660 @@ typedef struct {
   gunichar code;
   gboolean is_modifier_base;
   gunichar code2;
+  const char **keywords;
 } EmojiData;
 
-#if 0
-static gunichar people_plain[] = {
-  // face-positive
-  0x1f600, 0x1f601, 0x1f602, 0x1f923, 0x1f603, 0x1f604, 0x1f605, 0x1f606, 0x1f609, 0x1f60a,
-  0x1f60b, 0x1f60e, 0x1f60d, 0x1f618, 0x1f617, 0x1f619, 0x1f61a, 0x1f642, 0x1f917, 0x1f929,
-  // face-neutral
-  0x1f914, 0x1f928, 0x1f610, 0x1f611, 0x1f636, 0x1f644, 0x1f60f, 0x1f623, 0x1f625, 0x1f62e,
-  0x1f910, 0x1f62f, 0x1f62a, 0x1f62b, 0x1f634, 0x1f60c, 0x1f61b, 0x1f61c, 0x1f61d, 0x1f924,
-  0x1f612, 0x1f613, 0x1f614, 0x1f615, 0x1f643, 0x1f911, 0x1f632,
-  //face-negative
-  0x02639, 0x1f641, 0x1f616, 0x1f61e, 0x1f61f, 0x1f624, 0x1f622, 0x1f62d, 0x1f626, 0x1f627,
-  0x1f628, 0x1f629, 0x1f92f, 0x1f62c, 0x1f630, 0x1f631, 0x1f633, 0x1f92a, 0x1f635, 0x1f621,
-  0x1f620, 0x1f92c,
-  // face-sick
-  0x1f637, 0x1f912, 0x1f915, 0x1f922, 0x1f92e, 0x1f927,
-  // face-role
-  0x1f607, 0x1f920, 0x1f921, 0x1f925, 0x1f92b, 0x1f92d, 0x1f9d0, 0x1f913,
-  // face-fantasy
-  0x1f608, 0x1f47f, 0x1f479, 0x1f47a, 0x1f480, 0x02620, 0x1f47b, 0x1f47d, 0x1f47e, 0x1f916,
-  0x1f4a9,
-  // cat-face
-  0x1f63a, 0x1f638, 0x1f63b, 0x1f63c, 0x1f63d, 0x1f640, 0x1f63f, 0x1f63e,
-  // monkey-face
-  0x1f648, 0x1f649, 0x1f64a
-};
-
-static gunichar people_skin[] = {
-  // person
-  0x1f476, 0x1f9d2, 0x1f466, 0x1f467, 0x1f9d1, 0x1f468, 0x1f469, 0x1f9d3, 0x1f474, 0x1f475,
-  // person-role
-  //{ 0x1f468, 1, 0x02695 },
-  //{ 0x1f469, 1, 0x02695 },
-  //{ 0x1f468, 1, 0x1f393 },
-  //{ 0x1f469, 1, 0x1f393 },
-  //{ 0x1f468, 1, 0x1f3eb },
-  //{ 0x1f469, 1, 0x1f3eb },
-  //{ 0x1f468, 1, 0x02696 },
-  //{ 0x1f469, 1, 0x02696 },
-  //{ 0x1f468, 1, 0x1f33e },
-  //{ 0x1f469, 1, 0x1f33e },
-  //{ 0x1f468, 1, 0x1f373 },
-  //{ 0x1f469, 1, 0x1f373 },
-  //{ 0x1f468, 1, 0x1f527 },
-  //{ 0x1f469, 1, 0x1f527 },
-  //{ 0x1f468, 1, 0x1f3ed },
-  //{ 0x1f469, 1, 0x1f3ed },
-  //{ 0x1f468, 1, 0x1f4bc },
-  //{ 0x1f469, 1, 0x1f4bc },
-  //{ 0x1f468, 1, 0x1f52c },
-  //{ 0x1f469, 1, 0x1f52c },
-  //{ 0x1f468, 1, 0x1f4bb },
-  //{ 0x1f469, 1, 0x1f4bb },
-  //{ 0x1f468, 1, 0x1f3a4 },
-  //{ 0x1f469, 1, 0x1f3a4 },
-  //{ 0x1f468, 1, 0x1f3a8 },
-  //{ 0x1f469, 1, 0x1f3a8 },
-  //{ 0x1f468, 1, 0x02708 },
-  //{ 0x1f469, 1, 0x02708 },
-  //{ 0x1f468, 1, 0x1f680 },
-  //{ 0x1f469, 1, 0x1f680 },
-  //{ 0x1f468, 1, 0x1f692 },
-  //{ 0x1f469, 1, 0x1f692 },
-  0x1f46e,
-  //{ 0x1f46e, 1, 0x2642 },
-  //{ 0x1f46e, 1, 0x2640 },
-  0x1f575,
-  //{ 0x1f575, 1, 0x2642 },
-  //{ 0x1f575, 1, 0x2640 },
-  0x1f482,
-  //{ 0x1f482, 1, 0x2642 },
-  //{ 0x1f482, 1, 0x2640 },
-  0x1f477,
-  //{ 0x1f477, 1, 0x2642 },
-  //{ 0x1f477, 1, 0x2640 },
-  0x1f934,
-  //{ 0x1f934, 1, 0x2642 },
-  //{ 0x1f934, 1, 0x2640 },
-  0x1f478,
-  //{ 0x1f478, 1, 0x2642 },
-  //{ 0x1f478, 1, 0x2640 },
-  0x1f473,
-  //{ 0x1f473, 1, 0x2642 },
-  //{ 0x1f473, 1, 0x2640 },
-  0x1f472,
-  0x1f9d5,
-  0x1f9d4,
-  0x1f471,
-  //{ 0x1f471, 1, 0x2642 },
-  //{ 0x1f471, 1, 0x2640 },
-  0x1f935,
-  0x1f470,
-  0x1f930,
-  0x1f931,
-  // person-fantasy
-  0x1f47c,
-  0x1f385,
-  0x1f936,
-  0x1f9d9,
-  //{ 0x1f9d9, 1, 0x2642 },
-  //{ 0x1f9d9, 1, 0x2640 },
-  //...
-  // person-gesture
-  0x1f64d,
-  //{ 0x1f64d, 1, 0x2642 },
-  //{ 0x1f64d, 1, 0x2640 },
-  0x1f64e,
-  //{ 0x1f64e, 1, 0x2642 },
-  //{ 0x1f64e, 1, 0x2640 },
-  0x1f645,
-  //{ 0x1f645, 1, 0x2642 },
-  //{ 0x1f645, 1, 0x2640 },
-  0x1f646,
-  //{ 0x1f646, 1, 0x2642 },
-  //{ 0x1f646, 1, 0x2640 },
-  0x1f481,
-  //{ 0x1f481, 1, 0x2642 },
-  //{ 0x1f481, 1, 0x2640 },
-  0x1f64b,
-  //{ 0x1f64b, 1, 0x2642 },
-  //{ 0x1f64b, 1, 0x2640 },
-  0x1f647,
-  //{ 0x1f647, 1, 0x2642 },
-  //{ 0x1f647, 1, 0x2640 },
-  0x1f926,
-  //{ 0x1f926, 1, 0x2642 },
-  //{ 0x1f926, 1, 0x2640 },
-  0x1f937,
-  //{ 0x1f937, 1, 0x2642 },
-  //{ 0x1f937, 1, 0x2640 },
-  // person-activity
-  0x1f486,
-  //{ 0x1f486, 1, 0x2642 },
-  //{ 0x1f486, 1, 0x2640 },
-  0x1f487,
-  //{ 0x1f487, 1, 0x2642 },
-  //{ 0x1f487, 1, 0x2640 },
-  0x1f6b6,
-  //{ 0x1f6b6, 1, 0x2642 },
-  //{ 0x1f6b6, 1, 0x2640 },
-  0x1f3c3,
-  //{ 0x1f3c3, 1, 0x2642 },
-  //{ 0x1f3c3, 1, 0x2640 },
-  0x1f483,
-  0x1f57a,
-  0x1f46f,
-  //{ 0x1f46f, 1, 0x2642 },
-  //{ 0x1f46f, 1, 0x2640 },
-  //...
-  // person-sport
-  // family
-  // body
-  // emotion
-  // clothing
-};
-#endif
-
 static EmojiData people[] = {
   // face-positive
-  { 0x1f600, 0, 0 },
-  { 0x1f601, 0, 0 },
-  { 0x1f602, 0, 0 },
-  { 0x1f923, 0, 0 },
-  { 0x1f603, 0, 0 },
-  { 0x1f604, 0, 0 },
-  { 0x1f605, 0, 0 },
-  { 0x1f606, 0, 0 },
-  { 0x1f609, 0, 0 },
-  { 0x1f60a, 0, 0 },
-  { 0x1f60b, 0, 0 },
-  { 0x1f60e, 0, 0 },
-  { 0x1f60d, 0, 0 },
-  { 0x1f618, 0, 0 },
-  { 0x1f617, 0, 0 },
-  { 0x1f619, 0, 0 },
-  { 0x1f61a, 0, 0 },
-  { 0x1f642, 0, 0 },
-  { 0x1f917, 0, 0 },
-  { 0x1f929, 0, 0 },
+  { 0x1f600, 0, 0, (const char *[]) { "face", "grin", NULL } },
+  { 0x1f601, 0, 0, (const char *[]) { "eye", "face", "grin", "smile", NULL } },
+  { 0x1f602, 0, 0, (const char *[]) { "face", "joy", "laugh", "tear", NULL } },
+  { 0x1f923, 0, 0, (const char *[]) { "face", "floor", "laugh", "rolling", NULL } },
+  { 0x1f603, 0, 0, (const char *[]) { "face", "mouth", "open", "smiling", NULL } },
+  { 0x1f604, 0, 0, (const char *[]) { "eye", "face", "mouth", "open", "smile", NULL } },
+  { 0x1f605, 0, 0, (const char *[]) { "cold", "face", "open", "smile", "sweat", NULL } },
+  { 0x1f606, 0, 0, (const char *[]) { "face", "laugh", "mouth", "open", "satisfied", "smile", NULL } },
+  { 0x1f609, 0, 0, (const char *[]) { "face", "wink", NULL } },
+  { 0x1f60a, 0, 0, (const char *[]) { "blush", "eye", "face", "smile", NULL } },
+  { 0x1f60b, 0, 0, (const char *[]) { "delicious", "face", "savouring", "smile", "yum", NULL } },
+  { 0x1f60e, 0, 0, (const char *[]) { "bright", "cool", "eye", "eyewear", "face", "glasses", "smile", "sun", 
"sunglasses", NULL } },
+  { 0x1f60d, 0, 0, (const char *[]) { NULL } },
+  { 0x1f618, 0, 0, (const char *[]) { NULL } },
+  { 0x1f617, 0, 0, (const char *[]) { NULL } },
+  { 0x1f619, 0, 0, (const char *[]) { NULL } },
+  { 0x1f61a, 0, 0, (const char *[]) { NULL } },
+  { 0x1f642, 0, 0, (const char *[]) { NULL } },
+  { 0x1f917, 0, 0, (const char *[]) { NULL } },
+  { 0x1f929, 0, 0, (const char *[]) { NULL } },
   // face-neutral
-  { 0x1f914, 0, 0 },
-  { 0x1f928, 0, 0 },
-  { 0x1f610, 0, 0 },
-  { 0x1f611, 0, 0 },
-  { 0x1f636, 0, 0 },
-  { 0x1f644, 0, 0 },
-  { 0x1f60f, 0, 0 },
-  { 0x1f623, 0, 0 },
-  { 0x1f625, 0, 0 },
-  { 0x1f62e, 0, 0 },
-  { 0x1f910, 0, 0 },
-  { 0x1f62f, 0, 0 },
-  { 0x1f62a, 0, 0 },
-  { 0x1f62b, 0, 0 },
-  { 0x1f634, 0, 0 },
-  { 0x1f60c, 0, 0 },
-  { 0x1f61b, 0, 0 },
-  { 0x1f61c, 0, 0 },
-  { 0x1f61d, 0, 0 },
-  { 0x1f924, 0, 0 },
-  { 0x1f612, 0, 0 },
-  { 0x1f613, 0, 0 },
-  { 0x1f614, 0, 0 },
-  { 0x1f615, 0, 0 },
-  { 0x1f643, 0, 0 },
-  { 0x1f911, 0, 0 },
-  { 0x1f632, 0, 0 },
+  { 0x1f914, 0, 0, NULL },
+  { 0x1f928, 0, 0, NULL },
+  { 0x1f610, 0, 0, NULL },
+  { 0x1f611, 0, 0, NULL },
+  { 0x1f636, 0, 0, NULL },
+  { 0x1f644, 0, 0, NULL },
+  { 0x1f60f, 0, 0, NULL },
+  { 0x1f623, 0, 0, NULL },
+  { 0x1f625, 0, 0, NULL },
+  { 0x1f62e, 0, 0, NULL },
+  { 0x1f910, 0, 0, NULL },
+  { 0x1f62f, 0, 0, NULL },
+  { 0x1f62a, 0, 0, NULL },
+  { 0x1f62b, 0, 0, NULL },
+  { 0x1f634, 0, 0, NULL },
+  { 0x1f60c, 0, 0, NULL },
+  { 0x1f61b, 0, 0, NULL },
+  { 0x1f61c, 0, 0, NULL },
+  { 0x1f61d, 0, 0, NULL },
+  { 0x1f924, 0, 0, NULL },
+  { 0x1f612, 0, 0, NULL },
+  { 0x1f613, 0, 0, NULL },
+  { 0x1f614, 0, 0, NULL },
+  { 0x1f615, 0, 0, NULL },
+  { 0x1f643, 0, 0, NULL },
+  { 0x1f911, 0, 0, NULL },
+  { 0x1f632, 0, 0, NULL },
   //face-negative
-  { 0x02639, 0, 0 },
-  { 0x1f641, 0, 0 },
-  { 0x1f616, 0, 0 },
-  { 0x1f61e, 0, 0 },
-  { 0x1f61f, 0, 0 },
-  { 0x1f624, 0, 0 },
-  { 0x1f622, 0, 0 },
-  { 0x1f62d, 0, 0 },
-  { 0x1f626, 0, 0 },
-  { 0x1f627, 0, 0 },
-  { 0x1f628, 0, 0 },
-  { 0x1f629, 0, 0 },
-  { 0x1f92f, 0, 0 },
-  { 0x1f62c, 0, 0 },
-  { 0x1f630, 0, 0 },
-  { 0x1f631, 0, 0 },
-  { 0x1f633, 0, 0 },
-  { 0x1f92a, 0, 0 },
-  { 0x1f635, 0, 0 },
-  { 0x1f621, 0, 0 },
-  { 0x1f620, 0, 0 },
-  { 0x1f92c, 0, 0 },
+  { 0x02639, 0, 0, NULL },
+  { 0x1f641, 0, 0, NULL },
+  { 0x1f616, 0, 0, NULL },
+  { 0x1f61e, 0, 0, NULL },
+  { 0x1f61f, 0, 0, NULL },
+  { 0x1f624, 0, 0, NULL },
+  { 0x1f622, 0, 0, NULL },
+  { 0x1f62d, 0, 0, NULL },
+  { 0x1f626, 0, 0, NULL },
+  { 0x1f627, 0, 0, NULL },
+  { 0x1f628, 0, 0, NULL },
+  { 0x1f629, 0, 0, NULL },
+  { 0x1f92f, 0, 0, NULL },
+  { 0x1f62c, 0, 0, NULL },
+  { 0x1f630, 0, 0, NULL },
+  { 0x1f631, 0, 0, NULL },
+  { 0x1f633, 0, 0, NULL },
+  { 0x1f92a, 0, 0, NULL },
+  { 0x1f635, 0, 0, NULL },
+  { 0x1f621, 0, 0, NULL },
+  { 0x1f620, 0, 0, NULL },
+  { 0x1f92c, 0, 0, NULL },
   // face-sick
-  { 0x1f637, 0, 0 },
-  { 0x1f912, 0, 0 },
-  { 0x1f915, 0, 0 },
-  { 0x1f922, 0, 0 },
-  { 0x1f92e, 0, 0 },
-  { 0x1f927, 0, 0 },
+  { 0x1f637, 0, 0, NULL },
+  { 0x1f912, 0, 0, NULL },
+  { 0x1f915, 0, 0, NULL },
+  { 0x1f922, 0, 0, NULL },
+  { 0x1f92e, 0, 0, NULL },
+  { 0x1f927, 0, 0, NULL },
   // face-role
-  { 0x1f607, 0, 0 },
-  { 0x1f920, 0, 0 },
-  { 0x1f921, 0, 0 },
-  { 0x1f925, 0, 0 },
-  { 0x1f92b, 0, 0 },
-  { 0x1f92d, 0, 0 },
-  { 0x1f9d0, 0, 0 },
-  { 0x1f913, 0, 0 },
+  { 0x1f607, 0, 0, NULL },
+  { 0x1f920, 0, 0, NULL },
+  { 0x1f921, 0, 0, NULL },
+  { 0x1f925, 0, 0, NULL },
+  { 0x1f92b, 0, 0, NULL },
+  { 0x1f92d, 0, 0, NULL },
+  { 0x1f9d0, 0, 0, NULL },
+  { 0x1f913, 0, 0, NULL },
   // face-fantasy
-  { 0x1f608, 0, 0 },
-  { 0x1f47f, 0, 0 },
-  { 0x1f479, 0, 0 },
-  { 0x1f47a, 0, 0 },
-  { 0x1f480, 0, 0 },
-  { 0x02620, 0, 0 },
-  { 0x1f47b, 0, 0 },
-  { 0x1f47d, 0, 0 },
-  { 0x1f47e, 0, 0 },
-  { 0x1f916, 0, 0 },
-  { 0x1f4a9, 0, 0 },
+  { 0x1f608, 0, 0, NULL },
+  { 0x1f47f, 0, 0, NULL },
+  { 0x1f479, 0, 0, NULL },
+  { 0x1f47a, 0, 0, NULL },
+  { 0x1f480, 0, 0, NULL },
+  { 0x02620, 0, 0, NULL },
+  { 0x1f47b, 0, 0, NULL },
+  { 0x1f47d, 0, 0, NULL },
+  { 0x1f47e, 0, 0, NULL },
+  { 0x1f916, 0, 0, NULL },
+  { 0x1f4a9, 0, 0, NULL },
   // cat-face
-  { 0x1f63a, 0, 0 },
-  { 0x1f638, 0, 0 },
-  { 0x1f63b, 0, 0 },
-  { 0x1f63c, 0, 0 },
-  { 0x1f63d, 0, 0 },
-  { 0x1f640, 0, 0 },
-  { 0x1f63f, 0, 0 },
-  { 0x1f63e, 0, 0 },
+  { 0x1f63a, 0, 0, NULL },
+  { 0x1f638, 0, 0, NULL },
+  { 0x1f63b, 0, 0, NULL },
+  { 0x1f63c, 0, 0, NULL },
+  { 0x1f63d, 0, 0, NULL },
+  { 0x1f640, 0, 0, NULL },
+  { 0x1f63f, 0, 0, NULL },
+  { 0x1f63e, 0, 0, NULL },
   // monkey-face
-  { 0x1f648, 0, 0 },
-  { 0x1f649, 0, 0 },
-  { 0x1f64a, 0, 0 },
+  { 0x1f648, 0, 0, NULL },
+  { 0x1f649, 0, 0, NULL },
+  { 0x1f64a, 0, 0, NULL },
   // person
-  { 0x1f476, 1, 0 },
-  //{ 0x1f9d2, 1, 0 },
-  { 0x1f466, 1, 0 },
-  { 0x1f467, 1, 0 },
-  //{ 0x1f9d1, 1, 0 },
-  { 0x1f468, 1, 0 },
-  { 0x1f469, 1, 0 },
-  //{ 0x1f9d3, 1, 0 },
-  { 0x1f474, 1, 0 },
-  { 0x1f475, 1, 0 },
+  { 0x1f476, 1, 0, NULL },
+  { 0x1f9d2, 1, 0, NULL },
+  { 0x1f466, 1, 0, NULL },
+  { 0x1f467, 1, 0, NULL },
+  { 0x1f9d1, 1, 0, NULL },
+  { 0x1f468, 1, 0, NULL },
+  { 0x1f469, 1, 0, NULL },
+  { 0x1f9d3, 1, 0, NULL },
+  { 0x1f474, 1, 0, NULL },
+  { 0x1f475, 1, 0, NULL },
   // person-role
-  //{ 0x1f468, 1, 0x02695 },
-  //{ 0x1f469, 1, 0x02695 },
-  //{ 0x1f468, 1, 0x1f393 },
-  //{ 0x1f469, 1, 0x1f393 },
-  //{ 0x1f468, 1, 0x1f3eb },
-  //{ 0x1f469, 1, 0x1f3eb },
-  //{ 0x1f468, 1, 0x02696 },
-  //{ 0x1f469, 1, 0x02696 },
-  //{ 0x1f468, 1, 0x1f33e },
-  //{ 0x1f469, 1, 0x1f33e },
-  //{ 0x1f468, 1, 0x1f373 },
-  //{ 0x1f469, 1, 0x1f373 },
-  //{ 0x1f468, 1, 0x1f527 },
-  //{ 0x1f469, 1, 0x1f527 },
-  //{ 0x1f468, 1, 0x1f3ed },
-  //{ 0x1f469, 1, 0x1f3ed },
-  //{ 0x1f468, 1, 0x1f4bc },
-  //{ 0x1f469, 1, 0x1f4bc },
-  //{ 0x1f468, 1, 0x1f52c },
-  //{ 0x1f469, 1, 0x1f52c },
-  //{ 0x1f468, 1, 0x1f4bb },
-  //{ 0x1f469, 1, 0x1f4bb },
-  //{ 0x1f468, 1, 0x1f3a4 },
-  //{ 0x1f469, 1, 0x1f3a4 },
-  //{ 0x1f468, 1, 0x1f3a8 },
-  //{ 0x1f469, 1, 0x1f3a8 },
-  //{ 0x1f468, 1, 0x02708 },
-  //{ 0x1f469, 1, 0x02708 },
-  //{ 0x1f468, 1, 0x1f680 },
-  //{ 0x1f469, 1, 0x1f680 },
-  //{ 0x1f468, 1, 0x1f692 },
-  //{ 0x1f469, 1, 0x1f692 },
-  { 0x1f46e, 1, 0 },
-  //{ 0x1f46e, 1, 0x2642 },
-  //{ 0x1f46e, 1, 0x2640 },
-  { 0x1f575, 1, 0 },
-  //{ 0x1f575, 1, 0x2642 },
-  //{ 0x1f575, 1, 0x2640 },
-  { 0x1f482, 1, 0 },
-  //{ 0x1f482, 1, 0x2642 },
-  //{ 0x1f482, 1, 0x2640 },
-  { 0x1f477, 1, 0 },
-  //{ 0x1f477, 1, 0x2642 },
-  //{ 0x1f477, 1, 0x2640 },
-  { 0x1f934, 1, 0 },
-  //{ 0x1f934, 1, 0x2642 },
-  //{ 0x1f934, 1, 0x2640 },
-  { 0x1f478, 1, 0 },
-  //{ 0x1f478, 1, 0x2642 },
-  //{ 0x1f478, 1, 0x2640 },
-  { 0x1f473, 1, 0 },
-  //{ 0x1f473, 1, 0x2642 },
-  //{ 0x1f473, 1, 0x2640 },
-  { 0x1f472, 1, 0 },
-  { 0x1f9d5, 1, 0 },
-  { 0x1f9d4, 1, 0 },
-  { 0x1f471, 1, 0 },
-  //{ 0x1f471, 1, 0x2642 },
-  //{ 0x1f471, 1, 0x2640 },
-  { 0x1f935, 1, 0 },
-  { 0x1f470, 1, 0 },
-  { 0x1f930, 1, 0 },
-  { 0x1f931, 1, 0 },
+  { 0x1f468, 1, 0x02695, NULL },
+  { 0x1f469, 1, 0x02695, NULL },
+  { 0x1f468, 1, 0x1f393, NULL },
+  { 0x1f469, 1, 0x1f393, NULL },
+  { 0x1f468, 1, 0x1f3eb, NULL },
+  { 0x1f469, 1, 0x1f3eb, NULL },
+  { 0x1f468, 1, 0x02696, NULL },
+  { 0x1f469, 1, 0x02696, NULL },
+  { 0x1f468, 1, 0x1f33e, NULL },
+  { 0x1f469, 1, 0x1f33e, NULL },
+  { 0x1f468, 1, 0x1f373, NULL },
+  { 0x1f469, 1, 0x1f373, NULL },
+  { 0x1f468, 1, 0x1f527, NULL },
+  { 0x1f469, 1, 0x1f527, NULL },
+  { 0x1f468, 1, 0x1f3ed, NULL },
+  { 0x1f469, 1, 0x1f3ed, NULL },
+  { 0x1f468, 1, 0x1f4bc, NULL },
+  { 0x1f469, 1, 0x1f4bc, NULL },
+  { 0x1f468, 1, 0x1f52c, NULL },
+  { 0x1f469, 1, 0x1f52c, NULL },
+  { 0x1f468, 1, 0x1f4bb, NULL },
+  { 0x1f469, 1, 0x1f4bb, NULL },
+  { 0x1f468, 1, 0x1f3a4, NULL },
+  { 0x1f469, 1, 0x1f3a4, NULL },
+  { 0x1f468, 1, 0x1f3a8, NULL },
+  { 0x1f469, 1, 0x1f3a8 , NULL},
+  { 0x1f468, 1, 0x02708, NULL },
+  { 0x1f469, 1, 0x02708, NULL },
+  { 0x1f468, 1, 0x1f680, NULL },
+  { 0x1f469, 1, 0x1f680, NULL },
+  { 0x1f468, 1, 0x1f692, NULL },
+  { 0x1f469, 1, 0x1f692, NULL },
+  { 0x1f46e, 1, 0, NULL },
+  { 0x1f46e, 1, 0x2642, NULL },
+  { 0x1f46e, 1, 0x2640, NULL },
+  { 0x1f575, 1, 0, NULL },
+  { 0x1f575, 1, 0x2642, NULL },
+  { 0x1f575, 1, 0x2640, NULL },
+  { 0x1f482, 1, 0, NULL },
+  { 0x1f482, 1, 0x2642, NULL },
+  { 0x1f482, 1, 0x2640, NULL },
+  { 0x1f477, 1, 0, NULL },
+  { 0x1f477, 1, 0x2642, NULL },
+  { 0x1f477, 1, 0x2640, NULL },
+  { 0x1f934, 1, 0, NULL },
+  { 0x1f478, 1, 0, NULL },
+  { 0x1f473, 1, 0, NULL },
+  { 0x1f473, 1, 0x2642, NULL },
+  { 0x1f473, 1, 0x2640, NULL },
+  { 0x1f472, 1, 0, NULL },
+  { 0x1f9d5, 1, 0, NULL },
+  { 0x1f9d4, 1, 0, NULL },
+  { 0x1f471, 1, 0, NULL },
+  { 0x1f471, 1, 0x2642, NULL },
+  { 0x1f471, 1, 0x2640, NULL },
+  { 0x1f935, 1, 0, NULL },
+  { 0x1f470, 1, 0, NULL },
+  { 0x1f930, 1, 0, NULL },
+  { 0x1f931, 1, 0, NULL },
   // person-fantasy
-  { 0x1f47c, 1, 0 },
-  { 0x1f385, 1, 0 },
-  { 0x1f936, 1, 0 },
-  { 0x1f9d9, 1, 0 },
-  //{ 0x1f9d9, 1, 0x2642 },
-  //{ 0x1f9d9, 1, 0x2640 },
-  //...
+  { 0x1f47c, 1, 0, NULL },
+  { 0x1f385, 1, 0, NULL },
+  { 0x1f936, 1, 0, NULL },
+  { 0x1f9d9, 1, 0, NULL },
+  { 0x1f9d9, 1, 0x2642, NULL },
+  { 0x1f9d9, 1, 0x2640, NULL },
+  { 0x1f9da, 1, 0, NULL },
+  { 0x1f9da, 1, 0x2642, NULL },
+  { 0x1f9da, 1, 0x2640, NULL },
+  { 0x1f9db, 1, 0, NULL },
+  { 0x1f9db, 1, 0x2642, NULL },
+  { 0x1f9db, 1, 0x2640, NULL },
+  { 0x1f9dc, 1, 0, NULL },
+  { 0x1f9dc, 1, 0x2642, NULL },
+  { 0x1f9dc, 1, 0x2640, NULL },
+  { 0x1f9dd, 1, 0, NULL },
+  { 0x1f9dd, 1, 0x2642, NULL },
+  { 0x1f9dd, 1, 0x2640, NULL },
+  { 0x1f9de, 0, 0, NULL },
+  { 0x1f9de, 0, 0x2642, NULL },
+  { 0x1f9de, 0, 0x2640, NULL },
+  { 0x1f9df, 0, 0, NULL },
+  { 0x1f9df, 0, 0x2642, NULL },
+  { 0x1f9df, 0, 0x2640, NULL },
   // person-gesture
-  { 0x1f64d, 1, 0 },
-  //{ 0x1f64d, 1, 0x2642 },
-  //{ 0x1f64d, 1, 0x2640 },
-  { 0x1f64e, 1, 0 },
-  //{ 0x1f64e, 1, 0x2642 },
-  //{ 0x1f64e, 1, 0x2640 },
-  { 0x1f645, 1, 0 },
-  //{ 0x1f645, 1, 0x2642 },
-  //{ 0x1f645, 1, 0x2640 },
-  { 0x1f646, 1, 0 },
-  //{ 0x1f646, 1, 0x2642 },
-  //{ 0x1f646, 1, 0x2640 },
-  { 0x1f481, 1, 0 },
-  //{ 0x1f481, 1, 0x2642 },
-  //{ 0x1f481, 1, 0x2640 },
-  { 0x1f64b, 1, 0 },
-  //{ 0x1f64b, 1, 0x2642 },
-  //{ 0x1f64b, 1, 0x2640 },
-  { 0x1f647, 1, 0 },
-  //{ 0x1f647, 1, 0x2642 },
-  //{ 0x1f647, 1, 0x2640 },
-  { 0x1f926, 1, 0 },
-  //{ 0x1f926, 1, 0x2642 },
-  //{ 0x1f926, 1, 0x2640 },
-  { 0x1f937, 1, 0 },
-  //{ 0x1f937, 1, 0x2642 },
-  //{ 0x1f937, 1, 0x2640 },
+  { 0x1f64d, 1, 0, NULL },
+  { 0x1f64d, 1, 0x2642, NULL },
+  { 0x1f64d, 1, 0x2640, NULL },
+  { 0x1f64e, 1, 0, NULL },
+  { 0x1f64e, 1, 0x2642, NULL },
+  { 0x1f64e, 1, 0x2640, NULL },
+  { 0x1f645, 1, 0, NULL },
+  { 0x1f645, 1, 0x2642, NULL },
+  { 0x1f645, 1, 0x2640, NULL },
+  { 0x1f646, 1, 0, NULL },
+  { 0x1f646, 1, 0x2642, NULL },
+  { 0x1f646, 1, 0x2640, NULL },
+  { 0x1f481, 1, 0, NULL },
+  { 0x1f481, 1, 0x2642, NULL },
+  { 0x1f481, 1, 0x2640, NULL },
+  { 0x1f64b, 1, 0, NULL },
+  { 0x1f64b, 1, 0x2642, NULL },
+  { 0x1f64b, 1, 0x2640, NULL },
+  { 0x1f647, 1, 0, NULL },
+  { 0x1f647, 1, 0x2642, NULL },
+  { 0x1f647, 1, 0x2640, NULL },
+  { 0x1f926, 1, 0, NULL },
+  { 0x1f926, 1, 0x2642, NULL },
+  { 0x1f926, 1, 0x2640, NULL },
+  { 0x1f937, 1, 0, NULL },
+  { 0x1f937, 1, 0x2642, NULL },
+  { 0x1f937, 1, 0x2640, NULL },
   // person-activity
-  { 0x1f486, 1, 0 },
-  //{ 0x1f486, 1, 0x2642 },
-  //{ 0x1f486, 1, 0x2640 },
-  { 0x1f487, 1, 0 },
-  //{ 0x1f487, 1, 0x2642 },
-  //{ 0x1f487, 1, 0x2640 },
-  { 0x1f6b6, 1, 0 },
-  //{ 0x1f6b6, 1, 0x2642 },
-  //{ 0x1f6b6, 1, 0x2640 },
-  { 0x1f3c3, 1, 0 },
-  //{ 0x1f3c3, 1, 0x2642 },
-  //{ 0x1f3c3, 1, 0x2640 },
-  { 0x1f483, 1, 0 },
-  { 0x1f57a, 1, 0 },
-  { 0x1f46f, 1, 0 },
-  //{ 0x1f46f, 1, 0x2642 },
-  //{ 0x1f46f, 1, 0x2640 },
-  { 0x1f9d6, 1, 0 },
-  //{ 0x1f9d6, 1, 0x2642 },
-  //{ 0x1f9d6, 1, 0x2640 },
-  { 0x1f9d7, 1, 0 },
-  //{ 0x1f9d7, 1, 0x2642 },
-  //{ 0x1f9d7, 1, 0x2640 },
-  { 0x1f9d8, 1, 0 },
-  //{ 0x1f9d8, 1, 0x2642 },
-  //{ 0x1f9d8, 1, 0x2640 },
-  { 0x1f6c0, 1, 0 },
-  { 0x1f6cc, 1, 0 },
-  { 0x1f574, 1, 0 },
-  { 0x1f5e3, 0, 0 },
-  { 0x1f464, 0, 0 },
-  { 0x1f465, 0, 0 },
+  { 0x1f486, 1, 0, NULL },
+  { 0x1f486, 1, 0x2642, NULL },
+  { 0x1f486, 1, 0x2640, NULL },
+  { 0x1f487, 1, 0, NULL },
+  { 0x1f487, 1, 0x2642, NULL },
+  { 0x1f487, 1, 0x2640, NULL },
+  { 0x1f6b6, 1, 0, NULL },
+  { 0x1f6b6, 1, 0x2642, NULL },
+  { 0x1f6b6, 1, 0x2640, NULL },
+  { 0x1f3c3, 1, 0, NULL },
+  { 0x1f3c3, 1, 0x2642, NULL },
+  { 0x1f3c3, 1, 0x2640, NULL },
+  { 0x1f483, 1, 0, NULL },
+  { 0x1f57a, 1, 0, NULL },
+  { 0x1f46f, 1, 0, NULL },
+  { 0x1f46f, 1, 0x2642, NULL },
+  { 0x1f46f, 1, 0x2640, NULL },
+  { 0x1f9d6, 1, 0, NULL },
+  { 0x1f9d6, 1, 0x2642, NULL },
+  { 0x1f9d6, 1, 0x2640, NULL },
+  { 0x1f9d7, 1, 0, NULL },
+  { 0x1f9d7, 1, 0x2642, NULL },
+  { 0x1f9d7, 1, 0x2640, NULL },
+  { 0x1f9d8, 1, 0, NULL },
+  { 0x1f9d8, 1, 0x2642, NULL },
+  { 0x1f9d8, 1, 0x2640, NULL },
+  { 0x1f6c0, 1, 0, NULL },
+  { 0x1f6cc, 1, 0, NULL },
+  { 0x1f574, 1, 0, NULL },
+  { 0x1f5e3, 0, 0, NULL },
+  { 0x1f464, 0, 0, NULL },
+  { 0x1f465, 0, 0, NULL },
   // person-sport
-  { 0x1f93a, 0, 0 },
-  { 0x1f3c7, 1, 0 },
-  { 0x026f7, 0, 0 },
-  { 0x1f3c2, 1, 0 },
-  { 0x1f3cc, 1, 0 },
-  //{ 0x1f3cc, 1, 0x2642 },
-  //{ 0x1f3cc, 1, 0x2640 },
-  { 0x1f3c4, 1, 0 },
-  //{ 0x1f3c4, 1, 0x2642 },
-  //{ 0x1f3c4, 1, 0x2640 },
-  { 0x1f6a3, 1, 0 },
-  //{ 0x1f6a3, 1, 0x2642 },
-  //{ 0x1f6a3, 1, 0x2640 },
-  { 0x1f3ca, 1, 0 },
-  //{ 0x1f3ca, 1, 0x2642 },
-  //{ 0x1f3ca, 1, 0x2640 },
-  { 0x026f9, 1, 0 },
-  //{ 0x026f9, 1, 0x2642 },
-  //{ 0x026f9, 1, 0x2640 },
-  { 0x1f3cb, 1, 0 },
-  //{ 0x1f3cb, 1, 0x2642 },
-  //{ 0x1f3cb, 1, 0x2640 },
-  { 0x1f6b4, 1, 0 },
-  //{ 0x1f6b4, 1, 0x2642 },
-  //{ 0x1f6b4, 1, 0x2640 },
-
+  { 0x1f93a, 0, 0, NULL },
+  { 0x1f3c7, 1, 0, NULL },
+  { 0x026f7, 0, 0, NULL },
+  { 0x1f3c2, 1, 0, NULL },
+  { 0x1f3cc, 1, 0, NULL },
+  { 0x1f3cc, 1, 0x2642, NULL },
+  { 0x1f3cc, 1, 0x2640, NULL },
+  { 0x1f3c4, 1, 0, NULL },
+  { 0x1f3c4, 1, 0x2642, NULL },
+  { 0x1f3c4, 1, 0x2640, NULL },
+  { 0x1f6a3, 1, 0, NULL },
+  { 0x1f6a3, 1, 0x2642, NULL },
+  { 0x1f6a3, 1, 0x2640, NULL },
+  { 0x1f3ca, 1, 0, NULL },
+  { 0x1f3ca, 1, 0x2642, NULL },
+  { 0x1f3ca, 1, 0x2640, NULL },
+  { 0x026f9, 1, 0, NULL },
+  { 0x026f9, 1, 0x2642, NULL },
+  { 0x026f9, 1, 0x2640, NULL },
+  { 0x1f3cb, 1, 0, NULL },
+  { 0x1f3cb, 1, 0x2642, NULL },
+  { 0x1f3cb, 1, 0x2640, NULL },
+
+  { 0x1f6b4, 1, 0, NULL },
+  { 0x1f6b4, 1, 0x2642, NULL },
+  { 0x1f6b4, 1, 0x2640, NULL },
+  { 0x1f6b5, 1, 0, NULL },
+  { 0x1f6b5, 1, 0x2642, NULL },
+  { 0x1f6b5, 1, 0x2640, NULL },
+  { 0x1f3ce, 0, 0, NULL },
+  { 0x1f3cd, 0, 0, NULL },
+  { 0x1f938, 1, 0, NULL },
+  { 0x1f938, 1, 0x2642, NULL },
+  { 0x1f938, 1, 0x2640, NULL },
+  { 0x1f93c, 0, 0, NULL },
+  { 0x1f93c, 0, 0x2642, NULL },
+  { 0x1f93c, 0, 0x2640, NULL },
+  { 0x1f93d, 1, 0, NULL },
+  { 0x1f93d, 1, 0x2642, NULL },
+  { 0x1f93d, 1, 0x2640, NULL },
+  { 0x1f93e, 1, 0, NULL },
+  { 0x1f93e, 1, 0x2642, NULL },
+  { 0x1f93e, 1, 0x2640, NULL },
+  { 0x1f939, 1, 0, NULL },
+  { 0x1f939, 1, 0x2642, NULL },
+  { 0x1f939, 1, 0x2640, NULL },
   // family
+  { 0x1f46b, 0, 0, NULL },
+  { 0x1f46c, 0, 0, NULL },
+  { 0x1f46d, 0, 0, NULL },
+  { 0x1f48f, 0, 0, NULL },
+  // 0x1f469 0x200d 0x274 0xfe0f 0x200d 0x1f48b 0x200d 0x1f468
+  // 0x1f468 0x200d 0x274 0xfe0f 0x200d 0x1f48b 0x200d 0x1f468
+  // 0x1f469 0x200d 0x274 0xfe0f 0x200d 0x1f48b 0x200d 0x1f469
+  { 0x1f491, 0, 0, NULL },
+  // 3 long sequences omitted
+  { 0x1f46a, 0, 0, NULL },
+  // 15 long sequences omitted
+  { 0x1f468, 0, 0x1f466, NULL },
+  // 1 long sequence omitted
+  { 0x1f468, 0, 0x1f467, NULL },
+  // 1 long sequence omitted
+  { 0x1f469, 0, 0x1f466, NULL },
+  // 1 long sequence omitted
+  { 0x1f469, 0, 0x1f467, NULL },
+  // 2 long sequences omitted
   // body
+  { 0x1f933, 1, 0, NULL },
+  { 0x1f4aa, 1, 0, NULL },
+  { 0x1f448, 1, 0, NULL },
+  { 0x1f449, 1, 0, NULL },
+  { 0x0261d, 1, 0, NULL },
+  { 0x1f446, 1, 0, NULL },
+  { 0x1f595, 1, 0, NULL },
+  { 0x1f447, 1, 0, NULL },
+  { 0x0270c, 1, 0, NULL },
+  { 0x1f91e, 1, 0, NULL },
+  { 0x1f596, 1, 0, NULL },
+  { 0x1f918, 1, 0, NULL },
+  { 0x1f919, 1, 0, NULL },
+  { 0x1f590, 1, 0, NULL },
+  { 0x0270b, 1, 0, NULL },
+  { 0x1f44c, 1, 0, NULL },
+  { 0x1f44d, 1, 0, NULL },
+  { 0x1f44e, 1, 0, NULL },
+  { 0x0270a, 1, 0, NULL },
+  { 0x1f44a, 1, 0, NULL },
+  { 0x1f91b, 1, 0, NULL },
+  { 0x1f91c, 1, 0, NULL },
+  { 0x1f91a, 1, 0, NULL },
+  { 0x1f44b, 1, 0, NULL },
+  { 0x1f91f, 1, 0, NULL },
+  { 0x0270d, 1, 0, NULL },
+  { 0x1f44f, 1, 0, NULL },
+  { 0x1f450, 1, 0, NULL },
+  { 0x1f64c, 1, 0, NULL },
+  { 0x1f932, 1, 0, NULL },
+  { 0x1f64f, 1, 0, NULL },
+  { 0x1f91d, 0, 0, NULL },
+  { 0x1f485, 1, 0, NULL },
+  { 0x1f442, 1, 0, NULL },
+  { 0x1f443, 1, 0, NULL },
+  { 0x1f463, 0, 0, NULL },
+  { 0x1f440, 0, 0, NULL },
+  { 0x1f441, 0, 0, NULL },
+  // 1 long sequence omitted
+  { 0x1f9e0, 0, 0, NULL },
+  { 0x1f445, 0, 0, NULL },
+  { 0x1f444, 0, 0, NULL },
   // emotion
+  { 0x1f48b, 0, 0, NULL },
+  { 0x1f498, 0, 0, NULL },
+  { 0x02764, 0, 0, NULL },
+  { 0x1f493, 0, 0, NULL },
+  { 0x1f494, 0, 0, NULL },
+  { 0x1f495, 0, 0, NULL },
+  { 0x1f496, 0, 0, NULL },
+  { 0x1f497, 0, 0, NULL },
+  { 0x1f499, 0, 0, NULL },
+  { 0x1f49a, 0, 0, NULL },
+  { 0x1f498, 0, 0, NULL },
+  { 0x1f9e1, 0, 0, NULL },
+  { 0x1f49c, 0, 0, NULL },
+  { 0x1f5a4, 0, 0, NULL },
+  { 0x1f49d, 0, 0, NULL },
+  { 0x1f49e, 0, 0, NULL },
+  { 0x1f49f, 0, 0, NULL },
+  { 0x02763, 0, 0, NULL },
+  { 0x1f48c, 0, 0, NULL },
+  { 0x1f4a4, 0, 0, NULL },
+  { 0x1f4a2, 0, 0, NULL },
+  { 0x1f4a3, 0, 0, NULL },
+  { 0x1f4a5, 0, 0, NULL },
+  { 0x1f4a6, 0, 0, NULL },
+  { 0x1f4a8, 0, 0, NULL },
+  { 0x1f4ab, 0, 0, NULL },
+  { 0x1f4ac, 0, 0, NULL },
+  { 0x1f5e8, 0, 0, NULL },
+  { 0x1f5ef, 0, 0, NULL },
+  { 0x1f4ad, 0, 0, NULL },
+  { 0x1f573, 0, 0, NULL },
   // clothing
+  { 0x1f453, 0, 0, NULL },
+  { 0x1f576, 0, 0, NULL },
+  { 0x1f454, 0, 0, NULL },
+  { 0x1f455, 0, 0, NULL },
+  { 0x1f456, 0, 0, NULL },
+  { 0x1f9e3, 0, 0, NULL },
+  { 0x1f9e4, 0, 0, NULL },
+  { 0x1f9e5, 0, 0, NULL },
+  { 0x1f9e6, 0, 0, NULL },
+  { 0x1f457, 0, 0, NULL },
+  { 0x1f458, 0, 0, NULL },
+  { 0x1f459, 0, 0, NULL },
+  { 0x1f45a, 0, 0, NULL },
+  { 0x1f45b, 0, 0, NULL },
+  { 0x1f45c, 0, 0, NULL },
+  { 0x1f45d, 0, 0, NULL },
+  { 0x1f6cd, 0, 0, NULL },
+  { 0x1f392, 0, 0, NULL },
+  { 0x1f45e, 0, 0, NULL },
+  { 0x1f45f, 0, 0, NULL },
+  { 0x1f460, 0, 0, NULL },
+  { 0x1f461, 0, 0, NULL },
+  { 0x1f462, 0, 0, NULL },
+  { 0x1f451, 0, 0, NULL },
+  { 0x1f452, 0, 0, NULL },
+  { 0x1f3a9, 0, 0, NULL },
+  { 0x1f393, 0, 0, NULL },
+  { 0x1f9e2, 0, 0, NULL },
+  { 0x026d1, 0, 0, NULL },
+  { 0x1f4ff, 0, 0, NULL },
+  { 0x1f484, 0, 0, NULL },
+  { 0x1f48d, 0, 0, NULL },
+  { 0x1f48e, 0, 0, NULL },
 };
 
 static EmojiData nature[] = {
   // animal-mammal
-  { 0x1f435, 0, 0 },
-  { 0x1f412, 0, 0 },
-  { 0x1f980, 0, 0 },
-  { 0x1f436, 0, 0 },
-  { 0x1f415, 0, 0 },
-  { 0x1f429, 0, 0 },
-  { 0x1f43A, 0, 0 },
-  { 0x1f98A, 0, 0 },
-  { 0x1f431, 0, 0 },
-  { 0x1f408, 0, 0 },
-  { 0x1f981, 0, 0 },
-  { 0x1f42f, 0, 0 },
-  { 0x1f405, 0, 0 },
-  { 0x1f406, 0, 0 },
-  { 0x1f434, 0, 0 },
-  { 0x1f984, 0, 0 },
-  { 0x1f993, 0, 0 },
-  { 0x1f989, 0, 0 },
-  { 0x1f42e, 0, 0 },
-  { 0x1f402, 0, 0 },
-  { 0x1f403, 0, 0 },
-  { 0x1f437, 0, 0 },
-  { 0x1f416, 0, 0 },
-  { 0x1f417, 0, 0 },
-  { 0x1f43d, 0, 0 },
-  { 0x1f40f, 0, 0 },
-  { 0x1f411, 0, 0 },
-  { 0x1f410, 0, 0 },
-  { 0x1f42a, 0, 0 },
-  { 0x1f42b, 0, 0 },
-  { 0x1f992, 0, 0 },
-  { 0x1f418, 0, 0 },
-  { 0x1f98f, 0, 0 },
-  { 0x1f42d, 0, 0 },
-  { 0x1f401, 0, 0 },
-  { 0x1f400, 0, 0 },
-  { 0x1f439, 0, 0 },
-  { 0x1f430, 0, 0 },
-  { 0x1f407, 0, 0 },
-  { 0x1f43f, 0, 0 },
-  { 0x1f994, 0, 0 },
-  { 0x1f987, 0, 0 },
-  { 0x1f438, 0, 0 },
-  { 0x1f428, 0, 0 },
-  { 0x1f43c, 0, 0 },
-  { 0x1f43e, 0, 0 },
+  { 0x1f435, 0, 0, NULL },
+  { 0x1f412, 0, 0, NULL },
+  { 0x1f980, 0, 0, NULL },
+  { 0x1f436, 0, 0, NULL },
+  { 0x1f415, 0, 0, NULL },
+  { 0x1f429, 0, 0, NULL },
+  { 0x1f43A, 0, 0, NULL },
+  { 0x1f98A, 0, 0, NULL },
+  { 0x1f431, 0, 0, NULL },
+  { 0x1f408, 0, 0, NULL },
+  { 0x1f981, 0, 0, NULL },
+  { 0x1f42f, 0, 0, NULL },
+  { 0x1f405, 0, 0, NULL },
+  { 0x1f406, 0, 0, NULL },
+  { 0x1f434, 0, 0, NULL },
+  { 0x1f984, 0, 0, NULL },
+  { 0x1f993, 0, 0, NULL },
+  { 0x1f989, 0, 0, NULL },
+  { 0x1f42e, 0, 0, NULL },
+  { 0x1f402, 0, 0, NULL },
+  { 0x1f403, 0, 0, NULL },
+  { 0x1f437, 0, 0, NULL },
+  { 0x1f416, 0, 0, NULL },
+  { 0x1f417, 0, 0, NULL },
+  { 0x1f43d, 0, 0, NULL },
+  { 0x1f40f, 0, 0, NULL },
+  { 0x1f411, 0, 0, NULL },
+  { 0x1f410, 0, 0, NULL },
+  { 0x1f42a, 0, 0, NULL },
+  { 0x1f42b, 0, 0, NULL },
+  { 0x1f992, 0, 0, NULL },
+  { 0x1f418, 0, 0, NULL },
+  { 0x1f98f, 0, 0, NULL },
+  { 0x1f42d, 0, 0, NULL },
+  { 0x1f401, 0, 0, NULL },
+  { 0x1f400, 0, 0, NULL },
+  { 0x1f439, 0, 0, NULL },
+  { 0x1f430, 0, 0, NULL },
+  { 0x1f407, 0, 0, NULL },
+  { 0x1f43f, 0, 0, NULL },
+  { 0x1f994, 0, 0, NULL },
+  { 0x1f987, 0, 0, NULL },
+  { 0x1f438, 0, 0, NULL },
+  { 0x1f428, 0, 0, NULL },
+  { 0x1f43c, 0, 0, NULL },
+  { 0x1f43e, 0, 0, NULL },
   // animal-bird
-  { 0x1f983, 0, 0 },
-  { 0x1f414, 0, 0 },
-  { 0x1f413, 0, 0 },
-  { 0x1f423, 0, 0 },
-  { 0x1f424, 0, 0 },
-  { 0x1f425, 0, 0 },
-  { 0x1f426, 0, 0 },
-  { 0x1f427, 0, 0 },
-  { 0x1f54a, 0, 0 },
-  { 0x1f985, 0, 0 },
-  { 0x1f986, 0, 0 },
-  { 0x1f989, 0, 0 },
+  { 0x1f983, 0, 0, NULL },
+  { 0x1f414, 0, 0, NULL },
+  { 0x1f413, 0, 0, NULL },
+  { 0x1f423, 0, 0, NULL },
+  { 0x1f424, 0, 0, NULL },
+  { 0x1f425, 0, 0, NULL },
+  { 0x1f426, 0, 0, NULL },
+  { 0x1f427, 0, 0, NULL },
+  { 0x1f54a, 0, 0, NULL },
+  { 0x1f985, 0, 0, NULL },
+  { 0x1f986, 0, 0, NULL },
+  { 0x1f989, 0, 0, NULL },
   // animal-amphibian
-  { 0x1f438, 0, 0 },
+  { 0x1f438, 0, 0, NULL },
   // animal-reptile
-  { 0x1f40a, 0, 0 },
-  { 0x1f422, 0, 0 },
-  { 0x1f98e, 0, 0 },
-  { 0x1f40d, 0, 0 },
-  { 0x1f432, 0, 0 },
-  { 0x1f409, 0, 0 },
-  { 0x1f995, 0, 0 },
-  { 0x1f996, 0, 0 },
+  { 0x1f40a, 0, 0, NULL },
+  { 0x1f422, 0, 0, NULL },
+  { 0x1f98e, 0, 0, NULL },
+  { 0x1f40d, 0, 0, NULL },
+  { 0x1f432, 0, 0, NULL },
+  { 0x1f409, 0, 0, NULL },
+  { 0x1f995, 0, 0, NULL },
+  { 0x1f996, 0, 0, NULL },
   // animal-marine
+  { 0x1f433, 0, 0, NULL },
+  { 0x1f40b, 0, 0, NULL },
+  { 0x1f42c, 0, 0, NULL },
+  { 0x1f41f, 0, 0, NULL },
+  { 0x1f420, 0, 0, NULL },
+  { 0x1f421, 0, 0, NULL },
+  { 0x1f988, 0, 0, NULL },
+  { 0x1f419, 0, 0, NULL },
+  { 0x1f41a, 0, 0, NULL },
+  { 0x1f980, 0, 0, NULL },
+  { 0x1f990, 0, 0, NULL },
+  { 0x1f991, 0, 0, NULL },
   // animal-bug
+  { 0x1f40c, 0, 0, NULL },
+  { 0x1f98b, 0, 0, NULL },
+  { 0x1f41b, 0, 0, NULL },
+  { 0x1f41c, 0, 0, NULL },
+  { 0x1f41d, 0, 0, NULL },
+  { 0x1f41e, 0, 0, NULL },
+  { 0x1f997, 0, 0, NULL },
+  { 0x1f577, 0, 0, NULL },
+  { 0x1f578, 0, 0, NULL },
+  { 0x1f982, 0, 0, NULL },
   // plant-flower
+  { 0x1f490, 0, 0, NULL },
+  { 0x1f338, 0, 0, NULL },
+  { 0x1f4ae, 0, 0, NULL },
+  { 0x1f3f5, 0, 0, NULL },
+  { 0x1f339, 0, 0, NULL },
+  { 0x1f940, 0, 0, NULL },
+  { 0x1f33a, 0, 0, NULL },
+  { 0x1f33b, 0, 0, NULL },
+  { 0x1f33c, 0, 0, NULL },
+  { 0x1f337, 0, 0, NULL },
   // plant-other
+  { 0x1f331, 0, 0, NULL },
+  { 0x1f332, 0, 0, NULL },
+  { 0x1f333, 0, 0, NULL },
+  { 0x1f334, 0, 0, NULL },
+  { 0x1f335, 0, 0, NULL },
+  { 0x1f33e, 0, 0, NULL },
+  { 0x1f33f, 0, 0, NULL },
+  { 0x02618, 0, 0, NULL },
+  { 0x1f340, 0, 0, NULL },
+  { 0x1f343, 0, 0 }
 };
 
 static EmojiData food[] = {
   // food-fruit
-  { 0x1f347, 0, 0 },
-  { 0x1f348, 0, 0 },
-  { 0x1f349, 0, 0 },
-  { 0x1f34a, 0, 0 },
-  { 0x1f34b, 0, 0 },
-  { 0x1f34c, 0, 0 },
-  { 0x1f34d, 0, 0 },
-  { 0x1f34e, 0, 0 },
-  { 0x1f34f, 0, 0 },
-  { 0x1f350, 0, 0 },
-  { 0x1f351, 0, 0 },
-  { 0x1f352, 0, 0 },
-  { 0x1f353, 0, 0 },
-  { 0x1f95d, 0, 0 },
-  { 0x1f345, 0, 0 },
-  { 0x1f965, 0, 0 },
+  { 0x1f347, 0, 0, NULL },
+  { 0x1f348, 0, 0, NULL },
+  { 0x1f349, 0, 0, NULL },
+  { 0x1f34a, 0, 0, NULL },
+  { 0x1f34b, 0, 0, NULL },
+  { 0x1f34c, 0, 0, NULL },
+  { 0x1f34d, 0, 0, NULL },
+  { 0x1f34e, 0, 0, NULL },
+  { 0x1f34f, 0, 0, NULL },
+  { 0x1f350, 0, 0, NULL },
+  { 0x1f351, 0, 0, NULL },
+  { 0x1f352, 0, 0, NULL },
+  { 0x1f353, 0, 0, NULL },
+  { 0x1f95d, 0, 0, NULL },
+  { 0x1f345, 0, 0, NULL },
+  { 0x1f965, 0, 0, NULL },
   // food-vegetable
+  { 0x1f951, 0, 0, NULL },
+  { 0x1f346, 0, 0, NULL },
+  { 0x1f954, 0, 0, NULL },
+  { 0x1f955, 0, 0, NULL },
+  { 0x1f33d, 0, 0, NULL },
+  { 0x1f336, 0, 0, NULL },
+  { 0x1f952, 0, 0, NULL },
+  { 0x1f966, 0, 0, NULL },
+  { 0x1f344, 0, 0, NULL },
+  { 0x1f95c, 0, 0, NULL },
+  { 0x1f330, 0, 0, NULL },
   // food-prepared
+  { 0x1f35e, 0, 0, NULL },
+  { 0x1f950, 0, 0, NULL },
+  { 0x1f956, 0, 0, NULL },
+  { 0x1f968, 0, 0, NULL },
+  { 0x1f95e, 0, 0, NULL },
+  { 0x1f9c0, 0, 0, NULL },
+  { 0x1f356, 0, 0, NULL },
+  { 0x1f357, 0, 0, NULL },
+  { 0x1f969, 0, 0, NULL },
+  { 0x1f953, 0, 0, NULL },
+  { 0x1f354, 0, 0, NULL },
+  { 0x1f35f, 0, 0, NULL },
+  { 0x1f32d, 0, 0, NULL },
+  { 0x1f96a, 0, 0, NULL },
+  { 0x1f32e, 0, 0, NULL },
+  { 0x1f32f, 0, 0, NULL },
+  { 0x1f959, 0, 0, NULL },
+  { 0x1f95a, 0, 0, NULL },
+  { 0x1f373, 0, 0, NULL },
+  { 0x1f958, 0, 0, NULL },
+  { 0x1f372, 0, 0, NULL },
+  { 0x1f963, 0, 0, NULL },
+  { 0x1f957, 0, 0, NULL },
+  { 0x1f96b, 0, 0, NULL },
   // food-asian
   // food-sweet
   // drink
   // dishware
-  { 0x1f962, 0, 0 },
-  { 0x1f37d, 0, 0 },
-  { 0x1f374, 0, 0 },
-  { 0x1f944, 0, 0 },
-  { 0x1f52a, 0, 0 },
-  { 0x1f3f, 0, 0 },
+  { 0x1f962, 0, 0, NULL },
+  { 0x1f37d, 0, 0, NULL },
+  { 0x1f374, 0, 0, NULL },
+  { 0x1f944, 0, 0, NULL },
+  { 0x1f52a, 0, 0, NULL },
+  { 0x1f3f, 0, 0, NULL },
 };
 
 static EmojiData travel[] = {
   // place-map
-  { 0x1f3f, 0, 0 },
+  { 0x1f30d, 0, 0, NULL },
   // place-geographic
+  { 0x1f3d4, 0, 0, NULL },
   // place building
+  { 0x1f3df, 0, 0, NULL },
   // place-religious
+  { 0x026ea, 0, 0, NULL },
   // place-other
+  { 0x026f2, 0, 0, NULL },
   // transport-ground
+  { 0x1f682, 0, 0, NULL },
   // transport-water
+  { 0x02693, 0, 0, NULL },
   // transport-air
   // hotel
   // time
@@ -582,20 +668,62 @@ static EmojiData travel[] = {
 };
 
 static EmojiData activities[] = {
+  // event
+  { 0x1f383, 0, 0, NULL },
+  // award-medal
+  { 0x1f396, 0, 0, NULL },
+  // sport
+  { 0x026bd, 0, 0, NULL },
+  // game
+  { 0x1f3ae, 0, 0, NULL },
 };
 
 static EmojiData objects[] = {
+  // sound
+  { 0x1f507, 0, 0, NULL },
+  // music
+  { 0x1f3bc, 0, 0, NULL },
+  // musical-instrument
+  { 0x1f3b7, 0, 0, NULL },
+  // phone
+  // computer
+  // light & video
+  // book-paper
+  // money
+  // mail
+  // writing
+  // office
+  // lock
+  // tool
+  // medical
+  // other-object
 };
 
 static EmojiData symbols[] = {
+  // transport-sign
+  // warning
+  // arrow
+  // religion
+  // zodiac
+  // av-symbol
+  // other-symbol
+  // keycap
+  // alphanum
+  // geometric
 };
 
+static EmojiData flags[] = {
+  // flag
+  // country-flag
+  // subdivision-flag
+};
 
 struct _GtkEmojiPicker
 {
         GtkPopover parent_instance;
 
         GtkWidget *scrolled_window;
+        GtkWidget *search_entry;
 
         GtkWidget *people_box;
         GtkWidget *people_heading;
@@ -632,6 +760,11 @@ struct _GtkEmojiPicker
         GtkWidget *symbols_button;
         GtkWidget *symbols_label;
 
+        GtkWidget *flags_box;
+        GtkWidget *flags_heading;
+        GtkWidget *flags_button;
+        GtkWidget *flags_label;
+
         GtkWidget *scroll_to_button;
 
         GtkGesture *people_press;
@@ -676,6 +809,8 @@ scroll_in_idle (gpointer data)
                 heading = picker->objects_heading;
         else if (picker->scroll_to_button == picker->symbols_button)
                 heading = picker->symbols_heading;
+        else if (picker->scroll_to_button == picker->flags_button)
+                heading = picker->flags_heading;
         else
                 return G_SOURCE_REMOVE;
 
@@ -719,11 +854,7 @@ emoji_activated (GtkFlowBox      *box,
 }
 
 static void
-add_emoji (GtkWidget  *box,
-           gunichar    code,
-           gunichar    modifier,
-           gboolean    is_modifier_base,
-           gunichar    code2);
+add_emoji (GtkWidget  *box, EmojiData *emoji, gunichar modifier);
 
 static void
 people_pressed_cb (GtkGesture *gesture,
@@ -736,20 +867,16 @@ people_pressed_cb (GtkGesture *gesture,
         GtkWidget *popover;
         GtkWidget *view;
         GtkWidget *box;
-        gunichar code;
+        EmojiData *emoji_data;
         gunichar modifier;
-        gunichar code2;
-        gboolean is_modifier_base;
         GtkWidget *parent_popover;
 
         child = GTK_WIDGET (gtk_flow_box_get_child_at_pos (GTK_FLOW_BOX (picker->people_box), x, y));
         if (!child)
                 return;
 
-        code = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "code"));
-        code2 = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (child), "code2"));
-        is_modifier_base = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (child), "is-modifier-base"));
-        if (!is_modifier_base)
+        emoji_data = (EmojiData*) g_object_get_data (G_OBJECT (child), "emoji-data");
+        if (!emoji_data->is_modifier_base)
                 return;
 
         parent_popover = gtk_widget_get_ancestor (child, GTK_TYPE_POPOVER);
@@ -767,20 +894,17 @@ people_pressed_cb (GtkGesture *gesture,
 
         g_signal_connect (box, "child-activated", G_CALLBACK (emoji_activated), parent_popover);
 
-        add_emoji (box, code, 0, FALSE, code2);
-        for (modifier = 0x1f3fb; modifier <= 0x1f3ff; modifier++) {
-                add_emoji (box, code, modifier, FALSE, code2);
-        }
+        add_emoji (box, emoji_data, 0);
+        for (modifier = 0x1f3fb; modifier <= 0x1f3ff; modifier++)
+                add_emoji (box, emoji_data, modifier);
 
         gtk_popover_popup (GTK_POPOVER (popover));
 }
 
 static void
 add_emoji (GtkWidget  *box,
-           gunichar    code,
-           gunichar    modifier,
-           gboolean    is_modifier_base,
-           gunichar    code2)
+           EmojiData  *data,
+           gunichar    modifier)
 {
         GtkWidget *child;
         GtkWidget *label;
@@ -788,13 +912,12 @@ add_emoji (GtkWidget  *box,
         char text[32];
         char *p = text;
 
-        p += g_unichar_to_utf8 (code, p);
+        p += g_unichar_to_utf8 (data->code, p);
         if (modifier != 0)
                 p += g_unichar_to_utf8 (modifier, p);
-        if (code2 != 0) {
+        if (data->code2 != 0) {
                 p += g_unichar_to_utf8 (0x200d, p);
-                p += g_unichar_to_utf8 (code2, p);
-                p += g_unichar_to_utf8 (0xfe0f, p);
+                p += g_unichar_to_utf8 (data->code2, p);
         }
         p[0] = 0;
 
@@ -807,9 +930,7 @@ add_emoji (GtkWidget  *box,
 
         child = gtk_flow_box_child_new ();
         gtk_style_context_add_class (gtk_widget_get_style_context (child), "emojicell");
-        g_object_set_data (G_OBJECT (child), "code", GUINT_TO_POINTER (code));
-        g_object_set_data (G_OBJECT (child), "code2", GUINT_TO_POINTER (code2));
-        g_object_set_data (G_OBJECT (child), "is-modifier-base", GINT_TO_POINTER (is_modifier_base));
+        g_object_set_data (G_OBJECT (child), "emoji-data", data);
 
         gtk_container_add (GTK_CONTAINER (child), label);
         gtk_container_add (GTK_CONTAINER (box), child);
@@ -834,23 +955,26 @@ populate_emoji_picker (GtkEmojiPicker *picker)
         int i;
 
         for (i = 0; i < G_N_ELEMENTS (people); i++)
-                add_emoji (picker->people_box, people[i].code, 0, people[i].is_modifier_base, 
people[i].code2);
+                add_emoji (picker->people_box, &people[i], 0);
         for (i = 0; i < G_N_ELEMENTS (nature); i++)
-                add_emoji (picker->nature_box, nature[i].code, 0, nature[i].is_modifier_base, 
nature[i].code2);
+                add_emoji (picker->nature_box, &nature[i], 0);
         for (i = 0; i < G_N_ELEMENTS (food); i++)
-                add_emoji (picker->food_box, food[i].code, 0, food[i].is_modifier_base, food[i].code2);
+                add_emoji (picker->food_box, &food[i], 0);
 
         for (i = 0; i < G_N_ELEMENTS (travel); i++)
-                add_emoji (picker->travel_box, travel[i].code, 0, travel[i].is_modifier_base, 
travel[i].code2);
+                add_emoji (picker->travel_box, &travel[i], 0);
 
         for (i = 0; i < G_N_ELEMENTS (activities); i++)
-                add_emoji (picker->activities_box, activities[i].code, 0, activities[i].is_modifier_base, 
activities[i].code2);
+                add_emoji (picker->activities_box, &activities[i], 0);
 
         for (i = 0; i < G_N_ELEMENTS (objects); i++)
-                add_emoji (picker->objects_box, objects[i].code, 0, objects[i].is_modifier_base, 
objects[i].code2);
+                add_emoji (picker->objects_box, &objects[i], 0);
 
         for (i = 0; i < G_N_ELEMENTS (symbols); i++)
-                add_emoji (picker->symbols_box, symbols[i].code, 0, symbols[i].is_modifier_base, 
symbols[i].code2);
+                add_emoji (picker->symbols_box, &symbols[i], 0);
+
+        for (i = 0; i < G_N_ELEMENTS (flags); i++)
+                add_emoji (picker->flags_box, &flags[i], 0);
 
         set_label (picker->people_label, 0x1f642);
         set_label (picker->nature_label, 0x1f337);
@@ -859,6 +983,7 @@ populate_emoji_picker (GtkEmojiPicker *picker)
         set_label (picker->activities_label, 0x1f3c3);
         set_label (picker->objects_label, 0x1f514);
         set_label (picker->symbols_label, 0x2764);
+        set_label (picker->flags_label, 0x1f3f4);
 }
 
 static void
@@ -882,6 +1007,44 @@ adj_value_changed (GtkAdjustment *adj, gpointer data)
         update_state (picker->people_heading, picker->people_button, value);
         update_state (picker->nature_heading, picker->nature_button, value);
         update_state (picker->food_heading, picker->food_button, value);
+        update_state (picker->travel_heading, picker->travel_button, value);
+        update_state (picker->activities_heading, picker->activities_button, value);
+        update_state (picker->objects_heading, picker->objects_button, value);
+        update_state (picker->symbols_heading, picker->symbols_button, value);
+        update_state (picker->flags_heading, picker->flags_button, value);
+}
+
+static gboolean
+filter_func (GtkFlowBoxChild *child, gpointer data)
+{
+        GtkEmojiPicker *picker = data;
+        EmojiData *emoji_data;
+        const char *text;
+        int i;
+
+        text = gtk_entry_get_text (GTK_ENTRY (picker->search_entry));
+        emoji_data = (EmojiData*) g_object_get_data (G_OBJECT (child), "emoji-data");
+
+        if (text[0] == 0 || text[1] == 0)
+                return TRUE;
+
+        if (!emoji_data->keywords)
+                return FALSE;
+
+        for (i = 0; emoji_data->keywords[i]; i++) {
+                if (g_str_has_prefix (emoji_data->keywords[i], text))
+                        return TRUE;
+        }
+
+        return FALSE;
+}
+
+static void
+search_changed (GtkEntry *entry, gpointer data)
+{
+        GtkEmojiPicker *picker = data;
+
+        gtk_flow_box_invalidate_filter (GTK_FLOW_BOX (picker->people_box));
 }
 
 static void
@@ -906,6 +1069,24 @@ gtk_emoji_picker_init (GtkEmojiPicker *picker)
 
         adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (picker->scrolled_window));
         g_signal_connect (adj, "value-changed", G_CALLBACK (adj_value_changed), picker);
+
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->people_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->nature_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->food_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->travel_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->activities_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->objects_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->symbols_box), adj);
+        gtk_container_set_focus_vadjustment (GTK_CONTAINER (picker->flags_box), adj);
+
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->people_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->nature_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->food_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->travel_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->activities_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->objects_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->symbols_box), filter_func, picker, NULL);
+        gtk_flow_box_set_filter_func (GTK_FLOW_BOX (picker->flags_box), filter_func, picker, NULL);
 }
 
 static void
@@ -933,6 +1114,7 @@ gtk_emoji_picker_class_init (GtkEmojiPickerClass *klass)
         g_mapped_file_unref (mf);
 
         gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, scrolled_window);
+        gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, search_entry);
 
         gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, people_box);
         gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, people_heading);
@@ -969,8 +1151,14 @@ gtk_emoji_picker_class_init (GtkEmojiPickerClass *klass)
         gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, symbols_button);
         gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, symbols_label);
 
+        gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, flags_box);
+        gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, flags_heading);
+        gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, flags_button);
+        gtk_widget_class_bind_template_child (widget_class, GtkEmojiPicker, flags_label);
+
         gtk_widget_class_bind_template_callback (widget_class, emoji_activated);
         gtk_widget_class_bind_template_callback (widget_class, scroll_to_section);
+        gtk_widget_class_bind_template_callback (widget_class, search_changed);
 }
 
 GtkWidget *
diff --git a/tests/gtkemojipicker.css b/tests/gtkemojipicker.css
index 02dca71..403f41c 100644
--- a/tests/gtkemojipicker.css
+++ b/tests/gtkemojipicker.css
@@ -1,3 +1,4 @@
 .emojicell:hover {
   background: lightgray;
+  border-radius: 6px;
 }
diff --git a/tests/gtkemojipicker.ui b/tests/gtkemojipicker.ui
index 921f849..973c8ce 100644
--- a/tests/gtkemojipicker.ui
+++ b/tests/gtkemojipicker.ui
@@ -8,7 +8,7 @@
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkSearchEntry" id="search_entry">
-            <property name="visible">0</property>
+            <signal name="search-changed" handler="search_changed"/>
           </object>
         </child>
         <child>
@@ -26,7 +26,7 @@
                 <property name="spacing">6</property>
                 <child>
                   <object class="GtkLabel" id="people_heading">
-                    <property name="label" translatable="yes">People</property>
+                    <property name="label" translatable="yes">Smileys &amp; People</property>
                     <property name="xalign">0</property>
                   </object>
                 </child>
@@ -42,7 +42,7 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="nature_heading">
-                    <property name="label" translatable="yes">Nature</property>
+                    <property name="label" translatable="yes">Animals &amp; Nature</property>
                     <property name="xalign">0</property>
                   </object>
                 </child>
@@ -60,7 +60,7 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="food_heading">
-                    <property name="label" translatable="yes">Food</property>
+                    <property name="label" translatable="yes">Food &amp; Drink</property>
                     <property name="xalign">0</property>
                   </object>
                 </child>
@@ -78,7 +78,7 @@
                 </child>
                 <child>
                   <object class="GtkLabel" id="travel_heading">
-                    <property name="label" translatable="yes">Travel</property>
+                    <property name="label" translatable="yes">Travel &amp; Places</property>
                     <property name="xalign">0</property>
                   </object>
                 </child>
@@ -148,6 +148,24 @@
                     <signal name="child-activated" handler="emoji_activated"/>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkLabel" id="flags_heading">
+                    <property name="label" translatable="yes">Flags</property>
+                    <property name="xalign">0</property>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkFlowBox" id="flags_box">
+                    <property name="homogeneous">1</property>
+                    <property name="selection-mode">none</property>
+                    <property name="row-spacing">6</property>
+                    <property name="column-spacing">6</property>
+                    <property name="min-children-per-line">6</property>
+                    <property name="max-children-per-line">6</property>
+                    <property name="activate-on-single-click">1</property>
+                    <signal name="child-activated" handler="emoji_activated"/>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -246,6 +264,19 @@
                 </child>
               </object>
             </child>
+            <child>
+              <object class="GtkButton" id="flags_button">
+                <property name="relief">none</property>
+                <signal name="clicked" handler="scroll_to_section"/>
+                <style>
+                  <class name="emojisection"/>
+                </style>
+                <child>
+                  <object class="GtkLabel" id="flags_label">
+                  </object>
+                </child>
+              </object>
+            </child>
           </object>
         </child>
       </object>


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