diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-17 17:51:59 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-17 18:04:59 -0400 |
commit | 9524de2133b5d731987228e3eb297a990af6f2bc (patch) | |
tree | b573ec9e57b4f437302a11af683863010b8aa2ae | |
parent | 40d1f48b1bfd7ca3bb5ba1dadaba9324cc080d0d (diff) | |
download | runes-9524de2133b5d731987228e3eb297a990af6f2bc.tar.gz runes-9524de2133b5d731987228e3eb297a990af6f2bc.zip |
and a bunch more leaks
-rw-r--r-- | display.c | 18 | ||||
-rw-r--r-- | window-xlib.c | 13 |
2 files changed, 23 insertions, 8 deletions
@@ -36,6 +36,7 @@ void runes_display_set_window_size(RunesTerm *t) { int width, height; cairo_t *old_cr = NULL; + cairo_surface_t *surface; runes_window_backend_get_size(t, &width, &height); @@ -56,10 +57,10 @@ void runes_display_set_window_size(RunesTerm *t) * occurred for some reason. should look into this, because i think * create_similar_image does things that are more efficient (using some * xlib shm stuff) */ - t->cr = cairo_create( - cairo_image_surface_create( - CAIRO_FORMAT_RGB24, - t->xpixel, t->ypixel)); + surface = cairo_image_surface_create( + CAIRO_FORMAT_RGB24, t->xpixel, t->ypixel); + t->cr = cairo_create(surface); + cairo_surface_destroy(surface); cairo_set_source(t->cr, t->fgcolor); cairo_set_scaled_font(t->cr, t->font); @@ -195,6 +196,7 @@ void runes_display_delete_characters(RunesTerm *t, int count) cairo_pattern_set_matrix(pattern, &matrix); runes_display_paint_rectangle( t, t->cr, pattern, t->col, t->row, t->cols - t->col - count, 1); + cairo_pattern_destroy(pattern); cairo_pop_group_to_source(t->cr); cairo_paint(t->cr); runes_display_paint_rectangle( @@ -365,6 +367,7 @@ void runes_display_scroll_up(RunesTerm *t, int rows) t, t->cr, pattern, 0, t->scroll_top + rows, t->cols, t->scroll_bottom - t->scroll_top + 1 - rows); + cairo_pattern_destroy(pattern); cairo_pop_group_to_source(t->cr); cairo_paint(t->cr); runes_display_paint_rectangle( @@ -374,6 +377,12 @@ void runes_display_scroll_up(RunesTerm *t, int rows) void runes_display_cleanup(RunesTerm *t) { + int i; + + for (i = 0; i < 8; ++i) { + cairo_pattern_destroy(t->colors[i]); + } + cairo_pattern_destroy(t->cursorcolor); cairo_destroy(t->cr); } @@ -444,6 +453,7 @@ static void runes_display_scroll_down(RunesTerm *t, int rows) runes_display_paint_rectangle( t, t->cr, pattern, 0, t->scroll_top, t->cols, t->scroll_bottom - t->scroll_top); + cairo_pattern_destroy(pattern); cairo_pop_group_to_source(t->cr); cairo_paint(t->cr); runes_display_paint_rectangle( diff --git a/window-xlib.c b/window-xlib.c index babf365..1842ff4 100644 --- a/window-xlib.c +++ b/window-xlib.c @@ -98,6 +98,7 @@ void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]) Cursor cursor; XColor cursor_fg, cursor_bg; Visual *vis; + cairo_surface_t *surface; wm_hints.flags = InputHint | StateHint; wm_hints.input = True; @@ -157,10 +158,10 @@ void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]) XDefineCursor(w->dpy, w->w, cursor); vis = DefaultVisual(w->dpy, DefaultScreen(w->dpy)); - t->backend_cr = cairo_create( - cairo_xlib_surface_create( - w->dpy, w->w, vis, - normal_hints.base_width, normal_hints.base_height)); + surface = cairo_xlib_surface_create( + w->dpy, w->w, vis, normal_hints.base_width, normal_hints.base_height); + t->backend_cr = cairo_create(surface); + cairo_surface_destroy(surface); XMapWindow(w->dpy, w->w); } @@ -274,6 +275,7 @@ void runes_window_backend_cleanup(RunesTerm *t) RunesWindowBackend *w = &t->w; XIM im; + cairo_destroy(t->backend_cr); im = XIMOfIC(w->ic); XDestroyIC(w->ic); XCloseIM(im); @@ -415,6 +417,7 @@ static void runes_window_backend_process_event(uv_work_t *req, int status) white = cairo_pattern_create_rgb(1.0, 1.0, 1.0); cairo_set_source(t->backend_cr, white); cairo_paint(t->backend_cr); + cairo_pattern_destroy(white); cairo_surface_flush(cairo_get_target(t->backend_cr)); XFlush(w->dpy); nanosleep(&tm, NULL); @@ -496,6 +499,7 @@ static void runes_window_backend_set_urgent(RunesTerm *t) hints = XGetWMHints(t->w.dpy, t->w.w); hints->flags |= XUrgencyHint; XSetWMHints(t->w.dpy, t->w.w, hints); + XFree(hints); } static void runes_window_backend_clear_urgent(RunesTerm *t) @@ -505,4 +509,5 @@ static void runes_window_backend_clear_urgent(RunesTerm *t) hints = XGetWMHints(t->w.dpy, t->w.w); hints->flags &= ~XUrgencyHint; XSetWMHints(t->w.dpy, t->w.w, hints); + XFree(hints); } |