[gnome-builder/wip/chergert/shortcuts] more wip on shortcuts



commit dcc478eb457585a59b412b40232498d4d9009a8c
Author: Christian Hergert <christian hergert me>
Date:   Mon Aug 24 23:49:03 2015 -0700

    more wip on shortcuts

 configure.ac                              |    1 +
 contrib/egg/egg-fill-box.c                |    5 +-
 contrib/egg/egg-search-bar.c              |   10 ++
 contrib/egg/egg-search-bar.h              |    1 +
 contrib/egg/egg-shortcuts-group.c         |    3 +
 contrib/egg/egg-shortcuts-item.c          |   15 ++
 contrib/egg/egg-shortcuts-window.c        |  251 ++++++++++++++++++++++++++++-
 data/theme/Adwaita-shared.css             |    6 +
 data/ui/gb-shortcuts-window.ui            |   14 ++
 src/Makefile.am                           |    2 +
 src/app/gb-application-actions.c          |   21 +++
 src/app/gb-application.c                  |    1 +
 src/keybindings/gb-shortcuts-window.c     |   42 +++++
 src/keybindings/gb-shortcuts-window.h     |   32 ++++
 src/resources/gnome-builder.gresource.xml |    3 +-
 15 files changed, 404 insertions(+), 3 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index b587d18..85a03cb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -123,6 +123,7 @@ AS_CASE(["$enable_debug"],
         [yes],[
             DEBUG_CFLAGS="$DEBUG_CFLAGS -O0"
             DEBUG_CFLAGS="$DEBUG_CFLAGS -g"
+            DEBUG_CFLAGS="$DEBUG_CFLAGS -fno-omit-frame-pointer"
         ],
         [minimum],[
             DEBUG_CFLAGS="$DEBUG_CFLAGS -DG_DISABLE_CAST_CHECKS"
diff --git a/contrib/egg/egg-fill-box.c b/contrib/egg/egg-fill-box.c
index f902636..4dd7446 100644
--- a/contrib/egg/egg-fill-box.c
+++ b/contrib/egg/egg-fill-box.c
@@ -114,7 +114,10 @@ egg_fill_box_relayout (EggFillBox *self,
 
   if (max_nat_width < width)
     {
-      num_columns = MAX (1, width / max_nat_width);
+      gint length;
+
+      length = g_sequence_get_length (priv->children);
+      num_columns = MAX (1, MIN (length, width / max_nat_width));
       consumed = num_columns * max_nat_width;
       column_width = max_nat_width;
       begin_space = (width - consumed) / 2;
diff --git a/contrib/egg/egg-search-bar.c b/contrib/egg/egg-search-bar.c
index 88069ab..14a57ba 100644
--- a/contrib/egg/egg-search-bar.c
+++ b/contrib/egg/egg-search-bar.c
@@ -58,6 +58,16 @@ enum {
 static GParamSpec *gParamSpecs [LAST_PROP];
 static guint       gSignals [LAST_SIGNAL];
 
+GtkWidget *
+egg_search_bar_get_entry (EggSearchBar *self)
+{
+  EggSearchBarPrivate *priv = egg_search_bar_get_instance_private (self);
+
+  g_return_val_if_fail (EGG_IS_SEARCH_BAR (self), NULL);
+
+  return GTK_WIDGET (priv->entry);
+}
+
 static void
 egg_search_bar__entry_activate (EggSearchBar   *self,
                                 GtkSearchEntry *entry)
diff --git a/contrib/egg/egg-search-bar.h b/contrib/egg/egg-search-bar.h
index 4f39bed..7b682d0 100644
--- a/contrib/egg/egg-search-bar.h
+++ b/contrib/egg/egg-search-bar.h
@@ -33,6 +33,7 @@ struct _EggSearchBarClass
 };
 
 GtkWidget *egg_search_bar_new                     (void);
+GtkWidget *egg_search_bar_get_entry               (EggSearchBar *self);
 gboolean   egg_search_bar_get_search_mode_enabled (EggSearchBar *self);
 void       egg_search_bar_set_search_mode_enabled (EggSearchBar *self,
                                                    gboolean      search_mode_enabled);
diff --git a/contrib/egg/egg-shortcuts-group.c b/contrib/egg/egg-shortcuts-group.c
index 983dcea..fdf3eae 100644
--- a/contrib/egg/egg-shortcuts-group.c
+++ b/contrib/egg/egg-shortcuts-group.c
@@ -135,7 +135,10 @@ egg_shortcuts_group_class_init (EggShortcutsGroupClass *klass)
 static void
 egg_shortcuts_group_init (EggShortcutsGroup *self)
 {
+  gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
+
   self->title = g_object_new (GTK_TYPE_LABEL,
+                              "xalign", 0.0f,
                               "visible", TRUE,
                               NULL);
   gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->title));
diff --git a/contrib/egg/egg-shortcuts-item.c b/contrib/egg/egg-shortcuts-item.c
index e935c94..8ca486e 100644
--- a/contrib/egg/egg-shortcuts-item.c
+++ b/contrib/egg/egg-shortcuts-item.c
@@ -124,6 +124,20 @@ egg_shortcuts_item_class_init (EggShortcutsItemClass *klass)
   object_class->get_property = egg_shortcuts_item_get_property;
   object_class->set_property = egg_shortcuts_item_set_property;
 
+  gParamSpecs [PROP_ACCELERATOR] =
+    g_param_spec_string ("accelerator",
+                         _("Accelerator"),
+                         _("Accelerator"),
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  gParamSpecs [PROP_DESCRIPTION] =
+    g_param_spec_string ("description",
+                         _("Description"),
+                         _("Description"),
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   gParamSpecs [PROP_KEYWORDS] =
     g_param_spec_string ("keywords",
                          _("Keywords"),
@@ -140,6 +154,7 @@ egg_shortcuts_item_init (EggShortcutsItem *self)
   self->description = g_object_new (GTK_TYPE_LABEL,
                                     "hexpand", TRUE,
                                     "visible", TRUE,
+                                    "xalign", 0.0f,
                                     NULL);
   gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->description));
 }
diff --git a/contrib/egg/egg-shortcuts-window.c b/contrib/egg/egg-shortcuts-window.c
index 144ace0..0616acc 100644
--- a/contrib/egg/egg-shortcuts-window.c
+++ b/contrib/egg/egg-shortcuts-window.c
@@ -34,7 +34,20 @@ typedef struct
   GtkSearchEntry  *search_entry;
 } EggShortcutsWindowPrivate;
 
-G_DEFINE_TYPE_WITH_PRIVATE (EggShortcutsWindow, egg_shortcuts_window, GTK_TYPE_WINDOW)
+typedef struct
+{
+  EggShortcutsWindow *self;
+  GtkBuilder         *builder;
+  gchar              *group;
+  gchar              *accelerator;
+  gchar              *text;
+} GroupsParserData;
+
+static void buildable_iface_init (GtkBuildableIface *iface);
+
+G_DEFINE_TYPE_EXTENDED (EggShortcutsWindow, egg_shortcuts_window, GTK_TYPE_WINDOW, 0,
+                        G_ADD_PRIVATE (EggShortcutsWindow)
+                        G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, buildable_iface_init))
 
 enum {
   PROP_0,
@@ -95,6 +108,225 @@ egg_shortcuts_window_set_search_text (EggShortcutsWindow *self,
   gtk_entry_set_text (GTK_ENTRY (priv->search_entry), search_text ?: "");
 }
 
+static gboolean
+check_parent (GMarkupParseContext  *context,
+              const gchar          *element_name,
+              GError              **error)
+{
+  const GSList *stack;
+  const gchar *parent_name;
+  const gchar *our_name;
+
+  stack = g_markup_parse_context_get_element_stack (context);
+  our_name = stack->data;
+  parent_name = stack->next ? stack->next->data : "";
+
+  if (g_strcmp0 (parent_name, element_name) != 0)
+    {
+      gint line;
+      gint col;
+
+      g_markup_parse_context_get_position (context, &line, &col);
+      g_set_error (error,
+                   GTK_BUILDER_ERROR,
+                   GTK_BUILDER_ERROR_INVALID_TAG,
+                   "%d:%d: Element <%s> found in <%s>, expected <%s>.",
+                   line, col, our_name, parent_name, element_name);
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+static void
+groups_parser_start_element (GMarkupParseContext  *context,
+                             const gchar          *element_name,
+                             const gchar         **attribute_names,
+                             const gchar         **attribute_values,
+                             gpointer              user_data,
+                             GError              **error)
+{
+  GroupsParserData *parser_data = user_data;
+
+  g_assert (context != NULL);
+  g_assert (element_name != NULL);
+  g_assert (parser_data != NULL);
+
+  if (g_strcmp0 (element_name, "groups") == 0)
+    {
+    }
+  else if (g_strcmp0 (element_name, "group") == 0)
+    {
+      const gchar *translatable = NULL;
+      const gchar *group = NULL;
+
+      if (!check_parent (context, "groups", error))
+        return;
+
+      g_clear_pointer (&parser_data->accelerator, g_free);
+      g_clear_pointer (&parser_data->text, g_free);
+      g_clear_pointer (&parser_data->group, g_free);
+
+      if (!g_markup_collect_attributes (element_name, attribute_names, attribute_values, error,
+                                        G_MARKUP_COLLECT_STRING, "name", &group,
+                                        G_MARKUP_COLLECT_STRING, "translatable", &translatable,
+                                        G_MARKUP_COLLECT_INVALID))
+        return;
+
+      parser_data->group = g_strdup (group);
+    }
+  else if (g_strcmp0 (element_name, "item") == 0)
+    {
+      const gchar *translatable = NULL;
+      const gchar *accelerator = NULL;
+
+      if (!check_parent (context, "group", error))
+        return;
+
+      g_clear_pointer (&parser_data->accelerator, g_free);
+
+      if (!g_markup_collect_attributes (element_name, attribute_names, attribute_values, error,
+                                        G_MARKUP_COLLECT_STRING, "accelerator", &accelerator,
+                                        G_MARKUP_COLLECT_STRING, "translatable", &translatable,
+                                        G_MARKUP_COLLECT_INVALID))
+        return;
+
+      parser_data->accelerator = g_strdup (accelerator);
+    }
+  else
+    {
+      const GSList *stack;
+      const gchar *parent_name;
+      const gchar *our_name;
+      gint line;
+      gint col;
+
+      stack = g_markup_parse_context_get_element_stack (context);
+      our_name = stack->data;
+      parent_name = stack->next ? stack->next->data : "";
+
+      g_markup_parse_context_get_position (context, &line, &col);
+      g_set_error (error,
+                   GTK_BUILDER_ERROR,
+                   GTK_BUILDER_ERROR_INVALID_TAG,
+                   "%d:%d: Unknown element <%s> found in <%s>.",
+                   line, col, our_name, parent_name);
+    }
+}
+
+static void
+groups_parser_end_element (GMarkupParseContext  *context,
+                           const gchar          *element_name,
+                           gpointer              user_data,
+                           GError              **error)
+{
+  GroupsParserData *parser_data = user_data;
+
+  g_assert (context != NULL);
+  g_assert (element_name != NULL);
+  g_assert (parser_data != NULL);
+
+  if (g_strcmp0 (element_name, "groups") == 0)
+    {
+      g_clear_pointer (&parser_data->group, g_free);
+      g_clear_pointer (&parser_data->accelerator, g_free);
+      g_clear_pointer (&parser_data->text, g_free);
+    }
+  else if (g_strcmp0 (element_name, "group") == 0)
+    {
+      g_clear_pointer (&parser_data->group, g_free);
+    }
+  else if (g_strcmp0 (element_name, "item") == 0)
+    {
+      egg_shortcuts_window_add_shortcut (parser_data->self,
+                                         parser_data->group,
+                                         parser_data->accelerator,
+                                         parser_data->text,
+                                         NULL); /* TODO */
+      g_clear_pointer (&parser_data->accelerator, g_free);
+    }
+}
+
+static void
+groups_parser_text (GMarkupParseContext  *context,
+                    const gchar          *text,
+                    gsize                 text_len,
+                    gpointer              user_data,
+                    GError              **error)
+{
+  GroupsParserData *parser_data = user_data;
+
+  g_assert (parser_data != NULL);
+
+  g_free (parser_data->text);
+  parser_data->text = g_strdup (text);
+}
+
+static GMarkupParser GroupsParser = {
+  groups_parser_start_element,
+  groups_parser_end_element,
+  groups_parser_text,
+};
+
+static gboolean
+egg_shortcuts_window_custom_tag_start (GtkBuildable  *buildable,
+                                       GtkBuilder    *builder,
+                                       GObject       *child,
+                                       const gchar   *tagname,
+                                       GMarkupParser *parser,
+                                       gpointer      *data)
+{
+  EggShortcutsWindow *self = (EggShortcutsWindow *)buildable;
+
+  g_assert (EGG_IS_SHORTCUTS_WINDOW (self));
+  g_assert (GTK_IS_BUILDER (builder));
+  g_assert (tagname != NULL);
+  g_assert (parser != NULL);
+  g_assert (data != NULL);
+
+  if (g_strcmp0 (tagname, "groups") == 0)
+    {
+      GroupsParserData *parser_data;
+
+      parser_data = g_slice_new0 (GroupsParserData);
+      parser_data->self = g_object_ref (buildable);
+      parser_data->builder = g_object_ref (builder);
+
+      *parser = GroupsParser;
+      *data = parser_data;
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+egg_shortcuts_window_custom_finished (GtkBuildable *buildable,
+                                      GtkBuilder   *builder,
+                                      GObject      *child,
+                                      const gchar  *tagname,
+                                      gpointer      user_data)
+{
+  EggShortcutsWindow *self = (EggShortcutsWindow *)buildable;
+
+  g_assert (EGG_IS_SHORTCUTS_WINDOW (self));
+  g_assert (GTK_IS_BUILDER (builder));
+  g_assert (tagname != NULL);
+
+  if (g_strcmp0 (tagname, "groups") == 0)
+    {
+      GroupsParserData *parser_data = user_data;
+
+      g_clear_pointer (&parser_data->text, g_free);
+      g_clear_pointer (&parser_data->accelerator, g_free);
+      g_clear_pointer (&parser_data->group, g_free);
+      g_clear_object (&parser_data->self);
+      g_clear_object (&parser_data->builder);
+      g_slice_free (GroupsParserData, parser_data);
+    }
+}
+
 static void
 egg_shortcuts_window_finalize (GObject *object)
 {
@@ -145,6 +377,13 @@ egg_shortcuts_window_set_property (GObject      *object,
 }
 
 static void
+buildable_iface_init (GtkBuildableIface *iface)
+{
+  iface->custom_tag_start = egg_shortcuts_window_custom_tag_start;
+  iface->custom_finished = egg_shortcuts_window_custom_finished;
+}
+
+static void
 egg_shortcuts_window_class_init (EggShortcutsWindowClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -168,6 +407,7 @@ egg_shortcuts_window_init (EggShortcutsWindow *self)
 {
   EggShortcutsWindowPrivate *priv = egg_shortcuts_window_get_instance_private (self);
   GtkScrolledWindow *scroller;
+  GtkWidget *search_entry;
   GtkBox *box;
 
   priv->groups = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
@@ -202,6 +442,9 @@ egg_shortcuts_window_init (EggShortcutsWindow *self)
   priv->search_bar = g_object_new (EGG_TYPE_SEARCH_BAR,
                                    "visible", TRUE,
                                    NULL);
+  g_object_bind_property (priv->search_button, "active",
+                          priv->search_bar, "search-mode-enabled",
+                          G_BINDING_SYNC_CREATE);
   gtk_container_add (GTK_CONTAINER (box), GTK_WIDGET (priv->search_bar));
 
   scroller = g_object_new (GTK_TYPE_SCROLLED_WINDOW,
@@ -214,4 +457,10 @@ egg_shortcuts_window_init (EggShortcutsWindow *self)
                                  "visible", TRUE,
                                  NULL);
   gtk_container_add (GTK_CONTAINER (scroller), GTK_WIDGET (priv->fill_box));
+
+  search_entry = egg_search_bar_get_entry (priv->search_bar);
+  g_object_set (search_entry,
+                "placeholder-text", _("Search keyboard shortcuts"),
+                "width-chars", 30,
+                NULL);
 }
diff --git a/data/theme/Adwaita-shared.css b/data/theme/Adwaita-shared.css
index 4f03d50..65f89de 100644
--- a/data/theme/Adwaita-shared.css
+++ b/data/theme/Adwaita-shared.css
@@ -83,3 +83,9 @@ SymbolTree GtkSearchEntry {
   border-top: none;
   border-radius: 0px;
 }
+
+
+EggShortcutsGroup > GtkLabel {
+  color: #4a90d9;
+  font-weight: bold;
+}
diff --git a/data/ui/gb-shortcuts-window.ui b/data/ui/gb-shortcuts-window.ui
new file mode 100644
index 0000000..59c1c8b
--- /dev/null
+++ b/data/ui/gb-shortcuts-window.ui
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.16 -->
+  <template class="GbShortcutsWindow" parent="EggShortcutsWindow">
+    <property name="title" translatable="yes">Keyboard Shortcuts</property>
+    <groups>
+      <group translatable="yes" name="Workspace Panels">
+        <item accelerator="F9" translatable="yes">Toggle visibility of the left panel</item>
+        <item accelerator="&lt;shift&gt;F9" translatable="yes">Toggle visibility of the right panel</item>
+        <item accelerator="&lt;ctrl&gt;F9" translatable="yes">Toggle visibility of the bottom panel</item>
+      </group>
+    </groups>
+  </template>
+</interface>
diff --git a/src/Makefile.am b/src/Makefile.am
index ce9dcd6..e01c8b0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -60,6 +60,8 @@ libgnome_builder_la_SOURCES = \
        html/gb-html-view.h \
        keybindings/gb-keybindings.c \
        keybindings/gb-keybindings.h \
+       keybindings/gb-shortcuts-window.c \
+       keybindings/gb-shortcuts-window.h \
        preferences/gb-preferences-page-editor.c \
        preferences/gb-preferences-page-editor.h \
        preferences/gb-preferences-page-insight.c \
diff --git a/src/app/gb-application-actions.c b/src/app/gb-application-actions.c
index 43aa8c8..3799b32 100644
--- a/src/app/gb-application-actions.c
+++ b/src/app/gb-application-actions.c
@@ -29,6 +29,7 @@
 #include "gb-application-private.h"
 #include "gb-greeter-window.h"
 #include "gb-new-project-dialog.h"
+#include "gb-shortcuts-window.h"
 #include "gb-support.h"
 #include "gb-workbench.h"
 
@@ -280,12 +281,32 @@ cleanup:
   g_list_free (windows);
 }
 
+static void
+gb_application_actions_shortcuts (GSimpleAction *action,
+                                  GVariant      *variant,
+                                  gpointer       user_data)
+{
+  GbApplication *self = user_data;
+  GbShortcutsWindow *window;
+
+  g_assert (GB_IS_APPLICATION (self));
+
+  window = g_object_new (GB_TYPE_SHORTCUTS_WINDOW,
+                         "default-width", 800,
+                         "default-height", 600,
+                         "window-position", GTK_WIN_POS_CENTER,
+                         NULL);
+
+  gtk_window_present (GTK_WINDOW (window));
+}
+
 static const GActionEntry GbApplicationActions[] = {
   { "about",        gb_application_actions_about },
   { "open-project", gb_application_actions_open_project },
   { "new-project",  gb_application_actions_new_project },
   { "preferences",  gb_application_actions_preferences },
   { "quit",         gb_application_actions_quit },
+  { "shortcuts",    gb_application_actions_shortcuts },
   { "support",      gb_application_actions_support },
 };
 
diff --git a/src/app/gb-application.c b/src/app/gb-application.c
index 9441267..21b1f36 100644
--- a/src/app/gb-application.c
+++ b/src/app/gb-application.c
@@ -149,6 +149,7 @@ gb_application_load_keybindings (GbApplication *self)
     { "workbench.show-gear-menu", "F10" },
     { "workbench.global-search", "<ctrl>period" },
     { "app.preferences", "<ctrl>comma" },
+    { "app.shortcuts", "<shift>F1" },
     { NULL }
   };
   gsize i;
diff --git a/src/keybindings/gb-shortcuts-window.c b/src/keybindings/gb-shortcuts-window.c
new file mode 100644
index 0000000..e49ccc0
--- /dev/null
+++ b/src/keybindings/gb-shortcuts-window.c
@@ -0,0 +1,42 @@
+/* gb-shortcuts-window.c
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib/gi18n.h>
+
+#include "gb-shortcuts-window.h"
+
+struct _GbShortcutsWindow
+{
+  EggShortcutsWindow parent_instance;
+};
+
+G_DEFINE_TYPE (GbShortcutsWindow, gb_shortcuts_window, EGG_TYPE_SHORTCUTS_WINDOW)
+
+static void
+gb_shortcuts_window_class_init (GbShortcutsWindowClass *klass)
+{
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/builder/ui/gb-shortcuts-window.ui");
+}
+
+static void
+gb_shortcuts_window_init (GbShortcutsWindow *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+}
diff --git a/src/keybindings/gb-shortcuts-window.h b/src/keybindings/gb-shortcuts-window.h
new file mode 100644
index 0000000..12a16f4
--- /dev/null
+++ b/src/keybindings/gb-shortcuts-window.h
@@ -0,0 +1,32 @@
+/* gb-shortcuts-window.h
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GB_SHORTCUTS_WINDOW_H
+#define GB_SHORTCUTS_WINDOW_H
+
+#include "egg-shortcuts-window.h"
+
+G_BEGIN_DECLS
+
+#define GB_TYPE_SHORTCUTS_WINDOW (gb_shortcuts_window_get_type())
+
+G_DECLARE_FINAL_TYPE (GbShortcutsWindow, gb_shortcuts_window, GB, SHORTCUTS_WINDOW, EggShortcutsWindow)
+
+G_END_DECLS
+
+#endif /* GB_SHORTCUTS_WINDOW_H */
diff --git a/src/resources/gnome-builder.gresource.xml b/src/resources/gnome-builder.gresource.xml
index c2805df..a541522 100644
--- a/src/resources/gnome-builder.gresource.xml
+++ b/src/resources/gnome-builder.gresource.xml
@@ -41,9 +41,10 @@
     <file alias="ui/gb-search-box.ui">../../data/ui/gb-search-box.ui</file>
     <file alias="ui/gb-search-display-group.ui">../../data/ui/gb-search-display-group.ui</file>
     <file alias="ui/gb-search-display-row.ui">../../data/ui/gb-search-display-row.ui</file>
+    <file alias="ui/gb-shortcuts-window.ui">../../data/ui/gb-shortcuts-window.ui</file>
     <file alias="ui/gb-view-stack.ui">../../data/ui/gb-view-stack.ui</file>
     <file alias="ui/gb-workbench.ui">../../data/ui/gb-workbench.ui</file>
-    <file alias="ui/gb-workspace.ui">../../data/ui/gb-workspace.ui</file>
     <file alias="ui/gb-workspace-pane.ui">../../data/ui/gb-workspace-pane.ui</file>
+    <file alias="ui/gb-workspace.ui">../../data/ui/gb-workspace.ui</file>
   </gresource>
 </gresources>


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