1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-2004 Tor Lillqvist
4 * Copyright (C) 2001-2004 Hans Breuer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
23 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
24 * file for a list of people on the GTK+ Team. See the ChangeLog
25 * files for a list of changes. These files are distributed with
26 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
32 #include "gdk.h" /* gdk_rectangle_intersect */
33 #include "gdkevents.h"
34 #include "gdkpixmap.h"
35 #include "gdkwindow.h"
36 #include "gdkdisplay.h"
37 #include "gdkprivate-win32.h"
38 #include "gdkinput-win32.h"
40 #if defined(_MSC_VER) && (WINVER < 0x0500)
41 #define GetAncestor(hwnd,what) _gdk_win32_get_ancestor_parent(hwnd)
44 _gdk_win32_get_ancestor_parent (HWND hwnd)
49 typedef HWND (WINAPI *PFN_GetAncestor) (HWND,UINT);
50 static PFN_GetAncestor p_GetAncestor = NULL;
51 static gboolean once = FALSE;
57 user32 = GetModuleHandle ("user32.dll");
58 p_GetAncestor = (PFN_GetAncestor)GetProcAddress (user32, "GetAncestor");
62 return p_GetAncestor (hwnd, GA_PARENT);
63 else /* not completely right, but better than nothing ? */
64 return GetParent (hwnd);
70 #include <gdk-pixbuf/gdk-pixbuf.h>
74 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
75 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
77 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
80 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
81 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
82 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
83 static void gdk_window_impl_win32_finalize (GObject *object);
85 static gpointer parent_class = NULL;
87 #define WINDOW_IS_TOPLEVEL(window) \
88 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
89 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
92 _gdk_window_impl_win32_get_type (void)
94 static GType object_type = 0;
98 static const GTypeInfo object_info =
100 sizeof (GdkWindowImplWin32Class),
101 (GBaseInitFunc) NULL,
102 (GBaseFinalizeFunc) NULL,
103 (GClassInitFunc) gdk_window_impl_win32_class_init,
104 NULL, /* class_finalize */
105 NULL, /* class_data */
106 sizeof (GdkWindowImplWin32),
108 (GInstanceInitFunc) gdk_window_impl_win32_init,
111 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
112 "GdkWindowImplWin32",
120 _gdk_window_impl_get_type (void)
122 return _gdk_window_impl_win32_get_type ();
126 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
130 impl->toplevel_window_type = -1;
131 impl->hcursor = NULL;
132 impl->hicon_big = NULL;
133 impl->hicon_small = NULL;
134 impl->hint_flags = 0;
135 impl->extension_events_selected = FALSE;
139 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
141 GObjectClass *object_class = G_OBJECT_CLASS (klass);
142 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
144 parent_class = g_type_class_peek_parent (klass);
146 object_class->finalize = gdk_window_impl_win32_finalize;
148 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
149 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
150 drawable_class->get_size = gdk_window_impl_win32_get_size;
152 /* Visible and clip regions are the same */
153 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
154 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
158 gdk_window_impl_win32_finalize (GObject *object)
160 GdkWindowObject *wrapper;
161 GdkDrawableImplWin32 *draw_impl;
162 GdkWindowImplWin32 *window_impl;
164 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
166 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
167 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
169 wrapper = (GdkWindowObject*) draw_impl->wrapper;
171 if (!GDK_WINDOW_DESTROYED (wrapper))
173 gdk_win32_handle_table_remove (draw_impl->handle);
176 if (window_impl->hcursor != NULL)
178 if (GetCursor () == window_impl->hcursor)
180 GDI_CALL (DestroyCursor, (window_impl->hcursor));
181 window_impl->hcursor = NULL;
183 if (window_impl->hicon_big != NULL)
185 GDI_CALL (DestroyIcon, (window_impl->hicon_big));
186 window_impl->hicon_big = NULL;
188 if (window_impl->hicon_small != NULL)
190 GDI_CALL (DestroyIcon, (window_impl->hicon_small));
191 window_impl->hicon_small = NULL;
194 G_OBJECT_CLASS (parent_class)->finalize (object);
198 _gdk_win32_adjust_client_rect (GdkWindow *window,
203 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
204 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
205 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
209 _gdk_win32_get_adjusted_client_rect (GdkWindow *window,
212 GetClientRect (GDK_WINDOW_HWND (window), rect);
213 _gdk_win32_adjust_client_rect (window, rect);
217 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
219 GdkDrawableImplWin32 *drawable_impl;
221 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
223 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
225 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
226 drawable_impl->colormap == NULL)
228 drawable_impl->colormap =
229 gdk_screen_get_system_colormap (gdk_drawable_get_screen (drawable));
230 g_object_ref (drawable_impl->colormap);
233 return drawable_impl->colormap;
237 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
240 GdkWindowImplWin32 *impl;
241 GdkDrawableImplWin32 *draw_impl;
243 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
245 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
246 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
249 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
254 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
259 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
263 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
266 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
268 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
272 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
274 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
275 GdkRectangle result_rect;
280 result_rect.width = impl->width;
281 result_rect.height = impl->height;
283 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
285 /* take this win32 specific part into account (smaller when obscured) */
286 hdc = GetDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (impl));
290 if (SIMPLEREGION == GetClipBox (hdc, &r))
294 gr.x = r.left + impl->position_info.x_offset;
295 gr.y = r.top + impl->position_info.y_offset;
296 gr.width = r.right - r.left;
297 gr.height = r.bottom - r.top;
299 gdk_rectangle_intersect (&result_rect, &gr, &result_rect);
301 ReleaseDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (drawable), hdc);
304 return gdk_region_rectangle (&result_rect);
308 _gdk_root_window_size_init (void)
310 GdkWindowImplWin32 *impl;
314 impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) _gdk_root)->impl);
315 rect = _gdk_monitors[0];
316 for (i = 1; i < _gdk_num_monitors; i++)
317 gdk_rectangle_union (&rect, _gdk_monitors+i, &rect);
319 impl->width = rect.width;
320 impl->height = rect.height;
324 _gdk_windowing_window_init (void)
326 GdkWindowObject *private;
327 GdkDrawableImplWin32 *draw_impl;
329 g_assert (_gdk_root == NULL);
331 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
332 private = (GdkWindowObject *)_gdk_root;
333 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
335 draw_impl->handle = GetDesktopWindow ();
336 draw_impl->wrapper = GDK_DRAWABLE (private);
337 draw_impl->colormap = gdk_colormap_get_system ();
338 g_object_ref (draw_impl->colormap);
340 private->window_type = GDK_WINDOW_ROOT;
341 private->depth = gdk_visual_get_system ()->depth;
343 _gdk_root_window_size_init ();
345 _gdk_window_init_position (GDK_WINDOW (private));
347 gdk_win32_handle_table_insert ((HANDLE *) &draw_impl->handle, _gdk_root);
349 GDK_NOTE (MISC, g_print ("_gdk_root=%p\n", GDK_WINDOW_HWND (_gdk_root)));
353 get_default_title (void)
356 title = g_get_application_name ();
358 title = g_get_prgname ();
364 * is a wrapper function for RegisterWindowClassEx.
365 * It creates at least one unique class for every
366 * GdkWindowType. If support for single window-specific icons
367 * is ever needed (e.g Dialog specific), every such window should
371 RegisterGdkClass (GdkWindowType wtype)
373 static ATOM klassTOPLEVEL = 0;
374 static ATOM klassDIALOG = 0;
375 static ATOM klassCHILD = 0;
376 static ATOM klassTEMP = 0;
377 static HICON hAppIcon = NULL;
378 static WNDCLASSEX wcl;
381 wcl.cbSize = sizeof (WNDCLASSEX);
382 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
383 * on WM_SIZE and WM_MOVE. Flicker, Performance!
385 wcl.lpfnWndProc = _gdk_win32_window_procedure;
388 wcl.hInstance = _gdk_app_hmodule;
390 /* initialize once! */
393 gchar sLoc [MAX_PATH+1];
395 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
397 hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
400 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
401 hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
405 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
408 wcl.lpszMenuName = NULL;
411 /* initialize once per class */
413 * HB: Setting the background brush leads to flicker, because we
414 * don't get asked how to clear the background. This is not what
415 * we want, at least not for input_only windows ...
417 #define ONCE_PER_CLASS() \
418 wcl.hIcon = CopyIcon (hAppIcon); \
419 wcl.hIconSm = CopyIcon (hAppIcon); \
420 wcl.hbrBackground = NULL; \
421 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
425 case GDK_WINDOW_TOPLEVEL:
426 if (0 == klassTOPLEVEL)
428 wcl.lpszClassName = "gdkWindowToplevel";
431 klassTOPLEVEL = RegisterClassEx (&wcl);
433 klass = klassTOPLEVEL;
436 case GDK_WINDOW_CHILD:
439 wcl.lpszClassName = "gdkWindowChild";
441 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
443 klassCHILD = RegisterClassEx (&wcl);
448 case GDK_WINDOW_DIALOG:
449 if (0 == klassDIALOG)
451 wcl.lpszClassName = "gdkWindowDialog";
452 wcl.style |= CS_SAVEBITS;
454 klassDIALOG = RegisterClassEx (&wcl);
459 case GDK_WINDOW_TEMP:
462 wcl.lpszClassName = "gdkWindowTemp";
463 wcl.style |= CS_SAVEBITS;
465 klassTEMP = RegisterClassEx (&wcl);
471 g_assert_not_reached ();
477 WIN32_API_FAILED ("RegisterClassEx");
478 g_error ("That is a fatal error");
484 gdk_window_new_internal (GdkWindow *parent,
485 GdkWindowAttr *attributes,
486 gint attributes_mask,
487 gboolean from_set_skip_taskbar_hint)
492 DWORD dwStyle = 0, dwExStyle;
495 GdkWindow *orig_parent;
496 GdkWindowObject *private;
497 GdkWindowImplWin32 *impl;
498 GdkDrawableImplWin32 *draw_impl;
503 gint window_width, window_height;
504 gint offset_x = 0, offset_y = 0;
506 g_return_val_if_fail (attributes != NULL, NULL);
510 screen = gdk_screen_get_default ();
514 screen = gdk_drawable_get_screen (parent);
516 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
518 orig_parent = parent;
521 g_print ("gdk_window_new: %s\n",
522 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
523 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
524 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
525 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
528 if (GDK_WINDOW_DESTROYED (parent))
531 hparent = GDK_WINDOW_HWND (parent);
533 window = g_object_new (GDK_TYPE_WINDOW, NULL);
534 private = (GdkWindowObject *)window;
535 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
536 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
537 draw_impl->wrapper = GDK_DRAWABLE (window);
539 /* Windows with a foreign parent are treated as if they are children
540 * of the root window, except for actual creation.
542 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
545 private->parent = (GdkWindowObject *)parent;
547 private->accept_focus = TRUE;
548 private->focus_on_map = TRUE;
550 if (attributes_mask & GDK_WA_X)
551 private->x = attributes->x;
555 if (attributes_mask & GDK_WA_Y)
556 private->y = attributes->y;
557 else if (attributes_mask & GDK_WA_X)
558 private->y = 100; /* ??? We must put it somewhere... */
562 if (attributes_mask & GDK_WA_VISUAL)
563 visual = attributes->visual;
565 visual = gdk_visual_get_system ();
567 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
568 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
569 impl->extension_events_selected = FALSE;
570 if (attributes->wclass == GDK_INPUT_ONLY)
572 /* Backwards compatiblity - we've always ignored
573 * attributes->window_type for input-only windows
576 if (parent == _gdk_root)
577 private->window_type = GDK_WINDOW_TEMP;
579 private->window_type = GDK_WINDOW_CHILD;
582 private->window_type = attributes->window_type;
584 if (attributes->wclass == GDK_INPUT_OUTPUT)
588 private->input_only = FALSE;
589 private->depth = visual->depth;
591 if (attributes_mask & GDK_WA_COLORMAP)
593 draw_impl->colormap = attributes->colormap;
594 g_object_ref (attributes->colormap);
598 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
599 g_object_ref (draw_impl->colormap);
604 dwExStyle = WS_EX_TRANSPARENT;
606 private->input_only = TRUE;
607 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
608 g_object_ref (draw_impl->colormap);
609 GDK_NOTE (MISC, g_print ("... GDK_INPUT_ONLY, system colormap"));
612 switch (private->window_type)
614 case GDK_WINDOW_TOPLEVEL:
615 case GDK_WINDOW_DIALOG:
616 if (parent != _gdk_root)
618 g_warning (G_STRLOC ": Toplevel windows must be created as children\n"
619 "of a window of type GDK_WINDOW_ROOT or GDK_WINDOW_FOREIGN");
620 hparent = GetDesktopWindow ();
622 /* Children of foreign windows aren't toplevel windows */
623 if (GDK_WINDOW_TYPE (orig_parent) == GDK_WINDOW_FOREIGN)
625 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN;
629 if (private->window_type == GDK_WINDOW_TOPLEVEL)
630 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
632 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
634 offset_x = _gdk_offset_x;
635 offset_y = _gdk_offset_y;
639 case GDK_WINDOW_CHILD:
640 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
643 case GDK_WINDOW_TEMP:
644 /* A temp window is not necessarily a top level window */
645 dwStyle = (_gdk_root == parent ? WS_POPUP : WS_CHILDWINDOW);
646 dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
647 dwExStyle |= WS_EX_TOOLWINDOW;
648 offset_x = _gdk_offset_x;
649 offset_y = _gdk_offset_y;
652 case GDK_WINDOW_ROOT:
653 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
657 g_assert_not_reached ();
660 _gdk_window_init_position (GDK_WINDOW (private));
662 if (private->window_type != GDK_WINDOW_CHILD)
664 rect.left = rect.top = 0;
665 rect.right = impl->position_info.width;
666 rect.bottom = impl->position_info.height;
668 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
670 window_width = rect.right - rect.left;
671 window_height = rect.bottom - rect.top;
675 window_width = impl->position_info.width;
676 window_height = impl->position_info.height;
679 if (attributes_mask & GDK_WA_TITLE)
680 title = attributes->title;
682 title = get_default_title ();
683 if (!title || !*title)
686 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
689 private->parent->children = g_list_prepend (private->parent->children, window);
691 klass = RegisterGdkClass (private->window_type);
693 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
695 hwndNew = CreateWindowEx (dwExStyle,
696 MAKEINTRESOURCE(klass),
699 ((attributes_mask & GDK_WA_X) ?
700 impl->position_info.x - offset_x : CW_USEDEFAULT),
701 impl->position_info.y - offset_y,
702 window_width, window_height,
707 if (GDK_WINDOW_HWND (window) != hwndNew)
709 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
710 GDK_WINDOW_HWND (window),
713 /* HB: IHMO due to a race condition the handle was increased by
714 * one, which causes much trouble. Because I can't find the
715 * real bug, try to workaround it ...
716 * To reproduce: compile with MSVC 5, DEBUG=1
719 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
720 GDK_WINDOW_HWND (window) = hwndNew;
721 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
723 /* the old behaviour, but with warning */
724 draw_impl->handle = hwndNew;
729 g_object_ref (window);
730 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
732 GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@%+d%+d %p = %p\n",
734 window_width, window_height,
735 ((attributes_mask & GDK_WA_X) ?
736 impl->position_info.x - offset_x: CW_USEDEFAULT),
737 impl->position_info.y - offset_y,
739 GDK_WINDOW_HWND (window)));
743 if (draw_impl->handle == NULL)
745 WIN32_API_FAILED ("CreateWindowEx");
746 g_object_unref (window);
750 if (!from_set_skip_taskbar_hint && private->window_type == GDK_WINDOW_TEMP)
751 gdk_window_set_skip_taskbar_hint (window, TRUE);
753 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
754 (attributes->cursor) :
761 gdk_window_new (GdkWindow *parent,
762 GdkWindowAttr *attributes,
763 gint attributes_mask)
765 return gdk_window_new_internal (parent, attributes, attributes_mask, FALSE);
769 gdk_window_foreign_new_for_display (GdkDisplay *display,
770 GdkNativeWindow anid)
773 GdkWindowObject *private;
774 GdkWindowImplWin32 *impl;
775 GdkDrawableImplWin32 *draw_impl;
781 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
783 window = g_object_new (GDK_TYPE_WINDOW, NULL);
784 private = (GdkWindowObject *)window;
785 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
786 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
787 draw_impl->wrapper = GDK_DRAWABLE (window);
788 parent = GetParent ((HWND)anid);
790 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
791 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
792 private->parent = (GdkWindowObject *)_gdk_root;
794 private->parent->children = g_list_prepend (private->parent->children, window);
796 draw_impl->handle = (HWND) anid;
797 GetClientRect ((HWND) anid, &rect);
799 point.y = rect.right;
800 ClientToScreen ((HWND) anid, &point);
801 if (parent != GetDesktopWindow ())
802 ScreenToClient (parent, &point);
803 private->x = point.x;
804 private->y = point.y;
805 impl->width = rect.right - rect.left;
806 impl->height = rect.bottom - rect.top;
807 private->window_type = GDK_WINDOW_FOREIGN;
808 private->destroyed = FALSE;
809 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
810 if (IsWindowVisible ((HWND) anid))
811 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
813 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
814 if (GetWindowLong ((HWND)anid, GWL_EXSTYLE) & WS_EX_TOPMOST)
815 private->state |= GDK_WINDOW_STATE_ABOVE;
817 private->state &= (~GDK_WINDOW_STATE_ABOVE);
818 private->state &= (~GDK_WINDOW_STATE_BELOW);
820 private->depth = gdk_visual_get_system ()->depth;
822 _gdk_window_init_position (GDK_WINDOW (private));
824 g_object_ref (window);
825 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
827 GDK_NOTE (MISC, g_print ("gdk_window_foreign_new_for_display: %p: %s@%+d%+d\n",
829 _gdk_win32_drawable_description (window),
830 private->x, private->y));
836 gdk_window_lookup (GdkNativeWindow hwnd)
838 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
842 _gdk_windowing_window_destroy (GdkWindow *window,
844 gboolean foreign_destroy)
846 GdkWindowObject *private = (GdkWindowObject *)window;
848 g_return_if_fail (GDK_IS_WINDOW (window));
850 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy: %p\n",
851 GDK_WINDOW_HWND (window)));
853 if (private->extension_events != 0)
854 _gdk_input_window_destroy (window);
857 if (!recursing && !foreign_destroy)
859 _gdk_win32_drawable_finish (private->impl);
861 private->destroyed = TRUE;
862 DestroyWindow (GDK_WINDOW_HWND (window));
864 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
868 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
870 /* It's somebody else's window, but in our hierarchy, so reparent it
871 * to the desktop, and then try to destroy it.
873 gdk_window_hide (window);
874 gdk_window_reparent (window, NULL, 0, 0);
876 PostMessage (GDK_WINDOW_HWND (window), WM_CLOSE, 0, 0);
879 /* This function is called when the window really gone.
882 gdk_window_destroy_notify (GdkWindow *window)
884 g_return_if_fail (window != NULL);
885 g_return_if_fail (GDK_IS_WINDOW (window));
888 g_print ("gdk_window_destroy_notify: %p%s\n",
889 GDK_WINDOW_HWND (window),
890 (GDK_WINDOW_DESTROYED (window) ? " (destroyed)" : "")));
892 if (!GDK_WINDOW_DESTROYED (window))
894 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
895 g_warning ("window %p unexpectedly destroyed",
896 GDK_WINDOW_HWND (window));
898 _gdk_window_destroy (window, TRUE);
901 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
902 g_object_unref (window);
906 get_outer_rect (GdkWindow *window,
913 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
914 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
916 rect->left = rect->top = 0;
918 rect->bottom = height;
920 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
924 adjust_for_gravity_hints (GdkWindowImplWin32 *impl,
929 if (impl->hint_flags & GDK_HINT_WIN_GRAVITY)
931 gint orig_x = *x, orig_y = *y;
933 switch (impl->hints.win_gravity)
935 case GDK_GRAVITY_NORTH:
936 case GDK_GRAVITY_CENTER:
937 case GDK_GRAVITY_SOUTH:
938 *x -= (outer_rect->right - outer_rect->left) / 2;
939 *x += impl->width / 2;
942 case GDK_GRAVITY_SOUTH_EAST:
943 case GDK_GRAVITY_EAST:
944 case GDK_GRAVITY_NORTH_EAST:
945 *x -= outer_rect->right - outer_rect->left;
949 case GDK_GRAVITY_STATIC:
950 *x += outer_rect->left;
957 switch (impl->hints.win_gravity)
959 case GDK_GRAVITY_WEST:
960 case GDK_GRAVITY_CENTER:
961 case GDK_GRAVITY_EAST:
962 *y -= (outer_rect->bottom - outer_rect->top) / 2;
963 *y += impl->height / 2;
966 case GDK_GRAVITY_SOUTH_WEST:
967 case GDK_GRAVITY_SOUTH:
968 case GDK_GRAVITY_SOUTH_EAST:
969 *y -= outer_rect->bottom - outer_rect->top;
973 case GDK_GRAVITY_STATIC:
974 *y += outer_rect->top;
981 (orig_x != *x || orig_y != *y) ?
982 g_print ("adjust_for_gravity_hints: x: %d->%d, y: %d->%d\n",
983 orig_x, *x, orig_y, *y)
989 show_window_internal (GdkWindow *window,
993 GdkWindowObject *private;
994 HWND old_active_window;
995 gboolean focus_on_map = TRUE;
997 private = (GdkWindowObject *) window;
999 if (private->destroyed)
1002 GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
1003 GDK_WINDOW_HWND (window),
1004 _gdk_win32_window_state_to_string (private->state),
1005 (raise ? " raise" : ""),
1006 (deiconify ? " deiconify" : "")));
1008 /* If asked to show (not deiconify) an withdrawn and iconified
1012 !GDK_WINDOW_IS_MAPPED (window) &&
1013 (private->state & GDK_WINDOW_STATE_ICONIFIED))
1015 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
1019 /* If asked to just show an iconified window, do nothing. */
1020 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
1023 /* If asked to deiconify an already noniconified window, do
1024 * nothing. (Especially, don't cause the window to rise and
1025 * activate. There are different calls for that.)
1027 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
1030 /* If asked to show (but not raise) a window that is already
1031 * visible, do nothing.
1033 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
1038 if (!GDK_WINDOW_IS_MAPPED (window))
1040 gdk_synthesize_window_state (window,
1041 GDK_WINDOW_STATE_WITHDRAWN,
1043 focus_on_map = private->focus_on_map;
1046 /* Use SetWindowPos to show transparent windows so automatic redraws
1047 * in other windows can be suppressed.
1049 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1051 UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE;
1053 flags |= SWP_NOZORDER;
1054 if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1055 flags |= SWP_NOACTIVATE;
1057 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags);
1061 old_active_window = GetActiveWindow ();
1063 if (private->state & (GDK_WINDOW_STATE_BELOW | GDK_WINDOW_STATE_ABOVE))
1065 DWORD exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1067 if (private->state & GDK_WINDOW_STATE_BELOW)
1068 exstyle &= (~WS_EX_TOPMOST);
1069 if (private->state & GDK_WINDOW_STATE_ABOVE)
1070 exstyle |= WS_EX_TOPMOST;
1072 API_CALL (SetWindowLong, (GDK_WINDOW_HWND (window), GWL_EXSTYLE, exstyle));
1075 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1076 gdk_window_fullscreen (window);
1077 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1078 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
1079 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1080 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
1081 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1082 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
1084 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
1088 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
1089 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
1091 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
1092 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL ||
1093 GDK_WINDOW_TYPE (window) == GDK_WINDOW_DIALOG)
1094 SetForegroundWindow (GDK_WINDOW_HWND (window));
1096 BringWindowToTop (GDK_WINDOW_HWND (window));
1098 else if (old_active_window != GDK_WINDOW_HWND (window))
1099 SetActiveWindow (old_active_window);
1103 gdk_window_show_unraised (GdkWindow *window)
1105 g_return_if_fail (GDK_IS_WINDOW (window));
1107 show_window_internal (window, FALSE, FALSE);
1111 gdk_window_show (GdkWindow *window)
1113 g_return_if_fail (GDK_IS_WINDOW (window));
1115 show_window_internal (window, TRUE, FALSE);
1119 gdk_window_hide (GdkWindow *window)
1121 GdkWindowObject *private;
1123 g_return_if_fail (window != NULL);
1125 private = (GdkWindowObject*) window;
1126 if (private->destroyed)
1129 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n",
1130 GDK_WINDOW_HWND (window),
1131 _gdk_win32_window_state_to_string (private->state)));
1133 if (GDK_WINDOW_IS_MAPPED (window))
1134 gdk_synthesize_window_state (window,
1136 GDK_WINDOW_STATE_WITHDRAWN);
1138 _gdk_window_clear_update_area (window);
1140 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1141 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
1143 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1145 SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM,
1147 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
1151 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
1156 gdk_window_withdraw (GdkWindow *window)
1158 GdkWindowObject *private;
1160 g_return_if_fail (window != NULL);
1162 private = (GdkWindowObject*) window;
1163 if (private->destroyed)
1166 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n",
1167 GDK_WINDOW_HWND (window),
1168 _gdk_win32_window_state_to_string (private->state)));
1170 gdk_window_hide (window); /* ??? */
1174 gdk_window_move (GdkWindow *window,
1178 GdkWindowObject *private = (GdkWindowObject *)window;
1179 GdkWindowImplWin32 *impl;
1181 g_return_if_fail (window != NULL);
1182 g_return_if_fail (GDK_IS_WINDOW (window));
1184 if (GDK_WINDOW_DESTROYED (window))
1187 GDK_NOTE (MISC, g_print ("gdk_window_move: %p: %+d%+d\n",
1188 GDK_WINDOW_HWND (window), x, y));
1190 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1192 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1195 /* Don't check GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD.
1196 * Foreign windows (another app's windows) might be children of our
1197 * windows! Especially in the case of gtkplug/socket.
1199 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1200 _gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
1205 get_outer_rect (window, impl->width, impl->height, &outer_rect);
1207 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1209 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,0,0,"
1210 "NOACTIVATE|NOSIZE|NOZORDER)\n",
1211 GDK_WINDOW_HWND (window),
1212 x - _gdk_offset_x, y - _gdk_offset_y));
1214 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1215 x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
1216 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
1221 gdk_window_resize (GdkWindow *window,
1225 GdkWindowObject *private = (GdkWindowObject*) window;
1226 GdkWindowImplWin32 *impl;
1228 g_return_if_fail (window != NULL);
1229 g_return_if_fail (GDK_IS_WINDOW (window));
1231 if (GDK_WINDOW_DESTROYED (window))
1239 GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
1240 GDK_WINDOW_HWND (window), width, height));
1242 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1244 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1247 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1248 _gdk_window_move_resize_child (window, private->x, private->y, width, height);
1252 get_outer_rect (window, width, height, &outer_rect);
1254 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,0,0,%ld,%ld,"
1255 "NOACTIVATE|NOMOVE|NOZORDER)\n",
1256 GDK_WINDOW_HWND (window),
1257 outer_rect.right - outer_rect.left,
1258 outer_rect.bottom - outer_rect.top));
1260 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1262 outer_rect.right - outer_rect.left,
1263 outer_rect.bottom - outer_rect.top,
1264 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
1265 private->resize_count += 1;
1270 gdk_window_move_resize (GdkWindow *window,
1276 GdkWindowObject *private = (GdkWindowObject*) window;
1277 GdkWindowImplWin32 *impl;
1279 g_return_if_fail (window != NULL);
1280 g_return_if_fail (GDK_IS_WINDOW (window));
1282 if (GDK_WINDOW_DESTROYED (window))
1290 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1292 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1295 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@%+d%+d\n",
1296 GDK_WINDOW_HWND (window),
1297 width, height, x, y));
1299 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1300 _gdk_window_move_resize_child (window, x, y, width, height);
1305 get_outer_rect (window, width, height, &outer_rect);
1307 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1309 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,%ld,%ld,"
1310 "NOACTIVATE|NOZORDER)\n",
1311 GDK_WINDOW_HWND (window),
1312 x - _gdk_offset_x, y - _gdk_offset_y,
1313 outer_rect.right - outer_rect.left,
1314 outer_rect.bottom - outer_rect.top));
1316 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1317 x - _gdk_offset_x, y - _gdk_offset_y,
1318 outer_rect.right - outer_rect.left,
1319 outer_rect.bottom - outer_rect.top,
1320 SWP_NOACTIVATE | SWP_NOZORDER));
1325 gdk_window_reparent (GdkWindow *window,
1326 GdkWindow *new_parent,
1330 GdkWindowObject *window_private;
1331 GdkWindowObject *parent_private;
1332 GdkWindowObject *old_parent_private;
1333 GdkWindowImplWin32 *impl;
1334 gboolean was_toplevel;
1337 g_return_if_fail (window != NULL);
1338 g_return_if_fail (GDK_IS_WINDOW (window));
1339 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1340 g_return_if_fail (window != _gdk_root);
1342 if (GDK_WINDOW_DESTROYED (window) ||
1343 (new_parent && GDK_WINDOW_DESTROYED (new_parent)))
1349 new_parent = _gdk_root;
1351 window_private = (GdkWindowObject*) window;
1352 old_parent_private = (GdkWindowObject *) window_private->parent;
1353 parent_private = (GdkWindowObject*) new_parent;
1354 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1356 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n",
1357 GDK_WINDOW_HWND (window),
1358 GDK_WINDOW_HWND (new_parent)));
1360 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1362 was_toplevel = GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) == GetDesktopWindow ();
1363 if (was_toplevel && new_parent != _gdk_root)
1365 /* Reparenting from top-level (child of desktop). Clear out
1368 style &= ~(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
1370 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1372 else if (new_parent == _gdk_root)
1374 /* Reparenting to top-level. Add decorations. */
1375 style &= ~(WS_CHILD);
1376 style |= WS_OVERLAPPEDWINDOW;
1377 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1380 API_CALL (SetParent, (GDK_WINDOW_HWND (window),
1381 GDK_WINDOW_HWND (new_parent)));
1383 API_CALL (MoveWindow, (GDK_WINDOW_HWND (window),
1384 x, y, impl->width, impl->height, TRUE));
1386 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1389 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1390 new_parent = _gdk_root;
1392 window_private->parent = (GdkWindowObject *)new_parent;
1394 /* Switch the window type as appropriate */
1396 switch (GDK_WINDOW_TYPE (new_parent))
1398 case GDK_WINDOW_ROOT:
1399 if (impl->toplevel_window_type != -1)
1400 GDK_WINDOW_TYPE (window) = impl->toplevel_window_type;
1401 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD)
1402 GDK_WINDOW_TYPE (window) = GDK_WINDOW_TOPLEVEL;
1405 case GDK_WINDOW_TOPLEVEL:
1406 case GDK_WINDOW_CHILD:
1407 case GDK_WINDOW_DIALOG:
1408 case GDK_WINDOW_TEMP:
1409 if (WINDOW_IS_TOPLEVEL (window))
1411 /* Save the original window type so we can restore it if the
1412 * window is reparented back to be a toplevel.
1414 impl->toplevel_window_type = GDK_WINDOW_TYPE (window);
1415 GDK_WINDOW_TYPE (window) = GDK_WINDOW_CHILD;
1419 if (old_parent_private)
1420 old_parent_private->children =
1421 g_list_remove (old_parent_private->children, window);
1423 parent_private->children = g_list_prepend (parent_private->children, window);
1424 _gdk_window_init_position (GDK_WINDOW (window_private));
1428 _gdk_windowing_window_clear_area (GdkWindow *window,
1434 GdkWindowImplWin32 *impl;
1436 g_return_if_fail (window != NULL);
1437 g_return_if_fail (GDK_IS_WINDOW (window));
1439 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1441 if (!GDK_WINDOW_DESTROYED (window))
1446 width = impl->width - x;
1448 height = impl->height - y;
1449 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
1451 GDK_WINDOW_HWND (window),
1452 width, height, x, y));
1453 hdc = GetDC (GDK_WINDOW_HWND (window));
1454 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1455 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1456 GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
1461 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1467 g_return_if_fail (window != NULL);
1468 g_return_if_fail (GDK_IS_WINDOW (window));
1470 if (!GDK_WINDOW_DESTROYED (window))
1474 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
1476 GDK_WINDOW_HWND (window),
1477 width, height, x, y));
1480 rect.right = x + width + 1;
1482 rect.bottom = y + height + 1;
1483 GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
1484 UpdateWindow (GDK_WINDOW_HWND (window));
1489 gdk_window_raise (GdkWindow *window)
1491 g_return_if_fail (window != NULL);
1492 g_return_if_fail (GDK_IS_WINDOW (window));
1494 if (!GDK_WINDOW_DESTROYED (window))
1496 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1497 GDK_WINDOW_HWND (window)));
1499 API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window)));
1504 gdk_window_lower (GdkWindow *window)
1506 g_return_if_fail (window != NULL);
1507 g_return_if_fail (GDK_IS_WINDOW (window));
1509 if (!GDK_WINDOW_DESTROYED (window))
1511 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n"
1512 "... SetWindowPos(%p,HWND_BOTTOM,0,0,0,0,"
1513 "NOACTIVATE|NOMOVE|NOSIZE)\n",
1514 GDK_WINDOW_HWND (window),
1515 GDK_WINDOW_HWND (window)));
1517 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM,
1519 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1524 gdk_window_set_hints (GdkWindow *window,
1533 /* Note that this function is obsolete */
1535 GdkWindowImplWin32 *impl;
1537 g_return_if_fail (window != NULL);
1538 g_return_if_fail (GDK_IS_WINDOW (window));
1540 if (GDK_WINDOW_DESTROYED (window))
1543 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1545 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @%+d%+d\n",
1546 GDK_WINDOW_HWND (window),
1547 min_width, min_height, max_width, max_height,
1555 geom.min_width = min_width;
1556 geom.min_height = min_height;
1557 geom.max_width = max_width;
1558 geom.max_height = max_height;
1560 if (flags & GDK_HINT_MIN_SIZE)
1561 geom_mask |= GDK_HINT_MIN_SIZE;
1563 if (flags & GDK_HINT_MAX_SIZE)
1564 geom_mask |= GDK_HINT_MAX_SIZE;
1566 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1571 gdk_window_set_urgency_hint (GdkWindow *window,
1574 #if (WINVER >= 0x0500)
1576 FLASHWINFO flashwinfo;
1578 g_return_if_fail (GDK_IS_WINDOW (window));
1579 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
1581 if (GDK_WINDOW_DESTROYED (window))
1584 flashwinfo.cbSize = sizeof (flashwinfo);
1585 flashwinfo.hwnd = GDK_WINDOW_HWND (window);
1587 flashwinfo.dwFlags = FLASHW_ALL | FLASHW_TIMER;
1589 flashwinfo.dwFlags = FLASHW_STOP;
1590 flashwinfo.uCount = 0;
1591 flashwinfo.dwTimeout = 0;
1593 FlashWindowEx (&flashwinfo);
1602 } flashwindow = { sizeof(flashwindow), GDK_WINDOW_HWND (window), urgent ? 0x07 : 0x0, 0, 0 };
1603 typedef BOOL (*PFN_FlashWindowEx) (struct _FLASHWINDOW);
1604 PFN_FlashWindowEx flashWindowEx = NULL;
1605 gboolean once = TRUE;
1607 g_return_if_fail (GDK_IS_WINDOW (window));
1608 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
1610 if (GDK_WINDOW_DESTROYED (window))
1615 flashWindowEx = (PFN_FlashWindowEx)GetProcAddress (GetModuleHandle ("user32.dll"), "FlashWindowEx");
1619 flashWindowEx(flashwindow);
1621 FlashWindow (GDK_WINDOW_HWND (window), urgent);
1626 gdk_window_set_geometry_hints (GdkWindow *window,
1627 GdkGeometry *geometry,
1628 GdkWindowHints geom_mask)
1630 GdkWindowImplWin32 *impl;
1632 WINDOWPLACEMENT size_hints;
1634 gint new_width = 0, new_height = 0;
1637 g_return_if_fail (window != NULL);
1638 g_return_if_fail (GDK_IS_WINDOW (window));
1640 if (GDK_WINDOW_DESTROYED (window))
1643 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n",
1644 GDK_WINDOW_HWND (window)));
1646 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1648 impl->hint_flags = geom_mask;
1649 impl->hints = *geometry;
1651 if (geom_mask & GDK_HINT_POS)
1652 ; /* even the X11 mplementation doesn't care */
1654 if (geom_mask & GDK_HINT_MIN_SIZE)
1656 GDK_NOTE (MISC, g_print ("... MIN_SIZE: %dx%d\n",
1657 geometry->min_width, geometry->min_height));
1660 /* Check if the current size of the window is in bounds */
1661 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1663 if (rect.right < geometry->min_width &&
1664 rect.bottom < geometry->min_height)
1666 new_width = geometry->min_width;
1667 new_height = geometry->min_height;
1669 else if (rect.right < geometry->min_width)
1671 new_width = geometry->min_width;
1672 new_height = rect.bottom;
1674 else if (rect.bottom < geometry->min_height)
1676 new_width = rect.right;
1677 new_height = geometry->min_height;
1682 if (geom_mask & GDK_HINT_MAX_SIZE)
1684 GDK_NOTE (MISC, g_print ("... MAX_SIZE: %dx%d\n",
1685 geometry->max_width, geometry->max_height));
1688 /* Check if the current size of the window is in bounds */
1689 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1691 if (rect.right > geometry->max_width &&
1692 rect.bottom > geometry->max_height)
1694 new_width = geometry->max_width;
1695 new_height = geometry->max_height;
1697 else if (rect.right > geometry->max_width)
1699 new_width = geometry->max_width;
1700 new_height = rect.bottom;
1702 else if (rect.bottom > geometry->max_height)
1704 new_width = rect.right;
1705 new_height = geometry->max_height;
1711 /* Apply new size constraints */
1712 if (new_width != 0 && new_height != 0)
1713 gdk_window_resize (window, new_width, new_height);
1716 if (geom_mask & GDK_HINT_BASE_SIZE)
1718 GDK_NOTE (MISC, g_print ("... BASE_SIZE: %dx%d\n",
1719 geometry->base_width, geometry->base_height));
1722 size_hints.length = sizeof (size_hints);
1724 if (API_CALL (GetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints)))
1727 g_print ("... rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1728 size_hints.rcNormalPosition.left,
1729 size_hints.rcNormalPosition.top,
1730 size_hints.rcNormalPosition.right,
1731 size_hints.rcNormalPosition.bottom));
1732 size_hints.rcNormalPosition.right =
1733 size_hints.rcNormalPosition.left + geometry->base_width;
1734 size_hints.rcNormalPosition.bottom =
1735 size_hints.rcNormalPosition.top + geometry->base_height;
1736 GDK_NOTE (MISC, g_print ("... setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1737 size_hints.rcNormalPosition.left,
1738 size_hints.rcNormalPosition.top,
1739 size_hints.rcNormalPosition.right,
1740 size_hints.rcNormalPosition.bottom));
1741 API_CALL (SetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints));
1746 if (geom_mask & GDK_HINT_RESIZE_INC)
1748 GDK_NOTE (MISC, g_print ("... RESIZE_INC: (%d,%d)\n",
1749 geometry->width_inc, geometry->height_inc));
1752 if (geom_mask & GDK_HINT_ASPECT)
1754 GDK_NOTE (MISC, g_print ("... ASPECT: %g--%g\n",
1755 geometry->min_aspect, geometry->max_aspect));
1758 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1760 GDK_NOTE (MISC, g_print ("... GRAVITY: %d\n", geometry->win_gravity));
1765 gdk_window_set_title (GdkWindow *window,
1768 g_return_if_fail (GDK_IS_WINDOW (window));
1769 g_return_if_fail (title != NULL);
1771 if (GDK_WINDOW_DESTROYED (window))
1774 /* Empty window titles not allowed, so set it to just a period. */
1778 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p: %s\n",
1779 GDK_WINDOW_HWND (window), title));
1781 if (G_WIN32_HAVE_WIDECHAR_API ())
1783 wchar_t *wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
1784 API_CALL (SetWindowTextW, (GDK_WINDOW_HWND (window), wtitle));
1789 char *cptitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1790 API_CALL (SetWindowTextA, (GDK_WINDOW_HWND (window), cptitle));
1796 gdk_window_set_role (GdkWindow *window,
1799 g_return_if_fail (window != NULL);
1800 g_return_if_fail (GDK_IS_WINDOW (window));
1802 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p: %s\n",
1803 GDK_WINDOW_HWND (window),
1804 (role ? role : "NULL")));
1809 gdk_window_set_transient_for (GdkWindow *window,
1812 HWND window_id, parent_id;
1814 g_return_if_fail (window != NULL);
1815 g_return_if_fail (GDK_IS_WINDOW (window));
1817 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p: %p\n",
1818 GDK_WINDOW_HWND (window),
1819 GDK_WINDOW_HWND (parent)));
1821 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1824 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1826 GDK_NOTE (MISC, g_print ("... a child window!\n"));
1830 window_id = GDK_WINDOW_HWND (window);
1831 parent_id = GDK_WINDOW_HWND (parent);
1833 /* This changes the *owner* of the window, despite the misleading
1834 * name. (Owner and parent are unrelated concepts.) At least that's
1835 * what people who seem to know what they talk about say on
1836 * USENET. Search on Google.
1839 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1840 GetLastError () != 0)
1841 WIN32_API_FAILED ("SetWindowLong");
1845 gdk_window_set_background (GdkWindow *window,
1846 const GdkColor *color)
1848 GdkWindowObject *private = (GdkWindowObject *)window;
1850 g_return_if_fail (window != NULL);
1851 g_return_if_fail (GDK_IS_WINDOW (window));
1853 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
1854 GDK_WINDOW_HWND (window),
1855 _gdk_win32_color_to_string (color)));
1857 private->bg_color = *color;
1859 if (private->bg_pixmap &&
1860 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1861 private->bg_pixmap != GDK_NO_BG)
1863 g_object_unref (private->bg_pixmap);
1864 private->bg_pixmap = NULL;
1869 gdk_window_set_back_pixmap (GdkWindow *window,
1871 gint parent_relative)
1873 GdkWindowObject *private = (GdkWindowObject *)window;
1875 g_return_if_fail (window != NULL);
1876 g_return_if_fail (GDK_IS_WINDOW (window));
1877 g_return_if_fail (pixmap == NULL || !parent_relative);
1878 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1880 if (pixmap && !gdk_drawable_get_colormap (pixmap))
1882 g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
1886 if (private->bg_pixmap &&
1887 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1888 private->bg_pixmap != GDK_NO_BG)
1889 g_object_unref (private->bg_pixmap);
1891 if (parent_relative)
1893 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1894 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1900 g_object_ref (pixmap);
1901 private->bg_pixmap = pixmap;
1905 private->bg_pixmap = GDK_NO_BG;
1911 gdk_window_set_cursor (GdkWindow *window,
1914 GdkWindowImplWin32 *impl;
1915 GdkCursorPrivate *cursor_private;
1916 GdkWindowObject *parent_window;
1918 HCURSOR hprevcursor;
1920 g_return_if_fail (window != NULL);
1921 g_return_if_fail (GDK_IS_WINDOW (window));
1923 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1924 cursor_private = (GdkCursorPrivate*) cursor;
1926 if (GDK_WINDOW_DESTROYED (window))
1932 hcursor = cursor_private->hcursor;
1934 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p: %p\n",
1935 GDK_WINDOW_HWND (window),
1938 /* First get the old cursor, if any (we wait to free the old one
1939 * since it may be the current cursor set in the Win32 API right
1942 hprevcursor = impl->hcursor;
1944 if (hcursor == NULL)
1945 impl->hcursor = NULL;
1948 /* We must copy the cursor as it is OK to destroy the GdkCursor
1949 * while still in use for some window. See for instance
1950 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1951 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1954 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1955 WIN32_API_FAILED ("CopyCursor");
1956 GDK_NOTE (MISC, g_print ("... CopyCursor (%p) = %p\n",
1957 hcursor, impl->hcursor));
1960 if (impl->hcursor != NULL)
1962 /* If the pointer is over our window, set new cursor */
1963 GdkWindow *curr_window = gdk_window_get_pointer (window, NULL, NULL, NULL);
1964 if (curr_window == window)
1965 SetCursor (impl->hcursor);
1968 /* Climb up the tree and find whether our window is the
1969 * first ancestor that has cursor defined, and if so, set
1972 GdkWindowObject *curr_window_obj = GDK_WINDOW_OBJECT (curr_window);
1973 while (curr_window_obj &&
1974 !GDK_WINDOW_IMPL_WIN32 (curr_window_obj->impl)->hcursor)
1976 curr_window_obj = curr_window_obj->parent;
1977 if (curr_window_obj == GDK_WINDOW_OBJECT (window))
1979 SetCursor (impl->hcursor);
1986 /* Destroy the previous cursor: Need to make sure it's no longer in
1987 * use before we destroy it, in case we're not over our window but
1988 * the cursor is still set to our old one.
1990 if (hprevcursor != NULL)
1992 if (GetCursor() == hprevcursor)
1994 /* Look for a suitable cursor to use instead */
1996 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1997 while (hcursor == NULL)
2001 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
2002 hcursor = impl->hcursor;
2003 parent_window = parent_window->parent;
2007 hcursor = LoadCursor (NULL, IDC_ARROW);
2010 SetCursor (hcursor);
2013 GDK_NOTE (MISC, g_print ("... DestroyCursor (%p)\n", hprevcursor));
2015 API_CALL (DestroyCursor, (hprevcursor));
2020 gdk_window_get_geometry (GdkWindow *window,
2027 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
2032 if (!GDK_WINDOW_DESTROYED (window))
2036 API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
2038 if (window != _gdk_root)
2041 GdkWindow *parent = gdk_window_get_parent (window);
2045 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
2046 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
2052 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
2053 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
2057 if (parent == _gdk_root)
2059 rect.left += _gdk_offset_x;
2060 rect.top += _gdk_offset_y;
2061 rect.right += _gdk_offset_x;
2062 rect.bottom += _gdk_offset_y;
2071 *width = rect.right - rect.left;
2073 *height = rect.bottom - rect.top;
2075 *depth = gdk_drawable_get_visual (window)->depth;
2077 GDK_NOTE (MISC, g_print ("gdk_window_get_geometry: %p: %ldx%ldx%d@%+ld%+ld\n",
2078 GDK_WINDOW_HWND (window),
2079 rect.right - rect.left, rect.bottom - rect.top,
2080 gdk_drawable_get_visual (window)->depth,
2081 rect.left, rect.top));
2086 gdk_window_get_origin (GdkWindow *window,
2094 g_return_val_if_fail (window != NULL, 0);
2096 if (!GDK_WINDOW_DESTROYED (window))
2102 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
2111 *x = tx + _gdk_offset_x;
2113 *y = ty + _gdk_offset_y;
2115 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: %+d%+d\n",
2116 GDK_WINDOW_HWND (window),
2122 gdk_window_get_deskrelative_origin (GdkWindow *window,
2126 return gdk_window_get_origin (window, x, y);
2130 gdk_window_get_root_origin (GdkWindow *window,
2136 g_return_if_fail (GDK_IS_WINDOW (window));
2138 gdk_window_get_frame_extents (window, &rect);
2146 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: %+d%+d\n",
2147 GDK_WINDOW_HWND (window), rect.x, rect.y));
2151 gdk_window_get_frame_extents (GdkWindow *window,
2154 GdkWindowObject *private;
2158 g_return_if_fail (GDK_IS_WINDOW (window));
2159 g_return_if_fail (rect != NULL);
2161 private = GDK_WINDOW_OBJECT (window);
2168 if (GDK_WINDOW_DESTROYED (window))
2171 /* FIXME: window is documented to be a toplevel GdkWindow, so is it really
2172 * necessary to walk its parent chain?
2174 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2175 private = (GdkWindowObject*) private->parent;
2177 hwnd = GDK_WINDOW_HWND (window);
2178 API_CALL (GetWindowRect, (hwnd, &r));
2180 rect->x = r.left + _gdk_offset_x;
2181 rect->y = r.top + _gdk_offset_y;
2182 rect->width = r.right - r.left;
2183 rect->height = r.bottom - r.top;
2185 GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@%+ld%+ld\n",
2186 GDK_WINDOW_HWND (window),
2187 r.right - r.left, r.bottom - r.top,
2192 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2196 GdkModifierType *mask)
2198 GdkWindow *return_val;
2199 POINT screen_point, point;
2203 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2206 GetCursorPos (&screen_point);
2207 point = screen_point;
2208 ScreenToClient (GDK_WINDOW_HWND (window), &point);
2213 if (window == _gdk_root)
2215 *x += _gdk_offset_x;
2216 *y += _gdk_offset_y;
2219 hwnd = WindowFromPoint (screen_point);
2222 gboolean done = FALSE;
2226 point = screen_point;
2227 ScreenToClient (hwnd, &point);
2228 hwndc = ChildWindowFromPoint (hwnd, point);
2231 else if (hwndc == hwnd)
2237 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
2242 GetKeyboardState (kbd);
2244 if (kbd[VK_SHIFT] & 0x80)
2245 *mask |= GDK_SHIFT_MASK;
2246 if (kbd[VK_CAPITAL] & 0x80)
2247 *mask |= GDK_LOCK_MASK;
2248 if (kbd[VK_CONTROL] & 0x80)
2249 *mask |= GDK_CONTROL_MASK;
2250 if (kbd[VK_MENU] & 0x80)
2251 *mask |= GDK_MOD1_MASK;
2252 if (kbd[VK_LBUTTON] & 0x80)
2253 *mask |= GDK_BUTTON1_MASK;
2254 if (kbd[VK_MBUTTON] & 0x80)
2255 *mask |= GDK_BUTTON2_MASK;
2256 if (kbd[VK_RBUTTON] & 0x80)
2257 *mask |= GDK_BUTTON3_MASK;
2263 _gdk_windowing_get_pointer (GdkDisplay *display,
2267 GdkModifierType *mask)
2269 GdkScreen *default_screen = gdk_display_get_default_screen (display);
2270 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
2272 *screen = default_screen;
2273 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
2277 gdk_display_warp_pointer (GdkDisplay *display,
2282 SetCursorPos (x, y);
2286 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2291 POINT point, pointc;
2295 GetCursorPos (&pointc);
2297 hwnd = WindowFromPoint (point);
2302 *win_x = pointc.x + _gdk_offset_x;
2303 *win_y = pointc.y + _gdk_offset_y;
2307 ScreenToClient (hwnd, &point);
2310 hwndc = ChildWindowFromPoint (hwnd, point);
2311 ClientToScreen (hwnd, &point);
2312 ScreenToClient (hwndc, &point);
2313 } while (hwndc != hwnd && (hwnd = hwndc, 1));
2315 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
2317 if (window && (win_x || win_y))
2319 GetClientRect (hwnd, &rect);
2320 *win_x = point.x - rect.left;
2321 *win_y = point.y - rect.top;
2324 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: %+d%+d %p%s\n",
2327 (window == NULL ? " NULL" : "")));
2333 gdk_window_get_events (GdkWindow *window)
2335 g_return_val_if_fail (window != NULL, 0);
2336 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2338 if (GDK_WINDOW_DESTROYED (window))
2341 return GDK_WINDOW_OBJECT (window)->event_mask;
2345 gdk_window_set_events (GdkWindow *window,
2346 GdkEventMask event_mask)
2348 g_return_if_fail (window != NULL);
2349 g_return_if_fail (GDK_IS_WINDOW (window));
2351 if (GDK_WINDOW_DESTROYED (window))
2354 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2355 * set it here, too. Not that I know or remember why it is
2356 * necessary, will have to test some day.
2358 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2362 gdk_window_shape_combine_mask (GdkWindow *window,
2366 g_return_if_fail (window != NULL);
2367 g_return_if_fail (GDK_IS_WINDOW (window));
2371 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
2372 GDK_WINDOW_HWND (window)));
2373 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2380 /* Convert mask bitmap to region */
2381 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2383 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n",
2384 GDK_WINDOW_HWND (window),
2385 GDK_WINDOW_HWND (mask)));
2387 _gdk_win32_get_adjusted_client_rect (window, &rect);
2389 OffsetRgn (hrgn, -rect.left, -rect.top);
2390 OffsetRgn (hrgn, x, y);
2392 /* If this is a top-level window, add the title bar to the region */
2393 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2395 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2396 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2400 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2405 gdk_window_set_override_redirect (GdkWindow *window,
2406 gboolean override_redirect)
2408 g_return_if_fail (window != NULL);
2409 g_return_if_fail (GDK_IS_WINDOW (window));
2411 g_warning ("gdk_window_set_override_redirect not implemented");
2415 gdk_window_set_accept_focus (GdkWindow *window,
2416 gboolean accept_focus)
2418 GdkWindowObject *private;
2419 g_return_if_fail (window != NULL);
2420 g_return_if_fail (GDK_IS_WINDOW (window));
2422 private = (GdkWindowObject *)window;
2424 accept_focus = accept_focus != FALSE;
2426 if (private->accept_focus != accept_focus)
2427 private->accept_focus = accept_focus;
2431 gdk_window_set_focus_on_map (GdkWindow *window,
2432 gboolean focus_on_map)
2434 GdkWindowObject *private;
2435 g_return_if_fail (window != NULL);
2436 g_return_if_fail (GDK_IS_WINDOW (window));
2438 private = (GdkWindowObject *)window;
2440 focus_on_map = focus_on_map != FALSE;
2442 if (private->focus_on_map != focus_on_map)
2443 private->focus_on_map = focus_on_map;
2447 gdk_window_set_icon_list (GdkWindow *window,
2450 GdkPixbuf *pixbuf, *big_pixbuf, *small_pixbuf;
2451 gint big_diff, small_diff;
2452 gint big_w, big_h, small_w, small_h;
2455 HICON small_hicon, big_hicon;
2456 GdkWindowImplWin32 *impl;
2457 gint i, big_i, small_i;
2459 g_return_if_fail (GDK_IS_WINDOW (window));
2461 if (GDK_WINDOW_DESTROYED (window))
2464 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
2466 /* ideal sizes for small and large icons */
2467 big_w = GetSystemMetrics (SM_CXICON);
2468 big_h = GetSystemMetrics (SM_CYICON);
2469 small_w = GetSystemMetrics (SM_CXSMICON);
2470 small_h = GetSystemMetrics (SM_CYSMICON);
2472 /* find closest sized icons in the list */
2474 small_pixbuf = NULL;
2480 pixbuf = (GdkPixbuf*) pixbufs->data;
2481 w = gdk_pixbuf_get_width (pixbuf);
2482 h = gdk_pixbuf_get_height (pixbuf);
2484 dw = ABS (w - big_w);
2485 dh = ABS (h - big_h);
2486 diff = dw*dw + dh*dh;
2487 if (big_pixbuf == NULL || diff < big_diff)
2489 big_pixbuf = pixbuf;
2494 dw = ABS(w - small_w);
2495 dh = ABS(h - small_h);
2496 diff = dw*dw + dh*dh;
2497 if (small_pixbuf == NULL || diff < small_diff)
2499 small_pixbuf = pixbuf;
2504 pixbufs = g_list_next (pixbufs);
2508 /* Create the icons */
2509 big_hicon = _gdk_win32_pixbuf_to_hicon (big_pixbuf);
2510 small_hicon = _gdk_win32_pixbuf_to_hicon (small_pixbuf);
2513 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG,
2515 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_SMALL,
2516 (LPARAM)small_hicon);
2518 /* Store the icons, destroying any previous icons */
2519 if (impl->hicon_big)
2520 GDI_CALL (DestroyIcon, (impl->hicon_big));
2521 impl->hicon_big = big_hicon;
2522 if (impl->hicon_small)
2523 GDI_CALL (DestroyIcon, (impl->hicon_small));
2524 impl->hicon_small = small_hicon;
2528 gdk_window_set_icon (GdkWindow *window,
2529 GdkWindow *icon_window,
2533 g_return_if_fail (window != NULL);
2534 g_return_if_fail (GDK_IS_WINDOW (window));
2536 /* do nothing, use gdk_window_set_icon_list instead */
2540 gdk_window_set_icon_name (GdkWindow *window,
2543 g_return_if_fail (window != NULL);
2544 g_return_if_fail (GDK_IS_WINDOW (window));
2546 if (GDK_WINDOW_DESTROYED (window))
2549 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));
2553 gdk_window_get_group (GdkWindow *window)
2555 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
2556 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2558 if (GDK_WINDOW_DESTROYED (window))
2561 g_warning ("gdk_window_get_group not yet implemented");
2567 gdk_window_set_group (GdkWindow *window,
2570 g_return_if_fail (window != NULL);
2571 g_return_if_fail (GDK_IS_WINDOW (window));
2572 g_return_if_fail (leader != NULL);
2573 g_return_if_fail (GDK_IS_WINDOW (leader));
2575 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2578 g_warning ("gdk_window_set_group not implemented");
2582 gdk_window_set_decorations (GdkWindow *window,
2583 GdkWMDecoration decorations)
2586 const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
2588 g_return_if_fail (window != NULL);
2589 g_return_if_fail (GDK_IS_WINDOW (window));
2591 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s%s%s%s%s%s%s\n",
2592 GDK_WINDOW_HWND (window),
2593 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2594 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2595 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2596 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2597 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2598 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2599 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2601 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2605 if (decorations & GDK_DECOR_BORDER)
2607 if (decorations & GDK_DECOR_RESIZEH)
2608 bits |= WS_THICKFRAME;
2609 if (decorations & GDK_DECOR_TITLE)
2611 if (decorations & GDK_DECOR_MENU)
2613 if (decorations & GDK_DECOR_MINIMIZE)
2614 bits |= WS_MINIMIZEBOX;
2615 if (decorations & GDK_DECOR_MAXIMIZE)
2616 bits |= WS_MAXIMIZEBOX;
2618 if (decorations & GDK_DECOR_ALL)
2619 style |= settable_bits, style &= ~bits;
2621 style &= ~settable_bits, style |= bits;
2623 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2624 SetWindowPos (GDK_WINDOW_HWND (window), NULL,
2626 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2627 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2631 gdk_window_get_decorations(GdkWindow *window,
2632 GdkWMDecoration *decorations)
2634 LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2638 if (style & WS_BORDER)
2639 *decorations |= GDK_DECOR_BORDER;
2640 if (style & WS_THICKFRAME)
2641 *decorations |= GDK_DECOR_RESIZEH;
2642 if (style & WS_CAPTION)
2643 *decorations |= GDK_DECOR_TITLE;
2644 if (style & WS_SYSMENU)
2645 *decorations |= GDK_DECOR_MENU;
2646 if (style & WS_MINIMIZEBOX)
2647 *decorations |= GDK_DECOR_MINIMIZE;
2648 if (style & WS_MAXIMIZEBOX)
2649 *decorations |= GDK_DECOR_MAXIMIZE;
2651 return *decorations != 0;
2655 gdk_window_set_functions (GdkWindow *window,
2656 GdkWMFunction functions)
2659 const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU);
2661 g_return_if_fail (window != NULL);
2662 g_return_if_fail (GDK_IS_WINDOW (window));
2664 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p: %s%s%s%s%s%s\n",
2665 GDK_WINDOW_HWND (window),
2666 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2667 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2668 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2669 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2670 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2671 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2673 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2677 if (functions & GDK_FUNC_RESIZE)
2678 bits |= WS_THICKFRAME;
2679 if (functions & GDK_FUNC_MOVE)
2680 bits |= (WS_THICKFRAME|WS_SYSMENU);
2681 if (functions & GDK_FUNC_MINIMIZE)
2682 bits |= WS_MINIMIZEBOX;
2683 if (functions & GDK_FUNC_MAXIMIZE)
2684 bits |= WS_MAXIMIZEBOX;
2685 if (functions & GDK_FUNC_CLOSE)
2688 if (functions & GDK_FUNC_ALL)
2689 style |= settable_bits, style &= ~bits;
2691 style &= ~settable_bits, style |= bits;
2693 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2694 SetWindowPos (GDK_WINDOW_HWND (window), NULL,
2696 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2697 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2701 QueryTree (HWND hwnd,
2711 child = GetWindow (hwnd, GW_CHILD);
2713 child = GetWindow (child, GW_HWNDNEXT);
2716 } while (child != NULL);
2720 *children = g_new (HWND, n);
2721 for (i = 0; i < n; i++)
2724 child = GetWindow (hwnd, GW_CHILD);
2726 child = GetWindow (child, GW_HWNDNEXT);
2727 *children[i] = child;
2733 gdk_propagate_shapes (HANDLE win,
2737 HRGN region, childRegion;
2741 SetRectEmpty (&emptyRect);
2742 region = CreateRectRgnIndirect (&emptyRect);
2744 GetWindowRgn (win, region);
2746 QueryTree (win, &list, &num);
2749 WINDOWPLACEMENT placement;
2751 placement.length = sizeof (WINDOWPLACEMENT);
2752 /* go through all child windows and combine regions */
2753 for (i = 0; i < num; i++)
2755 GetWindowPlacement (list[i], &placement);
2756 if (placement.showCmd == SW_SHOWNORMAL)
2758 childRegion = CreateRectRgnIndirect (&emptyRect);
2759 GetWindowRgn (list[i], childRegion);
2760 CombineRgn (region, region, childRegion, RGN_OR);
2761 DeleteObject (childRegion);
2764 SetWindowRgn (win, region, TRUE);
2768 DeleteObject (region);
2772 gdk_window_set_child_shapes (GdkWindow *window)
2774 g_return_if_fail (window != NULL);
2775 g_return_if_fail (GDK_IS_WINDOW (window));
2777 if (GDK_WINDOW_DESTROYED (window))
2780 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2784 gdk_window_merge_child_shapes (GdkWindow *window)
2786 g_return_if_fail (window != NULL);
2787 g_return_if_fail (GDK_IS_WINDOW (window));
2789 if (GDK_WINDOW_DESTROYED (window))
2792 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2796 gdk_window_set_static_gravities (GdkWindow *window,
2797 gboolean use_static)
2799 g_return_val_if_fail (window != NULL, FALSE);
2800 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2806 gdk_window_begin_resize_drag (GdkWindow *window,
2815 g_return_if_fail (GDK_IS_WINDOW (window));
2817 if (GDK_WINDOW_DESTROYED (window))
2820 /* Tell Windows to start interactively resizing the window by pretending that
2821 * the left pointer button was clicked in the suitable edge or corner. This
2822 * will only work if the button is down when this function is called, and
2823 * will only work with button 1 (left), since Windows only allows window
2824 * dragging using the left mouse button */
2828 /* Must break the automatic grab that occured when the button was pressed,
2829 * otherwise it won't work */
2830 gdk_display_pointer_ungrab (gdk_display_get_default (), 0);
2834 case GDK_WINDOW_EDGE_NORTH_WEST:
2835 winedge = HTTOPLEFT;
2838 case GDK_WINDOW_EDGE_NORTH:
2842 case GDK_WINDOW_EDGE_NORTH_EAST:
2843 winedge = HTTOPRIGHT;
2846 case GDK_WINDOW_EDGE_WEST:
2850 case GDK_WINDOW_EDGE_EAST:
2854 case GDK_WINDOW_EDGE_SOUTH_WEST:
2855 winedge = HTBOTTOMLEFT;
2858 case GDK_WINDOW_EDGE_SOUTH:
2862 case GDK_WINDOW_EDGE_SOUTH_EAST:
2864 winedge = HTBOTTOMRIGHT;
2868 DefWindowProc (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, winedge,
2869 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2873 gdk_window_begin_move_drag (GdkWindow *window,
2879 g_return_if_fail (GDK_IS_WINDOW (window));
2881 if (GDK_WINDOW_DESTROYED (window))
2884 /* Tell Windows to start interactively moving the window by pretending that
2885 * the left pointer button was clicked in the titlebar. This will only work
2886 * if the button is down when this function is called, and will only work
2887 * with button 1 (left), since Windows only allows window dragging using the
2888 * left mouse button */
2892 /* Must break the automatic grab that occured when the button was pressed,
2893 * otherwise it won't work */
2894 gdk_display_pointer_ungrab (gdk_display_get_default (), 0);
2896 DefWindowProc (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, HTCAPTION,
2897 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2902 * Setting window states
2905 gdk_window_iconify (GdkWindow *window)
2907 HWND old_active_window;
2909 g_return_if_fail (window != NULL);
2910 g_return_if_fail (GDK_IS_WINDOW (window));
2912 if (GDK_WINDOW_DESTROYED (window))
2915 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p: %s\n",
2916 GDK_WINDOW_HWND (window),
2917 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2919 if (GDK_WINDOW_IS_MAPPED (window))
2921 old_active_window = GetActiveWindow ();
2922 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2923 if (old_active_window != GDK_WINDOW_HWND (window))
2924 SetActiveWindow (old_active_window);
2928 gdk_synthesize_window_state (window,
2930 GDK_WINDOW_STATE_ICONIFIED);
2935 gdk_window_deiconify (GdkWindow *window)
2937 g_return_if_fail (window != NULL);
2938 g_return_if_fail (GDK_IS_WINDOW (window));
2940 if (GDK_WINDOW_DESTROYED (window))
2943 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p: %s\n",
2944 GDK_WINDOW_HWND (window),
2945 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2947 if (GDK_WINDOW_IS_MAPPED (window))
2949 show_window_internal (window, FALSE, TRUE);
2953 gdk_synthesize_window_state (window,
2954 GDK_WINDOW_STATE_ICONIFIED,
2960 gdk_window_stick (GdkWindow *window)
2962 g_return_if_fail (GDK_IS_WINDOW (window));
2964 if (GDK_WINDOW_DESTROYED (window))
2967 /* FIXME: Do something? */
2971 gdk_window_unstick (GdkWindow *window)
2973 g_return_if_fail (GDK_IS_WINDOW (window));
2975 if (GDK_WINDOW_DESTROYED (window))
2978 /* FIXME: Do something? */
2982 gdk_window_maximize (GdkWindow *window)
2984 g_return_if_fail (GDK_IS_WINDOW (window));
2986 if (GDK_WINDOW_DESTROYED (window))
2989 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p: %s\n",
2990 GDK_WINDOW_HWND (window),
2991 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2993 if (GDK_WINDOW_IS_MAPPED (window))
2994 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2996 gdk_synthesize_window_state (window,
2998 GDK_WINDOW_STATE_MAXIMIZED);
3002 gdk_window_unmaximize (GdkWindow *window)
3004 g_return_if_fail (GDK_IS_WINDOW (window));
3006 if (GDK_WINDOW_DESTROYED (window))
3009 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p: %s\n",
3010 GDK_WINDOW_HWND (window),
3011 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3013 if (GDK_WINDOW_IS_MAPPED (window))
3014 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
3016 gdk_synthesize_window_state (window,
3017 GDK_WINDOW_STATE_MAXIMIZED,
3021 typedef struct _FullscreenInfo FullscreenInfo;
3023 struct _FullscreenInfo
3031 gdk_window_fullscreen (GdkWindow *window)
3035 GdkWindowObject *private = (GdkWindowObject *) window;
3037 g_return_if_fail (GDK_IS_WINDOW (window));
3039 fi = g_new (FullscreenInfo, 1);
3041 if (!GetWindowRect (GDK_WINDOW_HWND (window), &(fi->r)))
3045 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3047 width = GetSystemMetrics (SM_CXSCREEN);
3048 height = GetSystemMetrics (SM_CYSCREEN);
3050 /* remember for restoring */
3051 fi->hint_flags = impl->hint_flags;
3052 impl->hint_flags &= ~GDK_HINT_MAX_SIZE;
3053 g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
3054 fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
3056 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3057 (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
3059 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_TOP,
3060 0, 0, width, height,
3061 SWP_NOCOPYBITS | SWP_SHOWWINDOW));
3063 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
3068 gdk_window_unfullscreen (GdkWindow *window)
3071 GdkWindowObject *private = (GdkWindowObject *) window;
3073 g_return_if_fail (GDK_IS_WINDOW (window));
3075 fi = g_object_get_data (G_OBJECT(window), "fullscreen-info");
3078 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3080 impl->hint_flags = fi->hint_flags;
3081 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
3082 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
3083 fi->r.left, fi->r.top,
3084 fi->r.right - fi->r.left, fi->r.bottom - fi->r.top,
3085 SWP_NOCOPYBITS | SWP_SHOWWINDOW));
3087 g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
3090 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
3095 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
3097 g_return_if_fail (GDK_IS_WINDOW (window));
3099 if (GDK_WINDOW_DESTROYED (window))
3102 if (GDK_WINDOW_IS_MAPPED (window))
3104 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3105 setting ? HWND_TOPMOST : HWND_NOTOPMOST,
3107 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE));
3110 gdk_synthesize_window_state (window,
3111 setting ? GDK_WINDOW_STATE_BELOW : GDK_WINDOW_STATE_ABOVE,
3112 setting ? GDK_WINDOW_STATE_ABOVE : 0);
3116 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
3118 g_return_if_fail (GDK_IS_WINDOW (window));
3120 if (GDK_WINDOW_DESTROYED (window))
3123 if (GDK_WINDOW_IS_MAPPED (window))
3125 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3126 setting ? HWND_BOTTOM : HWND_NOTOPMOST,
3128 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE));
3131 gdk_synthesize_window_state (window,
3132 setting ? GDK_WINDOW_STATE_ABOVE : GDK_WINDOW_STATE_BELOW,
3133 setting ? GDK_WINDOW_STATE_BELOW : 0);
3137 gdk_window_focus (GdkWindow *window,
3140 g_return_if_fail (GDK_IS_WINDOW (window));
3142 if (GDK_WINDOW_DESTROYED (window))
3145 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p: %s\n",
3146 GDK_WINDOW_HWND (window),
3147 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3149 if (((GdkWindowObject *) window)->state & GDK_WINDOW_STATE_MAXIMIZED)
3150 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
3152 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
3153 SetFocus (GDK_WINDOW_HWND (window));
3157 gdk_window_set_modal_hint (GdkWindow *window,
3160 GdkWindowObject *private;
3162 g_return_if_fail (window != NULL);
3163 g_return_if_fail (GDK_IS_WINDOW (window));
3165 if (GDK_WINDOW_DESTROYED (window))
3168 private = (GdkWindowObject*) window;
3170 private->modal_hint = modal;
3172 if (GDK_WINDOW_IS_MAPPED (window))
3173 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3174 modal ? HWND_TOPMOST : HWND_NOTOPMOST,
3176 SWP_NOMOVE | SWP_NOSIZE));
3180 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
3181 gboolean skips_taskbar)
3183 static GdkWindow *owner = NULL;
3186 g_return_if_fail (GDK_IS_WINDOW (window));
3188 GDK_NOTE (MISC, g_print ("gdk_window_set_skip_taskbar_hint: %p: %s\n",
3189 GDK_WINDOW_HWND (window),
3190 skips_taskbar ? "TRUE" : "FALSE"));
3196 wa.window_type = GDK_WINDOW_TEMP;
3197 wa.wclass = GDK_INPUT_OUTPUT;
3198 wa.width = wa.height = 1;
3200 owner = gdk_window_new_internal (NULL, &wa, 0, TRUE);
3203 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT,
3204 (long) GDK_WINDOW_HWND (owner));
3206 #if 0 /* Should we also turn off the minimize and maximize buttons? */
3207 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3208 GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE) & ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU));
3209 SetWindowPos (GDK_WINDOW_HWND (window), NULL,
3211 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
3212 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
3217 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT, 0);
3222 gdk_window_set_skip_pager_hint (GdkWindow *window,
3223 gboolean skips_pager)
3225 g_return_if_fail (GDK_IS_WINDOW (window));
3229 gdk_window_set_type_hint (GdkWindow *window,
3230 GdkWindowTypeHint hint)
3232 g_return_if_fail (window != NULL);
3233 g_return_if_fail (GDK_IS_WINDOW (window));
3235 if (GDK_WINDOW_DESTROYED (window))
3238 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p: %d\n",
3239 GDK_WINDOW_HWND (window), hint));
3242 case GDK_WINDOW_TYPE_HINT_DIALOG:
3244 case GDK_WINDOW_TYPE_HINT_MENU:
3245 gdk_window_set_decorations (window,
3248 GDK_DECOR_MINIMIZE |
3249 GDK_DECOR_MAXIMIZE);
3251 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
3252 gdk_window_set_skip_taskbar_hint (window, TRUE);
3254 case GDK_WINDOW_TYPE_HINT_UTILITY:
3256 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
3257 gdk_window_set_decorations (window,
3261 GDK_DECOR_MINIMIZE |
3262 GDK_DECOR_MAXIMIZE);
3264 case GDK_WINDOW_TYPE_HINT_DOCK:
3266 case GDK_WINDOW_TYPE_HINT_DESKTOP:
3269 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
3271 case GDK_WINDOW_TYPE_HINT_NORMAL:
3277 gdk_window_shape_combine_region (GdkWindow *window,
3278 GdkRegion *shape_region,
3282 g_return_if_fail (GDK_IS_WINDOW (window));
3284 if (GDK_WINDOW_DESTROYED (window))
3287 /* XXX: even on X implemented conditional ... */
3291 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
3293 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
3295 return gdk_window_lookup (anid);
3299 gdk_window_enable_synchronized_configure (GdkWindow *window)
3304 gdk_window_configure_finished (GdkWindow *window)