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 "gdkprivate-win32.h"
35 #include "gdkinput-win32.h"
37 static gboolean gdk_window_gravity_works (void);
38 static void gdk_window_set_static_win_gravity (GdkWindow *window,
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)
96 impl->extension_events_selected = FALSE;
100 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
102 GObjectClass *object_class = G_OBJECT_CLASS (klass);
103 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
105 parent_class = g_type_class_peek_parent (klass);
107 object_class->finalize = gdk_window_impl_win32_finalize;
109 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
110 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
111 drawable_class->get_size = gdk_window_impl_win32_get_size;
113 /* Visible and clip regions are the same */
114 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
115 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
119 gdk_window_impl_win32_finalize (GObject *object)
121 GdkWindowObject *wrapper;
122 GdkDrawableImplWin32 *draw_impl;
123 GdkWindowImplWin32 *window_impl;
125 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
127 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
128 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
130 wrapper = (GdkWindowObject*) draw_impl->wrapper;
132 if (!GDK_WINDOW_DESTROYED (wrapper))
134 gdk_win32_handle_table_remove (draw_impl->handle);
137 if (window_impl->hcursor != NULL)
139 if (GetCursor () == window_impl->hcursor)
141 if (!DestroyCursor (window_impl->hcursor))
142 WIN32_GDI_FAILED("DestroyCursor");
143 window_impl->hcursor = NULL;
146 G_OBJECT_CLASS (parent_class)->finalize (object);
150 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
152 GdkDrawableImplWin32 *drawable_impl;
154 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
156 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
158 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
159 drawable_impl->colormap == NULL)
161 drawable_impl->colormap = gdk_colormap_get_system ();
162 gdk_colormap_ref (drawable_impl->colormap);
165 return drawable_impl->colormap;
169 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
172 GdkWindowImplWin32 *impl;
173 GdkDrawableImplWin32 *draw_impl;
175 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
177 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
178 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
181 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
186 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
191 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
195 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
198 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
200 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
204 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
206 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
207 GdkRectangle result_rect;
211 result_rect.width = impl->width;
212 result_rect.height = impl->height;
214 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
216 return gdk_region_rectangle (&result_rect);
220 _gdk_windowing_window_init (void)
222 GdkWindowObject *private;
223 GdkWindowImplWin32 *impl;
224 GdkDrawableImplWin32 *draw_impl;
229 g_assert (_gdk_parent_root == NULL);
231 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
232 width = rect.right - rect.left;
233 height = rect.bottom - rect.top;
235 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
236 private = (GdkWindowObject *)_gdk_parent_root;
237 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
238 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
240 draw_impl->handle = gdk_root_window;
241 draw_impl->wrapper = GDK_DRAWABLE (private);
242 draw_impl->colormap = gdk_colormap_get_system ();
243 gdk_colormap_ref (draw_impl->colormap);
245 private->window_type = GDK_WINDOW_ROOT;
246 private->depth = gdk_visual_get_system ()->depth;
248 impl->height = height;
250 gdk_win32_handle_table_insert (&gdk_root_window, _gdk_parent_root);
253 /* The Win API function AdjustWindowRect may return negative values
254 * resulting in obscured title bars. This helper function is coreccting it.
257 SafeAdjustWindowRectEx (RECT* lpRect,
262 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
264 WIN32_API_FAILED ("AdjustWindowRectEx");
267 if (lpRect->left < 0)
269 lpRect->right -= lpRect->left;
274 lpRect->bottom -= lpRect->top;
281 * is a wrapper function for RegisterWindowClassEx.
282 * It creates at least one unique class for every
283 * GdkWindowType. If support for single window-specific icons
284 * is ever needed (e.g Dialog specific), every such window should
288 RegisterGdkClass (GdkWindowType wtype)
290 static ATOM klassTOPLEVEL = 0;
291 static ATOM klassDIALOG = 0;
292 static ATOM klassCHILD = 0;
293 static ATOM klassTEMP = 0;
294 static HICON hAppIcon = NULL;
295 static WNDCLASSEX wcl;
298 wcl.cbSize = sizeof (WNDCLASSEX);
299 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
300 * on WM_SIZE and WM_MOVE. Flicker, Performance!
302 wcl.lpfnWndProc = _gdk_win32_window_procedure;
305 wcl.hInstance = gdk_app_hmodule;
307 /* initialize once! */
310 gchar sLoc [_MAX_PATH+1];
312 if (0 != GetModuleFileName (gdk_app_hmodule, sLoc, _MAX_PATH))
314 hAppIcon = ExtractIcon (gdk_app_hmodule, sLoc, 0);
317 if (0 != GetModuleFileName (gdk_dll_hinstance, sLoc, _MAX_PATH))
318 hAppIcon = ExtractIcon (gdk_dll_hinstance, sLoc, 0);
322 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
325 wcl.lpszMenuName = NULL;
328 /* initialize once per class */
330 * HB: Setting the background brush leads to flicker, because we
331 * don't get asked how to clear the background. This is not what
332 * we want, at least not for input_only windows ...
334 #define ONCE_PER_CLASS() \
335 wcl.hIcon = CopyIcon (hAppIcon); \
336 wcl.hIconSm = CopyIcon (hAppIcon); \
337 wcl.hbrBackground = NULL; \
338 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
342 case GDK_WINDOW_TOPLEVEL:
343 if (0 == klassTOPLEVEL)
345 wcl.lpszClassName = "gdkWindowToplevel";
348 klassTOPLEVEL = RegisterClassEx (&wcl);
350 klass = klassTOPLEVEL;
353 case GDK_WINDOW_CHILD:
356 wcl.lpszClassName = "gdkWindowChild";
358 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
360 klassCHILD = RegisterClassEx (&wcl);
365 case GDK_WINDOW_DIALOG:
366 if (0 == klassDIALOG)
368 wcl.lpszClassName = "gdkWindowDialog";
369 wcl.style |= CS_SAVEBITS;
371 klassDIALOG = RegisterClassEx (&wcl);
376 case GDK_WINDOW_TEMP:
379 wcl.lpszClassName = "gdkWindowTemp";
380 wcl.style |= CS_SAVEBITS;
382 klassTEMP = RegisterClassEx (&wcl);
388 g_assert_not_reached ();
394 WIN32_API_FAILED ("RegisterClassEx");
395 g_error ("That is a fatal error");
401 gdk_window_new (GdkWindow *parent,
402 GdkWindowAttr *attributes,
403 gint attributes_mask)
407 DWORD dwStyle, dwExStyle;
410 GdkWindowObject *private;
411 GdkWindowImplWin32 *impl;
412 GdkDrawableImplWin32 *draw_impl;
419 g_return_val_if_fail (attributes != NULL, NULL);
422 parent = _gdk_parent_root;
424 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
427 g_print ("gdk_window_new: %s\n",
428 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
429 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
430 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
431 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
434 if (GDK_WINDOW_DESTROYED (parent))
437 hparent = GDK_WINDOW_HWND (parent);
439 window = g_object_new (GDK_TYPE_WINDOW, NULL);
440 private = (GdkWindowObject *)window;
441 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
442 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
443 draw_impl->wrapper = GDK_DRAWABLE (window);
445 /* Windows with a foreign parent are treated as if they are children
446 * of the root window, except for actual creation.
448 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
449 parent = _gdk_parent_root;
451 private->parent = (GdkWindowObject *)parent;
453 if (attributes_mask & GDK_WA_X)
458 if (attributes_mask & GDK_WA_Y)
460 else if (attributes_mask & GDK_WA_X)
461 y = 100; /* ??? We must put it somewhere... */
463 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
467 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
468 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
469 impl->extension_events_selected = FALSE;
470 private->window_type = attributes->window_type;
472 _gdk_window_init_position (GDK_WINDOW (private));
473 if (impl->position_info.big)
474 private->guffaw_gravity = TRUE;
476 if (attributes_mask & GDK_WA_VISUAL)
477 visual = attributes->visual;
479 visual = gdk_visual_get_system ();
481 if (attributes_mask & GDK_WA_TITLE)
482 title = attributes->title;
484 title = g_get_prgname ();
485 if (!title || !*title)
486 title = "GDK client window";
488 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
490 if (private->parent && private->parent->guffaw_gravity)
495 if (attributes->wclass == GDK_INPUT_OUTPUT)
499 private->input_only = FALSE;
500 private->depth = visual->depth;
502 if (attributes_mask & GDK_WA_COLORMAP)
504 draw_impl->colormap = attributes->colormap;
505 gdk_colormap_ref (attributes->colormap);
509 draw_impl->colormap = gdk_colormap_get_system ();
514 dwExStyle = WS_EX_TRANSPARENT;
516 private->input_only = TRUE;
517 draw_impl->colormap = gdk_colormap_get_system ();
518 gdk_colormap_ref (draw_impl->colormap);
519 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n"));
523 private->parent->children = g_list_prepend (private->parent->children, window);
525 switch (private->window_type)
527 case GDK_WINDOW_TOPLEVEL:
528 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
529 hparent = gdk_root_window;
532 case GDK_WINDOW_CHILD:
533 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
536 case GDK_WINDOW_DIALOG:
537 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
539 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
541 hparent = gdk_root_window;
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;
551 case GDK_WINDOW_ROOT:
552 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
556 klass = RegisterGdkClass (private->window_type);
558 if (private->window_type != GDK_WINDOW_CHILD)
560 if (x == CW_USEDEFAULT)
571 rect.right = rect.left + impl->width;
572 rect.bottom = rect.top + impl->height;
574 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
576 if (x != CW_USEDEFAULT)
581 width = rect.right - rect.left;
582 height = rect.bottom - rect.top;
587 height = impl->height;
590 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
592 #ifdef WITHOUT_WM_CREATE
593 draw_impl->handle = CreateWindowEx (dwExStyle,
594 MAKEINTRESOURCE(klass),
597 impl->position_info.x, impl->position_info.y,
598 impl->position_info.width, impl->position_info.height,
606 CreateWindowEx (dwExStyle,
607 MAKEINTRESOURCE(klass),
610 impl->position_info.x, impl->position_info.y,
611 impl->position_info.width, impl->position_info.height,
616 if (GDK_WINDOW_HWND (window) != hwndNew)
618 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
619 GDK_WINDOW_HWND (window),
622 /* HB: IHMO due to a race condition the handle was increased by
623 * one, which causes much trouble. Because I can't find the
624 * real bug, try to workaround it ...
625 * To reproduce: compile with MSVC 5, DEBUG=1
628 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
629 GDK_WINDOW_HWND (window) = hwndNew;
630 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
632 /* the old behaviour, but with warning */
633 GDK_WINDOW_HWND (window) = hwndNew;
638 gdk_drawable_ref (window);
639 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
643 g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
645 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
647 GDK_WINDOW_HWND (window)));
651 if (draw_impl->handle == NULL)
653 WIN32_API_FAILED ("CreateWindowEx");
654 g_object_unref ((GObject *) window);
658 #ifdef WITHOUT_WM_CREATE
659 gdk_drawable_ref (window);
660 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
663 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
664 (attributes->cursor) :
671 gdk_window_foreign_new (GdkNativeWindow anid)
674 GdkWindowObject *private;
675 GdkWindowImplWin32 *impl;
676 GdkDrawableImplWin32 *draw_impl;
682 window = g_object_new (GDK_TYPE_WINDOW, NULL);
683 private = (GdkWindowObject *)window;
684 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
685 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
686 draw_impl->wrapper = GDK_DRAWABLE (window);
687 parent = GetParent ((HWND)anid);
689 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
690 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
691 private->parent = (GdkWindowObject *)_gdk_parent_root;
693 private->parent->children = g_list_prepend (private->parent->children, window);
695 draw_impl->handle = (HWND) anid;
696 GetClientRect ((HWND) anid, &rect);
698 point.y = rect.right;
699 ClientToScreen ((HWND) anid, &point);
700 if (parent != gdk_root_window)
701 ScreenToClient (parent, &point);
702 private->x = point.x;
703 private->y = point.y;
704 impl->width = rect.right - rect.left;
705 impl->height = rect.bottom - rect.top;
706 private->window_type = GDK_WINDOW_FOREIGN;
707 private->destroyed = FALSE;
708 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
709 if (IsWindowVisible ((HWND) anid))
710 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
712 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
713 private->depth = gdk_visual_get_system ()->depth;
715 gdk_drawable_ref (window);
716 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
722 gdk_window_lookup (GdkNativeWindow hwnd)
724 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
728 _gdk_windowing_window_destroy (GdkWindow *window,
730 gboolean foreign_destroy)
732 GdkWindowObject *private = (GdkWindowObject *)window;
734 g_return_if_fail (GDK_IS_WINDOW (window));
736 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %p\n",
737 GDK_WINDOW_HWND (window)));
739 if (private->extension_events != 0)
740 gdk_input_window_destroy (window);
742 if (private->window_type == GDK_WINDOW_FOREIGN)
744 if (!foreign_destroy && (private->parent != NULL))
746 /* It's somebody else's window, but in our hierarchy,
747 * so reparent it to the root window, and then call
748 * DestroyWindow() on it.
750 gdk_window_hide (window);
751 gdk_window_reparent (window, NULL, 0, 0);
753 /* Is this too drastic? Many (most?) applications
754 * quit if any window receives WM_QUIT I think.
755 * OTOH, I don't think foreign windows are much
756 * used, so the question is maybe academic.
758 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
761 else if (!recursing && !foreign_destroy)
763 private->destroyed = TRUE;
764 DestroyWindow (GDK_WINDOW_HWND (window));
768 /* This function is called when the window really gone.
771 gdk_window_destroy_notify (GdkWindow *window)
773 g_return_if_fail (window != NULL);
774 g_return_if_fail (GDK_IS_WINDOW (window));
777 g_print ("gdk_window_destroy_notify: %p %s\n",
778 GDK_WINDOW_HWND (window),
779 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
781 if (!GDK_WINDOW_DESTROYED (window))
783 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
784 g_warning ("window %p unexpectedly destroyed",
785 GDK_WINDOW_HWND (window));
787 _gdk_window_destroy (window, TRUE);
790 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
791 gdk_drawable_unref (window);
795 show_window_internal (GdkWindow *window,
798 GdkWindowObject *private;
800 private = GDK_WINDOW_OBJECT (window);
802 if (!private->destroyed)
804 GDK_NOTE (MISC, g_print ("gdk_window_show: %p\n",
805 GDK_WINDOW_HWND (window)));
807 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
808 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
810 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
811 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
812 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
814 /* Don't put on toolbar */
815 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
820 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
822 SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
823 SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
827 GdkWindow *parent = GDK_WINDOW (private->parent);
829 /* Todo: GDK_WINDOW_STATE_STICKY */
830 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
831 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMINIMIZED);
832 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
833 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
836 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
837 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
839 if (parent == _gdk_parent_root)
840 SetForegroundWindow (GDK_WINDOW_HWND (window));
842 BringWindowToTop (GDK_WINDOW_HWND (window));
844 ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
852 gdk_window_show_unraised (GdkWindow *window)
854 g_return_if_fail (GDK_IS_WINDOW (window));
856 show_window_internal (window, FALSE);
860 gdk_window_show (GdkWindow *window)
862 g_return_if_fail (GDK_IS_WINDOW (window));
864 show_window_internal (window, TRUE);
868 gdk_window_hide (GdkWindow *window)
870 GdkWindowObject *private;
872 g_return_if_fail (window != NULL);
874 private = (GdkWindowObject*) window;
875 if (!private->destroyed)
877 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p\n",
878 GDK_WINDOW_HWND (window)));
880 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
882 _gdk_window_clear_update_area (window);
884 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
885 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
887 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
889 SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
890 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
894 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
900 gdk_window_withdraw (GdkWindow *window)
902 GdkWindowObject *private;
904 g_return_if_fail (window != NULL);
906 private = (GdkWindowObject*) window;
907 if (!private->destroyed)
909 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p\n",
910 GDK_WINDOW_HWND (window)));
912 gdk_window_hide (window); /* ??? */
917 gdk_window_move (GdkWindow *window,
921 GdkWindowObject *private = (GdkWindowObject *)window;
922 GdkWindowImplWin32 *impl;
924 g_return_if_fail (window != NULL);
925 g_return_if_fail (GDK_IS_WINDOW (window));
927 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
929 if (!GDK_WINDOW_DESTROYED (window))
931 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
932 _gdk_window_move_resize_child (window, x, y,
933 impl->width, impl->height);
936 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
937 x, y, impl->width, impl->height,
938 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
939 WIN32_API_FAILED ("SetWindowPos");
945 gdk_window_resize (GdkWindow *window,
949 GdkWindowObject *private = (GdkWindowObject*) window;
950 GdkWindowImplWin32 *impl;
953 g_return_if_fail (window != NULL);
954 g_return_if_fail (GDK_IS_WINDOW (window));
961 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
963 if (!GDK_WINDOW_DESTROYED (window))
965 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
966 _gdk_window_move_resize_child (window, private->x, private->y,
977 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
980 rect.right = pt.x + width;
981 rect.bottom = pt.y + height;
983 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
984 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
985 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
986 WIN32_API_FAILED ("AdjustWindowRectEx");
990 width = rect.right - rect.left;
991 height = rect.bottom - rect.top;
992 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
994 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER))
995 WIN32_API_FAILED ("SetWindowPos");
997 private->resize_count += 1;
1002 gdk_window_move_resize (GdkWindow *window,
1008 GdkWindowObject *private = (GdkWindowObject*) window;
1009 GdkWindowImplWin32 *impl;
1011 g_return_if_fail (window != NULL);
1012 g_return_if_fail (GDK_IS_WINDOW (window));
1019 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1021 if (!private->destroyed)
1027 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p %dx%d@+%d+%d\n",
1028 GDK_WINDOW_HWND (window),
1029 width, height, x, y));
1031 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1032 _gdk_window_move_resize_child (window, x, y, width, height);
1037 rect.right = x + width;
1038 rect.bottom = y + height;
1040 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1041 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1042 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1043 WIN32_API_FAILED ("AdjustWindowRectEx");
1045 GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%ldx%ld@+%ld+%ld)\n",
1046 GDK_WINDOW_HWND (window),
1047 rect.right - rect.left, rect.bottom - rect.top,
1048 rect.left, rect.top));
1049 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1050 rect.left, rect.top,
1051 rect.right - rect.left, rect.bottom - rect.top,
1052 SWP_NOACTIVATE | SWP_NOZORDER))
1053 WIN32_API_FAILED ("SetWindowPos");
1059 gdk_window_reparent (GdkWindow *window,
1060 GdkWindow *new_parent,
1064 GdkWindowObject *window_private;
1065 GdkWindowObject *parent_private;
1066 GdkWindowObject *old_parent_private;
1067 GdkWindowImplWin32 *impl;
1069 g_return_if_fail (window != NULL);
1070 g_return_if_fail (GDK_IS_WINDOW (window));
1071 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1072 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1075 new_parent = _gdk_parent_root;
1077 window_private = (GdkWindowObject*) window;
1078 old_parent_private = (GdkWindowObject *) window_private->parent;
1079 parent_private = (GdkWindowObject*) new_parent;
1080 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1082 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1084 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p %p\n",
1085 GDK_WINDOW_HWND (window),
1086 GDK_WINDOW_HWND (new_parent)));
1087 if (!SetParent (GDK_WINDOW_HWND (window),
1088 GDK_WINDOW_HWND (new_parent)))
1089 WIN32_API_FAILED ("SetParent");
1091 if (!MoveWindow (GDK_WINDOW_HWND (window),
1092 x, y, impl->width, impl->height, TRUE))
1093 WIN32_API_FAILED ("MoveWindow");
1096 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1099 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1100 new_parent = _gdk_parent_root;
1102 window_private->parent = (GdkWindowObject *)new_parent;
1104 if (old_parent_private)
1105 old_parent_private->children =
1106 g_list_remove (old_parent_private->children, window);
1108 if ((old_parent_private &&
1109 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1110 (!old_parent_private && parent_private->guffaw_gravity))
1111 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1113 parent_private->children = g_list_prepend (parent_private->children, window);
1114 _gdk_window_init_position (GDK_WINDOW (window_private));
1118 _gdk_windowing_window_clear_area (GdkWindow *window,
1124 GdkWindowImplWin32 *impl;
1126 g_return_if_fail (window != NULL);
1127 g_return_if_fail (GDK_IS_WINDOW (window));
1129 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1131 if (!GDK_WINDOW_DESTROYED (window))
1136 width = impl->width - x;
1138 height = impl->height - y;
1139 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1140 "%p %dx%d@+%d+%d\n",
1141 GDK_WINDOW_HWND (window),
1142 width, height, x, y));
1143 hdc = GetDC (GDK_WINDOW_HWND (window));
1144 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1145 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1146 if (!ReleaseDC (GDK_WINDOW_HWND (window), hdc))
1147 WIN32_GDI_FAILED ("ReleaseDC");
1152 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1158 g_return_if_fail (window != NULL);
1159 g_return_if_fail (GDK_IS_WINDOW (window));
1161 if (!GDK_WINDOW_DESTROYED (window))
1165 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1166 "%p %dx%d@+%d+%d\n",
1167 GDK_WINDOW_HWND (window),
1168 width, height, x, y));
1171 rect.right = x + width + 1;
1173 rect.bottom = y + height + 1;
1174 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1175 WIN32_GDI_FAILED ("InvalidateRect");
1176 UpdateWindow (GDK_WINDOW_HWND (window));
1181 gdk_window_raise (GdkWindow *window)
1183 g_return_if_fail (window != NULL);
1184 g_return_if_fail (GDK_IS_WINDOW (window));
1186 if (!GDK_WINDOW_DESTROYED (window))
1188 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1189 GDK_WINDOW_HWND (window)));
1191 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1192 WIN32_API_FAILED ("BringWindowToTop");
1197 gdk_window_lower (GdkWindow *window)
1199 g_return_if_fail (window != NULL);
1200 g_return_if_fail (GDK_IS_WINDOW (window));
1202 if (!GDK_WINDOW_DESTROYED (window))
1204 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1205 GDK_WINDOW_HWND (window)));
1207 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1208 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1209 WIN32_API_FAILED ("SetWindowPos");
1214 gdk_window_set_hints (GdkWindow *window,
1223 GdkWindowImplWin32 *impl;
1224 WINDOWPLACEMENT size_hints;
1230 g_return_if_fail (window != NULL);
1231 g_return_if_fail (GDK_IS_WINDOW (window));
1233 if (GDK_WINDOW_DESTROYED (window))
1236 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1238 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p %dx%d..%dx%d @+%d+%d\n",
1239 GDK_WINDOW_HWND (window),
1240 min_width, min_height, max_width, max_height,
1243 impl->hint_flags = flags;
1244 size_hints.length = sizeof (size_hints);
1251 geom.min_width = min_width;
1252 geom.min_height = min_height;
1253 geom.max_width = max_width;
1254 geom.max_height = max_height;
1256 if (flags & GDK_HINT_POS)
1258 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1259 WIN32_API_FAILED ("GetWindowPlacement");
1262 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1263 " (%ld,%ld)--(%ld,%ld)\n",
1264 size_hints.rcNormalPosition.left,
1265 size_hints.rcNormalPosition.top,
1266 size_hints.rcNormalPosition.right,
1267 size_hints.rcNormalPosition.bottom));
1268 /* What are the corresponding window coordinates for client
1269 * area coordinates x, y
1273 rect.right = rect.left + 200; /* dummy */
1274 rect.bottom = rect.top + 200;
1275 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1276 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1277 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1278 size_hints.flags = 0;
1279 size_hints.showCmd = SW_SHOWNA;
1281 /* Set the normal position hint to that location, with unchanged
1284 diff = size_hints.rcNormalPosition.left - rect.left;
1285 size_hints.rcNormalPosition.left = rect.left;
1286 size_hints.rcNormalPosition.right -= diff;
1287 diff = size_hints.rcNormalPosition.top - rect.top;
1288 size_hints.rcNormalPosition.top = rect.top;
1289 size_hints.rcNormalPosition.bottom -= diff;
1290 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1291 size_hints.rcNormalPosition.left,
1292 size_hints.rcNormalPosition.top,
1293 size_hints.rcNormalPosition.right,
1294 size_hints.rcNormalPosition.bottom));
1295 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1296 WIN32_API_FAILED ("SetWindowPlacement");
1297 impl->hint_x = rect.left;
1298 impl->hint_y = rect.top;
1302 if (flags & GDK_HINT_MIN_SIZE)
1303 geom_mask |= GDK_HINT_MIN_SIZE;
1305 if (flags & GDK_HINT_MAX_SIZE)
1306 geom_mask |= GDK_HINT_MAX_SIZE;
1308 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1313 gdk_window_set_geometry_hints (GdkWindow *window,
1314 GdkGeometry *geometry,
1315 GdkWindowHints geom_mask)
1317 GdkWindowImplWin32 *impl;
1318 WINDOWPLACEMENT size_hints;
1322 gint new_width = 0, new_height = 0;
1324 g_return_if_fail (window != NULL);
1325 g_return_if_fail (GDK_IS_WINDOW (window));
1327 if (GDK_WINDOW_DESTROYED (window))
1330 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1331 size_hints.length = sizeof (size_hints);
1333 impl->hint_flags = geom_mask;
1335 if (geom_mask & GDK_HINT_POS)
1336 ; /* even the X11 mplementation doesn't care */
1338 if (geom_mask & GDK_HINT_MIN_SIZE)
1342 rect.right = geometry->min_width;
1343 rect.bottom = geometry->min_height;
1344 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1345 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1346 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1347 impl->hint_min_width = rect.right - rect.left;
1348 impl->hint_min_height = rect.bottom - rect.top;
1350 /* Also check if he current size of the window is in bounds */
1351 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1353 if (rect.right < geometry->min_width
1354 && rect.bottom < geometry->min_height)
1356 new_width = geometry->min_width; new_height = geometry->min_height;
1358 else if (rect.right < geometry->min_width)
1360 new_width = geometry->min_width; new_height = rect.bottom;
1362 else if (rect.bottom < geometry->min_height)
1364 new_width = rect.right; new_height = geometry->min_height;
1368 if (geom_mask & GDK_HINT_MAX_SIZE)
1372 rect.right = geometry->max_width;
1373 rect.bottom = geometry->max_height;
1374 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1375 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1376 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1377 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1378 impl->hint_max_width = rect.right - rect.left;
1379 impl->hint_max_height = rect.bottom - rect.top;
1380 /* ... but negative sizes are always wrong */
1381 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1382 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1384 /* Again, check if the window is too large currently. */
1385 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1386 if (rect.right > geometry->max_width
1387 && rect.bottom > geometry->max_height)
1389 new_width = geometry->max_width; new_height = geometry->max_height;
1391 else if (rect.right > geometry->max_width)
1393 new_width = geometry->max_width; new_height = rect.bottom;
1395 else if (rect.bottom > geometry->max_height)
1397 new_width = rect.right; new_height = geometry->max_height;
1401 /* finally apply new size constraints */
1402 if (new_width != 0 && new_height != 0)
1403 gdk_window_resize (window, new_width, new_height);
1405 /* I don't know what to do when called with zero base_width and height. */
1406 if (geom_mask & GDK_HINT_BASE_SIZE
1407 && geometry->base_width > 0
1408 && geometry->base_height > 0)
1410 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1411 WIN32_API_FAILED ("GetWindowPlacement");
1414 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1415 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1416 size_hints.rcNormalPosition.left,
1417 size_hints.rcNormalPosition.top,
1418 size_hints.rcNormalPosition.right,
1419 size_hints.rcNormalPosition.bottom));
1420 size_hints.rcNormalPosition.right =
1421 size_hints.rcNormalPosition.left + geometry->base_width;
1422 size_hints.rcNormalPosition.bottom =
1423 size_hints.rcNormalPosition.top + geometry->base_height;
1424 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1425 size_hints.rcNormalPosition.left,
1426 size_hints.rcNormalPosition.top,
1427 size_hints.rcNormalPosition.right,
1428 size_hints.rcNormalPosition.bottom));
1429 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1430 WIN32_API_FAILED ("SetWindowPlacement");
1434 if (geom_mask & GDK_HINT_RESIZE_INC)
1439 if (geom_mask & GDK_HINT_ASPECT)
1446 gdk_window_set_title (GdkWindow *window,
1451 g_return_if_fail (window != NULL);
1452 g_return_if_fail (GDK_IS_WINDOW (window));
1453 g_return_if_fail (title != NULL);
1455 /* Empty window titles not allowed, so set it to just a period. */
1459 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p %s\n",
1460 GDK_WINDOW_HWND (window), title));
1462 if (!GDK_WINDOW_DESTROYED (window))
1464 /* As the title is in UTF-8 we must translate it
1465 * to the system codepage.
1467 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1468 if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
1469 WIN32_API_FAILED ("SetWindowText");
1476 gdk_window_set_role (GdkWindow *window,
1479 g_return_if_fail (window != NULL);
1480 g_return_if_fail (GDK_IS_WINDOW (window));
1482 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p %s\n",
1483 GDK_WINDOW_HWND (window),
1484 (role ? role : "NULL")));
1489 gdk_window_set_transient_for (GdkWindow *window,
1492 HWND window_id, parent_id;
1495 g_return_if_fail (window != NULL);
1496 g_return_if_fail (GDK_IS_WINDOW (window));
1498 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p %p\n",
1499 GDK_WINDOW_HWND (window),
1500 GDK_WINDOW_HWND (parent)));
1502 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1505 window_id = GDK_WINDOW_HWND (window);
1506 parent_id = GDK_WINDOW_HWND (parent);
1508 if ((style = GetWindowLong (window_id, GWL_STYLE)) == 0)
1509 WIN32_API_FAILED ("GetWindowLong");
1512 #if 0 /* not sure if we want to do this */
1513 style &= ~(WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
1516 if (!SetWindowLong (window_id, GWL_STYLE, style))
1517 WIN32_API_FAILED ("SetWindowLong");
1518 #if 0 /* not sure if we want to do this, clipping to parent size! */
1519 if (!SetParent (window_id, parent_id))
1520 WIN32_API_FAILED ("SetParent");
1521 #else /* make the modal window topmost instead */
1522 if (!SetWindowPos (window_id, HWND_TOPMOST, 0, 0, 0, 0,
1523 SWP_NOMOVE | SWP_NOSIZE))
1524 WIN32_API_FAILED ("SetWindowPos");
1527 if (!RedrawWindow (window_id, NULL, NULL,
1528 RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW))
1529 WIN32_API_FAILED ("RedrawWindow");
1533 gdk_window_set_background (GdkWindow *window,
1536 GdkWindowObject *private = (GdkWindowObject *)window;
1538 g_return_if_fail (window != NULL);
1539 g_return_if_fail (GDK_IS_WINDOW (window));
1541 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p %s\n",
1542 GDK_WINDOW_HWND (window),
1543 gdk_win32_color_to_string (color)));
1545 private->bg_color = *color;
1547 if (private->bg_pixmap &&
1548 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1549 private->bg_pixmap != GDK_NO_BG)
1551 gdk_drawable_unref (private->bg_pixmap);
1552 private->bg_pixmap = NULL;
1557 gdk_window_set_back_pixmap (GdkWindow *window,
1559 gint parent_relative)
1561 GdkWindowObject *private = (GdkWindowObject *)window;
1563 g_return_if_fail (window != NULL);
1564 g_return_if_fail (GDK_IS_WINDOW (window));
1565 g_return_if_fail (pixmap == NULL || !parent_relative);
1566 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1568 if (private->bg_pixmap &&
1569 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1570 private->bg_pixmap != GDK_NO_BG)
1571 gdk_drawable_unref (private->bg_pixmap);
1573 if (parent_relative)
1575 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1576 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1582 gdk_drawable_ref (pixmap);
1583 private->bg_pixmap = pixmap;
1587 private->bg_pixmap = GDK_NO_BG;
1593 gdk_window_set_cursor (GdkWindow *window,
1596 GdkWindowImplWin32 *impl;
1597 GdkCursorPrivate *cursor_private;
1599 HCURSOR hprevcursor;
1601 g_return_if_fail (window != NULL);
1602 g_return_if_fail (GDK_IS_WINDOW (window));
1604 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1605 cursor_private = (GdkCursorPrivate*) cursor;
1607 if (GDK_WINDOW_DESTROYED (window))
1613 hcursor = cursor_private->hcursor;
1615 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p %p\n",
1616 GDK_WINDOW_HWND (window),
1619 /* First get the old cursor, if any (we wait to free the old one
1620 * since it may be the current cursor set in the Win32 API right
1623 hprevcursor = impl->hcursor;
1625 if (hcursor == NULL)
1626 impl->hcursor = NULL;
1629 /* We must copy the cursor as it is OK to destroy the GdkCursor
1630 * while still in use for some window. See for instance
1631 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1632 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1635 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1636 WIN32_API_FAILED ("CopyCursor");
1637 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1638 hcursor, impl->hcursor));
1641 /* Set new cursor in all cases if we're over our window */
1642 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1643 SetCursor (impl->hcursor);
1645 /* Destroy the previous cursor: Need to make sure it's no longer in
1646 * use before we destroy it, in case we're not over our window but
1647 * the cursor is still set to our old one.
1649 if (hprevcursor != NULL)
1651 if (GetCursor() == hprevcursor)
1654 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1657 if (!DestroyCursor (hprevcursor))
1658 WIN32_API_FAILED ("DestroyCursor");
1663 gdk_window_get_geometry (GdkWindow *window,
1670 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1673 window = _gdk_parent_root;
1675 if (!GDK_WINDOW_DESTROYED (window))
1679 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1680 WIN32_API_FAILED ("GetClientRect");
1687 *width = rect.right - rect.left;
1689 *height = rect.bottom - rect.top;
1691 *depth = gdk_drawable_get_visual (window)->depth;
1696 gdk_window_get_origin (GdkWindow *window,
1704 g_return_val_if_fail (window != NULL, 0);
1706 if (!GDK_WINDOW_DESTROYED (window))
1712 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1725 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1726 GDK_WINDOW_HWND (window),
1732 gdk_window_get_deskrelative_origin (GdkWindow *window,
1736 return gdk_window_get_origin (window, x, y);
1740 gdk_window_get_root_origin (GdkWindow *window,
1746 g_return_if_fail (GDK_IS_WINDOW (window));
1748 gdk_window_get_frame_extents (window, &rect);
1758 gdk_window_get_frame_extents (GdkWindow *window,
1761 GdkWindowObject *private;
1765 g_return_if_fail (GDK_IS_WINDOW (window));
1766 g_return_if_fail (rect != NULL);
1768 private = GDK_WINDOW_OBJECT (window);
1775 if (GDK_WINDOW_DESTROYED (window))
1778 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
1779 private = (GdkWindowObject*) private->parent;
1781 hwnd = GDK_WINDOW_HWND (window);
1783 /* find the frame window */
1784 while (HWND_DESKTOP != GetParent (hwnd))
1786 hwnd = GetParent (hwnd);
1787 g_return_if_fail (NULL != hwnd);
1790 if (!GetWindowRect (hwnd, &r))
1791 WIN32_API_FAILED ("GetWindowRect");
1795 rect->width = r.right - r.left;
1796 rect->height = r.bottom - r.top;
1800 _gdk_windowing_window_get_pointer (GdkWindow *window,
1803 GdkModifierType *mask)
1805 GdkWindow *return_val;
1806 POINT screen_point, point;
1809 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1812 window = _gdk_parent_root;
1815 GetCursorPos (&screen_point);
1816 point = screen_point;
1817 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1824 hwnd = WindowFromPoint (point);
1827 gboolean done = FALSE;
1831 point = screen_point;
1832 ScreenToClient (hwnd, &point);
1833 hwndc = ChildWindowFromPoint (hwnd, point);
1836 else if (hwndc == hwnd)
1842 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
1851 GetKeyboardState (kbd);
1853 if (kbd[VK_SHIFT] & 0x80)
1854 *mask |= GDK_SHIFT_MASK;
1855 if (kbd[VK_CAPITAL] & 0x80)
1856 *mask |= GDK_LOCK_MASK;
1857 if (kbd[VK_CONTROL] & 0x80)
1858 *mask |= GDK_CONTROL_MASK;
1859 if (kbd[VK_MENU] & 0x80)
1860 *mask |= GDK_MOD1_MASK;
1861 if (kbd[VK_LBUTTON] & 0x80)
1862 *mask |= GDK_BUTTON1_MASK;
1863 if (kbd[VK_MBUTTON] & 0x80)
1864 *mask |= GDK_BUTTON2_MASK;
1865 if (kbd[VK_RBUTTON] & 0x80)
1866 *mask |= GDK_BUTTON3_MASK;
1873 _gdk_windowing_window_at_pointer (GdkScreen *screen,
1878 POINT point, pointc;
1882 GetCursorPos (&pointc);
1884 hwnd = WindowFromPoint (point);
1888 window = _gdk_parent_root;
1896 ScreenToClient (hwnd, &point);
1899 hwndc = ChildWindowFromPoint (hwnd, point);
1900 ClientToScreen (hwnd, &point);
1901 ScreenToClient (hwndc, &point);
1902 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1904 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1906 if (window && (win_x || win_y))
1908 GetClientRect (hwnd, &rect);
1910 *win_x = point.x - rect.left;
1912 *win_y = point.y - rect.top;
1915 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %p%s\n",
1918 (window == NULL ? " NULL" : "")));
1924 gdk_window_get_events (GdkWindow *window)
1926 g_return_val_if_fail (window != NULL, 0);
1927 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1929 if (GDK_WINDOW_DESTROYED (window))
1932 return GDK_WINDOW_OBJECT (window)->event_mask;
1936 gdk_window_set_events (GdkWindow *window,
1937 GdkEventMask event_mask)
1939 g_return_if_fail (window != NULL);
1940 g_return_if_fail (GDK_IS_WINDOW (window));
1942 if (GDK_WINDOW_DESTROYED (window))
1945 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
1946 * set it here, too. Not that I know or remember why it is
1947 * necessary, will have to test some day.
1949 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
1953 gdk_window_shape_combine_mask (GdkWindow *window,
1957 g_return_if_fail (window != NULL);
1958 g_return_if_fail (GDK_IS_WINDOW (window));
1962 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p none\n",
1963 GDK_WINDOW_HWND (window)));
1964 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
1973 /* Convert mask bitmap to region */
1974 hrgn = _gdk_win32_bitmap_to_region (mask);
1976 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p %p\n",
1977 GDK_WINDOW_HWND (window),
1978 GDK_WINDOW_HWND (mask)));
1980 /* SetWindowRgn wants window (not client) coordinates */
1981 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1982 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1983 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1984 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1985 OffsetRgn (hrgn, -rect.left, -rect.top);
1987 OffsetRgn (hrgn, x, y);
1989 /* If this is a top-level window, add the title bar to the region */
1990 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1992 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
1993 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
1997 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2002 gdk_window_set_override_redirect (GdkWindow *window,
2003 gboolean override_redirect)
2005 g_return_if_fail (window != NULL);
2006 g_return_if_fail (GDK_IS_WINDOW (window));
2008 g_warning ("gdk_window_set_override_redirect not implemented");
2012 gdk_window_set_icon_list (GdkWindow *window,
2015 g_return_if_fail (GDK_IS_WINDOW (window));
2017 if (GDK_WINDOW_DESTROYED (window))
2020 /* We could convert it to a hIcon and DrawIcon () it when getting
2021 * a WM_PAINT with IsIconic, but is it worth it ? Same probably
2022 * goes for gdk_window_set_icon (). Patches accepted :-) --hb
2023 * Or do we only need to deliver the Icon on WM_GETICON ?
2028 gdk_window_set_icon (GdkWindow *window,
2029 GdkWindow *icon_window,
2033 g_return_if_fail (window != NULL);
2034 g_return_if_fail (GDK_IS_WINDOW (window));
2036 if (GDK_WINDOW_DESTROYED (window))
2039 /* Nothing to do, really. As we share window classes between windows
2040 * we can't have window-specific icons, sorry. Don't print any warning
2046 gdk_window_set_icon_name (GdkWindow *window,
2049 g_return_if_fail (window != NULL);
2050 g_return_if_fail (GDK_IS_WINDOW (window));
2052 if (GDK_WINDOW_DESTROYED (window))
2055 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
2056 WIN32_API_FAILED ("SetWindowText");
2060 gdk_window_set_group (GdkWindow *window,
2063 g_return_if_fail (window != NULL);
2064 g_return_if_fail (GDK_IS_WINDOW (window));
2065 g_return_if_fail (leader != NULL);
2066 g_return_if_fail (GDK_IS_WINDOW (leader));
2068 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2071 g_warning ("gdk_window_set_group not implemented");
2075 gdk_window_set_decorations (GdkWindow *window,
2076 GdkWMDecoration decorations)
2078 LONG style, exstyle;
2080 g_return_if_fail (window != NULL);
2081 g_return_if_fail (GDK_IS_WINDOW (window));
2083 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2084 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2086 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2087 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
2089 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2091 if (decorations & GDK_DECOR_ALL)
2092 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2093 if (decorations & GDK_DECOR_BORDER)
2094 style |= (WS_BORDER);
2095 if (decorations & GDK_DECOR_RESIZEH)
2096 style |= (WS_THICKFRAME);
2097 if (decorations & GDK_DECOR_TITLE)
2098 style |= (WS_CAPTION);
2099 if (decorations & GDK_DECOR_MENU)
2100 style |= (WS_SYSMENU);
2101 if (decorations & GDK_DECOR_MINIMIZE)
2102 style |= (WS_MINIMIZEBOX);
2103 if (decorations & GDK_DECOR_MAXIMIZE)
2104 style |= (WS_MAXIMIZEBOX);
2106 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2110 gdk_window_set_functions (GdkWindow *window,
2111 GdkWMFunction functions)
2113 LONG style, exstyle;
2115 g_return_if_fail (window != NULL);
2116 g_return_if_fail (GDK_IS_WINDOW (window));
2118 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2119 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2121 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2122 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
2125 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2127 if (functions & GDK_FUNC_ALL)
2128 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2129 if (functions & GDK_FUNC_RESIZE)
2130 style |= (WS_THICKFRAME);
2131 if (functions & GDK_FUNC_MOVE)
2132 style |= (WS_THICKFRAME);
2133 if (functions & GDK_FUNC_MINIMIZE)
2134 style |= (WS_MINIMIZEBOX);
2135 if (functions & GDK_FUNC_MAXIMIZE)
2136 style |= (WS_MAXIMIZEBOX);
2138 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2142 * propagate the shapes from all child windows of a GDK window to the parent
2143 * window. Shamelessly ripped from Enlightenment's code
2149 QueryTree (HWND hwnd,
2159 child = GetWindow (hwnd, GW_CHILD);
2161 child = GetWindow (child, GW_HWNDNEXT);
2164 } while (child != NULL);
2168 *children = g_new (HWND, n);
2169 for (i = 0; i < n; i++)
2172 child = GetWindow (hwnd, GW_CHILD);
2174 child = GetWindow (child, GW_HWNDNEXT);
2175 *children[i] = child;
2181 gdk_propagate_shapes (HANDLE win,
2185 HRGN region, childRegion;
2189 SetRectEmpty (&emptyRect);
2190 region = CreateRectRgnIndirect (&emptyRect);
2192 GetWindowRgn (win, region);
2194 QueryTree (win, &list, &num);
2197 WINDOWPLACEMENT placement;
2199 placement.length = sizeof (WINDOWPLACEMENT);
2200 /* go through all child windows and combine regions */
2201 for (i = 0; i < num; i++)
2203 GetWindowPlacement (list[i], &placement);
2204 if (placement.showCmd == SW_SHOWNORMAL)
2206 childRegion = CreateRectRgnIndirect (&emptyRect);
2207 GetWindowRgn (list[i], childRegion);
2208 CombineRgn (region, region, childRegion, RGN_OR);
2209 DeleteObject (childRegion);
2212 SetWindowRgn (win, region, TRUE);
2215 DeleteObject (region);
2219 gdk_window_set_child_shapes (GdkWindow *window)
2221 g_return_if_fail (window != NULL);
2222 g_return_if_fail (GDK_IS_WINDOW (window));
2224 if (GDK_WINDOW_DESTROYED (window))
2227 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2231 gdk_window_merge_child_shapes (GdkWindow *window)
2233 g_return_if_fail (window != NULL);
2234 g_return_if_fail (GDK_IS_WINDOW (window));
2236 if (GDK_WINDOW_DESTROYED (window))
2239 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2242 /* Support for windows that can be guffaw-scrolled
2243 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2247 gdk_window_gravity_works (void)
2249 enum { UNKNOWN, NO, YES };
2250 static gint gravity_works = UNKNOWN;
2252 if (gravity_works == UNKNOWN)
2259 attr.window_type = GDK_WINDOW_TEMP;
2260 attr.wclass = GDK_INPUT_OUTPUT;
2265 attr.event_mask = 0;
2267 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2269 attr.window_type = GDK_WINDOW_CHILD;
2270 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2272 gdk_window_set_static_win_gravity (child, TRUE);
2274 gdk_window_resize (parent, 100, 110);
2275 gdk_window_move (parent, 0, -10);
2276 gdk_window_move_resize (parent, 0, 0, 100, 100);
2278 gdk_window_resize (parent, 100, 110);
2279 gdk_window_move (parent, 0, -10);
2280 gdk_window_move_resize (parent, 0, 0, 100, 100);
2282 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2284 gdk_window_destroy (parent);
2285 gdk_window_destroy (child);
2287 gravity_works = ((y == -20) ? YES : NO);
2290 return (gravity_works == YES);
2294 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2296 g_return_if_fail (window != NULL);
2298 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2302 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2304 g_return_if_fail (window != NULL);
2306 GDK_NOTE (MISC, g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2309 /*************************************************************
2310 * gdk_window_set_static_gravities:
2311 * Set the bit gravity of the given window to static,
2312 * and flag it so all children get static subwindow
2315 * window: window for which to set static gravity
2316 * use_static: Whether to turn static gravity on or off.
2318 * Does the XServer support static gravity?
2319 *************************************************************/
2322 gdk_window_set_static_gravities (GdkWindow *window,
2323 gboolean use_static)
2325 GdkWindowObject *private = (GdkWindowObject *)window;
2328 g_return_val_if_fail (window != NULL, FALSE);
2329 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2331 if (!use_static == !private->guffaw_gravity)
2334 if (use_static && !gdk_window_gravity_works ())
2337 private->guffaw_gravity = use_static;
2339 if (!GDK_WINDOW_DESTROYED (window))
2341 gdk_window_set_static_bit_gravity (window, use_static);
2343 tmp_list = private->children;
2346 gdk_window_set_static_win_gravity (window, use_static);
2348 tmp_list = tmp_list->next;
2356 * Setting window states
2359 gdk_window_iconify (GdkWindow *window)
2361 g_return_if_fail (window != NULL);
2362 g_return_if_fail (GDK_IS_WINDOW (window));
2364 if (GDK_WINDOW_DESTROYED (window))
2367 if (GDK_WINDOW_IS_MAPPED (window))
2369 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2373 /* Flip our client side flag, the real work happens on map. */
2374 gdk_synthesize_window_state (window,
2376 GDK_WINDOW_STATE_ICONIFIED);
2381 gdk_window_deiconify (GdkWindow *window)
2383 g_return_if_fail (window != NULL);
2384 g_return_if_fail (GDK_IS_WINDOW (window));
2386 if (GDK_WINDOW_DESTROYED (window))
2389 if (GDK_WINDOW_IS_MAPPED (window))
2391 gdk_window_show (window);
2395 /* Flip our client side flag, the real work happens on map. */
2396 gdk_synthesize_window_state (window,
2397 GDK_WINDOW_STATE_ICONIFIED,
2403 gdk_window_stick (GdkWindow *window)
2405 g_return_if_fail (GDK_IS_WINDOW (window));
2407 if (GDK_WINDOW_DESTROYED (window))
2410 if (GDK_WINDOW_IS_MAPPED (window))
2412 /* "stick" means stick to all desktops _and_ do not scroll with the
2413 * viewport. i.e. glue to the monitor glass in all cases.
2415 g_warning ("gdk_window_stick (%p) ???", GDK_WINDOW_HWND (window));
2419 /* Flip our client side flag, the real work happens on map. */
2420 gdk_synthesize_window_state (window,
2422 GDK_WINDOW_STATE_STICKY);
2427 gdk_window_unstick (GdkWindow *window)
2429 g_return_if_fail (GDK_IS_WINDOW (window));
2431 if (GDK_WINDOW_DESTROYED (window))
2434 if (GDK_WINDOW_IS_MAPPED (window))
2436 g_warning ("gdk_window_unstick (%p) ???", GDK_WINDOW_HWND (window));
2440 /* Flip our client side flag, the real work happens on map. */
2441 gdk_synthesize_window_state (window,
2442 GDK_WINDOW_STATE_STICKY,
2448 gdk_window_maximize (GdkWindow *window)
2450 g_return_if_fail (GDK_IS_WINDOW (window));
2452 if (GDK_WINDOW_DESTROYED (window))
2455 if (GDK_WINDOW_IS_MAPPED (window))
2456 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2458 gdk_synthesize_window_state (window,
2460 GDK_WINDOW_STATE_MAXIMIZED);
2464 gdk_window_unmaximize (GdkWindow *window)
2466 g_return_if_fail (GDK_IS_WINDOW (window));
2468 if (GDK_WINDOW_DESTROYED (window))
2471 if (GDK_WINDOW_IS_MAPPED (window))
2472 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2474 gdk_synthesize_window_state (window,
2475 GDK_WINDOW_STATE_MAXIMIZED,
2480 gdk_window_focus (GdkWindow *window,
2483 g_return_if_fail (GDK_IS_WINDOW (window));
2485 if (GDK_WINDOW_DESTROYED (window))
2488 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p\n", GDK_WINDOW_HWND (window)));
2490 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
2491 SetFocus (GDK_WINDOW_HWND (window));
2495 gdk_window_set_modal_hint (GdkWindow *window,
2498 GdkWindowObject *private;
2500 g_return_if_fail (window != NULL);
2501 g_return_if_fail (GDK_IS_WINDOW (window));
2503 if (GDK_WINDOW_DESTROYED (window))
2506 private = (GdkWindowObject*) window;
2508 private->modal_hint = modal;
2510 if (GDK_WINDOW_IS_MAPPED (window))
2511 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
2512 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
2513 WIN32_API_FAILED ("SetWindowPos");
2517 gdk_window_set_type_hint (GdkWindow *window,
2518 GdkWindowTypeHint hint)
2520 g_return_if_fail (window != NULL);
2521 g_return_if_fail (GDK_IS_WINDOW (window));
2523 if (GDK_WINDOW_DESTROYED (window))
2528 case GDK_WINDOW_TYPE_HINT_DIALOG:
2530 case GDK_WINDOW_TYPE_HINT_MENU:
2532 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
2535 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
2537 case GDK_WINDOW_TYPE_HINT_NORMAL:
2543 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint (%p)\n",
2544 GDK_WINDOW_HWND (window)));
2548 gdk_window_shape_combine_region (GdkWindow *window,
2549 GdkRegion *shape_region,
2553 g_return_if_fail (GDK_IS_WINDOW (window));
2555 if (GDK_WINDOW_DESTROYED (window))
2558 /* XXX: even on X implemented conditional ... */
2562 gdk_window_begin_resize_drag (GdkWindow *window,
2569 g_return_if_fail (GDK_IS_WINDOW (window));
2571 if (GDK_WINDOW_DESTROYED (window))
2574 /* XXX: isn't all this default on win32 ... */
2578 gdk_window_begin_move_drag (GdkWindow *window,
2584 g_return_if_fail (GDK_IS_WINDOW (window));
2586 if (GDK_WINDOW_DESTROYED (window))
2589 /* XXX: isn't all this default on win32 ... */