Commit 4b5c9326 authored by Dmitry Antipov's avatar Dmitry Antipov

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.
parent 26bb8a7c
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
......
......@@ -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
......
......@@ -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. */
......
......@@ -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));
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment