Mercurial > mplayer.hg
changeset 4981:bfc652fc7f43
rewrite fullscreen support in some libvo driver
author | pontscho |
---|---|
date | Thu, 07 Mar 2002 17:50:25 +0000 |
parents | 0e6e50c02f7b |
children | 6cb9d9a1716d |
files | Gui/mplayer/mw.h Gui/mplayer/play.c libvo/mga_common.c libvo/video_out.c libvo/video_out.h libvo/vo_xmga.c libvo/vo_xv.c libvo/vo_xvidix.c libvo/x11_common.c libvo/x11_common.h mplayer.c mplayer.h |
diffstat | 12 files changed, 122 insertions(+), 72 deletions(-) [+] |
line wrap: on
line diff
--- a/Gui/mplayer/mw.h Thu Mar 07 16:57:40 2002 +0000 +++ b/Gui/mplayer/mw.h Thu Mar 07 17:50:25 2002 +0000 @@ -374,7 +374,6 @@ } break; case evFullScreen: - IZE("evFullS"); for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ ) { if ( appMPlayer.Items[j].msg == evFullScreen ) @@ -383,8 +382,8 @@ appMPlayer.Items[j].pressed=appMPlayer.Items[j].tmp; } } + mplFullScreen(); mplMainRender=1; - mplFullScreen(); break; // --- timer events
--- a/Gui/mplayer/play.c Thu Mar 07 16:57:40 2002 +0000 +++ b/Gui/mplayer/play.c Thu Mar 07 17:50:25 2002 +0000 @@ -30,26 +30,33 @@ { static int sx,sy; - wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); - if ( appMPlayer.subWindow.isFullScreen ) + if ( guiIntfStruct.Playing ) { - wsResizeWindow( &appMPlayer.subWindow,sx,sy ); - wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); - wsWindowDecoration( &appMPlayer.subWindow,appMPlayer.subWindow.Decorations ); - appMPlayer.subWindow.isFullScreen=0; - } - else - { - sx=appMPlayer.subWindow.Width; sy=appMPlayer.subWindow.Height; - wsResizeWindow( &appMPlayer.subWindow,wsMaxX,wsMaxY ); - wsMoveWindow( &appMPlayer.subWindow,True,0,0 ); - wsWindowDecoration( &appMPlayer.subWindow,0 ); - appMPlayer.subWindow.isFullScreen=1; - } + wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); + if ( appMPlayer.subWindow.isFullScreen ) + { + wsResizeWindow( &appMPlayer.subWindow,sx,sy ); + wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); + wsWindowDecoration( &appMPlayer.subWindow,appMPlayer.subWindow.Decorations ); + appMPlayer.subWindow.isFullScreen=0; + vo_fs=0; + } + else + { + sx=appMPlayer.subWindow.Width; sy=appMPlayer.subWindow.Height; + wsResizeWindow( &appMPlayer.subWindow,wsMaxX,wsMaxY ); + wsMoveWindow( &appMPlayer.subWindow,True,0,0 ); + wsWindowDecoration( &appMPlayer.subWindow,0 ); + appMPlayer.subWindow.isFullScreen=1; + vo_fs=1; + } + wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); + } else { vo_x11_fullscreen(); appMPlayer.subWindow.isFullScreen=vo_fs; } + + fullscreen=appMPlayer.subWindow.isFullScreen; if ( guiIntfStruct.Playing ) wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); else wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.subR,appMPlayer.subG,appMPlayer.subB ); - wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); - mplResize( 0,0,appMPlayer.subWindow.Width,appMPlayer.subWindow.Height ); +// mplResize( 0,0,appMPlayer.subWindow.Width,appMPlayer.subWindow.Height ); } extern int mplSubRender;
--- a/libvo/mga_common.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/mga_common.c Thu Mar 07 17:50:25 2002 +0000 @@ -237,6 +237,11 @@ return query_format(*((uint32_t*)data)); case VOCTRL_GET_IMAGE: return get_image(data); +#ifdef VO_XMGA + case VOCTRL_FULLSCREEN: + vo_x11_fullscreen(); + return VO_TRUE; +#endif } return VO_NOTIMPL; }
--- a/libvo/video_out.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/video_out.c Thu Mar 07 17:50:25 2002 +0000 @@ -44,8 +44,15 @@ int vo_dwidth=0; int vo_dheight=0; int vo_dbpp=0; + +int vo_old_x = 0; +int vo_old_y = 0; +int vo_old_width = 0; +int vo_old_height = 0; + int vo_doublebuffering = 0; int vo_vsync = 0; +int vo_fs = 0; int vo_fsmode = 0; int vo_pts=0; // for hw decoding
--- a/libvo/video_out.h Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/video_out.h Thu Mar 07 17:50:25 2002 +0000 @@ -198,8 +198,14 @@ extern int vo_dheight; extern int vo_dbpp; +extern int vo_old_x; +extern int vo_old_y; +extern int vo_old_width; +extern int vo_old_height; + extern int vo_doublebuffering; extern int vo_vsync; +extern int vo_fs; extern int vo_fsmode; extern int vo_pts;
--- a/libvo/vo_xmga.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/vo_xmga.c Thu Mar 07 17:50:25 2002 +0000 @@ -88,7 +88,7 @@ static Window mRoot; static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; -static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; +static uint32_t drwcX,drwcY,dwidth,dheight; #ifdef HAVE_NEW_GUI static uint32_t mdwidth,mdheight; @@ -96,32 +96,27 @@ static XSetWindowAttributes xWAttribs; +#define VO_XMGA #include "mga_common.c" +#undef VO_XMGA static void mDrawColorKey( void ) { XSetBackground( mDisplay,vo_gc,0 ); XClearWindow( mDisplay,vo_window ); XSetForeground( mDisplay,vo_gc,fgColor ); - XFillRectangle( mDisplay,vo_window,vo_gc,drwX,drwY,drwWidth,(mFullscreen?drwHeight - 1:drwHeight) ); + XFillRectangle( mDisplay,vo_window,vo_gc,drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight) ); XFlush( mDisplay ); } static void set_window(){ - #ifdef HAVE_NEW_GUI - if ( vo_window != None ) - { - mFullscreen=0; - dwidth=mdwidth; dheight=mdheight; - if ( ( vo_dwidth == vo_screenwidth )&&( vo_dheight == vo_screenheight ) ) - { - mFullscreen=1; - dwidth=vo_screenwidth; - dheight=vo_screenwidth * mdheight / mdwidth; - } - } - #endif + dwidth=mdwidth; dheight=mdheight; + if ( vo_fs ) + { + dwidth=vo_screenwidth; + dheight=vo_screenwidth * mdheight / mdwidth; + } XGetGeometry( mDisplay,vo_window,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); drwX=0; drwY=0; // drwWidth=wndWidth; drwHeight=wndHeight; @@ -129,7 +124,7 @@ fprintf( stderr,"[xmga] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); aspect(&dwidth,&dheight,A_NOZOOM); - if ( mFullscreen ) + if ( vo_fs ) { aspect(&dwidth,&dheight,A_ZOOM); drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; @@ -262,7 +257,10 @@ wndX=0; wndY=0; wndWidth=d_width; wndHeight=d_height; - mFullscreen=fullscreen&1; + vo_fs=fullscreen&1; + vo_dwidth=d_width; vo_dheight=d_height; + if ( vo_fs ) + { vo_old_width=d_width; vo_old_height=d_height; } switch ( vo_depthonscreen ) { @@ -279,7 +277,7 @@ if ( vo_window == None ) { #endif - if ( mFullscreen ) + if ( vo_fs ) { wndWidth=vo_screenwidth; wndHeight=vo_screenheight; @@ -314,7 +312,7 @@ vo_x11_classhint( mDisplay,vo_window,"xmga" ); vo_hidecursor(mDisplay,vo_window); - if ( mFullscreen ) vo_x11_decoration( mDisplay,vo_window,0 ); + if ( vo_fs ) vo_x11_decoration( mDisplay,vo_window,0 ); XGetNormalHints( mDisplay,vo_window,&hint ); hint.x=wndX; hint.y=wndY;
--- a/libvo/vo_xv.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/vo_xv.c Thu Mar 07 17:50:25 2002 +0000 @@ -92,7 +92,7 @@ static Window mRoot; static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; -static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; +static uint32_t drwcX,drwcY,dwidth,dheight; #ifdef HAVE_NEW_GUI static uint32_t mdwidth,mdheight; @@ -342,7 +342,10 @@ mdheight=height; #endif - mFullscreen=flags&1; + vo_fs=flags&1; + if ( vo_fs ) + { vo_old_width=d_width; vo_old_height=d_height; } + #ifdef HAVE_XF86VM if( flags&0x02 ) vm = 1; #endif @@ -377,7 +380,7 @@ } else #endif - if ( mFullscreen ) + if ( vo_fs ) { hint.width=vo_screenwidth; hint.height=vo_screenheight; @@ -423,7 +426,7 @@ #endif ); XSetStandardProperties(mDisplay, vo_window, hello, hello, None, NULL, 0, &hint); - if ( mFullscreen ) vo_x11_decoration( mDisplay,vo_window,0 ); + if ( vo_fs ) vo_x11_decoration( mDisplay,vo_window,0 ); XMapWindow(mDisplay, vo_window); #ifdef HAVE_XINERAMA vo_x11_xinerama_move(mDisplay,vo_window); @@ -501,11 +504,9 @@ #ifdef HAVE_NEW_GUI if ( vo_window != None ) { - mFullscreen=0; dwidth=mdwidth; dheight=mdheight; - if ( ( vo_dwidth == vo_screenwidth )&&( vo_dheight == vo_screenheight ) ) + if ( vo_fs ) { - mFullscreen=1; dwidth=vo_screenwidth; dheight=vo_screenwidth * mdheight / mdwidth; } @@ -519,7 +520,7 @@ printf( "[xv] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); aspect(&dwidth,&dheight,A_NOZOOM); - if ( mFullscreen ) + if ( vo_fs ) { aspect(&dwidth,&dheight,A_ZOOM); drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; @@ -583,21 +584,16 @@ printf( "[xv] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); #ifdef HAVE_NEW_GUI - if ( vo_window != None ) + dwidth=mdwidth; dheight=mdheight; + if ( vo_fs ) { - mFullscreen=0; - dwidth=mdwidth; dheight=mdheight; - if ( ( vo_dwidth == vo_screenwidth )&&( vo_dheight == vo_screenheight ) ) - { - mFullscreen=1; - dwidth=vo_screenwidth; - dheight=vo_screenwidth * mdheight / mdwidth; - } + dwidth=vo_screenwidth; + dheight=vo_screenwidth * mdheight / mdwidth; } #endif aspect(&dwidth,&dheight,A_NOZOOM); - if ( mFullscreen ) + if ( vo_fs ) { aspect(&dwidth,&dheight,A_ZOOM); drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; @@ -612,7 +608,7 @@ if ( e & VO_EVENT_EXPOSE ) { XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1, False); - XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(mFullscreen?drwHeight - 1:drwHeight), False); + XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight), False); } } @@ -623,7 +619,7 @@ { XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, - drwX,drwY,drwWidth,(mFullscreen?drwHeight - 1:drwHeight), + drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight), False); if (num_buffers>1){ current_buf=(current_buf+1)%num_buffers; @@ -824,6 +820,9 @@ return query_format(*((uint32_t*)data)); case VOCTRL_GET_IMAGE: return get_image(data); + case VOCTRL_FULLSCREEN: + vo_x11_fullscreen(); + return VO_TRUE; } return VO_NOTIMPL; }
--- a/libvo/vo_xvidix.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/vo_xvidix.c Thu Mar 07 17:50:25 2002 +0000 @@ -70,26 +70,21 @@ /* used by XGetGeometry & XTranslateCoordinates for moving/resizing window */ static Window mRoot; static uint32_t drwX, drwY, drwWidth, drwHeight, drwBorderWidth, - drwDepth, drwcX, drwcY, dwidth, dheight, mFullscreen; + drwDepth, drwcX, drwcY, dwidth, dheight; static void set_window(int force_update,const vo_tune_info_t *info) { #ifdef HAVE_NEW_GUI - if (vo_window != None) - { - if ((vo_dwidth == vo_screenwidth) && (vo_dheight == vo_screenheight)) + if (vo_fs) { - mFullscreen = 1; dwidth = vo_screenwidth; dheight = vo_screenwidth * vo_dheight / vo_dwidth; } else { - mFullscreen = 0; dwidth = vo_dwidth; dheight = vo_dheight; } - } #endif XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &drwWidth, @@ -98,14 +93,14 @@ XTranslateCoordinates(mDisplay, vo_window, mRoot, 0, 0, &drwcX, &drwcY, &mRoot); - if (!mFullscreen) + if (!vo_fs) mp_msg(MSGT_VO, MSGL_V, "[xvidix] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n", drwcX, drwcY, drwX, drwY, drwWidth, drwHeight); /* following stuff copied from vo_xmga.c */ aspect(&dwidth, &dheight, A_NOZOOM); #if X11_FULLSCREEN - if (mFullscreen) + if (vo_fs) { aspect(&dwidth, &dheight, A_ZOOM); drwX = (vo_screenwidth - (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2; @@ -175,7 +170,7 @@ XClearWindow( mDisplay,vo_window ); XSetForeground(mDisplay, vo_gc, fgColor); XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth, - (mFullscreen ? drwHeight - 1 : drwHeight)); + (vo_fs ? drwHeight - 1 : drwHeight)); /* flush, update drawable */ XFlush(mDisplay); @@ -245,7 +240,9 @@ window_width = d_width; window_height = d_height; - mFullscreen = flags&0x01; + vo_fs = flags&0x01; + if (vo_fs) + { vo_old_width=d_width; vo_old_height=d_height; } X_already_started++; @@ -275,7 +272,7 @@ #endif #ifdef X11_FULLSCREEN - if (mFullscreen) /* fullscreen */ + if (vo_fs) /* fullscreen */ { if (flags & 0x04) { @@ -321,7 +318,7 @@ vo_hidecursor(mDisplay, vo_window); #ifdef X11_FULLSCREEN - if (mFullscreen) /* fullscreen */ + if (vo_fs) /* fullscreen */ vo_x11_decoration(mDisplay, vo_window, 0); #endif @@ -456,6 +453,9 @@ switch (request) { case VOCTRL_QUERY_FORMAT: return query_format(*((uint32_t*)data)); + case VOCTRL_FULLSCREEN: + vo_x11_fullscreen(); + return VO_TRUE; } return VO_NOTIMPL; }
--- a/libvo/x11_common.c Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/x11_common.c Thu Mar 07 17:50:25 2002 +0000 @@ -509,6 +509,27 @@ return ret; } +void vo_x11_fullscreen( void ) +{ + XUnmapWindow( mDisplay,vo_window ); + if ( !vo_fs ) + { + vo_fs=VO_TRUE; + vo_old_x=vo_dx; vo_old_y=vo_dy; vo_old_width=vo_dwidth; vo_old_height=vo_dheight; + vo_dx=0; vo_dy=0; vo_dwidth=vo_screenwidth; vo_dheight=vo_screenheight; + vo_x11_decoration( mDisplay,vo_window,0 ); + } + else + { + vo_fs=VO_FALSE; + vo_dx=vo_old_x; vo_dy=vo_old_y; vo_dwidth=vo_old_width; vo_dheight=vo_old_height; + vo_x11_decoration( mDisplay,vo_window,1 ); + } + XMapWindow( mDisplay,vo_window ); + XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight ); + return; +} + void saver_on(Display *mDisplay) { #ifdef HAVE_XDPMS
--- a/libvo/x11_common.h Thu Mar 07 16:57:40 2002 +0000 +++ b/libvo/x11_common.h Thu Mar 07 17:50:25 2002 +0000 @@ -1,3 +1,6 @@ + +#ifndef X11_COMMON_H +#define X11_COMMON_H #ifdef X11_FULLSCREEN @@ -6,6 +9,7 @@ extern int vo_screenheight; extern int vo_dwidth; extern int vo_dheight; +extern int vo_fs; extern char *mDisplayName; extern Display *mDisplay; @@ -19,6 +23,7 @@ void vo_x11_decoration( Display * vo_Display,Window w,int d ); void vo_x11_classhint( Display * display,Window window,char *name ); int vo_x11_check_events(Display *mydisplay); +void vo_x11_fullscreen( void ); #endif extern Window vo_window; @@ -43,3 +48,5 @@ void vo_vm_switch(uint32_t, uint32_t, int*, int*); void vo_vm_close(Display*); #endif + +#endif
--- a/mplayer.c Thu Mar 07 16:57:40 2002 +0000 +++ b/mplayer.c Thu Mar 07 17:50:25 2002 +0000 @@ -261,7 +261,7 @@ // screen info: char* video_driver=NULL; //"mga"; // default char* audio_driver=NULL; -static int fullscreen=0; +int fullscreen=0; static int vidmode=0; int softzoom=0; static int flip=-1;