Added DECL_GLOBAL_CONSTRUCTOR macro.
[wine.git] / dlls / ddraw / x11.c
blob24217c69a9fa0f8e542aa82a6e8b5d405a5995d0
1 /* DirectDraw using DGA or Xlib(XSHM)
3 * Copyright 1997-1999 Marcus Meissner
4 * Copyright 1998 Lionel Ulmer (most of Direct3D stuff)
5 */
6 #include "config.h"
8 #include <unistd.h>
9 #include <assert.h>
10 #include <fcntl.h>
11 #include <string.h>
12 #include <stdio.h>
14 #include "winerror.h"
15 #include "options.h"
16 #include "monitor.h"
17 #include "debugtools.h"
18 #include "ddraw.h"
20 DEFAULT_DEBUG_CHANNEL(ddraw);
22 #include "x11_private.h"
24 #ifdef HAVE_LIBXXSHM
25 int XShmErrorFlag = 0;
26 #endif
28 static inline BOOL get_option( const char *name, BOOL def ) {
29 return PROFILE_GetWineIniBool( "x11drv", name, def );
32 static BOOL
33 DDRAW_XSHM_Available(void) {
34 #ifdef HAVE_LIBXXSHM
35 if (get_option( "UseXShm", 1 )) {
36 if (TSXShmQueryExtension(display)) {
37 int major,minor;
38 Bool shpix;
40 if (TSXShmQueryVersion(display, &major, &minor, &shpix))
41 return TRUE;
44 #endif
45 return FALSE;
48 static HRESULT X11_Create( LPDIRECTDRAW *lplpDD ) {
49 IDirectDrawImpl* ddraw;
50 int depth;
51 x11_dd_private *x11priv;
53 if (lplpDD == NULL) /* Testing ... this driver works all the time */
54 return DD_OK;
56 *lplpDD = (LPDIRECTDRAW)HeapAlloc(
57 GetProcessHeap(),
58 HEAP_ZERO_MEMORY,
59 sizeof(IDirectDrawImpl)
61 ddraw = (IDirectDrawImpl*)*lplpDD;
62 ICOM_VTBL(ddraw)= &xlib_ddvt;
63 ddraw->ref = 1;
64 ddraw->private = HeapAlloc(
65 GetProcessHeap(),
66 HEAP_ZERO_MEMORY,
67 sizeof(x11_dd_private)
69 x11priv = (x11_dd_private*)ddraw->private;
71 /* At DirectDraw creation, the depth is the default depth */
72 depth = DefaultDepthOfScreen(X11DRV_GetXScreen());
73 _common_depth_to_pixelformat(depth,
74 &(ddraw->d.directdraw_pixelformat),
75 &(ddraw->d.screen_pixelformat),
76 &(ddraw->d.pixmap_depth));
77 ddraw->d.height = MONITOR_GetHeight(&MONITOR_PrimaryMonitor);
78 ddraw->d.width = MONITOR_GetWidth(&MONITOR_PrimaryMonitor);
79 #ifdef HAVE_LIBXXSHM
80 /* Test if XShm is available. */
81 if ((x11priv->xshm_active = DDRAW_XSHM_Available())) {
82 x11priv->xshm_compl = 0;
83 TRACE("Using XShm extension.\n");
85 #endif
86 return DD_OK;
89 /* Where do these GUIDs come from? mkuuid.
90 * They exist solely to distinguish between the targets Wine support,
91 * and should be different than any other GUIDs in existence.
93 static GUID X11_DirectDraw_GUID = { /* 1574a740-dc61-11d1-8407-f7875a7d1879 */
94 0x1574a740,
95 0xdc61,
96 0x11d1,
97 {0x84, 0x07, 0xf7, 0x87, 0x5a, 0x7d, 0x18, 0x79}
100 ddraw_driver x11_driver = {
101 &X11_DirectDraw_GUID,
102 "display",
103 "WINE X11 DirectDraw Driver",
105 X11_Create
108 DECL_GLOBAL_CONSTRUCTOR(X11_register) { ddraw_register_driver(&x11_driver); }