changeset 33960:1cd81338af07

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.
author ib
date Thu, 01 Sep 2011 20:15:40 +0000
parents ef089a8affc6
children 30a443c59053
files gui/interface.c gui/ui/actions.c
diffstat 2 files changed, 57 insertions(+), 92 deletions(-) [+]
line wrap: on
line diff
--- a/gui/interface.c	Thu Sep 01 19:14:11 2011 +0000
+++ b/gui/interface.c	Thu Sep 01 20:15:40 2011 +0000
@@ -57,7 +57,6 @@
 #endif
 
 guiInterface_t guiInfo = {
-    .VideoWindow = True,
     .StreamType  = STREAMTYPE_DUMMY,
     .Balance     = 50.0f
 };
@@ -208,31 +207,9 @@
 
     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 @@
             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;
+    } else
+        wsSetBackgroundRGB(&guiApp.subWindow, 0, 0, 0);
 
-                do
-                    XNextEvent(wsDisplay, &xev);
-                while (xev.type != MapNotify || xev.xmap.event != guiApp.subWindow.WindowID);
-
-                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 @@
             }
         }
 
-        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 @@
 
     case GUI_SETUP_VIDEO_WINDOW:
 
-        if (!guiApp.subWindow.isFullScreen) {
-            wsResizeWindow(&guiApp.subWindow, vo_dwidth, vo_dheight);
-            wsMoveWindow(&guiApp.subWindow, True, guiApp.sub.x, guiApp.sub.y);
-        }
-
         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);
+        }
+
+        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 @@
             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);
 
--- a/gui/ui/actions.c	Thu Sep 01 19:14:11 2011 +0000
+++ b/gui/ui/actions.c	Thu Sep 01 20:15:40 2011 +0000
@@ -43,46 +43,13 @@
 
 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;
-        }
+    wsFullScreen(&guiApp.subWindow);
 
-        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;
+    vo_fs = guiApp.subWindow.isFullScreen;
 
-        default:
-            guiApp.subWindow.OldY = guiApp.sub.y;
-            break;
-        }
-    }
-
-    if (guiInfo.Playing || gtkShowVideoWindow)
-        wsFullScreen(&guiApp.subWindow);
-
-    fullscreen = vo_fs = guiApp.subWindow.isFullScreen;
     wsSetLayer(wsDisplay, guiApp.mainWindow.WindowID, guiApp.subWindow.isFullScreen);
 
     if (guiApp.menuIsPresent)