Bug 541162 – [Win32] Update for the new GdkWindowImpl stuff

2008-07-02  Cody Russell  <bratsche@gnome.org>

        Bug 541162 – [Win32] Update for the new GdkWindowImpl stuff

        * gdk/win32/gdkprivate-win32.h:
        * gdk/win32/gdkgeometry-win32.c:
        * gdk/win32/gdkevents-win32.c:
        * gdk/win32/gdkwindow-win32.c: Update Win32 backend according to
        the newly refactored GdkWindow code.


svn path=/trunk/; revision=20729
This commit is contained in:
Cody Russell 2008-07-02 06:06:29 +00:00 committed by Cody Russell
parent 2b5d149c61
commit e625b41a1d
5 changed files with 172 additions and 271 deletions

View File

@ -1,3 +1,13 @@
2008-07-02 Cody Russell <bratsche@gnome.org>
Bug 541162 [Win32] Update for the new GdkWindowImpl stuff
* gdk/win32/gdkprivate-win32.h:
* gdk/win32/gdkgeometry-win32.c:
* gdk/win32/gdkevents-win32.c:
* gdk/win32/gdkwindow-win32.c: Update Win32 backend according to
the newly refactored GdkWindow code.
2008-07-01 Cody Russell <bratsche@gnome.org>
Bug 539164 Windows' System Menu blocks main loop

View File

@ -1366,7 +1366,7 @@ synthesize_enter_or_leave_event (GdkWindow *window,
event->crossing.window = window;
event->crossing.subwindow = NULL;
event->crossing.time = _gdk_win32_get_next_tick (msg->time);
_gdk_windowing_window_get_offsets (window, &xoffset, &yoffset);
_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset);
event->crossing.x = x + xoffset;
event->crossing.y = y + yoffset;
event->crossing.x_root = msg->pt.x + _gdk_offset_x;
@ -2012,7 +2012,7 @@ handle_wm_paint (MSG *msg,
update_region = _gdk_win32_hrgn_to_region (hrgn);
_gdk_windowing_window_get_offsets (window, &xoffset, &yoffset);
_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset);
gdk_region_offset (update_region, xoffset, yoffset);
_gdk_window_process_expose (window, update_region);
@ -2063,7 +2063,7 @@ generate_button_event (GdkEventType type,
translate_mouse_coords (orig_window, window, msg);
event->button.x = current_x = (gint16) GET_X_LPARAM (msg->lParam);
event->button.y = current_y = (gint16) GET_Y_LPARAM (msg->lParam);
_gdk_windowing_window_get_offsets (window, &xoffset, &yoffset);
_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset);
event->button.x += xoffset;
event->button.y += yoffset;
event->button.x_root = msg->pt.x + _gdk_offset_x;
@ -2633,7 +2633,7 @@ gdk_event_translate (MSG *msg,
event->motion.time = _gdk_win32_get_next_tick (msg->time);
event->motion.x = current_x = (gint16) GET_X_LPARAM (msg->lParam);
event->motion.y = current_y = (gint16) GET_Y_LPARAM (msg->lParam);
_gdk_windowing_window_get_offsets (window, &xoffset, &yoffset);
_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset);
event->motion.x += xoffset;
event->motion.y += yoffset;
event->motion.x_root = current_root_x;
@ -2724,7 +2724,7 @@ gdk_event_translate (MSG *msg,
event->scroll.direction = (((short) HIWORD (msg->wParam)) > 0) ?
GDK_SCROLL_UP : GDK_SCROLL_DOWN;
event->scroll.time = _gdk_win32_get_next_tick (msg->time);
_gdk_windowing_window_get_offsets (window, &xoffset, &yoffset);
_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset);
event->scroll.x = (gint16) point.x + xoffset;
event->scroll.y = (gint16) point.y + yoffset;
event->scroll.x_root = (gint16) GET_X_LPARAM (msg->lParam) + _gdk_offset_x;

View File

@ -75,7 +75,7 @@ static void gdk_window_post_scroll (GdkWindow *window,
GdkRegion *new_clip_region);
void
_gdk_windowing_window_get_offsets (GdkWindow *window,
_gdk_win32_windowing_window_get_offsets (GdkWindow *window,
gint *x_offset,
gint *y_offset)
{
@ -101,7 +101,7 @@ _gdk_window_init_position (GdkWindow *window)
}
void
gdk_window_scroll (GdkWindow *window,
_gdk_win32_window_scroll (GdkWindow *window,
gint dx,
gint dy)
{
@ -112,11 +112,6 @@ gdk_window_scroll (GdkWindow *window,
GdkWindowParentPos parent_pos;
HRGN native_invalidate_region;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
GDK_NOTE (EVENTS, g_print ("gdk_window_scroll: %p %d,%d\n",
GDK_WINDOW_HWND (window), dx, dy));
@ -172,7 +167,7 @@ gdk_window_scroll (GdkWindow *window,
}
void
gdk_window_move_region (GdkWindow *window,
_gdk_win32_window_move_region (GdkWindow *window,
const GdkRegion *region,
gint dx,
gint dy)
@ -184,11 +179,6 @@ gdk_window_move_region (GdkWindow *window,
HRGN hrgn;
RECT clipRect, destRect;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
obj = GDK_WINDOW_OBJECT (window);
impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);

View File

@ -209,6 +209,20 @@ void _gdk_window_move_resize_child (GdkWindow *window,
gint y,
gint width,
gint height);
/* GdkWindowImpl methods */
void _gdk_win32_window_scroll (GdkWindow *window,
gint dx,
gint dy);
void _gdk_win32_window_move_region (GdkWindow *window,
const GdkRegion *region,
gint dx,
gint dy);
void _gdk_win32_windowing_window_get_offsets (GdkWindow *window,
gint *x_offset,
gint *y_offset);
void _gdk_window_process_expose (GdkWindow *window,
GdkRegion *invalidate_region);

View File

@ -31,6 +31,7 @@
#include <stdlib.h>
#include "gdk.h"
#include "gdkwindowimpl.h"
#include "gdkprivate-win32.h"
#include "gdkinput-win32.h"
@ -61,6 +62,8 @@ static gboolean _gdk_window_get_functions (GdkWindow *window,
(GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
GType
_gdk_window_impl_win32_get_type (void)
{
@ -81,9 +84,19 @@ _gdk_window_impl_win32_get_type (void)
(GInstanceInitFunc) gdk_window_impl_win32_init,
};
const GInterfaceInfo window_impl_info =
{
(GInterfaceInitFunc) gdk_window_impl_iface_init,
NULL,
NULL
};
object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
"GdkWindowImplWin32",
&object_info, 0);
g_type_add_interface_static (object_type,
GDK_TYPE_WINDOW_IMPL,
&window_impl_info);
}
return object_type;
@ -282,6 +295,7 @@ _gdk_windowing_window_init (void)
_gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
private = (GdkWindowObject *)_gdk_root;
private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
draw_impl->handle = GetDesktopWindow ();
@ -522,6 +536,7 @@ gdk_window_new_internal (GdkWindow *parent,
window = g_object_new (GDK_TYPE_WINDOW, NULL);
private = (GdkWindowObject *)window;
private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
draw_impl->wrapper = GDK_DRAWABLE (window);
@ -1124,28 +1139,16 @@ show_window_internal (GdkWindow *window,
}
void
gdk_window_show_unraised (GdkWindow *window)
gdk_win32_window_show (GdkWindow *window, gboolean raise)
{
g_return_if_fail (GDK_IS_WINDOW (window));
show_window_internal (window, FALSE, FALSE);
show_window_internal (window, raise, FALSE);
}
void
gdk_window_show (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
show_window_internal (window, TRUE, FALSE);
}
void
gdk_window_hide (GdkWindow *window)
gdk_win32_window_hide (GdkWindow *window)
{
GdkWindowObject *private;
g_return_if_fail (GDK_IS_WINDOW (window));
private = (GdkWindowObject*) window;
if (private->destroyed)
return;
@ -1177,12 +1180,10 @@ gdk_window_hide (GdkWindow *window)
}
void
gdk_window_withdraw (GdkWindow *window)
gdk_win32_window_withdraw (GdkWindow *window)
{
GdkWindowObject *private;
g_return_if_fail (GDK_IS_WINDOW (window));
private = (GdkWindowObject*) window;
if (private->destroyed)
return;
@ -1195,106 +1196,8 @@ gdk_window_withdraw (GdkWindow *window)
}
void
gdk_window_move (GdkWindow *window,
gint x,
gint y)
{
GdkWindowObject *private = (GdkWindowObject *)window;
GdkWindowImplWin32 *impl;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
GDK_NOTE (MISC, g_print ("gdk_window_move: %p: %+d%+d\n",
GDK_WINDOW_HWND (window), x, y));
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
return;
/* Don't check GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD.
* Foreign windows (another app's windows) might be children of our
* windows! Especially in the case of gtkplug/socket.
*/
if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
{
_gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
}
else
{
RECT outer_rect;
get_outer_rect (window, impl->width, impl->height, &outer_rect);
adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,0,0,"
"NOACTIVATE|NOSIZE|NOZORDER)\n",
GDK_WINDOW_HWND (window),
x - _gdk_offset_x, y - _gdk_offset_y));
API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
}
}
void
gdk_window_resize (GdkWindow *window,
gint width,
gint height)
{
GdkWindowObject *private = (GdkWindowObject*) window;
GdkWindowImplWin32 *impl;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
if (width < 1)
width = 1;
if (height < 1)
height = 1;
GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
GDK_WINDOW_HWND (window), width, height));
impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
return;
if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
{
_gdk_window_move_resize_child (window, private->x, private->y, width, height);
}
else
{
RECT outer_rect;
get_outer_rect (window, width, height, &outer_rect);
GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,0,0,%ld,%ld,"
"NOACTIVATE|NOMOVE|NOZORDER)\n",
GDK_WINDOW_HWND (window),
outer_rect.right - outer_rect.left,
outer_rect.bottom - outer_rect.top));
API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
0, 0,
outer_rect.right - outer_rect.left,
outer_rect.bottom - outer_rect.top,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
private->resize_count += 1;
}
}
void
gdk_window_move_resize (GdkWindow *window,
gdk_win32_window_move_resize (GdkWindow *window,
gboolean with_move,
gint x,
gint y,
gint width,
@ -1303,11 +1206,6 @@ gdk_window_move_resize (GdkWindow *window,
GdkWindowObject *private = (GdkWindowObject*) window;
GdkWindowImplWin32 *impl;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
if (width < 1)
width = 1;
if (height < 1)
@ -1341,16 +1239,22 @@ gdk_window_move_resize (GdkWindow *window,
outer_rect.right - outer_rect.left,
outer_rect.bottom - outer_rect.top));
UINT uflags = SWP_NOACTIVATE | SWP_NOZORDER;
if (with_move == FALSE)
uflags |= SWP_NOMOVE;
if (width == -1 || height == -1)
uflags |= SWP_NOSIZE;
API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
x - _gdk_offset_x, y - _gdk_offset_y,
outer_rect.right - outer_rect.left,
outer_rect.bottom - outer_rect.top,
SWP_NOACTIVATE | SWP_NOZORDER));
uflags));
}
}
void
_gdk_window_reparent (GdkWindow *window,
static gboolean
gdk_win32_window_reparent (GdkWindow *window,
GdkWindow *new_parent,
gint x,
gint y)
@ -1439,6 +1343,8 @@ _gdk_window_reparent (GdkWindow *window,
parent_private->children = g_list_prepend (parent_private->children, window);
_gdk_window_init_position (GDK_WINDOW (window_private));
return TRUE;
}
static void
@ -1575,22 +1481,26 @@ erase_background (GdkWindow *window,
}
void
_gdk_windowing_window_clear_area (GdkWindow *window,
_gdk_win32_window_clear_area (GdkWindow *window,
gint x,
gint y,
gint width,
gint height)
gint height,
gboolean send_expose)
{
GdkWindowImplWin32 *impl;
g_return_if_fail (GDK_IS_WINDOW (window));
impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
if (!GDK_WINDOW_DESTROYED (window))
{
HDC hdc;
RECT rect;
hdc = GetDC (GDK_WINDOW_HWND (window));
if (!send_expose)
{
if (width == 0)
width = impl->width - x;
if (height == 0)
@ -1599,35 +1509,14 @@ _gdk_windowing_window_clear_area (GdkWindow *window,
"%dx%d@%+d%+d\n",
GDK_WINDOW_HWND (window),
width, height, x, y));
hdc = GetDC (GDK_WINDOW_HWND (window));
IntersectClipRect (hdc, x, y, x + width, y + height);
erase_background (window, hdc);
GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
}
}
void
_gdk_windowing_window_clear_area_e (GdkWindow *window,
gint x,
gint y,
gint width,
gint height)
else
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (!GDK_WINDOW_DESTROYED (window))
{
HDC hdc;
RECT rect;
GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
"%dx%d@%+d%+d\n",
GDK_WINDOW_HWND (window),
width, height, x, y));
/* The background should be erased before the expose event is
generated */
hdc = GetDC (GDK_WINDOW_HWND (window));
IntersectClipRect (hdc, x, y, x + width, y + height);
erase_background (window, hdc);
GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
@ -1641,12 +1530,11 @@ _gdk_windowing_window_clear_area_e (GdkWindow *window,
UpdateWindow (GDK_WINDOW_HWND (window));
}
}
}
void
gdk_window_raise (GdkWindow *window)
gdk_win32_window_raise (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (!GDK_WINDOW_DESTROYED (window))
{
GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
@ -1666,10 +1554,8 @@ gdk_window_raise (GdkWindow *window)
}
void
gdk_window_lower (GdkWindow *window)
gdk_win32_window_lower (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (!GDK_WINDOW_DESTROYED (window))
{
GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n"
@ -2074,13 +1960,11 @@ _gdk_modal_current ()
}
void
gdk_window_set_background (GdkWindow *window,
gdk_win32_window_set_background (GdkWindow *window,
const GdkColor *color)
{
GdkWindowObject *private = (GdkWindowObject *)window;
g_return_if_fail (GDK_IS_WINDOW (window));
GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
GDK_WINDOW_HWND (window),
_gdk_win32_color_to_string (color)));
@ -2097,16 +1981,12 @@ gdk_window_set_background (GdkWindow *window,
}
void
gdk_window_set_back_pixmap (GdkWindow *window,
gdk_win32_window_set_back_pixmap (GdkWindow *window,
GdkPixmap *pixmap,
gint parent_relative)
{
GdkWindowObject *private = (GdkWindowObject *)window;
g_return_if_fail (GDK_IS_WINDOW (window));
g_return_if_fail (pixmap == NULL || !parent_relative);
g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
if (pixmap && !gdk_drawable_get_colormap (pixmap))
{
g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
@ -2138,7 +2018,7 @@ gdk_window_set_back_pixmap (GdkWindow *window,
}
void
gdk_window_set_cursor (GdkWindow *window,
gdk_win32_window_set_cursor (GdkWindow *window,
GdkCursor *cursor)
{
GdkWindowImplWin32 *impl;
@ -2147,8 +2027,6 @@ gdk_window_set_cursor (GdkWindow *window,
HCURSOR hcursor;
HCURSOR hprevcursor;
g_return_if_fail (GDK_IS_WINDOW (window));
impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
cursor_private = (GdkCursorPrivate*) cursor;
@ -2246,15 +2124,13 @@ gdk_window_set_cursor (GdkWindow *window,
}
void
gdk_window_get_geometry (GdkWindow *window,
gdk_win32_window_get_geometry (GdkWindow *window,
gint *x,
gint *y,
gint *width,
gint *height,
gint *depth)
{
g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
if (!window)
window = _gdk_root;
@ -2312,7 +2188,7 @@ gdk_window_get_geometry (GdkWindow *window,
}
gint
gdk_window_get_origin (GdkWindow *window,
gdk_win32_window_get_origin (GdkWindow *window,
gint *x,
gint *y)
{
@ -2320,8 +2196,6 @@ gdk_window_get_origin (GdkWindow *window,
gint tx = 0;
gint ty = 0;
g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
if (!GDK_WINDOW_DESTROYED (window))
{
POINT pt;
@ -2561,10 +2435,8 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
}
GdkEventMask
gdk_window_get_events (GdkWindow *window)
gdk_win32_window_get_events (GdkWindow *window)
{
g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
if (GDK_WINDOW_DESTROYED (window))
return 0;
@ -2572,14 +2444,9 @@ gdk_window_get_events (GdkWindow *window)
}
void
gdk_window_set_events (GdkWindow *window,
gdk_win32_window_set_events (GdkWindow *window,
GdkEventMask event_mask)
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
/* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
* set it here, too. Not that I know or remember why it is
* necessary, will have to test some day.
@ -2612,14 +2479,12 @@ do_shape_combine_region (GdkWindow *window,
}
void
gdk_window_shape_combine_mask (GdkWindow *window,
gdk_win32_window_shape_combine_mask (GdkWindow *window,
GdkBitmap *mask,
gint x, gint y)
{
GdkWindowObject *private = (GdkWindowObject *)window;
g_return_if_fail (GDK_IS_WINDOW (window));
if (!mask)
{
GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
@ -3135,10 +3000,8 @@ gdk_propagate_shapes (HANDLE win,
}
void
gdk_window_set_child_shapes (GdkWindow *window)
gdk_win32_window_set_child_shapes (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
@ -3146,10 +3009,8 @@ gdk_window_set_child_shapes (GdkWindow *window)
}
void
gdk_window_merge_child_shapes (GdkWindow *window)
gdk_win32_window_merge_child_shapes (GdkWindow *window)
{
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
@ -3177,7 +3038,7 @@ gdk_window_merge_child_input_shapes (GdkWindow *window)
}
gboolean
gdk_window_set_static_gravities (GdkWindow *window,
gdk_win32_window_set_static_gravities (GdkWindow *window,
gboolean use_static)
{
g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
@ -3666,15 +3527,13 @@ gdk_window_get_type_hint (GdkWindow *window)
}
void
gdk_window_shape_combine_region (GdkWindow *window,
gdk_win32_window_shape_combine_region (GdkWindow *window,
const GdkRegion *shape_region,
gint offset_x,
gint offset_y)
{
GdkWindowObject *private = (GdkWindowObject *)window;
g_return_if_fail (GDK_IS_WINDOW (window));
if (GDK_WINDOW_DESTROYED (window))
return;
@ -3784,3 +3643,31 @@ void
_gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)
{
}
static void
gdk_window_impl_iface_init (GdkWindowImplIface *iface)
{
iface->show = gdk_win32_window_show;
iface->hide = gdk_win32_window_hide;
iface->withdraw = gdk_win32_window_withdraw;
iface->set_events = gdk_win32_window_set_events;
iface->get_events = gdk_win32_window_get_events;
iface->clear_area = _gdk_win32_window_clear_area;
iface->raise = gdk_win32_window_raise;
iface->lower = gdk_win32_window_lower;
iface->move_resize = gdk_win32_window_move_resize;
iface->scroll = _gdk_win32_window_scroll;
iface->move_region = _gdk_win32_window_move_region;
iface->set_background = gdk_win32_window_set_background;
iface->set_back_pixmap = gdk_win32_window_set_back_pixmap;
iface->reparent = gdk_win32_window_reparent;
iface->set_cursor = gdk_win32_window_set_cursor;
iface->get_geometry = gdk_win32_window_get_geometry;
iface->get_origin = gdk_win32_window_get_origin;
iface->shape_combine_mask = gdk_win32_window_shape_combine_mask;
iface->shape_combine_region = gdk_win32_window_shape_combine_region;
iface->set_child_shapes = gdk_win32_window_set_child_shapes;
iface->merge_child_shapes = gdk_win32_window_merge_child_shapes;
iface->set_static_gravities = gdk_win32_window_set_static_gravities;
iface->get_offsets = _gdk_win32_windowing_window_get_offsets;
}