summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2013-08-02 17:22:23 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2013-08-02 17:22:23 +0400
commit4b5c9326ce8f6b7856437cbbdbcccb415b38a5fc (patch)
tree797f94ac354fa4eaa7d3b8dc43590fa7824ddf0d
parent26bb8a7ceb23a748e35afbc895b54e8c1322298f (diff)
downloademacs-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/ChangeLog10
-rw-r--r--src/widget.c34
-rw-r--r--src/xfns.c4
-rw-r--r--src/xterm.c13
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));
}