From b885bda73aa4bb0e988975558dd32c0028640c43 Mon Sep 17 00:00:00 2001 From: jkeil Date: Sat, 19 Oct 2002 19:54:59 +0000 Subject: Choose a good visual from the list of supported visuals on the X11 server, instead of using the attributes from the root window. A framebuffer in a Sun often runs using a default visual of 8-bit pseudocolor, yet a better 24 or 32 bit truecolor visual is available. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7803 b3059339-0415-0410-9bf9-f77b7e298cf2 --- Gui/wm/ws.c | 65 ++++++++++++++++++++++++++++++++++++++----------------------- Gui/wm/ws.h | 1 - 2 files changed, 41 insertions(+), 25 deletions(-) (limited to 'Gui') diff --git a/Gui/wm/ws.c b/Gui/wm/ws.c index a9a1e44d8d..ed6512ae16 100644 --- a/Gui/wm/ws.c +++ b/Gui/wm/ws.c @@ -262,7 +262,6 @@ wsXDNDInitialize(); mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[ws] Display name: %s => %s display.\n",dispname,localdisp?"local":"REMOTE"); if (!localdisp) mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[ws] Remote display, disabling XMITSHM\n"); } - if ( !XShmQueryExtension( wsDisplay ) ) { mp_msg( MSGT_GPLAYER,MSGL_ERR,"[ws] sorry, your system is not supported X shared memory extension.\n" ); @@ -367,6 +366,8 @@ Window LeaderWindow; void wsCreateWindow( wsTWindow * win,int X,int Y,int wX,int hY,int bW,int cV,unsigned char D,char * label ) { + int depth; + win->Property=D; if ( D & wsShowFrame ) win->Decorations=1; wsHGC=DefaultGC( wsDisplay,wsScreen ); @@ -399,13 +400,13 @@ void wsCreateWindow( wsTWindow * win,int X,int Y,int wX,int hY,int bW,int cV,uns win->wsCursorPixmap=XCreateBitmapFromData( wsDisplay,wsRootWin,win->wsCursorData,1,1 ); if ( !(cV & wsShowMouseCursor) ) win->wsCursor=XCreatePixmapCursor( wsDisplay,win->wsCursorPixmap,win->wsCursorPixmap,&win->wsColor,&win->wsColor,0,0 ); - XGetWindowAttributes( wsDisplay,wsRootWin,&win->Attribs ); - if ( win->Attribs.depth < 15 ) + depth = vo_find_depth_from_visuals( wsDisplay,wsScreen,NULL ); + if ( depth < 15 ) { mp_msg( MSGT_GPLAYER,MSGL_FATAL,"[ws] sorry, this color depth is not enough.\n" ); exit( 0 ); } - XMatchVisualInfo( wsDisplay,wsScreen,win->Attribs.depth,TrueColor,&win->VisualInfo ); + XMatchVisualInfo( wsDisplay,wsScreen,depth,TrueColor,&win->VisualInfo ); // --- win->AtomLeaderClient=XInternAtom( wsDisplay,"WM_CLIENT_LEADER",False ); @@ -1139,24 +1140,40 @@ void wsVisibleMouse( wsTWindow * win,int m ) int wsGetDepthOnScreen( void ) { - int bpp,ibpp; - XImage * mXImage; - XWindowAttributes attribs; - - mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); - bpp=mXImage->bits_per_pixel; - - XGetWindowAttributes( wsDisplay,wsRootWin,&attribs ); - ibpp=attribs.depth; - mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); - bpp=mXImage->bits_per_pixel; - if ( ( ibpp + 7 ) / 8 != ( bpp + 7 ) / 8 ) ibpp=bpp; - wsDepthOnScreen=ibpp; - wsRedMask=mXImage->red_mask; - wsGreenMask=mXImage->green_mask; - wsBlueMask=mXImage->blue_mask; - XDestroyImage( mXImage ); - return ibpp; + int depth; + XImage * mXImage; + Visual * visual; + + if( (depth = vo_find_depth_from_visuals( wsDisplay,wsScreen,&visual )) > 0 ) + { + mXImage = XCreateImage( wsDisplay,visual,depth,ZPixmap,0,NULL, + 1,1,32,0 ); + wsDepthOnScreen = mXImage->bits_per_pixel; + wsRedMask=mXImage->red_mask; + wsGreenMask=mXImage->green_mask; + wsBlueMask=mXImage->blue_mask; + XDestroyImage( mXImage ); + } + else + { + int bpp,ibpp; + XWindowAttributes attribs; + + mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); + bpp=mXImage->bits_per_pixel; + + XGetWindowAttributes( wsDisplay,wsRootWin,&attribs ); + ibpp=attribs.depth; + mXImage=XGetImage( wsDisplay,wsRootWin,0,0,1,1,AllPlanes,ZPixmap ); + bpp=mXImage->bits_per_pixel; + if ( ( ibpp + 7 ) / 8 != ( bpp + 7 ) / 8 ) ibpp=bpp; + wsDepthOnScreen=ibpp; + wsRedMask=mXImage->red_mask; + wsGreenMask=mXImage->green_mask; + wsBlueMask=mXImage->blue_mask; + XDestroyImage( mXImage ); + } + return wsDepthOnScreen; } void wsXDone( void ) @@ -1195,7 +1212,7 @@ void wsCreateImage( wsTWindow * win,int Width,int Height ) { CompletionType=XShmGetEventBase( wsDisplay ) + ShmCompletion; win->xImage=XShmCreateImage( wsDisplay,win->VisualInfo.visual, - win->Attribs.depth,ZPixmap,NULL,&win->Shminfo,Width,Height ); + win->VisualInfo.depth,ZPixmap,NULL,&win->Shminfo,Width,Height ); if ( win->xImage == NULL ) { mp_msg( MSGT_GPLAYER,MSGL_FATAL,"[ws] shared memory extension error.\n" ); @@ -1224,7 +1241,7 @@ void wsCreateImage( wsTWindow * win,int Width,int Height ) } else { - win->xImage=XCreateImage( wsDisplay,win->VisualInfo.visual,win->Attribs.depth, + win->xImage=XCreateImage( wsDisplay,win->VisualInfo.visual,win->VisualInfo.depth, ZPixmap,0,0,Width,Height, (wsDepthOnScreen == 3) ? 32 : wsDepthOnScreen, 0 ); diff --git a/Gui/wm/ws.h b/Gui/wm/ws.h index 332abdcbf1..1b6cbe9dea 100644 --- a/Gui/wm/ws.h +++ b/Gui/wm/ws.h @@ -155,7 +155,6 @@ typedef struct XGCValues wGCV; unsigned long WindowMask; XVisualInfo VisualInfo; - XWindowAttributes Attribs; XSetWindowAttributes WindowAttrib; XSizeHints SizeHint; XWMHints WMHints; -- cgit v1.2.3