summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaroly Lorentey <lorentey@elte.hu>2005-12-12 03:15:52 +0000
committerKaroly Lorentey <lorentey@elte.hu>2005-12-12 03:15:52 +0000
commit5f6a587f307d47878dfa44058c613fefab4ecac3 (patch)
tree0e01b9c4d14238d1d8af843268ded8d9dba7e426
parentd68058039e1ff5635b2e44509fc242de4f0a286f (diff)
downloademacs-5f6a587f307d47878dfa44058c613fefab4ecac3.tar.gz
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
-rw-r--r--README.multi-tty21
-rwxr-xr-xconfigure109
-rw-r--r--configure.in13
-rw-r--r--src/xterm.c14
4 files changed, 37 insertions, 120 deletions
diff --git a/README.multi-tty b/README.multi-tty
index 3f873facaec..7e673d256cb 100644
--- a/README.multi-tty
+++ b/README.multi-tty
@@ -98,11 +98,13 @@ few tricky test cases for you.
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 @@ THINGS TO DO
** 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 @@ DIARY OF CHANGES
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
diff --git a/configure b/configure
index 1cf5f21d0b2..3b188fa7728 100755
--- a/configure
+++ b/configure
@@ -9964,115 +9964,8 @@ _ACEOF
with_toolkit_scroll_bars=yes
fi
- HAVE_GTK_MULTIDISPLAY=no
+ 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_FILE_SELECTION=no
for ac_func in gtk_file_selection_new
diff --git a/configure.in b/configure.in
index b39a7e85678..f413c57db55 100644
--- a/configure.in
+++ b/configure.in
@@ -2011,12 +2011,15 @@ if test "${with_gtk}" = "yes" || test "$USE_X_TOOLKIT" = "gtk"; then
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
diff --git a/src/xterm.c b/src/xterm.c
index 42c860b64c9..cf0c8176dd5 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -10141,14 +10141,26 @@ x_term_init (display_name, xrm_option, resource_name)
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)