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;
--- a/mplayer.h	Thu Mar 07 16:57:40 2002 +0000
+++ b/mplayer.h	Thu Mar 07 17:50:25 2002 +0000
@@ -4,5 +4,6 @@
 
 extern int use_gui;
 extern char* current_module;
+extern int fullscreen;
 
 #endif
\ No newline at end of file