* get its own class
*/
static ATOM
-RegisterGdkClass (GdkSurfaceType wtype)
+RegisterGdkClass (GType wtype)
{
static ATOM klassTOPLEVEL = 0;
static ATOM klassTEMP = 0;
/* 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";
klassTOPLEVEL = RegisterClassExW (&wcl);
}
klass = klassTOPLEVEL;
- break;
-
- case GDK_SURFACE_DRAG:
+ }
+ else
+ {
if (klassTEMP == 0)
{
wcl.lpszClassName = L"gdkSurfaceTemp";
}
klass = klassTEMP;
-
- break;
-
- default:
- g_assert_not_reached ();
- break;
}
if (klass == 0)
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
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;
/* 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 ();
}
if (!title || !*title)
title = "";
- klass = RegisterGdkClass (surface_type);
+ klass = RegisterGdkClass (G_OBJECT_TYPE (impl));
wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
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);
_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
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;