[MPlayer-cvslog] r34048 - in trunk/gui: interface.c ui/actions.c

ib subversion at mplayerhq.hu
Thu Sep 1 22:15:40 CEST 2011


Author: ib
Date: Thu Sep  1 22:15:40 2011
New Revision: 34048

Log:
Rework fullscreen handling.

This should fix all problems the GUI had with fullscreen handling.

In interface.c:

   1. Remove disabled code.

   2. Set background of inactive video window to black (which prevents
      some flashing when starting the playback in fullscreen mode).

   3. Set the state of the fullscreen button according to next playback
      mode (normal or fullscreen).

   4. Make the video window invisible if there is no video, but don't
      make it visible that early if there is video.

   5. Set the global fullscreen variable to get aspect scaling. (Hack)

   6. In GUI_SETUP_VIDEO_WINDOW:

      a. First set the video size,
      b. then resize and reposition,
      c. then make the window visible,
      d. switch to/from fullscreen, if necessary.

      (This minimizes disturbances and the display stays in fullscreen
      mode and is smoothly black as often as possible.)

   7. When playback ends, either act as in 6. or make video window
      quickly invisible if requested.

In actions.c:

   8. Allow calling uiFullScreen() even if not playing.

   9. Remove unnecessary (and misplaced) repositioning (but not properly
      resizing) code from uiFullScreen().

  10. Don't call wsFullScreen() conditionally.

  11. Only set global variable vo_fs, not the global fullscreen
      variable.

Modified:
   trunk/gui/interface.c
   trunk/gui/ui/actions.c

Modified: trunk/gui/interface.c
==============================================================================
--- trunk/gui/interface.c	Thu Sep  1 21:14:11 2011	(r34047)
+++ trunk/gui/interface.c	Thu Sep  1 22:15:40 2011	(r34048)
@@ -57,7 +57,6 @@
 #endif
 
 guiInterface_t guiInfo = {
-    .VideoWindow = True,
     .StreamType  = STREAMTYPE_DUMMY,
     .Balance     = 50.0f
 };
@@ -208,31 +207,9 @@ void guiInit(void)
 
     wsVisibleWindow(&guiApp.mainWindow, wsShowWindow);
 
-#if 0
-    wsVisibleWindow(&guiApp.subWindow, wsShowWindow);
-    {
-        XEvent xev;
-
-        do
-            XNextEvent(wsDisplay, &xev);
-        while (xev.type != MapNotify || xev.xmap.event != guiApp.subWindow.WindowID);
-
-        guiApp.subWindow.Mapped = wsMapped;
-    }
-
-    if (!fullscreen)
-        fullscreen = gtkLoadFullscreen;
-
-    if (fullscreen) {
-        uiFullScreen();
-        btnModify(evFullScreen, btnPressed);
-    }
-#else
-    if (!fullscreen)
-        fullscreen = gtkLoadFullscreen;
-
     if (gtkShowVideoWindow) {
         wsVisibleWindow(&guiApp.subWindow, wsShowWindow);
+
         {
             XEvent xev;
 
@@ -241,31 +218,16 @@ void guiInit(void)
             while (xev.type != MapNotify || xev.xmap.event != guiApp.subWindow.WindowID);
 
             guiApp.subWindow.Mapped = wsMapped;
+            guiInfo.VideoWindow     = True;
         }
 
-        if (fullscreen) {
+        if (gtkLoadFullscreen)
             uiFullScreen();
-            btnModify(evFullScreen, btnPressed);
-        }
-    } else {
-        if (fullscreen) {
-            wsVisibleWindow(&guiApp.subWindow, wsShowWindow);
-            {
-                XEvent xev;
-
-                do
-                    XNextEvent(wsDisplay, &xev);
-                while (xev.type != MapNotify || xev.xmap.event != guiApp.subWindow.WindowID);
+    } else
+        wsSetBackgroundRGB(&guiApp.subWindow, 0, 0, 0);
 
-                guiApp.subWindow.Mapped = wsMapped;
-            }
-            guiInfo.Playing = GUI_PAUSE; // because of !gtkShowVideoWindow...
-            uiFullScreen();          // ...guiInfo.Playing is required
-            wsVisibleWindow(&guiApp.subWindow, wsHideWindow);
-            btnModify(evFullScreen, btnPressed);
-        }
-    }
-#endif
+    if (gtkLoadFullscreen)
+        btnModify(evFullScreen, btnPressed);
 
     guiInfo.Playing = GUI_STOP;
 
@@ -729,7 +691,20 @@ int gui(int what, void *data)
             }
         }
 
-        wsVisibleWindow(&guiApp.subWindow, (guiInfo.VideoWindow ? wsShowWindow : wsHideWindow));
+        // These must be done here (in the last call from MPlayer before
+        // playback starts) and not in GUI_SETUP_VIDEO_WINDOW, because...
+
+        // ...without video there will be no call to GUI_SETUP_VIDEO_WINDOW
+        if (!guiInfo.VideoWindow) {
+            wsVisibleWindow(&guiApp.subWindow, wsHideWindow);
+            btnModify(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased);
+        }
+
+        // ...option variable fullscreen determines whether MPlayer will handle
+        //    the window given by WinID as fullscreen window (and will do aspect
+        //    scaling then) or not - quite rubbish
+        fullscreen = gtkLoadFullscreen;
+
         break;
 
     case GUI_SET_MIXER:
@@ -760,16 +735,24 @@ int gui(int what, void *data)
 
     case GUI_SETUP_VIDEO_WINDOW:
 
-        if (!guiApp.subWindow.isFullScreen) {
-            wsResizeWindow(&guiApp.subWindow, vo_dwidth, vo_dheight);
+        guiInfo.VideoWidth  = vo_dwidth;
+        guiInfo.VideoHeight = vo_dheight;
+
+        if (!guiApp.subWindow.isFullScreen || !guiApp.subWindow.Mapped) {
+            if (!guiApp.subWindow.isFullScreen)
+                wsResizeWindow(&guiApp.subWindow, guiInfo.VideoWidth, guiInfo.VideoHeight);
+
             wsMoveWindow(&guiApp.subWindow, True, guiApp.sub.x, guiApp.sub.y);
+
+            if (!guiApp.subWindow.Mapped)
+                wsVisibleWindow(&guiApp.subWindow, wsShowWindow);
         }
 
-        guiInfo.VideoWidth  = vo_dwidth;
-        guiInfo.VideoHeight = vo_dheight;
+        if (gtkLoadFullscreen ^ guiApp.subWindow.isFullScreen)
+            uiEventHandling(evFullScreen, 0);
 
         if (guiWinID >= 0)
-            wsMoveWindow(&guiApp.mainWindow, False, 0, vo_dheight);
+            wsMoveWindow(&guiApp.mainWindow, False, 0, guiInfo.VideoHeight);
 
         break;
 
@@ -807,11 +790,26 @@ int gui(int what, void *data)
             guiInfo.Angle   = 1;
 #endif
 
-            if (!guiApp.subWindow.isFullScreen && gtkShowVideoWindow) {
-                wsResizeWindow(&guiApp.subWindow, guiApp.sub.width, guiApp.sub.height);
-                wsMoveWindow(&guiApp.subWindow, True, guiApp.sub.x, guiApp.sub.y);
-            } else
+            if (gtkShowVideoWindow) {
+                guiInfo.VideoWindow = True;
+                guiInfo.VideoWidth  = guiApp.sub.width;
+                guiInfo.VideoHeight = guiApp.sub.height;
+
+                if (!guiApp.subWindow.isFullScreen) {
+                    wsResizeWindow(&guiApp.subWindow, guiInfo.VideoWidth, guiInfo.VideoHeight);
+                    wsMoveWindow(&guiApp.subWindow, True, guiApp.sub.x, guiApp.sub.y);
+                }
+
+                if (!guiApp.subWindow.Mapped)
+                    wsVisibleWindow(&guiApp.subWindow, wsShowWindow);
+
+                if (gtkLoadFullscreen ^ guiApp.subWindow.isFullScreen)
+                    uiEventHandling(evFullScreen, 0);
+            } else {
                 wsVisibleWindow(&guiApp.subWindow, wsHideWindow);
+                guiInfo.VideoWindow = False;
+                btnModify(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased);
+            }
 
             gui(GUI_SET_STATE, (void *)GUI_STOP);
 

Modified: trunk/gui/ui/actions.c
==============================================================================
--- trunk/gui/ui/actions.c	Thu Sep  1 21:14:11 2011	(r34047)
+++ trunk/gui/ui/actions.c	Thu Sep  1 22:15:40 2011	(r34048)
@@ -43,46 +43,13 @@ int uiGotoTheNext = 1;
 
 void uiFullScreen(void)
 {
-    if (!guiInfo.VideoWindow && guiInfo.Playing)
+    if (!guiInfo.VideoWindow)
         return;
 
-    if (guiInfo.Playing && guiApp.subWindow.isFullScreen) {
-        guiApp.subWindow.OldWidth  = guiInfo.VideoWidth;
-        guiApp.subWindow.OldHeight = guiInfo.VideoHeight;
-
-        switch (guiApp.sub.x) {
-        case -1:
-            guiApp.subWindow.OldX = wsMaxX / 2 - guiApp.subWindow.OldWidth / 2 + wsOrgX;
-            break;
-
-        case -2:
-            guiApp.subWindow.OldX = wsMaxX - guiApp.subWindow.OldWidth + wsOrgX;
-            break;
-
-        default:
-            guiApp.subWindow.OldX = guiApp.sub.x;
-            break;
-        }
-
-        switch (guiApp.sub.y) {
-        case -1:
-            guiApp.subWindow.OldY = wsMaxY / 2 - guiApp.subWindow.OldHeight / 2 + wsOrgY;
-            break;
-
-        case -2:
-            guiApp.subWindow.OldY = wsMaxY - guiApp.subWindow.OldHeight + wsOrgY;
-            break;
-
-        default:
-            guiApp.subWindow.OldY = guiApp.sub.y;
-            break;
-        }
-    }
+    wsFullScreen(&guiApp.subWindow);
 
-    if (guiInfo.Playing || gtkShowVideoWindow)
-        wsFullScreen(&guiApp.subWindow);
+    vo_fs = guiApp.subWindow.isFullScreen;
 
-    fullscreen = vo_fs = guiApp.subWindow.isFullScreen;
     wsSetLayer(wsDisplay, guiApp.mainWindow.WindowID, guiApp.subWindow.isFullScreen);
 
     if (guiApp.menuIsPresent)


More information about the MPlayer-cvslog mailing list