diff options
Diffstat (limited to 'calendar')
-rw-r--r-- | calendar/ChangeLog | 64 | ||||
-rw-r--r-- | calendar/gui/dialogs/alarm-page.c | 4 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 15 | ||||
-rw-r--r-- | calendar/gui/dialogs/delete-comp.c | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/event-editor.c | 1 | ||||
-rw-r--r-- | calendar/gui/dialogs/meeting-page.c | 7 | ||||
-rw-r--r-- | calendar/gui/dialogs/recurrence-page.c | 4 | ||||
-rw-r--r-- | calendar/gui/e-day-view-time-item.c | 71 | ||||
-rw-r--r-- | calendar/gui/e-day-view-top-item.c | 18 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 31 | ||||
-rw-r--r-- | calendar/gui/e-day-view.h | 2 | ||||
-rw-r--r-- | calendar/gui/e-week-view-event-item.c | 74 | ||||
-rw-r--r-- | calendar/gui/e-week-view-main-item.c | 25 | ||||
-rw-r--r-- | calendar/gui/e-week-view-titles-item.c | 12 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 99 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 2 | ||||
-rw-r--r-- | calendar/gui/itip-utils.c | 2 |
17 files changed, 308 insertions, 125 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 3667c6a1c5..ea31eb26c6 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,67 @@ +2003-01-25 Hans Petter Jansson <hpj@ximian.com> + + Mainly making all views use PangoLayouts for text. When drawing a + PangoLayout, the draw offset is the top left corner of the layout, + not the text's baseline. Keep this in mind when viewing the + changes. I'll be brief about the exact changes, since they speak + better for themselves. + + * gui/e-day-view-time-item.c (e_day_view_time_item_get_column_width): + Use Pango. + (e_day_view_time_item_draw): Use Pango. + + * gui/e-day-view-top-item.c (e_day_view_top_item_draw): Use Pango. + (e_day_view_top_item_draw_long_event): Add some FIXME text so we can + see when this is being used. Is it in use at all? + + * gui/e-day-view.c: No longer specify an explicit X font string for + the large font. Use the main font, and change the point size. + (e_day_view_init): Use Pango. + (e_day_view_style_set): Use Pango. Comment out the gdk_font setting + for the drag text items for now. + + * gui/e-day-view.h: Use Pango. + + * gui/e-week-view-event-item.c (e_week_view_draw_time): Use Pango. + + * gui/e-week-view-main-item.c (e_week_view_main_item_draw_day): + Use Pango. + + * gui/e-week-view-titles-item.c (e_week_view_titles_item_draw): + Use Pango. + + * gui/e-week-view.c: No longer specify an explicit X font string for + the small font. Use the main font, and change the point size. + (e_week_view_init): Use Pango. + (e_week_view_destroy): Use Pango. + (get_string_width): Implemented for convenience. + (get_digit_width): Implemented for convenience. + (e_week_view_style_set): Use Pango. + (e_week_view_recalc_cell_sizes): Use Pango. + (e_week_view_get_time_string_width): Use Pango. + + * gui/e-week-view.h: Use Pango. + + Following are some random UTF-8 fixes and a crash fix. + + * gui/itip-utils.c (comp_description): Use g_locale_to_utf8 (). + + * gui/dialogs/comp-editor.c (make_title_from_comp): Return a + UTF-8 string. + + * gui/dialogs/alarm-page.c (alarm_page_set_summary): Pass UTF-8 + directly to GTK. + + * gui/dialogs/delete-comp.c (delete_component_dialog): Ditto. + + * gui/dialogs/meeting-page.c (meeting_page_fill_widgets): Ditto. + (meeting_page_construct): Ditto. + + * gui/dialogs/recurrence-page.c (recurrence_page_set_summary): Ditto. + + * gui/dialogs/event-editor.c (event_editor_finalize): Fix crash caused + by gtk_object_destroy()-ing a non-GtkObject. + 2003-01-24 Hans Petter Jansson <hpj@ximian.com> * gui/e-day-view.c (e_day_view_on_editing_stopped): Don't insist diff --git a/calendar/gui/dialogs/alarm-page.c b/calendar/gui/dialogs/alarm-page.c index 8f303fce6f..1447f8aca8 100644 --- a/calendar/gui/dialogs/alarm-page.c +++ b/calendar/gui/dialogs/alarm-page.c @@ -620,9 +620,7 @@ alarm_page_set_summary (CompEditorPage *page, const char *summary) apage = ALARM_PAGE (page); priv = apage->priv; - s = e_utf8_to_gtk_string (priv->summary, summary); - gtk_label_set_text (GTK_LABEL (priv->summary), s); - g_free (s); + gtk_label_set_text (GTK_LABEL (priv->summary), summary); } /* set_dates handler for the alarm page */ diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 4b2e4fa882..61ce7e072e 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -768,7 +768,7 @@ comp_editor_get_cal_client (CompEditor *editor) static char * make_title_from_comp (CalComponent *comp) { - char *title; + char *title, *title_utf8; const char *type_string; CalComponentVType type; CalComponentText text; @@ -794,14 +794,15 @@ make_title_from_comp (CalComponent *comp) cal_component_get_summary (comp, &text); if (text.value) { - char *summary; - summary = e_utf8_to_locale_string (text.value); - title = g_strdup_printf (type_string, summary); - g_free (summary); - } else + title = g_strdup_printf (type_string, text.value); + } else { title = g_strdup_printf (type_string, _("No summary")); + } + + title_utf8 = g_locale_to_utf8 (title, -1, NULL, NULL, NULL); + g_free (title); - return title; + return title_utf8; } static const char * diff --git a/calendar/gui/dialogs/delete-comp.c b/calendar/gui/dialogs/delete-comp.c index 9b2621043a..995eed72d3 100644 --- a/calendar/gui/dialogs/delete-comp.c +++ b/calendar/gui/dialogs/delete-comp.c @@ -86,7 +86,7 @@ delete_component_dialog (CalComponent *comp, if (!consider_as_untitled) { cal_component_get_summary (comp, &summary); - tmp = e_utf8_to_gtk_string (widget, summary.value); + tmp = g_strdup (summary.value); } else tmp = NULL; diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index 758d3c03b4..57c6eac920 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -375,7 +375,6 @@ event_editor_finalize (GObject *object) g_object_unref((priv->meet_page)); g_object_unref((priv->sched_page)); - gtk_object_destroy (GTK_OBJECT (priv->model)); g_object_unref((priv->model)); if (G_OBJECT_CLASS (parent_class)->finalize) diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c index 3917ef18bd..6089af5707 100644 --- a/calendar/gui/dialogs/meeting-page.c +++ b/calendar/gui/dialogs/meeting-page.c @@ -344,9 +344,7 @@ meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp) string = g_strdup_printf ("%s <%s>", organizer.cn, strip); else string = g_strdup (strip); - s = e_utf8_to_gtk_string (priv->existing_organizer, string); - gtk_label_set_text (GTK_LABEL (priv->existing_organizer), s); - g_free (s); + gtk_label_set_text (GTK_LABEL (priv->existing_organizer), string); g_free (string); priv->existing = TRUE; @@ -744,8 +742,7 @@ meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm, ItipAddress *a = l->data; char *s; - s = e_utf8_to_gtk_string (GTK_COMBO (priv->organizer)->entry, a->full); - priv->address_strings = g_list_append (priv->address_strings, s); + priv->address_strings = g_list_append (priv->address_strings, g_strdup (a->full)); /* Note that the address specified by the backend gets * precedence over the default mail address. diff --git a/calendar/gui/dialogs/recurrence-page.c b/calendar/gui/dialogs/recurrence-page.c index f0defe7122..79c0224509 100644 --- a/calendar/gui/dialogs/recurrence-page.c +++ b/calendar/gui/dialogs/recurrence-page.c @@ -1930,9 +1930,7 @@ recurrence_page_set_summary (CompEditorPage *page, const char *summary) rpage = RECURRENCE_PAGE (page); priv = rpage->priv; - s = e_utf8_to_gtk_string (priv->summary, summary); - gtk_label_set_text (GTK_LABEL (priv->summary), s); - g_free (s); + gtk_label_set_text (GTK_LABEL (priv->summary), summary); } /* set_dates handler for the recurrence page */ diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c index 276c6062e4..b6e902e318 100644 --- a/calendar/gui/e-day-view-time-item.c +++ b/calendar/gui/e-day-view-time-item.c @@ -180,10 +180,12 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem) { EDayView *day_view; GtkStyle *style; - GdkFont *small_font, *large_font; + GdkFont *small_font; + PangoFontMetrics *large_font_metrics; gint digit, large_digit_width, max_large_digit_width = 0; gint max_suffix_width, max_minute_or_suffix_width; gint column_width_default, column_width_60_min_rows; + PangoContext *context; day_view = dvtmitem->day_view; g_return_val_if_fail (day_view != NULL, 0); @@ -192,11 +194,24 @@ e_day_view_time_item_get_column_width (EDayViewTimeItem *dvtmitem) g_return_val_if_fail (style != NULL, 0); small_font = gtk_style_get_font (style); g_return_val_if_fail (small_font != NULL, 0); - large_font = day_view->large_font; - g_return_val_if_fail (large_font != NULL, 0); + context = gtk_widget_get_pango_context (GTK_WIDGET (day_view)); + + /* Find the maximum width a digit can have. FIXME: We could use pango's + * approximation function, but I worry it won't be precise enough. Also + * it needs a language tag that I don't know where to get. */ for (digit = '0'; digit <= '9'; digit++) { - large_digit_width = gdk_char_width (large_font, digit); + PangoLayout *layout; + gchar digit_str [2]; + + digit_str [0] = digit; + digit_str [1] = '\0'; + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), digit_str); + pango_layout_set_font_description (layout, day_view->large_font_desc); + pango_layout_get_pixel_size (layout, &large_digit_width, NULL); + g_object_unref (layout); + max_large_digit_width = MAX (max_large_digit_width, large_digit_width); } @@ -245,7 +260,7 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, EDayView *day_view; EDayViewTimeItem *dvtmitem; GtkStyle *style; - GdkFont *small_font, *large_font; + GdkFont *small_font; GdkGC *fg_gc, *dark_gc; gchar buffer[64], *suffix; gint hour, display_hour, minute, row; @@ -254,6 +269,10 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, gint large_hour_x2, minute_x2; gint hour_width, minute_width, suffix_width; gint max_suffix_width, max_minute_or_suffix_width; + PangoLayout *layout; + PangoContext *context; + PangoFontDescription *small_font_desc; + PangoFontMetrics *large_font_metrics; dvtmitem = E_DAY_VIEW_TIME_ITEM (canvas_item); day_view = dvtmitem->day_view; @@ -261,7 +280,11 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, style = gtk_widget_get_style (GTK_WIDGET (day_view)); small_font = gtk_style_get_font (style); - large_font = day_view->large_font; + small_font_desc = style->font_desc; + + context = gtk_widget_get_pango_context (GTK_WIDGET (day_view)); + large_font_metrics = pango_context_get_metrics (context, day_view->large_font_desc, NULL); + fg_gc = style->fg_gc[GTK_STATE_NORMAL]; dark_gc = style->dark_gc[GTK_STATE_NORMAL]; @@ -302,16 +325,18 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, minute = day_view->first_minute_shown; /* The offset of the large hour string from the top of the row. */ - large_hour_y_offset = large_font->ascent + E_DVTMI_LARGE_HOUR_Y_PAD; + large_hour_y_offset = E_DVTMI_LARGE_HOUR_Y_PAD; /* The offset of the small time/minute string from top of row. */ - small_font_y_offset = small_font->ascent + E_DVTMI_SMALL_FONT_Y_PAD; + small_font_y_offset = E_DVTMI_SMALL_FONT_Y_PAD; /* Calculate the minimum y position of the first row we need to draw. This is normally one row height above the 0 position, but if we are using the large font we may have to go back a bit further. */ start_y = 0 - MAX (day_view->row_height, - large_hour_y_offset + large_font->descent); + (pango_font_metrics_get_ascent (large_font_metrics) + + pango_font_metrics_get_descent (large_font_metrics)) / PANGO_SCALE + + E_DVTMI_LARGE_HOUR_Y_PAD); /* Step through each row, drawing the times and the horizontal lines between them. */ @@ -349,10 +374,13 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, display_hour, suffix); } minute_width = gdk_string_width (small_font, buffer); - gdk_draw_string (drawable, small_font, fg_gc, + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + gdk_draw_layout (drawable, fg_gc, minute_x2 - minute_width, row_y + small_font_y_offset, - buffer); + layout); + g_object_unref (layout); } else { /* 5/10/15/30 minute intervals. */ @@ -366,12 +394,15 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, g_snprintf (buffer, sizeof (buffer), "%i", display_hour); - hour_width = gdk_string_width (large_font, - buffer); - gdk_draw_string (drawable, large_font, fg_gc, + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + pango_layout_set_font_description (layout, day_view->large_font_desc); + pango_layout_get_pixel_size (layout, &hour_width, NULL); + gdk_draw_layout (drawable, fg_gc, large_hour_x2 - hour_width, row_y + large_hour_y_offset, - buffer); + layout); + g_object_unref (layout); } else { /* Within the hour - draw a short line before the time. */ @@ -393,12 +424,14 @@ e_day_view_time_item_draw (GnomeCanvasItem *canvas_item, g_snprintf (buffer, sizeof (buffer), "%02i", minute); } - minute_width = gdk_string_width (small_font, - buffer); - gdk_draw_string (drawable, small_font, fg_gc, + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + pango_layout_get_pixel_size (layout, &minute_width, NULL); + gdk_draw_layout (drawable, fg_gc, minute_x2 - minute_width, row_y + small_font_y_offset, - buffer); + layout); + g_object_unref (layout); } } diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c index e35b08d830..0f7ce66124 100644 --- a/calendar/gui/e-day-view-top-item.c +++ b/calendar/gui/e-day-view-top-item.c @@ -171,6 +171,7 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, gint item_height, event_num; struct tm day_start = { 0 }; struct icaltimetype day_start_tt; + PangoLayout *layout; #if 0 g_print ("In e_day_view_top_item_draw %i,%i %ix%i\n", @@ -280,8 +281,13 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, date_width = gdk_string_width (font, buffer); date_x = day_view->day_offsets[day] + (day_view->day_widths[day] - date_width) / 2; - gdk_draw_string (drawable, font, fg_gc, - date_x - x, 3 + font->ascent - y, buffer); + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (day_view), buffer); + gdk_draw_layout (drawable, fg_gc, + date_x - x, + 3 - y, + layout); + g_object_unref (layout); gdk_gc_set_clip_rectangle (fg_gc, NULL); @@ -481,7 +487,11 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, item_y + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT + E_DAY_VIEW_LONG_EVENT_Y_PAD + font->ascent - y, +#if 0 buffer); +#else + "FIXME text"); +#endif gdk_gc_set_clip_rectangle (fg_gc, NULL); @@ -522,7 +532,11 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, time_x, item_y + E_DAY_VIEW_LONG_EVENT_Y_PAD + font->ascent + 1 - y, +#if 0 buffer); +#else + "FIXME text"); +#endif max_icon_x -= time_width + E_DAY_VIEW_LONG_EVENT_TIME_X_PAD; } diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 82097fc87d..ea293d7e2c 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -77,10 +77,7 @@ /* The minimum amount of space wanted on each side of the date string. */ #define E_DAY_VIEW_DATE_X_PAD 4 -#define E_DAY_VIEW_LARGE_FONT \ - "-adobe-utopia-regular-r-normal-*-*-240-*-*-p-*-iso8859-*" -#define E_DAY_VIEW_LARGE_FONT_FALLBACK \ - "-adobe-helvetica-bold-r-normal-*-*-240-*-*-p-*-iso8859-*" +#define E_DAY_VIEW_LARGE_FONT_PTSIZE 24 /* The offset from the top/bottom of the canvas before auto-scrolling starts.*/ #define E_DAY_VIEW_AUTO_SCROLL_OFFSET 16 @@ -607,7 +604,7 @@ e_day_view_init (EDayView *day_view) day_view->default_category = NULL; - day_view->large_font = NULL; + day_view->large_font_desc = NULL; /* String to use in 12-hour time format for times in the morning. */ day_view->am_string = _("am"); @@ -911,9 +908,9 @@ e_day_view_destroy (GtkObject *object) day_view->query = NULL; } - if (day_view->large_font) { - gdk_font_unref (day_view->large_font); - day_view->large_font = NULL; + if (day_view->large_font_desc) { + g_object_unref (day_view->large_font_desc); + day_view->large_font_desc = NULL; } if (day_view->default_category) { @@ -1106,6 +1103,7 @@ e_day_view_style_set (GtkWidget *widget, { EDayView *day_view; GdkFont *font; + PangoContext *context; gint top_rows, top_canvas_height; gint hour, max_large_hour_width; gint minute, max_minute_width, i; @@ -1123,14 +1121,13 @@ e_day_view_style_set (GtkWidget *widget, font = gtk_style_get_font (gtk_widget_get_style (widget)); /* Create the large font. */ - if (day_view->large_font != NULL) - gdk_font_unref (day_view->large_font); + if (day_view->large_font_desc != NULL) + g_object_unref (day_view->large_font_desc); - day_view->large_font = gdk_font_load (E_DAY_VIEW_LARGE_FONT); - if (!day_view->large_font) - day_view->large_font = gdk_font_load (E_DAY_VIEW_LARGE_FONT_FALLBACK); - if (!day_view->large_font) - day_view->large_font = font; + day_view->large_font_desc = + pango_font_description_copy (gtk_widget_get_style (widget)->font_desc); + pango_font_description_set_size (day_view->large_font_desc, + E_DAY_VIEW_LARGE_FONT_PTSIZE * PANGO_SCALE); /* Recalculate the height of each row based on the font size. */ day_view->row_height = font->ascent + font->descent + E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD * 2 + 2 /* FIXME */; @@ -1234,12 +1231,16 @@ e_day_view_style_set (GtkWidget *widget, e_day_view_foreach_event (day_view, e_day_view_set_event_font_cb, font); +#if 0 + /* FIXME: Port. */ + /* Set the fonts for the text items used when dragging. */ gnome_canvas_item_set (day_view->drag_long_event_item, "font_gdk", font, NULL); gnome_canvas_item_set (day_view->drag_item, "font_gdk", font, NULL); +#endif } diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index 0505e68d53..5419e336aa 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -361,7 +361,7 @@ struct _EDayView /* The large font used to display the hours. I don't think we need a fontset since we only display numbers. */ - GdkFont *large_font; + PangoFontDescription *large_font_desc; /* The GC used for painting in different colors. */ GdkGC *main_gc; diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c index 1cc1cbe637..10932d76cc 100644 --- a/calendar/gui/e-week-view-event-item.c +++ b/calendar/gui/e-week-view-event-item.c @@ -462,65 +462,91 @@ e_week_view_draw_time (EWeekView *week_view, { GtkStyle *style; GdkGC *gc; - GdkFont *font, *small_font; + GdkFont *font; gint hour_to_display, suffix_width; gint time_y_normal_font, time_y_small_font; gchar buffer[128], *suffix; + PangoLayout *layout; + PangoFontDescription *small_font_desc; style = gtk_widget_get_style (GTK_WIDGET (week_view)); font = gtk_style_get_font (style); - small_font = week_view->small_font; + small_font_desc = week_view->small_font_desc; gc = week_view->main_gc; gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]); - time_y_normal_font = time_y_small_font = time_y + font->ascent; - if (small_font) - time_y_small_font = time_y + small_font->ascent; + layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL); + + time_y_normal_font = time_y_small_font = time_y; + if (small_font_desc) + time_y_small_font = time_y; e_week_view_convert_time_to_display (week_view, hour, &hour_to_display, &suffix, &suffix_width); - if (week_view->use_small_font && week_view->small_font) { + if (week_view->use_small_font && week_view->small_font_desc) { g_snprintf (buffer, sizeof (buffer), "%2i:%02i", hour_to_display, minute); /* Draw the hour. */ - if (hour_to_display < 10) - gdk_draw_text (drawable, font, gc, - time_x + week_view->digit_width, - time_y_normal_font, buffer + 1, 1); - else - gdk_draw_text (drawable, font, gc, - time_x, time_y_normal_font, buffer, 2); + if (hour_to_display < 10) { + pango_layout_set_text (layout, buffer + 1, 1); + gdk_draw_layout (drawable, gc, + time_x + week_view->digit_width, + time_y_normal_font, + layout); + } else { + pango_layout_set_text (layout, buffer, 2); + gdk_draw_layout (drawable, gc, + time_x, + time_y_normal_font, + layout); + } time_x += week_view->digit_width * 2; /* Draw the start minute, in the small font. */ - gdk_draw_text (drawable, week_view->small_font, gc, - time_x, time_y_small_font, buffer + 3, 2); + pango_layout_set_font_description (layout, week_view->small_font_desc); + pango_layout_set_text (layout, buffer + 3, 2); + gdk_draw_layout (drawable, gc, + time_x, + time_y_small_font, + layout); + + pango_layout_set_font_description (layout, style->font_desc); time_x += week_view->small_digit_width * 2; /* Draw the 'am'/'pm' suffix, if 12-hour format. */ if (!week_view->use_24_hour_format) { - gdk_draw_string (drawable, font, gc, - time_x, time_y_normal_font, suffix); + pango_layout_set_text (layout, suffix, -1); + gdk_draw_layout (drawable, gc, + time_x, + time_y_normal_font, + layout); } } else { /* Draw the start time in one go. */ g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s", hour_to_display, minute, suffix); - if (hour_to_display < 10) - gdk_draw_string (drawable, font, gc, + if (hour_to_display < 10) { + pango_layout_set_text (layout, buffer + 1, -1); + gdk_draw_layout (drawable, gc, time_x + week_view->digit_width, - time_y_normal_font, buffer + 1); - else - gdk_draw_string (drawable, font, gc, - time_x, time_y_normal_font, - buffer); + time_y_normal_font, + layout); + } else { + pango_layout_set_text (layout, buffer, -1); + gdk_draw_layout (drawable, gc, + time_x, + time_y_normal_font, + layout); + } } + + g_object_unref (layout); } diff --git a/calendar/gui/e-week-view-main-item.c b/calendar/gui/e-week-view-main-item.c index d5d1e82d8b..e5fc58721d 100644 --- a/calendar/gui/e-week-view-main-item.c +++ b/calendar/gui/e-week-view-main-item.c @@ -211,6 +211,7 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, gchar buffer[128], *format_string; gint month, day_of_month, max_width; GdkColor *bg_color; + PangoLayout *layout; #if 0 g_print ("Drawing Day:%i at %i,%i\n", day, x, y); @@ -325,12 +326,6 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, format_string = _("%d %b"); } - g_date_strftime (buffer, sizeof (buffer), - format_string ? format_string : "%d", date); - date_width = gdk_string_width (font, buffer); - date_x = x + width - date_width - E_WEEK_VIEW_DATE_R_PAD; - date_x = MAX (date_x, x + 1); - if (selected) { gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]); } else if (week_view->multi_week_view) { @@ -347,10 +342,20 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, } else { gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); } - - gdk_draw_string (drawable, font, gc, - date_x, y + E_WEEK_VIEW_DATE_T_PAD + font->ascent, - buffer); + + g_date_strftime (buffer, sizeof (buffer), + format_string ? format_string : "%d", date); + + layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), buffer); + pango_layout_get_pixel_size (layout, &date_width, NULL); + date_x = x + width - date_width - E_WEEK_VIEW_DATE_R_PAD; + date_x = MAX (date_x, x + 1); + + gdk_draw_layout (drawable, gc, + date_x, + y + E_WEEK_VIEW_DATE_T_PAD, + layout); + g_object_unref (layout); /* Draw the line under the date. */ if (!week_view->multi_week_view) { diff --git a/calendar/gui/e-week-view-titles-item.c b/calendar/gui/e-week-view-titles-item.c index 2e2fe085ee..13faac1fce 100644 --- a/calendar/gui/e-week-view-titles-item.c +++ b/calendar/gui/e-week-view-titles-item.c @@ -153,6 +153,7 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, GdkRectangle clip_rect; gboolean long_format; gint weekday; + PangoLayout *layout; #if 0 g_print ("In e_week_view_titles_item_draw %i,%i %ix%i\n", @@ -171,6 +172,7 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, dark_gc = style->dark_gc[GTK_STATE_NORMAL]; canvas_width = GTK_WIDGET (canvas_item->canvas)->allocation.width; canvas_height = GTK_WIDGET (canvas_item->canvas)->allocation.height; + layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL); /* Draw the shadow around the dates. */ gdk_draw_line (drawable, light_gc, @@ -233,8 +235,12 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, date_x = week_view->col_offsets[col] + (week_view->col_widths[col] - date_width) / 2; date_x = MAX (date_x, week_view->col_offsets[col]); - gdk_draw_string (drawable, font, fg_gc, - date_x - x, 3 + font->ascent - y, buffer); + + pango_layout_set_text (layout, buffer, -1); + gdk_draw_layout (drawable, fg_gc, + date_x - x, + 3 - y, + layout); gdk_gc_set_clip_rectangle (fg_gc, NULL); @@ -271,6 +277,8 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, g_date_add_days (&date, 1); } + + g_object_unref (layout); } diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index aa8a2727d6..e92dbab6a7 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -72,10 +72,7 @@ #include "art/timezone-16.xpm" #include "art/jump.xpm" -#define E_WEEK_VIEW_SMALL_FONT \ - "-adobe-utopia-regular-r-normal-*-*-100-*-*-p-*-iso8859-*" -#define E_WEEK_VIEW_SMALL_FONT_FALLBACK \ - "-adobe-helvetica-medium-r-normal-*-*-80-*-*-p-*-iso8859-*" +#define E_WEEK_VIEW_SMALL_FONT_PTSIZE 7 #define E_WEEK_VIEW_JUMP_BUTTON_WIDTH 16 #define E_WEEK_VIEW_JUMP_BUTTON_HEIGHT 8 @@ -337,11 +334,11 @@ e_week_view_init (EWeekView *week_view) /* Create the small font. */ week_view->use_small_font = TRUE; - week_view->small_font = gdk_font_load (E_WEEK_VIEW_SMALL_FONT); - if (!week_view->small_font) - week_view->small_font = gdk_font_load (E_WEEK_VIEW_SMALL_FONT_FALLBACK); - if (!week_view->small_font) - week_view->use_small_font = FALSE; + + week_view->small_font_desc = + pango_font_description_copy (gtk_widget_get_style (GTK_WIDGET (week_view))->font_desc); + pango_font_description_set_size (week_view->small_font_desc, + E_WEEK_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE); /* String to use in 12-hour time format for times in the morning. */ week_view->am_string = _("am"); @@ -494,9 +491,9 @@ e_week_view_destroy (GtkObject *object) week_view->query = NULL; } - if (week_view->small_font) { - gdk_font_unref (week_view->small_font); - week_view->small_font = NULL; + if (week_view->small_font_desc) { + g_object_unref (week_view->small_font_desc); + week_view->small_font_desc = NULL; } if (week_view->default_category) { @@ -619,25 +616,62 @@ e_week_view_unrealize (GtkWidget *widget) (*GTK_WIDGET_CLASS (parent_class)->unrealize)(widget); } +static gint +get_string_width (PangoLayout *layout, const gchar *string) +{ + gint width; + + pango_layout_set_text (layout, string, -1); + pango_layout_get_pixel_size (layout, &width, NULL); + return width; +} + +/* FIXME: This is also needed in e-day-view-time-item.c. We should probably use + * pango's approximation function, but it needs a language tag. Find out how to + * get one of those properly. */ +static gint +get_digit_width (PangoLayout *layout) +{ + gint digit; + gint max_digit_width = 1; + + for (digit = '0'; digit <= '9'; digit++) { + gchar digit_char; + gint digit_width; + + digit_char = digit; + + pango_layout_set_text (layout, &digit_char, 1); + pango_layout_get_pixel_size (layout, &digit_width, NULL); + + max_digit_width = MAX (max_digit_width, digit_width); + } + + return max_digit_width; +} static void e_week_view_style_set (GtkWidget *widget, - GtkStyle *previous_style) + GtkStyle *previous_style) { EWeekView *week_view; EWeekViewEventSpan *span; GdkFont *font; + GtkStyle *style; gint day, day_width, max_day_width, max_abbr_day_width; gint month, month_width, max_month_width, max_abbr_month_width; gint span_num; GDate date; gchar buffer[128]; + PangoLayout *layout; if (GTK_WIDGET_CLASS (parent_class)->style_set) (*GTK_WIDGET_CLASS (parent_class)->style_set)(widget, previous_style); week_view = E_WEEK_VIEW (widget); - font = gtk_style_get_font (gtk_widget_get_style (widget)); + style = gtk_widget_get_style (widget); + font = gtk_style_get_font (style); + layout = gtk_widget_create_pango_layout (widget, NULL); /* Recalculate the height of each row based on the font size. */ week_view->row_height = font->ascent + font->descent + E_WEEK_VIEW_EVENT_BORDER_HEIGHT * 2 + E_WEEK_VIEW_EVENT_TEXT_Y_PAD * 2; @@ -645,8 +679,8 @@ e_week_view_style_set (GtkWidget *widget, /* Check that the small font is smaller than the default font. If it isn't, we won't use it. */ - if (week_view->small_font) { - if (font->ascent + font->descent <= week_view->small_font->ascent + week_view->small_font->descent) + if (week_view->small_font_desc) { + if (font->ascent + font->descent <= E_WEEK_VIEW_SMALL_FONT_PTSIZE) week_view->use_small_font = FALSE; } @@ -663,12 +697,12 @@ e_week_view_style_set (GtkWidget *widget, max_abbr_day_width = 0; for (day = 0; day < 7; day++) { g_date_strftime (buffer, 128, "%A", &date); - day_width = gdk_string_width (font, buffer); + day_width = get_string_width (layout, buffer); week_view->day_widths[day] = day_width; max_day_width = MAX (max_day_width, day_width); g_date_strftime (buffer, 128, "%a", &date); - day_width = gdk_string_width (font, buffer); + day_width = get_string_width (layout, buffer); week_view->abbr_day_widths[day] = day_width; max_abbr_day_width = MAX (max_abbr_day_width, day_width); @@ -681,30 +715,33 @@ e_week_view_style_set (GtkWidget *widget, g_date_set_month (&date, month + 1); g_date_strftime (buffer, 128, "%B", &date); - month_width = gdk_string_width (font, buffer); + month_width = get_string_width (layout, buffer); week_view->month_widths[month] = month_width; max_month_width = MAX (max_month_width, month_width); g_date_strftime (buffer, 128, "%b", &date); - month_width = gdk_string_width (font, buffer); + month_width = get_string_width (layout, buffer); week_view->abbr_month_widths[month] = month_width; max_abbr_month_width = MAX (max_abbr_month_width, month_width); } - week_view->space_width = gdk_string_width (font, " "); - week_view->colon_width = gdk_string_width (font, ":"); - week_view->slash_width = gdk_string_width (font, "/"); - week_view->digit_width = gdk_string_width (font, "5"); - if (week_view->small_font) - week_view->small_digit_width = gdk_string_width (week_view->small_font, "5"); + week_view->space_width = get_string_width (layout, " "); + week_view->colon_width = get_string_width (layout, ":"); + week_view->slash_width = get_string_width (layout, "/"); + week_view->digit_width = get_digit_width (layout); + if (week_view->small_font_desc) { + pango_layout_set_font_description (layout, week_view->small_font_desc); + week_view->small_digit_width = get_digit_width (layout); + pango_layout_set_font_description (layout, style->font_desc); + } week_view->max_day_width = max_day_width; week_view->max_abbr_day_width = max_abbr_day_width; week_view->max_month_width = max_month_width; week_view->max_abbr_month_width = max_abbr_month_width; - week_view->am_string_width = gdk_string_width (font, + week_view->am_string_width = get_string_width (layout, week_view->am_string); - week_view->pm_string_width = gdk_string_width (font, + week_view->pm_string_width = get_string_width (layout, week_view->pm_string); /* Set the font of all the EText items. */ @@ -719,6 +756,8 @@ e_week_view_style_set (GtkWidget *widget, NULL); } } + + g_object_unref (layout); } @@ -857,7 +896,7 @@ e_week_view_recalc_cell_sizes (EWeekView *week_view) time_width = e_week_view_get_time_string_width (week_view); week_view->time_format = E_WEEK_VIEW_TIME_NONE; - if (week_view->use_small_font && week_view->small_font) { + if (week_view->use_small_font && week_view->small_font_desc) { if (week_view->show_event_end_times && width / 2 > time_width * 2 + E_WEEK_VIEW_EVENT_TIME_SPACING) week_view->time_format = E_WEEK_VIEW_TIME_BOTH_SMALL_MIN; @@ -4088,7 +4127,7 @@ e_week_view_get_time_string_width (EWeekView *week_view) { gint time_width; - if (week_view->use_small_font && week_view->small_font) + if (week_view->use_small_font && week_view->small_font_desc) time_width = week_view->digit_width * 2 + week_view->small_digit_width * 2; else diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index abc0419815..f45ca7eb1d 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -270,7 +270,7 @@ struct _EWeekView gboolean use_small_font; /* Small font to display the minutes. */ - GdkFont *small_font; + PangoFontDescription *small_font_desc; /* The widths of various pieces of text, used to determine which of several date formats to display, set in e_week_view_style_set(). */ diff --git a/calendar/gui/itip-utils.c b/calendar/gui/itip-utils.c index 6bf95c9732..92e35e6209 100644 --- a/calendar/gui/itip-utils.c +++ b/calendar/gui/itip-utils.c @@ -580,7 +580,7 @@ comp_description (CalComponent *comp) if (start != NULL && end != NULL) { char *tmp, *tmp_utf; tmp = g_strdup_printf (_("Free/Busy information (%s to %s)"), start, end); - tmp_utf = e_utf8_from_locale_string (tmp); + tmp_utf = g_locale_to_utf8 (tmp, -1, NULL, NULL, NULL); description = CORBA_string_dup (tmp_utf); g_free (tmp_utf); g_free (tmp); |