changeset 83410:fea405284011

Prevent core dumps with GTK by disabling secondary X connections there. * src/xterm.c (x_term_init) [!HAVE_GTK_MULTIDISPLAY]: Refuse to create secondary X connections. * configure.in (HAVE_GTK_MULTIDISPLAY): Disable test, unconditionally undefine. * configure: Regenerate. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-450
author Karoly Lorentey <lorentey@elte.hu>
date Mon, 12 Dec 2005 03:15:52 +0000
parents be1f74bffc1d
children c35ff18ca977
files README.multi-tty configure configure.in src/xterm.c
diffstat 4 files changed, 38 insertions(+), 121 deletions(-) [+]
line wrap: on
line diff
--- a/README.multi-tty	Mon Dec 12 02:37:01 2005 +0000
+++ b/README.multi-tty	Mon Dec 12 03:15:52 2005 +0000
@@ -98,11 +98,13 @@
 Known problems:
 
         * GTK support.  If you compile your Emacs with the GTK
-          toolkit, some functionality of multi-tty will be lost.
-	  In particular, closing an X display causes a crash.
-          Current releases of GTK have limitations and bugs that
-          prevent full-blown multi-display support in Emacs.  Use the
-          Lucid toolkit if you want to see a complete feature set.
+          toolkit, some functionality of multi-tty will be lost.  In
+          particular, you will not be able to work on multiple X
+          displays at once.  Current releases of GTK have limitations
+          and bugs that prevent full-blown multi-display support in
+          Emacs.  (GTK crashes when Emacs tries to disconnect from an
+          X server.)  Use the Lucid toolkit if you want to see a
+          complete feature set.
 
         * The single-kboard mode.
 
@@ -393,7 +395,10 @@
 ** Report GTK multi-display problems to GTK maintainers.  For extra
    credit, fix them.
 
-** Disable connecting to a new X display when we use the GTK toolkit.
+   Currently you can not connect to new X displays when you compile
+   Emacs with GTK support.  If you want to play around with GTK
+   multidisplay (and don't mind core dumps), you can edit src/config.h
+   and define HAVE_GTK_MULTIDISPLAY there by hand.
 
 ** Possibly turn off the double C-g feature when there is an X frame.
    C.f. (emacs)Emergency Escape.
@@ -1278,5 +1283,9 @@
    switched keyboards.  I don't understand why did this bug only
    appear on brand new frames, though!)
 
+-- Disable connecting to a new X display when we use the GTK toolkit.
+
+   (Disabled in patch-450.)
+
 ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
 
--- a/configure	Mon Dec 12 02:37:01 2005 +0000
+++ b/configure	Mon Dec 12 03:15:52 2005 +0000
@@ -9964,115 +9964,8 @@
     with_toolkit_scroll_bars=yes
   fi
 
-      HAVE_GTK_MULTIDISPLAY=no
-
-for ac_func in gdk_display_open
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
- HAVE_GTK_MULTIDISPLAY=yes
-fi
-done
-
-  if test "${HAVE_GTK_MULTIDISPLAY}" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_GTK_MULTIDISPLAY 1
-_ACEOF
-
-  fi
+          HAVE_GTK_MULTIDISPLAY=no
+
       HAVE_GTK_FILE_SELECTION=no
 
 for ac_func in gtk_file_selection_new
--- a/configure.in	Mon Dec 12 02:37:01 2005 +0000
+++ b/configure.in	Mon Dec 12 03:15:52 2005 +0000
@@ -2011,12 +2011,15 @@
 
   dnl  Check if we can use multiple displays with this GTK version.
   dnl  If gdk_display_open exists, assume all others are there also.
+  dnl  XXX The multidisplay feature is severely broken in current GTK
+  dnl  versions. --lorentey
   HAVE_GTK_MULTIDISPLAY=no
-  AC_CHECK_FUNCS(gdk_display_open, HAVE_GTK_MULTIDISPLAY=yes)
-  if test "${HAVE_GTK_MULTIDISPLAY}" = "yes"; then
-    AC_DEFINE(HAVE_GTK_MULTIDISPLAY, 1,
-              [Define to 1 if GTK can handle more than one display.])
-  fi
+  dnl AC_CHECK_FUNCS(gdk_display_open, HAVE_GTK_MULTIDISPLAY=yes)
+  dnl if test "${HAVE_GTK_MULTIDISPLAY}" = "yes"; then
+  dnl   AC_DEFINE(HAVE_GTK_MULTIDISPLAY, 1,
+  dnl             [Define to 1 if GTK can handle more than one display.])
+  dnl fi
+
   dnl  Check if we have the old file selection dialog.
   dnl  If gdk_display_open exists, assume all others are there also.
   HAVE_GTK_FILE_SELECTION=no
--- a/src/xterm.c	Mon Dec 12 02:37:01 2005 +0000
+++ b/src/xterm.c	Mon Dec 12 03:15:52 2005 +0000
@@ -10141,14 +10141,26 @@
     char **argv2 = argv;
     GdkAtom atom;
 
+#ifndef HAVE_GTK_MULTIDISPLAY
+    if (!EQ (Vinitial_window_system, intern ("x")))
+      error ("Sorry, you cannot connect to X servers with the GTK toolkit");
+#endif
+
     if (x_initialized++ > 1)
       {
+#ifdef HAVE_GTK_MULTIDISPLAY
         /* Opening another display.  If xg_display_open returns less
            than zero, we are probably on GTK 2.0, which can only handle
            one display.  GTK 2.2 or later can handle more than one.  */
         if (xg_display_open (SDATA (display_name), &dpy) < 0)
           error ("Sorry, this version of GTK can only handle one display");
-     }
+#else
+        /* XXX Unfortunately, multiple display support is severely broken
+           in recent GTK versions, so HAVE_GTK_MULTIDISPLAY is
+           unconditionally disabled in configure.in.  */
+        error ("Sorry, multiple display support is broken in current GTK versions");
+#endif
+      }
     else
       {
         for (argc = 0; argc < NUM_ARGV; ++argc)