Guts of a simple XVidMode-supporting DirectDraw HAL in x11drv.
[wine] / dlls / x11drv / xvidmode.c
1 /*
2  * DirectDraw XVidMode interface
3  *
4  * Copyright 2001 TransGaming Technologies, Inc.
5  */
6
7 #include "config.h"
8
9 /* FIXME: XVidMode also includes gamma functions,
10  * we could perhaps use it to implement Get/SetGammaRamp */
11
12 /* FIXME: ChangeDisplaySettings ought to be able to use this */
13
14 #ifdef HAVE_LIBXXF86VM
15
16 #include "ts_xlib.h"
17 #include "ts_xf86vmode.h"
18 #include "x11drv.h"
19
20 #include "windef.h"
21 #include "wingdi.h"
22 #include "ddrawi.h"
23 #include "debugtools.h"
24
25 DEFAULT_DEBUG_CHANNEL(x11drv);
26
27 LPDDHALMODEINFO xf86vm_modes;
28 unsigned xf86vm_mode_count;
29 XF86VidModeModeInfo** modes;
30
31 #define CONVERT_MODE(dotclock) \
32   info->dwWidth      = mode->hdisplay; \
33   info->dwHeight     = mode->vdisplay; \
34   info->wRefreshRate = dotclock * 1000 / (mode->htotal * mode->vtotal); \
35   TRACE(" width=%ld, height=%ld, refresh=%d\n", \
36         info->dwWidth, info->dwHeight, info->wRefreshRate); \
37   /* XVidMode cannot change display depths... */ \
38   /* let's not bother with filling out these then... */ \
39   info->lPitch         = 0; \
40   info->dwBPP          = 0; \
41   info->wFlags         = 0; \
42   info->dwRBitMask     = 0; \
43   info->dwGBitMask     = 0; \
44   info->dwBBitMask     = 0; \
45   info->dwAlphaBitMask = 0;
46
47 static void convert_modeinfo(XF86VidModeModeInfo *mode, LPDDHALMODEINFO info)
48 {
49   CONVERT_MODE(mode->dotclock)
50 }
51
52 static void convert_modeline(int dotclock, XF86VidModeModeLine *mode, LPDDHALMODEINFO info)
53 {
54   CONVERT_MODE(dotclock)
55 }
56
57 void X11DRV_XF86VM_Init(void)
58 {
59   int nmodes, major, minor, i;
60
61   if (xf86vm_modes) return; /* already initialized? */
62
63   /* if in desktop mode, don't use XVidMode */
64   if (X11DRV_GetXRootWindow() != DefaultRootWindow(display)) return;
65
66   /* see if XVidMode is available */
67   if (!TSXF86VidModeQueryVersion(display, &major, &minor)) return;
68
69   /* retrieve modes */
70   if (!TSXF86VidModeGetAllModeLines(display, DefaultScreen(display), &nmodes,
71                                     &modes))
72     return;
73
74   TRACE("XVidMode modes: count=%d\n", nmodes);
75
76   xf86vm_mode_count = nmodes;
77   xf86vm_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * nmodes);
78
79   /* convert modes to DDHALMODEINFO format */
80   for (i=0; i<nmodes; i++)
81     convert_modeinfo(modes[i], &xf86vm_modes[i]);
82
83   TRACE("Enabling XVidMode\n");
84 }
85
86 void X11DRV_XF86VM_Cleanup(void)
87 {
88   TSXFree(modes);
89 }
90
91 int X11DRV_XF86VM_GetCurrentMode(void)
92 {
93   XF86VidModeModeLine line;
94   int dotclock, i;
95   DDHALMODEINFO cmode;
96
97   TRACE("Querying XVidMode current mode\n");
98   TSXF86VidModeGetModeLine(display, DefaultScreen(display), &dotclock, &line);
99   convert_modeline(dotclock, &line, &cmode);
100   for (i=0; i<xf86vm_mode_count; i++)
101     if (memcmp(&xf86vm_modes[i], &cmode, sizeof(cmode)) == 0) {
102       TRACE("mode=%d\n", i);
103       return i;
104     }
105   ERR("unknown mode, shouldn't happen\n");
106   return 0; /* return first mode */
107 }
108
109 void X11DRV_XF86VM_SetCurrentMode(int mode)
110 {
111   TSXF86VidModeSwitchToMode(display, DefaultScreen(display), modes[mode]);
112   TSXF86VidModeSetViewPort(display, DefaultScreen(display), 0, 0);
113   TSXSync(display, False);
114 }
115
116 void X11DRV_XF86VM_SetExclusiveMode(int lock)
117 {
118   TSXF86VidModeLockModeSwitch(display, DefaultScreen(display), lock);
119 }
120
121 #endif /* HAVE_LIBXXF86VM */