Re: [PATCH] key.c: Dynamically load XOpenDisplay, XQueryPointer and XCloseDisplay
- From: Pavel Tsekov <ptsekov gmx net>
- To: mc-devel gnome org
- Subject: Re: [PATCH] key.c: Dynamically load XOpenDisplay, XQueryPointer and XCloseDisplay
- Date: Sun, 9 Feb 2003 20:54:01 +0100 (CET)
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]