1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 /* gdkgeometry-win32.c: emulation of 32 bit coordinates within the
21 * limits of Win32 GDI. Just a copy of the X11 version, more or less.
22 * Probably totally bogus in functionality. Just a quick hack, to
23 * get the thing to build. Need to write some test code for it.
24 * Well, need to find out what it is supposed to do first ;-)
26 * The X11 version by Owen Taylor <otaylor@redhat.com>
27 * Copyright Red Hat, Inc. 2000
28 * Win32 hack by Tor Lillqvist <tml@iki.fi>
31 #include "gdk.h" /* For gdk_rectangle_intersect */
32 #include "gdkregion.h"
33 #include "gdkregion-generic.h"
34 #include "gdkinternals.h"
35 #include "gdkprivate-win32.h"
36 #include "gdkdrawable-win32.h"
37 #include "gdkwindow-win32.h"
39 typedef struct _GdkWindowQueueItem GdkWindowQueueItem;
40 typedef struct _GdkWindowParentPos GdkWindowParentPos;
43 GDK_WINDOW_QUEUE_TRANSLATE,
44 GDK_WINDOW_QUEUE_ANTIEXPOSE
47 struct _GdkWindowQueueItem
51 GdkWindowQueueType type;
63 struct _GdkWindowParentPos
69 GdkRectangle clip_rect;
72 static void gdk_window_compute_position (GdkWindowImplWin32 *window,
73 GdkWindowParentPos *parent_pos,
74 GdkWin32PositionInfo *info);
75 static void gdk_window_compute_parent_pos (GdkWindowImplWin32 *window,
76 GdkWindowParentPos *parent_pos);
77 static void gdk_window_premove (GdkWindow *window,
78 GdkWindowParentPos *parent_pos);
79 static void gdk_window_postmove (GdkWindow *window,
80 GdkWindowParentPos *parent_pos);
81 static void gdk_window_queue_translation (GdkWindow *window,
84 static void gdk_window_tmp_unset_bg (GdkWindow *window);
85 static void gdk_window_tmp_reset_bg (GdkWindow *window);
86 static void gdk_window_clip_changed (GdkWindow *window,
87 GdkRectangle *old_clip,
88 GdkRectangle *new_clip);
90 static GSList *translate_queue = NULL;
93 _gdk_windowing_window_get_offsets (GdkWindow *window,
97 GdkWindowImplWin32 *impl =
98 GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
100 *x_offset = impl->position_info.x_offset;
101 *y_offset = impl->position_info.y_offset;
105 _gdk_window_init_position (GdkWindow *window)
107 GdkWindowParentPos parent_pos;
108 GdkWindowImplWin32 *impl;
110 g_return_if_fail (GDK_IS_WINDOW (window));
112 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
114 gdk_window_compute_parent_pos (impl, &parent_pos);
115 gdk_window_compute_position (impl, &parent_pos, &impl->position_info);
120 * @window: a #GdkWindow
121 * @dx: Amount to scroll in the X direction
122 * @dy: Amount to scroll in the Y direction
124 * Scroll the contents of its window, both pixels and children, by
125 * the given amount. Portions of the window that the scroll operation
126 * brings in from offscreen areas are invalidated. The invalidated
127 * region may be bigger than what would strictly be necessary.
128 * (For X11, a minimum area will be invalidated if the window has
129 * no subwindows, or if the edges of the window's parent do not extend
130 * beyond the edges of the window. In other cases, a multi-step process
131 * is used to scroll the window which may produce temporary visual
132 * artifacts and unnecessary invalidations.)
135 gdk_window_scroll (GdkWindow *window,
139 gboolean can_guffaw_scroll = FALSE;
140 GdkWindowImplWin32 *impl;
141 GdkWindowObject *obj;
143 g_return_if_fail (GDK_IS_WINDOW (window));
145 obj = GDK_WINDOW_OBJECT (window);
146 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
148 if (GDK_WINDOW_DESTROYED (window))
151 /* We can guffaw scroll if we are a child window, and the parent
152 * does not extend beyond our edges.
155 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD)
157 GdkWindowImplWin32 *parent_impl = GDK_WINDOW_IMPL_WIN32 (obj->parent->impl);
158 can_guffaw_scroll = (obj->x <= 0 &&
160 obj->x + impl->width >= parent_impl->width &&
161 obj->y + impl->height >= parent_impl->height);
164 if (!obj->children || !can_guffaw_scroll)
166 /* Use ScrollWindowEx, then move any children later
169 GdkRegion *invalidate_region;
170 GdkRectangle dest_rect;
172 invalidate_region = gdk_region_rectangle (&impl->position_info.clip_rect);
174 dest_rect = impl->position_info.clip_rect;
177 gdk_rectangle_intersect (&dest_rect, &impl->position_info.clip_rect, &dest_rect);
179 if (dest_rect.width > 0 && dest_rect.height > 0)
181 GdkRegion *tmp_region;
183 tmp_region = gdk_region_rectangle (&dest_rect);
184 gdk_region_subtract (invalidate_region, tmp_region);
185 gdk_region_destroy (tmp_region);
187 gdk_window_queue_translation (window, dx, dy);
189 if (ScrollWindowEx (GDK_WINDOW_HWND (window), dx, dy,
190 NULL, NULL, NULL, NULL, 0) == ERROR)
191 WIN32_API_FAILED ("ScrollWindowEx");
194 gdk_window_invalidate_region (window, invalidate_region, TRUE);
195 gdk_region_destroy (invalidate_region);
197 tmp_list = obj->children;
200 GdkWindow * child = GDK_WINDOW (tmp_list->data);
202 gdk_window_move (child, obj->x + dx, obj->y + dy);
204 tmp_list = tmp_list->next;
211 g_warning ("gdk_window_scroll(): guffaw scrolling not yet implemented");
216 _gdk_window_move_resize_child (GdkWindow *window,
222 GdkWindowImplWin32 *impl;
223 GdkWindowObject *obj;
224 GdkWin32PositionInfo new_info;
225 GdkWindowParentPos parent_pos;
228 gint d_xoffset, d_yoffset;
233 g_return_if_fail (window != NULL);
234 g_return_if_fail (GDK_IS_WINDOW (window));
236 obj = GDK_WINDOW_OBJECT (window);
237 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
242 is_move = dx != 0 || dy != 0;
243 is_resize = impl->width != width || impl->height != height;
245 if (!is_move && !is_resize)
251 impl->height = height;
253 gdk_window_compute_parent_pos (impl, &parent_pos);
254 gdk_window_compute_position (impl, &parent_pos, &new_info);
256 gdk_window_clip_changed (window, &impl->position_info.clip_rect, &new_info.clip_rect);
258 parent_pos.x += obj->x;
259 parent_pos.y += obj->y;
260 parent_pos.win32_x += new_info.x;
261 parent_pos.win32_y += new_info.y;
262 parent_pos.clip_rect = new_info.clip_rect;
264 d_xoffset = new_info.x_offset - impl->position_info.x_offset;
265 d_yoffset = new_info.y_offset - impl->position_info.y_offset;
267 if (d_xoffset != 0 || d_yoffset != 0)
269 gint new_x0, new_y0, new_x1, new_y1;
271 gdk_window_set_static_gravities (window, TRUE);
273 if (d_xoffset < 0 || d_yoffset < 0)
274 gdk_window_queue_translation (window, MIN (d_xoffset, 0), MIN (d_yoffset, 0));
278 new_x0 = impl->position_info.x + d_xoffset;
279 new_x1 = impl->position_info.x + impl->position_info.width;
283 new_x0 = impl->position_info.x;
284 new_x1 = impl->position_info.x + new_info.width + d_xoffset;
289 new_y0 = impl->position_info.y + d_yoffset;
290 new_y1 = impl->position_info.y + impl->position_info.height;
294 new_y0 = impl->position_info.y;
295 new_y1 = impl->position_info.y + new_info.height + d_yoffset;
298 if (!MoveWindow (GDK_WINDOW_HWND (window),
299 new_x0, new_y0, new_x1 - new_x0, new_y1 - new_y0,
301 WIN32_API_FAILED ("MoveWindow");
303 tmp_list = obj->children;
306 gdk_window_premove (tmp_list->data, &parent_pos);
307 tmp_list = tmp_list->next;
310 GetClientRect (GDK_WINDOW_HWND (window), &rect);
312 if (!MoveWindow (GDK_WINDOW_HWND (window),
313 new_x0 + dx, new_y0 + dy,
314 rect.right - rect.left, rect.bottom - rect.top,
316 WIN32_API_FAILED ("MoveWindow");
318 if (d_xoffset > 0 || d_yoffset > 0)
319 gdk_window_queue_translation (window, MAX (d_xoffset, 0), MAX (d_yoffset, 0));
321 if (!MoveWindow (GDK_WINDOW_HWND (window),
322 new_info.x, new_info.y, new_info.width, new_info.height,
324 WIN32_API_FAILED ("MoveWindow");
326 if (impl->position_info.no_bg)
327 gdk_window_tmp_reset_bg (window);
329 if (!impl->position_info.mapped && new_info.mapped && obj->mapped)
330 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNA);
332 impl->position_info = new_info;
334 tmp_list = obj->children;
337 gdk_window_postmove (tmp_list->data, &parent_pos);
338 tmp_list = tmp_list->next;
343 if (is_move && is_resize)
344 gdk_window_set_static_gravities (window, FALSE);
346 if (impl->position_info.mapped && !new_info.mapped)
347 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
349 tmp_list = obj->children;
352 gdk_window_premove (tmp_list->data, &parent_pos);
353 tmp_list = tmp_list->next;
358 if (!MoveWindow (GDK_WINDOW_HWND (window),
359 new_info.x, new_info.y, new_info.width, new_info.height,
361 WIN32_API_FAILED ("MoveWindow");
365 GetClientRect (GDK_WINDOW_HWND (window), &rect);
366 if (!MoveWindow (GDK_WINDOW_HWND (window),
367 new_info.x, new_info.y,
368 rect.right - rect.left, rect.bottom - rect.top,
370 WIN32_API_FAILED ("MoveWindow");
373 tmp_list = obj->children;
376 gdk_window_postmove (tmp_list->data, &parent_pos);
377 tmp_list = tmp_list->next;
380 if (impl->position_info.no_bg)
381 gdk_window_tmp_reset_bg (window);
383 if (!impl->position_info.mapped && new_info.mapped && obj->mapped)
384 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNA);
386 impl->position_info = new_info;
391 gdk_window_compute_position (GdkWindowImplWin32 *window,
392 GdkWindowParentPos *parent_pos,
393 GdkWin32PositionInfo *info)
395 GdkWindowObject *wrapper;
399 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (window));
401 wrapper = GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_WIN32 (window)->wrapper);
405 if (window->width <= 32768)
407 info->width = window->width;
408 info->x = parent_pos->x + wrapper->x - parent_pos->win32_x;
414 if (parent_pos->x + wrapper->x < -16384)
416 if (parent_pos->x + wrapper->x + window->width < 16384)
417 info->x = parent_pos->x + wrapper->x + window->width - 32768 - parent_pos->win32_x;
419 info->x = -16384 - parent_pos->win32_y;
422 info->x = parent_pos->x + wrapper->x - parent_pos->win32_x;
425 if (window->height <= 32768)
427 info->height = window->height;
428 info->y = parent_pos->y + wrapper->y - parent_pos->win32_y;
433 info->height = 32768;
434 if (parent_pos->y + wrapper->y < -16384)
436 if (parent_pos->y + wrapper->y + window->height < 16384)
437 info->y = parent_pos->y + wrapper->y + window->height - 32768 - parent_pos->win32_y;
439 info->y = -16384 - parent_pos->win32_y;
442 info->y = parent_pos->y + wrapper->y - parent_pos->win32_y;
445 parent_x_offset = parent_pos->win32_x - parent_pos->x;
446 parent_y_offset = parent_pos->win32_y - parent_pos->y;
448 info->x_offset = parent_x_offset + info->x - wrapper->x;
449 info->y_offset = parent_y_offset + info->y - wrapper->y;
451 /* We don't considering the clipping of toplevel windows and their immediate children
452 * by their parents, and simply always map those windows.
454 if (parent_pos->clip_rect.width == G_MAXINT)
456 /* Check if the window would wrap around into the visible space in either direction */
457 else if (info->x + parent_x_offset < parent_pos->clip_rect.x + parent_pos->clip_rect.width - 65536 ||
458 info->x + info->width + parent_x_offset > parent_pos->clip_rect.x + 65536 ||
459 info->y + parent_y_offset < parent_pos->clip_rect.y + parent_pos->clip_rect.height - 65536 ||
460 info->y + info->height + parent_y_offset > parent_pos->clip_rect.y + 65536)
461 info->mapped = FALSE;
467 if (GDK_WINDOW_TYPE (wrapper) == GDK_WINDOW_CHILD)
469 info->clip_rect.x = wrapper->x;
470 info->clip_rect.y = wrapper->y;
471 info->clip_rect.width = window->width;
472 info->clip_rect.height = window->height;
474 gdk_rectangle_intersect (&info->clip_rect, &parent_pos->clip_rect, &info->clip_rect);
476 info->clip_rect.x -= wrapper->x;
477 info->clip_rect.y -= wrapper->y;
481 info->clip_rect.x = 0;
482 info->clip_rect.y = 0;
483 info->clip_rect.width = G_MAXINT;
484 info->clip_rect.height = G_MAXINT;
489 gdk_window_compute_parent_pos (GdkWindowImplWin32 *window,
490 GdkWindowParentPos *parent_pos)
492 GdkWindowObject *wrapper;
493 GdkWindowObject *parent;
494 GdkRectangle tmp_clip;
496 int clip_xoffset = 0;
497 int clip_yoffset = 0;
499 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (window));
501 wrapper = GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_WIN32 (window)->wrapper);
505 parent_pos->win32_x = 0;
506 parent_pos->win32_y = 0;
508 /* We take a simple approach here and simply consider toplevel
509 * windows not to clip their children on the right/bottom, since the
510 * size of toplevel windows is not directly under our
511 * control. Clipping only really matters when scrolling and
512 * generally we aren't going to be moving the immediate child of a
513 * toplevel beyond the bounds of that toplevel.
515 * We could go ahead and recompute the clips of toplevel windows and
516 * their descendents when we receive size notification, but it would
517 * probably not be an improvement in most cases.
519 parent_pos->clip_rect.x = 0;
520 parent_pos->clip_rect.y = 0;
521 parent_pos->clip_rect.width = G_MAXINT;
522 parent_pos->clip_rect.height = G_MAXINT;
524 parent = (GdkWindowObject *)wrapper->parent;
525 while (parent && parent->window_type == GDK_WINDOW_CHILD)
527 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (parent->impl);
529 tmp_clip.x = - clip_xoffset;
530 tmp_clip.y = - clip_yoffset;
531 tmp_clip.width = impl->width;
532 tmp_clip.height = impl->height;
534 gdk_rectangle_intersect (&parent_pos->clip_rect, &tmp_clip, &parent_pos->clip_rect);
536 parent_pos->x += parent->x;
537 parent_pos->y += parent->y;
538 parent_pos->win32_x += impl->position_info.x;
539 parent_pos->win32_y += impl->position_info.y;
541 clip_xoffset += parent->x;
542 clip_yoffset += parent->y;
544 parent = (GdkWindowObject *)parent->parent;
549 gdk_window_premove (GdkWindow *window,
550 GdkWindowParentPos *parent_pos)
552 GdkWindowImplWin32 *impl;
553 GdkWindowObject *obj;
554 GdkWin32PositionInfo new_info;
556 gint d_xoffset, d_yoffset;
557 GdkWindowParentPos this_pos;
559 obj = (GdkWindowObject *) window;
560 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
562 gdk_window_compute_position (impl, parent_pos, &new_info);
564 gdk_window_clip_changed (window, &impl->position_info.clip_rect, &new_info.clip_rect);
566 this_pos.x = parent_pos->x + obj->x;
567 this_pos.y = parent_pos->y + obj->y;
568 this_pos.win32_x = parent_pos->win32_x + new_info.x;
569 this_pos.win32_y = parent_pos->win32_y + new_info.y;
570 this_pos.clip_rect = new_info.clip_rect;
572 if (impl->position_info.mapped && !new_info.mapped)
573 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
575 d_xoffset = new_info.x_offset - impl->position_info.x_offset;
576 d_yoffset = new_info.y_offset - impl->position_info.y_offset;
578 if (d_xoffset != 0 || d_yoffset != 0)
580 gint new_x0, new_y0, new_x1, new_y1;
582 if (d_xoffset < 0 || d_yoffset < 0)
583 gdk_window_queue_translation (window, MIN (d_xoffset, 0), MIN (d_yoffset, 0));
587 new_x0 = impl->position_info.x + d_xoffset;
588 new_x1 = impl->position_info.x + impl->position_info.width;
592 new_x0 = impl->position_info.x;
593 new_x1 = impl->position_info.x + new_info.width + d_xoffset;
598 new_y0 = impl->position_info.y + d_yoffset;
599 new_y1 = impl->position_info.y + impl->position_info.height;
603 new_y0 = impl->position_info.y;
604 new_y1 = impl->position_info.y + new_info.height + d_yoffset;
607 if (!MoveWindow (GDK_WINDOW_HWND (window),
608 new_x0, new_y0, new_x1 - new_x0, new_y1 - new_y0,
610 WIN32_API_FAILED ("MoveWindow");
613 tmp_list = obj->children;
616 gdk_window_premove (tmp_list->data, &this_pos);
617 tmp_list = tmp_list->next;
622 gdk_window_postmove (GdkWindow *window,
623 GdkWindowParentPos *parent_pos)
625 GdkWindowImplWin32 *impl;
626 GdkWindowObject *obj;
627 GdkWin32PositionInfo new_info;
629 gint d_xoffset, d_yoffset;
630 GdkWindowParentPos this_pos;
632 obj = (GdkWindowObject *) window;
633 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
635 gdk_window_compute_position (impl, parent_pos, &new_info);
637 this_pos.x = parent_pos->x + obj->x;
638 this_pos.y = parent_pos->y + obj->y;
639 this_pos.win32_x = parent_pos->win32_x + new_info.x;
640 this_pos.win32_y = parent_pos->win32_y + new_info.y;
641 this_pos.clip_rect = new_info.clip_rect;
643 d_xoffset = new_info.x_offset - impl->position_info.x_offset;
644 d_yoffset = new_info.y_offset - impl->position_info.y_offset;
646 if (d_xoffset != 0 || d_yoffset != 0)
648 if (d_xoffset > 0 || d_yoffset > 0)
649 gdk_window_queue_translation (window, MAX (d_xoffset, 0), MAX (d_yoffset, 0));
651 if (!MoveWindow (GDK_WINDOW_HWND (window),
652 new_info.x, new_info.y, new_info.width, new_info.height,
654 WIN32_API_FAILED ("MoveWindow");
657 if (!impl->position_info.mapped && new_info.mapped && obj->mapped)
658 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNA);
660 if (impl->position_info.no_bg)
661 gdk_window_tmp_reset_bg (window);
663 impl->position_info = new_info;
665 tmp_list = obj->children;
668 gdk_window_postmove (tmp_list->data, &this_pos);
669 tmp_list = tmp_list->next;
674 gdk_window_queue_translation (GdkWindow *window,
678 GdkWindowQueueItem *item = g_new (GdkWindowQueueItem, 1);
679 item->window = window;
680 item->serial = GetMessageTime ();
681 item->type = GDK_WINDOW_QUEUE_TRANSLATE;
682 item->u.translate.dx = dx;
683 item->u.translate.dy = dy;
685 GDK_NOTE (EVENTS, g_print ("gdk_window_queue_translation %#x %d %d,%d\n",
686 GDK_WINDOW_HWND (window),
690 gdk_drawable_ref (window);
691 translate_queue = g_slist_append (translate_queue, item);
695 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
698 GdkWindowQueueItem *item = g_new (GdkWindowQueueItem, 1);
700 item->window = window;
701 item->serial = GetMessageTime ();
702 item->type = GDK_WINDOW_QUEUE_ANTIEXPOSE;
703 item->u.antiexpose.area = area;
705 GDK_NOTE (EVENTS, g_print ("_gdk_windowing_window_queue_antiexpose %#x %d %dx%d@+%d+%d\n",
706 GDK_WINDOW_HWND (window),
708 area->extents.x2 - area->extents.x1,
709 area->extents.y2 - area->extents.y1,
710 area->extents.x1, area->extents.y1));
712 gdk_drawable_ref (window);
713 translate_queue = g_slist_append (translate_queue, item);
719 _gdk_window_process_expose (GdkWindow *window,
723 GdkWindowImplWin32 *impl;
724 GdkRegion *invalidate_region = gdk_region_rectangle (area);
725 GdkRegion *clip_region;
726 GSList *tmp_list = translate_queue;
728 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
730 GDK_NOTE (EVENTS, g_print ("_gdk_window_process_expose %#x %d %dx%d@+%d+%d\n",
731 GDK_WINDOW_HWND (window), serial,
732 area->width, area->height, area->x, area->y));
736 GdkWindowQueueItem *item = tmp_list->data;
737 tmp_list = tmp_list->next;
739 if (serial < item->serial)
741 if (item->window == window)
743 if (item->type == GDK_WINDOW_QUEUE_TRANSLATE)
744 gdk_region_offset (invalidate_region, - item->u.translate.dx, - item->u.translate.dy);
745 else /* anti-expose */
746 gdk_region_subtract (invalidate_region, item->u.antiexpose.area);
751 GSList *tmp_link = translate_queue;
753 translate_queue = g_slist_remove_link (translate_queue, translate_queue);
754 gdk_drawable_unref (item->window);
756 if (item->type == GDK_WINDOW_QUEUE_ANTIEXPOSE)
757 gdk_region_destroy (item->u.antiexpose.area);
760 g_slist_free_1 (tmp_link);
764 clip_region = gdk_region_rectangle (&impl->position_info.clip_rect);
765 gdk_region_intersect (invalidate_region, clip_region);
767 if (!gdk_region_empty (invalidate_region))
768 gdk_window_invalidate_region (window, invalidate_region, FALSE);
770 gdk_region_destroy (invalidate_region);
771 gdk_region_destroy (clip_region);
775 gdk_window_tmp_unset_bg (GdkWindow *window)
777 GdkWindowImplWin32 *impl;
778 GdkWindowObject *obj;
780 obj = (GdkWindowObject *) window;
781 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
783 impl->position_info.no_bg = TRUE;
785 if (obj->bg_pixmap != GDK_NO_BG)
790 gdk_window_tmp_reset_bg (GdkWindow *window)
792 GdkWindowImplWin32 *impl;
793 GdkWindowObject *obj;
795 obj = (GdkWindowObject *) window;
796 impl = GDK_WINDOW_IMPL_WIN32 (obj->impl);
798 impl->position_info.no_bg = FALSE;
800 if (obj->bg_pixmap == GDK_NO_BG)
816 gdk_window_clip_changed (GdkWindow *window,
817 GdkRectangle *old_clip,
818 GdkRectangle *new_clip)
820 GdkWindowImplWin32 *impl;
821 GdkWindowObject *obj;
822 GdkRegion *old_clip_region;
823 GdkRegion *new_clip_region;
825 if (((GdkWindowObject *)window)->input_only)
828 old_clip_region = gdk_region_rectangle (old_clip);
829 new_clip_region = gdk_region_rectangle (new_clip);
831 /* Trim invalid region of window to new clip rectangle
833 if (obj->update_area)
834 gdk_region_intersect (obj->update_area, new_clip_region);
836 /* Invalidate newly exposed portion of window
838 gdk_region_subtract (new_clip_region, old_clip_region);
839 if (!gdk_region_empty (new_clip_region))
841 gdk_window_tmp_unset_bg (window);
842 gdk_window_invalidate_region (window, new_clip_region, FALSE);
845 gdk_region_destroy (new_clip_region);
846 gdk_region_destroy (old_clip_region);