Re: [PATCH] key.c: Dynamically load XOpenDisplay, XQueryPointer and XCloseDisplay



Hello,

Ok, here comes the new patch. It is using the gmodule library as
Pavel Rosking has suggested. It also includes some changes to the 
configure stuff. Please, review and tell me what needs to be fixed.

Here is a list of changes:

* aclocal.m4 (AC_G_MODULE_SUPPORTED): New macro. Tests if gmodule 
functionality of glib can be used. Sets the variable 
'av_g_module_supported' and the macros 'HAVE_WORKING_GMODULE'.
* config.h.in (HAVE_WORKING_GMODULE): New macro.
* configure.in: Detect if gmodule library is present and can be used. 
Update GLIB_FLAGS and GLIB_LIBS accordingly.
Add necessary X libraries to MCLIBS only if 'av_g_module_supported' is
set to 'no'.
* 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 -rup mc-4.6.0/aclocal.m4 mc-4.6.0-mod/aclocal.m4
--- mc-4.6.0/aclocal.m4	2003-02-05 19:08:57.000000000 +0100
+++ mc-4.6.0-mod/aclocal.m4	2003-02-09 19:21:40.000000000 +0100
@@ -3881,3 +3881,35 @@ AC_DEFUN([AM_LC_MESSAGES],
   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 g_module_* family of functions works])
+ac_save_CFLAGS="$CFLAGS"
+ac_save_LIBS="$LIBS"
+CFLAGS="$CFLAGS $GLIB_CFLAGS"
+LIBS="$GLIB_LIBS $LIBS"
+AC_TRY_RUN([
+#include <gmodule.h>
+
+int main ()
+{
+    int ret = g_module_supported () ? 0 : 1;
+    return ret;
+}
+],[
+AC_DEFINE(HAVE_WORKING_GMODULE, 1,
+	  [Define if we have working gmodule library])
+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 -rup mc-4.6.0/config.h.in mc-4.6.0-mod/config.h.in
--- mc-4.6.0/config.h.in	2003-02-05 19:09:02.000000000 +0100
+++ mc-4.6.0-mod/config.h.in	2003-02-09 18:28:18.000000000 +0100
@@ -668,4 +668,7 @@
 /* Define to `int' if <sys/types.h> does not define. */
 #undef umode_t
 
+/* Define if we can use gmodule functionality */
+#undef HAVE_WORKING_GMODULE
+
 #include <extraconf.h>
diff -rup mc-4.6.0/configure.in mc-4.6.0-mod/configure.in
--- mc-4.6.0/configure.in	2003-02-05 19:03:56.000000000 +0100
+++ mc-4.6.0-mod/configure.in	2003-02-09 19:25:45.000000000 +0100
@@ -38,8 +38,25 @@ if test "x$glib_found" = "xno" ; then
 	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.])])
+	save_GLIB_CFLAGS="$GLIB_CFLAGS"
+        save_GLIB_LIBS="$GLIB_LIBS"
+	AM_PATH_GLIB(1.2.6,,[gmodule_found=no],[gmodule])
+else
+    save_GLIB_CFLAGS="$GLIB_CFLAGS"
+    save_GLIB_LIBS="$GLIB_LIBS"
+    PKG_CHECK_MODULES(GLIB, [gmodule-2.0], , [gmodule_found=no])
 fi
 
+if test "x$gmodule_found" = "xno" ; then
+    GLIB_CFLAGS="$save_GLIB_CFLAGS"
+    GLIB_LIBS="$save_GLIB_LIBS"
+else
+    AC_G_MODULE_SUPPORTED
+    if test "x$av_g_module_supported" = "xno" ; then
+	GLIB_CFLAGS="$save_GLIB_CFLAGS"
+	GLIB_LIBS="$save_GLIB_LIBS"
+    fi
+fi
 
 AC_HEADER_MAJOR
 AC_C_CONST
@@ -214,7 +231,9 @@ if test "x$no_x" = xyes; then
     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" = "xno" ; then
+        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 -rup mc-4.6.0/src/key.c mc-4.6.0-mod/src/key.c
--- mc-4.6.0/src/key.c	2003-01-27 23:37:56.000000000 +0100
+++ mc-4.6.0-mod/src/key.c	2003-02-09 19:17:50.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 @@ define_sequences (key_define_t *kd)
 }
 
 #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 @@ static Window x11_window;
    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 @@ void init_key (void)
 #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 @@ get_modifier (void)
 	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 @@ void done_key ()
     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 */
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]