# HG changeset patch # User Stefan Monnier # Date 1263617377 18000 # Node ID 982abebe98abab868d63ccb897db00d6c5544af0 # Parent 4cf58c2379f45f53b072581b21a9b0fcc92f0ddb (x_term_init): Instead of inhibiting GC while running Lisp code, link the new kboard into all_kboard before running Lisp code, and protect the new terminal with GCPRO (Bug#5365). (x_term_init): Remove unused var `atom'. (x_delete_display, x_delete_terminal): Remove unused var `i'. diff -r 4cf58c2379f4 -r 982abebe98ab src/ChangeLog --- a/src/ChangeLog Fri Jan 15 18:51:50 2010 -0800 +++ b/src/ChangeLog Fri Jan 15 23:49:37 2010 -0500 @@ -1,3 +1,11 @@ +2010-01-16 Stefan Monnier + + * xterm.c (x_term_init): Instead of inhibiting GC while running Lisp + code, link the new kboard into all_kboard before running Lisp code, + and protect the new terminal with GCPRO (Bug#5365). + (x_term_init): Remove unused var `atom'. + (x_delete_display, x_delete_terminal): Remove unused var `i'. + 2010-01-15 Jan Djärv * xfns.c (x_get_current_desktop, x_get_desktop_workarea): New functions. diff -r 4cf58c2379f4 -r 982abebe98ab src/xterm.c --- a/src/xterm.c Fri Jan 15 18:51:50 2010 -0800 +++ b/src/xterm.c Fri Jan 15 23:49:37 2010 -0500 @@ -9821,7 +9821,7 @@ { Pixmap icon_pixmap, icon_mask; -#ifndef USE_X_TOOLKIT +#if !defined USE_X_TOOLKIT && !defined USE_GTK Window window = FRAME_OUTER_WINDOW (f); #endif @@ -10076,7 +10076,6 @@ int argc; char *argv[NUM_ARGV]; char **argv2 = argv; - GdkAtom atom; guint id; #ifndef HAVE_GTK_MULTIDISPLAY if (!EQ (Vinitial_window_system, Qx)) @@ -10215,25 +10214,36 @@ terminal->kboard = (KBOARD *) xmalloc (sizeof (KBOARD)); init_kboard (terminal->kboard); terminal->kboard->Vwindow_system = Qx; + + /* Add the keyboard to the list before running Lisp code (via + Qvendor_specific_keysyms below), since these are not traced + via terminals but only through all_kboards. */ + terminal->kboard->next_kboard = all_kboards; + all_kboards = terminal->kboard; + if (!EQ (XSYMBOL (Qvendor_specific_keysyms)->function, Qunbound)) { char *vendor = ServerVendor (dpy); - /* Temporarily hide the partially initialized terminal, - but make sure it doesn't get garbage collected. */ - int count = inhibit_garbage_collection (); + + /* Protect terminal from GC before removing it from the + list of terminals. */ + struct gcpro gcpro1; + Lisp_Object gcpro_term; + XSETTERMINAL (gcpro_term, terminal); + GCPRO1 (gcpro_term); + + /* Temporarily hide the partially initialized terminal. */ terminal_list = terminal->next_terminal; UNBLOCK_INPUT; terminal->kboard->Vsystem_key_alist = call1 (Qvendor_specific_keysyms, vendor ? build_string (vendor) : empty_unibyte_string); BLOCK_INPUT; - unbind_to (count, Qnil); terminal->next_terminal = terminal_list; terminal_list = terminal; + UNGCPRO; } - terminal->kboard->next_kboard = all_kboards; - all_kboards = terminal->kboard; /* Don't let the initial kboard remain current longer than necessary. That would cause problems if a file loaded on startup tries to prompt in the mini-buffer. */ @@ -10582,7 +10592,6 @@ x_delete_display (dpyinfo) struct x_display_info *dpyinfo; { - int i; struct terminal *t; /* Close all frames and delete the generic struct terminal for this @@ -10734,7 +10743,6 @@ x_delete_terminal (struct terminal *terminal) { struct x_display_info *dpyinfo = terminal->display_info.x; - int i; /* Protect against recursive calls. delete_frame in delete_terminal calls us back when it deletes our last frame. */