1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-2002 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdk.h" /* gdk_rectangle_intersect */
31 #include "gdkevents.h"
32 #include "gdkpixmap.h"
33 #include "gdkwindow.h"
34 #include "gdkdisplay.h"
35 #include "gdkprivate-win32.h"
36 #include "gdkinput-win32.h"
38 #include <gdk-pixbuf/gdk-pixbuf.h>
39 #include <stdio.h> /* sprintf */
41 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
42 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
44 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
47 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
48 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
49 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
50 static void gdk_window_impl_win32_finalize (GObject *object);
52 static gpointer parent_class = NULL;
55 _gdk_window_impl_win32_get_type (void)
57 static GType object_type = 0;
61 static const GTypeInfo object_info =
63 sizeof (GdkWindowImplWin32Class),
65 (GBaseFinalizeFunc) NULL,
66 (GClassInitFunc) gdk_window_impl_win32_class_init,
67 NULL, /* class_finalize */
68 NULL, /* class_data */
69 sizeof (GdkWindowImplWin32),
71 (GInstanceInitFunc) gdk_window_impl_win32_init,
74 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
83 _gdk_window_impl_get_type (void)
85 return _gdk_window_impl_win32_get_type ();
89 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
97 impl->extension_events_selected = FALSE;
101 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
103 GObjectClass *object_class = G_OBJECT_CLASS (klass);
104 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
106 parent_class = g_type_class_peek_parent (klass);
108 object_class->finalize = gdk_window_impl_win32_finalize;
110 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
111 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
112 drawable_class->get_size = gdk_window_impl_win32_get_size;
114 /* Visible and clip regions are the same */
115 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
116 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
120 gdk_window_impl_win32_finalize (GObject *object)
122 GdkWindowObject *wrapper;
123 GdkDrawableImplWin32 *draw_impl;
124 GdkWindowImplWin32 *window_impl;
126 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
128 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
129 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
131 wrapper = (GdkWindowObject*) draw_impl->wrapper;
133 if (!GDK_WINDOW_DESTROYED (wrapper))
135 gdk_win32_handle_table_remove (draw_impl->handle);
138 if (window_impl->hcursor != NULL)
140 if (GetCursor () == window_impl->hcursor)
142 GDI_CALL (DestroyCursor, (window_impl->hcursor));
143 window_impl->hcursor = NULL;
145 if (window_impl->hicon != NULL)
147 GDI_CALL (DestroyIcon, (window_impl->hicon));
148 window_impl->hicon = NULL;
151 G_OBJECT_CLASS (parent_class)->finalize (object);
155 _gdk_win32_adjust_client_rect (GdkWindow *window,
160 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
161 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
162 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
166 _gdk_win32_get_adjusted_client_rect (GdkWindow *window,
169 GetClientRect (GDK_WINDOW_HWND (window), rect);
170 _gdk_win32_adjust_client_rect (window, rect);
174 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
176 GdkDrawableImplWin32 *drawable_impl;
178 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
180 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
182 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
183 drawable_impl->colormap == NULL)
185 drawable_impl->colormap = gdk_colormap_get_system ();
186 g_object_ref (drawable_impl->colormap);
189 return drawable_impl->colormap;
193 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
196 GdkWindowImplWin32 *impl;
197 GdkDrawableImplWin32 *draw_impl;
199 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
201 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
202 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
205 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
210 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
215 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
219 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
222 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
224 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
228 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
230 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
231 GdkRectangle result_rect;
235 result_rect.width = impl->width;
236 result_rect.height = impl->height;
238 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
240 return gdk_region_rectangle (&result_rect);
244 _gdk_windowing_window_init (void)
246 GdkWindowObject *private;
247 GdkWindowImplWin32 *impl;
248 GdkDrawableImplWin32 *draw_impl;
252 g_assert (_gdk_parent_root == NULL);
254 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
255 private = (GdkWindowObject *)_gdk_parent_root;
256 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
257 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
259 draw_impl->handle = _gdk_root_window;
260 draw_impl->wrapper = GDK_DRAWABLE (private);
261 draw_impl->colormap = gdk_colormap_get_system ();
262 g_object_ref (draw_impl->colormap);
264 private->window_type = GDK_WINDOW_ROOT;
265 private->depth = gdk_visual_get_system ()->depth;
267 rect = _gdk_monitors[0];
268 for (i = 1; i < _gdk_num_monitors; i++)
269 gdk_rectangle_union (&rect, _gdk_monitors+i, &rect);
271 impl->width = rect.width;
272 impl->height = rect.height;
274 _gdk_window_init_position (GDK_WINDOW (private));
276 gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
278 GDK_NOTE (MISC, g_print ("_gdk_parent_root=%p\n", GDK_WINDOW_HWND (_gdk_parent_root)));
282 get_default_title (void)
285 title = g_get_application_name ();
287 title = g_get_prgname ();
293 * is a wrapper function for RegisterWindowClassEx.
294 * It creates at least one unique class for every
295 * GdkWindowType. If support for single window-specific icons
296 * is ever needed (e.g Dialog specific), every such window should
300 RegisterGdkClass (GdkWindowType wtype)
302 static ATOM klassTOPLEVEL = 0;
303 static ATOM klassDIALOG = 0;
304 static ATOM klassCHILD = 0;
305 static ATOM klassTEMP = 0;
306 static HICON hAppIcon = NULL;
307 static WNDCLASSEX wcl;
310 wcl.cbSize = sizeof (WNDCLASSEX);
311 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
312 * on WM_SIZE and WM_MOVE. Flicker, Performance!
314 wcl.lpfnWndProc = _gdk_win32_window_procedure;
317 wcl.hInstance = _gdk_app_hmodule;
319 /* initialize once! */
322 gchar sLoc [MAX_PATH+1];
324 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
326 hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
329 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
330 hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
334 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
337 wcl.lpszMenuName = NULL;
340 /* initialize once per class */
342 * HB: Setting the background brush leads to flicker, because we
343 * don't get asked how to clear the background. This is not what
344 * we want, at least not for input_only windows ...
346 #define ONCE_PER_CLASS() \
347 wcl.hIcon = CopyIcon (hAppIcon); \
348 wcl.hIconSm = CopyIcon (hAppIcon); \
349 wcl.hbrBackground = NULL; \
350 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
354 case GDK_WINDOW_TOPLEVEL:
355 if (0 == klassTOPLEVEL)
357 wcl.lpszClassName = "gdkWindowToplevel";
360 klassTOPLEVEL = RegisterClassEx (&wcl);
362 klass = klassTOPLEVEL;
365 case GDK_WINDOW_CHILD:
368 wcl.lpszClassName = "gdkWindowChild";
370 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
372 klassCHILD = RegisterClassEx (&wcl);
377 case GDK_WINDOW_DIALOG:
378 if (0 == klassDIALOG)
380 wcl.lpszClassName = "gdkWindowDialog";
381 wcl.style |= CS_SAVEBITS;
383 klassDIALOG = RegisterClassEx (&wcl);
388 case GDK_WINDOW_TEMP:
391 wcl.lpszClassName = "gdkWindowTemp";
392 wcl.style |= CS_SAVEBITS;
394 klassTEMP = RegisterClassEx (&wcl);
400 g_assert_not_reached ();
406 WIN32_API_FAILED ("RegisterClassEx");
407 g_error ("That is a fatal error");
413 gdk_window_new (GdkWindow *parent,
414 GdkWindowAttr *attributes,
415 gint attributes_mask)
419 DWORD dwStyle = 0, dwExStyle;
422 GdkWindowObject *private;
423 GdkWindowImplWin32 *impl;
424 GdkDrawableImplWin32 *draw_impl;
429 gint window_width, window_height;
430 gint offset_x = 0, offset_y = 0;
432 g_return_val_if_fail (attributes != NULL, NULL);
436 screen = gdk_screen_get_default ();
437 parent = gdk_screen_get_root_window (screen);
440 screen = gdk_drawable_get_screen (parent);
442 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
445 g_print ("gdk_window_new: %s\n",
446 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
447 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
448 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
449 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
452 if (GDK_WINDOW_DESTROYED (parent))
455 hparent = GDK_WINDOW_HWND (parent);
457 window = g_object_new (GDK_TYPE_WINDOW, NULL);
458 private = (GdkWindowObject *)window;
459 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
460 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
461 draw_impl->wrapper = GDK_DRAWABLE (window);
463 /* Windows with a foreign parent are treated as if they are children
464 * of the root window, except for actual creation.
466 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
467 parent = _gdk_parent_root;
469 private->parent = (GdkWindowObject *)parent;
471 if (attributes_mask & GDK_WA_X)
472 private->x = attributes->x;
476 if (attributes_mask & GDK_WA_Y)
477 private->y = attributes->y;
478 else if (attributes_mask & GDK_WA_X)
479 private->y = 100; /* ??? We must put it somewhere... */
483 if (attributes_mask & GDK_WA_VISUAL)
484 visual = attributes->visual;
486 visual = gdk_visual_get_system ();
488 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
489 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
490 impl->extension_events_selected = FALSE;
491 private->window_type = attributes->window_type;
493 if (attributes->wclass == GDK_INPUT_OUTPUT)
497 private->input_only = FALSE;
498 private->depth = visual->depth;
500 if (attributes_mask & GDK_WA_COLORMAP)
502 draw_impl->colormap = attributes->colormap;
503 g_object_ref (attributes->colormap);
507 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
508 g_object_ref (draw_impl->colormap);
513 dwExStyle = WS_EX_TRANSPARENT;
515 private->input_only = TRUE;
516 draw_impl->colormap = gdk_colormap_get_system ();
517 g_object_ref (draw_impl->colormap);
518 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap"));
521 switch (private->window_type)
523 case GDK_WINDOW_TOPLEVEL:
524 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
525 hparent = _gdk_root_window;
526 offset_x = _gdk_offset_x;
527 offset_y = _gdk_offset_y;
530 case GDK_WINDOW_CHILD:
531 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
534 case GDK_WINDOW_DIALOG:
535 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
537 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
539 hparent = _gdk_root_window;
540 offset_x = _gdk_offset_x;
541 offset_y = _gdk_offset_y;
544 case GDK_WINDOW_TEMP:
545 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
546 /* a temp window is not necessarily a top level window */
547 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
548 dwExStyle |= WS_EX_TOOLWINDOW;
549 offset_x = _gdk_offset_x;
550 offset_y = _gdk_offset_y;
553 case GDK_WINDOW_ROOT:
554 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
558 g_assert_not_reached ();
561 _gdk_window_init_position (GDK_WINDOW (private));
563 if (private->window_type != GDK_WINDOW_CHILD)
565 rect.left = rect.top = 0;
566 rect.right = impl->position_info.width;
567 rect.bottom = impl->position_info.height;
569 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
571 window_width = rect.right - rect.left;
572 window_height = rect.bottom - rect.top;
576 window_width = impl->position_info.width;
577 window_height = impl->position_info.height;
580 if (impl->position_info.big)
581 private->guffaw_gravity = TRUE;
583 if (attributes_mask & GDK_WA_TITLE)
584 title = attributes->title;
586 title = get_default_title ();
587 if (!title || !*title)
588 title = "GDK client window";
590 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
592 if (private->parent && private->parent->guffaw_gravity)
598 private->parent->children = g_list_prepend (private->parent->children, window);
600 klass = RegisterGdkClass (private->window_type);
602 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
604 #ifdef WITHOUT_WM_CREATE
606 CreateWindowEx (dwExStyle,
607 MAKEINTRESOURCE(klass),
610 ((attributes_mask & GDK_WA_X) ?
611 impl->position_info.x - offset_x : CW_USEDEFAULT),
612 impl->position_info.y - offset_y,
613 window_width, window_height,
621 CreateWindowEx (dwExStyle,
622 MAKEINTRESOURCE(klass),
625 ((attributes_mask & GDK_WA_X) ?
626 impl->position_info.x - offset_x: CW_USEDEFAULT),
627 impl->position_info.y - offset_y,
628 window_width, window_height,
633 if (GDK_WINDOW_HWND (window) != hwndNew)
635 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
636 GDK_WINDOW_HWND (window),
639 /* HB: IHMO due to a race condition the handle was increased by
640 * one, which causes much trouble. Because I can't find the
641 * real bug, try to workaround it ...
642 * To reproduce: compile with MSVC 5, DEBUG=1
645 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
646 GDK_WINDOW_HWND (window) = hwndNew;
647 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
649 /* the old behaviour, but with warning */
650 draw_impl->handle = hwndNew;
655 g_object_ref (window);
656 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
659 GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
661 window_width, window_height,
662 ((attributes_mask & GDK_WA_X) ?
663 impl->position_info.x - offset_x: CW_USEDEFAULT),
664 impl->position_info.y - offset_y,
666 GDK_WINDOW_HWND (window)));
670 if (draw_impl->handle == NULL)
672 WIN32_API_FAILED ("CreateWindowEx");
673 g_object_unref (window);
677 #ifdef WITHOUT_WM_CREATE
678 g_object_ref (window);
679 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
682 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
683 (attributes->cursor) :
690 gdk_window_foreign_new_for_display (GdkDisplay *display,
691 GdkNativeWindow anid)
694 GdkWindowObject *private;
695 GdkWindowImplWin32 *impl;
696 GdkDrawableImplWin32 *draw_impl;
702 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
704 window = g_object_new (GDK_TYPE_WINDOW, NULL);
705 private = (GdkWindowObject *)window;
706 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
707 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
708 draw_impl->wrapper = GDK_DRAWABLE (window);
709 parent = GetParent ((HWND)anid);
711 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
712 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
713 private->parent = (GdkWindowObject *)_gdk_parent_root;
715 private->parent->children = g_list_prepend (private->parent->children, window);
717 draw_impl->handle = (HWND) anid;
718 GetClientRect ((HWND) anid, &rect);
720 point.y = rect.right;
721 ClientToScreen ((HWND) anid, &point);
722 if (parent != _gdk_root_window)
723 ScreenToClient (parent, &point);
724 private->x = point.x;
725 private->y = point.y;
726 impl->width = rect.right - rect.left;
727 impl->height = rect.bottom - rect.top;
728 private->window_type = GDK_WINDOW_FOREIGN;
729 private->destroyed = FALSE;
730 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
731 if (IsWindowVisible ((HWND) anid))
732 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
734 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
735 private->depth = gdk_visual_get_system ()->depth;
737 _gdk_window_init_position (GDK_WINDOW (private));
739 g_object_ref (window);
740 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
746 gdk_window_lookup (GdkNativeWindow hwnd)
748 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
752 _gdk_windowing_window_destroy (GdkWindow *window,
754 gboolean foreign_destroy)
756 GdkWindowObject *private = (GdkWindowObject *)window;
758 g_return_if_fail (GDK_IS_WINDOW (window));
760 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy: %p\n",
761 GDK_WINDOW_HWND (window)));
763 if (private->extension_events != 0)
764 _gdk_input_window_destroy (window);
766 if (private->window_type == GDK_WINDOW_FOREIGN)
768 if (!foreign_destroy && (private->parent != NULL))
770 /* It's somebody else's window, but in our hierarchy,
771 * so reparent it to the root window, and then call
772 * DestroyWindow() on it.
774 gdk_window_hide (window);
775 gdk_window_reparent (window, NULL, 0, 0);
777 /* Is this too drastic? Many (most?) applications
778 * quit if any window receives WM_QUIT I think.
779 * OTOH, I don't think foreign windows are much
780 * used, so the question is maybe academic.
782 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
785 else if (!recursing && !foreign_destroy)
787 private->destroyed = TRUE;
788 DestroyWindow (GDK_WINDOW_HWND (window));
792 /* This function is called when the window really gone.
795 gdk_window_destroy_notify (GdkWindow *window)
797 g_return_if_fail (window != NULL);
798 g_return_if_fail (GDK_IS_WINDOW (window));
801 g_print ("gdk_window_destroy_notify: %p%s\n",
802 GDK_WINDOW_HWND (window),
803 (GDK_WINDOW_DESTROYED (window) ? " (destroyed)" : "")));
805 if (!GDK_WINDOW_DESTROYED (window))
807 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
808 g_warning ("window %p unexpectedly destroyed",
809 GDK_WINDOW_HWND (window));
811 _gdk_window_destroy (window, TRUE);
814 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
815 g_object_unref (window);
819 get_outer_rect (GdkWindow *window,
826 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
827 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
829 rect->left = rect->top = 0;
831 rect->bottom = height;
833 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
837 adjust_for_gravity_hints (GdkWindowImplWin32 *impl,
842 if (impl->hint_flags & GDK_HINT_WIN_GRAVITY)
844 gint orig_x = *x, orig_y = *y;
846 switch (impl->hints.win_gravity)
848 case GDK_GRAVITY_NORTH:
849 case GDK_GRAVITY_CENTER:
850 case GDK_GRAVITY_SOUTH:
851 *x -= (outer_rect->right - outer_rect->left) / 2;
852 *x += impl->width / 2;
855 case GDK_GRAVITY_SOUTH_EAST:
856 case GDK_GRAVITY_EAST:
857 case GDK_GRAVITY_NORTH_EAST:
858 *x -= outer_rect->right - outer_rect->left;
862 case GDK_GRAVITY_STATIC:
863 *x += outer_rect->left;
870 switch (impl->hints.win_gravity)
872 case GDK_GRAVITY_WEST:
873 case GDK_GRAVITY_CENTER:
874 case GDK_GRAVITY_EAST:
875 *y -= (outer_rect->bottom - outer_rect->top) / 2;
876 *y += impl->height / 2;
879 case GDK_GRAVITY_SOUTH_WEST:
880 case GDK_GRAVITY_SOUTH:
881 case GDK_GRAVITY_SOUTH_EAST:
882 *y -= outer_rect->bottom - outer_rect->top;
886 case GDK_GRAVITY_STATIC:
887 *y += outer_rect->top;
894 (orig_x != *x || orig_y != *y) ?
895 g_print ("adjust_for_gravity_hints: x: %d->%d, y: %d->%d\n",
896 orig_x, *x, orig_y, *y)
902 show_window_internal (GdkWindow *window,
906 GdkWindowObject *private;
907 HWND old_active_window;
909 private = (GdkWindowObject *) window;
911 if (private->destroyed)
914 GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
915 GDK_WINDOW_HWND (window),
916 _gdk_win32_window_state_to_string (private->state),
917 (raise ? " raise" : ""),
918 (deiconify ? " deiconify" : "")));
920 /* If asked to show (not deiconify) an withdrawn and iconified
924 !GDK_WINDOW_IS_MAPPED (window) &&
925 (private->state & GDK_WINDOW_STATE_ICONIFIED))
927 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
931 /* If asked to just show an iconified window, do nothing. */
932 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
935 /* If asked to deiconify an already noniconified window, do
936 * nothing. (Especially, don't cause the window to rise and
937 * activate. There are different calls for that.)
939 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
942 /* If asked to show (but not raise) a window that is already
943 * visible, do nothing.
945 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
950 if (!GDK_WINDOW_IS_MAPPED (window))
951 gdk_synthesize_window_state (window,
952 GDK_WINDOW_STATE_WITHDRAWN,
954 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
956 /* Don't really know if this makes sense, can't remember whether
957 * this case is handled like this because it is necessary, or
958 * if this is just old crap.
960 SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
961 SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
965 old_active_window = GetActiveWindow ();
967 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
968 gdk_window_fullscreen (window);
969 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
970 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
971 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
972 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
973 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
974 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
976 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
979 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
980 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
981 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
983 BringWindowToTop (GDK_WINDOW_HWND (window));
984 else if (old_active_window != GDK_WINDOW_HWND (window))
985 SetActiveWindow (old_active_window);
989 gdk_window_show_unraised (GdkWindow *window)
991 g_return_if_fail (GDK_IS_WINDOW (window));
993 show_window_internal (window, FALSE, FALSE);
997 gdk_window_show (GdkWindow *window)
999 g_return_if_fail (GDK_IS_WINDOW (window));
1001 show_window_internal (window, TRUE, FALSE);
1005 gdk_window_hide (GdkWindow *window)
1007 GdkWindowObject *private;
1009 g_return_if_fail (window != NULL);
1011 private = (GdkWindowObject*) window;
1012 if (private->destroyed)
1015 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n",
1016 GDK_WINDOW_HWND (window),
1017 _gdk_win32_window_state_to_string (private->state)));
1019 if (GDK_WINDOW_IS_MAPPED (window))
1020 gdk_synthesize_window_state (window,
1022 GDK_WINDOW_STATE_WITHDRAWN);
1024 _gdk_window_clear_update_area (window);
1026 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1027 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
1029 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1031 SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1032 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
1036 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
1041 gdk_window_withdraw (GdkWindow *window)
1043 GdkWindowObject *private;
1045 g_return_if_fail (window != NULL);
1047 private = (GdkWindowObject*) window;
1048 if (private->destroyed)
1051 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n",
1052 GDK_WINDOW_HWND (window),
1053 _gdk_win32_window_state_to_string (private->state)));
1055 gdk_window_hide (window); /* ??? */
1059 gdk_window_move (GdkWindow *window,
1063 GdkWindowObject *private = (GdkWindowObject *)window;
1064 GdkWindowImplWin32 *impl;
1066 g_return_if_fail (window != NULL);
1067 g_return_if_fail (GDK_IS_WINDOW (window));
1069 if (GDK_WINDOW_DESTROYED (window))
1072 GDK_NOTE (MISC, g_print ("gdk_window_move: %p: +%d+%d\n",
1073 GDK_WINDOW_HWND (window), x, y));
1075 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1077 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1080 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1081 _gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
1086 get_outer_rect (window, impl->width, impl->height, &outer_rect);
1088 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1090 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1091 x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
1092 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
1097 gdk_window_resize (GdkWindow *window,
1101 GdkWindowObject *private = (GdkWindowObject*) window;
1102 GdkWindowImplWin32 *impl;
1104 g_return_if_fail (window != NULL);
1105 g_return_if_fail (GDK_IS_WINDOW (window));
1107 if (GDK_WINDOW_DESTROYED (window))
1115 GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
1116 GDK_WINDOW_HWND (window), width, height));
1118 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1120 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1123 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1124 _gdk_window_move_resize_child (window, private->x, private->y, width, height);
1128 get_outer_rect (window, width, height, &outer_rect);
1130 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1132 outer_rect.right - outer_rect.left,
1133 outer_rect.bottom - outer_rect.top,
1134 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
1135 private->resize_count += 1;
1140 gdk_window_move_resize (GdkWindow *window,
1146 GdkWindowObject *private = (GdkWindowObject*) window;
1147 GdkWindowImplWin32 *impl;
1149 g_return_if_fail (window != NULL);
1150 g_return_if_fail (GDK_IS_WINDOW (window));
1152 if (GDK_WINDOW_DESTROYED (window))
1160 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1162 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1165 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@+%d+%d\n",
1166 GDK_WINDOW_HWND (window),
1167 width, height, x, y));
1169 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1170 _gdk_window_move_resize_child (window, x, y, width, height);
1175 get_outer_rect (window, width, height, &outer_rect);
1177 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1179 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1180 x - _gdk_offset_x, y - _gdk_offset_y,
1181 outer_rect.right - outer_rect.left,
1182 outer_rect.bottom - outer_rect.top,
1183 SWP_NOACTIVATE | SWP_NOZORDER));
1188 gdk_window_reparent (GdkWindow *window,
1189 GdkWindow *new_parent,
1193 GdkWindowObject *window_private;
1194 GdkWindowObject *parent_private;
1195 GdkWindowObject *old_parent_private;
1196 GdkWindowImplWin32 *impl;
1198 g_return_if_fail (window != NULL);
1199 g_return_if_fail (GDK_IS_WINDOW (window));
1200 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1201 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1204 new_parent = _gdk_parent_root;
1206 window_private = (GdkWindowObject*) window;
1207 old_parent_private = (GdkWindowObject *) window_private->parent;
1208 parent_private = (GdkWindowObject*) new_parent;
1209 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1211 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1213 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n",
1214 GDK_WINDOW_HWND (window),
1215 GDK_WINDOW_HWND (new_parent)));
1217 API_CALL (SetParent, (GDK_WINDOW_HWND (window),
1218 GDK_WINDOW_HWND (new_parent)));
1220 API_CALL (MoveWindow, (GDK_WINDOW_HWND (window),
1221 x, y, impl->width, impl->height, TRUE));
1224 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1227 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1228 new_parent = _gdk_parent_root;
1230 window_private->parent = (GdkWindowObject *)new_parent;
1232 if (old_parent_private)
1233 old_parent_private->children =
1234 g_list_remove (old_parent_private->children, window);
1237 if ((old_parent_private &&
1238 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1239 (!old_parent_private && parent_private->guffaw_gravity))
1240 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1243 parent_private->children = g_list_prepend (parent_private->children, window);
1244 _gdk_window_init_position (GDK_WINDOW (window_private));
1248 _gdk_windowing_window_clear_area (GdkWindow *window,
1254 GdkWindowImplWin32 *impl;
1256 g_return_if_fail (window != NULL);
1257 g_return_if_fail (GDK_IS_WINDOW (window));
1259 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1261 if (!GDK_WINDOW_DESTROYED (window))
1266 width = impl->width - x;
1268 height = impl->height - y;
1269 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
1271 GDK_WINDOW_HWND (window),
1272 width, height, x, y));
1273 hdc = GetDC (GDK_WINDOW_HWND (window));
1274 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1275 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1276 GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
1281 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1287 g_return_if_fail (window != NULL);
1288 g_return_if_fail (GDK_IS_WINDOW (window));
1290 if (!GDK_WINDOW_DESTROYED (window))
1294 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
1296 GDK_WINDOW_HWND (window),
1297 width, height, x, y));
1300 rect.right = x + width + 1;
1302 rect.bottom = y + height + 1;
1303 GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
1304 UpdateWindow (GDK_WINDOW_HWND (window));
1309 gdk_window_raise (GdkWindow *window)
1311 g_return_if_fail (window != NULL);
1312 g_return_if_fail (GDK_IS_WINDOW (window));
1314 if (!GDK_WINDOW_DESTROYED (window))
1316 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1317 GDK_WINDOW_HWND (window)));
1319 API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window)));
1324 gdk_window_lower (GdkWindow *window)
1326 g_return_if_fail (window != NULL);
1327 g_return_if_fail (GDK_IS_WINDOW (window));
1329 if (!GDK_WINDOW_DESTROYED (window))
1331 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1332 GDK_WINDOW_HWND (window)));
1334 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1335 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1340 gdk_window_set_hints (GdkWindow *window,
1349 /* Note that this function is obsolete */
1351 GdkWindowImplWin32 *impl;
1353 g_return_if_fail (window != NULL);
1354 g_return_if_fail (GDK_IS_WINDOW (window));
1356 if (GDK_WINDOW_DESTROYED (window))
1359 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1361 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @+%d+%d\n",
1362 GDK_WINDOW_HWND (window),
1363 min_width, min_height, max_width, max_height,
1371 geom.min_width = min_width;
1372 geom.min_height = min_height;
1373 geom.max_width = max_width;
1374 geom.max_height = max_height;
1376 if (flags & GDK_HINT_MIN_SIZE)
1377 geom_mask |= GDK_HINT_MIN_SIZE;
1379 if (flags & GDK_HINT_MAX_SIZE)
1380 geom_mask |= GDK_HINT_MAX_SIZE;
1382 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1387 gdk_window_set_geometry_hints (GdkWindow *window,
1388 GdkGeometry *geometry,
1389 GdkWindowHints geom_mask)
1391 GdkWindowImplWin32 *impl;
1393 WINDOWPLACEMENT size_hints;
1395 gint new_width = 0, new_height = 0;
1398 g_return_if_fail (window != NULL);
1399 g_return_if_fail (GDK_IS_WINDOW (window));
1401 if (GDK_WINDOW_DESTROYED (window))
1404 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n",
1405 GDK_WINDOW_HWND (window)));
1407 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1409 impl->hint_flags = geom_mask;
1410 impl->hints = *geometry;
1412 if (geom_mask & GDK_HINT_POS)
1413 ; /* even the X11 mplementation doesn't care */
1415 if (geom_mask & GDK_HINT_MIN_SIZE)
1417 GDK_NOTE (MISC, g_print ("... MIN_SIZE: %dx%d\n",
1418 geometry->min_width, geometry->min_height));
1421 /* Check if the current size of the window is in bounds */
1422 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1424 if (rect.right < geometry->min_width &&
1425 rect.bottom < geometry->min_height)
1427 new_width = geometry->min_width;
1428 new_height = geometry->min_height;
1430 else if (rect.right < geometry->min_width)
1432 new_width = geometry->min_width;
1433 new_height = rect.bottom;
1435 else if (rect.bottom < geometry->min_height)
1437 new_width = rect.right;
1438 new_height = geometry->min_height;
1443 if (geom_mask & GDK_HINT_MAX_SIZE)
1445 GDK_NOTE (MISC, g_print ("... MAX_SIZE: %dx%d\n",
1446 geometry->max_width, geometry->max_height));
1449 /* Check if the current size of the window is in bounds */
1450 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1452 if (rect.right > geometry->max_width &&
1453 rect.bottom > geometry->max_height)
1455 new_width = geometry->max_width;
1456 new_height = geometry->max_height;
1458 else if (rect.right > geometry->max_width)
1460 new_width = geometry->max_width;
1461 new_height = rect.bottom;
1463 else if (rect.bottom > geometry->max_height)
1465 new_width = rect.right;
1466 new_height = geometry->max_height;
1472 /* Apply new size constraints */
1473 if (new_width != 0 && new_height != 0)
1474 gdk_window_resize (window, new_width, new_height);
1477 if (geom_mask & GDK_HINT_BASE_SIZE)
1479 GDK_NOTE (MISC, g_print ("... BASE_SIZE: %dx%d\n",
1480 geometry->base_width, geometry->base_height));
1483 size_hints.length = sizeof (size_hints);
1485 if (API_CALL (GetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints)))
1488 g_print ("... rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1489 size_hints.rcNormalPosition.left,
1490 size_hints.rcNormalPosition.top,
1491 size_hints.rcNormalPosition.right,
1492 size_hints.rcNormalPosition.bottom));
1493 size_hints.rcNormalPosition.right =
1494 size_hints.rcNormalPosition.left + geometry->base_width;
1495 size_hints.rcNormalPosition.bottom =
1496 size_hints.rcNormalPosition.top + geometry->base_height;
1497 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1498 size_hints.rcNormalPosition.left,
1499 size_hints.rcNormalPosition.top,
1500 size_hints.rcNormalPosition.right,
1501 size_hints.rcNormalPosition.bottom));
1502 API_CALL (SetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints));
1507 if (geom_mask & GDK_HINT_RESIZE_INC)
1509 GDK_NOTE (MISC, g_print ("... RESIZE_INC: (%d,%d)\n",
1510 geometry->width_inc, geometry->height_inc));
1513 if (geom_mask & GDK_HINT_ASPECT)
1515 GDK_NOTE (MISC, g_print ("... ASPECT: %g--%g\n",
1516 geometry->min_aspect, geometry->max_aspect));
1519 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1521 GDK_NOTE (MISC, g_print ("... GRAVITY: %d\n", geometry->win_gravity));
1526 gdk_window_set_title (GdkWindow *window,
1531 g_return_if_fail (window != NULL);
1532 g_return_if_fail (GDK_IS_WINDOW (window));
1533 g_return_if_fail (title != NULL);
1535 /* Empty window titles not allowed, so set it to just a period. */
1539 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p: %s\n",
1540 GDK_WINDOW_HWND (window), title));
1542 if (!GDK_WINDOW_DESTROYED (window))
1544 /* As the title is in UTF-8 we must translate it
1545 * to the system codepage.
1547 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1548 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), mbtitle));
1554 gdk_window_set_role (GdkWindow *window,
1557 g_return_if_fail (window != NULL);
1558 g_return_if_fail (GDK_IS_WINDOW (window));
1560 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p: %s\n",
1561 GDK_WINDOW_HWND (window),
1562 (role ? role : "NULL")));
1567 gdk_window_set_transient_for (GdkWindow *window,
1570 HWND window_id, parent_id;
1572 g_return_if_fail (window != NULL);
1573 g_return_if_fail (GDK_IS_WINDOW (window));
1575 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p: %p\n",
1576 GDK_WINDOW_HWND (window),
1577 GDK_WINDOW_HWND (parent)));
1579 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1582 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1584 GDK_NOTE (MISC, g_print ("...a child window!\n"));
1588 window_id = GDK_WINDOW_HWND (window);
1589 parent_id = GDK_WINDOW_HWND (parent);
1591 /* This changes the *owner* of the window, despite the misleading
1592 * name. (Owner and parent are unrelated concepts.) At least that's
1593 * what people who seem to know what they talk about say on
1594 * USENET. Search on Google.
1597 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1598 GetLastError () != 0)
1599 WIN32_API_FAILED ("SetWindowLong");
1603 gdk_window_set_background (GdkWindow *window,
1606 GdkWindowObject *private = (GdkWindowObject *)window;
1608 g_return_if_fail (window != NULL);
1609 g_return_if_fail (GDK_IS_WINDOW (window));
1611 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
1612 GDK_WINDOW_HWND (window),
1613 _gdk_win32_color_to_string (color)));
1615 private->bg_color = *color;
1617 if (private->bg_pixmap &&
1618 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1619 private->bg_pixmap != GDK_NO_BG)
1621 g_object_unref (private->bg_pixmap);
1622 private->bg_pixmap = NULL;
1627 gdk_window_set_back_pixmap (GdkWindow *window,
1629 gint parent_relative)
1631 GdkWindowObject *private = (GdkWindowObject *)window;
1633 g_return_if_fail (window != NULL);
1634 g_return_if_fail (GDK_IS_WINDOW (window));
1635 g_return_if_fail (pixmap == NULL || !parent_relative);
1636 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1638 if (private->bg_pixmap &&
1639 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1640 private->bg_pixmap != GDK_NO_BG)
1641 g_object_unref (private->bg_pixmap);
1643 if (parent_relative)
1645 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1646 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1652 g_object_ref (pixmap);
1653 private->bg_pixmap = pixmap;
1657 private->bg_pixmap = GDK_NO_BG;
1663 gdk_window_set_cursor (GdkWindow *window,
1666 GdkWindowImplWin32 *impl;
1667 GdkCursorPrivate *cursor_private;
1668 GdkWindowObject *parent_window;
1670 HCURSOR hprevcursor;
1672 g_return_if_fail (window != NULL);
1673 g_return_if_fail (GDK_IS_WINDOW (window));
1675 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1676 cursor_private = (GdkCursorPrivate*) cursor;
1678 if (GDK_WINDOW_DESTROYED (window))
1684 hcursor = cursor_private->hcursor;
1686 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p: %p\n",
1687 GDK_WINDOW_HWND (window),
1690 /* First get the old cursor, if any (we wait to free the old one
1691 * since it may be the current cursor set in the Win32 API right
1694 hprevcursor = impl->hcursor;
1696 if (hcursor == NULL)
1697 impl->hcursor = NULL;
1700 /* We must copy the cursor as it is OK to destroy the GdkCursor
1701 * while still in use for some window. See for instance
1702 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1703 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1706 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1707 WIN32_API_FAILED ("CopyCursor");
1708 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1709 hcursor, impl->hcursor));
1712 /* If the pointer is over our window, set new cursor if given */
1713 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1714 if (impl->hcursor != NULL)
1715 SetCursor (impl->hcursor);
1717 /* Destroy the previous cursor: Need to make sure it's no longer in
1718 * use before we destroy it, in case we're not over our window but
1719 * the cursor is still set to our old one.
1721 if (hprevcursor != NULL)
1723 if (GetCursor() == hprevcursor)
1725 /* Look for a suitable cursor to use instead */
1727 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1728 while (hcursor == NULL)
1732 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1733 hcursor = impl->hcursor;
1734 parent_window = parent_window->parent;
1738 hcursor = LoadCursor (NULL, IDC_ARROW);
1741 SetCursor (hcursor);
1744 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1747 API_CALL (DestroyCursor, (hprevcursor));
1752 gdk_window_get_geometry (GdkWindow *window,
1759 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1762 window = _gdk_parent_root;
1764 if (!GDK_WINDOW_DESTROYED (window))
1768 API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
1770 if (window != _gdk_parent_root)
1773 GdkWindow *parent = gdk_window_get_parent (window);
1777 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1778 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1784 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1785 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1789 if (parent == _gdk_parent_root)
1791 rect.left += _gdk_offset_x;
1792 rect.top += _gdk_offset_y;
1793 rect.right += _gdk_offset_x;
1794 rect.bottom += _gdk_offset_y;
1803 *width = rect.right - rect.left;
1805 *height = rect.bottom - rect.top;
1807 *depth = gdk_drawable_get_visual (window)->depth;
1809 GDK_NOTE (MISC, g_print ("gdk_window_get_geometry: %p: %ldx%ldx%d@+%ld+%ld\n",
1810 GDK_WINDOW_HWND (window),
1811 rect.right - rect.left, rect.bottom - rect.top,
1812 gdk_drawable_get_visual (window)->depth,
1813 rect.left, rect.top));
1818 gdk_window_get_origin (GdkWindow *window,
1826 g_return_val_if_fail (window != NULL, 0);
1828 if (!GDK_WINDOW_DESTROYED (window))
1834 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1843 *x = tx + _gdk_offset_x;
1845 *y = ty + _gdk_offset_y;
1847 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1848 GDK_WINDOW_HWND (window),
1854 gdk_window_get_deskrelative_origin (GdkWindow *window,
1858 return gdk_window_get_origin (window, x, y);
1862 gdk_window_get_root_origin (GdkWindow *window,
1868 g_return_if_fail (GDK_IS_WINDOW (window));
1870 gdk_window_get_frame_extents (window, &rect);
1878 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: +%d+%d\n",
1879 GDK_WINDOW_HWND (window), rect.x, rect.y));
1883 gdk_window_get_frame_extents (GdkWindow *window,
1886 GdkWindowObject *private;
1890 g_return_if_fail (GDK_IS_WINDOW (window));
1891 g_return_if_fail (rect != NULL);
1893 private = GDK_WINDOW_OBJECT (window);
1900 if (GDK_WINDOW_DESTROYED (window))
1903 /* FIXME: window is documented to be a toplevel GdkWindow, so is it really
1904 * necessary to walk its parent chain?
1906 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
1907 private = (GdkWindowObject*) private->parent;
1909 hwnd = GDK_WINDOW_HWND (window);
1911 /* find the frame window */
1912 while (HWND_DESKTOP != GetParent (hwnd))
1914 hwnd = GetParent (hwnd);
1915 g_return_if_fail (NULL != hwnd);
1918 API_CALL (GetWindowRect, (hwnd, &r));
1920 rect->x = r.left + _gdk_offset_x;
1921 rect->y = r.top + _gdk_offset_y;
1922 rect->width = r.right - r.left;
1923 rect->height = r.bottom - r.top;
1925 GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@+%ld+%ld\n",
1926 GDK_WINDOW_HWND (window),
1927 r.right - r.left, r.bottom - r.top,
1932 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1936 GdkModifierType *mask)
1938 GdkWindow *return_val;
1939 POINT screen_point, point;
1943 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1946 GetCursorPos (&screen_point);
1947 point = screen_point;
1948 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1953 if (window == _gdk_parent_root)
1955 *x += _gdk_offset_x;
1956 *y += _gdk_offset_y;
1959 hwnd = WindowFromPoint (screen_point);
1962 gboolean done = FALSE;
1966 point = screen_point;
1967 ScreenToClient (hwnd, &point);
1968 hwndc = ChildWindowFromPoint (hwnd, point);
1971 else if (hwndc == hwnd)
1977 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
1982 GetKeyboardState (kbd);
1984 if (kbd[VK_SHIFT] & 0x80)
1985 *mask |= GDK_SHIFT_MASK;
1986 if (kbd[VK_CAPITAL] & 0x80)
1987 *mask |= GDK_LOCK_MASK;
1988 if (kbd[VK_CONTROL] & 0x80)
1989 *mask |= GDK_CONTROL_MASK;
1990 if (kbd[VK_MENU] & 0x80)
1991 *mask |= GDK_MOD1_MASK;
1992 if (kbd[VK_LBUTTON] & 0x80)
1993 *mask |= GDK_BUTTON1_MASK;
1994 if (kbd[VK_MBUTTON] & 0x80)
1995 *mask |= GDK_BUTTON2_MASK;
1996 if (kbd[VK_RBUTTON] & 0x80)
1997 *mask |= GDK_BUTTON3_MASK;
2003 _gdk_windowing_get_pointer (GdkDisplay *display,
2007 GdkModifierType *mask)
2009 GdkScreen *default_screen = gdk_display_get_default_screen (display);
2010 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
2012 *screen = default_screen;
2013 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
2017 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2022 POINT point, pointc;
2026 GetCursorPos (&pointc);
2028 hwnd = WindowFromPoint (point);
2032 window = _gdk_parent_root;
2033 *win_x = pointc.x + _gdk_offset_x;
2034 *win_y = pointc.y + _gdk_offset_y;
2038 ScreenToClient (hwnd, &point);
2041 hwndc = ChildWindowFromPoint (hwnd, point);
2042 ClientToScreen (hwnd, &point);
2043 ScreenToClient (hwndc, &point);
2044 } while (hwndc != hwnd && (hwnd = hwndc, 1));
2046 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
2048 if (window && (win_x || win_y))
2050 GetClientRect (hwnd, &rect);
2051 *win_x = point.x - rect.left;
2052 *win_y = point.y - rect.top;
2055 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: +%d+%d %p%s\n",
2058 (window == NULL ? " NULL" : "")));
2064 gdk_window_get_events (GdkWindow *window)
2066 g_return_val_if_fail (window != NULL, 0);
2067 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2069 if (GDK_WINDOW_DESTROYED (window))
2072 return GDK_WINDOW_OBJECT (window)->event_mask;
2076 gdk_window_set_events (GdkWindow *window,
2077 GdkEventMask event_mask)
2079 g_return_if_fail (window != NULL);
2080 g_return_if_fail (GDK_IS_WINDOW (window));
2082 if (GDK_WINDOW_DESTROYED (window))
2085 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2086 * set it here, too. Not that I know or remember why it is
2087 * necessary, will have to test some day.
2089 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2093 gdk_window_shape_combine_mask (GdkWindow *window,
2097 g_return_if_fail (window != NULL);
2098 g_return_if_fail (GDK_IS_WINDOW (window));
2102 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
2103 GDK_WINDOW_HWND (window)));
2104 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2111 /* Convert mask bitmap to region */
2112 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2114 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n",
2115 GDK_WINDOW_HWND (window),
2116 GDK_WINDOW_HWND (mask)));
2118 _gdk_win32_get_adjusted_client_rect (window, &rect);
2120 OffsetRgn (hrgn, -rect.left, -rect.top);
2121 OffsetRgn (hrgn, x, y);
2123 /* If this is a top-level window, add the title bar to the region */
2124 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2126 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2127 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2131 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2136 gdk_window_set_override_redirect (GdkWindow *window,
2137 gboolean override_redirect)
2139 g_return_if_fail (window != NULL);
2140 g_return_if_fail (GDK_IS_WINDOW (window));
2142 g_warning ("gdk_window_set_override_redirect not implemented");
2146 gdk_window_set_icon_list (GdkWindow *window,
2149 g_return_if_fail (GDK_IS_WINDOW (window));
2151 if (GDK_WINDOW_DESTROYED (window))
2154 /* We could convert it to a hIcon and DrawIcon () it when getting
2155 * a WM_PAINT with IsIconic, but is it worth it ? Same probably
2156 * goes for gdk_window_set_icon (). Patches accepted :-) --hb
2157 * Or do we only need to deliver the Icon on WM_GETICON ?
2162 gdk_window_set_icon (GdkWindow *window,
2163 GdkWindow *icon_window,
2170 GdkWindowImplWin32 *impl;
2172 g_return_if_fail (window != NULL);
2173 g_return_if_fail (GDK_IS_WINDOW (window));
2175 if (GDK_WINDOW_DESTROYED (window))
2178 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
2183 HBITMAP hbmmask = NULL;
2185 gdk_drawable_get_size (GDK_DRAWABLE(pixmap), &w, &h);
2187 /* we need the inverted mask for the XOR op */
2189 HDC hdc1 = CreateCompatibleDC (NULL);
2192 hbmmask = CreateCompatibleBitmap (hdc1, w, h);
2193 hbmold1 = SelectObject (hdc1, hbmmask);
2196 HDC hdc2 = CreateCompatibleDC (NULL);
2197 HBITMAP hbmold2 = SelectObject (hdc2, GDK_PIXMAP_HBITMAP (mask));
2198 GDI_CALL (BitBlt, (hdc1, 0,0,w,h, hdc2, 0,0, NOTSRCCOPY));
2199 GDI_CALL (SelectObject, (hdc2, hbmold2));
2200 GDI_CALL (DeleteDC, (hdc2));
2205 GetClipBox (hdc1, &rect);
2206 GDI_CALL (FillRect, (hdc1, &rect, GetStockObject (WHITE_BRUSH)));
2208 GDI_CALL (SelectObject, (hdc1, hbmold1));
2209 GDI_CALL (DeleteDC, (hdc1));
2213 ii.xHotspot = ii.yHotspot = 0; /* ignored for icons */
2214 ii.hbmMask = hbmmask;
2215 ii.hbmColor = GDK_PIXMAP_HBITMAP (pixmap);
2216 hIcon = CreateIconIndirect (&ii);
2218 WIN32_API_FAILED ("CreateIconIndirect");
2219 GDI_CALL (DeleteObject, (hbmmask));
2220 #if 0 /* to debug pixmap and mask setting */
2222 GdkPixbuf* pixbuf = NULL;
2225 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, w, h);
2228 num = (num + 1) % 999; /* restrict maximim number */
2229 sprintf (name, "c:\\temp\\ico%03dpixm.png", num);
2230 gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL);
2231 gdk_pixbuf_unref (pixbuf);
2233 pixbuf = !mask ? NULL : gdk_pixbuf_get_from_drawable (NULL, mask, NULL, 0, 0, 0, 0, w, h);
2236 sprintf (name, "c:\\temp\\ico%03dmask.png", num);
2237 gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL);
2238 gdk_pixbuf_unref (pixbuf);
2243 hIcon = (HICON)SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG, (LPARAM)hIcon);
2245 GDI_CALL (DestroyIcon, (impl->hicon));
2246 impl->hicon = hIcon;
2250 /* reseting to default icon */
2253 hIcon = (HICON)SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG, 0);
2254 GDI_CALL (DestroyIcon, (impl->hicon));
2259 GDK_NOTE (MISC, g_print ("gdk_window_set_icon: %p: %p %dx%d\n", GDK_WINDOW_HWND (window), impl->hicon, w, h));
2263 gdk_window_set_icon_name (GdkWindow *window,
2266 g_return_if_fail (window != NULL);
2267 g_return_if_fail (GDK_IS_WINDOW (window));
2269 if (GDK_WINDOW_DESTROYED (window))
2272 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));
2276 gdk_window_set_group (GdkWindow *window,
2279 g_return_if_fail (window != NULL);
2280 g_return_if_fail (GDK_IS_WINDOW (window));
2281 g_return_if_fail (leader != NULL);
2282 g_return_if_fail (GDK_IS_WINDOW (leader));
2284 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2287 g_warning ("gdk_window_set_group not implemented");
2291 gdk_window_set_decorations (GdkWindow *window,
2292 GdkWMDecoration decorations)
2295 const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
2297 g_return_if_fail (window != NULL);
2298 g_return_if_fail (GDK_IS_WINDOW (window));
2300 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s%s%s%s%s%s%s\n",
2301 GDK_WINDOW_HWND (window),
2302 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2303 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2304 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2305 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2306 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2307 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2308 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2310 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2314 if (decorations & GDK_DECOR_BORDER)
2316 if (decorations & GDK_DECOR_RESIZEH)
2317 bits |= WS_THICKFRAME;
2318 if (decorations & GDK_DECOR_TITLE)
2320 if (decorations & GDK_DECOR_MENU)
2322 if (decorations & GDK_DECOR_MINIMIZE)
2323 bits |= WS_MINIMIZEBOX;
2324 if (decorations & GDK_DECOR_MAXIMIZE)
2325 bits |= WS_MAXIMIZEBOX;
2327 if (decorations & GDK_DECOR_ALL)
2328 style |= settable_bits, style &= ~bits;
2330 style &= ~settable_bits, style |= bits;
2332 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2333 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2334 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2335 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2339 gdk_window_get_decorations(GdkWindow *window,
2340 GdkWMDecoration *decorations)
2342 LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2346 if (style & WS_BORDER)
2347 *decorations |= GDK_DECOR_BORDER;
2348 if (style & WS_THICKFRAME)
2349 *decorations |= GDK_DECOR_RESIZEH;
2350 if (style & WS_CAPTION)
2351 *decorations |= GDK_DECOR_TITLE;
2352 if (style & WS_SYSMENU)
2353 *decorations |= GDK_DECOR_MENU;
2354 if (style & WS_MINIMIZEBOX)
2355 *decorations |= GDK_DECOR_MINIMIZE;
2356 if (style & WS_MAXIMIZEBOX)
2357 *decorations |= GDK_DECOR_MAXIMIZE;
2359 return *decorations != 0;
2363 gdk_window_set_functions (GdkWindow *window,
2364 GdkWMFunction functions)
2367 const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU);
2369 g_return_if_fail (window != NULL);
2370 g_return_if_fail (GDK_IS_WINDOW (window));
2372 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p: %s%s%s%s%s%s\n",
2373 GDK_WINDOW_HWND (window),
2374 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2375 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2376 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2377 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2378 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2379 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2381 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2385 if (functions & GDK_FUNC_RESIZE)
2386 bits |= WS_THICKFRAME;
2387 if (functions & GDK_FUNC_MOVE)
2388 bits |= (WS_THICKFRAME|WS_SYSMENU);
2389 if (functions & GDK_FUNC_MINIMIZE)
2390 bits |= WS_MINIMIZEBOX;
2391 if (functions & GDK_FUNC_MAXIMIZE)
2392 bits |= WS_MAXIMIZEBOX;
2393 if (functions & GDK_FUNC_CLOSE)
2396 if (functions & GDK_FUNC_ALL)
2397 style |= settable_bits, style &= ~bits;
2399 style &= ~settable_bits, style |= bits;
2401 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2402 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2403 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2404 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2408 QueryTree (HWND hwnd,
2418 child = GetWindow (hwnd, GW_CHILD);
2420 child = GetWindow (child, GW_HWNDNEXT);
2423 } while (child != NULL);
2427 *children = g_new (HWND, n);
2428 for (i = 0; i < n; i++)
2431 child = GetWindow (hwnd, GW_CHILD);
2433 child = GetWindow (child, GW_HWNDNEXT);
2434 *children[i] = child;
2440 gdk_propagate_shapes (HANDLE win,
2444 HRGN region, childRegion;
2448 SetRectEmpty (&emptyRect);
2449 region = CreateRectRgnIndirect (&emptyRect);
2451 GetWindowRgn (win, region);
2453 QueryTree (win, &list, &num);
2456 WINDOWPLACEMENT placement;
2458 placement.length = sizeof (WINDOWPLACEMENT);
2459 /* go through all child windows and combine regions */
2460 for (i = 0; i < num; i++)
2462 GetWindowPlacement (list[i], &placement);
2463 if (placement.showCmd == SW_SHOWNORMAL)
2465 childRegion = CreateRectRgnIndirect (&emptyRect);
2466 GetWindowRgn (list[i], childRegion);
2467 CombineRgn (region, region, childRegion, RGN_OR);
2468 DeleteObject (childRegion);
2471 SetWindowRgn (win, region, TRUE);
2475 DeleteObject (region);
2479 gdk_window_set_child_shapes (GdkWindow *window)
2481 g_return_if_fail (window != NULL);
2482 g_return_if_fail (GDK_IS_WINDOW (window));
2484 if (GDK_WINDOW_DESTROYED (window))
2487 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2491 gdk_window_merge_child_shapes (GdkWindow *window)
2493 g_return_if_fail (window != NULL);
2494 g_return_if_fail (GDK_IS_WINDOW (window));
2496 if (GDK_WINDOW_DESTROYED (window))
2499 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2503 gdk_window_set_static_gravities (GdkWindow *window,
2504 gboolean use_static)
2506 GdkWindowObject *private = (GdkWindowObject *)window;
2508 g_return_val_if_fail (window != NULL, FALSE);
2509 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2511 if (!use_static == !private->guffaw_gravity)
2517 private->guffaw_gravity = use_static;
2523 * Setting window states
2526 gdk_window_iconify (GdkWindow *window)
2528 HWND old_active_window;
2530 g_return_if_fail (window != NULL);
2531 g_return_if_fail (GDK_IS_WINDOW (window));
2533 if (GDK_WINDOW_DESTROYED (window))
2536 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p: %s\n",
2537 GDK_WINDOW_HWND (window),
2538 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2540 if (GDK_WINDOW_IS_MAPPED (window))
2542 old_active_window = GetActiveWindow ();
2543 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2544 if (old_active_window != GDK_WINDOW_HWND (window))
2545 SetActiveWindow (old_active_window);
2549 gdk_synthesize_window_state (window,
2551 GDK_WINDOW_STATE_ICONIFIED);
2556 gdk_window_deiconify (GdkWindow *window)
2558 g_return_if_fail (window != NULL);
2559 g_return_if_fail (GDK_IS_WINDOW (window));
2561 if (GDK_WINDOW_DESTROYED (window))
2564 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p: %s\n",
2565 GDK_WINDOW_HWND (window),
2566 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2568 if (GDK_WINDOW_IS_MAPPED (window))
2570 show_window_internal (window, FALSE, TRUE);
2574 gdk_synthesize_window_state (window,
2575 GDK_WINDOW_STATE_ICONIFIED,
2581 gdk_window_stick (GdkWindow *window)
2583 g_return_if_fail (GDK_IS_WINDOW (window));
2585 if (GDK_WINDOW_DESTROYED (window))
2588 /* FIXME: Do something? */
2592 gdk_window_unstick (GdkWindow *window)
2594 g_return_if_fail (GDK_IS_WINDOW (window));
2596 if (GDK_WINDOW_DESTROYED (window))
2599 /* FIXME: Do something? */
2603 gdk_window_maximize (GdkWindow *window)
2605 g_return_if_fail (GDK_IS_WINDOW (window));
2607 if (GDK_WINDOW_DESTROYED (window))
2610 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p: %s\n",
2611 GDK_WINDOW_HWND (window),
2612 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2614 if (GDK_WINDOW_IS_MAPPED (window))
2615 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2617 gdk_synthesize_window_state (window,
2619 GDK_WINDOW_STATE_MAXIMIZED);
2623 gdk_window_unmaximize (GdkWindow *window)
2625 g_return_if_fail (GDK_IS_WINDOW (window));
2627 if (GDK_WINDOW_DESTROYED (window))
2630 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p: %s\n",
2631 GDK_WINDOW_HWND (window),
2632 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2634 if (GDK_WINDOW_IS_MAPPED (window))
2635 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2637 gdk_synthesize_window_state (window,
2638 GDK_WINDOW_STATE_MAXIMIZED,
2642 typedef struct _FullscreenInfo FullscreenInfo;
2644 struct _FullscreenInfo
2652 gdk_window_fullscreen (GdkWindow *window)
2656 GdkWindowObject *private = (GdkWindowObject *) window;
2658 g_return_if_fail (GDK_IS_WINDOW (window));
2660 fi = g_new (FullscreenInfo, 1);
2662 if (!GetWindowRect (GDK_WINDOW_HWND (window), &(fi->r)))
2666 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
2668 width = GetSystemMetrics (SM_CXSCREEN);
2669 height = GetSystemMetrics (SM_CYSCREEN);
2671 /* remember for restoring */
2672 fi->hint_flags = impl->hint_flags;
2673 impl->hint_flags &= ~GDK_HINT_MAX_SIZE;
2674 g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
2675 fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2677 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
2678 (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
2679 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP /*not MOST, taskswitch!*/,
2680 0, 0, width, height,
2681 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
2682 WIN32_API_FAILED ("SetWindowPos");
2684 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
2689 gdk_window_unfullscreen (GdkWindow *window)
2692 GdkWindowObject *private = (GdkWindowObject *) window;
2694 g_return_if_fail (GDK_IS_WINDOW (window));
2696 fi = g_object_get_data (G_OBJECT(window), "fullscreen-info");
2699 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
2701 impl->hint_flags = fi->hint_flags;
2702 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
2703 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
2704 fi->r.left, fi->r.top, fi->r.right - fi->r.left, fi->r.bottom - fi->r.top,
2705 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
2706 WIN32_API_FAILED ("SetWindowPos");
2708 g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
2711 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
2716 gdk_window_focus (GdkWindow *window,
2719 g_return_if_fail (GDK_IS_WINDOW (window));
2721 if (GDK_WINDOW_DESTROYED (window))
2724 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p: %s\n",
2725 GDK_WINDOW_HWND (window),
2726 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2728 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
2729 SetFocus (GDK_WINDOW_HWND (window));
2733 gdk_window_set_modal_hint (GdkWindow *window,
2736 GdkWindowObject *private;
2738 g_return_if_fail (window != NULL);
2739 g_return_if_fail (GDK_IS_WINDOW (window));
2741 if (GDK_WINDOW_DESTROYED (window))
2744 private = (GdkWindowObject*) window;
2746 private->modal_hint = modal;
2748 if (GDK_WINDOW_IS_MAPPED (window))
2749 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
2750 modal ? HWND_TOPMOST : HWND_NOTOPMOST,
2751 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE));
2755 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2756 gboolean skips_taskbar)
2758 LONG extended_style;
2760 g_return_if_fail (GDK_IS_WINDOW (window));
2762 GDK_NOTE (MISC, g_print ("gdk_window_set_skip_taskbar_hint: %p: %s\n",
2763 GDK_WINDOW_HWND (window),
2764 skips_taskbar ? "TRUE" : "FALSE"));
2766 extended_style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2769 extended_style |= WS_EX_TOOLWINDOW;
2771 extended_style &= ~WS_EX_TOOLWINDOW;
2773 SetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE, extended_style);
2777 gdk_window_set_skip_pager_hint (GdkWindow *window,
2778 gboolean skips_pager)
2780 g_return_if_fail (GDK_IS_WINDOW (window));
2784 gdk_window_set_type_hint (GdkWindow *window,
2785 GdkWindowTypeHint hint)
2787 g_return_if_fail (window != NULL);
2788 g_return_if_fail (GDK_IS_WINDOW (window));
2790 if (GDK_WINDOW_DESTROYED (window))
2793 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p: %d\n",
2794 GDK_WINDOW_HWND (window), hint));
2797 case GDK_WINDOW_TYPE_HINT_DIALOG:
2799 case GDK_WINDOW_TYPE_HINT_MENU:
2800 gdk_window_set_decorations (window,
2803 GDK_DECOR_MINIMIZE |
2804 GDK_DECOR_MAXIMIZE);
2806 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
2807 gdk_window_set_skip_taskbar_hint (window, TRUE);
2809 case GDK_WINDOW_TYPE_HINT_UTILITY:
2811 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2813 case GDK_WINDOW_TYPE_HINT_DOCK:
2815 case GDK_WINDOW_TYPE_HINT_DESKTOP:
2818 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
2820 case GDK_WINDOW_TYPE_HINT_NORMAL:
2826 gdk_window_shape_combine_region (GdkWindow *window,
2827 GdkRegion *shape_region,
2831 g_return_if_fail (GDK_IS_WINDOW (window));
2833 if (GDK_WINDOW_DESTROYED (window))
2836 /* XXX: even on X implemented conditional ... */
2840 gdk_window_begin_resize_drag (GdkWindow *window,
2847 g_return_if_fail (GDK_IS_WINDOW (window));
2849 if (GDK_WINDOW_DESTROYED (window))
2852 /* XXX: isn't all this default on win32 ... */
2856 gdk_window_begin_move_drag (GdkWindow *window,
2862 g_return_if_fail (GDK_IS_WINDOW (window));
2864 if (GDK_WINDOW_DESTROYED (window))
2867 /* XXX: isn't all this default on win32 ... */
2871 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2873 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
2875 return gdk_window_lookup (anid);