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 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
39 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
41 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
44 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
45 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
46 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
47 static void gdk_window_impl_win32_finalize (GObject *object);
49 static gpointer parent_class = NULL;
52 _gdk_window_impl_win32_get_type (void)
54 static GType object_type = 0;
58 static const GTypeInfo object_info =
60 sizeof (GdkWindowImplWin32Class),
62 (GBaseFinalizeFunc) NULL,
63 (GClassInitFunc) gdk_window_impl_win32_class_init,
64 NULL, /* class_finalize */
65 NULL, /* class_data */
66 sizeof (GdkWindowImplWin32),
68 (GInstanceInitFunc) gdk_window_impl_win32_init,
71 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
80 _gdk_window_impl_get_type (void)
82 return _gdk_window_impl_win32_get_type ();
86 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
93 impl->extension_events_selected = FALSE;
97 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
99 GObjectClass *object_class = G_OBJECT_CLASS (klass);
100 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
102 parent_class = g_type_class_peek_parent (klass);
104 object_class->finalize = gdk_window_impl_win32_finalize;
106 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
107 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
108 drawable_class->get_size = gdk_window_impl_win32_get_size;
110 /* Visible and clip regions are the same */
111 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
112 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
116 gdk_window_impl_win32_finalize (GObject *object)
118 GdkWindowObject *wrapper;
119 GdkDrawableImplWin32 *draw_impl;
120 GdkWindowImplWin32 *window_impl;
122 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
124 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
125 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
127 wrapper = (GdkWindowObject*) draw_impl->wrapper;
129 if (!GDK_WINDOW_DESTROYED (wrapper))
131 gdk_win32_handle_table_remove (draw_impl->handle);
134 if (window_impl->hcursor != NULL)
136 if (GetCursor () == window_impl->hcursor)
138 if (!DestroyCursor (window_impl->hcursor))
139 WIN32_GDI_FAILED("DestroyCursor");
140 window_impl->hcursor = NULL;
143 G_OBJECT_CLASS (parent_class)->finalize (object);
147 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
149 GdkDrawableImplWin32 *drawable_impl;
151 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
153 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
155 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
156 drawable_impl->colormap == NULL)
158 drawable_impl->colormap = gdk_colormap_get_system ();
159 gdk_colormap_ref (drawable_impl->colormap);
162 return drawable_impl->colormap;
166 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
169 GdkWindowImplWin32 *impl;
170 GdkDrawableImplWin32 *draw_impl;
172 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
174 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
175 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
178 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
183 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
188 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
192 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
195 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
197 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
201 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
203 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
204 GdkRectangle result_rect;
208 result_rect.width = impl->width;
209 result_rect.height = impl->height;
211 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
213 return gdk_region_rectangle (&result_rect);
217 _gdk_windowing_window_init (void)
219 GdkWindowObject *private;
220 GdkWindowImplWin32 *impl;
221 GdkDrawableImplWin32 *draw_impl;
226 g_assert (_gdk_parent_root == NULL);
228 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
229 width = rect.right - rect.left;
230 height = rect.bottom - rect.top;
232 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
233 private = (GdkWindowObject *)_gdk_parent_root;
234 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
235 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
237 draw_impl->handle = _gdk_root_window;
238 draw_impl->wrapper = GDK_DRAWABLE (private);
239 draw_impl->colormap = gdk_colormap_get_system ();
240 gdk_colormap_ref (draw_impl->colormap);
242 private->window_type = GDK_WINDOW_ROOT;
243 private->depth = gdk_visual_get_system ()->depth;
245 impl->height = height;
247 _gdk_window_init_position (GDK_WINDOW (private));
249 gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
253 get_default_title (void)
256 #if 0 /* So that we can build with GLib 2.0... */
257 title = g_get_application_name ();
260 title = g_get_prgname ();
265 /* The Win API function AdjustWindowRect may return negative values
266 * resulting in obscured title bars. This helper function is coreccting it.
269 SafeAdjustWindowRectEx (RECT* lpRect,
274 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
276 WIN32_API_FAILED ("AdjustWindowRectEx");
279 if (lpRect->left < 0)
281 lpRect->right -= lpRect->left;
286 lpRect->bottom -= lpRect->top;
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, dwExStyle;
422 GdkWindowObject *private;
423 GdkWindowImplWin32 *impl;
424 GdkDrawableImplWin32 *draw_impl;
431 g_return_val_if_fail (attributes != NULL, NULL);
434 parent = _gdk_parent_root;
436 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
439 g_print ("gdk_window_new: %s\n",
440 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
441 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
442 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
443 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
446 if (GDK_WINDOW_DESTROYED (parent))
449 hparent = GDK_WINDOW_HWND (parent);
451 window = g_object_new (GDK_TYPE_WINDOW, NULL);
452 private = (GdkWindowObject *)window;
453 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
454 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
455 draw_impl->wrapper = GDK_DRAWABLE (window);
457 /* Windows with a foreign parent are treated as if they are children
458 * of the root window, except for actual creation.
460 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
461 parent = _gdk_parent_root;
463 private->parent = (GdkWindowObject *)parent;
465 if (attributes_mask & GDK_WA_X)
470 if (attributes_mask & GDK_WA_Y)
472 else if (attributes_mask & GDK_WA_X)
473 y = 100; /* ??? We must put it somewhere... */
475 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
479 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
480 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
481 impl->extension_events_selected = FALSE;
482 private->window_type = attributes->window_type;
484 _gdk_window_init_position (GDK_WINDOW (private));
485 if (impl->position_info.big)
486 private->guffaw_gravity = TRUE;
488 if (attributes_mask & GDK_WA_VISUAL)
489 visual = attributes->visual;
491 visual = gdk_visual_get_system ();
493 if (attributes_mask & GDK_WA_TITLE)
494 title = attributes->title;
496 title = get_default_title ();
497 if (!title || !*title)
498 title = "GDK client window";
500 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
502 if (private->parent && private->parent->guffaw_gravity)
507 if (attributes->wclass == GDK_INPUT_OUTPUT)
511 private->input_only = FALSE;
512 private->depth = visual->depth;
514 if (attributes_mask & GDK_WA_COLORMAP)
516 draw_impl->colormap = attributes->colormap;
517 gdk_colormap_ref (attributes->colormap);
521 draw_impl->colormap = gdk_colormap_get_system ();
526 dwExStyle = WS_EX_TRANSPARENT;
528 private->input_only = TRUE;
529 draw_impl->colormap = gdk_colormap_get_system ();
530 gdk_colormap_ref (draw_impl->colormap);
531 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n"));
535 private->parent->children = g_list_prepend (private->parent->children, window);
537 switch (private->window_type)
539 case GDK_WINDOW_TOPLEVEL:
540 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
541 hparent = _gdk_root_window;
544 case GDK_WINDOW_CHILD:
545 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
548 case GDK_WINDOW_DIALOG:
549 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
551 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
553 hparent = _gdk_root_window;
556 case GDK_WINDOW_TEMP:
557 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
558 /* a temp window is not necessarily a top level window */
559 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
560 dwExStyle |= WS_EX_TOOLWINDOW;
563 case GDK_WINDOW_ROOT:
564 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
568 klass = RegisterGdkClass (private->window_type);
570 if (private->window_type != GDK_WINDOW_CHILD)
572 if (x == CW_USEDEFAULT)
583 rect.right = rect.left + impl->width;
584 rect.bottom = rect.top + impl->height;
586 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
588 if (x != CW_USEDEFAULT)
593 width = rect.right - rect.left;
594 height = rect.bottom - rect.top;
599 height = impl->height;
602 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
604 #ifdef WITHOUT_WM_CREATE
605 draw_impl->handle = CreateWindowEx (dwExStyle,
606 MAKEINTRESOURCE(klass),
609 impl->position_info.x, impl->position_info.y,
610 impl->position_info.width, impl->position_info.height,
618 CreateWindowEx (dwExStyle,
619 MAKEINTRESOURCE(klass),
622 impl->position_info.x, impl->position_info.y,
623 impl->position_info.width, impl->position_info.height,
628 if (GDK_WINDOW_HWND (window) != hwndNew)
630 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
631 GDK_WINDOW_HWND (window),
634 /* HB: IHMO due to a race condition the handle was increased by
635 * one, which causes much trouble. Because I can't find the
636 * real bug, try to workaround it ...
637 * To reproduce: compile with MSVC 5, DEBUG=1
640 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
641 GDK_WINDOW_HWND (window) = hwndNew;
642 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
644 /* the old behaviour, but with warning */
645 GDK_WINDOW_HWND (window) = hwndNew;
650 gdk_drawable_ref (window);
651 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
655 g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
657 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
659 GDK_WINDOW_HWND (window)));
663 if (draw_impl->handle == NULL)
665 WIN32_API_FAILED ("CreateWindowEx");
666 g_object_unref ((GObject *) window);
670 #ifdef WITHOUT_WM_CREATE
671 gdk_drawable_ref (window);
672 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
675 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
676 (attributes->cursor) :
683 gdk_window_foreign_new_for_display (GdkDisplay *display,
684 GdkNativeWindow anid)
687 GdkWindowObject *private;
688 GdkWindowImplWin32 *impl;
689 GdkDrawableImplWin32 *draw_impl;
695 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
697 window = g_object_new (GDK_TYPE_WINDOW, NULL);
698 private = (GdkWindowObject *)window;
699 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
700 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
701 draw_impl->wrapper = GDK_DRAWABLE (window);
702 parent = GetParent ((HWND)anid);
704 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
705 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
706 private->parent = (GdkWindowObject *)_gdk_parent_root;
708 private->parent->children = g_list_prepend (private->parent->children, window);
710 draw_impl->handle = (HWND) anid;
711 GetClientRect ((HWND) anid, &rect);
713 point.y = rect.right;
714 ClientToScreen ((HWND) anid, &point);
715 if (parent != _gdk_root_window)
716 ScreenToClient (parent, &point);
717 private->x = point.x;
718 private->y = point.y;
719 impl->width = rect.right - rect.left;
720 impl->height = rect.bottom - rect.top;
721 private->window_type = GDK_WINDOW_FOREIGN;
722 private->destroyed = FALSE;
723 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
724 if (IsWindowVisible ((HWND) anid))
725 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
727 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
728 private->depth = gdk_visual_get_system ()->depth;
730 _gdk_window_init_position (GDK_WINDOW (private));
732 gdk_drawable_ref (window);
733 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
739 gdk_window_lookup (GdkNativeWindow hwnd)
741 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
745 _gdk_windowing_window_destroy (GdkWindow *window,
747 gboolean foreign_destroy)
749 GdkWindowObject *private = (GdkWindowObject *)window;
751 g_return_if_fail (GDK_IS_WINDOW (window));
753 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %p\n",
754 GDK_WINDOW_HWND (window)));
756 if (private->extension_events != 0)
757 _gdk_input_window_destroy (window);
759 if (private->window_type == GDK_WINDOW_FOREIGN)
761 if (!foreign_destroy && (private->parent != NULL))
763 /* It's somebody else's window, but in our hierarchy,
764 * so reparent it to the root window, and then call
765 * DestroyWindow() on it.
767 gdk_window_hide (window);
768 gdk_window_reparent (window, NULL, 0, 0);
770 /* Is this too drastic? Many (most?) applications
771 * quit if any window receives WM_QUIT I think.
772 * OTOH, I don't think foreign windows are much
773 * used, so the question is maybe academic.
775 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
778 else if (!recursing && !foreign_destroy)
780 private->destroyed = TRUE;
781 DestroyWindow (GDK_WINDOW_HWND (window));
785 /* This function is called when the window really gone.
788 gdk_window_destroy_notify (GdkWindow *window)
790 g_return_if_fail (window != NULL);
791 g_return_if_fail (GDK_IS_WINDOW (window));
794 g_print ("gdk_window_destroy_notify: %p %s\n",
795 GDK_WINDOW_HWND (window),
796 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
798 if (!GDK_WINDOW_DESTROYED (window))
800 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
801 g_warning ("window %p unexpectedly destroyed",
802 GDK_WINDOW_HWND (window));
804 _gdk_window_destroy (window, TRUE);
807 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
808 gdk_drawable_unref (window);
812 show_window_internal (GdkWindow *window,
815 GdkWindowObject *private;
817 private = GDK_WINDOW_OBJECT (window);
819 if (!private->destroyed)
821 GDK_NOTE (MISC, g_print ("gdk_window_show: %p\n",
822 GDK_WINDOW_HWND (window)));
824 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
825 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
827 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
828 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
829 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
831 /* Don't put on toolbar */
832 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
837 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
839 SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
840 SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
844 GdkWindow *parent = GDK_WINDOW (private->parent);
846 /* Todo: GDK_WINDOW_STATE_STICKY */
847 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
848 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMINIMIZED);
849 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
850 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
853 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
854 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
856 if (parent == _gdk_parent_root)
857 SetForegroundWindow (GDK_WINDOW_HWND (window));
859 BringWindowToTop (GDK_WINDOW_HWND (window));
861 ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
869 gdk_window_show_unraised (GdkWindow *window)
871 g_return_if_fail (GDK_IS_WINDOW (window));
873 show_window_internal (window, FALSE);
877 gdk_window_show (GdkWindow *window)
879 g_return_if_fail (GDK_IS_WINDOW (window));
881 show_window_internal (window, TRUE);
885 gdk_window_hide (GdkWindow *window)
887 GdkWindowObject *private;
889 g_return_if_fail (window != NULL);
891 private = (GdkWindowObject*) window;
892 if (!private->destroyed)
894 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p\n",
895 GDK_WINDOW_HWND (window)));
897 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
899 _gdk_window_clear_update_area (window);
901 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
902 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
904 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
906 SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
907 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
911 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
917 gdk_window_withdraw (GdkWindow *window)
919 GdkWindowObject *private;
921 g_return_if_fail (window != NULL);
923 private = (GdkWindowObject*) window;
924 if (!private->destroyed)
926 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p\n",
927 GDK_WINDOW_HWND (window)));
929 gdk_window_hide (window); /* ??? */
934 gdk_window_move (GdkWindow *window,
938 GdkWindowObject *private = (GdkWindowObject *)window;
939 GdkWindowImplWin32 *impl;
941 g_return_if_fail (window != NULL);
942 g_return_if_fail (GDK_IS_WINDOW (window));
944 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
946 if (!GDK_WINDOW_DESTROYED (window))
948 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
949 _gdk_window_move_resize_child (window, x, y,
950 impl->width, impl->height);
953 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
954 x, y, impl->width, impl->height,
955 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
956 WIN32_API_FAILED ("SetWindowPos");
962 gdk_window_resize (GdkWindow *window,
966 GdkWindowObject *private = (GdkWindowObject*) window;
967 GdkWindowImplWin32 *impl;
970 g_return_if_fail (window != NULL);
971 g_return_if_fail (GDK_IS_WINDOW (window));
978 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
980 if (!GDK_WINDOW_DESTROYED (window))
982 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
983 _gdk_window_move_resize_child (window, private->x, private->y,
994 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
997 rect.right = pt.x + width;
998 rect.bottom = pt.y + height;
1000 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1001 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1002 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1003 WIN32_API_FAILED ("AdjustWindowRectEx");
1007 width = rect.right - rect.left;
1008 height = rect.bottom - rect.top;
1009 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1010 x, y, width, height,
1011 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER))
1012 WIN32_API_FAILED ("SetWindowPos");
1014 private->resize_count += 1;
1019 gdk_window_move_resize (GdkWindow *window,
1025 GdkWindowObject *private = (GdkWindowObject*) window;
1026 GdkWindowImplWin32 *impl;
1028 g_return_if_fail (window != NULL);
1029 g_return_if_fail (GDK_IS_WINDOW (window));
1036 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1038 if (!private->destroyed)
1044 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p %dx%d@+%d+%d\n",
1045 GDK_WINDOW_HWND (window),
1046 width, height, x, y));
1048 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1049 _gdk_window_move_resize_child (window, x, y, width, height);
1054 rect.right = x + width;
1055 rect.bottom = y + height;
1057 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1058 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1059 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1060 WIN32_API_FAILED ("AdjustWindowRectEx");
1062 GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%ldx%ld@+%ld+%ld)\n",
1063 GDK_WINDOW_HWND (window),
1064 rect.right - rect.left, rect.bottom - rect.top,
1065 rect.left, rect.top));
1066 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1067 rect.left, rect.top,
1068 rect.right - rect.left, rect.bottom - rect.top,
1069 SWP_NOACTIVATE | SWP_NOZORDER))
1070 WIN32_API_FAILED ("SetWindowPos");
1076 gdk_window_reparent (GdkWindow *window,
1077 GdkWindow *new_parent,
1081 GdkWindowObject *window_private;
1082 GdkWindowObject *parent_private;
1083 GdkWindowObject *old_parent_private;
1084 GdkWindowImplWin32 *impl;
1086 g_return_if_fail (window != NULL);
1087 g_return_if_fail (GDK_IS_WINDOW (window));
1088 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1089 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1092 new_parent = _gdk_parent_root;
1094 window_private = (GdkWindowObject*) window;
1095 old_parent_private = (GdkWindowObject *) window_private->parent;
1096 parent_private = (GdkWindowObject*) new_parent;
1097 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1099 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1101 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p %p\n",
1102 GDK_WINDOW_HWND (window),
1103 GDK_WINDOW_HWND (new_parent)));
1104 if (!SetParent (GDK_WINDOW_HWND (window),
1105 GDK_WINDOW_HWND (new_parent)))
1106 WIN32_API_FAILED ("SetParent");
1108 if (!MoveWindow (GDK_WINDOW_HWND (window),
1109 x, y, impl->width, impl->height, TRUE))
1110 WIN32_API_FAILED ("MoveWindow");
1113 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1116 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1117 new_parent = _gdk_parent_root;
1119 window_private->parent = (GdkWindowObject *)new_parent;
1121 if (old_parent_private)
1122 old_parent_private->children =
1123 g_list_remove (old_parent_private->children, window);
1126 if ((old_parent_private &&
1127 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1128 (!old_parent_private && parent_private->guffaw_gravity))
1129 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1132 parent_private->children = g_list_prepend (parent_private->children, window);
1133 _gdk_window_init_position (GDK_WINDOW (window_private));
1137 _gdk_windowing_window_clear_area (GdkWindow *window,
1143 GdkWindowImplWin32 *impl;
1145 g_return_if_fail (window != NULL);
1146 g_return_if_fail (GDK_IS_WINDOW (window));
1148 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1150 if (!GDK_WINDOW_DESTROYED (window))
1155 width = impl->width - x;
1157 height = impl->height - y;
1158 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1159 "%p %dx%d@+%d+%d\n",
1160 GDK_WINDOW_HWND (window),
1161 width, height, x, y));
1162 hdc = GetDC (GDK_WINDOW_HWND (window));
1163 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1164 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1165 if (!ReleaseDC (GDK_WINDOW_HWND (window), hdc))
1166 WIN32_GDI_FAILED ("ReleaseDC");
1171 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1177 g_return_if_fail (window != NULL);
1178 g_return_if_fail (GDK_IS_WINDOW (window));
1180 if (!GDK_WINDOW_DESTROYED (window))
1184 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1185 "%p %dx%d@+%d+%d\n",
1186 GDK_WINDOW_HWND (window),
1187 width, height, x, y));
1190 rect.right = x + width + 1;
1192 rect.bottom = y + height + 1;
1193 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1194 WIN32_GDI_FAILED ("InvalidateRect");
1195 UpdateWindow (GDK_WINDOW_HWND (window));
1200 gdk_window_raise (GdkWindow *window)
1202 g_return_if_fail (window != NULL);
1203 g_return_if_fail (GDK_IS_WINDOW (window));
1205 if (!GDK_WINDOW_DESTROYED (window))
1207 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1208 GDK_WINDOW_HWND (window)));
1210 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1211 WIN32_API_FAILED ("BringWindowToTop");
1216 gdk_window_lower (GdkWindow *window)
1218 g_return_if_fail (window != NULL);
1219 g_return_if_fail (GDK_IS_WINDOW (window));
1221 if (!GDK_WINDOW_DESTROYED (window))
1223 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1224 GDK_WINDOW_HWND (window)));
1226 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1227 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1228 WIN32_API_FAILED ("SetWindowPos");
1233 gdk_window_set_hints (GdkWindow *window,
1242 GdkWindowImplWin32 *impl;
1243 WINDOWPLACEMENT size_hints;
1249 g_return_if_fail (window != NULL);
1250 g_return_if_fail (GDK_IS_WINDOW (window));
1252 if (GDK_WINDOW_DESTROYED (window))
1255 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1257 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p %dx%d..%dx%d @+%d+%d\n",
1258 GDK_WINDOW_HWND (window),
1259 min_width, min_height, max_width, max_height,
1262 impl->hint_flags = flags;
1263 size_hints.length = sizeof (size_hints);
1270 geom.min_width = min_width;
1271 geom.min_height = min_height;
1272 geom.max_width = max_width;
1273 geom.max_height = max_height;
1275 if (flags & GDK_HINT_POS)
1277 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1278 WIN32_API_FAILED ("GetWindowPlacement");
1281 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1282 " (%ld,%ld)--(%ld,%ld)\n",
1283 size_hints.rcNormalPosition.left,
1284 size_hints.rcNormalPosition.top,
1285 size_hints.rcNormalPosition.right,
1286 size_hints.rcNormalPosition.bottom));
1287 /* What are the corresponding window coordinates for client
1288 * area coordinates x, y
1292 rect.right = rect.left + 200; /* dummy */
1293 rect.bottom = rect.top + 200;
1294 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1295 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1296 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1297 size_hints.flags = 0;
1298 size_hints.showCmd = SW_SHOWNA;
1300 /* Set the normal position hint to that location, with unchanged
1303 diff = size_hints.rcNormalPosition.left - rect.left;
1304 size_hints.rcNormalPosition.left = rect.left;
1305 size_hints.rcNormalPosition.right -= diff;
1306 diff = size_hints.rcNormalPosition.top - rect.top;
1307 size_hints.rcNormalPosition.top = rect.top;
1308 size_hints.rcNormalPosition.bottom -= diff;
1309 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1310 size_hints.rcNormalPosition.left,
1311 size_hints.rcNormalPosition.top,
1312 size_hints.rcNormalPosition.right,
1313 size_hints.rcNormalPosition.bottom));
1314 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1315 WIN32_API_FAILED ("SetWindowPlacement");
1316 impl->hint_x = rect.left;
1317 impl->hint_y = rect.top;
1321 if (flags & GDK_HINT_MIN_SIZE)
1322 geom_mask |= GDK_HINT_MIN_SIZE;
1324 if (flags & GDK_HINT_MAX_SIZE)
1325 geom_mask |= GDK_HINT_MAX_SIZE;
1327 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1332 gdk_window_set_geometry_hints (GdkWindow *window,
1333 GdkGeometry *geometry,
1334 GdkWindowHints geom_mask)
1336 GdkWindowImplWin32 *impl;
1337 WINDOWPLACEMENT size_hints;
1341 gint new_width = 0, new_height = 0;
1343 g_return_if_fail (window != NULL);
1344 g_return_if_fail (GDK_IS_WINDOW (window));
1346 if (GDK_WINDOW_DESTROYED (window))
1349 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1350 size_hints.length = sizeof (size_hints);
1352 impl->hint_flags = geom_mask;
1354 if (geom_mask & GDK_HINT_POS)
1355 ; /* even the X11 mplementation doesn't care */
1357 if (geom_mask & GDK_HINT_MIN_SIZE)
1361 rect.right = geometry->min_width;
1362 rect.bottom = geometry->min_height;
1363 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1364 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1365 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1366 impl->hint_min_width = rect.right - rect.left;
1367 impl->hint_min_height = rect.bottom - rect.top;
1369 /* Also check if he current size of the window is in bounds */
1370 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1372 if (rect.right < geometry->min_width
1373 && rect.bottom < geometry->min_height)
1375 new_width = geometry->min_width; new_height = geometry->min_height;
1377 else if (rect.right < geometry->min_width)
1379 new_width = geometry->min_width; new_height = rect.bottom;
1381 else if (rect.bottom < geometry->min_height)
1383 new_width = rect.right; new_height = geometry->min_height;
1387 if (geom_mask & GDK_HINT_MAX_SIZE)
1391 rect.right = geometry->max_width;
1392 rect.bottom = geometry->max_height;
1393 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1394 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1395 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1396 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1397 impl->hint_max_width = rect.right - rect.left;
1398 impl->hint_max_height = rect.bottom - rect.top;
1399 /* ... but negative sizes are always wrong */
1400 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1401 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1403 /* Again, check if the window is too large currently. */
1404 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1405 if (rect.right > geometry->max_width
1406 && rect.bottom > geometry->max_height)
1408 new_width = geometry->max_width; new_height = geometry->max_height;
1410 else if (rect.right > geometry->max_width)
1412 new_width = geometry->max_width; new_height = rect.bottom;
1414 else if (rect.bottom > geometry->max_height)
1416 new_width = rect.right; new_height = geometry->max_height;
1420 /* finally apply new size constraints */
1421 if (new_width != 0 && new_height != 0)
1422 gdk_window_resize (window, new_width, new_height);
1424 /* I don't know what to do when called with zero base_width and height. */
1425 if (geom_mask & GDK_HINT_BASE_SIZE
1426 && geometry->base_width > 0
1427 && geometry->base_height > 0)
1429 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1430 WIN32_API_FAILED ("GetWindowPlacement");
1433 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1434 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1435 size_hints.rcNormalPosition.left,
1436 size_hints.rcNormalPosition.top,
1437 size_hints.rcNormalPosition.right,
1438 size_hints.rcNormalPosition.bottom));
1439 size_hints.rcNormalPosition.right =
1440 size_hints.rcNormalPosition.left + geometry->base_width;
1441 size_hints.rcNormalPosition.bottom =
1442 size_hints.rcNormalPosition.top + geometry->base_height;
1443 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1444 size_hints.rcNormalPosition.left,
1445 size_hints.rcNormalPosition.top,
1446 size_hints.rcNormalPosition.right,
1447 size_hints.rcNormalPosition.bottom));
1448 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1449 WIN32_API_FAILED ("SetWindowPlacement");
1453 if (geom_mask & GDK_HINT_RESIZE_INC)
1458 if (geom_mask & GDK_HINT_ASPECT)
1465 gdk_window_set_title (GdkWindow *window,
1470 g_return_if_fail (window != NULL);
1471 g_return_if_fail (GDK_IS_WINDOW (window));
1472 g_return_if_fail (title != NULL);
1474 /* Empty window titles not allowed, so set it to just a period. */
1478 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p %s\n",
1479 GDK_WINDOW_HWND (window), title));
1481 if (!GDK_WINDOW_DESTROYED (window))
1483 /* As the title is in UTF-8 we must translate it
1484 * to the system codepage.
1486 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1487 if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
1488 WIN32_API_FAILED ("SetWindowText");
1495 gdk_window_set_role (GdkWindow *window,
1498 g_return_if_fail (window != NULL);
1499 g_return_if_fail (GDK_IS_WINDOW (window));
1501 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p %s\n",
1502 GDK_WINDOW_HWND (window),
1503 (role ? role : "NULL")));
1508 gdk_window_set_transient_for (GdkWindow *window,
1511 HWND window_id, parent_id;
1514 g_return_if_fail (window != NULL);
1515 g_return_if_fail (GDK_IS_WINDOW (window));
1517 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p %p\n",
1518 GDK_WINDOW_HWND (window),
1519 GDK_WINDOW_HWND (parent)));
1521 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1524 window_id = GDK_WINDOW_HWND (window);
1525 parent_id = GDK_WINDOW_HWND (parent);
1527 if ((style = GetWindowLong (window_id, GWL_STYLE)) == 0)
1528 WIN32_API_FAILED ("GetWindowLong");
1531 #if 0 /* not sure if we want to do this */
1532 style &= ~(WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
1535 if (!SetWindowLong (window_id, GWL_STYLE, style))
1536 WIN32_API_FAILED ("SetWindowLong");
1537 #if 0 /* not sure if we want to do this, clipping to parent size! */
1538 if (!SetParent (window_id, parent_id))
1539 WIN32_API_FAILED ("SetParent");
1540 #else /* make the modal window topmost instead */
1541 if (!SetWindowPos (window_id, HWND_NOTOPMOST, 0, 0, 0, 0,
1542 SWP_NOMOVE | SWP_NOSIZE))
1543 WIN32_API_FAILED ("SetWindowPos");
1546 if (!RedrawWindow (window_id, NULL, NULL,
1547 RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW))
1548 WIN32_API_FAILED ("RedrawWindow");
1552 gdk_window_set_background (GdkWindow *window,
1555 GdkWindowObject *private = (GdkWindowObject *)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_background: %p %s\n",
1561 GDK_WINDOW_HWND (window),
1562 _gdk_win32_color_to_string (color)));
1564 private->bg_color = *color;
1566 if (private->bg_pixmap &&
1567 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1568 private->bg_pixmap != GDK_NO_BG)
1570 gdk_drawable_unref (private->bg_pixmap);
1571 private->bg_pixmap = NULL;
1576 gdk_window_set_back_pixmap (GdkWindow *window,
1578 gint parent_relative)
1580 GdkWindowObject *private = (GdkWindowObject *)window;
1582 g_return_if_fail (window != NULL);
1583 g_return_if_fail (GDK_IS_WINDOW (window));
1584 g_return_if_fail (pixmap == NULL || !parent_relative);
1585 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1587 if (private->bg_pixmap &&
1588 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1589 private->bg_pixmap != GDK_NO_BG)
1590 gdk_drawable_unref (private->bg_pixmap);
1592 if (parent_relative)
1594 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1595 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1601 gdk_drawable_ref (pixmap);
1602 private->bg_pixmap = pixmap;
1606 private->bg_pixmap = GDK_NO_BG;
1612 gdk_window_set_cursor (GdkWindow *window,
1615 GdkWindowImplWin32 *impl;
1616 GdkCursorPrivate *cursor_private;
1617 GdkWindowObject *parent_window;
1619 HCURSOR hprevcursor;
1621 g_return_if_fail (window != NULL);
1622 g_return_if_fail (GDK_IS_WINDOW (window));
1624 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1625 cursor_private = (GdkCursorPrivate*) cursor;
1627 if (GDK_WINDOW_DESTROYED (window))
1633 hcursor = cursor_private->hcursor;
1635 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p %p\n",
1636 GDK_WINDOW_HWND (window),
1639 /* First get the old cursor, if any (we wait to free the old one
1640 * since it may be the current cursor set in the Win32 API right
1643 hprevcursor = impl->hcursor;
1645 if (hcursor == NULL)
1646 impl->hcursor = NULL;
1649 /* We must copy the cursor as it is OK to destroy the GdkCursor
1650 * while still in use for some window. See for instance
1651 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1652 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1655 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1656 WIN32_API_FAILED ("CopyCursor");
1657 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1658 hcursor, impl->hcursor));
1661 /* If the pointer is over our window, set new cursor if given */
1662 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1663 if (impl->hcursor != NULL)
1664 SetCursor (impl->hcursor);
1666 /* Destroy the previous cursor: Need to make sure it's no longer in
1667 * use before we destroy it, in case we're not over our window but
1668 * the cursor is still set to our old one.
1670 if (hprevcursor != NULL)
1672 if (GetCursor() == hprevcursor)
1674 /* Look for a suitable cursor to use instead */
1676 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1677 while (hcursor == NULL)
1681 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1682 hcursor = impl->hcursor;
1683 parent_window = parent_window->parent;
1687 hcursor = LoadCursor (NULL, IDC_ARROW);
1690 SetCursor (hcursor);
1693 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1696 if (!DestroyCursor (hprevcursor))
1697 WIN32_API_FAILED ("DestroyCursor");
1702 gdk_window_get_geometry (GdkWindow *window,
1709 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1712 window = _gdk_parent_root;
1714 if (!GDK_WINDOW_DESTROYED (window))
1718 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1719 WIN32_API_FAILED ("GetClientRect");
1721 if (window != _gdk_parent_root)
1724 GdkWindow *parent = gdk_window_get_parent (window);
1728 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1729 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1735 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1736 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1746 *width = rect.right - rect.left;
1748 *height = rect.bottom - rect.top;
1750 *depth = gdk_drawable_get_visual (window)->depth;
1755 gdk_window_get_origin (GdkWindow *window,
1763 g_return_val_if_fail (window != NULL, 0);
1765 if (!GDK_WINDOW_DESTROYED (window))
1771 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1784 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1785 GDK_WINDOW_HWND (window),
1791 gdk_window_get_deskrelative_origin (GdkWindow *window,
1795 return gdk_window_get_origin (window, x, y);
1799 gdk_window_get_root_origin (GdkWindow *window,
1805 g_return_if_fail (GDK_IS_WINDOW (window));
1807 gdk_window_get_frame_extents (window, &rect);
1817 gdk_window_get_frame_extents (GdkWindow *window,
1820 GdkWindowObject *private;
1824 g_return_if_fail (GDK_IS_WINDOW (window));
1825 g_return_if_fail (rect != NULL);
1827 private = GDK_WINDOW_OBJECT (window);
1834 if (GDK_WINDOW_DESTROYED (window))
1837 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
1838 private = (GdkWindowObject*) private->parent;
1840 hwnd = GDK_WINDOW_HWND (window);
1842 /* find the frame window */
1843 while (HWND_DESKTOP != GetParent (hwnd))
1845 hwnd = GetParent (hwnd);
1846 g_return_if_fail (NULL != hwnd);
1849 if (!GetWindowRect (hwnd, &r))
1850 WIN32_API_FAILED ("GetWindowRect");
1854 rect->width = r.right - r.left;
1855 rect->height = r.bottom - r.top;
1859 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1863 GdkModifierType *mask)
1865 GdkWindow *return_val;
1866 POINT screen_point, point;
1870 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1873 GetCursorPos (&screen_point);
1874 point = screen_point;
1875 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1880 hwnd = WindowFromPoint (point);
1883 gboolean done = FALSE;
1887 point = screen_point;
1888 ScreenToClient (hwnd, &point);
1889 hwndc = ChildWindowFromPoint (hwnd, point);
1892 else if (hwndc == hwnd)
1898 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
1903 GetKeyboardState (kbd);
1905 if (kbd[VK_SHIFT] & 0x80)
1906 *mask |= GDK_SHIFT_MASK;
1907 if (kbd[VK_CAPITAL] & 0x80)
1908 *mask |= GDK_LOCK_MASK;
1909 if (kbd[VK_CONTROL] & 0x80)
1910 *mask |= GDK_CONTROL_MASK;
1911 if (kbd[VK_MENU] & 0x80)
1912 *mask |= GDK_MOD1_MASK;
1913 if (kbd[VK_LBUTTON] & 0x80)
1914 *mask |= GDK_BUTTON1_MASK;
1915 if (kbd[VK_MBUTTON] & 0x80)
1916 *mask |= GDK_BUTTON2_MASK;
1917 if (kbd[VK_RBUTTON] & 0x80)
1918 *mask |= GDK_BUTTON3_MASK;
1924 _gdk_windowing_get_pointer (GdkDisplay *display,
1928 GdkModifierType *mask)
1930 GdkScreen *default_screen = gdk_display_get_default_screen (display);
1931 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
1933 *screen = default_screen;
1934 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
1938 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1943 POINT point, pointc;
1947 GetCursorPos (&pointc);
1949 hwnd = WindowFromPoint (point);
1953 window = _gdk_parent_root;
1959 ScreenToClient (hwnd, &point);
1962 hwndc = ChildWindowFromPoint (hwnd, point);
1963 ClientToScreen (hwnd, &point);
1964 ScreenToClient (hwndc, &point);
1965 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1967 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1969 if (window && (win_x || win_y))
1971 GetClientRect (hwnd, &rect);
1972 *win_x = point.x - rect.left;
1973 *win_y = point.y - rect.top;
1976 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %p%s\n",
1979 (window == NULL ? " NULL" : "")));
1985 gdk_window_get_events (GdkWindow *window)
1987 g_return_val_if_fail (window != NULL, 0);
1988 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1990 if (GDK_WINDOW_DESTROYED (window))
1993 return GDK_WINDOW_OBJECT (window)->event_mask;
1997 gdk_window_set_events (GdkWindow *window,
1998 GdkEventMask event_mask)
2000 g_return_if_fail (window != NULL);
2001 g_return_if_fail (GDK_IS_WINDOW (window));
2003 if (GDK_WINDOW_DESTROYED (window))
2006 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2007 * set it here, too. Not that I know or remember why it is
2008 * necessary, will have to test some day.
2010 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2014 gdk_window_shape_combine_mask (GdkWindow *window,
2018 g_return_if_fail (window != NULL);
2019 g_return_if_fail (GDK_IS_WINDOW (window));
2023 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p none\n",
2024 GDK_WINDOW_HWND (window)));
2025 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2034 /* Convert mask bitmap to region */
2035 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2037 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p %p\n",
2038 GDK_WINDOW_HWND (window),
2039 GDK_WINDOW_HWND (mask)));
2041 /* SetWindowRgn wants window (not client) coordinates */
2042 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2043 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2044 GetClientRect (GDK_WINDOW_HWND (window), &rect);
2045 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
2046 OffsetRgn (hrgn, -rect.left, -rect.top);
2048 OffsetRgn (hrgn, x, y);
2050 /* If this is a top-level window, add the title bar to the region */
2051 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2053 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2054 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2058 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2063 gdk_window_set_override_redirect (GdkWindow *window,
2064 gboolean override_redirect)
2066 g_return_if_fail (window != NULL);
2067 g_return_if_fail (GDK_IS_WINDOW (window));
2069 g_warning ("gdk_window_set_override_redirect not implemented");
2073 gdk_window_set_icon_list (GdkWindow *window,
2076 g_return_if_fail (GDK_IS_WINDOW (window));
2078 if (GDK_WINDOW_DESTROYED (window))
2081 /* We could convert it to a hIcon and DrawIcon () it when getting
2082 * a WM_PAINT with IsIconic, but is it worth it ? Same probably
2083 * goes for gdk_window_set_icon (). Patches accepted :-) --hb
2084 * Or do we only need to deliver the Icon on WM_GETICON ?
2089 gdk_window_set_icon (GdkWindow *window,
2090 GdkWindow *icon_window,
2094 g_return_if_fail (window != NULL);
2095 g_return_if_fail (GDK_IS_WINDOW (window));
2097 if (GDK_WINDOW_DESTROYED (window))
2100 /* Nothing to do, really. As we share window classes between windows
2101 * we can't have window-specific icons, sorry. Don't print any warning
2107 gdk_window_set_icon_name (GdkWindow *window,
2110 g_return_if_fail (window != NULL);
2111 g_return_if_fail (GDK_IS_WINDOW (window));
2113 if (GDK_WINDOW_DESTROYED (window))
2116 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
2117 WIN32_API_FAILED ("SetWindowText");
2121 gdk_window_set_group (GdkWindow *window,
2124 g_return_if_fail (window != NULL);
2125 g_return_if_fail (GDK_IS_WINDOW (window));
2126 g_return_if_fail (leader != NULL);
2127 g_return_if_fail (GDK_IS_WINDOW (leader));
2129 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2132 g_warning ("gdk_window_set_group not implemented");
2136 gdk_window_set_decorations (GdkWindow *window,
2137 GdkWMDecoration decorations)
2141 g_return_if_fail (window != NULL);
2142 g_return_if_fail (GDK_IS_WINDOW (window));
2144 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p %s%s%s%s%s%s%s\n",
2145 GDK_WINDOW_HWND (window),
2146 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2147 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2148 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2149 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2150 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2151 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2152 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2154 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2156 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2157 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
2159 if (decorations & GDK_DECOR_ALL)
2160 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2161 if (decorations & GDK_DECOR_BORDER)
2162 style |= (WS_BORDER);
2163 if (decorations & GDK_DECOR_RESIZEH)
2164 style |= (WS_THICKFRAME);
2165 if (decorations & GDK_DECOR_TITLE)
2166 style |= (WS_CAPTION);
2167 if (decorations & GDK_DECOR_MENU)
2168 style |= (WS_SYSMENU);
2169 if (decorations & GDK_DECOR_MINIMIZE)
2170 style |= (WS_MINIMIZEBOX);
2171 if (decorations & GDK_DECOR_MAXIMIZE)
2172 style |= (WS_MAXIMIZEBOX);
2174 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2175 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2176 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2177 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2181 gdk_window_set_functions (GdkWindow *window,
2182 GdkWMFunction functions)
2186 g_return_if_fail (window != NULL);
2187 g_return_if_fail (GDK_IS_WINDOW (window));
2189 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p %s%s%s%s%s%s\n",
2190 GDK_WINDOW_HWND (window),
2191 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2192 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2193 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2194 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2195 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2196 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2198 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2200 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2201 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
2204 if (functions & GDK_FUNC_ALL)
2205 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2206 if (functions & GDK_FUNC_RESIZE)
2207 style |= (WS_THICKFRAME);
2208 if (functions & GDK_FUNC_MOVE)
2209 style |= (WS_THICKFRAME);
2210 if (functions & GDK_FUNC_MINIMIZE)
2211 style |= (WS_MINIMIZEBOX);
2212 if (functions & GDK_FUNC_MAXIMIZE)
2213 style |= (WS_MAXIMIZEBOX);
2215 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2216 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2217 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2218 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2222 QueryTree (HWND hwnd,
2232 child = GetWindow (hwnd, GW_CHILD);
2234 child = GetWindow (child, GW_HWNDNEXT);
2237 } while (child != NULL);
2241 *children = g_new (HWND, n);
2242 for (i = 0; i < n; i++)
2245 child = GetWindow (hwnd, GW_CHILD);
2247 child = GetWindow (child, GW_HWNDNEXT);
2248 *children[i] = child;
2254 gdk_propagate_shapes (HANDLE win,
2258 HRGN region, childRegion;
2262 SetRectEmpty (&emptyRect);
2263 region = CreateRectRgnIndirect (&emptyRect);
2265 GetWindowRgn (win, region);
2267 QueryTree (win, &list, &num);
2270 WINDOWPLACEMENT placement;
2272 placement.length = sizeof (WINDOWPLACEMENT);
2273 /* go through all child windows and combine regions */
2274 for (i = 0; i < num; i++)
2276 GetWindowPlacement (list[i], &placement);
2277 if (placement.showCmd == SW_SHOWNORMAL)
2279 childRegion = CreateRectRgnIndirect (&emptyRect);
2280 GetWindowRgn (list[i], childRegion);
2281 CombineRgn (region, region, childRegion, RGN_OR);
2282 DeleteObject (childRegion);
2285 SetWindowRgn (win, region, TRUE);
2289 DeleteObject (region);
2293 gdk_window_set_child_shapes (GdkWindow *window)
2295 g_return_if_fail (window != NULL);
2296 g_return_if_fail (GDK_IS_WINDOW (window));
2298 if (GDK_WINDOW_DESTROYED (window))
2301 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2305 gdk_window_merge_child_shapes (GdkWindow *window)
2307 g_return_if_fail (window != NULL);
2308 g_return_if_fail (GDK_IS_WINDOW (window));
2310 if (GDK_WINDOW_DESTROYED (window))
2313 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2317 gdk_window_set_static_gravities (GdkWindow *window,
2318 gboolean use_static)
2320 GdkWindowObject *private = (GdkWindowObject *)window;
2322 g_return_val_if_fail (window != NULL, FALSE);
2323 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2325 if (!use_static == !private->guffaw_gravity)
2331 private->guffaw_gravity = use_static;
2337 * Setting window states
2340 gdk_window_iconify (GdkWindow *window)
2342 g_return_if_fail (window != NULL);
2343 g_return_if_fail (GDK_IS_WINDOW (window));
2345 if (GDK_WINDOW_DESTROYED (window))
2348 if (GDK_WINDOW_IS_MAPPED (window))
2350 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2354 /* Flip our client side flag, the real work happens on map. */
2355 gdk_synthesize_window_state (window,
2357 GDK_WINDOW_STATE_ICONIFIED);
2362 gdk_window_deiconify (GdkWindow *window)
2364 g_return_if_fail (window != NULL);
2365 g_return_if_fail (GDK_IS_WINDOW (window));
2367 if (GDK_WINDOW_DESTROYED (window))
2370 if (GDK_WINDOW_IS_MAPPED (window))
2372 gdk_window_show (window);
2376 /* Flip our client side flag, the real work happens on map. */
2377 gdk_synthesize_window_state (window,
2378 GDK_WINDOW_STATE_ICONIFIED,
2384 gdk_window_stick (GdkWindow *window)
2386 g_return_if_fail (GDK_IS_WINDOW (window));
2388 if (GDK_WINDOW_DESTROYED (window))
2391 if (GDK_WINDOW_IS_MAPPED (window))
2393 /* "stick" means stick to all desktops _and_ do not scroll with the
2394 * viewport. i.e. glue to the monitor glass in all cases.
2396 g_warning ("gdk_window_stick (%p) ???", GDK_WINDOW_HWND (window));
2400 /* Flip our client side flag, the real work happens on map. */
2401 gdk_synthesize_window_state (window,
2403 GDK_WINDOW_STATE_STICKY);
2408 gdk_window_unstick (GdkWindow *window)
2410 g_return_if_fail (GDK_IS_WINDOW (window));
2412 if (GDK_WINDOW_DESTROYED (window))
2415 if (GDK_WINDOW_IS_MAPPED (window))
2417 g_warning ("gdk_window_unstick (%p) ???", GDK_WINDOW_HWND (window));
2421 /* Flip our client side flag, the real work happens on map. */
2422 gdk_synthesize_window_state (window,
2423 GDK_WINDOW_STATE_STICKY,
2429 gdk_window_maximize (GdkWindow *window)
2431 g_return_if_fail (GDK_IS_WINDOW (window));
2433 if (GDK_WINDOW_DESTROYED (window))
2436 if (GDK_WINDOW_IS_MAPPED (window))
2437 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2439 gdk_synthesize_window_state (window,
2441 GDK_WINDOW_STATE_MAXIMIZED);
2445 gdk_window_unmaximize (GdkWindow *window)
2447 g_return_if_fail (GDK_IS_WINDOW (window));
2449 if (GDK_WINDOW_DESTROYED (window))
2452 if (GDK_WINDOW_IS_MAPPED (window))
2453 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2455 gdk_synthesize_window_state (window,
2456 GDK_WINDOW_STATE_MAXIMIZED,
2461 gdk_window_fullscreen (GdkWindow *window)
2463 g_return_if_fail (GDK_IS_WINDOW (window));
2465 g_warning ("gdk_window_fullscreen() not implemented.\n");
2469 gdk_window_unfullscreen (GdkWindow *window)
2471 g_return_if_fail (GDK_IS_WINDOW (window));
2475 gdk_window_focus (GdkWindow *window,
2478 g_return_if_fail (GDK_IS_WINDOW (window));
2480 if (GDK_WINDOW_DESTROYED (window))
2483 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p\n", GDK_WINDOW_HWND (window)));
2485 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
2486 SetFocus (GDK_WINDOW_HWND (window));
2490 gdk_window_set_modal_hint (GdkWindow *window,
2493 GdkWindowObject *private;
2495 g_return_if_fail (window != NULL);
2496 g_return_if_fail (GDK_IS_WINDOW (window));
2498 if (GDK_WINDOW_DESTROYED (window))
2501 private = (GdkWindowObject*) window;
2503 private->modal_hint = modal;
2505 if (GDK_WINDOW_IS_MAPPED (window))
2506 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
2507 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
2508 WIN32_API_FAILED ("SetWindowPos");
2512 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2513 gboolean skips_taskbar)
2515 g_return_if_fail (GDK_IS_WINDOW (window));
2519 gdk_window_set_skip_pager_hint (GdkWindow *window,
2520 gboolean skips_pager)
2522 g_return_if_fail (GDK_IS_WINDOW (window));
2526 gdk_window_set_type_hint (GdkWindow *window,
2527 GdkWindowTypeHint hint)
2529 g_return_if_fail (window != NULL);
2530 g_return_if_fail (GDK_IS_WINDOW (window));
2532 if (GDK_WINDOW_DESTROYED (window))
2537 case GDK_WINDOW_TYPE_HINT_DIALOG:
2539 case GDK_WINDOW_TYPE_HINT_MENU:
2541 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
2544 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
2546 case GDK_WINDOW_TYPE_HINT_NORMAL:
2552 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p\n",
2553 GDK_WINDOW_HWND (window)));
2557 gdk_window_shape_combine_region (GdkWindow *window,
2558 GdkRegion *shape_region,
2562 g_return_if_fail (GDK_IS_WINDOW (window));
2564 if (GDK_WINDOW_DESTROYED (window))
2567 /* XXX: even on X implemented conditional ... */
2571 gdk_window_begin_resize_drag (GdkWindow *window,
2578 g_return_if_fail (GDK_IS_WINDOW (window));
2580 if (GDK_WINDOW_DESTROYED (window))
2583 /* XXX: isn't all this default on win32 ... */
2587 gdk_window_begin_move_drag (GdkWindow *window,
2593 g_return_if_fail (GDK_IS_WINDOW (window));
2595 if (GDK_WINDOW_DESTROYED (window))
2598 /* XXX: isn't all this default on win32 ... */
2602 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2604 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
2606 return gdk_window_lookup (anid);