summaryrefslogtreecommitdiff
path: root/gtk/gtkcalendar.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkcalendar.c')
-rw-r--r--gtk/gtkcalendar.c213
1 files changed, 114 insertions, 99 deletions
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index 1f220bda4d..bc5708dfce 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -1155,20 +1155,20 @@ gtk_calendar_size_request (GtkWidget *widget,
{
GtkCalendar *calendar;
GtkCalendarPrivateData *private_data;
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
gint height;
gint i;
gchar buffer[255];
gint calendar_margin = CALENDAR_MARGIN;
gint header_width, main_width;
- gint lbearing;
- gint rbearing;
- gint ascent;
- gint descent;
- gint width;
+ gint max_header_height = 0;
calendar = GTK_CALENDAR (widget);
private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
+
+ layout = gtk_widget_create_pango_layout (widget);
/*
* Calculate the requisition width for the widget.
@@ -1181,17 +1181,21 @@ gtk_calendar_size_request (GtkWidget *widget,
private_data->max_month_width = 0;
for (i = 0; i < 12; i++)
{
+ pango_layout_set_text (layout, default_monthname[i], -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
private_data->max_month_width = MAX (private_data->max_month_width,
- gdk_string_measure (HEADER_FONT (widget),
- default_monthname[i]) + 8);
+ logical_rect.width / PANGO_SCALE + 8);
+ max_header_height = MAX (max_header_height, logical_rect.height / PANGO_SCALE);
}
private_data->max_year_width = 0;
for (i=0; i<10; i++)
{
sprintf (buffer, "%d%d%d%d", i,i,i,i);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
private_data->max_year_width = MAX (private_data->max_year_width,
- gdk_string_measure (HEADER_FONT (widget),
- buffer) + 8);
+ logical_rect.width / PANGO_SCALE + 8);
+ max_header_height = MAX (max_header_height, logical_rect.height / PANGO_SCALE);
}
}
else
@@ -1215,9 +1219,15 @@ gtk_calendar_size_request (GtkWidget *widget,
for (i = 0; i < 9; i++)
{
sprintf (buffer, "%d%d", i, i);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
private_data->min_day_width = MAX (private_data->max_day_char_width,
- gdk_string_measure (DAY_FONT (widget),
- buffer));
+ logical_rect.width / PANGO_SCALE);
+
+ private_data->max_day_char_ascent = MAX (private_data->max_label_char_ascent,
+ PANGO_ASCENT (logical_rect) / PANGO_SCALE);
+ private_data->max_day_char_descent = MAX (private_data->max_label_char_descent,
+ PANGO_DESCENT (logical_rect) / PANGO_SCALE);
}
/* We add one to max_day_char_width to be able to make the marked day "bold" */
private_data->max_day_char_width = private_data->min_day_width / 2 +1;
@@ -1225,19 +1235,14 @@ gtk_calendar_size_request (GtkWidget *widget,
if (calendar->display_flags & GTK_CALENDAR_SHOW_DAY_NAMES)
for (i = 0; i < 7; i++)
{
- gdk_text_extents (LABEL_FONT (widget),
- default_abbreviated_dayname[i],
- strlen(default_abbreviated_dayname[i]),
- &lbearing,
- &rbearing,
- &width,
- &ascent,
- &descent);
- private_data->min_day_width = MAX (private_data->min_day_width, width);
- private_data->max_label_char_ascent = MAX (private_data->max_label_char_ascent,
- ascent);
+ pango_layout_set_text (layout, default_abbreviated_dayname[i], -1);
+ pango_layout_line_get_extents (pango_layout_get_lines (layout)->data, NULL, &logical_rect);
+
+ private_data->min_day_width = MAX (private_data->min_day_width, logical_rect.width / PANGO_SCALE);
+ private_data->max_label_char_ascent = MAX (private_data->max_label_char_ascent,
+ PANGO_ASCENT (logical_rect) / PANGO_SCALE);
private_data->max_label_char_descent = MAX (private_data->max_label_char_descent,
- descent);
+ PANGO_DESCENT (logical_rect) / PANGO_SCALE);
}
private_data->max_week_char_width = 0;
@@ -1245,8 +1250,10 @@ gtk_calendar_size_request (GtkWidget *widget,
for (i = 0; i < 9; i++)
{
sprintf (buffer, "%d%d", i, i);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
private_data->max_week_char_width = MAX (private_data->max_week_char_width,
- gdk_string_measure (LABEL_FONT (widget), buffer) / 2);
+ logical_rect.width / PANGO_SCALE / 2);
}
main_width = (7 * (private_data->min_day_width + DAY_XPAD * 2) + (DAY_XSEP * 6) + CALENDAR_MARGIN * 2
@@ -1263,9 +1270,7 @@ gtk_calendar_size_request (GtkWidget *widget,
if (calendar->display_flags & GTK_CALENDAR_SHOW_HEADING)
{
- private_data->header_h = (HEADER_FONT (widget)->ascent
- + HEADER_FONT (widget)->descent
- + CALENDAR_YSEP * 2);
+ private_data->header_h = (max_header_height + CALENDAR_YSEP * 2);
}
else
{
@@ -1284,15 +1289,6 @@ gtk_calendar_size_request (GtkWidget *widget,
private_data->day_name_h = 0;
}
- gdk_text_extents (DAY_FONT (widget),
- "0123456789",
- 10,
- &lbearing,
- &rbearing,
- &width,
- &private_data->max_day_char_ascent,
- &private_data->max_day_char_descent);
-
private_data->main_h = (CALENDAR_MARGIN + calendar_margin
+ 6 * (private_data->max_day_char_ascent
+ private_data->max_day_char_descent
@@ -1317,6 +1313,8 @@ gtk_calendar_size_request (GtkWidget *widget,
+ private_data->main_h);
requisition->height = height + (widget->style->klass->ythickness + INNER_BORDER) * 2;
+
+ pango_layout_unref (layout);
}
static void
@@ -1529,12 +1527,13 @@ gtk_calendar_paint_header (GtkWidget *widget)
GtkCalendar *calendar;
GdkGC *gc;
char buffer[255];
- int y, y_arrow;
+ int x, y;
gint header_width, cal_height;
- gint str_width;
gint max_month_width;
gint max_year_width;
GtkCalendarPrivateData *private_data;
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
calendar = GTK_CALENDAR (widget);
private_data = GTK_CALENDAR_PRIVATE_DATA (widget);
@@ -1562,40 +1561,39 @@ gtk_calendar_paint_header (GtkWidget *widget)
0, 0, header_width, private_data->header_h);
+ layout = gtk_widget_create_pango_layout (widget);
+
+ sprintf (buffer, "%d", calendar->year);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
/* Draw title */
- y = private_data->header_h - (private_data->header_h
- - HEADER_FONT (widget)->ascent
- + HEADER_FONT (widget)->descent) / 2;
- y_arrow = (private_data->header_h - 9) / 2;
+ y = (private_data->header_h - logical_rect.height / PANGO_SCALE) / 2;
/* Draw year and its arrows */
- sprintf (buffer, "%d", calendar->year);
- str_width = gdk_string_measure (HEADER_FONT (widget), buffer);
- gdk_gc_set_foreground (gc, HEADER_FG_COLOR (GTK_WIDGET (calendar)));
+
if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
- gdk_draw_string (private_data->header_win, HEADER_FONT (widget), gc,
- header_width - (3 + max_year_width
- - (max_year_width - str_width)/2),
- y, buffer);
+ x = header_width - (3 + max_year_width
+ - (max_year_width - logical_rect.width / PANGO_SCALE)/2);
else
- gdk_draw_string (private_data->header_win, HEADER_FONT (widget), gc,
- header_width - (3 + private_data->arrow_width + max_year_width
- - (max_year_width - str_width)/2),
- y, buffer);
+ x = header_width - (3 + private_data->arrow_width + max_year_width
+ - (max_year_width - logical_rect.width / PANGO_SCALE)/2);
+
+
+ gdk_gc_set_foreground (gc, HEADER_FG_COLOR (GTK_WIDGET (calendar)));
+ gdk_draw_layout (private_data->header_win, gc, x, y, layout);
/* Draw month */
sprintf (buffer, "%s", default_monthname[calendar->month]);
- str_width = gdk_string_measure (HEADER_FONT (widget), buffer);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
if (calendar->display_flags & GTK_CALENDAR_NO_MONTH_CHANGE)
- gdk_draw_string (private_data->header_win, HEADER_FONT (widget), gc,
- 3 + (max_month_width - str_width) / 2,
- y, buffer);
+ x = 3 + (max_month_width - logical_rect.width / PANGO_SCALE) / 2;
else
- gdk_draw_string (private_data->header_win, HEADER_FONT (widget), gc,
- 3 + private_data->arrow_width + (max_month_width - str_width)/2,
- y, buffer);
-
- y += CALENDAR_YSEP + HEADER_FONT (widget)->descent;
+ x = 3 + private_data->arrow_width + (max_month_width - logical_rect.width / PANGO_SCALE)/2;
+
+ gdk_draw_layout (private_data->header_win, gc, x, y, layout);
gdk_gc_set_foreground (gc, BACKGROUND_COLOR (GTK_WIDGET (calendar)));
@@ -1603,7 +1601,8 @@ gtk_calendar_paint_header (GtkWidget *widget)
gtk_calendar_paint_arrow (widget, ARROW_MONTH_RIGHT);
gtk_calendar_paint_arrow (widget, ARROW_YEAR_LEFT);
gtk_calendar_paint_arrow (widget, ARROW_YEAR_RIGHT);
-
+
+ pango_layout_unref (layout);
}
static void
@@ -1616,7 +1615,8 @@ gtk_calendar_paint_day_names (GtkWidget *widget)
int day_width, cal_width;
gint cal_height;
int day_wid_sep;
- int str_width;
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
GtkCalendarPrivateData *private_data;
g_return_if_fail (widget != NULL);
@@ -1667,6 +1667,9 @@ gtk_calendar_paint_day_names (GtkWidget *widget)
/*
* Write the labels
*/
+
+ layout = gtk_widget_create_pango_layout (widget);
+
gdk_gc_set_foreground (gc, &widget->style->fg[GTK_STATE_SELECTED]);
for (i = 0; i < 7; i++)
{
@@ -1674,16 +1677,20 @@ gtk_calendar_paint_day_names (GtkWidget *widget)
if (calendar->display_flags & GTK_CALENDAR_WEEK_START_MONDAY)
day= (day+1)%7;
sprintf (buffer, "%s", default_abbreviated_dayname[day]);
- str_width = gdk_string_measure (LABEL_FONT (widget), buffer);
- gdk_draw_string (private_data->day_name_win, LABEL_FONT (widget),
- gc,
+
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
+ gdk_draw_layout (private_data->day_name_win, gc,
((private_data->week_width ? CALENDAR_XSEP : CALENDAR_MARGIN)
+ day_wid_sep * i
+ private_data->week_width
- + (day_width - str_width)/2),
- CALENDAR_MARGIN + DAY_YPAD
- + private_data->max_label_char_ascent, buffer);
+ + (day_width - logical_rect.width / PANGO_SCALE)/2),
+ CALENDAR_MARGIN + DAY_YPAD + private_data->max_label_char_ascent + logical_rect.y / PANGO_SCALE,
+ layout);
}
+
+ pango_layout_unref (layout);
}
static void
@@ -1694,8 +1701,10 @@ gtk_calendar_paint_week_numbers (GtkWidget *widget)
gint row, week = 0, year;
gint x_loc;
char buffer[3];
- gint y_baseline, day_height;
+ gint y_loc, day_height;
GtkCalendarPrivateData *private_data;
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
g_return_if_fail (widget != NULL);
g_return_if_fail (widget->window != NULL);
@@ -1743,6 +1752,8 @@ gtk_calendar_paint_week_numbers (GtkWidget *widget)
* Write the labels
*/
+ layout = gtk_widget_create_pango_layout (widget);
+
gdk_gc_set_foreground (gc, &widget->style->fg[GTK_STATE_SELECTED]);
day_height = row_height (calendar);
for (row = 0; row < 6; row++)
@@ -1750,28 +1761,25 @@ gtk_calendar_paint_week_numbers (GtkWidget *widget)
year = calendar->year;
if (calendar->day[row][6] < 15 && row > 3 && calendar->month == 11)
year++;
- y_baseline = (top_y_for_row (calendar, row)
- + (day_height + LABEL_FONT (widget)->ascent
- - LABEL_FONT (widget)->descent)/2);
+
g_return_if_fail (week_of_year (&week, &year,
((calendar->day[row][6] < 15 && row > 3 ? 1 : 0)
+ calendar->month) % 12 + 1, calendar->day[row][6]));
- x_loc= (private_data->week_width - (private_data->week_width - CALENDAR_XSEP
- - DAY_XPAD * 2 - CALENDAR_MARGIN ) / 2
- - private_data->max_week_char_width
- - CALENDAR_XSEP - DAY_XPAD);
-
- if (week > 9)
- {
- sprintf (buffer, "%d", week/10);
- gdk_draw_string (private_data->week_win, LABEL_FONT (widget), gc,
- x_loc, y_baseline , buffer);
- }
-
- sprintf (buffer, "%d", week%10);
- gdk_draw_string (private_data->week_win, LABEL_FONT (widget), gc,
- x_loc + private_data->max_week_char_width, y_baseline , buffer);
+
+ sprintf (buffer, "%d", week);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
+ y_loc = top_y_for_row (calendar, row) + (day_height - logical_rect.height / PANGO_SCALE) / 2;
+
+ x_loc = (private_data->week_width
+ - logical_rect.width / PANGO_SCALE
+ - CALENDAR_XSEP - DAY_XPAD);
+
+ gdk_draw_layout (private_data->week_win, gc, x_loc, y_loc, layout);
}
+
+ pango_layout_unref (layout);
}
static void
@@ -1816,9 +1824,11 @@ gtk_calendar_paint_day (GtkWidget *widget,
gint x_left;
gint x_loc;
gint y_top;
- gint y_baseline;
+ gint y_loc;
gint day_xspace;
GtkCalendarPrivateData *private_data;
+ PangoLayout *layout;
+ PangoRectangle logical_rect;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_CALENDAR (widget));
@@ -1847,7 +1857,6 @@ gtk_calendar_paint_day (GtkWidget *widget,
x_loc = x_left + private_data->day_width / 2 + private_data->max_day_char_width;
y_top = top_y_for_row (calendar, row);
- y_baseline = y_top + (day_height + private_data->max_day_char_ascent)/2;
gdk_window_clear_area (private_data->main_win, x_left, y_top,
private_data->day_width, day_height);
@@ -1891,17 +1900,21 @@ gtk_calendar_paint_day (GtkWidget *widget,
}
+ layout = gtk_widget_create_pango_layout (widget);
+
sprintf (buffer, "%d", day);
- x_loc -= gdk_string_measure (DAY_FONT (widget), buffer);
- sprintf (buffer, "%d", day);
- gdk_draw_string (private_data->main_win,
- DAY_FONT (widget), gc,
- x_loc, y_baseline, buffer);
+ pango_layout_set_text (layout, buffer, -1);
+ pango_layout_get_extents (layout, NULL, &logical_rect);
+
+ x_loc -= logical_rect.width / PANGO_SCALE;
+
+ y_loc = y_top + (day_height - logical_rect.height / PANGO_SCALE) / 2;
+ gdk_draw_layout (private_data->main_win, gc,
+ x_loc, y_loc, layout);
if (calendar->marked_date[day-1]
&& calendar->day_month[row][col] == MONTH_CURRENT)
- gdk_draw_string (private_data->main_win,
- DAY_FONT (widget), gc,
- x_loc-1, y_baseline, buffer);
+ gdk_draw_layout (private_data->main_win, gc,
+ x_loc-1, y_loc, layout);
if (GTK_WIDGET_HAS_FOCUS (calendar)
&& calendar->focus_row == row && calendar->focus_col == col)
@@ -1911,6 +1924,8 @@ gtk_calendar_paint_day (GtkWidget *widget,
private_data->day_width-1, day_height-1);
}
+ pango_layout_unref (layout);
+
}