winex11: Store the full visual info for the default visual.

This commit is contained in:
Alexandre Julliard 2012-09-25 15:51:03 +02:00
parent 0a9398421c
commit 988f2fde86
12 changed files with 101 additions and 148 deletions

View File

@ -1195,7 +1195,7 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HRGN clip, BITMAPINFO *info,
X11DRV_PDEVICE *physdev = get_x11drv_dev( dev );
DWORD ret;
XImage *image;
XVisualInfo vis;
XVisualInfo vis = default_visual;
struct gdi_image_bits dst_bits;
const XPixmapFormatValues *format;
const BYTE *opcode = BITBLT_Opcodes[(rop >> 16) & 0xff];
@ -1217,7 +1217,7 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HRGN clip, BITMAPINFO *info,
if (!bits) return ERROR_SUCCESS; /* just querying the format */
if ((src->width != dst->width) || (src->height != dst->height)) return ERROR_TRANSFORM_NOT_SUPPORTED;
image = XCreateImage( gdi_display, visual, vis.depth, ZPixmap, 0, NULL,
image = XCreateImage( gdi_display, vis.visual, vis.depth, ZPixmap, 0, NULL,
info->bmiHeader.biWidth, src->visrect.bottom - src->visrect.top, 32, 0 );
if (!image) return ERROR_OUTOFMEMORY;
@ -1286,7 +1286,7 @@ DWORD X11DRV_GetImage( PHYSDEV dev, BITMAPINFO *info,
X11DRV_PDEVICE *physdev = get_x11drv_dev( dev );
DWORD ret = ERROR_SUCCESS;
XImage *image;
XVisualInfo vis;
XVisualInfo vis = default_visual;
UINT align, x, y, width, height;
struct gdi_image_bits src_bits;
const XPixmapFormatValues *format;
@ -1403,7 +1403,7 @@ static DWORD put_pixmap_image( Pixmap pixmap, const XVisualInfo *vis,
coords.height = abs( info->bmiHeader.biHeight );
SetRect( &coords.visrect, 0, 0, coords.width, coords.height );
image = XCreateImage( gdi_display, visual, vis->depth, ZPixmap, 0, NULL,
image = XCreateImage( gdi_display, vis->visual, vis->depth, ZPixmap, 0, NULL,
coords.width, coords.height, 32, 0 );
if (!image) return ERROR_OUTOFMEMORY;
@ -1870,7 +1870,7 @@ struct window_surface *create_surface( Window window, const XVisualInfo *vis, co
surface->bits.free = free_heap_bits;
surface->image = XCreateImage( gdi_display, visual, vis->depth, ZPixmap, 0, NULL,
surface->image = XCreateImage( gdi_display, vis->visual, vis->depth, ZPixmap, 0, NULL,
width, height, 32, 0 );
if (!surface->image) goto failed;
surface->gc = XCreateGC( gdi_display, window, 0, NULL );

View File

@ -115,7 +115,7 @@ static Pixmap BRUSH_DitherColor( COLORREF color, int depth)
XLockDisplay( gdi_display );
if (!ditherImage)
{
ditherImage = XCreateImage( gdi_display, visual, depth, ZPixmap, 0,
ditherImage = XCreateImage( gdi_display, default_visual.visual, depth, ZPixmap, 0,
NULL, MATRIX_SIZE, MATRIX_SIZE, 32, 0 );
if (!ditherImage)
{
@ -182,7 +182,7 @@ static Pixmap BRUSH_DitherMono( COLORREF color )
static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color )
{
COLORREF colorRGB = X11DRV_PALETTE_GetColor( physDev, color );
if ((physDev->depth > 1) && (screen_depth <= 8) && !X11DRV_IsSolidColor( color ))
if ((physDev->depth > 1) && (default_visual.depth <= 8) && !X11DRV_IsSolidColor( color ))
{
/* Dithered brush */
physDev->brush.pixmap = BRUSH_DitherColor( colorRGB, physDev->depth );
@ -206,22 +206,11 @@ static void BRUSH_SelectSolidBrush( X11DRV_PDEVICE *physDev, COLORREF color )
static BOOL select_pattern_brush( X11DRV_PDEVICE *physdev, const struct brush_pattern *pattern )
{
XVisualInfo vis;
XVisualInfo vis = default_visual;
Pixmap pixmap;
const BITMAPINFO *info = pattern->info;
memset( &vis, 0, sizeof(vis) );
vis.visual = visual;
vis.visualid = visual->visualid;
if (physdev->depth > 1 && info->bmiHeader.biBitCount > 1)
{
vis.depth = screen_depth;
vis.red_mask = visual->red_mask;
vis.green_mask = visual->green_mask;
vis.blue_mask = visual->blue_mask;
}
else vis.depth = 1;
if (physdev->depth == 1 || info->bmiHeader.biBitCount == 1) vis.depth = 1;
pixmap = create_pixmap_from_image( physdev->dev.hdc, &vis, info, &pattern->bits, pattern->usage );
if (!pixmap) return FALSE;

View File

@ -259,13 +259,8 @@ static Window thread_selection_wnd(void)
if (!w)
{
XSetWindowAttributes attr;
attr.event_mask = (ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | EnterWindowMask | PropertyChangeMask);
w = XCreateWindow(thread_data->display, root_window, 0, 0, 1, 1, 0, screen_depth,
InputOutput, CopyFromParent, CWEventMask, &attr);
w = XCreateWindow(thread_data->display, root_window, 0, 0, 1, 1, 0, CopyFromParent,
InputOnly, CopyFromParent, 0, NULL);
if (w)
thread_data->selection_wnd = w;
else
@ -1319,7 +1314,7 @@ static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *display, Window w, Atom p
if (X11DRV_CLIPBOARD_ReadProperty(display, w, prop, &lpdata, &cbytes))
{
XVisualInfo vis;
XVisualInfo vis = default_visual;
char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
BITMAPINFO *info = (BITMAPINFO *)buffer;
struct gdi_image_bits bits;
@ -1338,18 +1333,7 @@ static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *display, Window w, Atom p
TRACE("\tPixmap properties: width=%d, height=%d, depth=%d\n",
width, height, depth);
memset( &vis, 0, sizeof(vis) );
vis.depth = depth;
if (depth == screen_depth)
{
vis.visual = visual;
vis.visualid = visual->visualid;
vis.class = visual->class;
vis.red_mask = visual->red_mask;
vis.green_mask = visual->green_mask;
vis.blue_mask = visual->blue_mask;
}
else switch (pixmap_formats[depth]->bits_per_pixel)
if (depth != vis.depth) switch (pixmap_formats[depth]->bits_per_pixel)
{
case 1:
case 4:
@ -1757,24 +1741,14 @@ static HANDLE X11DRV_CLIPBOARD_ExportXAPIXMAP(Display *display, Window requestor
if (!lpdata->drvData) /* If not already rendered */
{
Pixmap pixmap;
XVisualInfo vis;
LPBITMAPINFO pbmi;
struct gdi_image_bits bits;
memset( &vis, 0, sizeof(vis) );
vis.visual = visual;
vis.depth = screen_depth;
vis.visualid = visual->visualid;
vis.class = visual->class;
vis.red_mask = visual->red_mask;
vis.green_mask = visual->green_mask;
vis.blue_mask = visual->blue_mask;
pbmi = GlobalLock( lpdata->hData );
bits.ptr = (LPBYTE)pbmi + bitmap_info_size( pbmi, DIB_RGB_COLORS );
bits.free = NULL;
bits.is_copy = FALSE;
pixmap = create_pixmap_from_image( 0, &vis, pbmi, &bits, DIB_RGB_COLORS );
pixmap = create_pixmap_from_image( 0, &default_visual, pbmi, &bits, DIB_RGB_COLORS );
GlobalUnlock( lpdata->hData );
lpdata->drvData = pixmap;
}

View File

@ -143,14 +143,14 @@ Window CDECL X11DRV_create_desktop( UINT width, UINT height )
PointerMotionMask | ButtonPressMask | ButtonReleaseMask | FocusChangeMask;
win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );
if (visual != DefaultVisual( display, DefaultScreen(display) ))
if (default_visual.visual != DefaultVisual( display, DefaultScreen(display) ))
win_attr.colormap = XCreateColormap( display, DefaultRootWindow(display),
visual, AllocNone );
default_visual.visual, AllocNone );
else
win_attr.colormap = None;
win = XCreateWindow( display, DefaultRootWindow(display),
0, 0, width, height, 0, screen_depth, InputOutput, visual,
0, 0, width, height, 0, default_visual.depth, InputOutput, default_visual.visual,
CWEventMask | CWCursor | CWColormap, &win_attr );
if (win != None && width == screen_width && height == screen_height)
{

View File

@ -128,7 +128,7 @@ static BOOL X11DRV_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device,
if (!physDev) return FALSE;
physDev->depth = screen_depth;
physDev->depth = default_visual.depth;
physDev->color_shifts = &X11DRV_PALETTE_default_shifts;
SetRect( &physDev->dc_rect, 0, 0, virtual_screen_rect.right - virtual_screen_rect.left,
virtual_screen_rect.bottom - virtual_screen_rect.top );
@ -236,7 +236,7 @@ static INT X11DRV_GetDeviceCaps( PHYSDEV dev, INT cap )
/* MSDN: Number of entries in the device's color table, if the device has
* a color depth of no more than 8 bits per pixel.For devices with greater
* color depths, -1 is returned. */
return (screen_depth > 8) ? -1 : (1 << screen_depth);
return (default_visual.depth > 8) ? -1 : (1 << default_visual.depth);
case PDEVICESIZE:
return sizeof(X11DRV_PDEVICE);
case CURVECAPS:

View File

@ -930,7 +930,7 @@ static Cursor create_xlib_monochrome_cursor( HDC hdc, const ICONINFOEXW *icon, i
unsigned char *mask_bits = NULL;
GC gc;
XColor fg, bg;
XVisualInfo vis;
XVisualInfo vis = default_visual;
Pixmap src_pixmap, bits_pixmap, mask_pixmap;
struct gdi_image_bits bits;
Cursor cursor = 0;
@ -1018,7 +1018,7 @@ static Cursor create_xlib_color_cursor( HDC hdc, const ICONINFOEXW *icon, int wi
BITMAPINFO *info = (BITMAPINFO *)buffer;
XColor fg, bg;
Cursor cursor = None;
XVisualInfo vis;
XVisualInfo vis = default_visual;
Pixmap xor_pixmap, mask_pixmap;
struct gdi_image_bits bits;
unsigned int *color_bits = NULL, *ptr;

View File

@ -983,7 +983,7 @@ static void init_pixel_formats( Display *display )
* As of the introduction of composition managers at least Nvidia now also offers ARGB visuals
* with a depth of 32 in addition to the default 24 bit. In order to prevent BadMatch errors we only
* list formats with the same depth. */
if(visinfo->depth != screen_depth)
if(visinfo->depth != default_visual.depth)
{
XFree(visinfo);
continue;
@ -1233,7 +1233,7 @@ BOOL set_win_format( HWND hwnd, XID fbconfig_id )
if (parent)
gl->drawable = XCreateWindow( gdi_display, parent, gl->rect.left, gl->rect.top,
gl->rect.right - gl->rect.left, gl->rect.bottom - gl->rect.top,
0, screen_depth, InputOutput, gl->visual->visual,
0, default_visual.depth, InputOutput, gl->visual->visual,
CWBitGravity | CWWinGravity | CWBackingStore | CWColormap,
&attrib );
if (gl->drawable)
@ -1249,8 +1249,8 @@ BOOL set_win_format( HWND hwnd, XID fbconfig_id )
attrib.override_redirect = True;
if (!dummy_parent)
{
dummy_parent = XCreateWindow( gdi_display, root_window, -1, -1, 1, 1, 0, screen_depth,
InputOutput, visual, CWOverrideRedirect, &attrib );
dummy_parent = XCreateWindow( gdi_display, root_window, -1, -1, 1, 1, 0, default_visual.depth,
InputOutput, default_visual.visual, CWOverrideRedirect, &attrib );
XMapWindow( gdi_display, dummy_parent );
}
gl->colormap = XCreateColormap(gdi_display, dummy_parent, gl->visual->visual,

View File

@ -149,9 +149,9 @@ int X11DRV_PALETTE_Init(void)
for( mask = 1; !((white & mask)^(black & mask)); mask <<= 1 )
monoPlane++;
X11DRV_PALETTE_PaletteFlags = (white & mask) ? X11DRV_PALETTE_WHITESET : 0;
palette_size = visual->map_entries;
palette_size = default_visual.colormap_size;
switch(visual->class)
switch(default_visual.class)
{
case DirectColor:
X11DRV_PALETTE_PaletteFlags |= X11DRV_PALETTE_VIRTUAL;
@ -162,7 +162,7 @@ int X11DRV_PALETTE_Init(void)
XSetWindowAttributes win_attr;
X11DRV_PALETTE_PaletteXColormap = XCreateColormap( gdi_display, root_window,
visual, AllocAll );
default_visual.visual, AllocAll );
if (X11DRV_PALETTE_PaletteXColormap)
{
X11DRV_PALETTE_PaletteFlags |= (X11DRV_PALETTE_PRIVATE | X11DRV_PALETTE_WHITESET);
@ -179,15 +179,15 @@ int X11DRV_PALETTE_Init(void)
}
} else {
X11DRV_PALETTE_PaletteXColormap = XCreateColormap(gdi_display, root_window,
visual, AllocNone);
default_visual.visual, AllocNone);
}
break;
case StaticGray:
X11DRV_PALETTE_PaletteXColormap = XCreateColormap(gdi_display, root_window,
visual, AllocNone);
default_visual.visual, AllocNone);
X11DRV_PALETTE_PaletteFlags |= X11DRV_PALETTE_FIXED;
X11DRV_PALETTE_Graymax = (1 << screen_depth)-1;
X11DRV_PALETTE_Graymax = (1 << default_visual.depth)-1;
break;
case TrueColor:
@ -204,21 +204,21 @@ int X11DRV_PALETTE_Init(void)
monoPlane++;
X11DRV_PALETTE_PaletteFlags = (white & mask) ? X11DRV_PALETTE_WHITESET : 0;
X11DRV_PALETTE_PaletteXColormap = XCreateColormap(gdi_display, root_window,
visual, AllocNone);
default_visual.visual, AllocNone);
}
else
{
X11DRV_PALETTE_PaletteXColormap = XCreateColormap(gdi_display, root_window,
visual, AllocNone);
default_visual.visual, AllocNone);
X11DRV_PALETTE_PaletteFlags |= X11DRV_PALETTE_FIXED;
X11DRV_PALETTE_ComputeColorShifts(&X11DRV_PALETTE_default_shifts, visual->red_mask, visual->green_mask, visual->blue_mask);
X11DRV_PALETTE_ComputeColorShifts(&X11DRV_PALETTE_default_shifts, default_visual.red_mask, default_visual.green_mask, default_visual.blue_mask);
}
XFree(depths);
break;
}
}
TRACE(" visual class %i (%i)\n", visual->class, monoPlane);
TRACE(" visual class %i (%i)\n", default_visual.class, monoPlane);
GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, NB_RESERVED_COLORS, sys_pal_template );
@ -242,7 +242,7 @@ int X11DRV_PALETTE_Init(void)
X11DRV_PALETTE_FormatSystemPalette();
X11DRV_PALETTE_FillDefaultColors( sys_pal_template );
palette_size = visual->map_entries;
palette_size = default_visual.colormap_size;
}
return palette_size;
@ -424,7 +424,7 @@ static BOOL X11DRV_PALETTE_BuildSharedMap( const PALETTEENTRY *sys_pal_template
bp = BlackPixel(gdi_display, DefaultScreen(gdi_display));
wp = WhitePixel(gdi_display, DefaultScreen(gdi_display));
max = (0xffffffff)>>(32 - screen_depth);
max = 0xffffffff >> (32 - default_visual.depth);
if( max > 256 )
{
step = max/256;
@ -528,7 +528,7 @@ static BOOL X11DRV_PALETTE_BuildSharedMap( const PALETTEENTRY *sys_pal_template
* to maintain compatibility
*/
palette_size = 256;
TRACE("Virtual colorspace - screendepth %i\n", screen_depth);
TRACE("Virtual colorspace - screendepth %i\n", default_visual.depth);
}
else palette_size = NB_RESERVED_COLORS; /* system palette only - however we can alloc a bunch
* of colors and map to them */
@ -556,7 +556,7 @@ static BOOL X11DRV_PALETTE_BuildSharedMap( const PALETTEENTRY *sys_pal_template
/* setup system palette entry <-> pixel mappings and fill in 20 fixed entries */
if (screen_depth <= 8)
if (default_visual.depth <= 8)
{
X11DRV_PALETTE_XPixelToPalette = HeapAlloc( GetProcessHeap(), 0, 256 * sizeof(int) );
if(X11DRV_PALETTE_XPixelToPalette == NULL) {
@ -786,7 +786,7 @@ COLORREF X11DRV_PALETTE_ToLogical(X11DRV_PDEVICE *physDev, int pixel)
/* check if we can bypass X */
if ((screen_depth <= 8) && (pixel < 256) &&
if ((default_visual.depth <= 8) && (pixel < 256) &&
!(X11DRV_PALETTE_PaletteFlags & (X11DRV_PALETTE_VIRTUAL | X11DRV_PALETTE_FIXED)) ) {
COLORREF ret;
EnterCriticalSection( &palette_cs );

View File

@ -316,13 +316,14 @@ static int get_window_attributes( struct x11drv_win_data *data, XSetWindowAttrib
attr->bit_gravity = NorthWestGravity;
attr->win_gravity = StaticGravity;
attr->backing_store = NotUseful;
attr->border_pixel = 0;
attr->event_mask = (ExposureMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
KeyPressMask | KeyReleaseMask | FocusChangeMask |
KeymapStateMask | StructureNotifyMask);
if (data->managed) attr->event_mask |= PropertyChangeMask;
return (CWOverrideRedirect | CWSaveUnder | CWColormap |
return (CWOverrideRedirect | CWSaveUnder | CWColormap | CWBorderPixel |
CWEventMask | CWBitGravity | CWBackingStore);
}
@ -530,7 +531,7 @@ static BOOL create_icon_pixmaps( HDC hdc, const ICONINFO *icon, Pixmap *icon_ret
{
char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
BITMAPINFO *info = (BITMAPINFO *)buffer;
XVisualInfo vis;
XVisualInfo vis = default_visual;
struct gdi_image_bits bits;
Pixmap color_pixmap = 0, mask_pixmap = 0;
int i, lines;
@ -545,13 +546,6 @@ static BOOL create_icon_pixmaps( HDC hdc, const ICONINFO *icon, Pixmap *icon_ret
if (!(bits.ptr = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed;
if (!GetDIBits( hdc, icon->hbmColor, 0, lines, bits.ptr, info, DIB_RGB_COLORS )) goto failed;
vis.visual = visual;
vis.depth = screen_depth;
vis.visualid = visual->visualid;
vis.class = visual->class;
vis.red_mask = visual->red_mask;
vis.green_mask = visual->green_mask;
vis.blue_mask = visual->blue_mask;
color_pixmap = create_pixmap_from_image( hdc, &vis, info, &bits, DIB_RGB_COLORS );
HeapFree( GetProcessHeap(), 0, bits.ptr );
bits.ptr = NULL;
@ -941,8 +935,8 @@ void update_user_time( Time time )
{
if (!user_time_window)
{
Window win = XCreateWindow( gdi_display, root_window, -1, -1, 1, 1, 0, 0, InputOnly,
DefaultVisual(gdi_display,DefaultScreen(gdi_display)), 0, NULL );
Window win = XCreateWindow( gdi_display, root_window, -1, -1, 1, 1, 0, CopyFromParent,
InputOnly, CopyFromParent, 0, NULL );
if (InterlockedCompareExchangePointer( (void **)&user_time_window, (void *)win, 0 ))
XDestroyWindow( gdi_display, win );
TRACE( "user time window %lx\n", user_time_window );
@ -1384,8 +1378,8 @@ static void create_whole_window( struct x11drv_win_data *data )
data->whole_window = XCreateWindow( data->display, root_window,
data->whole_rect.left - virtual_screen_rect.left,
data->whole_rect.top - virtual_screen_rect.top,
cx, cy, 0, screen_depth, InputOutput,
visual, mask, &attr );
cx, cy, 0, default_visual.depth, InputOutput,
default_visual.visual, mask, &attr );
if (!data->whole_window) goto done;
set_initial_wm_hints( data->display, data->whole_window );
@ -1633,7 +1627,8 @@ BOOL CDECL X11DRV_CreateWindow( HWND hwnd )
attr.override_redirect = TRUE;
attr.event_mask = StructureNotifyMask | FocusChangeMask;
data->clip_window = XCreateWindow( data->display, root_window, 0, 0, 1, 1, 0, 0,
InputOnly, visual, CWOverrideRedirect | CWEventMask, &attr );
InputOnly, default_visual.visual,
CWOverrideRedirect | CWEventMask, &attr );
XFlush( data->display );
SetPropA( hwnd, clip_window_prop, (HANDLE)data->clip_window );
}
@ -2014,7 +2009,6 @@ void CDECL X11DRV_WindowPosChanging( HWND hwnd, HWND insert_after, UINT swp_flag
{
struct x11drv_win_data *data = get_win_data( hwnd );
RECT surface_rect;
XVisualInfo vis;
DWORD flags;
COLORREF key;
BOOL layered = GetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED;
@ -2056,17 +2050,10 @@ void CDECL X11DRV_WindowPosChanging( HWND hwnd, HWND insert_after, UINT swp_flag
}
else if (!(swp_flags & SWP_SHOWWINDOW) && !(GetWindowLongW( hwnd, GWL_STYLE ) & WS_VISIBLE)) goto done;
memset( &vis, 0, sizeof(vis) );
vis.visual = visual;
vis.visualid = visual->visualid;
vis.depth = screen_depth;
vis.red_mask = visual->red_mask;
vis.green_mask = visual->green_mask;
vis.blue_mask = visual->blue_mask;
if (!layered || !GetLayeredWindowAttributes( hwnd, &key, NULL, &flags ) || !(flags & LWA_COLORKEY))
key = CLR_INVALID;
*surface = create_surface( data->whole_window, &vis, &surface_rect, key );
*surface = create_surface( data->whole_window, &default_visual, &surface_rect, key );
done:
release_win_data( data );

View File

@ -347,14 +347,13 @@ static inline size_t get_property_size( int format, unsigned long count )
return count * (format / 8);
}
extern Visual *visual DECLSPEC_HIDDEN;
extern XVisualInfo default_visual DECLSPEC_HIDDEN;
extern XPixmapFormatValues **pixmap_formats DECLSPEC_HIDDEN;
extern Window root_window DECLSPEC_HIDDEN;
extern int clipping_cursor DECLSPEC_HIDDEN;
extern unsigned int screen_width DECLSPEC_HIDDEN;
extern unsigned int screen_height DECLSPEC_HIDDEN;
extern unsigned int screen_bpp DECLSPEC_HIDDEN;
extern unsigned int screen_depth DECLSPEC_HIDDEN;
extern RECT virtual_screen_rect DECLSPEC_HIDDEN;
extern int use_xkb DECLSPEC_HIDDEN;
extern int usexrandr DECLSPEC_HIDDEN;

View File

@ -56,13 +56,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
WINE_DECLARE_DEBUG_CHANNEL(synchronous);
WINE_DECLARE_DEBUG_CHANNEL(winediag);
static Screen *screen;
Visual *visual;
XVisualInfo default_visual = { 0 };
XPixmapFormatValues **pixmap_formats;
unsigned int screen_width;
unsigned int screen_height;
unsigned int screen_bpp;
unsigned int screen_depth;
RECT virtual_screen_rect;
Window root_window;
int usexvidmode = 1;
@ -386,9 +384,8 @@ static void setup_options(void)
if (!get_config_key( hkey, appkey, "GrabFullscreen", buffer, sizeof(buffer) ))
grab_fullscreen = IS_OPTION_TRUE( buffer[0] );
screen_depth = 0;
if (!get_config_key( hkey, appkey, "ScreenDepth", buffer, sizeof(buffer) ))
screen_depth = atoi(buffer);
default_visual.depth = atoi(buffer);
if (!get_config_key( hkey, appkey, "ClientSideGraphics", buffer, sizeof(buffer) ))
client_side_graphics = IS_OPTION_TRUE( buffer[0] );
@ -483,6 +480,36 @@ sym_not_found:
}
#endif /* defined(SONAME_LIBXCOMPOSITE) */
static void init_visuals( Display *display, int screen )
{
int count;
XVisualInfo *info;
default_visual.screen = screen;
if (default_visual.depth) /* depth specified */
{
info = XGetVisualInfo( display, VisualScreenMask | VisualDepthMask, &default_visual, &count );
if (info)
{
default_visual = *info;
XFree( info );
}
else WARN( "no visual found for depth %d\n", default_visual.depth );
}
if (!default_visual.visual)
{
default_visual.depth = DefaultDepth( display, screen );
default_visual.visual = DefaultVisual( display, screen );
default_visual.visualid = default_visual.visual->visualid;
default_visual.class = default_visual.visual->class;
default_visual.red_mask = default_visual.visual->red_mask;
default_visual.green_mask = default_visual.visual->green_mask;
default_visual.blue_mask = default_visual.visual->blue_mask;
default_visual.colormap_size = default_visual.visual->map_entries;
default_visual.bits_per_rgb = default_visual.visual->bits_per_rgb;
}
}
/***********************************************************************
* X11DRV process initialisation routine
@ -514,30 +541,13 @@ static BOOL process_attach(void)
if (!(display = XOpenDisplay( NULL ))) return FALSE;
fcntl( ConnectionNumber(display), F_SETFD, 1 ); /* set close on exec flag */
screen = DefaultScreenOfDisplay( display );
visual = DefaultVisual( display, DefaultScreen(display) );
root_window = DefaultRootWindow( display );
gdi_display = display;
old_error_handler = XSetErrorHandler( error_handler );
/* Initialize screen depth */
if (screen_depth) /* depth specified */
{
int depth_count, i;
int *depth_list = XListDepths(display, DefaultScreen(display), &depth_count);
for (i = 0; i < depth_count; i++)
if (depth_list[i] == screen_depth) break;
XFree( depth_list );
if (i >= depth_count)
{
WARN( "invalid depth %d, using default\n", screen_depth );
screen_depth = 0;
}
}
if (!screen_depth) screen_depth = DefaultDepthOfScreen( screen );
init_pixmap_formats( display );
screen_bpp = pixmap_formats[screen_depth]->bits_per_pixel;
init_visuals( display, DefaultScreen( display ));
screen_bpp = pixmap_formats[default_visual.depth]->bits_per_pixel;
XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
@ -547,7 +557,8 @@ static BOOL process_attach(void)
if (TRACE_ON(synchronous)) XSynchronize( display, True );
xinerama_init( WidthOfScreen(screen), HeightOfScreen(screen) );
xinerama_init( DisplayWidth( display, default_visual.screen ),
DisplayHeight( display, default_visual.screen ));
X11DRV_Settings_Init();
/* initialize XVidMode */

View File

@ -288,19 +288,13 @@ static BOOL get_xrender_template(const WineXRenderFormatTemplate *fmt, XRenderPi
static BOOL is_wxrformat_compatible_with_default_visual(const WineXRenderFormatTemplate *fmt)
{
if(fmt->depth != screen_depth)
return FALSE;
if( (fmt->redMask << fmt->red) != visual->red_mask)
return FALSE;
if( (fmt->greenMask << fmt->green) != visual->green_mask)
return FALSE;
if( (fmt->blueMask << fmt->blue) != visual->blue_mask)
return FALSE;
if(fmt->depth != default_visual.depth) return FALSE;
if( (fmt->redMask << fmt->red) != default_visual.red_mask) return FALSE;
if( (fmt->greenMask << fmt->green) != default_visual.green_mask) return FALSE;
if( (fmt->blueMask << fmt->blue) != default_visual.blue_mask) return FALSE;
/* We never select a default ARGB visual */
if(fmt->alphaMask)
return FALSE;
if(fmt->alphaMask) return FALSE;
return TRUE;
}
@ -315,18 +309,18 @@ static int load_xrender_formats(void)
if(is_wxrformat_compatible_with_default_visual(&wxr_formats_template[i]))
{
pict_formats[i] = pXRenderFindVisualFormat(gdi_display, visual);
pict_formats[i] = pXRenderFindVisualFormat(gdi_display, default_visual.visual);
if (!pict_formats[i])
{
/* Xrender doesn't like DirectColor visuals, try to find a TrueColor one instead */
if (visual->class == DirectColor)
if (default_visual.class == DirectColor)
{
XVisualInfo info;
if (XMatchVisualInfo( gdi_display, DefaultScreen(gdi_display),
screen_depth, TrueColor, &info ))
if (XMatchVisualInfo( gdi_display, default_visual.screen,
default_visual.depth, TrueColor, &info ))
{
pict_formats[i] = pXRenderFindVisualFormat(gdi_display, info.visual);
if (pict_formats[i]) visual = info.visual;
if (pict_formats[i]) default_visual = info;
}
}
}
@ -395,7 +389,7 @@ const struct gdi_dc_funcs *X11DRV_XRender_Init(void)
return NULL;
}
if (!visual->red_mask || !visual->green_mask || !visual->blue_mask)
if (!default_visual.red_mask || !default_visual.green_mask || !default_visual.blue_mask)
{
WARN("one or more of the colour masks are 0, disabling XRENDER. Try running in 16-bit mode or higher.\n");
return NULL;
@ -435,7 +429,7 @@ sym_not_found:
}
glyphsetCache[i-1].next = -1;
if(screen_depth <= 8 || !client_side_antialias_with_render) antialias = 0;
if(default_visual.depth <= 8 || !client_side_antialias_with_render) antialias = 0;
return &xrender_funcs;
}
@ -1798,7 +1792,7 @@ static DWORD create_image_pixmap( BITMAPINFO *info, const struct gdi_image_bits
GC gc;
XImage *image;
image = XCreateImage( gdi_display, visual, depth, ZPixmap, 0, NULL,
image = XCreateImage( gdi_display, default_visual.visual, depth, ZPixmap, 0, NULL,
info->bmiHeader.biWidth, height, 32, 0 );
if (!image) return ERROR_OUTOFMEMORY;
@ -2330,14 +2324,13 @@ static HBRUSH xrenderdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush, const struct b
{
struct xrender_physdev *physdev = get_xrender_dev( dev );
Pixmap pixmap;
XVisualInfo vis;
XVisualInfo vis = default_visual;
XRenderPictFormat *format = physdev->pict_format;
if (!pattern) goto x11drv_fallback;
if (pattern->info->bmiHeader.biBitCount == 1) goto x11drv_fallback;
if (physdev->format == WXR_FORMAT_MONO) goto x11drv_fallback;
memset( &vis, 0, sizeof(vis) );
vis.depth = format->depth;
vis.red_mask = format->direct.redMask << format->direct.red;
vis.green_mask = format->direct.greenMask << format->direct.green;