]> git.sesse.net Git - vlc/commitdiff
* video plugins that don't handle rescaling themselves have to let the
authorGildas Bazin <gbazin@videolan.org>
Mon, 6 May 2002 21:05:26 +0000 (21:05 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 6 May 2002 21:05:26 +0000 (21:05 +0000)
  video_output thread know about resizing events (with VOUT_SIZE_CHANGE event).
  (this part needs some clean-up but it is basically working for the X11 and
   SDL plugins).

* fixed fullscreen for the SDL plugin.

* xmga and sdl now switch to fullscreen on double-click.

plugins/mga/xmga.c
plugins/sdl/vout_sdl.c
plugins/x11/xcommon.c
src/video_output/video_output.c

index ce25e6a90006218675dcb98c0ece5acd313c8d27..89ef9946e947165dc8e99222ca63d02f59ce6140 100644 (file)
@@ -2,7 +2,7 @@
  * xmga.c : X11 MGA plugin for vlc
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: xmga.c,v 1.12 2002/04/19 13:56:11 sam Exp $
+ * $Id: xmga.c,v 1.13 2002/05/06 21:05:26 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -188,6 +188,7 @@ typedef struct vout_sys_s
     boolean_t           b_mouse_pointer_visible;
     mtime_t             i_time_mouse_last_moved; /* used to auto-hide pointer*/
     Cursor              blank_cursor;                   /* the hidden cursor */
+    mtime_t             i_time_button_last_pressed;   /* to track dbl-clicks */
     Pixmap              cursor_pixmap;
 
 } vout_sys_t;
@@ -599,10 +600,17 @@ static int vout_Manage( vout_thread_t *p_vout )
             {
                 case Button1:
                     /* In this part we will eventually manage
-                     * clicks for DVD navigation for instance. For the
-                     * moment just pause the stream. */
-                    input_SetStatus( p_input_bank->pp_input[0],
-                                     INPUT_STATUS_PAUSE );
+                     * clicks for DVD navigation for instance. */
+
+                    /* detect double-clicks */
+                    if( ( ((XButtonEvent *)&xevent)->time -
+                          p_vout->p_sys->i_time_button_last_pressed ) < 300 )
+                    {
+                      p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
+                    }
+
+                    p_vout->p_sys->i_time_button_last_pressed =
+                        ((XButtonEvent *)&xevent)->time;
                     break;
 
                 case Button4:
index 878e995eaa2ab93cedf1c2b2346be58cb11ae085..3d8c1f12628ba80543692cbde78412471f576682 100644 (file)
@@ -2,7 +2,7 @@
  * vout_sdl.c: SDL video output display method
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: vout_sdl.c,v 1.88 2002/04/28 11:56:13 sam Exp $
+ * $Id: vout_sdl.c,v 1.89 2002/05/06 21:05:26 gbazin Exp $
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Pierre Baillet <oct@zoy.org>
@@ -74,6 +74,7 @@ typedef struct vout_sys_s
     boolean_t   b_cursor;
     boolean_t   b_cursor_autohidden;
     mtime_t     i_lastmoved;
+    mtime_t     i_lastpressed;                        /* to track dbl-clicks */
 
 } vout_sys_t;
 
@@ -209,10 +210,6 @@ static int vout_Create( vout_thread_t *p_vout )
     p_vout->p_sys->b_cursor_autohidden = 0;
     p_vout->p_sys->i_lastmoved = mdate();
 
-    /* Set main window's size */
-    p_vout->p_sys->i_width = p_vout->i_window_width;
-    p_vout->p_sys->i_height = p_vout->i_window_height;
-
     if( OpenDisplay( p_vout ) )
     {
         intf_ErrMsg( "vout error: can't set up SDL (%s)", SDL_GetError() );
@@ -244,9 +241,9 @@ static int vout_Init( vout_thread_t *p_vout )
         /* All we have is an RGB image with square pixels */
         p_vout->output.i_width  = p_vout->p_sys->i_width;
         p_vout->output.i_height = p_vout->p_sys->i_height;
-        p_vout->output.i_aspect = p_vout->p_sys->i_width
+        p_vout->output.i_aspect = p_vout->output.i_width
                                    * VOUT_ASPECT_FACTOR
-                                   / p_vout->p_sys->i_height;
+                                   / p_vout->output.i_height;
     }
     else
     {
@@ -347,10 +344,10 @@ static int vout_Manage( vout_thread_t *p_vout )
         switch( event.type )
         {
         case SDL_VIDEORESIZE:                          /* Resizing of window */
-            p_vout->p_sys->i_width = event.resize.w;
-            p_vout->p_sys->i_height = event.resize.h;
-            CloseDisplay( p_vout );
-            OpenDisplay( p_vout );
+            /* Update dimensions */
+            p_vout->i_changes |= VOUT_SIZE_CHANGE;
+            p_vout->i_window_width = p_vout->p_sys->i_width = event.resize.w;
+            p_vout->i_window_height = p_vout->p_sys->i_height = event.resize.h;
             break;
 
         case SDL_MOUSEMOTION:
@@ -383,10 +380,13 @@ static int vout_Manage( vout_thread_t *p_vout )
             {
             case SDL_BUTTON_LEFT:
                 /* In this part we will eventually manage
-                 * clicks for DVD navigation for instance. For the
-                 * moment just pause the stream. */
-                input_SetStatus( p_input_bank->pp_input[0],
-                                 INPUT_STATUS_PAUSE );
+                 * clicks for DVD navigation for instance. */
+
+                /* detect double-clicks */
+                if( ( mdate() - p_vout->p_sys->i_lastpressed ) < 300000 )
+                    p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
+
+                p_vout->p_sys->i_lastpressed = mdate();
                 break;
 
             case 4:
@@ -492,13 +492,31 @@ static int vout_Manage( vout_thread_t *p_vout )
     {
         p_vout->b_fullscreen = ! p_vout->b_fullscreen;
 
-        SDL_WM_ToggleFullScreen(p_vout->p_sys->p_display);
-
         p_vout->p_sys->b_cursor_autohidden = 0;
         SDL_ShowCursor( p_vout->p_sys->b_cursor &&
                         ! p_vout->p_sys->b_cursor_autohidden );
 
         p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;
+        p_vout->i_changes |= VOUT_SIZE_CHANGE;
+    }
+
+    /*
+     * Size change
+     */
+    if( p_vout->i_changes & VOUT_SIZE_CHANGE )
+    {
+        intf_WarnMsg( 3, "vout: video display resized (%dx%d)",
+                      p_vout->p_sys->i_width,
+                      p_vout->p_sys->i_height );
+        CloseDisplay( p_vout );
+        OpenDisplay( p_vout );
+
+        /* We don't need to signal the vout thread about the size change if
+         * we can handle rescaling ourselves */
+        if( p_vout->p_sys->p_overlay != NULL )
+            p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
+
     }
 
     /* Pointer change */
@@ -565,6 +583,12 @@ static int OpenDisplay( vout_thread_t *p_vout )
     Uint32 i_flags;
     int    i_bpp;
 
+    /* Set main window's size */
+    p_vout->p_sys->i_width = p_vout->b_fullscreen ? p_vout->render.i_width :
+                                                    p_vout->i_window_width;
+    p_vout->p_sys->i_height = p_vout->b_fullscreen ? p_vout->render.i_height :
+                                                     p_vout->i_window_height;
+
     /* Initialize flags and cursor */
     i_flags = SDL_ANYFORMAT | SDL_HWPALETTE | SDL_HWSURFACE | SDL_DOUBLEBUF;
     i_flags |= p_vout->b_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE;
index 9de90740f68b2a1679b60306e7552650b78df685..fc68858257a64bf4a4ad927dc3f4cf51daf30149 100644 (file)
@@ -2,7 +2,7 @@
  * xcommon.c: Functions common to the X11 and XVideo plugins
  *****************************************************************************
  * Copyright (C) 1998-2001 VideoLAN
- * $Id: xcommon.c,v 1.30 2002/05/05 08:25:15 gbazin Exp $
+ * $Id: xcommon.c,v 1.31 2002/05/06 21:05:26 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
@@ -585,7 +585,6 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
 static int vout_Manage( vout_thread_t *p_vout )
 {
     XEvent      xevent;                                         /* X11 event */
-    boolean_t   b_resized;                        /* window has been resized */
     char        i_key;                                    /* ISO Latin-1 key */
     KeySym      x_key_symbol;
 
@@ -594,7 +593,6 @@ static int vout_Manage( vout_thread_t *p_vout )
      * window is mapped (and if the display is useful), and ClientMessages
      * to intercept window destruction requests */
 
-    b_resized = 0;
     while( XCheckWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->window,
                               StructureNotifyMask | KeyPressMask |
                               ButtonPressMask | ButtonReleaseMask | 
@@ -608,7 +606,6 @@ static int vout_Manage( vout_thread_t *p_vout )
                  || (xevent.xconfigure.height != p_vout->p_sys->i_height) )
             {
                 /* Update dimensions */
-                b_resized = 1;
                 p_vout->i_changes |= VOUT_SIZE_CHANGE;
                 p_vout->p_sys->i_width = xevent.xconfigure.width;
                 p_vout->p_sys->i_height = xevent.xconfigure.height;
@@ -734,9 +731,7 @@ static int vout_Manage( vout_thread_t *p_vout )
                     /* detect double-clicks */
                     if( ( ((XButtonEvent *)&xevent)->time -
                           p_vout->p_sys->i_time_button_last_pressed ) < 300 )
-                    {
-                      p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
-                    }
+                        p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;
 
                     p_vout->p_sys->i_time_button_last_pressed =
                         ((XButtonEvent *)&xevent)->time;
@@ -847,23 +842,9 @@ static int vout_Manage( vout_thread_t *p_vout )
                       p_vout->p_sys->i_height );
  
 #ifdef MODULE_NAME_IS_x11
-
-        /* Destroy XImages to change their size */
-        vout_End( p_vout );
-        for( i_x = 0; i_x < I_OUTPUTPICTURES; i_x++ )
-            p_vout->p_picture[ i_x ].i_status = FREE_PICTURE;
-
-        /* Recreate XImages. If SysInit failed, the thread can't go on. */
-        if( vout_Init( p_vout ) )
-        {
-            intf_ErrMsg( "vout error: cannot resize display" );
-            return( 1 );
-        }
-
-        /* Need to reinitialise the chroma plugin */
-        p_vout->chroma.pf_end( p_vout );
-        p_vout->chroma.pf_init( p_vout );
-
+        /* We need to signal the vout thread about the size change because it
+         * is doing the rescaling */
+        p_vout->i_changes |= VOUT_SIZE_CHANGE;
 #endif
 
         vout_PlacePicture( p_vout, p_vout->p_sys->i_width,
@@ -2255,4 +2236,3 @@ static void SetPalette( vout_thread_t *p_vout, u16 *red, u16 *green, u16 *blue )
                   p_vout->p_sys->colormap, p_colors, 255 );
 }
 #endif
-
index f216a918b8e69d885078da44c3203cc419ff4741..766ea30b18fb7acc12cfabfc85b1f12599e9814a 100644 (file)
@@ -5,7 +5,7 @@
  * thread, and destroy a previously oppened video output thread.
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.174 2002/05/05 08:25:15 gbazin Exp $
+ * $Id: video_output.c,v 1.175 2002/05/06 21:05:26 gbazin Exp $
  *
  * Authors: Vincent Seguin <seguin@via.ecp.fr>
  *
@@ -661,11 +661,39 @@ static void RunThread( vout_thread_t *p_vout)
          */
         if( p_vout->pf_manage( p_vout ) )
         {
-            /* A fatal error occured, and the thread must terminate immediately,
-             * without displaying anything - setting b_error to 1 causes the
-             * immediate end of the main while() loop. */
+            /* A fatal error occured, and the thread must terminate
+             * immediately, without displaying anything - setting b_error to 1
+             * causes the immediate end of the main while() loop. */
             p_vout->b_error = 1;
         }
+
+        if( p_vout->i_changes & VOUT_SIZE_CHANGE )
+        {
+            /* this must only happen when the vout plugin is incapable of
+             * rescaling the picture itself. In this case we need to destroy
+             * the current picture buffers and recreate new ones with the right
+             * dimensions */
+            int i;
+
+            p_vout->i_changes &= ~VOUT_SIZE_CHANGE;
+
+            p_vout->pf_end( p_vout );
+            for( i = 0; i < I_OUTPUTPICTURES; i++ )
+                 p_vout->p_picture[ i ].i_status = FREE_PICTURE;
+
+            I_OUTPUTPICTURES = 0;
+            if( p_vout->pf_init( p_vout ) )
+            {
+                intf_ErrMsg( "vout error: cannot resize display" );
+                /* FixMe: p_vout->pf_end will be called again in EndThread() */
+                p_vout->b_error = 1;
+            }
+
+            /* Need to reinitialise the chroma plugin */
+            p_vout->chroma.pf_end( p_vout );
+            p_vout->chroma.pf_init( p_vout );
+        }
+
     }
 
     /*