diff options
Diffstat (limited to 'gtk/gtktooltips.c')
-rw-r--r-- | gtk/gtktooltips.c | 187 |
1 files changed, 20 insertions, 167 deletions
diff --git a/gtk/gtktooltips.c b/gtk/gtktooltips.c index f8238a989c..1203ce652b 100644 --- a/gtk/gtktooltips.c +++ b/gtk/gtktooltips.c @@ -28,6 +28,7 @@ #include <string.h> #include <stdio.h> +#include "gtklabel.h" #include "gtkmain.h" #include "gtkwidget.h" #include "gtkwindow.h" @@ -51,8 +52,8 @@ static void gtk_tooltips_widget_remove (GtkWidget *widget, 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 gint gtk_tooltips_paint_window (GtkTooltips *tooltips); static void gtk_tooltips_draw_tips (GtkTooltips *tooltips); static GtkDataClass *parent_class; @@ -113,22 +114,10 @@ gtk_tooltips_new (void) } static void -gtk_tooltips_free_string (gpointer data, gpointer user_data) -{ - if (data) - g_free (data); -} - -static void gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata) { g_free (tooltipsdata->tip_text); g_free (tooltipsdata->tip_private); - if (tooltipsdata->row) - { - g_list_foreach (tooltipsdata->row, gtk_tooltips_free_string, 0); - g_list_free (tooltipsdata->row); - } gtk_signal_disconnect_by_data (GTK_OBJECT (tooltipsdata->widget), (gpointer) tooltipsdata); gtk_object_remove_data (GTK_OBJECT (tooltipsdata->widget), tooltips_data_key); @@ -178,6 +167,8 @@ gtk_tooltips_force_window (GtkTooltips *tooltips) gtk_widget_set_app_paintable (tooltips->tip_window, TRUE); gtk_window_set_policy (GTK_WINDOW (tooltips->tip_window), FALSE, FALSE, TRUE); gtk_widget_set_name (tooltips->tip_window, "gtk-tooltips"); + gtk_container_set_border_width (GTK_CONTAINER (tooltips->tip_window), 4); + gtk_signal_connect_object (GTK_OBJECT (tooltips->tip_window), "expose_event", GTK_SIGNAL_FUNC (gtk_tooltips_paint_window), @@ -187,6 +178,13 @@ gtk_tooltips_force_window (GtkTooltips *tooltips) GTK_SIGNAL_FUNC (gtk_tooltips_paint_window), GTK_OBJECT (tooltips)); + 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); + gtk_signal_connect (GTK_OBJECT (tooltips->tip_window), "destroy", gtk_widget_destroyed, @@ -194,103 +192,6 @@ gtk_tooltips_force_window (GtkTooltips *tooltips) } } -static void -gtk_tooltips_layout_text (GtkTooltips *tooltips, GtkTooltipsData *data) -{ - gchar *row_end, *text, *row_text, *break_pos; - gint i, row_width, window_width = 0; - size_t len; - - if (!tooltips->tip_window) - gtk_tooltips_force_window (tooltips); - - if (data->row) - { - g_list_foreach (data->row, gtk_tooltips_free_string, 0); - g_list_free (data->row); - } - data->row = 0; - data->font = tooltips->tip_window->style->font; - data->width = 0; - - text = data->tip_text; - if (!text) - return; - - while (*text) - { - row_end = strchr (text, '\n'); - if (!row_end) - row_end = strchr (text, '\0'); - - len = row_end - text + 1; - row_text = g_new(gchar, len); - memcpy (row_text, text, len - 1); - row_text[len - 1] = '\0'; - - /* now either adjust the window's width or shorten the row until - it fits in the window */ - - while (1) - { - row_width = gdk_string_width (data->font, row_text); - if (!window_width) - { - /* make an initial guess at window's width: */ - - if (row_width > gdk_screen_width () / 4) - window_width = gdk_screen_width () / 4; - else - window_width = row_width; - } - if (row_width <= window_width) - break; - - if (strchr (row_text, ' ')) - { - /* the row is currently too wide, but we have blanks in - the row so we can break it into smaller pieces */ - - gint avg_width = row_width / strlen (row_text); - - i = window_width; - if (avg_width) - i /= avg_width; - if ((size_t) i >= len) - i = len - 1; - - break_pos = strchr (row_text + i, ' '); - if (!break_pos) - { - break_pos = row_text + i; - while (*--break_pos != ' '); - } - *break_pos = '\0'; - } - else - { - /* we can't break this row into any smaller pieces, so - we have no choice but to widen the window: */ - - window_width = row_width; - break; - } - } - if (row_width > data->width) - data->width = row_width; - data->row = g_list_append (data->row, row_text); - text += strlen (row_text); - if (!*text) - break; - - if (text[0] == '\n' && text[1]) - /* end of paragraph and there is more text to come */ - data->row = g_list_append (data->row, 0); - ++text; /* skip blank or newline */ - } - data->width += 8; /* leave some border */ -} - void gtk_tooltips_enable (GtkTooltips *tooltips) { @@ -356,9 +257,6 @@ gtk_tooltips_set_tip (GtkTooltips *tooltips, tooltipsdata->tip_text = g_strdup (tip_text); tooltipsdata->tip_private = g_strdup (tip_private); - /* Flag data as unitialized */ - tooltipsdata->font = NULL; - tooltips->tips_data_list = g_list_append (tooltips->tips_data_list, tooltipsdata); gtk_signal_connect_after(GTK_OBJECT (widget), "event", @@ -396,54 +294,22 @@ gtk_tooltips_set_colors (GtkTooltips *tooltips, static gint gtk_tooltips_paint_window (GtkTooltips *tooltips) { - GtkStyle *style; - gint y, baseline_skip, gap; - GtkTooltipsData *data; - GList *el; - - style = tooltips->tip_window->style; - - gap = (style->font->ascent + style->font->descent) / 4; - if (gap < 2) - gap = 2; - baseline_skip = style->font->ascent + style->font->descent + gap; - - data = tooltips->active_tips_data; - if (!data) - return FALSE; - - gtk_paint_flat_box(style, tooltips->tip_window->window, + gtk_paint_flat_box(tooltips->tip_window->style, tooltips->tip_window->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, GTK_WIDGET(tooltips->tip_window), "tooltip", 0, 0, -1, -1); - y = style->font->ascent + 4; - - for (el = data->row; el; el = el->next) - { - if (el->data) - { - gtk_paint_string (style, tooltips->tip_window->window, - GTK_STATE_NORMAL, - NULL, GTK_WIDGET(tooltips->tip_window), "tooltip", - 4, y, el->data); - y += baseline_skip; - } - else - y += baseline_skip / 2; - } - - return FALSE; + return TRUE; } static void gtk_tooltips_draw_tips (GtkTooltips * tooltips) { + GtkRequisition requisition; GtkWidget *widget; GtkStyle *style; - gint gap, x, y, w, h, scr_w, scr_h, baseline_skip; + gint x, y, w, h, scr_w, scr_h; GtkTooltipsData *data; - GList *el; if (!tooltips->tip_window) gtk_tooltips_force_window (tooltips); @@ -460,30 +326,18 @@ gtk_tooltips_draw_tips (GtkTooltips * tooltips) data = tooltips->active_tips_data; - if (data->font != style->font) - gtk_tooltips_layout_text (tooltips, data); - - gap = (style->font->ascent + style->font->descent) / 4; - if (gap < 2) - gap = 2; - baseline_skip = style->font->ascent + style->font->descent + gap; + gtk_label_set_text (GTK_LABEL (tooltips->tip_label), data->tip_text); - w = data->width; - h = 8 - gap; - for (el = data->row; el; el = el->next) - if (el->data) - h += baseline_skip; - else - h += baseline_skip / 2; - if (h < 8) - h = 8; + gtk_widget_size_request (tooltips->tip_window, &requisition); + w = requisition.width; + h = requisition.height; gdk_window_get_pointer (NULL, &x, NULL, NULL); gdk_window_get_origin (widget->window, NULL, &y); if (GTK_WIDGET_NO_WINDOW (widget)) y += widget->allocation.y; - x -= ((w >> 1) + 4); + x -= (w / 2 + 4); if ((x + w) > scr_w) x -= (x + w) - scr_w; @@ -495,7 +349,6 @@ gtk_tooltips_draw_tips (GtkTooltips * tooltips) else y = y + widget->allocation.height + 4; - gtk_widget_set_usize (tooltips->tip_window, w, h); gtk_widget_popup (tooltips->tip_window, x, y); } |