From: Benjamin Otte Date: Mon, 17 Apr 2023 02:27:11 +0000 (+0200) Subject: win32: Move surface init code into ::constructed() X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~368^2~22 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=4fa81cf70f5617b636a6d4033e36cdf814ed65d8;p=gtk4.git win32: Move surface init code into ::constructed() --- diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c index d18079d45b..c52a002e56 100644 --- a/gdk/win32/gdksurface-win32.c +++ b/gdk/win32/gdksurface-win32.c @@ -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;