Gtk code cleanups: Convert dense-cal from gdk_gc_* to cairo

This commit is contained in:
Geert Janssens 2015-09-03 15:45:46 +02:00
parent 5ffe52a03e
commit 3a99ca6791
3 changed files with 77 additions and 100 deletions

View File

@ -657,10 +657,10 @@ gnc_dense_cal_dispose (GObject *object)
dcal->transPopup = NULL; dcal->transPopup = NULL;
} }
if (dcal->drawbuf) if (dcal->surface)
{ {
g_object_unref(dcal->drawbuf); cairo_surface_destroy (dcal->surface);
dcal->drawbuf = NULL; dcal->surface = NULL;
} }
/* FIXME: we have a bunch of cleanup to do, here. */ /* FIXME: we have a bunch of cleanup to do, here. */
@ -720,13 +720,15 @@ gdc_reconfig(GncDenseCal *dcal)
GdkWindow *window; GdkWindow *window;
GtkAllocation alloc; GtkAllocation alloc;
if (dcal->drawbuf) if (dcal->surface)
g_object_unref(dcal->drawbuf); cairo_surface_destroy (dcal->surface);
widget = GTK_WIDGET(dcal->cal_drawing_area); widget = GTK_WIDGET(dcal->cal_drawing_area);
window = gtk_widget_get_window (widget); window = gtk_widget_get_window (widget);
gtk_widget_get_allocation (widget, &alloc); gtk_widget_get_allocation (widget, &alloc);
dcal->drawbuf = gdk_pixmap_new(window, alloc.width, alloc.height, -1); dcal->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
alloc.width,
alloc.height);
gnc_dense_cal_draw_to_buffer(dcal); gnc_dense_cal_draw_to_buffer(dcal);
} }
@ -868,7 +870,7 @@ gnc_dense_cal_expose(GtkWidget *widget,
gpointer user_data) gpointer user_data)
{ {
GncDenseCal *dcal; GncDenseCal *dcal;
GdkGC *gc; cairo_t *cr;
g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(widget != NULL, FALSE);
g_return_val_if_fail(GNC_IS_DENSE_CAL(user_data), FALSE); g_return_val_if_fail(GNC_IS_DENSE_CAL(user_data), FALSE);
@ -878,10 +880,10 @@ gnc_dense_cal_expose(GtkWidget *widget,
return FALSE; return FALSE;
dcal = GNC_DENSE_CAL(user_data); dcal = GNC_DENSE_CAL(user_data);
gc = gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state(widget)]; cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET(dcal->cal_drawing_area)));
gdk_draw_drawable(GDK_DRAWABLE(gtk_widget_get_window (GTK_WIDGET(dcal->cal_drawing_area))), cairo_set_source_surface (cr, dcal->surface, 0, 0);
gc, GDK_DRAWABLE(dcal->drawbuf), cairo_paint (cr);
0, 0, 0, 0, -1, -1); cairo_destroy (cr);
return TRUE; return TRUE;
} }
@ -893,40 +895,41 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
{ {
GtkWidget *widget; GtkWidget *widget;
GtkAllocation alloc; GtkAllocation alloc;
GdkColor color;
gint i; gint i;
int maxWidth; int maxWidth;
PangoLayout *layout; PangoLayout *layout;
GTimer *timer; GTimer *timer;
cairo_t *cr;
timer = g_timer_new(); timer = g_timer_new();
g_debug("drawing"); g_debug("drawing");
widget = GTK_WIDGET(dcal); widget = GTK_WIDGET(dcal);
if (!dcal->drawbuf) if (!dcal->surface)
return; return;
g_timer_start(timer); g_timer_start(timer);
cr = cairo_create (dcal->surface);
layout = gtk_widget_create_pango_layout(GTK_WIDGET(dcal), NULL); layout = gtk_widget_create_pango_layout(GTK_WIDGET(dcal), NULL);
LOG_AND_RESET(timer, "create_pango_layout"); LOG_AND_RESET(timer, "create_pango_layout");
gtk_widget_get_allocation (GTK_WIDGET(dcal->cal_drawing_area), &alloc); gtk_widget_get_allocation (GTK_WIDGET(dcal->cal_drawing_area), &alloc);
gdk_draw_rectangle(dcal->drawbuf, color = gtk_widget_get_style (widget)->white;
gtk_widget_get_style (widget)->white_gc, cairo_set_source_rgb (cr, color.red / 65535.0,
TRUE, color.green / 65535.0,
0, 0, color.blue / 65535.0);
alloc.width, cairo_rectangle (cr, 0, 0,
alloc.height); cairo_image_surface_get_width (dcal->surface),
cairo_image_surface_get_height (dcal->surface));
cairo_fill (cr);
/* Fill in alternating month colors. */ /* Fill in alternating month colors. */
{ {
gint i; gint i;
GdkGC *gc;
GdkRectangle *rect; GdkRectangle *rect;
GList *mcList, *mcListIter; GList *mcList, *mcListIter;
gc = gdk_gc_new(gtk_widget_get_window (GTK_WIDGET(dcal)));
gdk_gc_copy(gc, gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state(widget)]);
/* reset all of the month position offsets. */ /* reset all of the month position offsets. */
for (i = 0; i < 12; i++) for (i = 0; i < 12; i++)
{ {
@ -936,26 +939,26 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
/* Paint the weeks for the upcoming N months. */ /* Paint the weeks for the upcoming N months. */
for (i = 0; i < dcal->numMonths; i++) for (i = 0; i < dcal->numMonths; i++)
{ {
gdk_gc_set_foreground(gc, &dcal->weekColors[ i % 2 ]);
mcList = NULL; mcList = NULL;
month_coords(dcal, i, &mcList); month_coords(dcal, i, &mcList);
dcal->monthPositions[i].x dcal->monthPositions[i].x
= floor(i / dcal->monthsPerCol) = floor(i / dcal->monthsPerCol)
* (col_width(dcal) + COL_BORDER_SIZE); * (col_width(dcal) + COL_BORDER_SIZE);
dcal->monthPositions[i].y = ((GdkRectangle*)mcList->next->next->data)->y; dcal->monthPositions[i].y = ((GdkRectangle*)mcList->next->next->next->data)->y;
for (mcListIter = mcList; mcListIter != NULL; mcListIter = mcListIter->next) for (mcListIter = mcList; mcListIter != NULL; mcListIter = mcListIter->next)
{ {
rect = (GdkRectangle*)mcListIter->data; rect = (GdkRectangle*)mcListIter->data;
gdk_draw_rectangle(dcal->drawbuf, gc, color = dcal->weekColors[ i % 2 ];
TRUE, rect->x, rect->y, cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
cairo_rectangle (cr, rect->x, rect->y,
rect->width, rect->height); rect->width, rect->height);
cairo_fill (cr);
} }
g_list_foreach(mcList, free_rect, NULL); g_list_foreach(mcList, free_rect, NULL);
g_list_free(mcList); g_list_free(mcList);
} }
g_object_unref(gc);
} }
LOG_AND_RESET(timer, "alternating month colors"); LOG_AND_RESET(timer, "alternating month colors");
@ -963,49 +966,28 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
{ {
int i; int i;
int x1, x2, y1, y2; int x1, x2, y1, y2;
GdkColor markColor;
GdkGCValues current_values;
gdk_gc_get_values(gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], &current_values); gdk_color_parse(MARK_COLOR, &color);
gdk_colormap_alloc_color(gdk_colormap_get_system(), &color, TRUE, TRUE);
cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
gdk_color_parse(MARK_COLOR, &markColor);
gdk_colormap_alloc_color(gdk_colormap_get_system(), &markColor, TRUE, TRUE);
gdk_gc_set_foreground(gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], &markColor);
for (i = 0; i < dcal->numMarks; i++) for (i = 0; i < dcal->numMarks; i++)
{ {
if (dcal->marks[i] != NULL) if (dcal->marks[i] != NULL)
{ {
int w, h, x_offset, y_offset, circle_delta; int center_x, center_y, radius;
doc_coords(dcal, i, &x1, &y1, &x2, &y2); doc_coords(dcal, i, &x1, &y1, &x2, &y2);
w = x2 - x1; center_x = (x1 + x2 ) / 2;
h = y2 - y1; center_y = (y1 + y2 ) / 2;
radius = MIN((x2 - x1), (y2 - y1)) * .75;
x_offset = x1; cairo_arc (cr, center_x, center_y, radius, 0.0, 2 * M_PI);
y_offset = y1; cairo_fill (cr);
circle_delta = ABS(w - h) / 2;
if (w < h)
{
y_offset += circle_delta;
}
else
{
x_offset += circle_delta;
}
gdk_draw_arc(dcal->drawbuf,
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)],
TRUE,
x_offset, y_offset, MIN(w, h), MIN(w, h),
0 * 64,
360 * 64);
} }
} }
// reset to the previous foreground color.
gdk_gc_set_foreground(gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], &current_values.foreground);
} }
LOG_AND_RESET(timer, "marked days"); LOG_AND_RESET(timer, "marked days");
@ -1025,27 +1007,30 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
h = col_height(dcal); h = col_height(dcal);
/* draw the outside border [inside the month labels] */ /* draw the outside border [inside the month labels] */
gdk_draw_rectangle(dcal->drawbuf, color = gtk_widget_get_style (widget)->fg[gtk_widget_get_state (widget)];
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], cairo_set_line_width (cr, 1);
FALSE, x, y, w, h); cairo_set_source_rgb (cr, color.red / 65535.0,
color.green / 65535.0,
color.blue / 65535.0);
cairo_rectangle (cr, x + 0.5, y + 0.5, w, h);
cairo_stroke (cr);
/* draw the week seperations */ /* draw the week seperations */
for (j = 0; j < num_weeks_per_col(dcal); j++) for (j = 0; j < num_weeks_per_col(dcal); j++)
{ {
gint wy = y + (j * week_height(dcal)); gint wy = y + (j * week_height(dcal));
gdk_draw_line(dcal->drawbuf, cairo_move_to (cr, x, wy + 0.5);
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], cairo_line_to (cr, x + w, wy + 0.5);
x, wy, cairo_stroke (cr);
x + w, wy);
} }
/* draw the day seperations */ /* draw the day seperations */
for (j = 1; j < 7; j++) for (j = 1; j < 7; j++)
{ {
gint dx = x + (j * day_width(dcal)); gint dx = x + (j * day_width(dcal));
gdk_draw_line(dcal->drawbuf, cairo_move_to (cr, dx + 0.5, y);
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], cairo_line_to (cr, dx + 0.5, y + col_height(dcal));
dx, y, cairo_stroke (cr);
dx, y + col_height(dcal));
} }
/* draw the day labels */ /* draw the day labels */
@ -1070,10 +1055,12 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
- (day_label_width / 2); - (day_label_width / 2);
label_y_offset = y - dcal->dayLabelHeight; label_y_offset = y - dcal->dayLabelHeight;
pango_layout_set_text(layout, day_label_str, -1); pango_layout_set_text(layout, day_label_str, -1);
gdk_draw_layout(GDK_DRAWABLE(dcal->drawbuf), gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], color = gtk_widget_get_style (widget)->text[gtk_widget_get_state (widget)];
label_x_offset, label_y_offset, cairo_set_source_rgb (cr, color.red / 65535.0,
layout); color.green / 65535.0,
color.blue / 65535.0);
cairo_move_to (cr, label_x_offset, label_y_offset);
pango_cairo_show_layout (cr, layout);
} }
} }
} }
@ -1082,11 +1069,6 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
/* Month labels. */ /* Month labels. */
{ {
gint i; gint i;
PangoMatrix matrix = PANGO_MATRIX_INIT;
pango_matrix_rotate(&matrix, 90.);
pango_context_set_matrix(gtk_widget_get_pango_context(GTK_WIDGET(dcal)), &matrix);
for (i = 0; i < 12; i++) for (i = 0; i < 12; i++)
{ {
guint idx; guint idx;
@ -1095,16 +1077,15 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
break; break;
idx = (dcal->month - 1 + i) % 12; idx = (dcal->month - 1 + i) % 12;
pango_layout_set_text(layout, month_name(idx), -1); pango_layout_set_text(layout, month_name(idx), -1);
gdk_draw_layout(GDK_DRAWABLE(dcal->drawbuf),
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)],
dcal->leftPadding + dcal->monthPositions[i].x,
dcal->monthPositions[i].y,
layout);
}
// reset rotation cairo_save (cr);
pango_matrix_rotate(&matrix, -90.); cairo_translate (cr, dcal->leftPadding + dcal->monthPositions[i].x,
pango_context_set_matrix(gtk_widget_get_pango_context(GTK_WIDGET(dcal)), &matrix); dcal->monthPositions[i].y);
cairo_move_to (cr, 0, 0);
cairo_rotate (cr, -G_PI / 2.);
pango_cairo_show_layout (cr, layout);
cairo_restore (cr);
}
} }
LOG_AND_RESET(timer, "month labels"); LOG_AND_RESET(timer, "month labels");
@ -1128,11 +1109,9 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
pango_layout_get_pixel_size(layout, &numW, &numH); pango_layout_get_pixel_size(layout, &numW, &numH);
w = (x2 - x1) + 1; w = (x2 - x1) + 1;
h = (y2 - y1) + 1; h = (y2 - y1) + 1;
gdk_draw_layout(GDK_DRAWABLE(dcal->drawbuf), cairo_move_to (cr, x1 + (w / 2) - (numW / 2),
gtk_widget_get_style (widget)->fg_gc[gtk_widget_get_state (widget)], y1 + (h / 2) - (numH / 2));
x1 + (w / 2) - (numW / 2), pango_cairo_show_layout (cr, layout);
y1 + (h / 2) - (numH / 2),
layout);
} }
} }
LOG_AND_RESET(timer, "dates"); LOG_AND_RESET(timer, "dates");
@ -1147,6 +1126,7 @@ gnc_dense_cal_draw_to_buffer(GncDenseCal *dcal)
LOG_AND_RESET(timer, "queue draw"); LOG_AND_RESET(timer, "queue draw");
g_object_unref(layout); g_object_unref(layout);
cairo_destroy (cr);
g_timer_destroy(timer); g_timer_destroy(timer);
} }

View File

@ -58,7 +58,7 @@ struct _GncDenseCal
GtkComboBox *view_options; GtkComboBox *view_options;
GtkDrawingArea *cal_drawing_area; GtkDrawingArea *cal_drawing_area;
GdkPixmap *drawbuf; cairo_surface_t *surface;
gboolean initialized; gboolean initialized;

View File

@ -261,8 +261,6 @@ gnc_plugin_page_sx_list_init (GncPluginPageSxList *plugin_page)
gnc_plugin_page_sx_list_n_actions, gnc_plugin_page_sx_list_n_actions,
plugin_page); plugin_page);
/* gnc_plugin_init_short_names (action_group, toolbar_labels); */ /* gnc_plugin_init_short_names (action_group, toolbar_labels); */
gnc_gobject_tracking_remember (G_OBJECT (plugin_page),
G_OBJECT_CLASS (klass));
} }
@ -301,7 +299,6 @@ gnc_plugin_page_sx_list_finalize (GObject *object)
g_return_if_fail(GNC_IS_PLUGIN_PAGE_SX_LIST (page)); g_return_if_fail(GNC_IS_PLUGIN_PAGE_SX_LIST (page));
priv = GNC_PLUGIN_PAGE_SX_LIST_GET_PRIVATE(page); priv = GNC_PLUGIN_PAGE_SX_LIST_GET_PRIVATE(page);
g_return_if_fail(priv != NULL); g_return_if_fail(priv != NULL);
gnc_gobject_tracking_forget (G_OBJECT (page));
G_OBJECT_CLASS (parent_class)->finalize (object); G_OBJECT_CLASS (parent_class)->finalize (object);
} }