+2010-01-16 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * 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 <jan.h.d@swipnet.se>
* xfns.c (x_get_current_desktop, x_get_desktop_workarea): New functions.
{
Pixmap icon_pixmap, icon_mask;
-#ifndef USE_X_TOOLKIT
+#if !defined USE_X_TOOLKIT && !defined USE_GTK
Window window = FRAME_OUTER_WINDOW (f);
#endif
int argc;
char *argv[NUM_ARGV];
char **argv2 = argv;
- GdkAtom atom;
guint id;
#ifndef HAVE_GTK_MULTIDISPLAY
if (!EQ (Vinitial_window_system, Qx))
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. */
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
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. */