winex11: Load the XVidMode extension (libXxf86vm) when available.
diff --git a/configure b/configure
index e00a2dc..039597b 100755
--- a/configure
+++ b/configure
@@ -1414,7 +1414,7 @@
--without-xshape do not use the Xshape extension
--without-xshm do not use XShm (shared memory extension)
--without-xslt do not use XSLT
- --without-xvidmode do not use XFree video mode extension
+ --without-xxf86vm do not use XFree video mode extension
--with-wine-tools=DIR use Wine tools from directory DIR
--with-x use the X Window System
@@ -2110,9 +2110,9 @@
fi
-# Check whether --with-xvidmode was given.
-if test "${with_xvidmode+set}" = set; then
- withval=$with_xvidmode; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_xf86vmode_h=no; fi
+# Check whether --with-xxf86vm was given.
+if test "${with_xxf86vm+set}" = set; then
+ withval=$with_xxf86vm; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_xf86vmode_h=no; fi
fi
@@ -10252,14 +10252,14 @@
if test "$ac_cv_header_X11_extensions_xf86vmode_h" = "yes"
then
- { echo "$as_me:$LINENO: checking for XF86VidModeQueryExtension in -lXxf86vm" >&5
-echo $ECHO_N "checking for XF86VidModeQueryExtension in -lXxf86vm... $ECHO_C" >&6; }
-if test "${ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension+set}" = set; then
+ { echo "$as_me:$LINENO: checking for -lXxf86vm" >&5
+echo $ECHO_N "checking for -lXxf86vm... $ECHO_C" >&6; }
+if test "${ac_cv_lib_soname_Xxf86vm+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- ac_check_lib_save_LIBS=$LIBS
+ ac_check_soname_save_LIBS=$LIBS
LIBS="-lXxf86vm $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
+ cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -10299,39 +10299,46 @@
test ! -s conftest.err
} && test -s conftest$ac_exeext &&
$as_test_x conftest$ac_exeext; then
- ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension=yes
+ case "$LIBEXT" in
+ dll) ;;
+ dylib) ac_cv_lib_soname_Xxf86vm=`otool -L conftest$ac_exeext | grep "libXxf86vm\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXxf86vm\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
+ *) ac_cv_lib_soname_Xxf86vm=`$ac_cv_path_LDD conftest$ac_exeext | grep "libXxf86vm\\.$LIBEXT" | sed -e "s/^.*\(libXxf86vm\.$LIBEXT[^ ]*\).*$/\1/"';2,$d'` ;;
+ esac
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension=no
+
fi
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+ LIBS=$ac_check_soname_save_LIBS
fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" >&5
-echo "${ECHO_T}$ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" >&6; }
-if test $ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension = yes; then
+if test "x$ac_cv_lib_soname_Xxf86vm" = "x"; then
+ { echo "$as_me:$LINENO: result: not found" >&5
+echo "${ECHO_T}not found" >&6; }
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_LIBXXF86VM 1
+else
+ { echo "$as_me:$LINENO: result: $ac_cv_lib_soname_Xxf86vm" >&5
+echo "${ECHO_T}$ac_cv_lib_soname_Xxf86vm" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define SONAME_LIBXXF86VM "$ac_cv_lib_soname_Xxf86vm"
_ACEOF
- X_PRE_LIBS="$X_PRE_LIBS -lXxf86vm"
fi
fi
- if test "$ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" != "yes"; then
- case "x$with_xvidmode" in
+ if test "x$ac_cv_lib_soname_Xxf86vm" = "x"; then
+ case "x$with_xxf86vm" in
x) wine_notices="$wine_notices|libXxf86vm development files not found, XFree86 Vidmode won't be supported." ;;
xno) ;;
*) { { echo "$as_me:$LINENO: error: libXxf86vm development files not found, XFree86 Vidmode won't be supported.
-This is an error since --with-xvidmode was requested." >&5
+This is an error since --with-xxf86vm was requested." >&5
echo "$as_me: error: libXxf86vm development files not found, XFree86 Vidmode won't be supported.
-This is an error since --with-xvidmode was requested." >&2;}
+This is an error since --with-xxf86vm was requested." >&2;}
{ (exit 1); exit 1; }; } ;;
esac
fi
diff --git a/configure.ac b/configure.ac
index d71d92d..bd764a3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -73,7 +73,7 @@
AC_ARG_WITH(xshm, AS_HELP_STRING([--without-xshm],[do not use XShm (shared memory extension)]),
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_XShm_h=no; fi])
AC_ARG_WITH(xslt, AS_HELP_STRING([--without-xslt],[do not use XSLT]))
-AC_ARG_WITH(xvidmode, AS_HELP_STRING([--without-xvidmode],[do not use XFree video mode extension]),
+AC_ARG_WITH(xxf86vm, AS_HELP_STRING([--without-xxf86vm],[do not use XFree video mode extension]),
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_xf86vmode_h=no; fi])
AC_ARG_WITH(wine-tools,AS_HELP_STRING([--with-wine-tools=DIR],[use Wine tools from directory DIR]))
@@ -683,13 +683,9 @@
dnl *** Check for XFree86 VMODE extension
if test "$ac_cv_header_X11_extensions_xf86vmode_h" = "yes"
then
- AC_CHECK_LIB(Xxf86vm, XF86VidModeQueryExtension,
- [ AC_DEFINE(HAVE_LIBXXF86VM, 1, [Define if you have the Xxf86vm library])
- X_PRE_LIBS="$X_PRE_LIBS -lXxf86vm"
- ],,
- $X_LIBS -lXext -lX11 $X_EXTRA_LIBS)
+ WINE_CHECK_SONAME(Xxf86vm,XF86VidModeQueryExtension,,,[$X_LIBS -lXext -lX11 $X_EXTRA_LIBS])
fi
- WINE_NOTICE_WITH(xvidmode,[test "$ac_cv_lib_Xxf86vm_XF86VidModeQueryExtension" != "yes"],
+ WINE_NOTICE_WITH(xxf86vm,[test "x$ac_cv_lib_soname_Xxf86vm" = "x"],
[libXxf86vm development files not found, XFree86 Vidmode won't be supported.])
dnl *** Check for Transform functions in Xrender
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 75b9bd9..434778a 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -525,7 +525,7 @@
xinerama_init( WidthOfScreen(screen), HeightOfScreen(screen) );
X11DRV_Settings_Init();
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
/* initialize XVidMode */
X11DRV_XF86VM_Init();
#endif
@@ -569,7 +569,7 @@
*/
static void process_detach(void)
{
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
/* cleanup XVidMode */
X11DRV_XF86VM_Cleanup();
#endif
diff --git a/dlls/winex11.drv/xvidmode.c b/dlls/winex11.drv/xvidmode.c
index 2c963d6..a97a9db 100644
--- a/dlls/winex11.drv/xvidmode.c
+++ b/dlls/winex11.drv/xvidmode.c
@@ -19,15 +19,17 @@
*/
#include "config.h"
+#include "wine/port.h"
+
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "x11drv.h"
-#ifdef HAVE_LIBXXF86VM
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
#include <X11/extensions/xf86vmode.h>
-#endif /* HAVE_LIBXXF86VM */
+#endif
#include "xvidmode.h"
@@ -35,10 +37,11 @@
#include "wingdi.h"
#include "ddrawi.h"
#include "wine/debug.h"
+#include "wine/library.h"
WINE_DEFAULT_DEBUG_CHANNEL(xvidmode);
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
extern int usexvidmode;
@@ -54,6 +57,26 @@
static XF86VidModeModeInfo** real_xf86vm_modes;
static unsigned int real_xf86vm_mode_count;
+#define MAKE_FUNCPTR(f) typeof(f) * p##f;
+MAKE_FUNCPTR(XF86VidModeGetAllModeLines)
+MAKE_FUNCPTR(XF86VidModeGetModeLine)
+MAKE_FUNCPTR(XF86VidModeLockModeSwitch)
+MAKE_FUNCPTR(XF86VidModeQueryExtension)
+MAKE_FUNCPTR(XF86VidModeQueryVersion)
+MAKE_FUNCPTR(XF86VidModeSetViewPort)
+MAKE_FUNCPTR(XF86VidModeSwitchToMode)
+#ifdef X_XF86VidModeSetGamma
+MAKE_FUNCPTR(XF86VidModeGetGamma)
+MAKE_FUNCPTR(XF86VidModeSetGamma)
+#endif
+#ifdef X_XF86VidModeSetGammaRamp
+MAKE_FUNCPTR(XF86VidModeGetGammaRamp)
+MAKE_FUNCPTR(XF86VidModeGetGammaRampSize)
+MAKE_FUNCPTR(XF86VidModeSetGammaRamp)
+#endif
+#undef MAKE_FUNCPTR
+
+
static void convert_modeinfo( const XF86VidModeModeInfo *mode)
{
int rate;
@@ -98,7 +121,7 @@
TRACE("Querying XVidMode current mode\n");
wine_tsx11_lock();
- XF86VidModeGetModeLine(gdi_display, DefaultScreen(gdi_display), &dotclock, &line);
+ pXF86VidModeGetModeLine(gdi_display, DefaultScreen(gdi_display), &dotclock, &line);
wine_tsx11_unlock();
convert_modeline(dotclock, &line, &cmode, dwBpp);
for (i=0; i<dd_mode_count; i++)
@@ -123,9 +146,9 @@
wine_tsx11_lock();
TRACE("Resizing X display to %dx%d\n",
real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
- XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]);
+ pXF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]);
#if 0 /* it is said that SetViewPort causes problems with some X servers */
- XF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0);
+ pXF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0);
#else
XWarpPointer(gdi_display, None, DefaultRootWindow(gdi_display), 0, 0, 0, 0, 0, 0);
#endif
@@ -135,21 +158,52 @@
return DISP_CHANGE_SUCCESSFUL;
}
+
void X11DRV_XF86VM_Init(void)
{
+ void *xvidmode_handle;
Bool ok;
int nmodes;
unsigned int i;
if (xf86vm_major) return; /* already initialized? */
+ xvidmode_handle = wine_dlopen(SONAME_LIBXXF86VM, RTLD_NOW, NULL, 0);
+ if (!xvidmode_handle)
+ {
+ TRACE("Unable to open %s, XVidMode disabled\n", SONAME_LIBXXF86VM);
+ usexvidmode = 0;
+ return;
+ }
+
+#define LOAD_FUNCPTR(f) \
+ if((p##f = wine_dlsym(xvidmode_handle, #f, NULL, 0)) == NULL) \
+ goto sym_not_found;
+ LOAD_FUNCPTR(XF86VidModeGetAllModeLines)
+ LOAD_FUNCPTR(XF86VidModeGetModeLine)
+ LOAD_FUNCPTR(XF86VidModeLockModeSwitch)
+ LOAD_FUNCPTR(XF86VidModeQueryExtension)
+ LOAD_FUNCPTR(XF86VidModeQueryVersion)
+ LOAD_FUNCPTR(XF86VidModeSetViewPort)
+ LOAD_FUNCPTR(XF86VidModeSwitchToMode)
+#ifdef X_XF86VidModeSetGamma
+ LOAD_FUNCPTR(XF86VidModeGetGamma)
+ LOAD_FUNCPTR(XF86VidModeSetGamma)
+#endif
+#ifdef X_XF86VidModeSetGammaRamp
+ LOAD_FUNCPTR(XF86VidModeGetGammaRamp)
+ LOAD_FUNCPTR(XF86VidModeGetGammaRampSize)
+ LOAD_FUNCPTR(XF86VidModeSetGammaRamp)
+#endif
+#undef LOAD_FUNCPTR
+
/* see if XVidMode is available */
wine_tsx11_lock();
- ok = XF86VidModeQueryExtension(gdi_display, &xf86vm_event, &xf86vm_error);
+ ok = pXF86VidModeQueryExtension(gdi_display, &xf86vm_event, &xf86vm_error);
if (ok)
{
X11DRV_expect_error(gdi_display, XVidModeErrorHandler, NULL);
- ok = XF86VidModeQueryVersion(gdi_display, &xf86vm_major, &xf86vm_minor);
+ ok = pXF86VidModeQueryVersion(gdi_display, &xf86vm_major, &xf86vm_minor);
if (X11DRV_check_error()) ok = FALSE;
}
if (ok)
@@ -157,7 +211,7 @@
#ifdef X_XF86VidModeSetGammaRamp
if (xf86vm_major > 2 || (xf86vm_major == 2 && xf86vm_minor >= 1))
{
- XF86VidModeGetGammaRampSize(gdi_display, DefaultScreen(gdi_display),
+ pXF86VidModeGetGammaRampSize(gdi_display, DefaultScreen(gdi_display),
&xf86vm_gammaramp_size);
if (xf86vm_gammaramp_size == 256)
xf86vm_use_gammaramp = TRUE;
@@ -166,7 +220,7 @@
/* retrieve modes */
if (usexvidmode && root_window == DefaultRootWindow( gdi_display ))
- ok = XF86VidModeGetAllModeLines(gdi_display, DefaultScreen(gdi_display), &nmodes, &real_xf86vm_modes);
+ ok = pXF86VidModeGetAllModeLines(gdi_display, DefaultScreen(gdi_display), &nmodes, &real_xf86vm_modes);
else
ok = FALSE; /* In desktop mode, do not switch resolution... But still use the Gamma ramp stuff */
}
@@ -193,6 +247,13 @@
TRACE("Available DD modes: count=%d\n", dd_mode_count);
TRACE("Enabling XVidMode\n");
+ return;
+
+sym_not_found:
+ TRACE("Unable to load function pointers from %s, XVidMode disabled\n", SONAME_LIBXXF86VM);
+ wine_dlclose(xvidmode_handle, NULL, 0);
+ xvidmode_handle = NULL;
+ usexvidmode = 0;
}
void X11DRV_XF86VM_Cleanup(void)
@@ -207,7 +268,7 @@
if (!dd_modes) return; /* no XVidMode */
wine_tsx11_lock();
- XF86VidModeLockModeSwitch(gdi_display, DefaultScreen(gdi_display), lock);
+ pXF86VidModeLockModeSwitch(gdi_display, DefaultScreen(gdi_display), lock);
wine_tsx11_unlock();
}
@@ -307,7 +368,7 @@
{
Bool ret;
wine_tsx11_lock();
- ret = XF86VidModeGetGammaRamp(gdi_display, DefaultScreen(gdi_display), 256,
+ ret = pXF86VidModeGetGammaRamp(gdi_display, DefaultScreen(gdi_display), 256,
ramp->red, ramp->green, ramp->blue);
wine_tsx11_unlock();
return ret;
@@ -316,7 +377,7 @@
else
{
wine_tsx11_lock();
- ret = XF86VidModeGetGamma(gdi_display, DefaultScreen(gdi_display), &gamma);
+ ret = pXF86VidModeGetGamma(gdi_display, DefaultScreen(gdi_display), &gamma);
wine_tsx11_unlock();
if (ret) {
GenerateRampFromGamma(ramp->red, gamma.red);
@@ -340,7 +401,7 @@
{
Bool ret;
wine_tsx11_lock();
- ret = XF86VidModeSetGammaRamp(gdi_display, DefaultScreen(gdi_display), 256,
+ ret = pXF86VidModeSetGammaRamp(gdi_display, DefaultScreen(gdi_display), 256,
ramp->red, ramp->green, ramp->blue);
wine_tsx11_unlock();
return ret;
@@ -353,7 +414,7 @@
ComputeGammaFromRamp(ramp->blue, &gamma.blue)) {
Bool ret;
wine_tsx11_lock();
- ret = XF86VidModeSetGamma(gdi_display, DefaultScreen(gdi_display), &gamma);
+ ret = pXF86VidModeSetGamma(gdi_display, DefaultScreen(gdi_display), &gamma);
wine_tsx11_unlock();
return ret;
}
@@ -362,7 +423,7 @@
return FALSE;
}
-#endif /* HAVE_LIBXXF86VM */
+#endif /* SONAME_LIBXXF86VM */
/***********************************************************************
* GetDeviceGammaRamp (X11DRV.@)
@@ -373,7 +434,7 @@
*/
BOOL X11DRV_GetDeviceGammaRamp(X11DRV_PDEVICE *physDev, LPVOID ramp)
{
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
return X11DRV_XF86VM_GetGammaRamp(ramp);
#else
return FALSE;
@@ -389,7 +450,7 @@
*/
BOOL X11DRV_SetDeviceGammaRamp(X11DRV_PDEVICE *physDev, LPVOID ramp)
{
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
return X11DRV_XF86VM_SetGammaRamp(ramp);
#else
return FALSE;
diff --git a/dlls/winex11.drv/xvidmode.h b/dlls/winex11.drv/xvidmode.h
index b3f9d85..c6b7d17 100644
--- a/dlls/winex11.drv/xvidmode.h
+++ b/dlls/winex11.drv/xvidmode.h
@@ -24,7 +24,7 @@
# error You must include config.h to use this header
#endif
-#ifdef HAVE_LIBXXF86VM
+#ifdef SONAME_LIBXXF86VM
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
@@ -38,5 +38,5 @@
BOOL X11DRV_XF86VM_GetGammaRamp(LPDDGAMMARAMP ramp);
BOOL X11DRV_XF86VM_SetGammaRamp(LPDDGAMMARAMP ramp);
-#endif /* HAVE_LIBXXF86VM */
+#endif /* SONAME_LIBXXF86VM */
#endif /* __WINE_XVIDMODE_H */
diff --git a/include/config.h.in b/include/config.h.in
index f57ca1a..c4f30c9 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -336,9 +336,6 @@
/* Define to 1 if you have the <libxslt/transform.h> header file. */
#undef HAVE_LIBXSLT_TRANSFORM_H
-/* Define if you have the Xxf86vm library */
-#undef HAVE_LIBXXF86VM
-
/* Define if you have the X Shm extension */
#undef HAVE_LIBXXSHM
@@ -1107,6 +1104,9 @@
/* Define to the soname of the libXrender library. */
#undef SONAME_LIBXRENDER
+/* Define to the soname of the libXxf86vm library. */
+#undef SONAME_LIBXXF86VM
+
/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
#undef STAT_MACROS_BROKEN