]> git.sesse.net Git - vlc/commitdiff
vout: request resize directly from the window rather than display
authorRémi Denis-Courmont <remi@remlab.net>
Sun, 12 Oct 2014 15:03:27 +0000 (18:03 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 16 Oct 2014 17:23:38 +0000 (20:23 +0300)
src/video_output/display.c
src/video_output/display.h
src/video_output/video_output.c

index e428fe7df862fa9b7e0e94dae0081bf4f201809e..d548cbbc007ea3fe326e47c533346080599689e5 100644 (file)
@@ -411,7 +411,6 @@ struct vout_display_owner_sys_t {
     bool ch_display_size;
     int  display_width;
     int  display_height;
-    bool display_is_forced;
 
     int  fit_window;
 
@@ -708,7 +707,6 @@ static void VoutDisplayEvent(vout_display_t *vd, int event, va_list args)
         osys->ch_display_size   = true;
         osys->display_width     = width;
         osys->display_height    = height;
-        osys->display_is_forced = false;
 
         vlc_mutex_unlock(&osys->lock);
         break;
@@ -793,14 +791,12 @@ static void VoutDisplayFitWindow(vout_display_t *vd, bool default_size)
     vout_display_GetDefaultDisplaySize(&display_width, &display_height,
                                        &vd->source, &cfg);
 
-    vlc_mutex_lock(&osys->lock);
-
-    osys->ch_display_size   = true;
-    osys->display_width     = display_width;
-    osys->display_height    = display_height;
-    osys->display_is_forced = true;
-
-    vlc_mutex_unlock(&osys->lock);
+#ifdef ALLOW_DUMMY_VOUT
+    if (!osys->vout->p)
+        vout_display_SendEventDisplaySize(vd, display_width, display_height);
+    else
+#endif
+        vout_SetDisplayWindowSize(osys->vout, display_width, display_height);
 }
 
 static void VoutDisplayCropRatio(int *left, int *top, int *right, int *bottom,
@@ -868,7 +864,6 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
         bool ch_display_size       = osys->ch_display_size;
         int  display_width         = osys->display_width;
         int  display_height        = osys->display_height;
-        bool display_is_forced     = osys->display_is_forced;
         osys->ch_display_size = false;
 
         bool reset_pictures;
@@ -906,15 +901,18 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
             cfg.display.width  = cfg.is_fullscreen ? 0 : osys->width_saved;
             cfg.display.height = cfg.is_fullscreen ? 0 : osys->height_saved;
 
-            if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_FULLSCREEN, &cfg)) {
-                msg_Err(vd, "Failed to set fullscreen");
+            if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_FULLSCREEN, &cfg) == VLC_SUCCESS) {
+                osys->cfg.is_fullscreen = is_fullscreen;
+
+                if (!is_fullscreen)
+                    vout_SetDisplayWindowSize(osys->vout, osys->width_saved,
+                                              osys->height_saved);
+            } else {
                 is_fullscreen = osys->cfg.is_fullscreen;
-            } else if (!is_fullscreen) {
-                vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE, &cfg, true);
+
+                msg_Err(vd, "Failed to set fullscreen");
             }
-            osys->cfg.is_fullscreen = is_fullscreen;
 
-            /* */
             vout_SendEventFullscreen(osys->vout, osys->cfg.is_fullscreen);
         }
 
@@ -928,9 +926,8 @@ bool vout_ManageDisplay(vout_display_t *vd, bool allow_reset_pictures)
             osys->height_saved = osys->cfg.display.height;
 
             if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_DISPLAY_SIZE,
-                                     &cfg, display_is_forced)) {
-                if (!display_is_forced)
-                    msg_Err(vd, "Failed to resize display");
+                                     &cfg, false)) {
+                msg_Err(vd, "Failed to resize display");
 
                 /* We ignore the resized */
                 display_width  = osys->cfg.display.width;
index 11daef219061a9f96fae54ec51cb64b8f2ed5751..337f88188537dbf71eb120f147545961a7f19fe7 100644 (file)
@@ -33,7 +33,9 @@ vout_display_t *vout_NewSplitter(vout_thread_t *vout,
 
 /* FIXME should not be there */
 void vout_SendDisplayEventMouse(vout_thread_t *, const vlc_mouse_t *);
+
 vout_window_t *vout_NewDisplayWindow(vout_thread_t *, const vout_window_cfg_t *);
 void vout_DeleteDisplayWindow(vout_thread_t *, vout_window_t *);
-void vout_UpdateDisplaySourceProperties(vout_display_t *vd, const video_format_t *);
+void vout_SetDisplayWindowSize(vout_thread_t *, unsigned, unsigned);
 
+void vout_UpdateDisplaySourceProperties(vout_display_t *vd, const video_format_t *);
index 197096b188795efd6720ba6bdabd3b93835832d6..f928a77d88700c38a68dfd658fc787fd74bcb04c 100644 (file)
@@ -648,6 +648,23 @@ void vout_DeleteDisplayWindow(vout_thread_t *vout, vout_window_t *window)
     assert(vout->p->window == window);
 }
 
+void vout_SetDisplayWindowSize(vout_thread_t *vout,
+                               unsigned width, unsigned height)
+{
+    vout_window_t *window = vout->p->window;
+
+    if (window != NULL)
+    /* Request a resize of the window. If it fails, there is nothing to do.
+     * If it succeeds, the window will emit a resize event later. */
+        vout_window_SetSize(window, width, height);
+    else
+    if (vout->p->display.vd != NULL)
+    /* Force a resize of window-less display. This is not allowed to fail,
+     * although the display is allowed to ignore the size anyway. */
+        /* FIXME: remove this, fix MSW and OS/2 window providers */
+        vout_display_SendEventDisplaySize(vout->p->display.vd, width, height);
+}
+
 /* */
 static picture_t *VoutVideoFilterInteractiveNewPicture(filter_t *filter)
 {