win32: Move surface init code into ::constructed()
authorBenjamin Otte <otte@redhat.com>
Mon, 17 Apr 2023 02:27:11 +0000 (04:27 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 26 Apr 2023 19:03:34 +0000 (21:03 +0200)
gdk/win32/gdksurface-win32.c

index d18079d45baefad31c8432506c4c568e67eb5324..c52a002e56ff4b29bbfd0d7105b24346dab984af 100644 (file)
@@ -330,7 +330,7 @@ get_default_title (void)
  *   get its own class
  */
 static ATOM
-RegisterGdkClass (GdkSurfaceType wtype)
+RegisterGdkClass (GType wtype)
 {
   static ATOM klassTOPLEVEL = 0;
   static ATOM klassTEMP     = 0;
@@ -403,10 +403,8 @@ RegisterGdkClass (GdkSurfaceType wtype)
   /* MSDN: CS_OWNDC is needed for OpenGL contexts */
   wcl.style |= CS_OWNDC;
 
-  switch (wtype)
+  if (wtype != GDK_TYPE_WIN32_DRAG_SURFACE)
     {
-    case GDK_SURFACE_TOPLEVEL:
-    case GDK_SURFACE_POPUP:
       if (0 == klassTOPLEVEL)
         {
           wcl.lpszClassName = L"gdkSurfaceToplevel";
@@ -415,9 +413,9 @@ RegisterGdkClass (GdkSurfaceType wtype)
           klassTOPLEVEL = RegisterClassExW (&wcl);
         }
       klass = klassTOPLEVEL;
-      break;
-
-    case GDK_SURFACE_DRAG:
+    }
+  else
+    {
       if (klassTEMP == 0)
         {
           wcl.lpszClassName = L"gdkSurfaceTemp";
@@ -427,12 +425,6 @@ RegisterGdkClass (GdkSurfaceType wtype)
         }
 
       klass = klassTEMP;
-
-      break;
-
-    default:
-      g_assert_not_reached ();
-      break;
     }
 
   if (klass == 0)
@@ -448,19 +440,9 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
                                   GdkSurfaceType  surface_type,
                                   GdkSurface     *parent)
 {
-  HANDLE owner;
-  ATOM klass = 0;
-  DWORD dwStyle = 0, dwExStyle;
-  RECT rect;
-  GdkWin32Surface *impl;
-  GdkWin32Display *display_win32;
   GdkSurface *surface;
-  const char *title;
-  wchar_t *wtitle;
   GdkFrameClock *frame_clock;
 
-  display_win32 = GDK_WIN32_DISPLAY (display);
-
   if (parent)
     frame_clock = g_object_ref (gdk_surface_get_frame_clock (parent));
   else
@@ -469,29 +451,48 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
   switch (surface_type)
     {
     case GDK_SURFACE_TOPLEVEL:
-      impl = g_object_new (GDK_TYPE_WIN32_TOPLEVEL,
-                           "display", display,
-                           "frame-clock", frame_clock,
-                           NULL);
+      surface = g_object_new (GDK_TYPE_WIN32_TOPLEVEL,
+                              "display", display,
+                              "frame-clock", frame_clock,
+                              NULL);
       break;
     case GDK_SURFACE_POPUP:
-      impl = g_object_new (GDK_TYPE_WIN32_POPUP,
-                           "parent", parent,
-                           "display", display,
-                           "frame-clock", frame_clock,
-                           NULL);
+      surface = g_object_new (GDK_TYPE_WIN32_POPUP,
+                              "parent", parent,
+                              "display", display,
+                              "frame-clock", frame_clock,
+                              NULL);
       break;
     case GDK_SURFACE_DRAG:
-      impl = g_object_new (GDK_TYPE_WIN32_DRAG_SURFACE,
-                           "display", display,
-                           "frame-clock", frame_clock,
-                           NULL);
+      surface = g_object_new (GDK_TYPE_WIN32_DRAG_SURFACE,
+                              "display", display,
+                              "frame-clock", frame_clock,
+                              NULL);
       break;
     default:
       g_assert_not_reached ();
       break;
     }
 
+  g_object_unref (frame_clock);
+
+  return surface;
+}
+
+static void
+gdk_win32_surface_constructed (GObject *object)
+{
+  GdkWin32Surface *impl = GDK_WIN32_SURFACE (object);
+  GdkSurface *surface = GDK_SURFACE (impl);
+  GdkDisplay *display = gdk_surface_get_display (surface);
+  GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
+  HANDLE owner;
+  ATOM klass = 0;
+  DWORD dwStyle = 0, dwExStyle;
+  RECT rect;
+  const char *title;
+  wchar_t *wtitle;
+
   impl->surface_scale = gdk_win32_display_get_monitor_scale_factor (display_win32, NULL, NULL);
 
   dwExStyle = 0;
@@ -500,24 +501,22 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
   /* MSDN: We need WS_CLIPCHILDREN and WS_CLIPSIBLINGS for GL Context Creation */
   dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
 
-  switch (surface_type)
+  if (G_OBJECT_TYPE (impl) == GDK_TYPE_WIN32_TOPLEVEL)
     {
-    case GDK_SURFACE_TOPLEVEL:
       dwStyle |= WS_OVERLAPPEDWINDOW;
-      break;
-
-    case GDK_SURFACE_DRAG:
+    }
+  else if (G_OBJECT_TYPE (impl) == GDK_TYPE_WIN32_DRAG_SURFACE)
+    {
       dwExStyle |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
-      /* fall through */
-    case GDK_SURFACE_POPUP:
       dwStyle |= WS_POPUP;
-
-      /* Only popup and temp windows are fit to use the Owner Window mechanism */
-      if (parent != NULL)
-        owner = GDK_SURFACE_HWND (parent);
-      break;
-
-    default:
+    }
+  else if (G_OBJECT_TYPE (impl) == GDK_TYPE_WIN32_POPUP)
+    {
+      dwStyle |= WS_POPUP;
+      owner = GDK_SURFACE_HWND (gdk_popup_get_parent (GDK_POPUP (impl)));
+    }
+  else
+    {
       g_assert_not_reached ();
     }
 
@@ -525,7 +524,7 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
   if (!title || !*title)
     title = "";
 
-  klass = RegisterGdkClass (surface_type);
+  klass = RegisterGdkClass (G_OBJECT_TYPE (impl));
 
   wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
 
@@ -564,7 +563,7 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
 
   gdk_surface_set_egl_native_window (surface, (void *) impl->handle);
 
-  if (surface_type != GDK_SURFACE_DRAG)
+  if (G_OBJECT_TYPE (impl) != GDK_TYPE_WIN32_DRAG_SURFACE)
     {
       if (display_win32->tablet_input_api == GDK_WIN32_TABLET_INPUT_API_WINPOINTER)
         gdk_winpointer_initialize_surface (surface);
@@ -576,16 +575,15 @@ gdk_win32_display_create_surface (GdkDisplay     *display,
   _gdk_win32_surface_register_dnd (surface);
   _gdk_win32_surface_update_style_bits (surface);
 
-  g_signal_connect (frame_clock,
+  g_signal_connect (gdk_surface_get_frame_clock (surface),
                     "after-paint",
                     G_CALLBACK (gdk_win32_impl_frame_clock_after_paint),
                     impl);
 
-  g_object_unref (frame_clock);
   impl->hdc = GetDC (impl->handle);
   impl->inhibit_configure = TRUE;
 
-  return surface;
+  G_OBJECT_CLASS (parent_class)->constructed (object);
 }
 
 static void
@@ -4547,6 +4545,7 @@ gdk_win32_surface_class_init (GdkWin32SurfaceClass *klass)
 
   parent_class = g_type_class_peek_parent (klass);
 
+  object_class->constructed = gdk_win32_surface_constructed;
   object_class->dispose = gdk_surface_win32_dispose;
   object_class->finalize = gdk_surface_win32_finalize;