rewrite fullscreen support in some libvo driver

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4982 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
pontscho
2002-03-07 17:50:25 +00:00
parent 83c66ac705
commit df141d9d82
12 changed files with 122 additions and 72 deletions
+1 -2
View File
@@ -374,7 +374,6 @@ NoPause:
}
break;
case evFullScreen:
IZE("evFullS");
for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ )
{
if ( appMPlayer.Items[j].msg == evFullScreen )
@@ -383,8 +382,8 @@ NoPause:
appMPlayer.Items[j].pressed=appMPlayer.Items[j].tmp;
}
}
mplMainRender=1;
mplFullScreen();
mplMainRender=1;
break;
// --- timer events
+24 -17
View File
@@ -30,26 +30,33 @@ void mplFullScreen( void )
{
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;
+5
View File
@@ -237,6 +237,11 @@ static uint32_t control(uint32_t request, void *data, ...)
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;
}
+7
View File
@@ -44,8 +44,15 @@ int vo_dy=0;
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
+6
View File
@@ -198,8 +198,14 @@ extern int vo_dwidth;
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;
+17 -19
View File
@@ -88,7 +88,7 @@ static uint32_t mvWidth;
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 uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen;
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 @@ static void set_window(){
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 @@ static uint32_t config( uint32_t width, uint32_t height, uint32_t d_width, uint3
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 @@ static uint32_t config( uint32_t width, uint32_t height, uint32_t d_width, uint3
if ( vo_window == None )
{
#endif
if ( mFullscreen )
if ( vo_fs )
{
wndWidth=vo_screenwidth;
wndHeight=vo_screenheight;
@@ -314,7 +312,7 @@ static uint32_t config( uint32_t width, uint32_t height, uint32_t d_width, uint3
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;
+19 -20
View File
@@ -92,7 +92,7 @@ static int flip_flag;
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
}
else
#endif
if ( mFullscreen )
if ( vo_fs )
{
hint.width=vo_screenwidth;
hint.height=vo_screenheight;
@@ -423,7 +426,7 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
#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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
#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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32
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 @@ static void check_events(void)
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 @@ static void check_events(void)
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 @@ static void flip_page(void)
{
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 @@ static uint32_t control(uint32_t request, void *data, ...)
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;
}
+13 -13
View File
@@ -70,26 +70,21 @@ static uint32_t window_width, window_height;
/* 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 @@ static void set_window(int force_update,const vo_tune_info_t *info)
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 @@ static void set_window(int force_update,const vo_tune_info_t *info)
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 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
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 @@ if (vo_window == None)
#endif
#ifdef X11_FULLSCREEN
if (mFullscreen) /* fullscreen */
if (vo_fs) /* fullscreen */
{
if (flags & 0x04)
{
@@ -321,7 +318,7 @@ if (vo_window == None)
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 @@ static uint32_t control(uint32_t request, void *data, ...)
switch (request) {
case VOCTRL_QUERY_FORMAT:
return query_format(*((uint32_t*)data));
case VOCTRL_FULLSCREEN:
vo_x11_fullscreen();
return VO_TRUE;
}
return VO_NOTIMPL;
}
+21
View File
@@ -509,6 +509,27 @@ int vo_x11_check_events(Display *mydisplay){
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
+7
View File
@@ -1,4 +1,7 @@
#ifndef X11_COMMON_H
#define X11_COMMON_H
#ifdef X11_FULLSCREEN
extern int vo_depthonscreen;
@@ -6,6 +9,7 @@ extern int vo_screenwidth;
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 @@ int vo_hidecursor ( Display* , Window );
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_x11_xinerama_move(Display *dsp, Window w);
void vo_vm_switch(uint32_t, uint32_t, int*, int*);
void vo_vm_close(Display*);
#endif
#endif
+1 -1
View File
@@ -261,7 +261,7 @@ static uint32_t our_n_frames=0;
// 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;
+1
View File
@@ -4,5 +4,6 @@
extern int use_gui;
extern char* current_module;
extern int fullscreen;
#endif