d3d11window: Disable fullscreen mode change by alt + enter
authorSeungha Yang <seungha.yang@navercorp.com>
Sun, 15 Dec 2019 09:30:22 +0000 (18:30 +0900)
committerSeungha Yang <seungha.yang@navercorp.com>
Fri, 20 Dec 2019 02:15:12 +0000 (11:15 +0900)
Disable full screen mode change until proper handling is implemented

sys/d3d11/gstd3d11window.c

index 80976ef..d24b726 100644 (file)
@@ -967,12 +967,46 @@ gst_d3d11_window_color_space_from_video_info (GstD3D11Window * self,
 }
 #endif
 
+typedef struct
+{
+  GstD3D11Window *self;
+  HWND hwnd;
+  IDXGISwapChain *swap_chain;
+} MakeWindowAssociationData;
+
+static void
+gst_d3d11_window_disable_alt_enter (GstD3D11Device * device,
+    MakeWindowAssociationData * data)
+{
+  IDXGIFactory1 *factory = NULL;
+  HRESULT hr;
+
+  hr = IDXGISwapChain_GetParent (data->swap_chain, &IID_IDXGIFactory1,
+      (void **) &factory);
+  if (!gst_d3d11_result (hr) || !factory) {
+    GST_WARNING_OBJECT (data->self,
+        "Cannot get parent dxgi factory for swapchain %p, hr: 0x%x",
+        data->swap_chain, (guint) hr);
+    return;
+  }
+
+  hr = IDXGIFactory1_MakeWindowAssociation (factory,
+      data->hwnd, DXGI_MWA_NO_ALT_ENTER);
+  if (!gst_d3d11_result (hr)) {
+    GST_WARNING_OBJECT (data->self,
+        "MakeWindowAssociation failure, hr: 0x%x", (guint) hr);
+  }
+
+  IDXGIFactory1_Release (factory);
+}
+
 gboolean
 gst_d3d11_window_prepare (GstD3D11Window * window, guint width, guint height,
     guint aspect_ratio_n, guint aspect_ratio_d, GstCaps * caps, GError ** error)
 {
   DXGI_SWAP_CHAIN_DESC desc = { 0, };
   GstCaps *render_caps;
+  MakeWindowAssociationData mwa_data = { 0, };
 #if defined(HAVE_DXGI_1_5_H)
   gboolean have_cll = FALSE;
   gboolean have_mastering = FALSE;
@@ -1109,7 +1143,7 @@ gst_d3d11_window_prepare (GstD3D11Window * window, guint width, guint height,
 #endif
   desc.OutputWindow = window->internal_win_id;
   desc.Windowed = TRUE;
-  desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
+  desc.Flags = 0;
 
   window->swap_chain =
       gst_d3d11_device_create_swap_chain (window->device, &desc);
@@ -1121,6 +1155,14 @@ gst_d3d11_window_prepare (GstD3D11Window * window, guint width, guint height,
 
     return FALSE;
   }
+
+  /* disable alt+enter here. It should be manually handled */
+  mwa_data.self = window;
+  mwa_data.swap_chain = window->swap_chain;
+  mwa_data.hwnd = desc.OutputWindow;
+  gst_d3d11_device_thread_add (window->device,
+      (GstD3D11DeviceThreadFunc) gst_d3d11_window_disable_alt_enter, &mwa_data);
+
 #if defined(HAVE_DXGI_1_5_H)
   if (swapchain4_available) {
     HRESULT hr;