[gtk/wip/ebassi/shortcut: 83/85] accels: Remove GtkAccelGroup



commit c618f3fe2c4cca08d1962405bbc298ae3544dc91
Author: Benjamin Otte <otte redhat com>
Date:   Fri Aug 24 08:46:54 2018 +0200

    accels: Remove GtkAccelGroup

 demos/gtk-demo/main.c                |   1 -
 docs/reference/gtk/gtk4-sections.txt |  34 +-
 gtk/gtkaccelgroup.c                  | 647 -----------------------------------
 gtk/gtkaccelgroup.h                  | 158 ---------
 gtk/gtkaccelgroupprivate.h           |   9 -
 gtk/gtkaccellabel.c                  | 149 +-------
 gtk/gtkmain.c                        |   9 +-
 gtk/gtkwindow.c                      | 326 +++++-------------
 gtk/gtkwindow.h                      |   9 +-
 gtk/gtkwindowprivate.h               |   3 -
 10 files changed, 98 insertions(+), 1247 deletions(-)
---
diff --git a/demos/gtk-demo/main.c b/demos/gtk-demo/main.c
index 38288dc2b5..36a346fc01 100644
--- a/demos/gtk-demo/main.c
+++ b/demos/gtk-demo/main.c
@@ -310,7 +310,6 @@ static gchar *types[] =
   "GtkIconView ",
   "GtkCellRendererText ",
   "GtkContainer ",
-  "GtkAccelGroup ",
   "GtkPaned ",
   "GtkPrintOperation ",
   "GtkPrintContext ",
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index b3639af6f9..bc29c5df2f 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -53,21 +53,6 @@ gtk_about_dialog_get_type
 <SECTION>
 <FILE>gtkaccelgroup</FILE>
 <TITLE>Keyboard Accelerators</TITLE>
-GtkAccelGroup
-GtkAccelGroupClass
-gtk_accel_group_new
-GtkAccelFlags
-gtk_accel_group_connect
-GtkAccelGroupActivate
-GtkAccelGroupFindFunc
-gtk_accel_group_disconnect
-gtk_accel_group_disconnect_key
-gtk_accel_group_activate
-gtk_accel_group_from_accel_closure
-gtk_accel_groups_activate
-gtk_accel_groups_from_object
-gtk_accel_group_find
-GtkAccelKey
 gtk_accelerator_valid
 gtk_accelerator_parse
 gtk_accelerator_name
@@ -77,21 +62,6 @@ gtk_accelerator_name_with_keycode
 gtk_accelerator_get_label_with_keycode
 gtk_accelerator_set_default_mod_mask
 gtk_accelerator_get_default_mod_mask
-
-<SUBSECTION Standard>
-GTK_TYPE_ACCEL_GROUP
-GTK_ACCEL_GROUP
-GTK_IS_ACCEL_GROUP
-GTK_ACCEL_GROUP_CLASS
-GTK_IS_ACCEL_GROUP_CLASS
-GTK_ACCEL_GROUP_GET_CLASS
-
-<SUBSECTION Private>
-GTK_ACCEL_GROUP_GET_PRIVATE
-GtkAccelGroupPrivate
-GtkAccelGroupEntry
-gtk_accel_group_query
-gtk_accel_group_get_type
 </SECTION>
 
 <SECTION>
@@ -4435,8 +4405,8 @@ gtk_window_new
 gtk_window_set_title
 gtk_window_set_resizable
 gtk_window_get_resizable
-gtk_window_add_accel_group
-gtk_window_remove_accel_group
+gtk_window_activate_focus
+gtk_window_activate_default
 gtk_window_set_modal
 gtk_window_set_default_size
 gtk_window_set_hide_on_close
diff --git a/gtk/gtkaccelgroup.c b/gtk/gtkaccelgroup.c
index 960fb326ae..5d561763cb 100644
--- a/gtk/gtkaccelgroup.c
+++ b/gtk/gtkaccelgroup.c
@@ -55,658 +55,11 @@
  * and mnemonics, of course.
  */
 
-/* --- prototypes --- */
-static void gtk_accel_group_finalize     (GObject    *object);
-static void accel_closure_invalidate     (gpointer    data,
-                                          GClosure   *closure);
-
-
 /* --- variables --- */
-static guint  signal_accel_activate      = 0;
-static guint  signal_accel_changed       = 0;
-static guint  quark_acceleratable_groups = 0;
 static guint  default_accel_mod_mask     = 0;
 
-G_DEFINE_TYPE_WITH_PRIVATE (GtkAccelGroup, gtk_accel_group, G_TYPE_OBJECT)
-
 
 /* --- functions --- */
-static void
-gtk_accel_group_class_init (GtkAccelGroupClass *class)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (class);
-
-  quark_acceleratable_groups = g_quark_from_static_string ("gtk-acceleratable-accel-groups");
-
-  object_class->finalize = gtk_accel_group_finalize;
-
-  class->accel_changed = NULL;
-
-  /**
-   * GtkAccelGroup::accel-activate:
-   * @accel_group: the #GtkAccelGroup which received the signal
-   * @acceleratable: the object on which the accelerator was activated
-   * @keyval: the accelerator keyval
-   * @modifier: the modifier combination of the accelerator
-   *
-   * The accel-activate signal is an implementation detail of
-   * #GtkAccelGroup and not meant to be used by applications.
-   *
-   * Returns: %TRUE if the accelerator was activated
-   */
-  signal_accel_activate =
-    g_signal_new (I_("accel-activate"),
-                  G_OBJECT_CLASS_TYPE (class),
-                  G_SIGNAL_DETAILED,
-                  0,
-                  _gtk_boolean_handled_accumulator, NULL,
-                  _gtk_marshal_BOOLEAN__OBJECT_UINT_FLAGS,
-                  G_TYPE_BOOLEAN, 3,
-                  G_TYPE_OBJECT,
-                  G_TYPE_UINT,
-                  GDK_TYPE_MODIFIER_TYPE);
-  /**
-   * GtkAccelGroup::accel-changed:
-   * @accel_group: the #GtkAccelGroup which received the signal
-   * @keyval: the accelerator keyval
-   * @modifier: the modifier combination of the accelerator
-   * @accel_closure: the #GClosure of the accelerator
-   *
-   * The accel-changed signal is emitted when an entry
-   * is added to or removed from the accel group.
-   *
-   * Widgets like #GtkAccelLabel which display an associated
-   * accelerator should connect to this signal, and rebuild
-   * their visual representation if the @accel_closure is theirs.
-   */
-  signal_accel_changed =
-    g_signal_new (I_("accel-changed"),
-                  G_OBJECT_CLASS_TYPE (class),
-                  G_SIGNAL_RUN_FIRST | G_SIGNAL_DETAILED,
-                  G_STRUCT_OFFSET (GtkAccelGroupClass, accel_changed),
-                  NULL, NULL,
-                  _gtk_marshal_VOID__UINT_FLAGS_BOXED,
-                  G_TYPE_NONE, 3,
-                  G_TYPE_UINT,
-                  GDK_TYPE_MODIFIER_TYPE,
-                  G_TYPE_CLOSURE);
-}
-
-static void
-gtk_accel_group_finalize (GObject *object)
-{
-  GtkAccelGroup *accel_group = GTK_ACCEL_GROUP (object);
-  guint i;
-
-  for (i = 0; i < accel_group->priv->n_accels; i++)
-    {
-      GtkAccelGroupEntry *entry = &accel_group->priv->priv_accels[i];
-
-      g_closure_remove_invalidate_notifier (entry->closure, accel_group, accel_closure_invalidate);
-
-      /* remove quick_accel_add() refcount */
-      g_closure_unref (entry->closure);
-    }
-
-  g_free (accel_group->priv->priv_accels);
-
-  G_OBJECT_CLASS (gtk_accel_group_parent_class)->finalize (object);
-}
-
-static void
-gtk_accel_group_init (GtkAccelGroup *accel_group)
-{
-  GtkAccelGroupPrivate *priv;
-
-  accel_group->priv = gtk_accel_group_get_instance_private (accel_group);
-  priv = accel_group->priv;
-
-  priv->acceleratables = NULL;
-  priv->n_accels = 0;
-  priv->priv_accels = NULL;
-}
-
-/**
- * gtk_accel_group_new:
- *
- * Creates a new #GtkAccelGroup.
- *
- * Returns: a new #GtkAccelGroup object
- */
-GtkAccelGroup*
-gtk_accel_group_new (void)
-{
-  return g_object_new (GTK_TYPE_ACCEL_GROUP, NULL);
-}
-
-static void
-accel_group_weak_ref_detach (GSList  *free_list,
-                             GObject *stale_object)
-{
-  GSList *slist;
-
-  for (slist = free_list; slist; slist = slist->next)
-    {
-      GtkAccelGroup *accel_group;
-
-      accel_group = slist->data;
-      accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, stale_object);
-      g_object_unref (accel_group);
-    }
-  g_slist_free (free_list);
-  g_object_set_qdata (stale_object, quark_acceleratable_groups, NULL);
-}
-
-void
-_gtk_accel_group_attach (GtkAccelGroup *accel_group,
-                         GObject       *object)
-{
-  GSList *slist;
-
-  g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
-  g_return_if_fail (G_IS_OBJECT (object));
-  g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) == NULL);
-
-  g_object_ref (accel_group);
-  accel_group->priv->acceleratables = g_slist_prepend (accel_group->priv->acceleratables, object);
-  slist = g_object_get_qdata (object, quark_acceleratable_groups);
-  if (slist)
-    g_object_weak_unref (object,
-                         (GWeakNotify) accel_group_weak_ref_detach,
-                         slist);
-  slist = g_slist_prepend (slist, accel_group);
-  g_object_set_qdata (object, quark_acceleratable_groups, slist);
-  g_object_weak_ref (object,
-                     (GWeakNotify) accel_group_weak_ref_detach,
-                     slist);
-}
-
-void
-_gtk_accel_group_detach (GtkAccelGroup *accel_group,
-                         GObject       *object)
-{
-  GSList *slist;
-
-  g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
-  g_return_if_fail (G_IS_OBJECT (object));
-  g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) != NULL);
-
-  accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, object);
-  slist = g_object_get_qdata (object, quark_acceleratable_groups);
-  g_object_weak_unref (object,
-                       (GWeakNotify) accel_group_weak_ref_detach,
-                       slist);
-  slist = g_slist_remove (slist, accel_group);
-  g_object_set_qdata (object, quark_acceleratable_groups, slist);
-  if (slist)
-    g_object_weak_ref (object,
-                       (GWeakNotify) accel_group_weak_ref_detach,
-                       slist);
-  g_object_unref (accel_group);
-}
-
-/**
- * gtk_accel_groups_from_object:
- * @object: a #GObject, usually a #GtkWindow
- *
- * Gets a list of all accel groups which are attached to @object.
- *
- * Returns: (element-type GtkAccelGroup) (transfer none): a list of
- *     all accel groups which are attached to @object
- */
-GSList*
-gtk_accel_groups_from_object (GObject *object)
-{
-  g_return_val_if_fail (G_IS_OBJECT (object), NULL);
-
-  return g_object_get_qdata (object, quark_acceleratable_groups);
-}
-
-/**
- * gtk_accel_group_find:
- * @accel_group: a #GtkAccelGroup
- * @find_func: (scope call): a function to filter the entries
- *    of @accel_group with
- * @data: data to pass to @find_func
- *
- * Finds the first entry in an accelerator group for which
- * @find_func returns %TRUE and returns its #GtkAccelKey.
- *
- * Returns: (transfer none): the key of the first entry passing
- *    @find_func. The key is owned by GTK+ and must not be freed.
- */
-GtkAccelKey*
-gtk_accel_group_find (GtkAccelGroup         *accel_group,
-                      GtkAccelGroupFindFunc  find_func,
-                      gpointer               data)
-{
-  GtkAccelKey *key = NULL;
-  guint i;
-
-  g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), NULL);
-  g_return_val_if_fail (find_func != NULL, NULL);
-
-  g_object_ref (accel_group);
-  for (i = 0; i < accel_group->priv->n_accels; i++)
-    if (find_func (&accel_group->priv->priv_accels[i].key,
-                   accel_group->priv->priv_accels[i].closure,
-                   data))
-      {
-        key = &accel_group->priv->priv_accels[i].key;
-        break;
-      }
-  g_object_unref (accel_group);
-
-  return key;
-}
-
-static void
-accel_closure_invalidate (gpointer  data,
-                          GClosure *closure)
-{
-  GtkAccelGroup *accel_group = GTK_ACCEL_GROUP (data);
-
-  gtk_accel_group_disconnect (accel_group, closure);
-}
-
-static int
-bsearch_compare_accels (const void *d1,
-                        const void *d2)
-{
-  const GtkAccelGroupEntry *entry1 = d1;
-  const GtkAccelGroupEntry *entry2 = d2;
-
-  if (entry1->key.accel_key == entry2->key.accel_key)
-    return entry1->key.accel_mods < entry2->key.accel_mods ? -1 : entry1->key.accel_mods > 
entry2->key.accel_mods;
-  else
-    return entry1->key.accel_key < entry2->key.accel_key ? -1 : 1;
-}
-
-static void
-quick_accel_add (GtkAccelGroup   *accel_group,
-                 guint            accel_key,
-                 GdkModifierType  accel_mods,
-                 GtkAccelFlags    accel_flags,
-                 GClosure        *closure)
-{
-  guint pos, i = accel_group->priv->n_accels++;
-  GtkAccelGroupEntry key;
-
-  /* find position */
-  key.key.accel_key = accel_key;
-  key.key.accel_mods = accel_mods;
-  for (pos = 0; pos < i; pos++)
-    if (bsearch_compare_accels (&key, accel_group->priv->priv_accels + pos) < 0)
-      break;
-
-  /* insert at position, ref closure */
-  accel_group->priv->priv_accels = g_renew (GtkAccelGroupEntry, accel_group->priv->priv_accels, 
accel_group->priv->n_accels);
-  memmove (accel_group->priv->priv_accels + pos + 1, accel_group->priv->priv_accels + pos,
-           (i - pos) * sizeof (accel_group->priv->priv_accels[0]));
-  accel_group->priv->priv_accels[pos].key.accel_key = accel_key;
-  accel_group->priv->priv_accels[pos].key.accel_mods = accel_mods;
-  accel_group->priv->priv_accels[pos].key.accel_flags = accel_flags;
-  accel_group->priv->priv_accels[pos].closure = g_closure_ref (closure);
-  g_closure_sink (closure);
-
-  /* handle closure invalidation and reverse lookups */
-  g_closure_add_invalidate_notifier (closure, accel_group, accel_closure_invalidate);
-
-  /* connect and notify changed */
-  if (accel_key)
-    {
-      gchar *accel_name = gtk_accelerator_name (accel_key, accel_mods);
-      GQuark accel_quark = g_quark_from_string (accel_name);
-
-      g_free (accel_name);
-
-      /* setup handler */
-      g_signal_connect_closure_by_id (accel_group, signal_accel_activate, accel_quark, closure, FALSE);
-
-      /* and notify */
-      g_signal_emit (accel_group, signal_accel_changed, accel_quark, accel_key, accel_mods, closure);
-    }
-}
-
-static void
-quick_accel_remove (GtkAccelGroup *accel_group,
-                    guint          pos)
-{
-  GQuark accel_quark = 0;
-  GtkAccelGroupEntry *entry = accel_group->priv->priv_accels + pos;
-  guint accel_key = entry->key.accel_key;
-  GdkModifierType accel_mods = entry->key.accel_mods;
-  GClosure *closure = entry->closure;
-
-  /* quark for notification */
-  if (accel_key)
-    {
-      gchar *accel_name = gtk_accelerator_name (accel_key, accel_mods);
-
-      accel_quark = g_quark_from_string (accel_name);
-      g_free (accel_name);
-    }
-
-  /* clean up closure invalidate notification and disconnect */
-  g_closure_remove_invalidate_notifier (entry->closure, accel_group, accel_closure_invalidate);
-  if (accel_quark)
-    g_signal_handlers_disconnect_matched (accel_group,
-                                          G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_CLOSURE,
-                                          signal_accel_activate, accel_quark,
-                                          closure, NULL, NULL);
-
-  /* physically remove */
-  accel_group->priv->n_accels -= 1;
-  memmove (entry, entry + 1,
-           (accel_group->priv->n_accels - pos) * sizeof (accel_group->priv->priv_accels[0]));
-
-  /* and notify */
-  if (accel_quark)
-    g_signal_emit (accel_group, signal_accel_changed, accel_quark, accel_key, accel_mods, closure);
-
-  /* remove quick_accel_add() refcount */
-  g_closure_unref (closure);
-}
-
-static GtkAccelGroupEntry*
-quick_accel_find (GtkAccelGroup   *accel_group,
-                  guint            accel_key,
-                  GdkModifierType  accel_mods,
-                  guint           *count_p)
-{
-  GtkAccelGroupEntry *entry;
-  GtkAccelGroupEntry key;
-
-  *count_p = 0;
-
-  if (!accel_group->priv->n_accels)
-    return NULL;
-
-  key.key.accel_key = accel_key;
-  key.key.accel_mods = accel_mods;
-  entry = bsearch (&key, accel_group->priv->priv_accels, accel_group->priv->n_accels,
-                   sizeof (accel_group->priv->priv_accels[0]), bsearch_compare_accels);
-
-  if (!entry)
-    return NULL;
-
-  /* step back to the first member */
-  for (; entry > accel_group->priv->priv_accels; entry--)
-    if (entry[-1].key.accel_key != accel_key ||
-        entry[-1].key.accel_mods != accel_mods)
-      break;
-  /* count equal members */
-  for (; entry + *count_p < accel_group->priv->priv_accels + accel_group->priv->n_accels; (*count_p)++)
-    if (entry[*count_p].key.accel_key != accel_key ||
-        entry[*count_p].key.accel_mods != accel_mods)
-      break;
-  return entry;
-}
-
-/**
- * gtk_accel_group_connect:
- * @accel_group: the accelerator group to install an accelerator in
- * @accel_key: key value of the accelerator
- * @accel_mods: modifier combination of the accelerator
- * @accel_flags: a flag mask to configure this accelerator
- * @closure: closure to be executed upon accelerator activation
- *
- * Installs an accelerator in this group. When @accel_group is being
- * activated in response to a call to gtk_accel_groups_activate(),
- * @closure will be invoked if the @accel_key and @accel_mods from
- * gtk_accel_groups_activate() match those of this connection.
- *
- * The signature used for the @closure is that of #GtkAccelGroupActivate.
- *
- * Note that, due to implementation details, a single closure can
- * only be connected to one accelerator group.
- */
-void
-gtk_accel_group_connect (GtkAccelGroup   *accel_group,
-                         guint            accel_key,
-                         GdkModifierType  accel_mods,
-                         GtkAccelFlags    accel_flags,
-                         GClosure        *closure)
-{
-  g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
-  g_return_if_fail (closure != NULL);
-  g_return_if_fail (accel_key > 0);
-  g_return_if_fail (gtk_accel_group_from_accel_closure (closure) == NULL);
-
-  g_object_ref (accel_group);
-  if (!closure->is_invalid)
-    quick_accel_add (accel_group,
-                     gdk_keyval_to_lower (accel_key),
-                     accel_mods, accel_flags, closure);
-  g_object_unref (accel_group);
-}
-
-/**
- * gtk_accel_group_disconnect:
- * @accel_group: the accelerator group to remove an accelerator from
- * @closure: (allow-none): the closure to remove from this accelerator
- *     group, or %NULL to remove all closures
- *
- * Removes an accelerator previously installed through
- * gtk_accel_group_connect().
- *
- * Returns: %TRUE if the closure was found and got disconnected
- */
-gboolean
-gtk_accel_group_disconnect (GtkAccelGroup *accel_group,
-                            GClosure      *closure)
-{
-  guint i;
-
-  g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
-
-  for (i = 0; i < accel_group->priv->n_accels; i++)
-    if (accel_group->priv->priv_accels[i].closure == closure)
-      {
-        g_object_ref (accel_group);
-        quick_accel_remove (accel_group, i);
-        g_object_unref (accel_group);
-        return TRUE;
-      }
-  return FALSE;
-}
-
-/**
- * gtk_accel_group_disconnect_key:
- * @accel_group: the accelerator group to install an accelerator in
- * @accel_key: key value of the accelerator
- * @accel_mods: modifier combination of the accelerator
- *
- * Removes an accelerator previously installed through
- * gtk_accel_group_connect().
- *
- * Returns: %TRUE if there was an accelerator which could be
- *     removed, %FALSE otherwise
- */
-gboolean
-gtk_accel_group_disconnect_key (GtkAccelGroup   *accel_group,
-                                guint            accel_key,
-                                GdkModifierType  accel_mods)
-{
-  GtkAccelGroupEntry *entries;
-  GSList *slist, *clist = NULL;
-  gboolean removed_one = FALSE;
-  guint n;
-
-  g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
-
-  g_object_ref (accel_group);
-
-  accel_key = gdk_keyval_to_lower (accel_key);
-  entries = quick_accel_find (accel_group, accel_key, accel_mods, &n);
-  while (n--)
-    {
-      GClosure *closure = g_closure_ref (entries[n].closure);
-
-      clist = g_slist_prepend (clist, closure);
-    }
-
-  for (slist = clist; slist; slist = slist->next)
-    {
-      GClosure *closure = slist->data;
-
-      removed_one |= gtk_accel_group_disconnect (accel_group, closure);
-      g_closure_unref (closure);
-    }
-  g_slist_free (clist);
-
-  g_object_unref (accel_group);
-
-  return removed_one;
-}
-
-GSList*
-_gtk_accel_group_get_accelerables (GtkAccelGroup *accel_group)
-{
-    g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), NULL);
-
-    return accel_group->priv->acceleratables;
-}
-
-/**
- * gtk_accel_group_query:
- * @accel_group: the accelerator group to query
- * @accel_key: key value of the accelerator
- * @accel_mods: modifier combination of the accelerator
- * @n_entries: (out) (optional): location to return the number
- *     of entries found, or %NULL
- *
- * Queries an accelerator group for all entries matching @accel_key
- * and @accel_mods.
- *
- * Returns: (nullable) (transfer none) (array length=n_entries): an array of
- *     @n_entries #GtkAccelGroupEntry elements, or %NULL. The array
- *     is owned by GTK+ and must not be freed.
- */
-GtkAccelGroupEntry*
-gtk_accel_group_query (GtkAccelGroup   *accel_group,
-                       guint            accel_key,
-                       GdkModifierType  accel_mods,
-                       guint           *n_entries)
-{
-  GtkAccelGroupEntry *entries;
-  guint n;
-
-  g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), NULL);
-
-  entries = quick_accel_find (accel_group, gdk_keyval_to_lower (accel_key), accel_mods, &n);
-
-  if (n_entries)
-    *n_entries = entries ? n : 0;
-
-  return entries;
-}
-
-/**
- * gtk_accel_group_from_accel_closure:
- * @closure: a #GClosure
- *
- * Finds the #GtkAccelGroup to which @closure is connected;
- * see gtk_accel_group_connect().
- *
- * Returns: (nullable) (transfer none): the #GtkAccelGroup to which @closure
- *     is connected, or %NULL
- */
-GtkAccelGroup*
-gtk_accel_group_from_accel_closure (GClosure *closure)
-{
-  guint i;
-
-  g_return_val_if_fail (closure != NULL, NULL);
-
-  /* A few remarks on what we do here. in general, we need a way to
-   * reverse lookup accel_groups from closures that are being used in
-   * accel groups. this could be done e.g via a hashtable. it is however
-   * cheaper (memory wise) to just use the invalidation notifier on the
-   * closure itself (which we need to install anyway), that contains the
-   * accel group as data which, besides needing to peek a bit at closure
-   * internals, works just as good.
-   */
-  for (i = 0; i < G_CLOSURE_N_NOTIFIERS (closure); i++)
-    if (closure->notifiers[i].notify == accel_closure_invalidate)
-      return closure->notifiers[i].data;
-
-  return NULL;
-}
-
-/**
- * gtk_accel_group_activate:
- * @accel_group: a #GtkAccelGroup
- * @accel_quark: the quark for the accelerator name
- * @acceleratable: the #GObject, usually a #GtkWindow, on which
- *    to activate the accelerator
- * @accel_key: accelerator keyval from a key event
- * @accel_mods: keyboard state mask from a key event
- *
- * Finds the first accelerator in @accel_group that matches
- * @accel_key and @accel_mods, and activates it.
- *
- * Returns: %TRUE if an accelerator was activated and handled
- *     this keypress
- */
-gboolean
-gtk_accel_group_activate (GtkAccelGroup   *accel_group,
-                          GQuark           accel_quark,
-                          GObject         *acceleratable,
-                          guint            accel_key,
-                          GdkModifierType  accel_mods)
-{
-  gboolean was_handled;
-
-  g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
-  g_return_val_if_fail (G_IS_OBJECT (acceleratable), FALSE);
-
-  was_handled = FALSE;
-  g_signal_emit (accel_group, signal_accel_activate, accel_quark,
-                 acceleratable, accel_key, accel_mods, &was_handled);
-
-  return was_handled;
-}
-
-/**
- * gtk_accel_groups_activate:
- * @object: the #GObject, usually a #GtkWindow, on which
- *     to activate the accelerator
- * @accel_key: accelerator keyval from a key event
- * @accel_mods: keyboard state mask from a key event
- *
- * Finds the first accelerator in any #GtkAccelGroup attached
- * to @object that matches @accel_key and @accel_mods, and
- * activates that accelerator.
- *
- * Returns: %TRUE if an accelerator was activated and handled
- *     this keypress
- */
-gboolean
-gtk_accel_groups_activate (GObject         *object,
-                           guint            accel_key,
-                           GdkModifierType  accel_mods)
-{
-  g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
-
-  if (gtk_accelerator_valid (accel_key, accel_mods))
-    {
-      gchar *accel_name;
-      GQuark accel_quark;
-      GSList *slist;
-
-      accel_name = gtk_accelerator_name (accel_key, (accel_mods & gtk_accelerator_get_default_mod_mask ()));
-      accel_quark = g_quark_from_string (accel_name);
-      g_free (accel_name);
-
-      for (slist = gtk_accel_groups_from_object (object); slist; slist = slist->next)
-        if (gtk_accel_group_activate (slist->data, accel_quark, object, accel_key, accel_mods))
-          return TRUE;
-    }
-
-  return FALSE;
-}
-
 /**
  * gtk_accelerator_valid:
  * @keyval: a GDK keyval
diff --git a/gtk/gtkaccelgroup.h b/gtk/gtkaccelgroup.h
index 2efa868899..69d0a3f227 100644
--- a/gtk/gtkaccelgroup.h
+++ b/gtk/gtkaccelgroup.h
@@ -36,149 +36,6 @@
 G_BEGIN_DECLS
 
 
-/* --- type macros --- */
-#define GTK_TYPE_ACCEL_GROUP              (gtk_accel_group_get_type ())
-#define GTK_ACCEL_GROUP(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_ACCEL_GROUP, 
GtkAccelGroup))
-#define GTK_ACCEL_GROUP_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_GROUP, 
GtkAccelGroupClass))
-#define GTK_IS_ACCEL_GROUP(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_ACCEL_GROUP))
-#define GTK_IS_ACCEL_GROUP_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_GROUP))
-#define GTK_ACCEL_GROUP_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_GROUP, 
GtkAccelGroupClass))
-
-
-/* --- accel flags --- */
-/**
- * GtkAccelFlags:
- * @GTK_ACCEL_VISIBLE: Accelerator is visible
- * @GTK_ACCEL_LOCKED: Accelerator not removable
- * @GTK_ACCEL_MASK: Mask
- *
- * Accelerator flags used with gtk_accel_group_connect().
- */
-typedef enum
-{
-  GTK_ACCEL_VISIBLE        = 1 << 0,
-  GTK_ACCEL_LOCKED         = 1 << 1,
-  GTK_ACCEL_MASK           = 0x07
-} GtkAccelFlags;
-
-
-/* --- typedefs & structures --- */
-typedef struct _GtkAccelGroup            GtkAccelGroup;
-typedef struct _GtkAccelGroupClass        GtkAccelGroupClass;
-typedef struct _GtkAccelGroupPrivate      GtkAccelGroupPrivate;
-typedef struct _GtkAccelKey               GtkAccelKey;
-typedef struct _GtkAccelGroupEntry        GtkAccelGroupEntry;
-typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup  *accel_group,
-                                          GObject        *acceleratable,
-                                          guint           keyval,
-                                          GdkModifierType modifier);
-
-/**
- * GtkAccelGroupFindFunc:
- * @key: 
- * @closure: 
- * @data: (closure):
- */
-typedef gboolean (*GtkAccelGroupFindFunc) (GtkAccelKey    *key,
-                                          GClosure       *closure,
-                                          gpointer        data);
-
-/**
- * GtkAccelGroup:
- * 
- * An object representing and maintaining a group of accelerators.
- */
-struct _GtkAccelGroup
-{
-  GObject               parent;
-  GtkAccelGroupPrivate *priv;
-};
-
-/**
- * GtkAccelGroupClass:
- * @parent_class: The parent class.
- * @accel_changed: Signal emitted when an entry is added to or removed
- *    from the accel group.
- */
-struct _GtkAccelGroupClass
-{
-  GObjectClass parent_class;
-
-  /*< public >*/
-
-  void (*accel_changed)        (GtkAccelGroup  *accel_group,
-                                guint           keyval,
-                                GdkModifierType modifier,
-                                GClosure       *accel_closure);
-
-  /*< private >*/
-
-  /* Padding for future expansion */
-  void (*_gtk_reserved1) (void);
-  void (*_gtk_reserved2) (void);
-  void (*_gtk_reserved3) (void);
-  void (*_gtk_reserved4) (void);
-};
-
-/**
- * GtkAccelKey:
- * @accel_key: The accelerator keyval
- * @accel_mods:The accelerator modifiers
- * @accel_flags: The accelerator flags
- */
-struct _GtkAccelKey
-{
-  guint           accel_key;
-  GdkModifierType accel_mods;
-  guint           accel_flags : 16;
-};
-
-
-/* -- Accelerator Groups --- */
-GDK_AVAILABLE_IN_ALL
-GType          gtk_accel_group_get_type           (void) G_GNUC_CONST;
-GDK_AVAILABLE_IN_ALL
-GtkAccelGroup* gtk_accel_group_new               (void);
-GDK_AVAILABLE_IN_ALL
-void          gtk_accel_group_connect            (GtkAccelGroup  *accel_group,
-                                                  guint           accel_key,
-                                                  GdkModifierType accel_mods,
-                                                  GtkAccelFlags   accel_flags,
-                                                  GClosure       *closure);
-GDK_AVAILABLE_IN_ALL
-gboolean       gtk_accel_group_disconnect        (GtkAccelGroup  *accel_group,
-                                                  GClosure       *closure);
-GDK_AVAILABLE_IN_ALL
-gboolean       gtk_accel_group_disconnect_key    (GtkAccelGroup  *accel_group,
-                                                  guint           accel_key,
-                                                  GdkModifierType accel_mods);
-GDK_AVAILABLE_IN_ALL
-gboolean       gtk_accel_group_activate           (GtkAccelGroup   *accel_group,
-                                                   GQuark         accel_quark,
-                                                   GObject       *acceleratable,
-                                                   guint          accel_key,
-                                                   GdkModifierType accel_mods);
-
-
-/* --- GtkActivatable glue --- */
-void           _gtk_accel_group_attach         (GtkAccelGroup  *accel_group,
-                                                GObject        *object);
-void           _gtk_accel_group_detach         (GtkAccelGroup  *accel_group,
-                                                GObject        *object);
-GDK_AVAILABLE_IN_ALL
-gboolean        gtk_accel_groups_activate              (GObject        *object,
-                                                guint           accel_key,
-                                                GdkModifierType accel_mods);
-GDK_AVAILABLE_IN_ALL
-GSList*                gtk_accel_groups_from_object    (GObject        *object);
-GDK_AVAILABLE_IN_ALL
-GtkAccelKey*   gtk_accel_group_find            (GtkAccelGroup        *accel_group,
-                                                GtkAccelGroupFindFunc find_func,
-                                                gpointer              data);
-GDK_AVAILABLE_IN_ALL
-GtkAccelGroup* gtk_accel_group_from_accel_closure (GClosure    *closure);
-
-
 /* --- Accelerators--- */
 GDK_AVAILABLE_IN_ALL
 gboolean gtk_accelerator_valid               (guint            keyval,
@@ -215,21 +72,6 @@ GDK_AVAILABLE_IN_ALL
 GdkModifierType
         gtk_accelerator_get_default_mod_mask (void);
 
-GDK_AVAILABLE_IN_ALL
-GtkAccelGroupEntry*    gtk_accel_group_query   (GtkAccelGroup  *accel_group,
-                                                guint           accel_key,
-                                                GdkModifierType accel_mods,
-                                                guint          *n_entries);
-
-struct _GtkAccelGroupEntry
-{
-  GtkAccelKey  key;
-  GClosure    *closure;
-  GQuark       accel_path_quark;
-};
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelGroup, g_object_unref)
-
 G_END_DECLS
 
 #endif /* __GTK_ACCEL_GROUP_H__ */
diff --git a/gtk/gtkaccelgroupprivate.h b/gtk/gtkaccelgroupprivate.h
index d3f6004e05..c5b4daef55 100644
--- a/gtk/gtkaccelgroupprivate.h
+++ b/gtk/gtkaccelgroupprivate.h
@@ -25,15 +25,6 @@
 
 G_BEGIN_DECLS
 
-struct _GtkAccelGroupPrivate
-{
-  GSList             *acceleratables;
-  guint               n_accels;
-  GtkAccelGroupEntry *priv_accels;
-};
-
-GSList* _gtk_accel_group_get_accelerables       (GtkAccelGroup          *accel_group);
-
 void    gtk_accelerator_print_label             (GString                *gstring,
                                                  guint                   accelerator_key,
                                                  GdkModifierType         accelerator_mods);
diff --git a/gtk/gtkaccellabel.c b/gtk/gtkaccellabel.c
index b1536eb58f..ac335a74d6 100644
--- a/gtk/gtkaccellabel.c
+++ b/gtk/gtkaccellabel.c
@@ -68,7 +68,6 @@
  * set (see #GtkAccelFlags).
  * A #GtkAccelLabel can display multiple accelerators and even signal names,
  * though it is almost always used to display just one accelerator key.
- * ]|
  *
  * # CSS nodes
  *
@@ -84,8 +83,6 @@
 
 enum {
   PROP_0,
-  PROP_ACCEL_CLOSURE,
-  PROP_ACCEL_WIDGET,
   PROP_LABEL,
   PROP_USE_UNDERLINE,
   LAST_PROP
@@ -112,10 +109,6 @@ struct _GtkAccelLabelPrivate
   GtkWidget     *text_label;
   GtkWidget     *accel_label;
 
-  GtkWidget     *accel_widget;       /* done */
-  GClosure      *accel_closure;      /* has set function */
-  GtkAccelGroup *accel_group;        /* set by set_accel_closure() */
-
   guint           accel_key;         /* manual accel key specification if != 0 */
   GdkModifierType accel_mods;
 };
@@ -130,7 +123,6 @@ static void         gtk_accel_label_get_property (GObject            *object,
                                                  guint               prop_id,
                                                  GValue             *value,
                                                  GParamSpec         *pspec);
-static void         gtk_accel_label_destroy      (GtkWidget          *widget);
 static void         gtk_accel_label_finalize     (GObject            *object);
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkAccelLabel, gtk_accel_label, GTK_TYPE_WIDGET)
@@ -145,24 +137,8 @@ gtk_accel_label_class_init (GtkAccelLabelClass *class)
   gobject_class->set_property = gtk_accel_label_set_property;
   gobject_class->get_property = gtk_accel_label_get_property;
 
-  widget_class->destroy = gtk_accel_label_destroy;
-
   gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_ACCEL_LABEL);
 
-  props[PROP_ACCEL_CLOSURE] =
-    g_param_spec_boxed ("accel-closure",
-                        P_("Accelerator Closure"),
-                        P_("The closure to be monitored for accelerator changes"),
-                        G_TYPE_CLOSURE,
-                        GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
-
-  props[PROP_ACCEL_WIDGET] =
-    g_param_spec_object ("accel-widget",
-                         P_("Accelerator Widget"),
-                         P_("The widget to be monitored for accelerator changes"),
-                         GTK_TYPE_WIDGET,
-                         GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
-
   props[PROP_LABEL] =
     g_param_spec_string ("label",
                          P_("Label"),
@@ -195,12 +171,6 @@ gtk_accel_label_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_ACCEL_CLOSURE:
-      gtk_accel_label_set_accel_closure (accel_label, g_value_get_boxed (value));
-      break;
-    case PROP_ACCEL_WIDGET:
-      gtk_accel_label_set_accel_widget (accel_label, g_value_get_object (value));
-      break;
     case PROP_LABEL:
       gtk_accel_label_set_label (accel_label, g_value_get_string (value));
       break;
@@ -220,16 +190,9 @@ gtk_accel_label_get_property (GObject    *object,
                              GParamSpec *pspec)
 {
   GtkAccelLabel  *accel_label = GTK_ACCEL_LABEL (object);
-  GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
 
   switch (prop_id)
     {
-    case PROP_ACCEL_CLOSURE:
-      g_value_set_boxed (value, priv->accel_closure);
-      break;
-    case PROP_ACCEL_WIDGET:
-      g_value_set_object (value, priv->accel_widget);
-      break;
     case PROP_LABEL:
       g_value_set_string (value, gtk_accel_label_get_label (accel_label));
       break;
@@ -251,6 +214,8 @@ gtk_accel_label_init (GtkAccelLabel *accel_label)
   priv->accel_closure = NULL;
   priv->accel_group = NULL;
 
+  gtk_widget_set_has_surface (GTK_WIDGET (accel_label), FALSE);
+
   priv->text_label = gtk_label_new ("");
   gtk_widget_set_hexpand (priv->text_label, TRUE);
   gtk_label_set_xalign (GTK_LABEL (priv->text_label), 0.0f);
@@ -283,17 +248,6 @@ gtk_accel_label_new (const gchar *string)
   return GTK_WIDGET (accel_label);
 }
 
-static void
-gtk_accel_label_destroy (GtkWidget *widget)
-{
-  GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (widget);
-
-  gtk_accel_label_set_accel_widget (accel_label, NULL);
-  gtk_accel_label_set_accel_closure (accel_label, NULL);
-
-  GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->destroy (widget);
-}
-
 static void
 gtk_accel_label_finalize (GObject *object)
 {
@@ -350,80 +304,6 @@ gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label)
   return min;
 }
 
-static void
-refetch_widget_accel_closure (GtkAccelLabel *accel_label)
-{
-  GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
-
-  g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
-  g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
-
-  gtk_accel_label_set_accel_closure (accel_label, NULL);
-}
-
-static void
-accel_widget_weak_ref_cb (GtkAccelLabel *accel_label,
-                          GtkWidget     *old_accel_widget)
-{
-  GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
-
-  g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
-  g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
-
-  g_signal_handlers_disconnect_by_func (priv->accel_widget,
-                                        refetch_widget_accel_closure,
-                                        accel_label);
-  priv->accel_widget = NULL;
-  g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
-}
-
-/**
- * gtk_accel_label_set_accel_widget:
- * @accel_label: a #GtkAccelLabel
- * @accel_widget: (nullable): the widget to be monitored, or %NULL
- *
- * Sets the widget to be monitored by this accelerator label. Passing %NULL for
- * @accel_widget will dissociate @accel_label from its current widget, if any.
- */
-void
-gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
-                                  GtkWidget     *accel_widget)
-{
-  GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
-
-  g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
-
-  if (accel_widget)
-    g_return_if_fail (GTK_IS_WIDGET (accel_widget));
-
-  if (accel_widget != priv->accel_widget)
-    {
-      if (priv->accel_widget)
-        {
-          gtk_accel_label_set_accel_closure (accel_label, NULL);
-          g_signal_handlers_disconnect_by_func (priv->accel_widget,
-                                                refetch_widget_accel_closure,
-                                                accel_label);
-          g_object_weak_unref (G_OBJECT (priv->accel_widget),
-                               (GWeakNotify) accel_widget_weak_ref_cb, accel_label);
-        }
-
-      priv->accel_widget = accel_widget;
-
-      if (priv->accel_widget)
-        {
-          g_object_weak_ref (G_OBJECT (priv->accel_widget),
-                             (GWeakNotify) accel_widget_weak_ref_cb, accel_label);
-          g_signal_connect_object (priv->accel_widget, "accel-closures-changed",
-                                   G_CALLBACK (refetch_widget_accel_closure),
-                                   accel_label, G_CONNECT_SWAPPED);
-          refetch_widget_accel_closure (accel_label);
-        }
-
-      g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
-    }
-}
-
 static void
 gtk_accel_label_reset (GtkAccelLabel *accel_label)
 {
@@ -511,14 +391,6 @@ gtk_accel_label_get_accel_closure (GtkAccelLabel *accel_label)
   return priv->accel_closure;
 }
 
-static gboolean
-find_accel (GtkAccelKey *key,
-           GClosure    *closure,
-           gpointer     data)
-{
-  return data == (gpointer) closure;
-}
-
 /**
  * gtk_accel_label_refetch:
  * @accel_label: a #GtkAccelLabel.
@@ -542,7 +414,7 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
                 "gtk-enable-accels", &enable_accels,
                 NULL);
 
-  if (enable_accels && (priv->accel_closure || priv->accel_key))
+  if (enable_accels && priv->accel_key)
     {
       gboolean have_accel = FALSE;
       guint accel_key;
@@ -556,21 +428,6 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
           have_accel = TRUE;
         }
 
-      /* If we don't have a hardcoded value, check the accel group */
-      if (!have_accel)
-        {
-          GtkAccelKey *key;
-
-          key = gtk_accel_group_find (priv->accel_group, find_accel, priv->accel_closure);
-
-          if (key && key->accel_flags & GTK_ACCEL_VISIBLE)
-            {
-              accel_key = key->accel_key;
-              accel_mods = key->accel_mods;
-              have_accel = TRUE;
-            }
-        }
-
       /* If we found a key using either method, set it */
       if (have_accel)
         accel_string = gtk_accelerator_get_label (accel_key, accel_mods);
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 97c958651a..c5da98fb37 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1939,12 +1939,11 @@ gtk_main_do_event (GdkEvent *event)
     target_widget = handle_pointing_event (event);
   else if (is_key_event (event))
     {
-      if (event->any.type == GDK_KEY_PRESS &&
-          GTK_IS_WINDOW (target_widget) &&
-          gtk_window_activate_key (GTK_WINDOW (target_widget), (GdkEventKey *) event))
-        goto cleanup;
+      GtkWidget *focus_widget;
 
-      target_widget = handle_key_event (event);
+      focus_widget = gtk_window_get_focus (GTK_WINDOW (event_widget));
+      if (focus_widget)
+        event_widget = focus_widget;
     }
   else if (is_focus_event (event))
     {
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index fc0536e1ec..8e7215f0b9 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -517,7 +517,6 @@ static gboolean     disable_startup_notification = FALSE;
 
 static GQuark       quark_gtk_window_key_hash = 0;
 static GQuark       quark_gtk_window_icon_info = 0;
-static GQuark       quark_gtk_buildable_accels = 0;
 
 static GtkBuildableIface *parent_buildable_iface;
 
@@ -781,15 +780,11 @@ static void
 gtk_window_class_init (GtkWindowClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class;
-  GtkContainerClass *container_class;
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
 
-  widget_class = (GtkWidgetClass*) klass;
-  container_class = (GtkContainerClass*) klass;
-  
   quark_gtk_window_key_hash = g_quark_from_static_string ("gtk-window-key-hash");
   quark_gtk_window_icon_info = g_quark_from_static_string ("gtk-window-icon-info");
-  quark_gtk_buildable_accels = g_quark_from_static_string ("gtk-window-buildable-accels");
 
   if (toplevel_list == NULL)
     toplevel_list = g_list_store_new (GTK_TYPE_WIDGET);
@@ -2136,7 +2131,6 @@ gtk_window_buildable_interface_init (GtkBuildableIface *iface)
 {
   parent_buildable_iface = g_type_interface_peek_parent (iface);
   iface->set_buildable_property = gtk_window_buildable_set_buildable_property;
-  iface->parser_finished = gtk_window_buildable_parser_finished;
   iface->custom_tag_start = gtk_window_buildable_custom_tag_start;
   iface->custom_finished = gtk_window_buildable_custom_finished;
   iface->add_child = gtk_window_buildable_add_child;
@@ -2172,78 +2166,28 @@ gtk_window_buildable_set_buildable_property (GtkBuildable *buildable,
 }
 
 typedef struct {
+  GObject *object;
+  GtkBuilder *builder;
   gchar *name;
   gint line;
   gint col;
-} ItemData;
-
-static void
-item_data_free (gpointer data)
-{
-  ItemData *item_data = data;
-
-  g_free (item_data->name);
-  g_free (item_data);
-}
-
-static void
-item_list_free (gpointer data)
-{
-  GSList *list = data;
-
-  g_slist_free_full (list, item_data_free);
-}
-
-static void
-gtk_window_buildable_parser_finished (GtkBuildable *buildable,
-                                     GtkBuilder   *builder)
-{
-  GtkWindow *window = GTK_WINDOW (buildable);
-  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
-  GObject *object;
-  GSList *accels, *l;
-
-  if (priv->builder_visible)
-    gtk_widget_show (GTK_WIDGET (buildable));
-
-  accels = g_object_get_qdata (G_OBJECT (buildable), quark_gtk_buildable_accels);
-  for (l = accels; l; l = l->next)
-    {
-      ItemData *data = l->data;
-
-      object = _gtk_builder_lookup_object (builder, data->name, data->line, data->col);
-      if (!object)
-       continue;
-      gtk_window_add_accel_group (GTK_WINDOW (buildable), GTK_ACCEL_GROUP (object));
-    }
-
-  g_object_set_qdata (G_OBJECT (buildable), quark_gtk_buildable_accels, NULL);
-
-  parent_buildable_iface->parser_finished (buildable, builder);
-}
-
-typedef struct {
-  GObject *object;
-  GtkBuilder *builder;
-  GSList *items;
-} GSListSubParserData;
+} NameSubParserData;
 
 static void
-window_start_element (GtkBuildableParseContext  *context,
-                      const gchar          *element_name,
-                      const gchar         **names,
-                      const gchar         **values,
-                      gpointer              user_data,
-                      GError              **error)
+focus_start_element (GMarkupParseContext  *context,
+                     const gchar          *element_name,
+                     const gchar         **names,
+                     const gchar         **values,
+                     gpointer              user_data,
+                     GError              **error)
 {
-  GSListSubParserData *data = (GSListSubParserData*)user_data;
+  NameSubParserData *data = (NameSubParserData*)user_data;
 
-  if (strcmp (element_name, "group") == 0)
+  if (strcmp (element_name, "initial-focus") == 0)
     {
       const gchar *name;
-      ItemData *item_data;
 
-      if (!_gtk_builder_check_parent (data->builder, context, "accel-groups", error))
+      if (!_gtk_builder_check_parent (data->builder, context, "object", error))
         return;
 
       if (!g_markup_collect_attributes (element_name, names, values, error,
@@ -2254,20 +2198,8 @@ window_start_element (GtkBuildableParseContext  *context,
           return;
         }
 
-      item_data = g_new (ItemData, 1);
-      item_data->name = g_strdup (name);
-      gtk_buildable_parse_context_get_position (context, &item_data->line, &item_data->col);
-      data->items = g_slist_prepend (data->items, item_data);
-    }
-  else if (strcmp (element_name, "accel-groups") == 0)
-    {
-      if (!_gtk_builder_check_parent (data->builder, context, "object", error))
-        return;
-
-      if (!g_markup_collect_attributes (element_name, names, values, error,
-                                        G_MARKUP_COLLECT_INVALID, NULL, NULL,
-                                        G_MARKUP_COLLECT_INVALID))
-        _gtk_builder_prefix_error (data->builder, context, error);
+      data->name = g_strdup (name);
+      g_markup_parse_context_get_position (context, &data->line, &data->col);
     }
   else
     {
@@ -2277,10 +2209,10 @@ window_start_element (GtkBuildableParseContext  *context,
     }
 }
 
-static const GtkBuildableParser window_parser =
-  {
-    window_start_element
-  };
+static const GMarkupParser focus_parser =
+{
+  focus_start_element
+};
 
 static gboolean
 gtk_window_buildable_custom_tag_start (GtkBuildable       *buildable,
@@ -2294,16 +2226,16 @@ gtk_window_buildable_custom_tag_start (GtkBuildable       *buildable,
                                                tagname, parser, parser_data))
     return TRUE;
 
-  if (strcmp (tagname, "accel-groups") == 0)
+  if (strcmp (tagname, "initial-focus") == 0)
     {
-      GSListSubParserData *data;
+      NameSubParserData *data;
 
-      data = g_slice_new0 (GSListSubParserData);
-      data->items = NULL;
+      data = g_slice_new0 (NameSubParserData);
+      data->name = NULL;
       data->object = G_OBJECT (buildable);
       data->builder = builder;
 
-      *parser = window_parser;
+      *parser = focus_parser;
       *parser_data = data;
 
       return TRUE;
@@ -2322,14 +2254,21 @@ gtk_window_buildable_custom_finished (GtkBuildable  *buildable,
   parent_buildable_iface->custom_finished (buildable, builder, child,
                                           tagname, user_data);
 
-  if (strcmp (tagname, "accel-groups") == 0)
+  if (strcmp (tagname, "initial-focus") == 0)
     {
-      GSListSubParserData *data = (GSListSubParserData*)user_data;
+      NameSubParserData *data = (NameSubParserData*)user_data;
 
-      g_object_set_qdata_full (G_OBJECT (buildable), quark_gtk_buildable_accels,
-                               data->items, (GDestroyNotify) item_list_free);
+      if (data->name)
+        {
+          GObject *object;
 
-      g_slice_free (GSListSubParserData, data);
+          object = _gtk_builder_lookup_object (builder, data->name, data->line, data->col);
+          if (object)
+            gtk_window_set_focus (GTK_WINDOW (buildable), GTK_WIDGET (object));
+          g_free (data->name);
+        }
+
+      g_slice_free (NameSubParserData, data);
     }
 }
 
@@ -2684,47 +2623,66 @@ _gtk_window_notify_keys_changed (GtkWindow *window)
 }
 
 /**
- * gtk_window_add_accel_group:
- * @window: window to attach accelerator group to
- * @accel_group: a #GtkAccelGroup
+ * gtk_window_set_position:
+ * @window: a #GtkWindow.
+ * @position: a position constraint.
  *
- * Associate @accel_group with @window, such that calling
- * gtk_accel_groups_activate() on @window will activate accelerators
- * in @accel_group.
+ * Sets a position constraint for this window. If the old or new
+ * constraint is %GTK_WIN_POS_CENTER_ALWAYS, this will also cause
+ * the window to be repositioned to satisfy the new constraint. 
  **/
 void
-gtk_window_add_accel_group (GtkWindow     *window,
-                           GtkAccelGroup *accel_group)
+gtk_window_set_position (GtkWindow         *window,
+                        GtkWindowPosition  position)
 {
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
   g_return_if_fail (GTK_IS_WINDOW (window));
-  g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
 
-  _gtk_accel_group_attach (accel_group, G_OBJECT (window));
-  g_signal_connect_object (accel_group, "accel-changed",
-                          G_CALLBACK (_gtk_window_notify_keys_changed),
-                          window, G_CONNECT_SWAPPED);
-  _gtk_window_notify_keys_changed (window);
+  if (position == GTK_WIN_POS_CENTER_ALWAYS ||
+      priv->position == GTK_WIN_POS_CENTER_ALWAYS)
+    {
+      GtkWindowGeometryInfo *info;
+
+      info = gtk_window_get_geometry_info (window, TRUE);
+
+      /* this flag causes us to re-request the CENTER_ALWAYS
+       * constraint in gtk_window_move_resize(), see
+       * comment in that function.
+       */
+      info->position_constraints_changed = TRUE;
+
+      gtk_widget_queue_resize_no_redraw (GTK_WIDGET (window));
+    }
+
+  if (priv->position != position)
+    {
+      priv->position = position;
+  
+      g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_WIN_POS]);
+    }
 }
 
 /**
- * gtk_window_remove_accel_group:
+ * gtk_window_activate_focus:
  * @window: a #GtkWindow
- * @accel_group: a #GtkAccelGroup
- *
- * Reverses the effects of gtk_window_add_accel_group().
+ * 
+ * Activates the current focused widget within the window.
+ * 
+ * Returns: %TRUE if a widget got activated.
  **/
-void
-gtk_window_remove_accel_group (GtkWindow     *window,
-                              GtkAccelGroup *accel_group)
+gboolean 
+gtk_window_activate_focus (GtkWindow *window)
 {
-  g_return_if_fail (GTK_IS_WINDOW (window));
-  g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
+  GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+  if (priv->focus_widget && gtk_widget_is_sensitive (priv->focus_widget))
+    return gtk_widget_activate (priv->focus_widget);
 
-  g_signal_handlers_disconnect_by_func (accel_group,
-                                       _gtk_window_notify_keys_changed,
-                                       window);
-  _gtk_accel_group_detach (accel_group, G_OBJECT (window));
-  _gtk_window_notify_keys_changed (window);
+  return FALSE;
+>>>>>>> 3a473f2862... accels: Remove GtkAccelGroup
 }
 
 /**
@@ -8106,31 +8064,6 @@ gtk_window_activate_menubar (GtkWidget *widget,
   return TRUE;
 }
 
-static void
-_gtk_window_keys_foreach (GtkWindow                *window,
-                         GtkWindowKeysForeachFunc func,
-                         gpointer                 func_data)
-{
-  GSList *groups;
-
-  groups = gtk_accel_groups_from_object (G_OBJECT (window));
-  while (groups)
-    {
-      GtkAccelGroup *group = groups->data;
-      gint i;
-
-      for (i = 0; i < group->priv->n_accels; i++)
-       {
-         GtkAccelKey *key = &group->priv->priv_accels[i].key;
-         
-         if (key->accel_key)
-           (*func) (window, key->accel_key, key->accel_mods, func_data);
-       }
-      
-      groups = groups->next;
-    }
-}
-
 static void
 gtk_window_keys_changed (GtkWindow *window)
 {
@@ -8152,33 +8085,6 @@ window_key_entry_destroy (gpointer data)
   g_slice_free (GtkWindowKeyEntry, data);
 }
 
-static void
-add_to_key_hash (GtkWindow      *window,
-                guint           keyval,
-                GdkModifierType modifiers,
-                gpointer        data)
-{
-  GtkKeyHash *key_hash = data;
-
-  GtkWindowKeyEntry *entry = g_slice_new (GtkWindowKeyEntry);
-
-  entry->keyval = keyval;
-  entry->modifiers = modifiers;
-
-  /* GtkAccelGroup stores lowercased accelerators. To deal
-   * with this, if <Shift> was specified, uppercase.
-   */
-  if (modifiers & GDK_SHIFT_MASK)
-    {
-      if (keyval == GDK_KEY_Tab)
-       keyval = GDK_KEY_ISO_Left_Tab;
-      else
-       keyval = gdk_keyval_to_upper (keyval);
-    }
-  
-  _gtk_key_hash_add_entry (key_hash, keyval, entry->modifiers, entry);
-}
-
 static GtkKeyHash *
 gtk_window_get_key_hash (GtkWindow *window)
 {
@@ -8190,7 +8096,6 @@ gtk_window_get_key_hash (GtkWindow *window)
   
   key_hash = _gtk_key_hash_new (gdk_display_get_keymap (priv->display),
                                (GDestroyNotify)window_key_entry_destroy);
-  _gtk_window_keys_foreach (window, add_to_key_hash, key_hash);
   g_object_set_qdata (G_OBJECT (window), quark_gtk_window_key_hash, key_hash);
 
   return key_hash;
@@ -8208,69 +8113,6 @@ gtk_window_free_key_hash (GtkWindow *window)
 }
 
 /**
- * gtk_window_activate_key:
- * @window:  a #GtkWindow
- * @event:   a #GdkEventKey
- *
- * Activates mnemonics and accelerators for this #GtkWindow. This is normally
- * called by the default ::key_press_event handler for toplevel windows,
- * however in some cases it may be useful to call this directly when
- * overriding the standard key handling for a toplevel window.
- *
- * Returns: %TRUE if a mnemonic or accelerator was found and activated.
- */
-gboolean
-gtk_window_activate_key (GtkWindow   *window,
-                        GdkEventKey *event)
-{
-  GtkKeyHash *key_hash;
-  GtkWindowKeyEntry *found_entry = NULL;
-  gboolean enable_accels;
-
-  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
-  key_hash = gtk_window_get_key_hash (window);
-
-  if (key_hash)
-    {
-      GSList *tmp_list;
-      GSList *entries = _gtk_key_hash_lookup (key_hash,
-                                             event->hardware_keycode,
-                                             event->state,
-                                             gtk_accelerator_get_default_mod_mask (),
-                                             event->group);
-
-      g_object_get (gtk_widget_get_settings (GTK_WIDGET (window)),
-                    "gtk-enable-accels", &enable_accels,
-                    NULL);
-
-      for (tmp_list = entries; tmp_list; tmp_list = tmp_list->next)
-       {
-         GtkWindowKeyEntry *entry = tmp_list->data;
-          if (enable_accels && !found_entry)
-            {
-              found_entry = entry;
-              break;
-            }
-       }
-
-      g_slist_free (entries);
-    }
-
-  if (found_entry)
-    {
-      if (enable_accels)
-        {
-          if (gtk_accel_groups_activate (G_OBJECT (window), found_entry->keyval, found_entry->modifiers))
-            return TRUE;
-        }
-    }
-
-  return FALSE;
-}
-
-/*
  * _gtk_window_set_is_active:
  * @window: a #GtkWindow
  * @is_active: %TRUE if the window is in the currently active toplevel
diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h
index b3697b82fe..42f9478552 100644
--- a/gtk/gtkwindow.h
+++ b/gtk/gtkwindow.h
@@ -122,11 +122,12 @@ GDK_AVAILABLE_IN_ALL
 void       gtk_window_set_startup_id           (GtkWindow           *window,
                                                 const gchar         *startup_id);
 GDK_AVAILABLE_IN_ALL
-void       gtk_window_add_accel_group          (GtkWindow           *window,
-                                               GtkAccelGroup       *accel_group);
+const gchar * gtk_window_get_role              (GtkWindow           *window);
 GDK_AVAILABLE_IN_ALL
-void       gtk_window_remove_accel_group       (GtkWindow           *window,
-                                               GtkAccelGroup       *accel_group);
+void       gtk_window_set_position             (GtkWindow           *window,
+                                               GtkWindowPosition    position);
+GDK_AVAILABLE_IN_ALL
+gboolean   gtk_window_activate_focus          (GtkWindow           *window);
 GDK_AVAILABLE_IN_ALL
 void       gtk_window_set_focus                (GtkWindow           *window,
                                                GtkWidget           *focus);
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index a85b6a5bd1..bf20e60e15 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -68,9 +68,6 @@ gboolean        _gtk_window_query_nonaccels     (GtkWindow      *window,
                                                  guint           accel_key,
                                                  GdkModifierType accel_mods);
 
-gboolean         gtk_window_activate_key (GtkWindow   *window,
-                                          GdkEventKey *event);
-
 void            _gtk_window_schedule_mnemonics_visible (GtkWindow *window);
 
 void            _gtk_window_notify_keys_changed (GtkWindow *window);


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