summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2010-01-15 23:49:37 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2010-01-15 23:49:37 -0500
commit523ae620e8b915eb52101fd5808e1cff67cd559a (patch)
tree2e1e245304a8b794aa04ebf78bdebcca7ba739fa /src/xterm.c
parent045b9da7879353dfcba2264cfcd0ba0353669846 (diff)
downloademacs-523ae620e8b915eb52101fd5808e1cff67cd559a.tar.gz
(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'.
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 72dff200d82..b541683e5ad 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -9821,7 +9821,7 @@ x_wm_set_icon_pixmap (f, pixmap_id)
{
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 @@ x_term_init (display_name, xrm_option, resource_name)
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 @@ x_term_init (display_name, xrm_option, resource_name)
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 @@ void
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 @@ void
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. */