diff options
author | Sven Neumann <sven@gimp.org> | 2007-06-19 15:08:11 +0000 |
---|---|---|
committer | Sven Neumann <neo@src.gnome.org> | 2007-06-19 15:08:11 +0000 |
commit | 5de66ab18dd60b2b6f9e95521f41f0df19af31b1 (patch) | |
tree | 0e8d37abc342681e88380c2bb80170c56997ebd9 | |
parent | 60a409785facbef5ba61c0bb1e396ec027e02bbc (diff) | |
download | gtk+-5de66ab18dd60b2b6f9e95521f41f0df19af31b1.tar.gz |
mark the GtkTooltips struct as private. Keep the tooltips in a hash table
2007-06-19 Sven Neumann <sven@gimp.org>
* gtk/gtktooltips.[ch]: mark the GtkTooltips struct as private.
Keep the tooltips in a hash table instead of a linked list.
Improves performance when using large amounts of tooltips (#447214).
* README.in: document the GtkTooltips changes.
svn path=/trunk/; revision=18188
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | README.in | 4 | ||||
-rw-r--r-- | gtk/gtktooltips.c | 118 | ||||
-rw-r--r-- | gtk/gtktooltips.h | 3 |
4 files changed, 80 insertions, 53 deletions
@@ -1,3 +1,11 @@ +2007-06-19 Sven Neumann <sven@gimp.org> + + * gtk/gtktooltips.[ch]: mark the GtkTooltips struct as private. + Keep the tooltips in a hash table instead of a linked list. + Improves performance when using large amounts of tooltips (#447214). + + * README.in: document the GtkTooltips changes. + 2007-06-19 Johan Dahlin <jdahlin@async.com.br> * gtk/*: Rename buildable methods to not clash with widget @@ -85,6 +85,10 @@ Release notes for 2.12 * GtkMenuShell is now defined as an abstract type. It was already documented as an abstract class, and there is little reason to instantiate it. + +* The GtkTooltips struct (this is the old tooltips API) is now considered + private. Code that used to access this struct, in particular the + tips_data_list field, will need to change. * The memory management of the GtkRecentManager object has been changed, as using the screen didn't guarantee that the singleton instance was diff --git a/gtk/gtktooltips.c b/gtk/gtktooltips.c index bb41f14325..df001a8aa7 100644 --- a/gtk/gtktooltips.c +++ b/gtk/gtktooltips.c @@ -48,24 +48,36 @@ #define STICKY_REVERT_DELAY 1000 /* Delay before sticky tooltips revert * to normal */ +#define GTK_TOOLTIPS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TOOLTIPS, GtkTooltipsPrivate)) -static void gtk_tooltips_destroy (GtkObject *object); +typedef struct _GtkTooltipsPrivate GtkTooltipsPrivate; -static void gtk_tooltips_event_handler (GtkWidget *widget, - GdkEvent *event); -static void gtk_tooltips_widget_unmap (GtkWidget *widget, - gpointer data); -static void gtk_tooltips_widget_remove (GtkWidget *widget, - gpointer data); -static void gtk_tooltips_set_active_widget (GtkTooltips *tooltips, - GtkWidget *widget); -static gint gtk_tooltips_timeout (gpointer data); +struct _GtkTooltipsPrivate +{ + GHashTable *tips_data_table; +}; + + +static void gtk_tooltips_finalize (GObject *object); +static void gtk_tooltips_destroy (GtkObject *object); + +static void gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata); + +static void gtk_tooltips_event_handler (GtkWidget *widget, + GdkEvent *event); +static void gtk_tooltips_widget_unmap (GtkWidget *widget, + gpointer data); +static void gtk_tooltips_widget_remove (GtkWidget *widget, + gpointer data); +static void gtk_tooltips_set_active_widget (GtkTooltips *tooltips, + GtkWidget *widget); +static gint gtk_tooltips_timeout (gpointer data); -static gint gtk_tooltips_paint_window (GtkTooltips *tooltips); -static void gtk_tooltips_draw_tips (GtkTooltips *tooltips); -static void gtk_tooltips_unset_tip_window (GtkTooltips *tooltips); +static gint gtk_tooltips_paint_window (GtkTooltips *tooltips); +static void gtk_tooltips_draw_tips (GtkTooltips *tooltips); +static void gtk_tooltips_unset_tip_window (GtkTooltips *tooltips); -static gboolean get_keyboard_mode (GtkWidget *widget); +static gboolean get_keyboard_mode (GtkWidget *widget); static const gchar tooltips_data_key[] = "_GtkTooltipsData"; static const gchar tooltips_info_key[] = "_GtkTooltipsInfo"; @@ -75,26 +87,45 @@ G_DEFINE_TYPE (GtkTooltips, gtk_tooltips, GTK_TYPE_OBJECT) static void gtk_tooltips_class_init (GtkTooltipsClass *class) { - GtkObjectClass *object_class; + GtkObjectClass *object_class = (GtkObjectClass *) class; + GObjectClass *gobject_class = (GObjectClass *) class; - object_class = (GtkObjectClass*) class; + gobject_class->finalize = gtk_tooltips_finalize; object_class->destroy = gtk_tooltips_destroy; + + g_type_class_add_private (gobject_class, sizeof (GtkTooltipsPrivate)); } static void gtk_tooltips_init (GtkTooltips *tooltips) { + GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); + tooltips->tip_window = NULL; tooltips->active_tips_data = NULL; - tooltips->tips_data_list = NULL; - + tooltips->_tips_data_list = NULL; + tooltips->delay = DEFAULT_DELAY; tooltips->enabled = TRUE; tooltips->timer_tag = 0; tooltips->use_sticky_delay = FALSE; tooltips->last_popdown.tv_sec = -1; tooltips->last_popdown.tv_usec = -1; + + private->tips_data_table = + g_hash_table_new_full (NULL, NULL, NULL, + (GDestroyNotify) gtk_tooltips_destroy_data); +} + +static void +gtk_tooltips_finalize (GObject *object) +{ + GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (object); + + g_hash_table_destroy (private->tips_data_table); + + G_OBJECT_CLASS (gtk_tooltips_parent_class)->finalize (object); } GtkTooltips * @@ -106,6 +137,8 @@ gtk_tooltips_new (void) static void gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata) { + gtk_tooltips_widget_unmap (tooltipsdata->widget, tooltipsdata); + g_free (tooltipsdata->tip_text); g_free (tooltipsdata->tip_private); @@ -156,8 +189,7 @@ static void gtk_tooltips_destroy (GtkObject *object) { GtkTooltips *tooltips = GTK_TOOLTIPS (object); - GList *current; - GtkTooltipsData *tooltipsdata; + GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); g_return_if_fail (tooltips != NULL); @@ -167,16 +199,7 @@ gtk_tooltips_destroy (GtkObject *object) tooltips->timer_tag = 0; } - if (tooltips->tips_data_list != NULL) - { - current = g_list_first (tooltips->tips_data_list); - while (current != NULL) - { - tooltipsdata = (GtkTooltipsData*) current->data; - current = current->next; - gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); - } - } + g_hash_table_remove_all (private->tips_data_table); gtk_tooltips_unset_tip_window (tooltips); @@ -327,8 +350,9 @@ gtk_tooltips_set_tip (GtkTooltips *tooltips, tooltipsdata->tip_text = g_strdup (tip_text); tooltipsdata->tip_private = g_strdup (tip_private); - tooltips->tips_data_list = g_list_append (tooltips->tips_data_list, - tooltipsdata); + g_hash_table_insert (GTK_TOOLTIPS_GET_PRIVATE (tooltips)->tips_data_table, + widget, tooltipsdata); + g_signal_connect_after (widget, "event_after", G_CALLBACK (gtk_tooltips_event_handler), tooltipsdata); @@ -478,23 +502,15 @@ gtk_tooltips_set_active_widget (GtkTooltips *tooltips, tooltips->active_tips_data = NULL; - if (widget) + if (widget && GTK_WIDGET_DRAWABLE (widget)) { - GList *list; - - for (list = tooltips->tips_data_list; list; list = list->next) - { - GtkTooltipsData *tooltipsdata; - - tooltipsdata = list->data; - - if (tooltipsdata->widget == widget && - GTK_WIDGET_DRAWABLE (widget)) - { - tooltips->active_tips_data = tooltipsdata; - break; - } - } + GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); + GtkTooltipsData *tooltipsdata; + + tooltipsdata = g_hash_table_lookup (private->tips_data_table, widget); + + if (tooltipsdata) + tooltips->active_tips_data = tooltipsdata; } else { @@ -728,11 +744,9 @@ gtk_tooltips_widget_remove (GtkWidget *widget, { GtkTooltipsData *tooltipsdata = (GtkTooltipsData*) data; GtkTooltips *tooltips = tooltipsdata->tooltips; + GtkTooltipsPrivate *private = GTK_TOOLTIPS_GET_PRIVATE (tooltips); - gtk_tooltips_widget_unmap (widget, data); - tooltips->tips_data_list = g_list_remove (tooltips->tips_data_list, - tooltipsdata); - gtk_tooltips_destroy_data (tooltipsdata); + g_hash_table_remove (private->tips_data_table, tooltipsdata->widget); } void diff --git a/gtk/gtktooltips.h b/gtk/gtktooltips.h index 75692cb5d0..49dbcbfe47 100644 --- a/gtk/gtktooltips.h +++ b/gtk/gtktooltips.h @@ -57,10 +57,11 @@ struct _GtkTooltips { GtkObject parent_instance; + /*< private >*/ GtkWidget *tip_window; GtkWidget *tip_label; GtkTooltipsData *active_tips_data; - GList *tips_data_list; + GList *_tips_data_list; /* unused */ guint delay : 30; guint enabled : 1; |