aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-17 17:51:59 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-17 18:04:59 -0400
commit9524de2133b5d731987228e3eb297a990af6f2bc (patch)
treeb573ec9e57b4f437302a11af683863010b8aa2ae
parent40d1f48b1bfd7ca3bb5ba1dadaba9324cc080d0d (diff)
downloadrunes-9524de2133b5d731987228e3eb297a990af6f2bc.tar.gz
runes-9524de2133b5d731987228e3eb297a990af6f2bc.zip
and a bunch more leaks
-rw-r--r--display.c18
-rw-r--r--window-xlib.c13
2 files changed, 23 insertions, 8 deletions
diff --git a/display.c b/display.c
index 9a7640f..497f76a 100644
--- a/display.c
+++ b/display.c
@@ -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);
}