Move GSEAL'd members of GtkAccelGroup into private struct

This commit is contained in:
Cody Russell 2009-10-22 15:18:13 -05:00 committed by Javier Jardón
parent bcb663096d
commit 3c8c4004b6
2 changed files with 72 additions and 60 deletions

View File

@ -62,6 +62,16 @@
* and mnemonics, of course. * and mnemonics, of course.
*/ */
#define GTK_ACCEL_GROUP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupPrivate))
struct _GtkAccelGroupPrivate
{
guint lock_count;
GdkModifierType modifier_mask;
GSList *acceleratables;
guint n_accels;
GtkAccelGroupEntry *priv_accels;
};
/* --- prototypes --- */ /* --- prototypes --- */
static void gtk_accel_group_finalize (GObject *object); static void gtk_accel_group_finalize (GObject *object);
@ -171,6 +181,8 @@ gtk_accel_group_class_init (GtkAccelGroupClass *class)
G_TYPE_UINT, G_TYPE_UINT,
GDK_TYPE_MODIFIER_TYPE, GDK_TYPE_MODIFIER_TYPE,
G_TYPE_CLOSURE); G_TYPE_CLOSURE);
g_type_class_add_private (object_class, sizeof (GtkAccelGroupPrivate));
} }
static void static void
@ -179,9 +191,9 @@ gtk_accel_group_finalize (GObject *object)
GtkAccelGroup *accel_group = GTK_ACCEL_GROUP (object); GtkAccelGroup *accel_group = GTK_ACCEL_GROUP (object);
guint i; guint i;
for (i = 0; i < accel_group->n_accels; i++) for (i = 0; i < accel_group->priv->n_accels; i++)
{ {
GtkAccelGroupEntry *entry = &accel_group->priv_accels[i]; GtkAccelGroupEntry *entry = &accel_group->priv->priv_accels[i];
if (entry->accel_path_quark) if (entry->accel_path_quark)
{ {
@ -195,7 +207,7 @@ gtk_accel_group_finalize (GObject *object)
g_closure_unref (entry->closure); g_closure_unref (entry->closure);
} }
g_free (accel_group->priv_accels); g_free (accel_group->priv->priv_accels);
G_OBJECT_CLASS (gtk_accel_group_parent_class)->finalize (object); G_OBJECT_CLASS (gtk_accel_group_parent_class)->finalize (object);
} }
@ -211,10 +223,10 @@ gtk_accel_group_get_property (GObject *object,
switch (param_id) switch (param_id)
{ {
case PROP_IS_LOCKED: case PROP_IS_LOCKED:
g_value_set_boolean (value, accel_group->lock_count > 0); g_value_set_boolean (value, accel_group->priv->lock_count > 0);
break; break;
case PROP_MODIFIER_MASK: case PROP_MODIFIER_MASK:
g_value_set_flags (value, accel_group->modifier_mask); g_value_set_flags (value, accel_group->priv->modifier_mask);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@ -225,11 +237,15 @@ gtk_accel_group_get_property (GObject *object,
static void static void
gtk_accel_group_init (GtkAccelGroup *accel_group) gtk_accel_group_init (GtkAccelGroup *accel_group)
{ {
accel_group->lock_count = 0; GtkAccelGroupPrivate *priv = GTK_ACCEL_GROUP_GET_PRIVATE (accel_group);
accel_group->modifier_mask = gtk_accelerator_get_default_mod_mask ();
accel_group->acceleratables = NULL; priv->lock_count = 0;
accel_group->n_accels = 0; priv->modifier_mask = gtk_accelerator_get_default_mod_mask ();
accel_group->priv_accels = NULL; priv->acceleratables = NULL;
priv->n_accels = 0;
priv->priv_accels = NULL;
accel_group->priv = priv;
} }
/** /**
@ -261,7 +277,7 @@ gtk_accel_group_get_is_locked (GtkAccelGroup *accel_group)
{ {
g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE); g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
return accel_group->lock_count > 0; return accel_group->priv->lock_count > 0;
} }
/** /**
@ -280,7 +296,7 @@ gtk_accel_group_get_modifier_mask (GtkAccelGroup *accel_group)
{ {
g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), 0); g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), 0);
return accel_group->modifier_mask; return accel_group->priv->modifier_mask;
} }
static void static void
@ -294,7 +310,7 @@ accel_group_weak_ref_detach (GSList *free_list,
GtkAccelGroup *accel_group; GtkAccelGroup *accel_group;
accel_group = slist->data; accel_group = slist->data;
accel_group->acceleratables = g_slist_remove (accel_group->acceleratables, stale_object); accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, stale_object);
g_object_unref (accel_group); g_object_unref (accel_group);
} }
g_slist_free (free_list); g_slist_free (free_list);
@ -309,10 +325,10 @@ _gtk_accel_group_attach (GtkAccelGroup *accel_group,
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (G_IS_OBJECT (object));
g_return_if_fail (g_slist_find (accel_group->acceleratables, object) == NULL); g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) == NULL);
g_object_ref (accel_group); g_object_ref (accel_group);
accel_group->acceleratables = g_slist_prepend (accel_group->acceleratables, object); accel_group->priv->acceleratables = g_slist_prepend (accel_group->priv->acceleratables, object);
slist = g_object_get_qdata (object, quark_acceleratable_groups); slist = g_object_get_qdata (object, quark_acceleratable_groups);
if (slist) if (slist)
g_object_weak_unref (object, g_object_weak_unref (object,
@ -333,9 +349,9 @@ _gtk_accel_group_detach (GtkAccelGroup *accel_group,
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (G_IS_OBJECT (object));
g_return_if_fail (g_slist_find (accel_group->acceleratables, object) != NULL); g_return_if_fail (g_slist_find (accel_group->priv->acceleratables, object) != NULL);
accel_group->acceleratables = g_slist_remove (accel_group->acceleratables, object); accel_group->priv->acceleratables = g_slist_remove (accel_group->priv->acceleratables, object);
slist = g_object_get_qdata (object, quark_acceleratable_groups); slist = g_object_get_qdata (object, quark_acceleratable_groups);
g_object_weak_unref (object, g_object_weak_unref (object,
(GWeakNotify) accel_group_weak_ref_detach, (GWeakNotify) accel_group_weak_ref_detach,
@ -389,12 +405,12 @@ gtk_accel_group_find (GtkAccelGroup *accel_group,
g_return_val_if_fail (find_func != NULL, NULL); g_return_val_if_fail (find_func != NULL, NULL);
g_object_ref (accel_group); g_object_ref (accel_group);
for (i = 0; i < accel_group->n_accels; i++) for (i = 0; i < accel_group->priv->n_accels; i++)
if (find_func (&accel_group->priv_accels[i].key, if (find_func (&accel_group->priv->priv_accels[i].key,
accel_group->priv_accels[i].closure, accel_group->priv->priv_accels[i].closure,
data)) data))
{ {
key = &accel_group->priv_accels[i].key; key = &accel_group->priv->priv_accels[i].key;
break; break;
} }
g_object_unref (accel_group); g_object_unref (accel_group);
@ -421,9 +437,9 @@ gtk_accel_group_lock (GtkAccelGroup *accel_group)
{ {
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
accel_group->lock_count += 1; accel_group->priv->lock_count += 1;
if (accel_group->lock_count == 1) { if (accel_group->priv->lock_count == 1) {
/* State change from unlocked to locked */ /* State change from unlocked to locked */
g_object_notify (G_OBJECT (accel_group), "is-locked"); g_object_notify (G_OBJECT (accel_group), "is-locked");
} }
@ -439,11 +455,11 @@ void
gtk_accel_group_unlock (GtkAccelGroup *accel_group) gtk_accel_group_unlock (GtkAccelGroup *accel_group)
{ {
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group)); g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
g_return_if_fail (accel_group->lock_count > 0); g_return_if_fail (accel_group->priv->lock_count > 0);
accel_group->lock_count -= 1; accel_group->priv->lock_count -= 1;
if (accel_group->lock_count < 1) { if (accel_group->priv->lock_count < 1) {
/* State change from locked to unlocked */ /* State change from locked to unlocked */
g_object_notify (G_OBJECT (accel_group), "is-locked"); g_object_notify (G_OBJECT (accel_group), "is-locked");
} }
@ -479,25 +495,25 @@ quick_accel_add (GtkAccelGroup *accel_group,
GClosure *closure, GClosure *closure,
GQuark path_quark) GQuark path_quark)
{ {
guint pos, i = accel_group->n_accels++; guint pos, i = accel_group->priv->n_accels++;
GtkAccelGroupEntry key; GtkAccelGroupEntry key;
/* find position */ /* find position */
key.key.accel_key = accel_key; key.key.accel_key = accel_key;
key.key.accel_mods = accel_mods; key.key.accel_mods = accel_mods;
for (pos = 0; pos < i; pos++) for (pos = 0; pos < i; pos++)
if (bsearch_compare_accels (&key, accel_group->priv_accels + pos) < 0) if (bsearch_compare_accels (&key, accel_group->priv->priv_accels + pos) < 0)
break; break;
/* insert at position, ref closure */ /* insert at position, ref closure */
accel_group->priv_accels = g_renew (GtkAccelGroupEntry, accel_group->priv_accels, accel_group->n_accels); accel_group->priv->priv_accels = g_renew (GtkAccelGroupEntry, accel_group->priv->priv_accels, accel_group->priv->n_accels);
g_memmove (accel_group->priv_accels + pos + 1, accel_group->priv_accels + pos, g_memmove (accel_group->priv->priv_accels + pos + 1, accel_group->priv->priv_accels + pos,
(i - pos) * sizeof (accel_group->priv_accels[0])); (i - pos) * sizeof (accel_group->priv->priv_accels[0]));
accel_group->priv_accels[pos].key.accel_key = accel_key; accel_group->priv->priv_accels[pos].key.accel_key = accel_key;
accel_group->priv_accels[pos].key.accel_mods = accel_mods; accel_group->priv->priv_accels[pos].key.accel_mods = accel_mods;
accel_group->priv_accels[pos].key.accel_flags = accel_flags; accel_group->priv->priv_accels[pos].key.accel_flags = accel_flags;
accel_group->priv_accels[pos].closure = g_closure_ref (closure); accel_group->priv->priv_accels[pos].closure = g_closure_ref (closure);
accel_group->priv_accels[pos].accel_path_quark = path_quark; accel_group->priv->priv_accels[pos].accel_path_quark = path_quark;
g_closure_sink (closure); g_closure_sink (closure);
/* handle closure invalidation and reverse lookups */ /* handle closure invalidation and reverse lookups */
@ -528,7 +544,7 @@ quick_accel_remove (GtkAccelGroup *accel_group,
guint pos) guint pos)
{ {
GQuark accel_quark = 0; GQuark accel_quark = 0;
GtkAccelGroupEntry *entry = accel_group->priv_accels + pos; GtkAccelGroupEntry *entry = accel_group->priv->priv_accels + pos;
guint accel_key = entry->key.accel_key; guint accel_key = entry->key.accel_key;
GdkModifierType accel_mods = entry->key.accel_mods; GdkModifierType accel_mods = entry->key.accel_mods;
GClosure *closure = entry->closure; GClosure *closure = entry->closure;
@ -554,9 +570,9 @@ quick_accel_remove (GtkAccelGroup *accel_group,
_gtk_accel_map_remove_group (g_quark_to_string (entry->accel_path_quark), accel_group); _gtk_accel_map_remove_group (g_quark_to_string (entry->accel_path_quark), accel_group);
/* physically remove */ /* physically remove */
accel_group->n_accels -= 1; accel_group->priv->n_accels -= 1;
g_memmove (entry, entry + 1, g_memmove (entry, entry + 1,
(accel_group->n_accels - pos) * sizeof (accel_group->priv_accels[0])); (accel_group->priv->n_accels - pos) * sizeof (accel_group->priv->priv_accels[0]));
/* and notify */ /* and notify */
if (accel_quark) if (accel_quark)
@ -577,24 +593,24 @@ quick_accel_find (GtkAccelGroup *accel_group,
*count_p = 0; *count_p = 0;
if (!accel_group->n_accels) if (!accel_group->priv->n_accels)
return NULL; return NULL;
key.key.accel_key = accel_key; key.key.accel_key = accel_key;
key.key.accel_mods = accel_mods; key.key.accel_mods = accel_mods;
entry = bsearch (&key, accel_group->priv_accels, accel_group->n_accels, entry = bsearch (&key, accel_group->priv->priv_accels, accel_group->priv->n_accels,
sizeof (accel_group->priv_accels[0]), bsearch_compare_accels); sizeof (accel_group->priv->priv_accels[0]), bsearch_compare_accels);
if (!entry) if (!entry)
return NULL; return NULL;
/* step back to the first member */ /* step back to the first member */
for (; entry > accel_group->priv_accels; entry--) for (; entry > accel_group->priv->priv_accels; entry--)
if (entry[-1].key.accel_key != accel_key || if (entry[-1].key.accel_key != accel_key ||
entry[-1].key.accel_mods != accel_mods) entry[-1].key.accel_mods != accel_mods)
break; break;
/* count equal members */ /* count equal members */
for (; entry + *count_p < accel_group->priv_accels + accel_group->n_accels; (*count_p)++) 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 || if (entry[*count_p].key.accel_key != accel_key ||
entry[*count_p].key.accel_mods != accel_mods) entry[*count_p].key.accel_mods != accel_mods)
break; break;
@ -708,8 +724,8 @@ gtk_accel_group_disconnect (GtkAccelGroup *accel_group,
g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE); g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
for (i = 0; i < accel_group->n_accels; i++) for (i = 0; i < accel_group->priv->n_accels; i++)
if (accel_group->priv_accels[i].closure == closure || !closure) if (accel_group->priv->priv_accels[i].closure == closure)
{ {
g_object_ref (accel_group); g_object_ref (accel_group);
quick_accel_remove (accel_group, i); quick_accel_remove (accel_group, i);
@ -778,10 +794,10 @@ _gtk_accel_group_reconnect (GtkAccelGroup *accel_group,
g_object_ref (accel_group); g_object_ref (accel_group);
for (i = 0; i < accel_group->n_accels; i++) for (i = 0; i < accel_group->priv->n_accels; i++)
if (accel_group->priv_accels[i].accel_path_quark == accel_path_quark) if (accel_group->priv->priv_accels[i].accel_path_quark == accel_path_quark)
{ {
GClosure *closure = g_closure_ref (accel_group->priv_accels[i].closure); GClosure *closure = g_closure_ref (accel_group->priv->priv_accels[i].closure);
clist = g_slist_prepend (clist, closure); clist = g_slist_prepend (clist, closure);
} }

View File

@ -57,10 +57,11 @@ typedef enum
/* --- typedefs & structures --- */ /* --- typedefs & structures --- */
typedef struct _GtkAccelGroup GtkAccelGroup; typedef struct _GtkAccelGroup GtkAccelGroup;
typedef struct _GtkAccelGroupClass GtkAccelGroupClass; typedef struct _GtkAccelGroupClass GtkAccelGroupClass;
typedef struct _GtkAccelKey GtkAccelKey; typedef struct _GtkAccelGroupPrivate GtkAccelGroupPrivate;
typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry; typedef struct _GtkAccelKey GtkAccelKey;
typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry;
typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup *accel_group, typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup *accel_group,
GObject *acceleratable, GObject *acceleratable,
guint keyval, guint keyval,
@ -85,13 +86,8 @@ typedef gboolean (*GtkAccelGroupFindFunc) (GtkAccelKey *key,
*/ */
struct _GtkAccelGroup struct _GtkAccelGroup
{ {
GObject parent; GObject parent;
GtkAccelGroupPrivate *priv;
guint GSEAL (lock_count);
GdkModifierType GSEAL (modifier_mask);
GSList *GSEAL (acceleratables);
guint GSEAL (n_accels);
GtkAccelGroupEntry *GSEAL (priv_accels);
}; };
struct _GtkAccelGroupClass struct _GtkAccelGroupClass