Fix memleaks.
This commit is contained in:
		@ -103,6 +103,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
 | 
			
		||||
        GtkStyle *style;
 | 
			
		||||
        GtkStateType state;
 | 
			
		||||
        PangoContext *pcontext;
 | 
			
		||||
        EekColor *color;
 | 
			
		||||
 | 
			
		||||
        pcontext = gtk_widget_get_pango_context (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);
 | 
			
		||||
        state = gtk_widget_get_state (self);
 | 
			
		||||
 | 
			
		||||
        eek_renderer_set_foreground
 | 
			
		||||
            (priv->renderer,
 | 
			
		||||
             color_from_gdk_color (&style->fg[state]));
 | 
			
		||||
        eek_renderer_set_background
 | 
			
		||||
            (priv->renderer,
 | 
			
		||||
             color_from_gdk_color (&style->bg[state]));
 | 
			
		||||
        color = color_from_gdk_color (&style->fg[state]);
 | 
			
		||||
        eek_renderer_set_foreground (priv->renderer, color);
 | 
			
		||||
        eek_color_free (color);
 | 
			
		||||
 | 
			
		||||
        color = 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);
 | 
			
		||||
@ -336,14 +338,10 @@ eek_gtk_keyboard_new (EekKeyboard *keyboard)
 | 
			
		||||
static EekColor *
 | 
			
		||||
color_from_gdk_color (GdkColor *gdk_color)
 | 
			
		||||
{
 | 
			
		||||
    EekColor *color;
 | 
			
		||||
 | 
			
		||||
    color = g_slice_new (EekColor);
 | 
			
		||||
    color->red = gdk_color->red / (gdouble)0xFFFF;
 | 
			
		||||
    color->green = gdk_color->green / (gdouble)0xFFFF;
 | 
			
		||||
    color->blue = gdk_color->blue / (gdouble)0xFFFF;
 | 
			
		||||
    color->alpha = 1.0;
 | 
			
		||||
    return color;
 | 
			
		||||
    return eek_color_new (gdk_color->red / (gdouble)0xFFFF,
 | 
			
		||||
                          gdk_color->green / (gdouble)0xFFFF,
 | 
			
		||||
                          gdk_color->blue / (gdouble)0xFFFF,
 | 
			
		||||
                          1.0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 | 
			
		||||
@ -99,6 +99,7 @@ eek_gtk_renderer_real_render_key_icon (EekRenderer *self,
 | 
			
		||||
 | 
			
		||||
    eek_renderer_apply_transformation_for_key (self, cr, key, scale, rotate);
 | 
			
		||||
    surface = pixbuf_to_cairo_surface (pixbuf);
 | 
			
		||||
    g_object_unref (pixbuf);
 | 
			
		||||
    cairo_set_source_surface (cr, surface, 0.0, 0.0);
 | 
			
		||||
    cairo_paint (cr);
 | 
			
		||||
    cairo_restore (cr);
 | 
			
		||||
 | 
			
		||||
@ -775,6 +775,8 @@ eek_keyboard_add_outline (EekKeyboard *keyboard,
 | 
			
		||||
 | 
			
		||||
    _outline = eek_outline_copy (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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -380,6 +380,7 @@ render_key (EekRenderer *self,
 | 
			
		||||
        cairo_fill (cr);
 | 
			
		||||
 | 
			
		||||
        eek_renderer_render_key_outline (self, cr, key, 1.0, 0);
 | 
			
		||||
        cairo_destroy (cr);
 | 
			
		||||
 | 
			
		||||
        g_hash_table_insert (priv->outline_surface_cache,
 | 
			
		||||
                             outline,
 | 
			
		||||
@ -493,6 +494,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
        }
 | 
			
		||||
    pango_font_description_set_size (font, size * priv->scale * scale);
 | 
			
		||||
    pango_layout_set_font_description (layout, font);
 | 
			
		||||
    pango_font_description_free (font);
 | 
			
		||||
    pango_layout_set_text (layout, label, -1);
 | 
			
		||||
    pango_layout_set_width (layout,
 | 
			
		||||
                            PANGO_SCALE * bounds.width * priv->scale * scale);
 | 
			
		||||
@ -617,6 +619,9 @@ eek_renderer_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
			
		||||
    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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -658,12 +663,6 @@ eek_renderer_class_init (EekRendererClass *klass)
 | 
			
		||||
                                     pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
free_surface (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
    cairo_surface_destroy (data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_renderer_init (EekRenderer *self)
 | 
			
		||||
{
 | 
			
		||||
@ -681,7 +680,7 @@ eek_renderer_init (EekRenderer *self)
 | 
			
		||||
        g_hash_table_new_full (g_direct_hash,
 | 
			
		||||
                               g_direct_equal,
 | 
			
		||||
                               NULL,
 | 
			
		||||
                               free_surface);
 | 
			
		||||
                               (GDestroyNotify)cairo_surface_destroy);
 | 
			
		||||
    priv->keyboard_surface = NULL;
 | 
			
		||||
    priv->symbol_index_changed_handler = 0;
 | 
			
		||||
}
 | 
			
		||||
@ -941,7 +940,9 @@ eek_renderer_set_foreground (EekRenderer *renderer,
 | 
			
		||||
    g_return_if_fail (foreground);
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
@ -954,7 +955,9 @@ eek_renderer_set_background (EekRenderer *renderer,
 | 
			
		||||
    g_return_if_fail (background);
 | 
			
		||||
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
@ -180,13 +180,13 @@ eek_outline_get_type (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EekColor */
 | 
			
		||||
static EekColor *
 | 
			
		||||
EekColor *
 | 
			
		||||
eek_color_copy (const EekColor *color)
 | 
			
		||||
{
 | 
			
		||||
    return g_slice_dup (EekColor, color);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
eek_color_free (EekColor *color)
 | 
			
		||||
{
 | 
			
		||||
    g_slice_free (EekColor, color);
 | 
			
		||||
 | 
			
		||||
@ -246,10 +246,12 @@ struct _EekColor
 | 
			
		||||
 | 
			
		||||
GType     eek_color_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
EekColor *eek_color_new      (gdouble red,
 | 
			
		||||
                              gdouble green,
 | 
			
		||||
                              gdouble blue,
 | 
			
		||||
                              gdouble alpha);
 | 
			
		||||
EekColor *eek_color_new      (gdouble         red,
 | 
			
		||||
                              gdouble         green,
 | 
			
		||||
                              gdouble         blue,
 | 
			
		||||
                              gdouble         alpha);
 | 
			
		||||
EekColor *eek_color_copy     (const EekColor *color);
 | 
			
		||||
void      eek_color_free     (EekColor       *color);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* EEK_TYPES_H */
 | 
			
		||||
 | 
			
		||||
@ -176,6 +176,7 @@ create_key (EekXkbLayout *layout,
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        oref = eek_keyboard_add_outline (keyboard, outline);
 | 
			
		||||
        eek_outline_free (outline);
 | 
			
		||||
        g_hash_table_insert (priv->shape_oref_hash, xkbshape, (gpointer)oref);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -388,6 +388,8 @@ eekboard_context_new (GDBusConnection *connection,
 | 
			
		||||
                                        context_name_vanished_callback,
 | 
			
		||||
                                        context,
 | 
			
		||||
                                        NULL);
 | 
			
		||||
        g_free (name_owner);
 | 
			
		||||
 | 
			
		||||
        return context;
 | 
			
		||||
    }
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
@ -162,6 +162,7 @@ eekboard_eekboard_new (GDBusConnection *connection,
 | 
			
		||||
                                        eekboard_name_vanished_callback,
 | 
			
		||||
                                        eekboard,
 | 
			
		||||
                                        NULL);
 | 
			
		||||
        g_free (name_owner);
 | 
			
		||||
 | 
			
		||||
        return eekboard;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -574,6 +574,7 @@ set_keyboard (EekboardDesktopClient *client,
 | 
			
		||||
 | 
			
		||||
    keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
 | 
			
		||||
    eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
 | 
			
		||||
    g_free (keyboard_name);
 | 
			
		||||
 | 
			
		||||
    keyboard_id = eekboard_context_add_keyboard (client->context,
 | 
			
		||||
                                                 client->keyboard,
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user