PATCH: XRandR part 1

Alex Pasadyn ajp at mail.utexas.edu
Sat Oct 11 14:01:47 CDT 2003


Greetings all,
I have added XRandR support for resolution changing.  This is much 
better than XVidMode as you can't scroll away from the full-screen 
applications.  This even works for apps that change the resolution 
before they create any windows.

I reorganized the code to be a lot more flexible (and shorter!). 
Maintaining the list of modes, enumerating them, and finding an 
appropriate one given constraints now only happens in a single place.

As usual, I tested this with several apps, but I don't have them all so 
please let me know right away if anything got broken so I can fix it.

I'm sending this in two parts because I added some files and can't get 
cvs diff to have them show up.  This part contains the new files, and 
the following one contains the changed files.

-ajp


New Files Added:
- dlls/x11drv/settings.c
- dlls/x11drv/xrandr.c
- dlls/x11drv/xrandr.h

ChangeLog:
- Added support for XRandR extension
- Added new debugging channels for resolution changing
- Streamlined resolution changing and removed duplicated code

-------------- next part --------------
Common subdirectories: old-wine/dlls/x11drv/CVS and wine/dlls/x11drv/CVS
diff -Nu old-wine/dlls/x11drv/settings.c wine/dlls/x11drv/settings.c
--- old-wine/dlls/x11drv/settings.c	1969-12-31 18:00:00.000000000 -0600
+++ wine/dlls/x11drv/settings.c	2003-10-11 12:34:41.000000000 -0500
@@ -0,0 +1,321 @@
+/*
+ * Wine X11drv display settings functions
+ *
+ * Copyright 2003 Alexander James Pasadyn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+#include <string.h>
+#include <stdio.h>
+#include "x11drv.h"
+#include "x11ddraw.h"
+
+#include "windef.h"
+#include "wingdi.h"
+#include "ddrawi.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(x11settings);
+
+/*
+ * The DDHALMODEINFO type is used to hold all the mode information.  
+ * This is done because the array of DDHALMODEINFO structures must be 
+ * created for use by DirectDraw anyway.
+ */
+static LPDDHALMODEINFO dd_modes = NULL;
+static unsigned int dd_mode_count = 0;
+static unsigned int dd_max_modes = 0;
+static int dd_mode_default = 0;
+static const unsigned int depths[]  = {8, 16, 32};
+
+/* pointers to functions that actually do the hard stuff */
+static int (*pGetCurrentMode)(void);
+static void (*pSetCurrentMode)(int mode);
+static const char *handler_name;
+
+/* 
+ * Set the handlers for resolution changing functions
+ * and initialize the master list of modes
+ */
+LPDDHALMODEINFO X11DRV_Settings_SetHandlers(const char *name, 
+                                 int (*pNewGCM)(void), 
+                                 void (*pNewSCM)(int), 
+                                 unsigned int nmodes, 
+                                 int reserve_depths)
+{
+    handler_name = name;
+    pGetCurrentMode = pNewGCM;
+    pSetCurrentMode = pNewSCM;
+    TRACE("Resolution settings now handled by: %s\n", name);
+    if (reserve_depths)
+        /* leave room for other depths */
+        dd_max_modes = (3+1)*(nmodes);
+    else 
+        dd_max_modes = nmodes;
+
+    if (dd_modes) 
+    {
+        TRACE("Destroying old display modes array\n");
+        HeapFree(GetProcessHeap(), 0, dd_modes);
+    }
+    dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * dd_max_modes);
+    dd_mode_count = 0;
+    TRACE("Initialized new display modes array\n");
+    return dd_modes;
+}
+
+/* Add one mode to the master list */
+void X11DRV_Settings_AddOneMode(unsigned int width, unsigned int height, unsigned int bpp, unsigned int freq)
+{
+    LPDDHALMODEINFO info = &(dd_modes[dd_mode_count]);
+    DWORD dwBpp = screen_depth;
+    if (dd_mode_count >= dd_max_modes)
+    {
+        ERR("Maximum modes (%d) exceeded\n", dd_max_modes);
+        return;
+    }
+    if (dwBpp == 24) dwBpp = 32;
+    if (bpp == 0) bpp = dwBpp;
+    info->dwWidth        = width;
+    info->dwHeight       = height;
+    info->wRefreshRate   = freq;
+    info->lPitch         = 0;
+    info->dwBPP          = bpp;
+    info->wFlags         = 0;
+    info->dwRBitMask     = 0;
+    info->dwGBitMask     = 0;
+    info->dwBBitMask     = 0;
+    info->dwAlphaBitMask = 0;
+    TRACE("initialized mode %d: %dx%dx%d @%d Hz (%s)\n", 
+          dd_mode_count, width, height, bpp, freq, handler_name);
+    dd_mode_count++;
+}
+
+/* copy all the current modes using the other color depths */
+void X11DRV_Settings_AddDepthModes(void)
+{
+    int i, j;
+    int existing_modes = dd_mode_count;
+    DWORD dwBpp = screen_depth;
+    if (dwBpp == 24) dwBpp = 32;
+    for (j=0; j<3; j++)
+    {
+        if (depths[j] != dwBpp)
+        {
+            for (i=0; i < existing_modes; i++)
+            {
+                X11DRV_Settings_AddOneMode(dd_modes[i].dwWidth, dd_modes[i].dwHeight, 
+                                           depths[j], dd_modes[i].wRefreshRate);
+            }
+        }
+    }
+}
+
+/* set the default mode */
+void X11DRV_Settings_SetDefaultMode(int mode)
+{
+    dd_mode_default = mode;
+}
+
+/* return the number of modes that are initialized */
+unsigned int X11DRV_Settings_GetModeCount(void)
+{
+    return dd_mode_count;
+}
+
+/***********************************************************************
+ * Default handlers if resolution switching is not enabled
+ *
+ */
+static int X11DRV_nores_GetCurrentMode(void)
+{
+    return 0;
+}
+static void X11DRV_nores_SetCurrentMode(int mode)
+{
+    TRACE("Ignoring mode change request\n");
+}
+/* default handler only gets the current X desktop resolution */
+void X11DRV_Settings_Init(void)
+{
+    X11DRV_Settings_SetHandlers("NoRes", 
+                                X11DRV_nores_GetCurrentMode, 
+                                X11DRV_nores_SetCurrentMode, 
+                                1, 0);
+    X11DRV_Settings_AddOneMode(screen_width, screen_height, 0, 0);
+}
+
+/***********************************************************************
+ *		EnumDisplaySettingsExW  (X11DRV.@)
+ *
+ */
+BOOL X11DRV_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
+{
+    DWORD dwBpp = screen_depth;
+    if (dwBpp == 24) dwBpp = 32;
+    devmode->dmDisplayFlags = 0;
+    devmode->dmDisplayFrequency = 0;
+    devmode->dmSize = sizeof(DEVMODEW);
+    if (n == (DWORD)-1)
+    {
+        TRACE("mode %ld (current) -- getting current mode (%s)\n", n, handler_name);
+        n = pGetCurrentMode();
+    }
+    if (n == (DWORD)-2)
+    {
+        TRACE("mode %ld (registry) -- getting default mode (%s)\n", n, handler_name);
+        n = dd_mode_default;
+    }
+    if (n < dd_mode_count)
+    {
+        devmode->dmPelsWidth = dd_modes[n].dwWidth;
+        devmode->dmPelsHeight = dd_modes[n].dwHeight;
+        devmode->dmBitsPerPel = dd_modes[n].dwBPP;
+        devmode->dmDisplayFrequency = dd_modes[n].wRefreshRate;
+        devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
+        if (devmode->dmDisplayFrequency)
+        {
+            devmode->dmFields |= DM_DISPLAYFREQUENCY;
+            TRACE("mode %ld -- %ldx%ldx%ldbpp @%ld Hz (%s)\n", n,
+                  devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel,
+                  devmode->dmDisplayFrequency, handler_name);
+        }
+        else
+        {
+            TRACE("mode %ld -- %ldx%ldx%ldbpp (%s)\n", n,
+                  devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, 
+                  handler_name);
+        }
+        return TRUE;
+    }
+    TRACE("mode %ld -- not present (%s)\n", n, handler_name);
+    return FALSE;
+}
+
+#define _X_FIELD(prefix, bits) if ((fields) & prefix##_##bits) {p+=sprintf(p, "%s%s", first ? "" : ",", #bits); first=FALSE;}
+static const char * _CDS_flags(DWORD fields)
+{
+    BOOL first = TRUE;
+    char buf[128];
+    char *p = buf;
+    _X_FIELD(CDS,UPDATEREGISTRY);_X_FIELD(CDS,TEST);_X_FIELD(CDS,FULLSCREEN);
+    _X_FIELD(CDS,GLOBAL);_X_FIELD(CDS,SET_PRIMARY);_X_FIELD(CDS,RESET);
+    _X_FIELD(CDS,SETRECT);_X_FIELD(CDS,NORESET);
+    *p = 0;
+    return wine_dbg_sprintf("%s", buf);
+}
+static const char * _DM_fields(DWORD fields)
+{
+    BOOL first = TRUE;
+    char buf[128];
+    char *p = buf;
+    _X_FIELD(DM,BITSPERPEL);_X_FIELD(DM,PELSWIDTH);_X_FIELD(DM,PELSHEIGHT);
+    _X_FIELD(DM,DISPLAYFLAGS);_X_FIELD(DM,DISPLAYFREQUENCY);_X_FIELD(DM,POSITION);
+    *p = 0;
+    return wine_dbg_sprintf("%s", buf);
+}
+#undef _X_FIELD
+
+/***********************************************************************
+ *		ChangeDisplaySettingsExW  (X11DRV.@)
+ *
+ */
+LONG X11DRV_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
+                                      HWND hwnd, DWORD flags, LPVOID lpvoid )
+{
+    DWORD i;
+    DEVMODEW dm;
+
+    TRACE("(%s,%p,%p,0x%08lx,%p)\n",debugstr_w(devname),devmode,hwnd,flags,lpvoid);
+    TRACE("flags=%s\n",_CDS_flags(flags));
+    if (devmode)
+    {
+        TRACE("DM_fields=%s\n",_DM_fields(devmode->dmFields));
+        TRACE("width=%ld height=%ld bpp=%ld freq=%ld (%s)\n",
+              devmode->dmPelsWidth,devmode->dmPelsHeight,
+              devmode->dmBitsPerPel,devmode->dmDisplayFrequency, handler_name);
+    }
+    else
+    {
+        TRACE("Return to original display mode (%s)\n", handler_name);
+        if (!X11DRV_EnumDisplaySettingsExW(devname, dd_mode_default, &dm, 0))
+        {
+            ERR("Default mode not found!\n");
+            return DISP_CHANGE_BADMODE;
+        }
+        devmode = &dm;
+    }
+
+    for (i = 0; i < dd_mode_count; i++)
+    {
+        if (devmode->dmFields & DM_BITSPERPEL)
+        {
+            if (devmode->dmBitsPerPel != dd_modes[i].dwBPP)
+                continue;
+        }
+        if (devmode->dmFields & DM_PELSWIDTH)
+        {
+            if (devmode->dmPelsWidth != dd_modes[i].dwWidth)
+                continue;
+        }
+        if (devmode->dmFields & DM_PELSHEIGHT)
+        {
+            if (devmode->dmPelsHeight != dd_modes[i].dwHeight)
+                continue;
+        }
+        if (devmode->dmFields & DM_DISPLAYFREQUENCY)
+        {
+            if (devmode->dmDisplayFrequency != dd_modes[i].wRefreshRate)
+                continue;
+        }
+        /* we have a valid mode */
+        TRACE("Requested display settings match mode %ld (%s)\n", i, handler_name);
+        pSetCurrentMode(i);
+        return DISP_CHANGE_SUCCESSFUL;
+    }
+
+    /* no valid modes found */
+    ERR("No matching mode found! (%s)\n", handler_name);
+    return DISP_CHANGE_BADMODE;
+}
+
+
+
+
+/***********************************************************************
+ * DirectDraw HAL interface
+ *
+ */
+static DWORD PASCAL X11DRV_Settings_SetMode(LPDDHAL_SETMODEDATA data)
+{
+    TRACE("Mode %ld requested by DDHAL (%s)\n", data->dwModeIndex, handler_name);
+    pSetCurrentMode(data->dwModeIndex);
+    X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
+    data->ddRVal = DD_OK;
+    return DDHAL_DRIVER_HANDLED;
+}
+int X11DRV_Settings_CreateDriver(LPDDHALINFO info)
+{
+    if (!dd_mode_count) return 0; /* no settings defined */
+
+    TRACE("Setting up display settings for DDRAW (%s)\n", handler_name);
+    info->dwNumModes = dd_mode_count;
+    info->lpModeInfo = dd_modes;
+    X11DRV_DDHAL_SwitchMode(pGetCurrentMode(), NULL, NULL);
+    info->lpDDCallbacks->SetMode = X11DRV_Settings_SetMode;
+    return TRUE;
+}
diff -Nu old-wine/dlls/x11drv/xrandr.c wine/dlls/x11drv/xrandr.c
--- old-wine/dlls/x11drv/xrandr.c	1969-12-31 18:00:00.000000000 -0600
+++ wine/dlls/x11drv/xrandr.c	2003-10-11 01:46:47.000000000 -0500
@@ -0,0 +1,260 @@
+/*
+ * Wine X11drv Xrandr interface
+ *
+ * Copyright 2003 Alexander James Pasadyn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+#include <string.h>
+#include <stdio.h>
+
+#ifdef HAVE_LIBXRANDR
+
+#include "ts_xlib.h"
+
+#include <X11/extensions/Xrandr.h>
+#include "x11drv.h"
+
+#include "x11ddraw.h"
+#include "xrandr.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "ddrawi.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(xrandr);
+
+extern int usexrandr;
+
+static int xrandr_event, xrandr_error, xrandr_major, xrandr_minor;
+
+static LPDDHALMODEINFO dd_modes;
+static unsigned int dd_mode_count;
+static XRRScreenSize *real_xrandr_sizes;
+static short **real_xrandr_rates;
+static unsigned int real_xrandr_sizes_count;
+static int *real_xrandr_rates_count;
+static unsigned int real_xrandr_modes_count;
+
+static int XRandRErrorHandler(Display *dpy, XErrorEvent *event, void *arg)
+{
+    return 1;
+}
+
+static Bool in_desktop_mode;
+static const unsigned int depths[]  = {8, 16, 32};
+
+/* create the mode structures */
+static void make_modes(void)
+{
+    int i, j;
+    for (i=0; i<real_xrandr_sizes_count; i++)
+    {
+        if (real_xrandr_rates_count[i])
+        {
+            for (j=0; j < real_xrandr_rates_count[i]; j++)
+            {
+                X11DRV_Settings_AddOneMode(real_xrandr_sizes[i].width, 
+                                           real_xrandr_sizes[i].height, 
+                                           0, real_xrandr_rates[i][j]);
+            }
+        }
+        else
+        {
+            X11DRV_Settings_AddOneMode(real_xrandr_sizes[i].width, 
+                                       real_xrandr_sizes[i].height, 
+                                       0, 0);
+        }
+    }
+}
+
+static int X11DRV_XRandR_GetCurrentMode(void)
+{
+    SizeID size;
+    Rotation rot;
+    Window root;
+    XRRScreenConfiguration *sc;
+    short rate;
+    int i;
+    int res = -1;
+    
+    wine_tsx11_lock();
+    root = RootWindow (gdi_display, DefaultScreen(gdi_display));
+    sc = XRRGetScreenInfo (gdi_display, root);
+    size = XRRConfigCurrentConfiguration (sc, &rot);
+    rate = XRRConfigCurrentRate (sc);
+    for (i = 0; i < real_xrandr_modes_count; i++)
+    {
+        if ( (dd_modes[i].dwWidth      == real_xrandr_sizes[size].width ) &&
+             (dd_modes[i].dwHeight     == real_xrandr_sizes[size].height) &&
+             (dd_modes[i].wRefreshRate == rate                          ) )
+          {
+              res = i;
+          }
+    }
+    XRRFreeScreenConfigInfo(sc);
+    wine_tsx11_unlock();
+    if (res == -1)
+    {
+        ERR("In unknown mode, returning default\n");
+        res = 0;
+    }
+    return res;
+}
+
+static void X11DRV_XRandR_SetCurrentMode(int mode)
+{
+    SizeID size;
+    Rotation rot;
+    Window root;
+    XRRScreenConfiguration *sc;
+    Status stat = RRSetConfigSuccess;
+    short rate;
+    int i, j;
+    DWORD dwBpp = screen_depth;
+    if (dwBpp == 24) dwBpp = 32;
+    
+    wine_tsx11_lock();
+    root = RootWindow (gdi_display, DefaultScreen(gdi_display));
+    sc = XRRGetScreenInfo (gdi_display, root);
+    size = XRRConfigCurrentConfiguration (sc, &rot);
+    if (dwBpp != dd_modes[mode].dwBPP)
+    {
+        FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[mode].dwBPP);
+    }
+    mode = mode%real_xrandr_modes_count;
+    for (i = 0; i < real_xrandr_sizes_count; i++)
+    {
+        if ( (dd_modes[mode].dwWidth  == real_xrandr_sizes[i].width ) && 
+             (dd_modes[mode].dwHeight == real_xrandr_sizes[i].height) )
+        {
+            size = i;
+            if (real_xrandr_rates_count[i])
+            {
+                for (j=0; j < real_xrandr_rates_count[i]; j++)
+                {
+                    if (dd_modes[mode].wRefreshRate == real_xrandr_rates[i][j])
+                    {
+                        rate = real_xrandr_rates[i][j];
+                        TRACE("Resizing X display to %ldx%ld @%d Hz\n", 
+                              dd_modes[mode].dwWidth, dd_modes[mode].dwHeight, rate);
+                        stat = XRRSetScreenConfigAndRate (gdi_display, sc, root, 
+                                                          size, rot, rate, CurrentTime);
+                        FIXME("Need to update SYSMETRICS after resizing display (now %ldx%ld)\n",
+                              dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+                    }
+                }
+            }
+            else
+            {
+                TRACE("Resizing X display to %ldx%ld\n", 
+                      dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+                stat = XRRSetScreenConfig (gdi_display, sc, root, 
+                                           size, rot, CurrentTime);
+                FIXME("Need to update SYSMETRICS after resizing display (now %ldx%ld)\n",
+                      dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+            }
+        }
+    }
+    if (stat != RRSetConfigSuccess)
+    {
+        ERR("Resolution change not successful -- perhaps display has chaned?");
+    }
+    XRRFreeScreenConfigInfo(sc);
+    wine_tsx11_unlock();
+}
+
+void X11DRV_XRandR_Init(void)
+{
+    Bool ok;
+    int nmodes = 0;
+    int i;
+    in_desktop_mode = (root_window != DefaultRootWindow(gdi_display));
+
+    if (xrandr_major) return; /* already initialized? */
+    if (!usexrandr) return; /* disabled in config */
+    if (in_desktop_mode) return; /* not compatible with desktop mode */
+
+    /* see if Xrandr is available */
+    wine_tsx11_lock();
+    ok = XRRQueryExtension(gdi_display, &xrandr_event, &xrandr_error);
+    if (ok)
+    {
+        X11DRV_expect_error(gdi_display, XRandRErrorHandler, NULL);
+        ok = XRRQueryVersion(gdi_display, &xrandr_major, &xrandr_minor);
+        if (X11DRV_check_error()) ok = FALSE;
+    }
+    if (ok)
+    {
+        TRACE("Found XRandR - major: %d, minor: %d\n", xrandr_major, xrandr_minor);
+        /* retrieve modes */
+        real_xrandr_sizes = XRRSizes(gdi_display, DefaultScreen(gdi_display), &real_xrandr_sizes_count);
+        ok = (real_xrandr_sizes_count>0);
+    }
+    if (ok)
+    {
+        real_xrandr_rates = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(short *) * real_xrandr_sizes_count);
+        real_xrandr_rates_count = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * real_xrandr_sizes_count);
+        for (i=0; i < real_xrandr_sizes_count; i++)
+        {
+            real_xrandr_rates[i] = XRRRates (gdi_display, DefaultScreen(gdi_display), i, &(real_xrandr_rates_count[i]));
+            if (real_xrandr_rates_count[i])
+            {
+                nmodes += real_xrandr_rates_count[i];
+            }
+            else
+            {
+                nmodes++;
+            }
+        }
+    }
+    wine_tsx11_unlock();
+    if (!ok) return;
+
+    real_xrandr_modes_count = nmodes;
+    TRACE("XRandR modes: count=%d\n", nmodes);
+
+    dd_modes = X11DRV_Settings_SetHandlers("XRandR", 
+                                           X11DRV_XRandR_GetCurrentMode, 
+                                           X11DRV_XRandR_SetCurrentMode, 
+                                           nmodes, 1);
+    make_modes();
+    X11DRV_Settings_AddDepthModes();
+    dd_mode_count = X11DRV_Settings_GetModeCount();
+    X11DRV_Settings_SetDefaultMode(0);
+
+    TRACE("Available DD modes: count=%d\n", dd_mode_count);
+    TRACE("Enabling XRandR\n");
+}
+
+void X11DRV_XRandR_Cleanup(void)
+{
+    if (real_xrandr_rates)
+    {
+        HeapFree(GetProcessHeap(), 0, real_xrandr_rates);
+        real_xrandr_rates = NULL;
+    }
+    if (real_xrandr_rates_count)
+    {
+        HeapFree(GetProcessHeap(), 0, real_xrandr_rates_count);
+        real_xrandr_rates_count = NULL;
+    }
+}
+
+#endif /* HAVE_LIBXRANDR */
diff -Nu old-wine/dlls/x11drv/xrandr.h wine/dlls/x11drv/xrandr.h
--- old-wine/dlls/x11drv/xrandr.h	1969-12-31 18:00:00.000000000 -0600
+++ wine/dlls/x11drv/xrandr.h	2003-10-11 01:17:11.000000000 -0500
@@ -0,0 +1,33 @@
+/*
+ * Wine X11drv Xrandr interface
+ *
+ * Copyright 2003 Alexander James Pasadyn
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __WINE_XRANDR_H
+#define __WINE_XRANDR_H
+
+#ifndef __WINE_CONFIG_H
+# error You must include config.h to use this header
+#endif
+
+#ifdef HAVE_LIBXRANDR
+
+void X11DRV_XRandR_Init(void);
+void X11DRV_XRandR_Cleanup(void);
+
+#endif /* HAVE_LIBXRANDR */
+#endif /* __WINE_XRANDR_H */


More information about the wine-patches mailing list