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/.
33 #include "gdkprivate-win32.h"
34 #include "gdkinput-win32.h"
37 #include <gdk-pixbuf/gdk-pixbuf.h>
41 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
42 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
44 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
47 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
48 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
49 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
50 static void gdk_window_impl_win32_finalize (GObject *object);
52 static gpointer parent_class = NULL;
54 static void update_style_bits (GdkWindow *window);
55 static gboolean _gdk_window_get_functions (GdkWindow *window,
56 GdkWMFunction *functions);
58 #define WINDOW_IS_TOPLEVEL(window) \
59 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
60 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
63 _gdk_window_impl_win32_get_type (void)
65 static GType object_type = 0;
69 static const GTypeInfo object_info =
71 sizeof (GdkWindowImplWin32Class),
73 (GBaseFinalizeFunc) NULL,
74 (GClassInitFunc) gdk_window_impl_win32_class_init,
75 NULL, /* class_finalize */
76 NULL, /* class_data */
77 sizeof (GdkWindowImplWin32),
79 (GInstanceInitFunc) gdk_window_impl_win32_init,
82 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
91 _gdk_window_impl_get_type (void)
93 return _gdk_window_impl_win32_get_type ();
97 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
101 impl->toplevel_window_type = -1;
102 impl->hcursor = NULL;
103 impl->hicon_big = NULL;
104 impl->hicon_small = NULL;
105 impl->hint_flags = 0;
106 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
107 impl->extension_events_selected = FALSE;
111 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
113 GObjectClass *object_class = G_OBJECT_CLASS (klass);
114 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
116 parent_class = g_type_class_peek_parent (klass);
118 object_class->finalize = gdk_window_impl_win32_finalize;
120 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
121 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
122 drawable_class->get_size = gdk_window_impl_win32_get_size;
124 /* Visible and clip regions are the same */
125 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
126 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
130 gdk_window_impl_win32_finalize (GObject *object)
132 GdkWindowObject *wrapper;
133 GdkDrawableImplWin32 *draw_impl;
134 GdkWindowImplWin32 *window_impl;
136 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
138 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
139 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
141 wrapper = (GdkWindowObject*) draw_impl->wrapper;
143 if (!GDK_WINDOW_DESTROYED (wrapper))
145 gdk_win32_handle_table_remove (draw_impl->handle);
148 if (window_impl->hcursor != NULL)
150 if (GetCursor () == window_impl->hcursor)
152 GDI_CALL (DestroyCursor, (window_impl->hcursor));
153 window_impl->hcursor = NULL;
155 if (window_impl->hicon_big != NULL)
157 GDI_CALL (DestroyIcon, (window_impl->hicon_big));
158 window_impl->hicon_big = NULL;
160 if (window_impl->hicon_small != NULL)
162 GDI_CALL (DestroyIcon, (window_impl->hicon_small));
163 window_impl->hicon_small = NULL;
166 G_OBJECT_CLASS (parent_class)->finalize (object);
170 _gdk_win32_adjust_client_rect (GdkWindow *window,
175 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
176 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
177 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
181 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
183 GdkDrawableImplWin32 *drawable_impl;
185 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
187 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
189 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
190 drawable_impl->colormap == NULL)
192 drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
193 g_object_ref (drawable_impl->colormap);
196 return drawable_impl->colormap;
200 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
203 GdkWindowImplWin32 *impl;
204 GdkDrawableImplWin32 *draw_impl;
206 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
208 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
209 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
212 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
217 g_print ("gdk_window_impl_win32_set_colormap: XXX\n");
222 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
226 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
229 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
231 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
235 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
237 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
238 GdkRectangle result_rect;
242 result_rect.width = impl->width;
243 result_rect.height = impl->height;
245 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
247 return gdk_region_rectangle (&result_rect);
251 _gdk_root_window_size_init (void)
253 GdkWindowImplWin32 *impl;
257 impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) _gdk_root)->impl);
258 rect = _gdk_monitors[0];
259 for (i = 1; i < _gdk_num_monitors; i++)
260 gdk_rectangle_union (&rect, _gdk_monitors+i, &rect);
262 impl->width = rect.width;
263 impl->height = rect.height;
267 _gdk_windowing_window_init (void)
269 GdkWindowObject *private;
270 GdkDrawableImplWin32 *draw_impl;
272 g_assert (_gdk_root == NULL);
274 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
275 private = (GdkWindowObject *)_gdk_root;
276 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
278 draw_impl->handle = GetDesktopWindow ();
279 draw_impl->wrapper = GDK_DRAWABLE (private);
280 draw_impl->colormap = gdk_screen_get_default_colormap (_gdk_screen);
281 g_object_ref (draw_impl->colormap);
283 private->window_type = GDK_WINDOW_ROOT;
284 private->depth = gdk_visual_get_system ()->depth;
286 _gdk_root_window_size_init ();
288 _gdk_window_init_position (GDK_WINDOW (private));
290 gdk_win32_handle_table_insert ((HANDLE *) &draw_impl->handle, _gdk_root);
292 GDK_NOTE (MISC, g_print ("_gdk_root=%p\n", GDK_WINDOW_HWND (_gdk_root)));
296 get_default_title (void)
299 title = g_get_application_name ();
301 title = g_get_prgname ();
307 * is a wrapper function for RegisterWindowClassEx.
308 * It creates at least one unique class for every
309 * GdkWindowType. If support for single window-specific icons
310 * is ever needed (e.g Dialog specific), every such window should
314 RegisterGdkClass (GdkWindowType wtype)
316 static ATOM klassTOPLEVEL = 0;
317 static ATOM klassDIALOG = 0;
318 static ATOM klassCHILD = 0;
319 static ATOM klassTEMP = 0;
320 static HICON hAppIcon = NULL;
321 static HICON hAppIconSm = NULL;
322 static WNDCLASSEXW wcl;
325 wcl.cbSize = sizeof (WNDCLASSEX);
326 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
327 * on WM_SIZE and WM_MOVE. Flicker, Performance!
329 wcl.lpfnWndProc = _gdk_win32_window_procedure;
332 wcl.hInstance = _gdk_app_hmodule;
335 /* initialize once! */
336 if (0 == hAppIcon && 0 == hAppIconSm)
338 gchar sLoc [MAX_PATH+1];
340 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
342 ExtractIconEx (sLoc, 0, &hAppIcon, &hAppIconSm, 1);
343 if (0 == hAppIcon && 0 == hAppIconSm)
345 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
346 ExtractIconEx (sLoc, 0, &hAppIcon, &hAppIconSm, 1);
349 if (0 == hAppIcon && 0 == hAppIconSm)
351 hAppIcon = LoadImage (NULL, IDI_APPLICATION, IMAGE_ICON,
352 GetSystemMetrics (SM_CXICON),
353 GetSystemMetrics (SM_CYICON), 0);
354 hAppIconSm = LoadImage (NULL, IDI_APPLICATION, IMAGE_ICON,
355 GetSystemMetrics (SM_CXSMICON),
356 GetSystemMetrics (SM_CYSMICON), 0);
360 hAppIcon = hAppIconSm;
361 else if (0 == hAppIconSm)
362 hAppIconSm = hAppIcon;
364 wcl.lpszMenuName = NULL;
366 /* initialize once per class */
368 * HB: Setting the background brush leads to flicker, because we
369 * don't get asked how to clear the background. This is not what
370 * we want, at least not for input_only windows ...
372 #define ONCE_PER_CLASS() \
373 wcl.hIcon = CopyIcon (hAppIcon); \
374 wcl.hIconSm = CopyIcon (hAppIconSm); \
375 wcl.hbrBackground = NULL; \
376 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
380 case GDK_WINDOW_TOPLEVEL:
381 if (0 == klassTOPLEVEL)
383 wcl.lpszClassName = L"gdkWindowToplevel";
386 klassTOPLEVEL = RegisterClassExW (&wcl);
388 klass = klassTOPLEVEL;
391 case GDK_WINDOW_CHILD:
394 wcl.lpszClassName = L"gdkWindowChild";
396 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
398 klassCHILD = RegisterClassExW (&wcl);
403 case GDK_WINDOW_DIALOG:
404 if (0 == klassDIALOG)
406 wcl.lpszClassName = L"gdkWindowDialog";
407 wcl.style |= CS_SAVEBITS;
409 klassDIALOG = RegisterClassExW (&wcl);
414 case GDK_WINDOW_TEMP:
417 wcl.lpszClassName = L"gdkWindowTemp";
418 wcl.style |= CS_SAVEBITS;
420 klassTEMP = RegisterClassExW (&wcl);
426 g_assert_not_reached ();
432 WIN32_API_FAILED ("RegisterClassExW");
433 g_error ("That is a fatal error");
439 gdk_window_new_internal (GdkWindow *parent,
440 GdkWindowAttr *attributes,
441 gint attributes_mask,
442 gboolean from_set_skip_taskbar_hint)
447 DWORD dwStyle = 0, dwExStyle;
450 GdkWindow *orig_parent;
451 GdkWindowObject *private;
452 GdkWindowImplWin32 *impl;
453 GdkDrawableImplWin32 *draw_impl;
457 gint window_width, window_height;
458 gint offset_x = 0, offset_y = 0;
460 g_return_val_if_fail (attributes != NULL, NULL);
465 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
467 orig_parent = parent;
470 g_print ("gdk_window_new: %s\n",
471 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
472 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
473 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
474 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
477 if (GDK_WINDOW_DESTROYED (parent))
480 hparent = GDK_WINDOW_HWND (parent);
482 window = g_object_new (GDK_TYPE_WINDOW, NULL);
483 private = (GdkWindowObject *)window;
484 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
485 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
486 draw_impl->wrapper = GDK_DRAWABLE (window);
488 /* Windows with a foreign parent are treated as if they are children
489 * of the root window, except for actual creation.
491 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
494 private->parent = (GdkWindowObject *)parent;
496 private->accept_focus = TRUE;
497 private->focus_on_map = TRUE;
499 if (attributes_mask & GDK_WA_X)
500 private->x = attributes->x;
504 if (attributes_mask & GDK_WA_Y)
505 private->y = attributes->y;
506 else if (attributes_mask & GDK_WA_X)
507 private->y = 100; /* ??? We must put it somewhere... */
511 if (attributes_mask & GDK_WA_VISUAL)
512 visual = attributes->visual;
514 visual = gdk_visual_get_system ();
516 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
517 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
518 impl->extension_events_selected = FALSE;
519 if (attributes->wclass == GDK_INPUT_ONLY)
521 /* Backwards compatiblity - we've always ignored
522 * attributes->window_type for input-only windows
525 if (parent == _gdk_root)
526 private->window_type = GDK_WINDOW_TEMP;
528 private->window_type = GDK_WINDOW_CHILD;
531 private->window_type = attributes->window_type;
533 if (attributes->wclass == GDK_INPUT_OUTPUT)
537 private->input_only = FALSE;
538 private->depth = visual->depth;
540 if (attributes_mask & GDK_WA_COLORMAP)
542 draw_impl->colormap = attributes->colormap;
543 g_object_ref (attributes->colormap);
547 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
548 g_object_ref (draw_impl->colormap);
553 /* I very much doubt using WS_EX_TRANSPARENT actually
554 * corresponds to how X11 InputOnly windows work, but it appears
555 * to work well enough for the actual use cases in gtk.
557 dwExStyle = WS_EX_TRANSPARENT;
559 private->input_only = TRUE;
560 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
561 g_object_ref (draw_impl->colormap);
562 GDK_NOTE (MISC, g_print ("... GDK_INPUT_ONLY, system colormap"));
565 switch (private->window_type)
567 case GDK_WINDOW_TOPLEVEL:
568 case GDK_WINDOW_DIALOG:
569 if (parent != _gdk_root)
571 g_warning (G_STRLOC ": Toplevel windows must be created as children\n"
572 "of a window of type GDK_WINDOW_ROOT or GDK_WINDOW_FOREIGN");
573 hparent = GetDesktopWindow ();
575 /* Children of foreign windows aren't toplevel windows */
576 if (GDK_WINDOW_TYPE (orig_parent) == GDK_WINDOW_FOREIGN)
578 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN;
582 if (private->window_type == GDK_WINDOW_TOPLEVEL)
583 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
585 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
587 offset_x = _gdk_offset_x;
588 offset_y = _gdk_offset_y;
592 case GDK_WINDOW_CHILD:
593 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
596 case GDK_WINDOW_TEMP:
597 /* A temp window is not necessarily a top level window */
598 dwStyle = (_gdk_root == parent ? WS_POPUP : WS_CHILDWINDOW);
599 dwStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
600 dwExStyle |= WS_EX_TOOLWINDOW;
601 offset_x = _gdk_offset_x;
602 offset_y = _gdk_offset_y;
605 case GDK_WINDOW_ROOT:
606 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
610 g_assert_not_reached ();
613 _gdk_window_init_position (GDK_WINDOW (private));
615 if (private->window_type != GDK_WINDOW_CHILD)
617 rect.left = rect.top = 0;
618 rect.right = impl->position_info.width;
619 rect.bottom = impl->position_info.height;
621 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
623 window_width = rect.right - rect.left;
624 window_height = rect.bottom - rect.top;
628 window_width = impl->position_info.width;
629 window_height = impl->position_info.height;
632 if (attributes_mask & GDK_WA_TITLE)
633 title = attributes->title;
635 title = get_default_title ();
636 if (!title || !*title)
639 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
642 private->parent->children = g_list_prepend (private->parent->children, window);
644 klass = RegisterGdkClass (private->window_type);
646 wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
648 hwndNew = CreateWindowExW (dwExStyle,
649 MAKEINTRESOURCEW (klass),
652 ((attributes_mask & GDK_WA_X) ?
653 impl->position_info.x - offset_x : CW_USEDEFAULT),
654 impl->position_info.y - offset_y,
655 window_width, window_height,
660 if (GDK_WINDOW_HWND (window) != hwndNew)
662 g_warning ("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
663 GDK_WINDOW_HWND (window),
666 /* HB: IHMO due to a race condition the handle was increased by
667 * one, which causes much trouble. Because I can't find the
668 * real bug, try to workaround it ...
669 * To reproduce: compile with MSVC 5, DEBUG=1
672 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
673 GDK_WINDOW_HWND (window) = hwndNew;
674 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
676 /* the old behaviour, but with warning */
677 draw_impl->handle = hwndNew;
682 g_object_ref (window);
683 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
685 GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@%+d%+d %p = %p\n",
687 window_width, window_height,
688 ((attributes_mask & GDK_WA_X) ?
689 impl->position_info.x - offset_x: CW_USEDEFAULT),
690 impl->position_info.y - offset_y,
692 GDK_WINDOW_HWND (window)));
696 if (draw_impl->handle == NULL)
698 WIN32_API_FAILED ("CreateWindowExW");
699 g_object_unref (window);
703 if (!from_set_skip_taskbar_hint && private->window_type == GDK_WINDOW_TEMP)
704 gdk_window_set_skip_taskbar_hint (window, TRUE);
706 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
707 (attributes->cursor) :
714 gdk_window_new (GdkWindow *parent,
715 GdkWindowAttr *attributes,
716 gint attributes_mask)
718 return gdk_window_new_internal (parent, attributes, attributes_mask, FALSE);
722 gdk_window_foreign_new_for_display (GdkDisplay *display,
723 GdkNativeWindow anid)
726 GdkWindowObject *private;
727 GdkWindowImplWin32 *impl;
728 GdkDrawableImplWin32 *draw_impl;
734 g_return_val_if_fail (display == _gdk_display, NULL);
736 window = g_object_new (GDK_TYPE_WINDOW, NULL);
737 private = (GdkWindowObject *)window;
738 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
739 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
740 draw_impl->wrapper = GDK_DRAWABLE (window);
741 parent = GetParent ((HWND)anid);
743 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
744 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
745 private->parent = (GdkWindowObject *)_gdk_root;
747 private->parent->children = g_list_prepend (private->parent->children, window);
749 draw_impl->handle = (HWND) anid;
750 GetClientRect ((HWND) anid, &rect);
752 point.y = rect.right;
753 ClientToScreen ((HWND) anid, &point);
754 if (parent != GetDesktopWindow ())
755 ScreenToClient (parent, &point);
756 private->x = point.x;
757 private->y = point.y;
758 impl->width = rect.right - rect.left;
759 impl->height = rect.bottom - rect.top;
760 private->window_type = GDK_WINDOW_FOREIGN;
761 private->destroyed = FALSE;
762 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
763 if (IsWindowVisible ((HWND) anid))
764 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
766 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
767 if (GetWindowLong ((HWND)anid, GWL_EXSTYLE) & WS_EX_TOPMOST)
768 private->state |= GDK_WINDOW_STATE_ABOVE;
770 private->state &= (~GDK_WINDOW_STATE_ABOVE);
771 private->state &= (~GDK_WINDOW_STATE_BELOW);
773 private->depth = gdk_visual_get_system ()->depth;
775 _gdk_window_init_position (GDK_WINDOW (private));
777 g_object_ref (window);
778 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
780 GDK_NOTE (MISC, g_print ("gdk_window_foreign_new_for_display: %p: %s@%+d%+d\n",
782 _gdk_win32_drawable_description (window),
783 private->x, private->y));
789 gdk_window_lookup (GdkNativeWindow hwnd)
791 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
795 _gdk_windowing_window_destroy (GdkWindow *window,
797 gboolean foreign_destroy)
799 GdkWindowObject *private = (GdkWindowObject *)window;
801 g_return_if_fail (GDK_IS_WINDOW (window));
803 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy: %p\n",
804 GDK_WINDOW_HWND (window)));
806 if (private->extension_events != 0)
807 _gdk_input_window_destroy (window);
810 if (!recursing && !foreign_destroy)
812 _gdk_win32_drawable_finish (private->impl);
814 private->destroyed = TRUE;
815 DestroyWindow (GDK_WINDOW_HWND (window));
817 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
821 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
823 /* It's somebody else's window, but in our hierarchy, so reparent it
824 * to the desktop, and then try to destroy it.
826 gdk_window_hide (window);
827 gdk_window_reparent (window, NULL, 0, 0);
829 PostMessage (GDK_WINDOW_HWND (window), WM_CLOSE, 0, 0);
832 /* This function is called when the window really gone.
835 gdk_window_destroy_notify (GdkWindow *window)
837 g_return_if_fail (GDK_IS_WINDOW (window));
840 g_print ("gdk_window_destroy_notify: %p%s\n",
841 GDK_WINDOW_HWND (window),
842 (GDK_WINDOW_DESTROYED (window) ? " (destroyed)" : "")));
844 if (!GDK_WINDOW_DESTROYED (window))
846 if (GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
847 g_warning ("window %p unexpectedly destroyed",
848 GDK_WINDOW_HWND (window));
850 _gdk_window_destroy (window, TRUE);
853 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
854 g_object_unref (window);
858 get_outer_rect (GdkWindow *window,
863 rect->left = rect->top = 0;
865 rect->bottom = height;
867 _gdk_win32_adjust_client_rect (window, rect);
871 adjust_for_gravity_hints (GdkWindowImplWin32 *impl,
876 if (impl->hint_flags & GDK_HINT_WIN_GRAVITY)
878 gint orig_x = *x, orig_y = *y;
880 switch (impl->hints.win_gravity)
882 case GDK_GRAVITY_NORTH:
883 case GDK_GRAVITY_CENTER:
884 case GDK_GRAVITY_SOUTH:
885 *x -= (outer_rect->right - outer_rect->left) / 2;
886 *x += impl->width / 2;
889 case GDK_GRAVITY_SOUTH_EAST:
890 case GDK_GRAVITY_EAST:
891 case GDK_GRAVITY_NORTH_EAST:
892 *x -= outer_rect->right - outer_rect->left;
896 case GDK_GRAVITY_STATIC:
897 *x += outer_rect->left;
904 switch (impl->hints.win_gravity)
906 case GDK_GRAVITY_WEST:
907 case GDK_GRAVITY_CENTER:
908 case GDK_GRAVITY_EAST:
909 *y -= (outer_rect->bottom - outer_rect->top) / 2;
910 *y += impl->height / 2;
913 case GDK_GRAVITY_SOUTH_WEST:
914 case GDK_GRAVITY_SOUTH:
915 case GDK_GRAVITY_SOUTH_EAST:
916 *y -= outer_rect->bottom - outer_rect->top;
920 case GDK_GRAVITY_STATIC:
921 *y += outer_rect->top;
928 (orig_x != *x || orig_y != *y) ?
929 g_print ("adjust_for_gravity_hints: x: %d->%d, y: %d->%d\n",
930 orig_x, *x, orig_y, *y)
936 show_window_internal (GdkWindow *window,
940 GdkWindowObject *private;
941 HWND old_active_window;
942 gboolean focus_on_map = TRUE;
944 private = (GdkWindowObject *) window;
946 if (private->destroyed)
949 GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
950 GDK_WINDOW_HWND (window),
951 _gdk_win32_window_state_to_string (private->state),
952 (raise ? " raise" : ""),
953 (deiconify ? " deiconify" : "")));
955 /* If asked to show (not deiconify) an withdrawn and iconified
959 !GDK_WINDOW_IS_MAPPED (window) &&
960 (private->state & GDK_WINDOW_STATE_ICONIFIED))
962 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
966 /* If asked to just show an iconified window, do nothing. */
967 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
970 /* If asked to deiconify an already noniconified window, do
971 * nothing. (Especially, don't cause the window to rise and
972 * activate. There are different calls for that.)
974 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
977 /* If asked to show (but not raise) a window that is already
978 * visible, do nothing.
980 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
985 if (!GDK_WINDOW_IS_MAPPED (window))
987 gdk_synthesize_window_state (window,
988 GDK_WINDOW_STATE_WITHDRAWN,
990 focus_on_map = private->focus_on_map;
993 /* Use SetWindowPos to show transparent windows so automatic redraws
994 * in other windows can be suppressed.
996 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
998 UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE;
1000 flags |= SWP_NOZORDER;
1001 if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1002 flags |= SWP_NOACTIVATE;
1004 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags);
1008 old_active_window = GetActiveWindow ();
1010 if (private->state & (GDK_WINDOW_STATE_BELOW | GDK_WINDOW_STATE_ABOVE))
1012 DWORD exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1014 if (private->state & GDK_WINDOW_STATE_BELOW)
1015 exstyle &= (~WS_EX_TOPMOST);
1016 if (private->state & GDK_WINDOW_STATE_ABOVE)
1017 exstyle |= WS_EX_TOPMOST;
1019 API_CALL (SetWindowLong, (GDK_WINDOW_HWND (window), GWL_EXSTYLE, exstyle));
1022 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1023 gdk_window_fullscreen (window);
1024 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1025 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
1026 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1027 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
1028 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1029 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
1031 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
1035 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
1036 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
1038 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
1039 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL ||
1040 GDK_WINDOW_TYPE (window) == GDK_WINDOW_DIALOG)
1042 if (focus_on_map && private->accept_focus)
1043 SetForegroundWindow (GDK_WINDOW_HWND (window));
1045 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP,
1047 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
1050 BringWindowToTop (GDK_WINDOW_HWND (window));
1052 else if (old_active_window != GDK_WINDOW_HWND (window))
1053 SetActiveWindow (old_active_window);
1057 gdk_window_show_unraised (GdkWindow *window)
1059 g_return_if_fail (GDK_IS_WINDOW (window));
1061 show_window_internal (window, FALSE, FALSE);
1065 gdk_window_show (GdkWindow *window)
1067 g_return_if_fail (GDK_IS_WINDOW (window));
1069 show_window_internal (window, TRUE, FALSE);
1073 gdk_window_hide (GdkWindow *window)
1075 GdkWindowObject *private;
1077 g_return_if_fail (GDK_IS_WINDOW (window));
1079 private = (GdkWindowObject*) window;
1080 if (private->destroyed)
1083 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n",
1084 GDK_WINDOW_HWND (window),
1085 _gdk_win32_window_state_to_string (private->state)));
1087 if (GDK_WINDOW_IS_MAPPED (window))
1088 gdk_synthesize_window_state (window,
1090 GDK_WINDOW_STATE_WITHDRAWN);
1092 _gdk_window_clear_update_area (window);
1094 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1095 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
1097 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1099 SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM,
1101 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
1105 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
1110 gdk_window_withdraw (GdkWindow *window)
1112 GdkWindowObject *private;
1114 g_return_if_fail (GDK_IS_WINDOW (window));
1116 private = (GdkWindowObject*) window;
1117 if (private->destroyed)
1120 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n",
1121 GDK_WINDOW_HWND (window),
1122 _gdk_win32_window_state_to_string (private->state)));
1124 gdk_window_hide (window); /* ??? */
1128 gdk_window_move (GdkWindow *window,
1132 GdkWindowObject *private = (GdkWindowObject *)window;
1133 GdkWindowImplWin32 *impl;
1135 g_return_if_fail (GDK_IS_WINDOW (window));
1137 if (GDK_WINDOW_DESTROYED (window))
1140 GDK_NOTE (MISC, g_print ("gdk_window_move: %p: %+d%+d\n",
1141 GDK_WINDOW_HWND (window), x, y));
1143 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1145 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1148 /* Don't check GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD.
1149 * Foreign windows (another app's windows) might be children of our
1150 * windows! Especially in the case of gtkplug/socket.
1152 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1153 _gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
1158 get_outer_rect (window, impl->width, impl->height, &outer_rect);
1160 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1162 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,0,0,"
1163 "NOACTIVATE|NOSIZE|NOZORDER)\n",
1164 GDK_WINDOW_HWND (window),
1165 x - _gdk_offset_x, y - _gdk_offset_y));
1167 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1168 x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
1169 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
1174 gdk_window_resize (GdkWindow *window,
1178 GdkWindowObject *private = (GdkWindowObject*) window;
1179 GdkWindowImplWin32 *impl;
1181 g_return_if_fail (GDK_IS_WINDOW (window));
1183 if (GDK_WINDOW_DESTROYED (window))
1191 GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
1192 GDK_WINDOW_HWND (window), width, height));
1194 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1196 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1199 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1200 _gdk_window_move_resize_child (window, private->x, private->y, width, height);
1205 get_outer_rect (window, width, height, &outer_rect);
1207 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,0,0,%ld,%ld,"
1208 "NOACTIVATE|NOMOVE|NOZORDER)\n",
1209 GDK_WINDOW_HWND (window),
1210 outer_rect.right - outer_rect.left,
1211 outer_rect.bottom - outer_rect.top));
1213 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1215 outer_rect.right - outer_rect.left,
1216 outer_rect.bottom - outer_rect.top,
1217 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
1218 private->resize_count += 1;
1223 gdk_window_move_resize (GdkWindow *window,
1229 GdkWindowObject *private = (GdkWindowObject*) window;
1230 GdkWindowImplWin32 *impl;
1232 g_return_if_fail (GDK_IS_WINDOW (window));
1234 if (GDK_WINDOW_DESTROYED (window))
1242 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1244 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1247 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@%+d%+d\n",
1248 GDK_WINDOW_HWND (window),
1249 width, height, x, y));
1251 if (GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) != GetDesktopWindow ())
1252 _gdk_window_move_resize_child (window, x, y, width, height);
1257 get_outer_rect (window, width, height, &outer_rect);
1259 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1261 GDK_NOTE (MISC, g_print ("... SetWindowPos(%p,NULL,%d,%d,%ld,%ld,"
1262 "NOACTIVATE|NOZORDER)\n",
1263 GDK_WINDOW_HWND (window),
1264 x - _gdk_offset_x, y - _gdk_offset_y,
1265 outer_rect.right - outer_rect.left,
1266 outer_rect.bottom - outer_rect.top));
1268 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1269 x - _gdk_offset_x, y - _gdk_offset_y,
1270 outer_rect.right - outer_rect.left,
1271 outer_rect.bottom - outer_rect.top,
1272 SWP_NOACTIVATE | SWP_NOZORDER));
1277 gdk_window_reparent (GdkWindow *window,
1278 GdkWindow *new_parent,
1282 GdkWindowObject *window_private;
1283 GdkWindowObject *parent_private;
1284 GdkWindowObject *old_parent_private;
1285 GdkWindowImplWin32 *impl;
1286 gboolean was_toplevel;
1289 g_return_if_fail (GDK_IS_WINDOW (window));
1290 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1291 g_return_if_fail (window != _gdk_root);
1293 if (GDK_WINDOW_DESTROYED (window) ||
1294 (new_parent && GDK_WINDOW_DESTROYED (new_parent)))
1300 new_parent = _gdk_root;
1302 window_private = (GdkWindowObject*) window;
1303 old_parent_private = (GdkWindowObject *) window_private->parent;
1304 parent_private = (GdkWindowObject*) new_parent;
1305 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1307 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n",
1308 GDK_WINDOW_HWND (window),
1309 GDK_WINDOW_HWND (new_parent)));
1311 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1313 was_toplevel = GetAncestor (GDK_WINDOW_HWND (window), GA_PARENT) == GetDesktopWindow ();
1314 if (was_toplevel && new_parent != _gdk_root)
1316 /* Reparenting from top-level (child of desktop). Clear out
1319 style &= ~(WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
1321 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1323 else if (new_parent == _gdk_root)
1325 /* Reparenting to top-level. Add decorations. */
1326 style &= ~(WS_CHILD);
1327 style |= WS_OVERLAPPEDWINDOW;
1328 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1331 API_CALL (SetParent, (GDK_WINDOW_HWND (window),
1332 GDK_WINDOW_HWND (new_parent)));
1334 API_CALL (MoveWindow, (GDK_WINDOW_HWND (window),
1335 x, y, impl->width, impl->height, TRUE));
1337 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1340 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1341 new_parent = _gdk_root;
1343 window_private->parent = (GdkWindowObject *)new_parent;
1345 /* Switch the window type as appropriate */
1347 switch (GDK_WINDOW_TYPE (new_parent))
1349 case GDK_WINDOW_ROOT:
1350 if (impl->toplevel_window_type != -1)
1351 GDK_WINDOW_TYPE (window) = impl->toplevel_window_type;
1352 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD)
1353 GDK_WINDOW_TYPE (window) = GDK_WINDOW_TOPLEVEL;
1356 case GDK_WINDOW_TOPLEVEL:
1357 case GDK_WINDOW_CHILD:
1358 case GDK_WINDOW_DIALOG:
1359 case GDK_WINDOW_TEMP:
1360 if (WINDOW_IS_TOPLEVEL (window))
1362 /* Save the original window type so we can restore it if the
1363 * window is reparented back to be a toplevel.
1365 impl->toplevel_window_type = GDK_WINDOW_TYPE (window);
1366 GDK_WINDOW_TYPE (window) = GDK_WINDOW_CHILD;
1370 if (old_parent_private)
1371 old_parent_private->children =
1372 g_list_remove (old_parent_private->children, window);
1374 parent_private->children = g_list_prepend (parent_private->children, window);
1375 _gdk_window_init_position (GDK_WINDOW (window_private));
1379 _gdk_windowing_window_clear_area (GdkWindow *window,
1385 GdkWindowImplWin32 *impl;
1387 g_return_if_fail (GDK_IS_WINDOW (window));
1389 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1391 if (!GDK_WINDOW_DESTROYED (window))
1396 width = impl->width - x;
1398 height = impl->height - y;
1399 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
1401 GDK_WINDOW_HWND (window),
1402 width, height, x, y));
1403 hdc = GetDC (GDK_WINDOW_HWND (window));
1404 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1405 SendMessageW (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1406 GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
1411 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1417 g_return_if_fail (GDK_IS_WINDOW (window));
1419 if (!GDK_WINDOW_DESTROYED (window))
1423 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
1425 GDK_WINDOW_HWND (window),
1426 width, height, x, y));
1429 rect.right = x + width + 1;
1431 rect.bottom = y + height + 1;
1432 GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
1433 UpdateWindow (GDK_WINDOW_HWND (window));
1438 gdk_window_raise (GdkWindow *window)
1440 g_return_if_fail (GDK_IS_WINDOW (window));
1442 if (!GDK_WINDOW_DESTROYED (window))
1444 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1445 GDK_WINDOW_HWND (window)));
1447 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
1448 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_TOPMOST,
1450 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1451 else if (((GdkWindowObject *)window)->accept_focus)
1452 API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window)));
1454 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_TOP,
1456 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1461 gdk_window_lower (GdkWindow *window)
1463 g_return_if_fail (GDK_IS_WINDOW (window));
1465 if (!GDK_WINDOW_DESTROYED (window))
1467 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n"
1468 "... SetWindowPos(%p,HWND_BOTTOM,0,0,0,0,"
1469 "NOACTIVATE|NOMOVE|NOSIZE)\n",
1470 GDK_WINDOW_HWND (window),
1471 GDK_WINDOW_HWND (window)));
1473 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM,
1475 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1480 gdk_window_set_hints (GdkWindow *window,
1489 /* Note that this function is obsolete */
1491 GdkWindowImplWin32 *impl;
1493 g_return_if_fail (GDK_IS_WINDOW (window));
1495 if (GDK_WINDOW_DESTROYED (window))
1498 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1500 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @%+d%+d\n",
1501 GDK_WINDOW_HWND (window),
1502 min_width, min_height, max_width, max_height,
1510 geom.min_width = min_width;
1511 geom.min_height = min_height;
1512 geom.max_width = max_width;
1513 geom.max_height = max_height;
1515 if (flags & GDK_HINT_MIN_SIZE)
1516 geom_mask |= GDK_HINT_MIN_SIZE;
1518 if (flags & GDK_HINT_MAX_SIZE)
1519 geom_mask |= GDK_HINT_MAX_SIZE;
1521 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1526 gdk_window_set_urgency_hint (GdkWindow *window,
1529 FLASHWINFO flashwinfo;
1530 typedef BOOL (*PFN_FlashWindowEx) (FLASHWINFO*);
1531 PFN_FlashWindowEx flashWindowEx = NULL;
1533 g_return_if_fail (GDK_IS_WINDOW (window));
1534 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
1536 if (GDK_WINDOW_DESTROYED (window))
1539 flashWindowEx = (PFN_FlashWindowEx) GetProcAddress (GetModuleHandle ("user32.dll"), "FlashWindowEx");
1543 flashwinfo.cbSize = sizeof (flashwinfo);
1544 flashwinfo.hwnd = GDK_WINDOW_HWND (window);
1546 flashwinfo.dwFlags = FLASHW_ALL | FLASHW_TIMER;
1548 flashwinfo.dwFlags = FLASHW_STOP;
1549 flashwinfo.uCount = 0;
1550 flashwinfo.dwTimeout = 0;
1552 flashWindowEx (&flashwinfo);
1556 FlashWindow (GDK_WINDOW_HWND (window), urgent);
1561 get_effective_window_decorations (GdkWindow *window,
1562 GdkWMDecoration *decoration)
1564 GdkWindowImplWin32 *impl;
1566 impl = (GdkWindowImplWin32 *)((GdkWindowObject *)window)->impl;
1568 if (gdk_window_get_decorations (window, decoration))
1571 if (((GdkWindowObject *) window)->window_type != GDK_WINDOW_TOPLEVEL &&
1572 ((GdkWindowObject *) window)->window_type != GDK_WINDOW_DIALOG)
1575 if ((impl->hint_flags & GDK_HINT_MIN_SIZE) &&
1576 (impl->hint_flags & GDK_HINT_MAX_SIZE) &&
1577 impl->hints.min_width == impl->hints.max_width &&
1578 impl->hints.min_height == impl->hints.max_height)
1580 *decoration = GDK_DECOR_ALL | GDK_DECOR_RESIZEH | GDK_DECOR_MAXIMIZE;
1581 if (impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
1582 impl->type_hint == GDK_WINDOW_TYPE_HINT_MENU ||
1583 impl->type_hint == GDK_WINDOW_TYPE_HINT_TOOLBAR)
1584 *decoration |= GDK_DECOR_MINIMIZE;
1585 else if (impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
1586 *decoration |= GDK_DECOR_MENU | GDK_DECOR_MINIMIZE;
1590 else if (impl->hint_flags & GDK_HINT_MAX_SIZE)
1592 *decoration = GDK_DECOR_ALL | GDK_DECOR_MAXIMIZE;
1593 if (impl->type_hint == GDK_WINDOW_TYPE_HINT_DIALOG ||
1594 impl->type_hint == GDK_WINDOW_TYPE_HINT_MENU ||
1595 impl->type_hint == GDK_WINDOW_TYPE_HINT_TOOLBAR)
1596 *decoration |= GDK_DECOR_MINIMIZE;
1601 switch (impl->type_hint)
1603 case GDK_WINDOW_TYPE_HINT_DIALOG:
1604 *decoration = (GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE);
1607 case GDK_WINDOW_TYPE_HINT_MENU:
1608 *decoration = (GDK_DECOR_ALL | GDK_DECOR_RESIZEH | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE);
1611 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
1612 gdk_window_set_skip_taskbar_hint (window, TRUE);
1613 *decoration = GDK_DECOR_ALL | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE;
1616 case GDK_WINDOW_TYPE_HINT_UTILITY:
1619 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
1620 *decoration = (GDK_DECOR_ALL | GDK_DECOR_RESIZEH | GDK_DECOR_MENU
1621 | GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE);
1624 case GDK_WINDOW_TYPE_HINT_DOCK:
1627 case GDK_WINDOW_TYPE_HINT_DESKTOP:
1632 case GDK_WINDOW_TYPE_HINT_NORMAL:
1633 *decoration = GDK_DECOR_ALL;
1642 gdk_window_set_geometry_hints (GdkWindow *window,
1643 GdkGeometry *geometry,
1644 GdkWindowHints geom_mask)
1646 GdkWindowImplWin32 *impl;
1648 g_return_if_fail (GDK_IS_WINDOW (window));
1650 if (GDK_WINDOW_DESTROYED (window))
1653 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n",
1654 GDK_WINDOW_HWND (window)));
1656 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1658 impl->hint_flags = geom_mask;
1659 impl->hints = *geometry;
1661 if (geom_mask & GDK_HINT_POS)
1662 ; /* even the X11 mplementation doesn't care */
1664 if (geom_mask & GDK_HINT_MIN_SIZE)
1666 GDK_NOTE (MISC, g_print ("... MIN_SIZE: %dx%d\n",
1667 geometry->min_width, geometry->min_height));
1670 if (geom_mask & GDK_HINT_MAX_SIZE)
1672 GDK_NOTE (MISC, g_print ("... MAX_SIZE: %dx%d\n",
1673 geometry->max_width, geometry->max_height));
1676 if (geom_mask & GDK_HINT_BASE_SIZE)
1678 GDK_NOTE (MISC, g_print ("... BASE_SIZE: %dx%d\n",
1679 geometry->base_width, geometry->base_height));
1682 if (geom_mask & GDK_HINT_RESIZE_INC)
1684 GDK_NOTE (MISC, g_print ("... RESIZE_INC: (%d,%d)\n",
1685 geometry->width_inc, geometry->height_inc));
1688 if (geom_mask & GDK_HINT_ASPECT)
1690 GDK_NOTE (MISC, g_print ("... ASPECT: %g--%g\n",
1691 geometry->min_aspect, geometry->max_aspect));
1694 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1696 GDK_NOTE (MISC, g_print ("... GRAVITY: %d\n", geometry->win_gravity));
1699 update_style_bits (window);
1703 gdk_window_set_title (GdkWindow *window,
1708 g_return_if_fail (GDK_IS_WINDOW (window));
1709 g_return_if_fail (title != NULL);
1711 if (GDK_WINDOW_DESTROYED (window))
1714 /* Empty window titles not allowed, so set it to just a period. */
1718 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p: %s\n",
1719 GDK_WINDOW_HWND (window), title));
1721 wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL);
1722 API_CALL (SetWindowTextW, (GDK_WINDOW_HWND (window), wtitle));
1727 gdk_window_set_role (GdkWindow *window,
1730 g_return_if_fail (GDK_IS_WINDOW (window));
1732 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p: %s\n",
1733 GDK_WINDOW_HWND (window),
1734 (role ? role : "NULL")));
1739 gdk_window_set_transient_for (GdkWindow *window,
1742 HWND window_id, parent_id;
1744 g_return_if_fail (GDK_IS_WINDOW (window));
1746 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p: %p\n",
1747 GDK_WINDOW_HWND (window),
1748 GDK_WINDOW_HWND (parent)));
1750 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1753 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1755 GDK_NOTE (MISC, g_print ("... a child window!\n"));
1759 window_id = GDK_WINDOW_HWND (window);
1760 parent_id = GDK_WINDOW_HWND (parent);
1762 /* This changes the *owner* of the window, despite the misleading
1763 * name. (Owner and parent are unrelated concepts.) At least that's
1764 * what people who seem to know what they talk about say on
1765 * USENET. Search on Google.
1768 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1769 GetLastError () != 0)
1770 WIN32_API_FAILED ("SetWindowLong");
1774 gdk_window_set_background (GdkWindow *window,
1775 const GdkColor *color)
1777 GdkWindowObject *private = (GdkWindowObject *)window;
1779 g_return_if_fail (GDK_IS_WINDOW (window));
1781 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
1782 GDK_WINDOW_HWND (window),
1783 _gdk_win32_color_to_string (color)));
1785 private->bg_color = *color;
1787 if (private->bg_pixmap &&
1788 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1789 private->bg_pixmap != GDK_NO_BG)
1791 g_object_unref (private->bg_pixmap);
1792 private->bg_pixmap = NULL;
1797 gdk_window_set_back_pixmap (GdkWindow *window,
1799 gint parent_relative)
1801 GdkWindowObject *private = (GdkWindowObject *)window;
1803 g_return_if_fail (GDK_IS_WINDOW (window));
1804 g_return_if_fail (pixmap == NULL || !parent_relative);
1805 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1807 if (pixmap && !gdk_drawable_get_colormap (pixmap))
1809 g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
1813 if (private->bg_pixmap &&
1814 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1815 private->bg_pixmap != GDK_NO_BG)
1816 g_object_unref (private->bg_pixmap);
1818 if (parent_relative)
1820 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1821 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1827 g_object_ref (pixmap);
1828 private->bg_pixmap = pixmap;
1832 private->bg_pixmap = GDK_NO_BG;
1838 gdk_window_set_cursor (GdkWindow *window,
1841 GdkWindowImplWin32 *impl;
1842 GdkCursorPrivate *cursor_private;
1843 GdkWindowObject *parent_window;
1845 HCURSOR hprevcursor;
1847 g_return_if_fail (GDK_IS_WINDOW (window));
1849 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1850 cursor_private = (GdkCursorPrivate*) cursor;
1852 if (GDK_WINDOW_DESTROYED (window))
1858 hcursor = cursor_private->hcursor;
1860 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p: %p\n",
1861 GDK_WINDOW_HWND (window),
1864 /* First get the old cursor, if any (we wait to free the old one
1865 * since it may be the current cursor set in the Win32 API right
1868 hprevcursor = impl->hcursor;
1870 if (hcursor == NULL)
1871 impl->hcursor = NULL;
1874 /* We must copy the cursor as it is OK to destroy the GdkCursor
1875 * while still in use for some window. See for instance
1876 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1877 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1880 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1881 WIN32_API_FAILED ("CopyCursor");
1882 GDK_NOTE (MISC, g_print ("... CopyCursor (%p) = %p\n",
1883 hcursor, impl->hcursor));
1886 if (impl->hcursor != NULL)
1888 /* If the pointer is over our window, set new cursor */
1889 GdkWindow *curr_window = gdk_window_get_pointer (window, NULL, NULL, NULL);
1890 if (curr_window == window)
1891 SetCursor (impl->hcursor);
1894 /* Climb up the tree and find whether our window is the
1895 * first ancestor that has cursor defined, and if so, set
1898 GdkWindowObject *curr_window_obj = GDK_WINDOW_OBJECT (curr_window);
1899 while (curr_window_obj &&
1900 !GDK_WINDOW_IMPL_WIN32 (curr_window_obj->impl)->hcursor)
1902 curr_window_obj = curr_window_obj->parent;
1903 if (curr_window_obj == GDK_WINDOW_OBJECT (window))
1905 SetCursor (impl->hcursor);
1912 /* Destroy the previous cursor: Need to make sure it's no longer in
1913 * use before we destroy it, in case we're not over our window but
1914 * the cursor is still set to our old one.
1916 if (hprevcursor != NULL)
1918 if (GetCursor () == hprevcursor)
1920 /* Look for a suitable cursor to use instead */
1922 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1923 while (hcursor == NULL)
1927 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1928 hcursor = impl->hcursor;
1929 parent_window = parent_window->parent;
1933 hcursor = LoadCursor (NULL, IDC_ARROW);
1936 SetCursor (hcursor);
1939 GDK_NOTE (MISC, g_print ("... DestroyCursor (%p)\n", hprevcursor));
1941 API_CALL (DestroyCursor, (hprevcursor));
1946 gdk_window_get_geometry (GdkWindow *window,
1953 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1958 if (!GDK_WINDOW_DESTROYED (window))
1962 API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
1964 if (window != _gdk_root)
1967 GdkWindow *parent = gdk_window_get_parent (window);
1971 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1972 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1978 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1979 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1983 if (parent == _gdk_root)
1985 rect.left += _gdk_offset_x;
1986 rect.top += _gdk_offset_y;
1987 rect.right += _gdk_offset_x;
1988 rect.bottom += _gdk_offset_y;
1997 *width = rect.right - rect.left;
1999 *height = rect.bottom - rect.top;
2001 *depth = gdk_drawable_get_visual (window)->depth;
2003 GDK_NOTE (MISC, g_print ("gdk_window_get_geometry: %p: %ldx%ldx%d@%+ld%+ld\n",
2004 GDK_WINDOW_HWND (window),
2005 rect.right - rect.left, rect.bottom - rect.top,
2006 gdk_drawable_get_visual (window)->depth,
2007 rect.left, rect.top));
2012 gdk_window_get_origin (GdkWindow *window,
2020 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2022 if (!GDK_WINDOW_DESTROYED (window))
2028 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
2037 *x = tx + _gdk_offset_x;
2039 *y = ty + _gdk_offset_y;
2041 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: %+d%+d\n",
2042 GDK_WINDOW_HWND (window),
2048 gdk_window_get_deskrelative_origin (GdkWindow *window,
2052 return gdk_window_get_origin (window, x, y);
2056 gdk_window_get_root_origin (GdkWindow *window,
2062 g_return_if_fail (GDK_IS_WINDOW (window));
2064 gdk_window_get_frame_extents (window, &rect);
2072 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: %+d%+d\n",
2073 GDK_WINDOW_HWND (window), rect.x, rect.y));
2077 gdk_window_get_frame_extents (GdkWindow *window,
2080 GdkWindowObject *private;
2084 g_return_if_fail (GDK_IS_WINDOW (window));
2085 g_return_if_fail (rect != NULL);
2087 private = GDK_WINDOW_OBJECT (window);
2094 if (GDK_WINDOW_DESTROYED (window))
2097 /* FIXME: window is documented to be a toplevel GdkWindow, so is it really
2098 * necessary to walk its parent chain?
2100 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2101 private = (GdkWindowObject*) private->parent;
2103 hwnd = GDK_WINDOW_HWND (window);
2104 API_CALL (GetWindowRect, (hwnd, &r));
2106 rect->x = r.left + _gdk_offset_x;
2107 rect->y = r.top + _gdk_offset_y;
2108 rect->width = r.right - r.left;
2109 rect->height = r.bottom - r.top;
2111 GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@%+ld%+ld\n",
2112 GDK_WINDOW_HWND (window),
2113 r.right - r.left, r.bottom - r.top,
2118 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2122 GdkModifierType *mask)
2124 GdkWindow *return_val;
2125 POINT screen_point, point;
2129 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2132 GetCursorPos (&screen_point);
2133 point = screen_point;
2134 ScreenToClient (GDK_WINDOW_HWND (window), &point);
2139 if (window == _gdk_root)
2141 *x += _gdk_offset_x;
2142 *y += _gdk_offset_y;
2145 hwnd = WindowFromPoint (screen_point);
2148 gboolean done = FALSE;
2152 point = screen_point;
2153 ScreenToClient (hwnd, &point);
2154 hwndc = ChildWindowFromPoint (hwnd, point);
2157 else if (hwndc == hwnd)
2163 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
2168 GetKeyboardState (kbd);
2170 if (kbd[VK_SHIFT] & 0x80)
2171 *mask |= GDK_SHIFT_MASK;
2172 if (kbd[VK_CAPITAL] & 0x80)
2173 *mask |= GDK_LOCK_MASK;
2174 if (kbd[VK_CONTROL] & 0x80)
2175 *mask |= GDK_CONTROL_MASK;
2176 if (kbd[VK_MENU] & 0x80)
2177 *mask |= GDK_MOD1_MASK;
2178 if (kbd[VK_LBUTTON] & 0x80)
2179 *mask |= GDK_BUTTON1_MASK;
2180 if (kbd[VK_MBUTTON] & 0x80)
2181 *mask |= GDK_BUTTON2_MASK;
2182 if (kbd[VK_RBUTTON] & 0x80)
2183 *mask |= GDK_BUTTON3_MASK;
2189 _gdk_windowing_get_pointer (GdkDisplay *display,
2193 GdkModifierType *mask)
2195 g_return_if_fail (display == _gdk_display);
2197 *screen = _gdk_screen;
2198 _gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
2202 gdk_display_warp_pointer (GdkDisplay *display,
2207 g_return_if_fail (display == _gdk_display);
2208 g_return_if_fail (screen == _gdk_screen);
2210 SetCursorPos (x - _gdk_offset_x, y - _gdk_offset_y);
2214 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2219 POINT point, pointc;
2223 GetCursorPos (&pointc);
2225 hwnd = WindowFromPoint (point);
2230 *win_x = pointc.x + _gdk_offset_x;
2231 *win_y = pointc.y + _gdk_offset_y;
2235 ScreenToClient (hwnd, &point);
2238 hwndc = ChildWindowFromPoint (hwnd, point);
2239 ClientToScreen (hwnd, &point);
2240 ScreenToClient (hwndc, &point);
2241 } while (hwndc != hwnd && (hwnd = hwndc, 1));
2243 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
2245 if (window && (win_x || win_y))
2247 GetClientRect (hwnd, &rect);
2248 *win_x = point.x - rect.left;
2249 *win_y = point.y - rect.top;
2252 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: %+d%+d %p%s\n",
2255 (window == NULL ? " NULL" : "")));
2261 gdk_window_get_events (GdkWindow *window)
2263 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2265 if (GDK_WINDOW_DESTROYED (window))
2268 return GDK_WINDOW_OBJECT (window)->event_mask;
2272 gdk_window_set_events (GdkWindow *window,
2273 GdkEventMask event_mask)
2275 g_return_if_fail (GDK_IS_WINDOW (window));
2277 if (GDK_WINDOW_DESTROYED (window))
2280 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2281 * set it here, too. Not that I know or remember why it is
2282 * necessary, will have to test some day.
2284 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2288 do_shape_combine_region (GdkWindow *window,
2294 GetClientRect (GDK_WINDOW_HWND (window), &rect);
2295 _gdk_win32_adjust_client_rect (window, &rect);
2297 OffsetRgn (hrgn, -rect.left, -rect.top);
2298 OffsetRgn (hrgn, x, y);
2300 /* If this is a top-level window, add the title bar to the region */
2301 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2303 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2304 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2308 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2312 gdk_window_shape_combine_mask (GdkWindow *window,
2316 GdkWindowObject *private = (GdkWindowObject *)window;
2318 g_return_if_fail (GDK_IS_WINDOW (window));
2322 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
2323 GDK_WINDOW_HWND (window)));
2324 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2326 private->shaped = FALSE;
2332 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n",
2333 GDK_WINDOW_HWND (window),
2334 GDK_WINDOW_HWND (mask)));
2336 /* Convert mask bitmap to region */
2337 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2339 do_shape_combine_region (window, hrgn, x, y);
2341 private->shaped = TRUE;
2346 gdk_window_input_shape_combine_mask (GdkWindow *window,
2351 g_return_if_fail (GDK_IS_WINDOW (window));
2353 /* Not yet implemented
2355 * I don't think there is anything in the Win32 API to directly
2356 * support this. And anyway, as we don't currently support RGBA
2357 * windows, it doesn't really matter.
2359 * When we do support RGBA, input shape functionality could probably
2360 * be implemented by saving the input shape region in the per-window
2361 * private data, and then simply checking before generating an input
2362 * event whether the event's coordinates are inside the region.
2367 gdk_window_set_override_redirect (GdkWindow *window,
2368 gboolean override_redirect)
2370 g_return_if_fail (GDK_IS_WINDOW (window));
2372 g_warning ("gdk_window_set_override_redirect not implemented");
2376 gdk_window_set_accept_focus (GdkWindow *window,
2377 gboolean accept_focus)
2379 GdkWindowObject *private;
2381 g_return_if_fail (GDK_IS_WINDOW (window));
2383 private = (GdkWindowObject *)window;
2385 accept_focus = accept_focus != FALSE;
2387 if (private->accept_focus != accept_focus)
2388 private->accept_focus = accept_focus;
2392 gdk_window_set_focus_on_map (GdkWindow *window,
2393 gboolean focus_on_map)
2395 GdkWindowObject *private;
2397 g_return_if_fail (GDK_IS_WINDOW (window));
2399 private = (GdkWindowObject *)window;
2401 focus_on_map = focus_on_map != FALSE;
2403 if (private->focus_on_map != focus_on_map)
2404 private->focus_on_map = focus_on_map;
2408 gdk_window_set_icon_list (GdkWindow *window,
2411 GdkPixbuf *pixbuf, *big_pixbuf, *small_pixbuf;
2412 gint big_diff, small_diff;
2413 gint big_w, big_h, small_w, small_h;
2416 HICON small_hicon, big_hicon;
2417 GdkWindowImplWin32 *impl;
2418 gint i, big_i, small_i;
2420 g_return_if_fail (GDK_IS_WINDOW (window));
2422 if (GDK_WINDOW_DESTROYED (window))
2425 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
2427 /* ideal sizes for small and large icons */
2428 big_w = GetSystemMetrics (SM_CXICON);
2429 big_h = GetSystemMetrics (SM_CYICON);
2430 small_w = GetSystemMetrics (SM_CXSMICON);
2431 small_h = GetSystemMetrics (SM_CYSMICON);
2433 /* find closest sized icons in the list */
2435 small_pixbuf = NULL;
2441 pixbuf = (GdkPixbuf*) pixbufs->data;
2442 w = gdk_pixbuf_get_width (pixbuf);
2443 h = gdk_pixbuf_get_height (pixbuf);
2445 dw = ABS (w - big_w);
2446 dh = ABS (h - big_h);
2447 diff = dw*dw + dh*dh;
2448 if (big_pixbuf == NULL || diff < big_diff)
2450 big_pixbuf = pixbuf;
2455 dw = ABS (w - small_w);
2456 dh = ABS (h - small_h);
2457 diff = dw*dw + dh*dh;
2458 if (small_pixbuf == NULL || diff < small_diff)
2460 small_pixbuf = pixbuf;
2465 pixbufs = g_list_next (pixbufs);
2469 /* Create the icons */
2470 big_hicon = _gdk_win32_pixbuf_to_hicon (big_pixbuf);
2471 small_hicon = _gdk_win32_pixbuf_to_hicon (small_pixbuf);
2474 SendMessageW (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG,
2476 SendMessageW (GDK_WINDOW_HWND (window), WM_SETICON, ICON_SMALL,
2477 (LPARAM)small_hicon);
2479 /* Store the icons, destroying any previous icons */
2480 if (impl->hicon_big)
2481 GDI_CALL (DestroyIcon, (impl->hicon_big));
2482 impl->hicon_big = big_hicon;
2483 if (impl->hicon_small)
2484 GDI_CALL (DestroyIcon, (impl->hicon_small));
2485 impl->hicon_small = small_hicon;
2489 gdk_window_set_icon (GdkWindow *window,
2490 GdkWindow *icon_window,
2494 g_return_if_fail (GDK_IS_WINDOW (window));
2496 /* do nothing, use gdk_window_set_icon_list instead */
2500 gdk_window_set_icon_name (GdkWindow *window,
2503 g_return_if_fail (GDK_IS_WINDOW (window));
2505 if (GDK_WINDOW_DESTROYED (window))
2509 /* This is not the correct thing to do. We should keep both the
2510 * "normal" window title, and the icon name. When the window is
2511 * minimized, call SetWindowText() with the icon name, and when the
2512 * window is restored, with the normal window title. Also, the name
2513 * is in UTF-8, so we should do the normal conversion to either wide
2514 * chars or system codepage, and use either the W or A version of
2515 * SetWindowText(), depending on Windows version.
2517 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));
2522 gdk_window_get_group (GdkWindow *window)
2524 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
2525 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2527 if (GDK_WINDOW_DESTROYED (window))
2530 g_warning ("gdk_window_get_group not yet implemented");
2536 gdk_window_set_group (GdkWindow *window,
2539 g_return_if_fail (GDK_IS_WINDOW (window));
2540 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
2541 g_return_if_fail (leader == NULL || GDK_IS_WINDOW (leader));
2543 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2546 g_warning ("gdk_window_set_group not implemented");
2550 update_single_bit (LONG *style,
2555 /* all controls the interpretation of gdk_bit -- if all is true, gdk_bit
2556 indicates whether style_bit is off; if all is false, gdk bit indicate whether
2558 if ((!all && gdk_bit) || (all && !gdk_bit))
2559 *style |= style_bit;
2561 *style &= ~style_bit;
2565 update_style_bits (GdkWindow *window)
2567 GdkWMDecoration decorations;
2568 GdkWMFunction functions;
2569 LONG style, exstyle;
2571 RECT rect, before, after;
2573 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2574 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2576 GetClientRect (GDK_WINDOW_HWND (window), &before);
2578 AdjustWindowRectEx (&before, style, FALSE, exstyle);
2580 if (get_effective_window_decorations (window, &decorations))
2582 all = (decorations & GDK_DECOR_ALL);
2583 update_single_bit (&style, all, decorations & GDK_DECOR_BORDER, WS_BORDER);
2584 update_single_bit (&style, all, decorations & GDK_DECOR_RESIZEH, WS_THICKFRAME);
2585 update_single_bit (&style, all, decorations & GDK_DECOR_TITLE, WS_CAPTION);
2586 update_single_bit (&style, all, decorations & GDK_DECOR_MENU, WS_SYSMENU);
2587 update_single_bit (&style, all, decorations & GDK_DECOR_MINIMIZE, WS_MINIMIZEBOX);
2588 update_single_bit (&style, all, decorations & GDK_DECOR_MAXIMIZE, WS_MAXIMIZEBOX);
2591 /* XXX this is actually incorrect. The menu entries should be added or removed
2592 from the system menu without affecting the window style. */
2593 if (_gdk_window_get_functions (window, &functions))
2595 all = (functions & GDK_DECOR_ALL);
2596 update_single_bit (&style, all, functions & GDK_FUNC_RESIZE, WS_THICKFRAME);
2597 update_single_bit (&style, all, functions & GDK_FUNC_MOVE, WS_THICKFRAME | WS_SYSMENU);
2598 update_single_bit (&style, all, functions & GDK_FUNC_MINIMIZE, WS_MINIMIZE);
2599 update_single_bit (&style, all, functions & GDK_FUNC_MOVE, WS_MAXIMIZE);
2600 update_single_bit (&style, all, functions & GDK_FUNC_CLOSE, WS_SYSMENU);
2603 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2605 AdjustWindowRectEx (&after, style, FALSE, exstyle);
2607 GetWindowRect (GDK_WINDOW_HWND (window), &rect);
2608 rect.left += after.left - before.left;
2609 rect.top += after.top - before.top;
2610 rect.right += after.right - before.right;
2611 rect.bottom += after.bottom - before.bottom;
2613 SetWindowPos (GDK_WINDOW_HWND (window), NULL,
2614 rect.left, rect.top,
2615 rect.right - rect.left, rect.bottom - rect.top,
2616 SWP_FRAMECHANGED | SWP_NOACTIVATE |
2617 SWP_NOREPOSITION | SWP_NOZORDER);
2621 get_decorations_quark ()
2623 static GQuark quark = 0;
2626 quark = g_quark_from_static_string ("gdk-window-decorations");
2632 gdk_window_set_decorations (GdkWindow *window,
2633 GdkWMDecoration decorations)
2635 GdkWMDecoration* decorations_copy;
2637 g_return_if_fail (GDK_IS_WINDOW (window));
2639 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s %s%s%s%s%s%s\n",
2640 GDK_WINDOW_HWND (window),
2641 (decorations & GDK_DECOR_ALL ? "clearing" : "setting"),
2642 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2643 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2644 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2645 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2646 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2647 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2649 decorations_copy = g_malloc (sizeof (GdkWMDecoration));
2650 *decorations_copy = decorations;
2651 g_object_set_qdata_full (G_OBJECT (window), get_decorations_quark (), decorations_copy, g_free);
2653 update_style_bits (window);
2657 gdk_window_get_decorations (GdkWindow *window,
2658 GdkWMDecoration *decorations)
2660 GdkWMDecoration* decorations_set;
2662 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2664 decorations_set = g_object_get_qdata (G_OBJECT (window), get_decorations_quark ());
2665 if (decorations_set)
2666 *decorations = *decorations_set;
2668 return (decorations_set != NULL);
2672 get_functions_quark ()
2674 static GQuark quark = 0;
2677 quark = g_quark_from_static_string ("gdk-window-functions");
2683 gdk_window_set_functions (GdkWindow *window,
2684 GdkWMFunction functions)
2686 GdkWMFunction* functions_copy;
2688 g_return_if_fail (GDK_IS_WINDOW (window));
2690 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p: %s %s%s%s%s%s\n",
2691 GDK_WINDOW_HWND (window),
2692 (functions & GDK_FUNC_ALL ? "clearing" : "setting"),
2693 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2694 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2695 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2696 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2697 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2699 functions_copy = g_malloc (sizeof (GdkWMFunction));
2700 *functions_copy = functions;
2701 g_object_set_qdata_full (G_OBJECT (window), get_functions_quark (), functions_copy, g_free);
2703 update_style_bits (window);
2707 _gdk_window_get_functions (GdkWindow *window,
2708 GdkWMFunction *functions)
2710 GdkWMDecoration* functions_set;
2712 functions_set = g_object_get_qdata (G_OBJECT (window), get_functions_quark ());
2714 *functions = *functions_set;
2716 return (functions_set != NULL);
2720 QueryTree (HWND hwnd,
2730 child = GetWindow (hwnd, GW_CHILD);
2732 child = GetWindow (child, GW_HWNDNEXT);
2735 } while (child != NULL);
2739 *children = g_new (HWND, n);
2740 for (i = 0; i < n; i++)
2743 child = GetWindow (hwnd, GW_CHILD);
2745 child = GetWindow (child, GW_HWNDNEXT);
2746 *children[i] = child;
2752 gdk_propagate_shapes (HANDLE win,
2756 HRGN region, childRegion;
2760 SetRectEmpty (&emptyRect);
2761 region = CreateRectRgnIndirect (&emptyRect);
2763 GetWindowRgn (win, region);
2765 QueryTree (win, &list, &num);
2768 WINDOWPLACEMENT placement;
2770 placement.length = sizeof (WINDOWPLACEMENT);
2771 /* go through all child windows and combine regions */
2772 for (i = 0; i < num; i++)
2774 GetWindowPlacement (list[i], &placement);
2775 if (placement.showCmd == SW_SHOWNORMAL)
2777 childRegion = CreateRectRgnIndirect (&emptyRect);
2778 GetWindowRgn (list[i], childRegion);
2779 CombineRgn (region, region, childRegion, RGN_OR);
2780 DeleteObject (childRegion);
2783 SetWindowRgn (win, region, TRUE);
2787 DeleteObject (region);
2791 gdk_window_set_child_shapes (GdkWindow *window)
2793 g_return_if_fail (GDK_IS_WINDOW (window));
2795 if (GDK_WINDOW_DESTROYED (window))
2798 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2802 gdk_window_merge_child_shapes (GdkWindow *window)
2804 g_return_if_fail (GDK_IS_WINDOW (window));
2806 if (GDK_WINDOW_DESTROYED (window))
2809 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2813 gdk_window_set_child_input_shapes (GdkWindow *window)
2815 g_return_if_fail (GDK_IS_WINDOW (window));
2817 /* Not yet implemented. See comment in
2818 * gdk_window_input_shape_combine_mask().
2823 gdk_window_merge_child_input_shapes (GdkWindow *window)
2825 g_return_if_fail (GDK_IS_WINDOW (window));
2827 /* Not yet implemented. See comment in
2828 * gdk_window_input_shape_combine_mask().
2833 gdk_window_set_static_gravities (GdkWindow *window,
2834 gboolean use_static)
2836 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2842 gdk_window_begin_resize_drag (GdkWindow *window,
2851 g_return_if_fail (GDK_IS_WINDOW (window));
2853 if (GDK_WINDOW_DESTROYED (window))
2856 /* Tell Windows to start interactively resizing the window by pretending that
2857 * the left pointer button was clicked in the suitable edge or corner. This
2858 * will only work if the button is down when this function is called, and
2859 * will only work with button 1 (left), since Windows only allows window
2860 * dragging using the left mouse button.
2865 /* Must break the automatic grab that occured when the button was
2866 * pressed, otherwise it won't work.
2868 gdk_display_pointer_ungrab (_gdk_display, 0);
2872 case GDK_WINDOW_EDGE_NORTH_WEST:
2873 winedge = HTTOPLEFT;
2876 case GDK_WINDOW_EDGE_NORTH:
2880 case GDK_WINDOW_EDGE_NORTH_EAST:
2881 winedge = HTTOPRIGHT;
2884 case GDK_WINDOW_EDGE_WEST:
2888 case GDK_WINDOW_EDGE_EAST:
2892 case GDK_WINDOW_EDGE_SOUTH_WEST:
2893 winedge = HTBOTTOMLEFT;
2896 case GDK_WINDOW_EDGE_SOUTH:
2900 case GDK_WINDOW_EDGE_SOUTH_EAST:
2902 winedge = HTBOTTOMRIGHT;
2906 DefWindowProcW (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, winedge,
2907 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2911 gdk_window_begin_move_drag (GdkWindow *window,
2917 g_return_if_fail (GDK_IS_WINDOW (window));
2919 if (GDK_WINDOW_DESTROYED (window))
2922 /* Tell Windows to start interactively moving the window by pretending that
2923 * the left pointer button was clicked in the titlebar. This will only work
2924 * if the button is down when this function is called, and will only work
2925 * with button 1 (left), since Windows only allows window dragging using the
2926 * left mouse button.
2931 /* Must break the automatic grab that occured when the button was pressed,
2932 * otherwise it won't work.
2934 gdk_display_pointer_ungrab (_gdk_display, 0);
2936 DefWindowProcW (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, HTCAPTION,
2937 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2942 * Setting window states
2945 gdk_window_iconify (GdkWindow *window)
2947 HWND old_active_window;
2949 g_return_if_fail (GDK_IS_WINDOW (window));
2951 if (GDK_WINDOW_DESTROYED (window))
2954 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p: %s\n",
2955 GDK_WINDOW_HWND (window),
2956 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2958 if (GDK_WINDOW_IS_MAPPED (window))
2960 old_active_window = GetActiveWindow ();
2961 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2962 if (old_active_window != GDK_WINDOW_HWND (window))
2963 SetActiveWindow (old_active_window);
2967 gdk_synthesize_window_state (window,
2969 GDK_WINDOW_STATE_ICONIFIED);
2974 gdk_window_deiconify (GdkWindow *window)
2976 g_return_if_fail (GDK_IS_WINDOW (window));
2978 if (GDK_WINDOW_DESTROYED (window))
2981 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p: %s\n",
2982 GDK_WINDOW_HWND (window),
2983 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2985 if (GDK_WINDOW_IS_MAPPED (window))
2987 show_window_internal (window, FALSE, TRUE);
2991 gdk_synthesize_window_state (window,
2992 GDK_WINDOW_STATE_ICONIFIED,
2998 gdk_window_stick (GdkWindow *window)
3000 g_return_if_fail (GDK_IS_WINDOW (window));
3002 if (GDK_WINDOW_DESTROYED (window))
3005 /* FIXME: Do something? */
3009 gdk_window_unstick (GdkWindow *window)
3011 g_return_if_fail (GDK_IS_WINDOW (window));
3013 if (GDK_WINDOW_DESTROYED (window))
3016 /* FIXME: Do something? */
3020 gdk_window_maximize (GdkWindow *window)
3022 g_return_if_fail (GDK_IS_WINDOW (window));
3024 if (GDK_WINDOW_DESTROYED (window))
3027 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p: %s\n",
3028 GDK_WINDOW_HWND (window),
3029 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3031 if (GDK_WINDOW_IS_MAPPED (window))
3032 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
3034 gdk_synthesize_window_state (window,
3036 GDK_WINDOW_STATE_MAXIMIZED);
3040 gdk_window_unmaximize (GdkWindow *window)
3042 g_return_if_fail (GDK_IS_WINDOW (window));
3044 if (GDK_WINDOW_DESTROYED (window))
3047 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p: %s\n",
3048 GDK_WINDOW_HWND (window),
3049 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3051 if (GDK_WINDOW_IS_MAPPED (window))
3052 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
3054 gdk_synthesize_window_state (window,
3055 GDK_WINDOW_STATE_MAXIMIZED,
3059 typedef struct _FullscreenInfo FullscreenInfo;
3061 struct _FullscreenInfo
3069 gdk_window_fullscreen (GdkWindow *window)
3073 GdkWindowObject *private = (GdkWindowObject *) window;
3075 g_return_if_fail (GDK_IS_WINDOW (window));
3077 fi = g_new (FullscreenInfo, 1);
3079 if (!GetWindowRect (GDK_WINDOW_HWND (window), &(fi->r)))
3083 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3085 width = GetSystemMetrics (SM_CXSCREEN);
3086 height = GetSystemMetrics (SM_CYSCREEN);
3088 /* remember for restoring */
3089 fi->hint_flags = impl->hint_flags;
3090 impl->hint_flags &= ~GDK_HINT_MAX_SIZE;
3091 g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
3092 fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
3094 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3095 (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
3097 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_TOP,
3098 0, 0, width, height,
3099 SWP_NOCOPYBITS | SWP_SHOWWINDOW));
3101 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
3106 gdk_window_unfullscreen (GdkWindow *window)
3109 GdkWindowObject *private = (GdkWindowObject *) window;
3111 g_return_if_fail (GDK_IS_WINDOW (window));
3113 fi = g_object_get_data (G_OBJECT (window), "fullscreen-info");
3116 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3118 impl->hint_flags = fi->hint_flags;
3119 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
3120 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
3121 fi->r.left, fi->r.top,
3122 fi->r.right - fi->r.left, fi->r.bottom - fi->r.top,
3123 SWP_NOCOPYBITS | SWP_SHOWWINDOW));
3125 g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
3128 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
3133 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
3135 g_return_if_fail (GDK_IS_WINDOW (window));
3137 if (GDK_WINDOW_DESTROYED (window))
3140 if (GDK_WINDOW_IS_MAPPED (window))
3142 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3143 setting ? HWND_TOPMOST : HWND_NOTOPMOST,
3145 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE));
3148 gdk_synthesize_window_state (window,
3149 setting ? GDK_WINDOW_STATE_BELOW : GDK_WINDOW_STATE_ABOVE,
3150 setting ? GDK_WINDOW_STATE_ABOVE : 0);
3154 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
3156 g_return_if_fail (GDK_IS_WINDOW (window));
3158 if (GDK_WINDOW_DESTROYED (window))
3161 if (GDK_WINDOW_IS_MAPPED (window))
3163 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3164 setting ? HWND_BOTTOM : HWND_NOTOPMOST,
3166 SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE));
3169 gdk_synthesize_window_state (window,
3170 setting ? GDK_WINDOW_STATE_ABOVE : GDK_WINDOW_STATE_BELOW,
3171 setting ? GDK_WINDOW_STATE_BELOW : 0);
3175 gdk_window_focus (GdkWindow *window,
3178 g_return_if_fail (GDK_IS_WINDOW (window));
3180 if (GDK_WINDOW_DESTROYED (window))
3183 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p: %s\n",
3184 GDK_WINDOW_HWND (window),
3185 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3187 if (((GdkWindowObject *) window)->state & GDK_WINDOW_STATE_MAXIMIZED)
3188 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
3190 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
3191 SetFocus (GDK_WINDOW_HWND (window));
3195 gdk_window_set_modal_hint (GdkWindow *window,
3198 GdkWindowObject *private;
3200 g_return_if_fail (GDK_IS_WINDOW (window));
3202 if (GDK_WINDOW_DESTROYED (window))
3205 private = (GdkWindowObject*) window;
3207 private->modal_hint = modal;
3209 if (GDK_WINDOW_IS_MAPPED (window))
3210 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3211 modal ? HWND_TOPMOST : HWND_NOTOPMOST,
3213 SWP_NOMOVE | SWP_NOSIZE));
3217 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
3218 gboolean skips_taskbar)
3220 static GdkWindow *owner = NULL;
3223 g_return_if_fail (GDK_IS_WINDOW (window));
3225 GDK_NOTE (MISC, g_print ("gdk_window_set_skip_taskbar_hint: %p: %s\n",
3226 GDK_WINDOW_HWND (window),
3227 skips_taskbar ? "TRUE" : "FALSE"));
3233 wa.window_type = GDK_WINDOW_TEMP;
3234 wa.wclass = GDK_INPUT_OUTPUT;
3235 wa.width = wa.height = 1;
3237 owner = gdk_window_new_internal (NULL, &wa, 0, TRUE);
3240 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT,
3241 (long) GDK_WINDOW_HWND (owner));
3243 #if 0 /* Should we also turn off the minimize and maximize buttons? */
3244 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3245 GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE) & ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU));
3246 SetWindowPos (GDK_WINDOW_HWND (window), NULL,
3248 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
3249 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
3254 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT, 0);
3259 gdk_window_set_skip_pager_hint (GdkWindow *window,
3260 gboolean skips_pager)
3262 g_return_if_fail (GDK_IS_WINDOW (window));
3266 gdk_window_set_type_hint (GdkWindow *window,
3267 GdkWindowTypeHint hint)
3269 g_return_if_fail (GDK_IS_WINDOW (window));
3271 if (GDK_WINDOW_DESTROYED (window))
3274 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p: %d\n",
3275 GDK_WINDOW_HWND (window), hint));
3277 ((GdkWindowImplWin32 *)((GdkWindowObject *)window)->impl)->type_hint = hint;
3279 update_style_bits (window);
3283 gdk_window_get_type_hint (GdkWindow *window)
3285 g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_WINDOW_TYPE_HINT_NORMAL);
3287 if (GDK_WINDOW_DESTROYED (window))
3288 return GDK_WINDOW_TYPE_HINT_NORMAL;
3290 return GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) window)->impl)->type_hint;
3294 gdk_window_shape_combine_region (GdkWindow *window,
3295 GdkRegion *shape_region,
3299 GdkWindowObject *private = (GdkWindowObject *)window;
3301 g_return_if_fail (GDK_IS_WINDOW (window));
3303 if (GDK_WINDOW_DESTROYED (window))
3308 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_region: %p: none\n",
3309 GDK_WINDOW_HWND (window)));
3310 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
3312 private->shaped = FALSE;
3318 hrgn = _gdk_win32_gdkregion_to_hrgn (shape_region, 0, 0);
3320 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_region: %p: %p\n",
3321 GDK_WINDOW_HWND (window),
3324 do_shape_combine_region (window, hrgn, offset_x, offset_y);
3326 private->shaped = TRUE;
3331 gdk_window_input_shape_combine_region (GdkWindow *window,
3332 GdkRegion *shape_region,
3336 g_return_if_fail (GDK_IS_WINDOW (window));
3338 /* Not yet implemented. See comment in
3339 * gdk_window_input_shape_combine_mask().
3344 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
3346 g_return_val_if_fail (display == _gdk_display, NULL);
3348 return gdk_window_lookup (anid);
3352 gdk_window_enable_synchronized_configure (GdkWindow *window)
3354 g_return_if_fail (GDK_IS_WINDOW (window));
3358 gdk_window_configure_finished (GdkWindow *window)
3360 g_return_if_fail (GDK_IS_WINDOW (window));
3364 gdk_window_beep (GdkWindow *window)
3366 gdk_display_beep (_gdk_display);