mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-19 01:40:10 +00:00
calendar: Create one cairo_t per expose event and pass it around
This commit is contained in:
parent
ed996bcd68
commit
02572cdf7e
@ -2308,13 +2308,12 @@ gtk_calendar_size_allocate (GtkWidget *widget,
|
||||
****************************************/
|
||||
|
||||
static void
|
||||
calendar_paint_header (GtkCalendar *calendar)
|
||||
calendar_paint_header (GtkCalendar *calendar, cairo_t *cr)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar);
|
||||
GtkAllocation allocation;
|
||||
GtkStyle *style;
|
||||
cairo_t *cr;
|
||||
char buffer[255];
|
||||
int x, y;
|
||||
gint header_width;
|
||||
@ -2332,8 +2331,6 @@ calendar_paint_header (GtkCalendar *calendar)
|
||||
else
|
||||
year_left = !priv->year_before;
|
||||
|
||||
cr = gdk_cairo_create (priv->header_win);
|
||||
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
style = gtk_widget_get_style (widget);
|
||||
|
||||
@ -2342,9 +2339,9 @@ calendar_paint_header (GtkCalendar *calendar)
|
||||
max_month_width = priv->max_month_width;
|
||||
max_year_width = priv->max_year_width;
|
||||
|
||||
gtk_paint_shadow (style, priv->header_win,
|
||||
gtk_cairo_paint_shadow (style, cr,
|
||||
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
|
||||
NULL, widget, "calendar",
|
||||
widget, "calendar",
|
||||
0, 0, header_width, priv->header_h);
|
||||
|
||||
tmp_time = 1; /* Jan 1 1970, 00:00:01 UTC */
|
||||
@ -2413,16 +2410,15 @@ calendar_paint_header (GtkCalendar *calendar)
|
||||
pango_cairo_show_layout (cr, layout);
|
||||
|
||||
g_object_unref (layout);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_paint_day_names (GtkCalendar *calendar)
|
||||
calendar_paint_day_names (GtkCalendar *calendar,
|
||||
cairo_t *cr)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar);
|
||||
GtkAllocation allocation;
|
||||
cairo_t *cr;
|
||||
char buffer[255];
|
||||
int day,i;
|
||||
int day_width, cal_width;
|
||||
@ -2434,8 +2430,6 @@ calendar_paint_day_names (GtkCalendar *calendar)
|
||||
gint calendar_ysep = calendar_get_ysep (calendar);
|
||||
gint calendar_xsep = calendar_get_xsep (calendar);
|
||||
|
||||
cr = gdk_cairo_create (priv->day_name_win);
|
||||
|
||||
gtk_widget_style_get (GTK_WIDGET (widget),
|
||||
"focus-line-width", &focus_width,
|
||||
"focus-padding", &focus_padding,
|
||||
@ -2499,15 +2493,14 @@ calendar_paint_day_names (GtkCalendar *calendar)
|
||||
}
|
||||
|
||||
g_object_unref (layout);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_paint_week_numbers (GtkCalendar *calendar)
|
||||
calendar_paint_week_numbers (GtkCalendar *calendar,
|
||||
cairo_t *cr)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar);
|
||||
cairo_t *cr;
|
||||
|
||||
guint week = 0, year;
|
||||
gint row, x_loc, y_loc;
|
||||
@ -2519,8 +2512,6 @@ calendar_paint_week_numbers (GtkCalendar *calendar)
|
||||
gint focus_width;
|
||||
gint calendar_xsep = calendar_get_xsep (calendar);
|
||||
|
||||
cr = gdk_cairo_create (priv->week_win);
|
||||
|
||||
gtk_widget_style_get (GTK_WIDGET (widget),
|
||||
"focus-line-width", &focus_width,
|
||||
"focus-padding", &focus_padding,
|
||||
@ -2591,7 +2582,6 @@ calendar_paint_week_numbers (GtkCalendar *calendar)
|
||||
}
|
||||
|
||||
g_object_unref (layout);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2644,13 +2634,13 @@ is_color_attribute (PangoAttribute *attribute,
|
||||
|
||||
static void
|
||||
calendar_paint_day (GtkCalendar *calendar,
|
||||
gint row,
|
||||
gint col)
|
||||
cairo_t *cr,
|
||||
gint row,
|
||||
gint col)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (calendar);
|
||||
GtkStyle *style;
|
||||
cairo_t *cr;
|
||||
GdkColor *text_color;
|
||||
gchar *detail;
|
||||
gchar buffer[32];
|
||||
@ -2668,8 +2658,6 @@ calendar_paint_day (GtkCalendar *calendar,
|
||||
|
||||
style = gtk_widget_get_style (widget);
|
||||
|
||||
cr = gdk_cairo_create (priv->main_win);
|
||||
|
||||
day = priv->day[row][col];
|
||||
show_details = (priv->display_flags & GTK_CALENDAR_SHOW_DETAILS);
|
||||
|
||||
@ -2807,10 +2795,8 @@ calendar_paint_day (GtkCalendar *calendar,
|
||||
else
|
||||
state = GTK_STATE_NORMAL;
|
||||
|
||||
gtk_paint_focus (style,
|
||||
priv->main_win,
|
||||
state,
|
||||
NULL, widget, "calendar-day",
|
||||
gtk_cairo_paint_focus (style, cr,
|
||||
state, widget, "calendar-day",
|
||||
day_rect.x, day_rect.y,
|
||||
day_rect.width, day_rect.height);
|
||||
}
|
||||
@ -2821,18 +2807,18 @@ calendar_paint_day (GtkCalendar *calendar,
|
||||
priv->detail_overflow[row] &= ~(1 << col);
|
||||
|
||||
g_object_unref (layout);
|
||||
cairo_destroy (cr);
|
||||
g_free (detail);
|
||||
}
|
||||
|
||||
static void
|
||||
calendar_paint_main (GtkCalendar *calendar)
|
||||
calendar_paint_main (GtkCalendar *calendar,
|
||||
cairo_t *cr)
|
||||
{
|
||||
gint row, col;
|
||||
|
||||
for (col = 0; col < 7; col++)
|
||||
for (row = 0; row < 6; row++)
|
||||
calendar_paint_day (calendar, row, col);
|
||||
calendar_paint_day (calendar, cr, row, col);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2849,7 +2835,8 @@ calendar_invalidate_arrow (GtkCalendar *calendar,
|
||||
|
||||
static void
|
||||
calendar_paint_arrow (GtkCalendar *calendar,
|
||||
guint arrow)
|
||||
cairo_t *cr,
|
||||
guint arrow)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (calendar);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (widget);
|
||||
@ -2859,7 +2846,6 @@ calendar_paint_arrow (GtkCalendar *calendar,
|
||||
if (window)
|
||||
{
|
||||
GtkStyle *style;
|
||||
cairo_t *cr = gdk_cairo_create (window);
|
||||
gint width, height;
|
||||
gint state;
|
||||
|
||||
@ -2868,17 +2854,16 @@ calendar_paint_arrow (GtkCalendar *calendar,
|
||||
|
||||
gdk_cairo_set_source_color (cr, &style->bg[state]);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
|
||||
gdk_drawable_get_size (window, &width, &height);
|
||||
if (arrow == ARROW_MONTH_LEFT || arrow == ARROW_YEAR_LEFT)
|
||||
gtk_paint_arrow (style, window, state,
|
||||
GTK_SHADOW_OUT, NULL, widget, "calendar",
|
||||
gtk_cairo_paint_arrow (style, cr, state,
|
||||
GTK_SHADOW_OUT, widget, "calendar",
|
||||
GTK_ARROW_LEFT, TRUE,
|
||||
width/2 - 3, height/2 - 4, 8, 8);
|
||||
else
|
||||
gtk_paint_arrow (style, window, state,
|
||||
GTK_SHADOW_OUT, NULL, widget, "calendar",
|
||||
gtk_cairo_paint_arrow (style, cr, state,
|
||||
GTK_SHADOW_OUT, widget, "calendar",
|
||||
GTK_ARROW_RIGHT, TRUE,
|
||||
width/2 - 4, height/2 - 4, 8, 8);
|
||||
}
|
||||
@ -2890,40 +2875,45 @@ gtk_calendar_expose (GtkWidget *widget,
|
||||
{
|
||||
GtkCalendar *calendar = GTK_CALENDAR (widget);
|
||||
GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (widget);
|
||||
cairo_t *cr;
|
||||
int i;
|
||||
|
||||
if (gtk_widget_is_drawable (widget))
|
||||
{
|
||||
GdkWindow *window;
|
||||
|
||||
cr = gdk_cairo_create (event->window);
|
||||
gdk_cairo_region (cr, event->region);
|
||||
cairo_clip (cr);
|
||||
|
||||
if (event->window == priv->main_win)
|
||||
calendar_paint_main (calendar);
|
||||
calendar_paint_main (calendar, cr);
|
||||
|
||||
if (event->window == priv->header_win)
|
||||
calendar_paint_header (calendar);
|
||||
calendar_paint_header (calendar, cr);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
if (event->window == priv->arrow_win[i])
|
||||
calendar_paint_arrow (calendar, i);
|
||||
calendar_paint_arrow (calendar, cr, i);
|
||||
|
||||
if (event->window == priv->day_name_win)
|
||||
calendar_paint_day_names (calendar);
|
||||
calendar_paint_day_names (calendar, cr);
|
||||
|
||||
if (event->window == priv->week_win)
|
||||
calendar_paint_week_numbers (calendar);
|
||||
calendar_paint_week_numbers (calendar, cr);
|
||||
|
||||
window = gtk_widget_get_window (widget);
|
||||
if (event->window == window)
|
||||
{
|
||||
GtkAllocation allocation;
|
||||
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
gtk_paint_shadow (gtk_widget_get_style (widget),
|
||||
window,
|
||||
gtk_widget_get_state (widget),
|
||||
GTK_SHADOW_IN, NULL, widget, "calendar",
|
||||
0, 0, allocation.width, allocation.height);
|
||||
gtk_cairo_paint_shadow (gtk_widget_get_style (widget), cr,
|
||||
gtk_widget_get_state (widget), GTK_SHADOW_IN,
|
||||
widget, "calendar",
|
||||
0, 0,
|
||||
gtk_widget_get_allocated_width (widget),
|
||||
gtk_widget_get_allocated_height (widget));
|
||||
}
|
||||
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
Loading…
Reference in New Issue
Block a user