Hello, I've updated the patch a bit. The previous one would update GLIB_CFLAGS and GLIB_LIBS no matter if the gmodule functionality is necessary or not. An example for this behaviour is MC configured with --without-x, although no dynamic loading is required in this scenario one would end up with a binary which has a dependency on the gmodule library.
This new patch fixes the described problem and updates GLIB_CFLAGS and GLIB_LIBS only in the case where gmodule functionality is required i.e. MC is configured with --with-x, X was found and the configure script determined that gmodule is supported on the system. The new patch also doesn't include a diff for config.h.in since this is not needed. The previous time i missed the fact that autoheader will generate a good config.h.in. The patch was tested on Cygwin 1.3.20-1, RH Linux 8.0, OpenBSD 3.2 and Solaris 9. Here is an updated list of changes: * aclocal.m4 (AC_G_MODULE_SUPPORTED): New macro. Tests if gmodule functionality is supported. Sets the variable 'av_g_module_supported' and the macros 'HAVE_WORKING_GMODULE'. * configure.in: Detect if gmodule library is present and can be used. (GMODULE_CFLAGS): New variable. (GMODULE_LIBS): Ditto. Add necessary X libraries to 'MCLIBS' only if 'av_g_module_supported' contains a valued different from 'yes'. Update GLIB_CFLAGS and GLIB_LIBS contents with the one of GMODULE_CFLAGS and GMODULE_LIBS only if 'av_g_module_supported' is set to 'yes'. * src/key.c: Include gmodule.h if 'HAVE_WORKING_GMODULE' is defined. (MODULE_DEFAULT_PREFIX): New macro. (MODULE_DEFUALT_SUFFIX): Ditto. (MODX11_DEFAULT_NAME): Ditto. Use 'MODULE_DEFAULT_PREFIX' and 'MODULE_DEFAULT_SUFFIX' macros. (XOPENDISPLAY): Define new pointer to function type. (XCLOSEDISPLAY): Ditto. (XQUERYPOINTER): Ditto. (x11_module): New static variable. (func_XOpenDisplay): Ditto. (func_XCloseDisplay): Ditto. (func_XQueryPointer): Ditto. (init_key): Dynamically load XOpenDisplay, XCloseDisplay and XQueryPointer functions if 'HAVE_WORKING_GMODULE' is defined. Use 'func_XOpenDisplay'. (get_modifier): Use 'func_XQueryPointer'. (done_key): Use 'func_XCloseDisplay'. Unload the dynamcally loaded library X11 if 'HAVE_WORKING_GMODULE' is defined.
diff -urN -x .build -x .inst -x .sinst mc-4.6.0-orig/aclocal.m4 mc-4.6.0/aclocal.m4 --- mc-4.6.0-orig/aclocal.m4 2003-02-05 19:08:57.000000000 +0100 +++ mc-4.6.0/aclocal.m4 2003-02-13 23:42:35.000000000 +0100 @@ -3881,3 +3881,35 @@ fi ]) +dnl +dnl Check whether the g_module_* family of functions works +dnl on this system. +dnl +AC_DEFUN([AC_G_MODULE_SUPPORTED], [ +av_g_module_supported=no +AC_MSG_CHECKING([if gmodule functionality is supported on this system]) +ac_save_CFLAGS="$CFLAGS" +ac_save_LIBS="$LIBS" +CFLAGS="$CFLAGS $GMODULE_CFLAGS" +LIBS="$GMODULE_LIBS $LIBS" +AC_TRY_RUN([ +#include <gmodule.h> + +int main () +{ + int ret = (g_module_supported () == TRUE) ? 0 : 1; + return ret; +} +],[ +AC_DEFINE(HAVE_WORKING_GMODULE, 1, + [Define if gmodule functionality is supported on your system.]) +av_g_module_supported=yes +],[ +av_g_module_supported=no +],[ +av_g_module_supported=no +]) +CFLAGS="$ac_save_CFLAGS" +LIBS="$ac_save_LIBS" +AC_MSG_RESULT([$av_g_module_supported]) +]) diff -urN -x .build -x .inst -x .sinst mc-4.6.0-orig/configure.in mc-4.6.0/configure.in --- mc-4.6.0-orig/configure.in 2003-02-05 19:03:56.000000000 +0100 +++ mc-4.6.0/configure.in 2003-02-13 23:16:47.000000000 +0100 @@ -38,8 +38,26 @@ AC_ARG_VAR([GLIB_CONFIG], [Path to glib-config (version 1.2.x only)]) AM_PATH_GLIB(1.2.6,,[AC_MSG_ERROR([Test for glib failed. GNU Midnight Commander requires glib 1.2.6 or above.])]) + dnl Save GLIB_CFLAGS and GLIB_LIBS, since the following call to + dnl AM_PATH_GLIB will overwrite them. + save_GLIB_CFLAGS="$GLIB_CFLAGS" + save_GLIB_LIBS="$GLIB_LIBS" + dnl Check for gmodule. Store the flags, necessary to compile and link + dnl programs, using gmodule functionality, in GMODULE_CFLAGS and + dnl GMODULE_LIBS. + AM_PATH_GLIB(1.2.6, [gmodule_found=yes], , [gmodule]) + GMODULE_CFLAGS="$GLIB_CFLAGS" + GMODULE_LIBS="$GLIB_LIBS" + GLIB_CFLAGS="$save_GLIB_CFLAGS" + GLIB_LIBS="$save_GLIB_LIBS" +else + PKG_CHECK_MODULES(GMODULE, [gmodule-2.0], [gmodule_found=yes],) fi +if test "x$gmodule_found" = "xyes" ; then + dnl Is the gmodule functionality supported on this system. + AC_G_MODULE_SUPPORTED +fi AC_HEADER_MAJOR AC_C_CONST @@ -214,7 +232,16 @@ textmode_x11_support="no" else CPPFLAGS="$CPPFLAGS $X_CFLAGS" - MCLIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + if test "x$av_g_module_supported" = "xyes" ; then + dnl Replace the contents of GLIB_CFLAGS and GLIB_LIBS with those of + dnl GMODULE_CFLAGS and GMODULE_LIBS, only if X is available and gmodule + dnl functionality is supported on the system. This way, MC will be + dnl linked against the gmodule library, only when it is really required. + GLIB_CFLAGS="$GMODULE_CFLAGS" + GLIB_LIBS="$GMODULE_LIBS" + else + MCLIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + fi AC_DEFINE(HAVE_TEXTMODE_X11_SUPPORT, 1, [Define to enable getting events from X Window System]) textmode_x11_support="yes" diff -urN -x .build -x .inst -x .sinst mc-4.6.0-orig/src/key.c mc-4.6.0/src/key.c --- mc-4.6.0-orig/src/key.c 2003-01-27 23:37:56.000000000 +0100 +++ mc-4.6.0/src/key.c 2003-02-10 10:06:32.000000000 +0100 @@ -41,6 +41,9 @@ #include "../vfs/vfs.h" #ifdef HAVE_TEXTMODE_X11_SUPPORT +#ifdef HAVE_WORKING_GMODULE +#include <gmodule.h> +#endif /* HAVE_WORKING_GMODULE */ #include <X11/Xlib.h> #endif @@ -247,6 +250,30 @@ } #ifdef HAVE_TEXTMODE_X11_SUPPORT +#ifdef HAVE_WORKING_GMODULE +#define MODULE_DEFAULT_PREFIX "lib" +#if GLIB_CHECK_VERSION(2,0,0) +# define MODULE_DEFAULT_SUFFIX "." G_MODULE_SUFFIX +#else /* glib < 2.x.x */ +# ifndef __CYGWIN__ +# define MODULE_DEFAULT_SUFFIX ".so" +# else /* __CYGWIN__ */ +# define MODULE_DEFAULT_SUFFIX ".dll" +# endif +#endif + +#define MODX11_DEFAULT_NAME MODULE_DEFAULT_PREFIX "X11" MODULE_DEFAULT_SUFFIX + +typedef Display * (* XOPENDISPLAY) (_Xconst char *); +typedef int (* XCLOSEDISPLAY) (Display *); +typedef Bool (* XQUERYPOINTER) (Display *, Window, Window *, Window*, + int *, int *, int *, int *, unsigned int *); + +static GModule *x11_module; +static XOPENDISPLAY func_XOpenDisplay; +static XCLOSEDISPLAY func_XCloseDisplay; +static XQUERYPOINTER func_XQueryPointer; +#endif /* HAVE_WORKING_GMODULE */ static Display *x11_display; static Window x11_window; #endif /* HAVE_TEXTMODE_X11_SUPPORT */ @@ -255,6 +282,9 @@ calls any define_sequence */ void init_key (void) { +#if defined(HAVE_TEXTMODE_X11_SUPPORT) && defined(HAVE_WORKING_GMODULE) + gchar *x11_module_fname; +#endif /* HAVE_TEXTMODE_X11_SUPPORT && HAVE_WORKING_GMODULE */ char *term = (char *) getenv ("TERM"); /* This has to be the first define_sequence */ @@ -290,9 +320,32 @@ #endif /* __QNX__ */ #ifdef HAVE_TEXTMODE_X11_SUPPORT +#ifdef HAVE_WORKING_GMODULE + x11_module_fname = g_module_build_path (NULL, "X11"); + if (x11_module_fname == NULL) + x11_module_fname = g_strdup (MODX11_DEFAULT_NAME); + + if (x11_module_fname != NULL) { + x11_module = g_module_open (x11_module_fname, G_MODULE_BIND_LAZY); + g_free (x11_module_fname); + if (x11_module != NULL) { + if (g_module_symbol (x11_module, "XOpenDisplay", + (gpointer *) &func_XOpenDisplay) && + g_module_symbol (x11_module, "XCloseDisplay", + (gpointer *) &func_XCloseDisplay) && + g_module_symbol (x11_module, "XQueryPointer", + (gpointer *) &func_XQueryPointer)) { + x11_display = (*func_XOpenDisplay) (0); + if (x11_display) + x11_window = DefaultRootWindow (x11_display); + } + } + } +#else x11_display = XOpenDisplay (0); if (x11_display) x11_window = DefaultRootWindow (x11_display); +#endif /* HAVE_WORKING_GMODULE */ #endif /* HAVE_TEXTMODE_X11_SUPPORT */ } @@ -1049,8 +1102,13 @@ int win_x, win_y; unsigned int mask; +#ifdef HAVE_WORKING_GMODULE + (*func_XQueryPointer) (x11_display, x11_window, &root, &child, + &root_x, &root_y, &win_x, &win_y, &mask); +#else XQueryPointer (x11_display, x11_window, &root, &child, &root_x, &root_y, &win_x, &win_y, &mask); +#endif /* HAVE_WORKING_GMODULE */ if (mask & ShiftMask) result |= KEY_M_SHIFT; @@ -1105,7 +1163,14 @@ s_dispose (select_list); #ifdef HAVE_TEXTMODE_X11_SUPPORT +#ifdef HAVE_WORKING_GMODULE + if (x11_display) + (*func_XCloseDisplay) (x11_display); + if (x11_module != NULL) + g_module_close (x11_module); +#else if (x11_display) XCloseDisplay (x11_display); +#endif /* HAVE_WORKING_GMODULE */ #endif /* HAVE_TEXTMODE_X11_SUPPORT */ }