Please consider the attached patch, which adds a gtk_tooltips_set_tip_widget() call to the GtkTooltips API. As the name says, it allows to use a widget as tooltip. This feature has been lacking for too long, and would be extremely useful for applets, notification icons and the like. Regards, Jean-Yves Lefort -- Jean-Yves Lefort jylefort brutele be http://lefort.be.eu.org/
--- gtk/gtktooltips.c.orig Wed Oct 27 13:26:32 2004 +++ gtk/gtktooltips.c Wed Oct 27 14:49:51 2004 @@ -51,6 +51,12 @@ static void gtk_tooltips_init (GtkTooltips *tooltips); static void gtk_tooltips_destroy (GtkObject *object); +static void gtk_tooltips_set_tip_real (GtkTooltips *tooltips, + GtkWidget *widget, + const gchar *tip_text, + const gchar *tip_private, + GtkWidget *tip_widget); + static void gtk_tooltips_event_handler (GtkWidget *widget, GdkEvent *event); static void gtk_tooltips_widget_unmap (GtkWidget *widget, @@ -70,6 +76,7 @@ static GtkObjectClass *parent_class; static const gchar *tooltips_data_key = "_GtkTooltipsData"; static const gchar *tooltips_info_key = "_GtkTooltipsInfo"; +static const gchar *tooltips_widget_key = "_GtkTooltipsWidget"; GType gtk_tooltips_get_type (void) @@ -148,6 +155,7 @@ tooltipsdata); g_object_set_data (G_OBJECT (tooltipsdata->widget), tooltips_data_key, NULL); + g_object_set_data (G_OBJECT (tooltipsdata->widget), tooltips_widget_key, NULL); g_object_unref (tooltipsdata->widget); g_free (tooltipsdata); } @@ -177,6 +185,8 @@ gtk_widget_destroy (tooltips->tip_window); tooltips->tip_window = NULL; + + g_object_unref (tooltips->tip_label); } } @@ -250,7 +260,6 @@ gtk_tooltips_update_screen (tooltips, TRUE); gtk_widget_set_app_paintable (tooltips->tip_window, TRUE); gtk_window_set_resizable (GTK_WINDOW (tooltips->tip_window), FALSE); - gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips"); gtk_container_set_border_width (GTK_CONTAINER (tooltips->tip_window), 4); g_signal_connect_swapped (tooltips->tip_window, @@ -261,10 +270,10 @@ tooltips->tip_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL (tooltips->tip_label), TRUE); gtk_misc_set_alignment (GTK_MISC (tooltips->tip_label), 0.5, 0.5); - gtk_widget_show (tooltips->tip_label); - - gtk_container_add (GTK_CONTAINER (tooltips->tip_window), tooltips->tip_label); + g_object_ref (tooltips->tip_label); + gtk_object_sink (GTK_OBJECT (tooltips->tip_label)); + g_signal_connect (tooltips->tip_window, "destroy", G_CALLBACK (gtk_widget_destroyed), @@ -307,11 +316,20 @@ return g_object_get_data (G_OBJECT (widget), tooltips_data_key); } -void -gtk_tooltips_set_tip (GtkTooltips *tooltips, - GtkWidget *widget, - const gchar *tip_text, - const gchar *tip_private) +GtkWidget* +gtk_tooltips_tip_widget_get (GtkWidget *widget) +{ + g_return_val_if_fail (widget != NULL, NULL); + + return g_object_get_data (G_OBJECT (widget), tooltips_widget_key); +} + +static void +gtk_tooltips_set_tip_real (GtkTooltips *tooltips, + GtkWidget *widget, + const gchar *tip_text, + const gchar *tip_private, + GtkWidget *tip_widget) { GtkTooltipsData *tooltipsdata; @@ -320,7 +338,7 @@ tooltipsdata = gtk_tooltips_data_get (widget); - if (!tip_text) + if (! (tip_text || tip_widget)) { if (tooltipsdata) gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); @@ -336,6 +354,15 @@ tooltipsdata->tip_text = g_strdup (tip_text); tooltipsdata->tip_private = g_strdup (tip_private); + + if (tip_widget) + { + g_object_ref (tip_widget); + gtk_object_sink (GTK_OBJECT (tip_widget)); + g_object_set_data_full (G_OBJECT (widget), tooltips_widget_key, tip_widget, g_object_unref); + } + else + g_object_set_data (G_OBJECT (widget), tooltips_widget_key, NULL); gtk_tooltips_draw_tips (tooltips); } @@ -363,6 +390,13 @@ g_object_set_data (G_OBJECT (widget), tooltips_data_key, tooltipsdata); + if (tip_widget) + { + g_object_ref (tip_widget); + gtk_object_sink (GTK_OBJECT (tip_widget)); + g_object_set_data_full (G_OBJECT (widget), tooltips_widget_key, tip_widget, g_object_unref); + } + g_signal_connect (widget, "unmap", G_CALLBACK (gtk_tooltips_widget_unmap), tooltipsdata); @@ -377,6 +411,29 @@ } } +void +gtk_tooltips_set_tip (GtkTooltips *tooltips, + GtkWidget *widget, + const gchar *tip_text, + const gchar *tip_private) +{ + g_return_if_fail (GTK_IS_TOOLTIPS (tooltips)); + g_return_if_fail (widget != NULL); + + gtk_tooltips_set_tip_real (tooltips, widget, tip_text, tip_private, NULL); +} + +void +gtk_tooltips_set_tip_widget (GtkTooltips *tooltips, + GtkWidget *widget, + GtkWidget *tip_widget) +{ + g_return_if_fail (GTK_IS_TOOLTIPS (tooltips)); + g_return_if_fail (widget != NULL); + + gtk_tooltips_set_tip_real (tooltips, widget, NULL, NULL, tip_widget); +} + static gint gtk_tooltips_paint_window (GtkTooltips *tooltips) { @@ -399,6 +456,8 @@ GtkStyle *style; gint x, y, w, h; GtkTooltipsData *data; + GtkWidget *tip_widget; + GtkWidget *child; gboolean keyboard_mode; GdkScreen *screen; GdkScreen *pointer_screen; @@ -424,9 +483,24 @@ screen = gtk_widget_get_screen (widget); data = tooltips->active_tips_data; + tip_widget = gtk_tooltips_tip_widget_get (data->widget); - gtk_label_set_text (GTK_LABEL (tooltips->tip_label), data->tip_text); + if (tip_widget) + gtk_widget_set_name (tooltips->tip_window, "gtk-custom-tooltips"); + else + { + gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips"); + gtk_label_set_text (GTK_LABEL (tooltips->tip_label), data->tip_text); + tip_widget = tooltips->tip_label; + } + child = GTK_BIN (tooltips->tip_window)->child; + if (child) + gtk_container_remove (GTK_CONTAINER (tooltips->tip_window), child); + + gtk_container_add (GTK_CONTAINER (tooltips->tip_window), tip_widget); + gtk_widget_show (tip_widget); + gtk_widget_size_request (tooltips->tip_window, &requisition); w = requisition.width; h = requisition.height; --- gtk/gtktooltips.h.orig Wed Oct 27 13:26:39 2004 +++ gtk/gtktooltips.h Wed Oct 27 13:56:05 2004 @@ -97,7 +97,11 @@ GtkWidget *widget, const gchar *tip_text, const gchar *tip_private); +void gtk_tooltips_set_tip_widget (GtkTooltips *tooltips, + GtkWidget *widget, + GtkWidget *tip_widget); GtkTooltipsData* gtk_tooltips_data_get (GtkWidget *widget); +GtkWidget* gtk_tooltips_tip_widget_get (GtkWidget *widget); void gtk_tooltips_force_window (GtkTooltips *tooltips);
Attachment:
pgpkHiOMZWEU0.pgp
Description: PGP signature