Fix memleaks.

This commit is contained in:
Daiki Ueno
2011-03-03 12:37:39 +09:00
parent b8a01d794e
commit 8b632356e9
10 changed files with 40 additions and 29 deletions

View File

@ -103,6 +103,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
GtkStyle *style; GtkStyle *style;
GtkStateType state; GtkStateType state;
PangoContext *pcontext; PangoContext *pcontext;
EekColor *color;
pcontext = gtk_widget_get_pango_context (self); pcontext = gtk_widget_get_pango_context (self);
priv->renderer = eek_gtk_renderer_new (priv->keyboard, pcontext, self); priv->renderer = eek_gtk_renderer_new (priv->keyboard, pcontext, self);
@ -114,12 +115,13 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
style = gtk_widget_get_style (self); style = gtk_widget_get_style (self);
state = gtk_widget_get_state (self); state = gtk_widget_get_state (self);
eek_renderer_set_foreground color = color_from_gdk_color (&style->fg[state]);
(priv->renderer, eek_renderer_set_foreground (priv->renderer, color);
color_from_gdk_color (&style->fg[state])); eek_color_free (color);
eek_renderer_set_background
(priv->renderer, color = color_from_gdk_color (&style->bg[state]);
color_from_gdk_color (&style->bg[state])); eek_renderer_set_background (priv->renderer, color);
eek_color_free (color);
} }
eek_renderer_render_keyboard (priv->renderer, cr); eek_renderer_render_keyboard (priv->renderer, cr);
@ -336,14 +338,10 @@ eek_gtk_keyboard_new (EekKeyboard *keyboard)
static EekColor * static EekColor *
color_from_gdk_color (GdkColor *gdk_color) color_from_gdk_color (GdkColor *gdk_color)
{ {
EekColor *color; return eek_color_new (gdk_color->red / (gdouble)0xFFFF,
gdk_color->green / (gdouble)0xFFFF,
color = g_slice_new (EekColor); gdk_color->blue / (gdouble)0xFFFF,
color->red = gdk_color->red / (gdouble)0xFFFF; 1.0);
color->green = gdk_color->green / (gdouble)0xFFFF;
color->blue = gdk_color->blue / (gdouble)0xFFFF;
color->alpha = 1.0;
return color;
} }
static void static void

View File

@ -99,6 +99,7 @@ eek_gtk_renderer_real_render_key_icon (EekRenderer *self,
eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate); eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate);
surface = pixbuf_to_cairo_surface (pixbuf); surface = pixbuf_to_cairo_surface (pixbuf);
g_object_unref (pixbuf);
cairo_set_source_surface (cr, surface, 0.0, 0.0); cairo_set_source_surface (cr, surface, 0.0, 0.0);
cairo_paint (cr); cairo_paint (cr);
cairo_restore (cr); cairo_restore (cr);

View File

@ -775,6 +775,8 @@ eek_keyboard_add_outline (EekKeyboard *keyboard,
_outline = eek_outline_copy (outline); _outline = eek_outline_copy (outline);
g_array_append_val (priv->outline_array, *_outline); g_array_append_val (priv->outline_array, *_outline);
/* don't use eek_outline_free here, so as to keep _outline->points */
g_slice_free (EekOutline, _outline);
return priv->outline_array->len; return priv->outline_array->len;
} }

View File

@ -380,6 +380,7 @@ render_key (EekRenderer *self,
cairo_fill (cr); cairo_fill (cr);
eek_renderer_render_key_outline (self, cr, key, 1.0, 0); eek_renderer_render_key_outline (self, cr, key, 1.0, 0);
cairo_destroy (cr);
g_hash_table_insert (priv->outline_surface_cache, g_hash_table_insert (priv->outline_surface_cache,
outline, outline,
@ -493,6 +494,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
} }
pango_font_description_set_size (font, size * priv->scale * scale); pango_font_description_set_size (font, size * priv->scale * scale);
pango_layout_set_font_description (layout, font); pango_layout_set_font_description (layout, font);
pango_font_description_free (font);
pango_layout_set_text (layout, label, -1); pango_layout_set_text (layout, label, -1);
pango_layout_set_width (layout, pango_layout_set_width (layout,
PANGO_SCALE * bounds.width * priv->scale * scale); PANGO_SCALE * bounds.width * priv->scale * scale);
@ -617,6 +619,9 @@ eek_renderer_finalize (GObject *object)
{ {
EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object); EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
g_hash_table_destroy (priv->outline_surface_cache); g_hash_table_destroy (priv->outline_surface_cache);
eek_color_free (priv->foreground);
eek_color_free (priv->background);
pango_font_description_free (priv->font);
G_OBJECT_CLASS (eek_renderer_parent_class)->finalize (object); G_OBJECT_CLASS (eek_renderer_parent_class)->finalize (object);
} }
@ -658,12 +663,6 @@ eek_renderer_class_init (EekRendererClass *klass)
pspec); pspec);
} }
static void
free_surface (gpointer data)
{
cairo_surface_destroy (data);
}
static void static void
eek_renderer_init (EekRenderer *self) eek_renderer_init (EekRenderer *self)
{ {
@ -681,7 +680,7 @@ eek_renderer_init (EekRenderer *self)
g_hash_table_new_full (g_direct_hash, g_hash_table_new_full (g_direct_hash,
g_direct_equal, g_direct_equal,
NULL, NULL,
free_surface); (GDestroyNotify)cairo_surface_destroy);
priv->keyboard_surface = NULL; priv->keyboard_surface = NULL;
priv->symbol_index_changed_handler = 0; priv->symbol_index_changed_handler = 0;
} }
@ -941,7 +940,9 @@ eek_renderer_set_foreground (EekRenderer *renderer,
g_return_if_fail (foreground); g_return_if_fail (foreground);
priv = EEK_RENDERER_GET_PRIVATE(renderer); priv = EEK_RENDERER_GET_PRIVATE(renderer);
priv->foreground = g_boxed_copy (EEK_TYPE_COLOR, foreground); if (priv->foreground)
eek_color_free (priv->foreground);
priv->foreground = eek_color_copy (foreground);
} }
void void
@ -954,7 +955,9 @@ eek_renderer_set_background (EekRenderer *renderer,
g_return_if_fail (background); g_return_if_fail (background);
priv = EEK_RENDERER_GET_PRIVATE(renderer); priv = EEK_RENDERER_GET_PRIVATE(renderer);
priv->background = g_boxed_copy (EEK_TYPE_COLOR, background); if (priv->background)
eek_color_free (priv->background);
priv->background = eek_color_copy (background);
} }
void void

View File

@ -180,13 +180,13 @@ eek_outline_get_type (void)
} }
/* EekColor */ /* EekColor */
static EekColor * EekColor *
eek_color_copy (const EekColor *color) eek_color_copy (const EekColor *color)
{ {
return g_slice_dup (EekColor, color); return g_slice_dup (EekColor, color);
} }
static void void
eek_color_free (EekColor *color) eek_color_free (EekColor *color)
{ {
g_slice_free (EekColor, color); g_slice_free (EekColor, color);

View File

@ -250,6 +250,8 @@ EekColor *eek_color_new (gdouble red,
gdouble green, gdouble green,
gdouble blue, gdouble blue,
gdouble alpha); gdouble alpha);
EekColor *eek_color_copy (const EekColor *color);
void eek_color_free (EekColor *color);
G_END_DECLS G_END_DECLS
#endif /* EEK_TYPES_H */ #endif /* EEK_TYPES_H */

View File

@ -176,6 +176,7 @@ create_key (EekXkbLayout *layout,
} }
} }
oref = eek_keyboard_add_outline (keyboard, outline); oref = eek_keyboard_add_outline (keyboard, outline);
eek_outline_free (outline);
g_hash_table_insert (priv->shape_oref_hash, xkbshape, (gpointer)oref); g_hash_table_insert (priv->shape_oref_hash, xkbshape, (gpointer)oref);
} }

View File

@ -388,6 +388,8 @@ eekboard_context_new (GDBusConnection *connection,
context_name_vanished_callback, context_name_vanished_callback,
context, context,
NULL); NULL);
g_free (name_owner);
return context; return context;
} }
return NULL; return NULL;

View File

@ -162,6 +162,7 @@ eekboard_eekboard_new (GDBusConnection *connection,
eekboard_name_vanished_callback, eekboard_name_vanished_callback,
eekboard, eekboard,
NULL); NULL);
g_free (name_owner);
return eekboard; return eekboard;
} }

View File

@ -574,6 +574,7 @@ set_keyboard (EekboardDesktopClient *client,
keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++); keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name); eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
g_free (keyboard_name);
keyboard_id = eekboard_context_add_keyboard (client->context, keyboard_id = eekboard_context_add_keyboard (client->context,
client->keyboard, client->keyboard,