diff options
author | Dmitry Antipov <dmantipov@yandex.ru> | 2013-08-02 17:22:23 +0400 |
---|---|---|
committer | Dmitry Antipov <dmantipov@yandex.ru> | 2013-08-02 17:22:23 +0400 |
commit | 4b5c9326ce8f6b7856437cbbdbcccb415b38a5fc (patch) | |
tree | 797f94ac354fa4eaa7d3b8dc43590fa7824ddf0d | |
parent | 26bb8a7ceb23a748e35afbc895b54e8c1322298f (diff) | |
download | emacs-4b5c9326ce8f6b7856437cbbdbcccb415b38a5fc.tar.gz |
Fix X GC leak in GTK and raw (no toolkit) X ports.
* xterm.c (x_free_frame_resources): If white and black relief
GCs are allocated, always free them here.
* xfns.c (x_make_gc): Omit redundant initialization.
* widget.c (create_frame_gcs): Remove the leftover.
(EmacsFrameDestroy): Do nothing because all GCs are now freed
in x_free_frame_resources.
-rw-r--r-- | src/ChangeLog | 10 | ||||
-rw-r--r-- | src/widget.c | 34 | ||||
-rw-r--r-- | src/xfns.c | 4 | ||||
-rw-r--r-- | src/xterm.c | 13 |
4 files changed, 24 insertions, 37 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index dedbe08d914..2a511d2fc8a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2013-08-02 Dmitry Antipov <dmantipov@yandex.ru> + + Fix X GC leak in GTK and raw (no toolkit) X ports. + * xterm.c (x_free_frame_resources): If white and black relief + GCs are allocated, always free them here. + * xfns.c (x_make_gc): Omit redundant initialization. + * widget.c (create_frame_gcs): Remove the leftover. + (EmacsFrameDestroy): Do nothing because all GCs are now freed + in x_free_frame_resources. + 2013-08-02 Jan Djärv <jan.h.d@swipnet.se> * nsterm.m (windowWillResize:toSize:): Only change title if diff --git a/src/widget.c b/src/widget.c index e2c8e9fa23f..f66ec0b80ec 100644 --- a/src/widget.c +++ b/src/widget.c @@ -503,26 +503,6 @@ widget_update_wm_size_hints (Widget widget) update_wm_hints (ew); } - -#if 0 - -static void -create_frame_gcs (EmacsFrame ew) -{ - struct frame *s = ew->emacs_frame.frame; - - s->output_data.x->normal_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->reverse_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->cursor_gc - = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0); - s->output_data.x->black_relief.gc = 0; - s->output_data.x->white_relief.gc = 0; -} - -#endif /* 0 */ - static char setup_frame_cursor_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -683,19 +663,7 @@ EmacsFrameRealize (Widget widget, XtValueMask *mask, XSetWindowAttributes *attrs static void EmacsFrameDestroy (Widget widget) { - EmacsFrame ew = (EmacsFrame) widget; - struct frame* s = ew->emacs_frame.frame; - - if (! s) emacs_abort (); - if (! s->output_data.x) emacs_abort (); - - block_input (); - x_free_gcs (s); - if (s->output_data.x->white_relief.gc) - XFreeGC (XtDisplay (widget), s->output_data.x->white_relief.gc); - if (s->output_data.x->black_relief.gc) - XFreeGC (XtDisplay (widget), s->output_data.x->black_relief.gc); - unblock_input (); + /* All GCs are now freed in x_free_frame_resources. */ } static void diff --git a/src/xfns.c b/src/xfns.c index 642bdabb411..afae67d6327 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -2788,10 +2788,6 @@ x_make_gc (struct frame *f) | GCFillStyle | GCLineWidth), &gc_values); - /* Reliefs. */ - f->output_data.x->white_relief.gc = 0; - f->output_data.x->black_relief.gc = 0; - /* Create the gray border tile used when the pointer is not in the frame. Since this depends on the frame's pixel values, this must be done on a per-frame basis. */ diff --git a/src/xterm.c b/src/xterm.c index 83c6dd470d0..9f296d9a82e 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -9439,6 +9439,19 @@ x_free_frame_resources (struct frame *f) unload_color (f, f->output_data.x->black_relief.pixel); x_free_gcs (f); + + /* Free extra GCs allocated by x_setup_relief_colors. */ + if (f->output_data.x->white_relief.gc) + { + XFreeGC (dpyinfo->display, f->output_data.x->white_relief.gc); + f->output_data.x->white_relief.gc = 0; + } + if (f->output_data.x->black_relief.gc) + { + XFreeGC (dpyinfo->display, f->output_data.x->black_relief.gc); + f->output_data.x->black_relief.gc = 0; + } + XFlush (FRAME_X_DISPLAY (f)); } |