win32: Move surface init code into ::constructed()

This commit is contained in:
Benjamin Otte
2023-04-17 04:27:11 +02:00
parent 9ac31fe0a0
commit 4fa81cf70f

View 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;