+ {
+ const vout_display_cfg_t *cfg;
+ const video_format_t *source;
+ bool is_forced = false;
+
+ if (query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT
+ || query == VOUT_DISPLAY_CHANGE_SOURCE_CROP)
+ {
+ source = (const video_format_t *)va_arg (ap, const video_format_t *);
+ cfg = vd->cfg;
+ }
+ else
+ {
+ source = &vd->source;
+ cfg = (const vout_display_cfg_t*)va_arg (ap, const vout_display_cfg_t *);
+ if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
+ is_forced = (bool)va_arg (ap, int);
+ }
+
+ /* */
+ if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE
+ && is_forced
+ && (cfg->display.width != vd->cfg->display.width
+ ||cfg->display.height != vd->cfg->display.height)
+ && vout_window_SetSize (sys->embed,
+ cfg->display.width, cfg->display.height))
+ return VLC_EGENERIC;
+
+ vout_display_place_t place;
+ vout_display_PlacePicture (&place, source, cfg, false);
+
+ /* Move the picture within the window */
+ const uint32_t values[] = { place.x, place.y,
+ place.width, place.height, };
+ xcb_void_cookie_t ck =
+ xcb_configure_window_checked (sys->conn, sys->window,
+ XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y
+ | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
+ values);
+ if (CheckError (vd, sys->conn, "cannot resize X11 window", ck))
+ return VLC_EGENERIC;
+
+ glViewport (0, 0, place.width, place.height);
+ return VLC_SUCCESS;
+ }