summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Neumann <sven@gimp.org>2007-06-19 15:08:11 +0000
committerSven Neumann <neo@src.gnome.org>2007-06-19 15:08:11 +0000
commit5de66ab18dd60b2b6f9e95521f41f0df19af31b1 (patch)
tree0e8d37abc342681e88380c2bb80170c56997ebd9
parent60a409785facbef5ba61c0bb1e396ec027e02bbc (diff)
downloadgtk+-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--ChangeLog8
-rw-r--r--README.in4
-rw-r--r--gtk/gtktooltips.c118
-rw-r--r--gtk/gtktooltips.h3
4 files changed, 80 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 76924a201a..639e0b3310 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
diff --git a/README.in b/README.in
index 74efdfe2ae..6ec0fba6d0 100644
--- a/README.in
+++ b/README.in
@@ -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;