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 __MINGW32__ || (WINVER < 0x0500)
49 LONG bV5XPelsPerMeter;
50 LONG bV5YPelsPerMeter;
52 DWORD bV5ClrImportant;
58 CIEXYZTRIPLE bV5Endpoints;
71 #include <gdk-pixbuf/gdk-pixbuf.h>
75 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
76 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
78 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
81 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
82 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
83 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
84 static void gdk_window_impl_win32_finalize (GObject *object);
86 static gpointer parent_class = NULL;
89 _gdk_window_impl_win32_get_type (void)
91 static GType object_type = 0;
95 static const GTypeInfo object_info =
97 sizeof (GdkWindowImplWin32Class),
99 (GBaseFinalizeFunc) NULL,
100 (GClassInitFunc) gdk_window_impl_win32_class_init,
101 NULL, /* class_finalize */
102 NULL, /* class_data */
103 sizeof (GdkWindowImplWin32),
105 (GInstanceInitFunc) gdk_window_impl_win32_init,
108 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
109 "GdkWindowImplWin32",
117 _gdk_window_impl_get_type (void)
119 return _gdk_window_impl_win32_get_type ();
123 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
128 impl->hcursor = NULL;
129 impl->hicon_big = NULL;
130 impl->hicon_small = NULL;
131 impl->hint_flags = 0;
132 impl->extension_events_selected = FALSE;
136 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
138 GObjectClass *object_class = G_OBJECT_CLASS (klass);
139 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
141 parent_class = g_type_class_peek_parent (klass);
143 object_class->finalize = gdk_window_impl_win32_finalize;
145 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
146 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
147 drawable_class->get_size = gdk_window_impl_win32_get_size;
149 /* Visible and clip regions are the same */
150 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
151 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
155 gdk_window_impl_win32_finalize (GObject *object)
157 GdkWindowObject *wrapper;
158 GdkDrawableImplWin32 *draw_impl;
159 GdkWindowImplWin32 *window_impl;
161 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
163 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
164 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
166 wrapper = (GdkWindowObject*) draw_impl->wrapper;
168 if (!GDK_WINDOW_DESTROYED (wrapper))
170 gdk_win32_handle_table_remove (draw_impl->handle);
173 if (window_impl->hcursor != NULL)
175 if (GetCursor () == window_impl->hcursor)
177 GDI_CALL (DestroyCursor, (window_impl->hcursor));
178 window_impl->hcursor = NULL;
180 if (window_impl->hicon_big != NULL)
182 GDI_CALL (DestroyIcon, (window_impl->hicon_big));
183 window_impl->hicon_big = NULL;
185 if (window_impl->hicon_small != NULL)
187 GDI_CALL (DestroyIcon, (window_impl->hicon_small));
188 window_impl->hicon_small = NULL;
191 G_OBJECT_CLASS (parent_class)->finalize (object);
195 _gdk_win32_adjust_client_rect (GdkWindow *window,
200 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
201 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
202 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
206 _gdk_win32_get_adjusted_client_rect (GdkWindow *window,
209 GetClientRect (GDK_WINDOW_HWND (window), rect);
210 _gdk_win32_adjust_client_rect (window, rect);
214 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
216 GdkDrawableImplWin32 *drawable_impl;
218 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
220 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
222 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
223 drawable_impl->colormap == NULL)
225 drawable_impl->colormap =
226 gdk_screen_get_system_colormap (gdk_drawable_get_screen (drawable));
227 g_object_ref (drawable_impl->colormap);
230 return drawable_impl->colormap;
234 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
237 GdkWindowImplWin32 *impl;
238 GdkDrawableImplWin32 *draw_impl;
240 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
242 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
243 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
246 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
251 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
256 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
260 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
263 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
265 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
269 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
271 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
272 GdkRectangle result_rect;
277 result_rect.width = impl->width;
278 result_rect.height = impl->height;
280 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
282 /* take this win32 specific part into account (smaller when obscured) */
283 hdc = GetDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (impl));
287 if (SIMPLEREGION == GetClipBox (hdc, &r))
293 gr.width = r.right - r.left;
294 gr.height = r.bottom - r.top;
296 gdk_rectangle_intersect (&result_rect, &gr, &result_rect);
298 ReleaseDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (drawable), hdc);
301 return gdk_region_rectangle (&result_rect);
305 _gdk_windowing_window_init (void)
307 GdkWindowObject *private;
308 GdkWindowImplWin32 *impl;
309 GdkDrawableImplWin32 *draw_impl;
313 g_assert (_gdk_parent_root == NULL);
315 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
316 private = (GdkWindowObject *)_gdk_parent_root;
317 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
318 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
320 draw_impl->handle = _gdk_root_window;
321 draw_impl->wrapper = GDK_DRAWABLE (private);
322 draw_impl->colormap = gdk_colormap_get_system ();
323 g_object_ref (draw_impl->colormap);
325 private->window_type = GDK_WINDOW_ROOT;
326 private->depth = gdk_visual_get_system ()->depth;
328 rect = _gdk_monitors[0];
329 for (i = 1; i < _gdk_num_monitors; i++)
330 gdk_rectangle_union (&rect, _gdk_monitors+i, &rect);
332 impl->width = rect.width;
333 impl->height = rect.height;
335 _gdk_window_init_position (GDK_WINDOW (private));
337 gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
339 GDK_NOTE (MISC, g_print ("_gdk_parent_root=%p\n", GDK_WINDOW_HWND (_gdk_parent_root)));
343 get_default_title (void)
346 title = g_get_application_name ();
348 title = g_get_prgname ();
354 * is a wrapper function for RegisterWindowClassEx.
355 * It creates at least one unique class for every
356 * GdkWindowType. If support for single window-specific icons
357 * is ever needed (e.g Dialog specific), every such window should
361 RegisterGdkClass (GdkWindowType wtype)
363 static ATOM klassTOPLEVEL = 0;
364 static ATOM klassDIALOG = 0;
365 static ATOM klassCHILD = 0;
366 static ATOM klassTEMP = 0;
367 static HICON hAppIcon = NULL;
368 static WNDCLASSEX wcl;
371 wcl.cbSize = sizeof (WNDCLASSEX);
372 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
373 * on WM_SIZE and WM_MOVE. Flicker, Performance!
375 wcl.lpfnWndProc = _gdk_win32_window_procedure;
378 wcl.hInstance = _gdk_app_hmodule;
380 /* initialize once! */
383 gchar sLoc [MAX_PATH+1];
385 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
387 hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
390 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
391 hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
395 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
398 wcl.lpszMenuName = NULL;
401 /* initialize once per class */
403 * HB: Setting the background brush leads to flicker, because we
404 * don't get asked how to clear the background. This is not what
405 * we want, at least not for input_only windows ...
407 #define ONCE_PER_CLASS() \
408 wcl.hIcon = CopyIcon (hAppIcon); \
409 wcl.hIconSm = CopyIcon (hAppIcon); \
410 wcl.hbrBackground = NULL; \
411 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
415 case GDK_WINDOW_TOPLEVEL:
416 if (0 == klassTOPLEVEL)
418 wcl.lpszClassName = "gdkWindowToplevel";
421 klassTOPLEVEL = RegisterClassEx (&wcl);
423 klass = klassTOPLEVEL;
426 case GDK_WINDOW_CHILD:
429 wcl.lpszClassName = "gdkWindowChild";
431 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
433 klassCHILD = RegisterClassEx (&wcl);
438 case GDK_WINDOW_DIALOG:
439 if (0 == klassDIALOG)
441 wcl.lpszClassName = "gdkWindowDialog";
442 wcl.style |= CS_SAVEBITS;
444 klassDIALOG = RegisterClassEx (&wcl);
449 case GDK_WINDOW_TEMP:
452 wcl.lpszClassName = "gdkWindowTemp";
453 wcl.style |= CS_SAVEBITS;
455 klassTEMP = RegisterClassEx (&wcl);
461 g_assert_not_reached ();
467 WIN32_API_FAILED ("RegisterClassEx");
468 g_error ("That is a fatal error");
474 gdk_window_new_internal (GdkWindow *parent,
475 GdkWindowAttr *attributes,
476 gint attributes_mask,
477 gboolean from_set_skip_taskbar_hint)
481 DWORD dwStyle = 0, dwExStyle;
484 GdkWindowObject *private;
485 GdkWindowImplWin32 *impl;
486 GdkDrawableImplWin32 *draw_impl;
491 gint window_width, window_height;
492 gint offset_x = 0, offset_y = 0;
494 g_return_val_if_fail (attributes != NULL, NULL);
498 screen = gdk_screen_get_default ();
499 parent = gdk_screen_get_root_window (screen);
502 screen = gdk_drawable_get_screen (parent);
504 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
507 g_print ("gdk_window_new: %s\n",
508 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
509 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
510 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
511 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
514 if (GDK_WINDOW_DESTROYED (parent))
517 hparent = GDK_WINDOW_HWND (parent);
519 window = g_object_new (GDK_TYPE_WINDOW, NULL);
520 private = (GdkWindowObject *)window;
521 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
522 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
523 draw_impl->wrapper = GDK_DRAWABLE (window);
525 /* Windows with a foreign parent are treated as if they are children
526 * of the root window, except for actual creation.
528 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
529 parent = _gdk_parent_root;
531 private->parent = (GdkWindowObject *)parent;
533 private->accept_focus = TRUE;
534 private->focus_on_map = TRUE;
536 if (attributes_mask & GDK_WA_X)
537 private->x = attributes->x;
541 if (attributes_mask & GDK_WA_Y)
542 private->y = attributes->y;
543 else if (attributes_mask & GDK_WA_X)
544 private->y = 100; /* ??? We must put it somewhere... */
548 if (attributes_mask & GDK_WA_VISUAL)
549 visual = attributes->visual;
551 visual = gdk_visual_get_system ();
553 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
554 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
555 impl->extension_events_selected = FALSE;
556 if (attributes->wclass == GDK_INPUT_ONLY)
558 /* Backwards compatiblity - we've always ignored
559 * attributes->window_type for input-only windows
562 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_ROOT)
563 private->window_type = GDK_WINDOW_TEMP;
565 private->window_type = GDK_WINDOW_CHILD;
568 private->window_type = attributes->window_type;
570 if (attributes->wclass == GDK_INPUT_OUTPUT)
574 private->input_only = FALSE;
575 private->depth = visual->depth;
577 if (attributes_mask & GDK_WA_COLORMAP)
579 draw_impl->colormap = attributes->colormap;
580 g_object_ref (attributes->colormap);
584 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
585 g_object_ref (draw_impl->colormap);
590 dwExStyle = WS_EX_TRANSPARENT;
592 private->input_only = TRUE;
593 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
594 g_object_ref (draw_impl->colormap);
595 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap"));
598 switch (private->window_type)
600 case GDK_WINDOW_TOPLEVEL:
601 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
602 hparent = _gdk_root_window;
603 offset_x = _gdk_offset_x;
604 offset_y = _gdk_offset_y;
607 case GDK_WINDOW_CHILD:
608 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
611 case GDK_WINDOW_DIALOG:
612 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
614 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
616 hparent = _gdk_root_window;
617 offset_x = _gdk_offset_x;
618 offset_y = _gdk_offset_y;
621 case GDK_WINDOW_TEMP:
622 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
623 /* a temp window is not necessarily a top level window */
624 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
625 dwExStyle |= WS_EX_TOOLWINDOW;
626 offset_x = _gdk_offset_x;
627 offset_y = _gdk_offset_y;
630 case GDK_WINDOW_ROOT:
631 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
635 g_assert_not_reached ();
638 _gdk_window_init_position (GDK_WINDOW (private));
640 if (private->window_type != GDK_WINDOW_CHILD)
642 rect.left = rect.top = 0;
643 rect.right = impl->position_info.width;
644 rect.bottom = impl->position_info.height;
646 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
648 window_width = rect.right - rect.left;
649 window_height = rect.bottom - rect.top;
653 window_width = impl->position_info.width;
654 window_height = impl->position_info.height;
657 if (impl->position_info.big)
658 private->guffaw_gravity = TRUE;
660 if (attributes_mask & GDK_WA_TITLE)
661 title = attributes->title;
663 title = get_default_title ();
664 if (!title || !*title)
665 title = "GDK client window";
667 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
669 if (private->parent && private->parent->guffaw_gravity)
675 private->parent->children = g_list_prepend (private->parent->children, window);
677 klass = RegisterGdkClass (private->window_type);
679 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
683 CreateWindowEx (dwExStyle,
684 MAKEINTRESOURCE(klass),
687 ((attributes_mask & GDK_WA_X) ?
688 impl->position_info.x - offset_x: CW_USEDEFAULT),
689 impl->position_info.y - offset_y,
690 window_width, window_height,
695 if (GDK_WINDOW_HWND (window) != hwndNew)
697 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
698 GDK_WINDOW_HWND (window),
701 /* HB: IHMO due to a race condition the handle was increased by
702 * one, which causes much trouble. Because I can't find the
703 * real bug, try to workaround it ...
704 * To reproduce: compile with MSVC 5, DEBUG=1
707 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
708 GDK_WINDOW_HWND (window) = hwndNew;
709 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
711 /* the old behaviour, but with warning */
712 draw_impl->handle = hwndNew;
717 g_object_ref (window);
718 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
720 GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
722 window_width, window_height,
723 ((attributes_mask & GDK_WA_X) ?
724 impl->position_info.x - offset_x: CW_USEDEFAULT),
725 impl->position_info.y - offset_y,
727 GDK_WINDOW_HWND (window)));
731 if (draw_impl->handle == NULL)
733 WIN32_API_FAILED ("CreateWindowEx");
734 g_object_unref (window);
738 if (!from_set_skip_taskbar_hint && private->window_type == GDK_WINDOW_TEMP)
739 gdk_window_set_skip_taskbar_hint (window, TRUE);
741 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
742 (attributes->cursor) :
749 gdk_window_new (GdkWindow *parent,
750 GdkWindowAttr *attributes,
751 gint attributes_mask)
753 return gdk_window_new_internal (parent, attributes, attributes_mask, FALSE);
757 gdk_window_foreign_new_for_display (GdkDisplay *display,
758 GdkNativeWindow anid)
761 GdkWindowObject *private;
762 GdkWindowImplWin32 *impl;
763 GdkDrawableImplWin32 *draw_impl;
769 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
771 window = g_object_new (GDK_TYPE_WINDOW, NULL);
772 private = (GdkWindowObject *)window;
773 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
774 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
775 draw_impl->wrapper = GDK_DRAWABLE (window);
776 parent = GetParent ((HWND)anid);
778 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
779 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
780 private->parent = (GdkWindowObject *)_gdk_parent_root;
782 private->parent->children = g_list_prepend (private->parent->children, window);
784 draw_impl->handle = (HWND) anid;
785 GetClientRect ((HWND) anid, &rect);
787 point.y = rect.right;
788 ClientToScreen ((HWND) anid, &point);
789 if (parent != _gdk_root_window)
790 ScreenToClient (parent, &point);
791 private->x = point.x;
792 private->y = point.y;
793 impl->width = rect.right - rect.left;
794 impl->height = rect.bottom - rect.top;
795 private->window_type = GDK_WINDOW_FOREIGN;
796 private->destroyed = FALSE;
797 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
798 if (IsWindowVisible ((HWND) anid))
799 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
801 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
802 if (GetWindowLong ((HWND)anid, GWL_EXSTYLE) & WS_EX_TOPMOST)
803 private->state |= GDK_WINDOW_STATE_ABOVE;
805 private->state &= (~GDK_WINDOW_STATE_ABOVE);
806 private->state &= (~GDK_WINDOW_STATE_BELOW);
808 private->depth = gdk_visual_get_system ()->depth;
810 _gdk_window_init_position (GDK_WINDOW (private));
812 g_object_ref (window);
813 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
819 gdk_window_lookup (GdkNativeWindow hwnd)
821 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
825 _gdk_windowing_window_destroy (GdkWindow *window,
827 gboolean foreign_destroy)
829 GdkWindowObject *private = (GdkWindowObject *)window;
831 g_return_if_fail (GDK_IS_WINDOW (window));
833 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy: %p\n",
834 GDK_WINDOW_HWND (window)));
836 if (private->extension_events != 0)
837 _gdk_input_window_destroy (window);
840 if (!recursing && !foreign_destroy)
842 private->destroyed = TRUE;
843 DestroyWindow (GDK_WINDOW_HWND (window));
845 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
849 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
851 /* It's somebody else's window, but in our hierarchy,
852 * so reparent it to the root window, and then call
853 * DestroyWindow() on it.
855 gdk_window_hide (window);
856 gdk_window_reparent (window, NULL, 0, 0);
858 /* Is this too drastic? Many (most?) applications
859 * quit if any window receives WM_QUIT I think.
860 * OTOH, I don't think foreign windows are much
861 * used, so the question is maybe academic.
863 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
866 /* This function is called when the window really gone.
869 gdk_window_destroy_notify (GdkWindow *window)
871 g_return_if_fail (window != NULL);
872 g_return_if_fail (GDK_IS_WINDOW (window));
875 g_print ("gdk_window_destroy_notify: %p%s\n",
876 GDK_WINDOW_HWND (window),
877 (GDK_WINDOW_DESTROYED (window) ? " (destroyed)" : "")));
879 if (!GDK_WINDOW_DESTROYED (window))
881 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
882 g_warning ("window %p unexpectedly destroyed",
883 GDK_WINDOW_HWND (window));
885 _gdk_window_destroy (window, TRUE);
888 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
889 g_object_unref (window);
893 get_outer_rect (GdkWindow *window,
900 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
901 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
903 rect->left = rect->top = 0;
905 rect->bottom = height;
907 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
911 adjust_for_gravity_hints (GdkWindowImplWin32 *impl,
916 if (impl->hint_flags & GDK_HINT_WIN_GRAVITY)
918 gint orig_x = *x, orig_y = *y;
920 switch (impl->hints.win_gravity)
922 case GDK_GRAVITY_NORTH:
923 case GDK_GRAVITY_CENTER:
924 case GDK_GRAVITY_SOUTH:
925 *x -= (outer_rect->right - outer_rect->left) / 2;
926 *x += impl->width / 2;
929 case GDK_GRAVITY_SOUTH_EAST:
930 case GDK_GRAVITY_EAST:
931 case GDK_GRAVITY_NORTH_EAST:
932 *x -= outer_rect->right - outer_rect->left;
936 case GDK_GRAVITY_STATIC:
937 *x += outer_rect->left;
944 switch (impl->hints.win_gravity)
946 case GDK_GRAVITY_WEST:
947 case GDK_GRAVITY_CENTER:
948 case GDK_GRAVITY_EAST:
949 *y -= (outer_rect->bottom - outer_rect->top) / 2;
950 *y += impl->height / 2;
953 case GDK_GRAVITY_SOUTH_WEST:
954 case GDK_GRAVITY_SOUTH:
955 case GDK_GRAVITY_SOUTH_EAST:
956 *y -= outer_rect->bottom - outer_rect->top;
960 case GDK_GRAVITY_STATIC:
961 *y += outer_rect->top;
968 (orig_x != *x || orig_y != *y) ?
969 g_print ("adjust_for_gravity_hints: x: %d->%d, y: %d->%d\n",
970 orig_x, *x, orig_y, *y)
976 show_window_internal (GdkWindow *window,
980 GdkWindowObject *private;
981 HWND old_active_window;
982 gboolean focus_on_map = TRUE;
984 private = (GdkWindowObject *) window;
986 if (private->destroyed)
989 GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
990 GDK_WINDOW_HWND (window),
991 _gdk_win32_window_state_to_string (private->state),
992 (raise ? " raise" : ""),
993 (deiconify ? " deiconify" : "")));
995 /* If asked to show (not deiconify) an withdrawn and iconified
999 !GDK_WINDOW_IS_MAPPED (window) &&
1000 (private->state & GDK_WINDOW_STATE_ICONIFIED))
1002 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
1006 /* If asked to just show an iconified window, do nothing. */
1007 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
1010 /* If asked to deiconify an already noniconified window, do
1011 * nothing. (Especially, don't cause the window to rise and
1012 * activate. There are different calls for that.)
1014 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
1017 /* If asked to show (but not raise) a window that is already
1018 * visible, do nothing.
1020 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
1025 if (!GDK_WINDOW_IS_MAPPED (window))
1027 gdk_synthesize_window_state (window,
1028 GDK_WINDOW_STATE_WITHDRAWN,
1030 focus_on_map = private->focus_on_map;
1033 /* Use SetWindowPos to show transparent windows so automatic redraws
1034 * in other windows can be suppressed.
1036 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1038 UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE;
1040 flags |= SWP_NOZORDER;
1041 if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1042 flags |= SWP_NOACTIVATE;
1044 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags);
1048 old_active_window = GetActiveWindow ();
1050 if (private->state & (GDK_WINDOW_STATE_BELOW | GDK_WINDOW_STATE_ABOVE))
1052 DWORD exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1054 if (private->state & GDK_WINDOW_STATE_BELOW)
1055 exstyle &= (~WS_EX_TOPMOST);
1056 if (private->state & GDK_WINDOW_STATE_ABOVE)
1057 exstyle |= WS_EX_TOPMOST;
1059 if (!SetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE, exstyle))
1060 WIN32_API_FAILED ("SetWindowLong");
1063 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1064 gdk_window_fullscreen (window);
1065 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1066 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
1067 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1068 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
1069 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1070 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
1072 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
1076 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
1077 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
1078 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
1079 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL
1080 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_DIALOG)
1081 SetForegroundWindow (GDK_WINDOW_HWND (window));
1083 BringWindowToTop (GDK_WINDOW_HWND (window));
1085 else if (old_active_window != GDK_WINDOW_HWND (window))
1086 SetActiveWindow (old_active_window);
1090 gdk_window_show_unraised (GdkWindow *window)
1092 g_return_if_fail (GDK_IS_WINDOW (window));
1094 show_window_internal (window, FALSE, FALSE);
1098 gdk_window_show (GdkWindow *window)
1100 g_return_if_fail (GDK_IS_WINDOW (window));
1102 show_window_internal (window, TRUE, FALSE);
1106 gdk_window_hide (GdkWindow *window)
1108 GdkWindowObject *private;
1110 g_return_if_fail (window != NULL);
1112 private = (GdkWindowObject*) window;
1113 if (private->destroyed)
1116 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n",
1117 GDK_WINDOW_HWND (window),
1118 _gdk_win32_window_state_to_string (private->state)));
1120 if (GDK_WINDOW_IS_MAPPED (window))
1121 gdk_synthesize_window_state (window,
1123 GDK_WINDOW_STATE_WITHDRAWN);
1125 _gdk_window_clear_update_area (window);
1127 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1128 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
1130 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1132 SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1133 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
1137 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
1142 gdk_window_withdraw (GdkWindow *window)
1144 GdkWindowObject *private;
1146 g_return_if_fail (window != NULL);
1148 private = (GdkWindowObject*) window;
1149 if (private->destroyed)
1152 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n",
1153 GDK_WINDOW_HWND (window),
1154 _gdk_win32_window_state_to_string (private->state)));
1156 gdk_window_hide (window); /* ??? */
1160 gdk_window_move (GdkWindow *window,
1164 GdkWindowObject *private = (GdkWindowObject *)window;
1165 GdkWindowImplWin32 *impl;
1167 g_return_if_fail (window != NULL);
1168 g_return_if_fail (GDK_IS_WINDOW (window));
1170 if (GDK_WINDOW_DESTROYED (window))
1173 GDK_NOTE (MISC, g_print ("gdk_window_move: %p: +%d+%d\n",
1174 GDK_WINDOW_HWND (window), x, y));
1176 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1178 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1181 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1182 _gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
1187 get_outer_rect (window, impl->width, impl->height, &outer_rect);
1189 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1191 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1192 x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
1193 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
1198 gdk_window_resize (GdkWindow *window,
1202 GdkWindowObject *private = (GdkWindowObject*) window;
1203 GdkWindowImplWin32 *impl;
1205 g_return_if_fail (window != NULL);
1206 g_return_if_fail (GDK_IS_WINDOW (window));
1208 if (GDK_WINDOW_DESTROYED (window))
1216 GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
1217 GDK_WINDOW_HWND (window), width, height));
1219 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1221 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1224 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1225 _gdk_window_move_resize_child (window, private->x, private->y, width, height);
1229 get_outer_rect (window, width, height, &outer_rect);
1231 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1233 outer_rect.right - outer_rect.left,
1234 outer_rect.bottom - outer_rect.top,
1235 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
1236 private->resize_count += 1;
1241 gdk_window_move_resize (GdkWindow *window,
1247 GdkWindowObject *private = (GdkWindowObject*) window;
1248 GdkWindowImplWin32 *impl;
1250 g_return_if_fail (window != NULL);
1251 g_return_if_fail (GDK_IS_WINDOW (window));
1253 if (GDK_WINDOW_DESTROYED (window))
1261 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1263 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1266 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@+%d+%d\n",
1267 GDK_WINDOW_HWND (window),
1268 width, height, x, y));
1270 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1271 _gdk_window_move_resize_child (window, x, y, width, height);
1276 get_outer_rect (window, width, height, &outer_rect);
1278 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1280 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1281 x - _gdk_offset_x, y - _gdk_offset_y,
1282 outer_rect.right - outer_rect.left,
1283 outer_rect.bottom - outer_rect.top,
1284 SWP_NOACTIVATE | SWP_NOZORDER));
1289 gdk_window_reparent (GdkWindow *window,
1290 GdkWindow *new_parent,
1294 GdkWindowObject *window_private;
1295 GdkWindowObject *parent_private;
1296 GdkWindowObject *old_parent_private;
1297 GdkWindowImplWin32 *impl;
1299 g_return_if_fail (window != NULL);
1300 g_return_if_fail (GDK_IS_WINDOW (window));
1301 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1302 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1304 if (GDK_WINDOW_DESTROYED (window) ||
1305 (new_parent && GDK_WINDOW_DESTROYED (new_parent)))
1311 new_parent = _gdk_parent_root;
1313 window_private = (GdkWindowObject*) window;
1314 old_parent_private = (GdkWindowObject *) window_private->parent;
1315 parent_private = (GdkWindowObject*) new_parent;
1316 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1318 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1320 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n",
1321 GDK_WINDOW_HWND (window),
1322 GDK_WINDOW_HWND (new_parent)));
1324 API_CALL (SetParent, (GDK_WINDOW_HWND (window),
1325 GDK_WINDOW_HWND (new_parent)));
1327 API_CALL (MoveWindow, (GDK_WINDOW_HWND (window),
1328 x, y, impl->width, impl->height, TRUE));
1331 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1334 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1335 new_parent = _gdk_parent_root;
1337 window_private->parent = (GdkWindowObject *)new_parent;
1339 if (old_parent_private)
1340 old_parent_private->children =
1341 g_list_remove (old_parent_private->children, window);
1344 if ((old_parent_private &&
1345 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1346 (!old_parent_private && parent_private->guffaw_gravity))
1347 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1350 parent_private->children = g_list_prepend (parent_private->children, window);
1351 _gdk_window_init_position (GDK_WINDOW (window_private));
1355 _gdk_windowing_window_clear_area (GdkWindow *window,
1361 GdkWindowImplWin32 *impl;
1363 g_return_if_fail (window != NULL);
1364 g_return_if_fail (GDK_IS_WINDOW (window));
1366 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1368 if (!GDK_WINDOW_DESTROYED (window))
1373 width = impl->width - x;
1375 height = impl->height - y;
1376 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
1378 GDK_WINDOW_HWND (window),
1379 width, height, x, y));
1380 hdc = GetDC (GDK_WINDOW_HWND (window));
1381 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1382 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1383 GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
1388 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1394 g_return_if_fail (window != NULL);
1395 g_return_if_fail (GDK_IS_WINDOW (window));
1397 if (!GDK_WINDOW_DESTROYED (window))
1401 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
1403 GDK_WINDOW_HWND (window),
1404 width, height, x, y));
1407 rect.right = x + width + 1;
1409 rect.bottom = y + height + 1;
1410 GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
1411 UpdateWindow (GDK_WINDOW_HWND (window));
1416 gdk_window_raise (GdkWindow *window)
1418 g_return_if_fail (window != NULL);
1419 g_return_if_fail (GDK_IS_WINDOW (window));
1421 if (!GDK_WINDOW_DESTROYED (window))
1423 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1424 GDK_WINDOW_HWND (window)));
1426 API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window)));
1431 gdk_window_lower (GdkWindow *window)
1433 g_return_if_fail (window != NULL);
1434 g_return_if_fail (GDK_IS_WINDOW (window));
1436 if (!GDK_WINDOW_DESTROYED (window))
1438 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1439 GDK_WINDOW_HWND (window)));
1441 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1442 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1447 gdk_window_set_hints (GdkWindow *window,
1456 /* Note that this function is obsolete */
1458 GdkWindowImplWin32 *impl;
1460 g_return_if_fail (window != NULL);
1461 g_return_if_fail (GDK_IS_WINDOW (window));
1463 if (GDK_WINDOW_DESTROYED (window))
1466 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1468 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @+%d+%d\n",
1469 GDK_WINDOW_HWND (window),
1470 min_width, min_height, max_width, max_height,
1478 geom.min_width = min_width;
1479 geom.min_height = min_height;
1480 geom.max_width = max_width;
1481 geom.max_height = max_height;
1483 if (flags & GDK_HINT_MIN_SIZE)
1484 geom_mask |= GDK_HINT_MIN_SIZE;
1486 if (flags & GDK_HINT_MAX_SIZE)
1487 geom_mask |= GDK_HINT_MAX_SIZE;
1489 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1494 gdk_window_set_geometry_hints (GdkWindow *window,
1495 GdkGeometry *geometry,
1496 GdkWindowHints geom_mask)
1498 GdkWindowImplWin32 *impl;
1500 WINDOWPLACEMENT size_hints;
1502 gint new_width = 0, new_height = 0;
1505 g_return_if_fail (window != NULL);
1506 g_return_if_fail (GDK_IS_WINDOW (window));
1508 if (GDK_WINDOW_DESTROYED (window))
1511 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n",
1512 GDK_WINDOW_HWND (window)));
1514 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1516 impl->hint_flags = geom_mask;
1517 impl->hints = *geometry;
1519 if (geom_mask & GDK_HINT_POS)
1520 ; /* even the X11 mplementation doesn't care */
1522 if (geom_mask & GDK_HINT_MIN_SIZE)
1524 GDK_NOTE (MISC, g_print ("... MIN_SIZE: %dx%d\n",
1525 geometry->min_width, geometry->min_height));
1528 /* Check if the current size of the window is in bounds */
1529 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1531 if (rect.right < geometry->min_width &&
1532 rect.bottom < geometry->min_height)
1534 new_width = geometry->min_width;
1535 new_height = geometry->min_height;
1537 else if (rect.right < geometry->min_width)
1539 new_width = geometry->min_width;
1540 new_height = rect.bottom;
1542 else if (rect.bottom < geometry->min_height)
1544 new_width = rect.right;
1545 new_height = geometry->min_height;
1550 if (geom_mask & GDK_HINT_MAX_SIZE)
1552 GDK_NOTE (MISC, g_print ("... MAX_SIZE: %dx%d\n",
1553 geometry->max_width, geometry->max_height));
1556 /* Check if the current size of the window is in bounds */
1557 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1559 if (rect.right > geometry->max_width &&
1560 rect.bottom > geometry->max_height)
1562 new_width = geometry->max_width;
1563 new_height = geometry->max_height;
1565 else if (rect.right > geometry->max_width)
1567 new_width = geometry->max_width;
1568 new_height = rect.bottom;
1570 else if (rect.bottom > geometry->max_height)
1572 new_width = rect.right;
1573 new_height = geometry->max_height;
1579 /* Apply new size constraints */
1580 if (new_width != 0 && new_height != 0)
1581 gdk_window_resize (window, new_width, new_height);
1584 if (geom_mask & GDK_HINT_BASE_SIZE)
1586 GDK_NOTE (MISC, g_print ("... BASE_SIZE: %dx%d\n",
1587 geometry->base_width, geometry->base_height));
1590 size_hints.length = sizeof (size_hints);
1592 if (API_CALL (GetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints)))
1595 g_print ("... rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1596 size_hints.rcNormalPosition.left,
1597 size_hints.rcNormalPosition.top,
1598 size_hints.rcNormalPosition.right,
1599 size_hints.rcNormalPosition.bottom));
1600 size_hints.rcNormalPosition.right =
1601 size_hints.rcNormalPosition.left + geometry->base_width;
1602 size_hints.rcNormalPosition.bottom =
1603 size_hints.rcNormalPosition.top + geometry->base_height;
1604 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1605 size_hints.rcNormalPosition.left,
1606 size_hints.rcNormalPosition.top,
1607 size_hints.rcNormalPosition.right,
1608 size_hints.rcNormalPosition.bottom));
1609 API_CALL (SetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints));
1614 if (geom_mask & GDK_HINT_RESIZE_INC)
1616 GDK_NOTE (MISC, g_print ("... RESIZE_INC: (%d,%d)\n",
1617 geometry->width_inc, geometry->height_inc));
1620 if (geom_mask & GDK_HINT_ASPECT)
1622 GDK_NOTE (MISC, g_print ("... ASPECT: %g--%g\n",
1623 geometry->min_aspect, geometry->max_aspect));
1626 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1628 GDK_NOTE (MISC, g_print ("... GRAVITY: %d\n", geometry->win_gravity));
1633 gdk_window_set_title (GdkWindow *window,
1638 g_return_if_fail (window != NULL);
1639 g_return_if_fail (GDK_IS_WINDOW (window));
1640 g_return_if_fail (title != NULL);
1642 /* Empty window titles not allowed, so set it to just a period. */
1646 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p: %s\n",
1647 GDK_WINDOW_HWND (window), title));
1649 if (!GDK_WINDOW_DESTROYED (window))
1651 /* As the title is in UTF-8 we must translate it
1652 * to the system codepage.
1654 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1655 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), mbtitle));
1661 gdk_window_set_role (GdkWindow *window,
1664 g_return_if_fail (window != NULL);
1665 g_return_if_fail (GDK_IS_WINDOW (window));
1667 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p: %s\n",
1668 GDK_WINDOW_HWND (window),
1669 (role ? role : "NULL")));
1674 gdk_window_set_transient_for (GdkWindow *window,
1677 HWND window_id, parent_id;
1679 g_return_if_fail (window != NULL);
1680 g_return_if_fail (GDK_IS_WINDOW (window));
1682 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p: %p\n",
1683 GDK_WINDOW_HWND (window),
1684 GDK_WINDOW_HWND (parent)));
1686 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1689 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1691 GDK_NOTE (MISC, g_print ("...a child window!\n"));
1695 window_id = GDK_WINDOW_HWND (window);
1696 parent_id = GDK_WINDOW_HWND (parent);
1698 /* This changes the *owner* of the window, despite the misleading
1699 * name. (Owner and parent are unrelated concepts.) At least that's
1700 * what people who seem to know what they talk about say on
1701 * USENET. Search on Google.
1704 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1705 GetLastError () != 0)
1706 WIN32_API_FAILED ("SetWindowLong");
1710 gdk_window_set_background (GdkWindow *window,
1711 const GdkColor *color)
1713 GdkWindowObject *private = (GdkWindowObject *)window;
1715 g_return_if_fail (window != NULL);
1716 g_return_if_fail (GDK_IS_WINDOW (window));
1718 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
1719 GDK_WINDOW_HWND (window),
1720 _gdk_win32_color_to_string (color)));
1722 private->bg_color = *color;
1724 if (private->bg_pixmap &&
1725 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1726 private->bg_pixmap != GDK_NO_BG)
1728 g_object_unref (private->bg_pixmap);
1729 private->bg_pixmap = NULL;
1734 gdk_window_set_back_pixmap (GdkWindow *window,
1736 gint parent_relative)
1738 GdkWindowObject *private = (GdkWindowObject *)window;
1740 g_return_if_fail (window != NULL);
1741 g_return_if_fail (GDK_IS_WINDOW (window));
1742 g_return_if_fail (pixmap == NULL || !parent_relative);
1743 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1745 if (private->bg_pixmap &&
1746 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1747 private->bg_pixmap != GDK_NO_BG)
1748 g_object_unref (private->bg_pixmap);
1750 if (parent_relative)
1752 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1753 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1759 g_object_ref (pixmap);
1760 private->bg_pixmap = pixmap;
1764 private->bg_pixmap = GDK_NO_BG;
1770 gdk_window_set_cursor (GdkWindow *window,
1773 GdkWindowImplWin32 *impl;
1774 GdkCursorPrivate *cursor_private;
1775 GdkWindowObject *parent_window;
1777 HCURSOR hprevcursor;
1779 g_return_if_fail (window != NULL);
1780 g_return_if_fail (GDK_IS_WINDOW (window));
1782 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1783 cursor_private = (GdkCursorPrivate*) cursor;
1785 if (GDK_WINDOW_DESTROYED (window))
1791 hcursor = cursor_private->hcursor;
1793 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p: %p\n",
1794 GDK_WINDOW_HWND (window),
1797 /* First get the old cursor, if any (we wait to free the old one
1798 * since it may be the current cursor set in the Win32 API right
1801 hprevcursor = impl->hcursor;
1803 if (hcursor == NULL)
1804 impl->hcursor = NULL;
1807 /* We must copy the cursor as it is OK to destroy the GdkCursor
1808 * while still in use for some window. See for instance
1809 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1810 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1813 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1814 WIN32_API_FAILED ("CopyCursor");
1815 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1816 hcursor, impl->hcursor));
1819 /* If the pointer is over our window, set new cursor if given */
1820 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1821 if (impl->hcursor != NULL)
1822 SetCursor (impl->hcursor);
1824 /* Destroy the previous cursor: Need to make sure it's no longer in
1825 * use before we destroy it, in case we're not over our window but
1826 * the cursor is still set to our old one.
1828 if (hprevcursor != NULL)
1830 if (GetCursor() == hprevcursor)
1832 /* Look for a suitable cursor to use instead */
1834 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1835 while (hcursor == NULL)
1839 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1840 hcursor = impl->hcursor;
1841 parent_window = parent_window->parent;
1845 hcursor = LoadCursor (NULL, IDC_ARROW);
1848 SetCursor (hcursor);
1851 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1854 API_CALL (DestroyCursor, (hprevcursor));
1859 gdk_window_get_geometry (GdkWindow *window,
1866 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1869 window = _gdk_parent_root;
1871 if (!GDK_WINDOW_DESTROYED (window))
1875 API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
1877 if (window != _gdk_parent_root)
1880 GdkWindow *parent = gdk_window_get_parent (window);
1884 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1885 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1891 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1892 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1896 if (parent == _gdk_parent_root)
1898 rect.left += _gdk_offset_x;
1899 rect.top += _gdk_offset_y;
1900 rect.right += _gdk_offset_x;
1901 rect.bottom += _gdk_offset_y;
1910 *width = rect.right - rect.left;
1912 *height = rect.bottom - rect.top;
1914 *depth = gdk_drawable_get_visual (window)->depth;
1916 GDK_NOTE (MISC, g_print ("gdk_window_get_geometry: %p: %ldx%ldx%d@+%ld+%ld\n",
1917 GDK_WINDOW_HWND (window),
1918 rect.right - rect.left, rect.bottom - rect.top,
1919 gdk_drawable_get_visual (window)->depth,
1920 rect.left, rect.top));
1925 gdk_window_get_origin (GdkWindow *window,
1933 g_return_val_if_fail (window != NULL, 0);
1935 if (!GDK_WINDOW_DESTROYED (window))
1941 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1950 *x = tx + _gdk_offset_x;
1952 *y = ty + _gdk_offset_y;
1954 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1955 GDK_WINDOW_HWND (window),
1961 gdk_window_get_deskrelative_origin (GdkWindow *window,
1965 return gdk_window_get_origin (window, x, y);
1969 gdk_window_get_root_origin (GdkWindow *window,
1975 g_return_if_fail (GDK_IS_WINDOW (window));
1977 gdk_window_get_frame_extents (window, &rect);
1985 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: +%d+%d\n",
1986 GDK_WINDOW_HWND (window), rect.x, rect.y));
1990 gdk_window_get_frame_extents (GdkWindow *window,
1993 GdkWindowObject *private;
1997 g_return_if_fail (GDK_IS_WINDOW (window));
1998 g_return_if_fail (rect != NULL);
2000 private = GDK_WINDOW_OBJECT (window);
2007 if (GDK_WINDOW_DESTROYED (window))
2010 /* FIXME: window is documented to be a toplevel GdkWindow, so is it really
2011 * necessary to walk its parent chain?
2013 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2014 private = (GdkWindowObject*) private->parent;
2016 hwnd = GDK_WINDOW_HWND (window);
2018 /* find the frame window */
2019 while (HWND_DESKTOP != GetParent (hwnd))
2021 hwnd = GetParent (hwnd);
2022 g_return_if_fail (NULL != hwnd);
2025 API_CALL (GetWindowRect, (hwnd, &r));
2027 rect->x = r.left + _gdk_offset_x;
2028 rect->y = r.top + _gdk_offset_y;
2029 rect->width = r.right - r.left;
2030 rect->height = r.bottom - r.top;
2032 GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@+%ld+%ld\n",
2033 GDK_WINDOW_HWND (window),
2034 r.right - r.left, r.bottom - r.top,
2039 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2043 GdkModifierType *mask)
2045 GdkWindow *return_val;
2046 POINT screen_point, point;
2050 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2053 GetCursorPos (&screen_point);
2054 point = screen_point;
2055 ScreenToClient (GDK_WINDOW_HWND (window), &point);
2060 if (window == _gdk_parent_root)
2062 *x += _gdk_offset_x;
2063 *y += _gdk_offset_y;
2066 hwnd = WindowFromPoint (screen_point);
2069 gboolean done = FALSE;
2073 point = screen_point;
2074 ScreenToClient (hwnd, &point);
2075 hwndc = ChildWindowFromPoint (hwnd, point);
2078 else if (hwndc == hwnd)
2084 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
2089 GetKeyboardState (kbd);
2091 if (kbd[VK_SHIFT] & 0x80)
2092 *mask |= GDK_SHIFT_MASK;
2093 if (kbd[VK_CAPITAL] & 0x80)
2094 *mask |= GDK_LOCK_MASK;
2095 if (kbd[VK_CONTROL] & 0x80)
2096 *mask |= GDK_CONTROL_MASK;
2097 if (kbd[VK_MENU] & 0x80)
2098 *mask |= GDK_MOD1_MASK;
2099 if (kbd[VK_LBUTTON] & 0x80)
2100 *mask |= GDK_BUTTON1_MASK;
2101 if (kbd[VK_MBUTTON] & 0x80)
2102 *mask |= GDK_BUTTON2_MASK;
2103 if (kbd[VK_RBUTTON] & 0x80)
2104 *mask |= GDK_BUTTON3_MASK;
2110 _gdk_windowing_get_pointer (GdkDisplay *display,
2114 GdkModifierType *mask)
2116 GdkScreen *default_screen = gdk_display_get_default_screen (display);
2117 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
2119 *screen = default_screen;
2120 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
2124 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2129 POINT point, pointc;
2133 GetCursorPos (&pointc);
2135 hwnd = WindowFromPoint (point);
2139 window = _gdk_parent_root;
2140 *win_x = pointc.x + _gdk_offset_x;
2141 *win_y = pointc.y + _gdk_offset_y;
2145 ScreenToClient (hwnd, &point);
2148 hwndc = ChildWindowFromPoint (hwnd, point);
2149 ClientToScreen (hwnd, &point);
2150 ScreenToClient (hwndc, &point);
2151 } while (hwndc != hwnd && (hwnd = hwndc, 1));
2153 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
2155 if (window && (win_x || win_y))
2157 GetClientRect (hwnd, &rect);
2158 *win_x = point.x - rect.left;
2159 *win_y = point.y - rect.top;
2162 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: +%d+%d %p%s\n",
2165 (window == NULL ? " NULL" : "")));
2171 gdk_window_get_events (GdkWindow *window)
2173 g_return_val_if_fail (window != NULL, 0);
2174 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2176 if (GDK_WINDOW_DESTROYED (window))
2179 return GDK_WINDOW_OBJECT (window)->event_mask;
2183 gdk_window_set_events (GdkWindow *window,
2184 GdkEventMask event_mask)
2186 g_return_if_fail (window != NULL);
2187 g_return_if_fail (GDK_IS_WINDOW (window));
2189 if (GDK_WINDOW_DESTROYED (window))
2192 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2193 * set it here, too. Not that I know or remember why it is
2194 * necessary, will have to test some day.
2196 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2200 gdk_window_shape_combine_mask (GdkWindow *window,
2204 g_return_if_fail (window != NULL);
2205 g_return_if_fail (GDK_IS_WINDOW (window));
2209 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
2210 GDK_WINDOW_HWND (window)));
2211 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2218 /* Convert mask bitmap to region */
2219 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2221 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n",
2222 GDK_WINDOW_HWND (window),
2223 GDK_WINDOW_HWND (mask)));
2225 _gdk_win32_get_adjusted_client_rect (window, &rect);
2227 OffsetRgn (hrgn, -rect.left, -rect.top);
2228 OffsetRgn (hrgn, x, y);
2230 /* If this is a top-level window, add the title bar to the region */
2231 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2233 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2234 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2238 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2243 gdk_window_set_override_redirect (GdkWindow *window,
2244 gboolean override_redirect)
2246 g_return_if_fail (window != NULL);
2247 g_return_if_fail (GDK_IS_WINDOW (window));
2249 g_warning ("gdk_window_set_override_redirect not implemented");
2253 gdk_window_set_accept_focus (GdkWindow *window,
2254 gboolean accept_focus)
2256 GdkWindowObject *private;
2257 g_return_if_fail (window != NULL);
2258 g_return_if_fail (GDK_IS_WINDOW (window));
2260 private = (GdkWindowObject *)window;
2262 accept_focus = accept_focus != FALSE;
2264 if (private->accept_focus != accept_focus)
2265 private->accept_focus = accept_focus;
2269 gdk_window_set_focus_on_map (GdkWindow *window,
2270 gboolean focus_on_map)
2272 GdkWindowObject *private;
2273 g_return_if_fail (window != NULL);
2274 g_return_if_fail (GDK_IS_WINDOW (window));
2276 private = (GdkWindowObject *)window;
2278 focus_on_map = focus_on_map != FALSE;
2280 if (private->focus_on_map != focus_on_map)
2281 private->focus_on_map = focus_on_map;
2285 pixbuf_to_hicon_alpha_winxp (GdkWindow *window,
2288 /* Based on code from
2289 * http://www.dotnet247.com/247reference/msgs/13/66301.aspx
2293 HBITMAP hBitmap, hMonoBitmap;
2294 guchar *indata, *inrow;
2295 guchar *outdata, *outrow;
2296 HICON hAlphaIcon = NULL;
2298 gint width, height, i, j, rowstride;
2303 width = gdk_pixbuf_get_width (pixbuf); /* width of icon */
2304 height = gdk_pixbuf_get_height (pixbuf); /* height of icon */
2306 ZeroMemory (&bi, sizeof (BITMAPV5HEADER));
2307 bi.bV5Size = sizeof (BITMAPV5HEADER);
2308 bi.bV5Width = width;
2309 bi.bV5Height = height;
2311 bi.bV5BitCount = 32;
2312 bi.bV5Compression = BI_BITFIELDS;
2313 /* The following mask specification specifies a supported 32 BPP
2314 * alpha format for Windows XP (BGRA format).
2316 bi.bV5RedMask = 0x00FF0000;
2317 bi.bV5GreenMask = 0x0000FF00;
2318 bi.bV5BlueMask = 0x000000FF;
2319 bi.bV5AlphaMask = 0xFF000000;
2321 /* Create the DIB section with an alpha channel. */
2323 hBitmap = CreateDIBSection (hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS,
2324 (void **)&outdata, NULL, (DWORD)0);
2325 ReleaseDC (NULL, hdc);
2327 /* Draw something on the DIB section */
2328 indata = gdk_pixbuf_get_pixels (pixbuf);
2329 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
2330 for (j=0; j<height; j++)
2332 outrow = outdata + 4*j*width;
2333 inrow = indata + (height-j-1)*rowstride;
2334 for (i=0; i<width; i++)
2336 outrow[4*i+0] = inrow[4*i+2];
2337 outrow[4*i+1] = inrow[4*i+1];
2338 outrow[4*i+2] = inrow[4*i+0];
2339 outrow[4*i+3] = inrow[4*i+3];
2343 /* Create an empty mask bitmap */
2344 hMonoBitmap = CreateBitmap (width, height, 1, 1, NULL);
2349 ii.hbmMask = hMonoBitmap;
2350 ii.hbmColor = hBitmap;
2352 /* Create the alpha cursor with the alpha DIB section */
2353 hAlphaIcon = CreateIconIndirect (&ii);
2355 GDI_CALL (DeleteObject, (hBitmap));
2356 GDI_CALL (DeleteObject, (hMonoBitmap));
2362 pixbuf_to_hicon_normal (GdkWindow *window,
2367 HBITMAP hbmmask = NULL;
2375 /* create a normal icon with a bitmap mask */
2376 w = gdk_pixbuf_get_width (pixbuf);
2377 h = gdk_pixbuf_get_height (pixbuf);
2378 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
2379 gdk_drawable_get_colormap (window),
2384 /* we need the inverted mask for the XOR op */
2386 HDC hdc1 = CreateCompatibleDC (NULL);
2389 hbmmask = CreateCompatibleBitmap (hdc1, w, h);
2390 hbmold1 = SelectObject (hdc1, hbmmask);
2393 HDC hdc2 = CreateCompatibleDC (NULL);
2394 HBITMAP hbmold2 = SelectObject (hdc2, GDK_PIXMAP_HBITMAP (mask));
2395 GDI_CALL (BitBlt, (hdc1, 0,0,w,h, hdc2, 0,0, NOTSRCCOPY));
2396 GDI_CALL (SelectObject, (hdc2, hbmold2));
2397 GDI_CALL (DeleteDC, (hdc2));
2402 GetClipBox (hdc1, &rect);
2403 GDI_CALL (FillRect, (hdc1, &rect, GetStockObject (BLACK_BRUSH)));
2405 GDI_CALL (SelectObject, (hdc1, hbmold1));
2406 GDI_CALL (DeleteDC, (hdc1));
2410 ii.xHotspot = ii.yHotspot = 0; /* ignored for icons */
2411 ii.hbmMask = hbmmask;
2412 ii.hbmColor = GDK_PIXMAP_HBITMAP (pixmap);
2413 hIcon = CreateIconIndirect (&ii);
2415 WIN32_API_FAILED ("CreateIconIndirect");
2416 GDI_CALL (DeleteObject, (hbmmask));
2418 #if 0 /* to debug pixmap and mask setting */
2421 GdkPixbuf* pixbuf = NULL;
2424 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, w, h);
2427 num = (num + 1) % 999; /* restrict maximim number */
2428 sprintf (name, "c:\\temp\\ico%03dpixm.png", num);
2429 gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL);
2430 gdk_pixbuf_unref (pixbuf);
2436 g_object_unref (G_OBJECT (pixmap));
2438 g_object_unref (G_OBJECT (mask));
2444 pixbuf_to_hicon (GdkWindow *window,
2447 static gboolean is_win_xp=FALSE, is_win_xp_checked=FALSE;
2449 if (!is_win_xp_checked)
2451 OSVERSIONINFO version;
2453 is_win_xp_checked = TRUE;
2454 memset (&version, 0, sizeof (version));
2455 version.dwOSVersionInfoSize = sizeof (version);
2456 is_win_xp = GetVersionEx (&version)
2457 && version.dwPlatformId == VER_PLATFORM_WIN32_NT
2458 && (version.dwMajorVersion > 5
2459 || (version.dwMajorVersion == 5 && version.dwMinorVersion >= 1));
2465 if (is_win_xp && gdk_pixbuf_get_has_alpha (pixbuf))
2466 return pixbuf_to_hicon_alpha_winxp (window, pixbuf);
2468 return pixbuf_to_hicon_normal (window, pixbuf);
2472 gdk_window_set_icon_list (GdkWindow *window,
2475 GdkPixbuf *pixbuf, *big_pixbuf, *small_pixbuf;
2476 gint big_diff, small_diff;
2477 gint big_w, big_h, small_w, small_h;
2480 HICON small_hicon, big_hicon;
2481 GdkWindowImplWin32 *impl;
2482 gint i, big_i, small_i;
2484 g_return_if_fail (GDK_IS_WINDOW (window));
2486 if (GDK_WINDOW_DESTROYED (window))
2489 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
2491 /* ideal sizes for small and large icons */
2492 big_w = GetSystemMetrics (SM_CXICON);
2493 big_h = GetSystemMetrics (SM_CYICON);
2494 small_w = GetSystemMetrics (SM_CXSMICON);
2495 small_h = GetSystemMetrics (SM_CYSMICON);
2497 /* find closest sized icons in the list */
2499 small_pixbuf = NULL;
2505 pixbuf = (GdkPixbuf*) pixbufs->data;
2506 w = gdk_pixbuf_get_width (pixbuf);
2507 h = gdk_pixbuf_get_height (pixbuf);
2509 dw = ABS (w - big_w);
2510 dh = ABS (h - big_h);
2511 diff = dw*dw + dh*dh;
2512 if (big_pixbuf == NULL || diff < big_diff)
2514 big_pixbuf = pixbuf;
2519 dw = ABS(w - small_w);
2520 dh = ABS(h - small_h);
2521 diff = dw*dw + dh*dh;
2522 if (small_pixbuf == NULL || diff < small_diff)
2524 small_pixbuf = pixbuf;
2529 pixbufs = g_list_next (pixbufs);
2533 /* Create the icons */
2534 big_hicon = pixbuf_to_hicon (window, big_pixbuf);
2535 small_hicon = pixbuf_to_hicon (window, small_pixbuf);
2538 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG,
2540 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_SMALL,
2541 (LPARAM)small_hicon);
2543 /* Store the icons, destroying any previous icons */
2544 if (impl->hicon_big)
2545 GDI_CALL (DestroyIcon, (impl->hicon_big));
2546 impl->hicon_big = big_hicon;
2547 if (impl->hicon_small)
2548 GDI_CALL (DestroyIcon, (impl->hicon_small));
2549 impl->hicon_small = small_hicon;
2553 gdk_window_set_icon (GdkWindow *window,
2554 GdkWindow *icon_window,
2558 g_return_if_fail (window != NULL);
2559 g_return_if_fail (GDK_IS_WINDOW (window));
2561 /* do nothing, use gdk_window_set_icon_list instead */
2565 gdk_window_set_icon_name (GdkWindow *window,
2568 g_return_if_fail (window != NULL);
2569 g_return_if_fail (GDK_IS_WINDOW (window));
2571 if (GDK_WINDOW_DESTROYED (window))
2574 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));
2578 gdk_window_get_group (GdkWindow *window)
2580 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
2581 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2583 if (GDK_WINDOW_DESTROYED (window))
2586 g_warning ("gdk_window_get_group not yet implemented");
2592 gdk_window_set_group (GdkWindow *window,
2595 g_return_if_fail (window != NULL);
2596 g_return_if_fail (GDK_IS_WINDOW (window));
2597 g_return_if_fail (leader != NULL);
2598 g_return_if_fail (GDK_IS_WINDOW (leader));
2600 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2603 g_warning ("gdk_window_set_group not implemented");
2607 gdk_window_set_decorations (GdkWindow *window,
2608 GdkWMDecoration decorations)
2611 const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
2613 g_return_if_fail (window != NULL);
2614 g_return_if_fail (GDK_IS_WINDOW (window));
2616 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s%s%s%s%s%s%s\n",
2617 GDK_WINDOW_HWND (window),
2618 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2619 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2620 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2621 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2622 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2623 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2624 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2626 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2630 if (decorations & GDK_DECOR_BORDER)
2632 if (decorations & GDK_DECOR_RESIZEH)
2633 bits |= WS_THICKFRAME;
2634 if (decorations & GDK_DECOR_TITLE)
2636 if (decorations & GDK_DECOR_MENU)
2638 if (decorations & GDK_DECOR_MINIMIZE)
2639 bits |= WS_MINIMIZEBOX;
2640 if (decorations & GDK_DECOR_MAXIMIZE)
2641 bits |= WS_MAXIMIZEBOX;
2643 if (decorations & GDK_DECOR_ALL)
2644 style |= settable_bits, style &= ~bits;
2646 style &= ~settable_bits, style |= bits;
2648 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2649 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2650 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2651 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2655 gdk_window_get_decorations(GdkWindow *window,
2656 GdkWMDecoration *decorations)
2658 LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2662 if (style & WS_BORDER)
2663 *decorations |= GDK_DECOR_BORDER;
2664 if (style & WS_THICKFRAME)
2665 *decorations |= GDK_DECOR_RESIZEH;
2666 if (style & WS_CAPTION)
2667 *decorations |= GDK_DECOR_TITLE;
2668 if (style & WS_SYSMENU)
2669 *decorations |= GDK_DECOR_MENU;
2670 if (style & WS_MINIMIZEBOX)
2671 *decorations |= GDK_DECOR_MINIMIZE;
2672 if (style & WS_MAXIMIZEBOX)
2673 *decorations |= GDK_DECOR_MAXIMIZE;
2675 return *decorations != 0;
2679 gdk_window_set_functions (GdkWindow *window,
2680 GdkWMFunction functions)
2683 const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU);
2685 g_return_if_fail (window != NULL);
2686 g_return_if_fail (GDK_IS_WINDOW (window));
2688 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p: %s%s%s%s%s%s\n",
2689 GDK_WINDOW_HWND (window),
2690 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2691 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2692 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2693 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2694 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2695 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2697 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2701 if (functions & GDK_FUNC_RESIZE)
2702 bits |= WS_THICKFRAME;
2703 if (functions & GDK_FUNC_MOVE)
2704 bits |= (WS_THICKFRAME|WS_SYSMENU);
2705 if (functions & GDK_FUNC_MINIMIZE)
2706 bits |= WS_MINIMIZEBOX;
2707 if (functions & GDK_FUNC_MAXIMIZE)
2708 bits |= WS_MAXIMIZEBOX;
2709 if (functions & GDK_FUNC_CLOSE)
2712 if (functions & GDK_FUNC_ALL)
2713 style |= settable_bits, style &= ~bits;
2715 style &= ~settable_bits, style |= bits;
2717 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2718 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2719 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2720 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2724 QueryTree (HWND hwnd,
2734 child = GetWindow (hwnd, GW_CHILD);
2736 child = GetWindow (child, GW_HWNDNEXT);
2739 } while (child != NULL);
2743 *children = g_new (HWND, n);
2744 for (i = 0; i < n; i++)
2747 child = GetWindow (hwnd, GW_CHILD);
2749 child = GetWindow (child, GW_HWNDNEXT);
2750 *children[i] = child;
2756 gdk_propagate_shapes (HANDLE win,
2760 HRGN region, childRegion;
2764 SetRectEmpty (&emptyRect);
2765 region = CreateRectRgnIndirect (&emptyRect);
2767 GetWindowRgn (win, region);
2769 QueryTree (win, &list, &num);
2772 WINDOWPLACEMENT placement;
2774 placement.length = sizeof (WINDOWPLACEMENT);
2775 /* go through all child windows and combine regions */
2776 for (i = 0; i < num; i++)
2778 GetWindowPlacement (list[i], &placement);
2779 if (placement.showCmd == SW_SHOWNORMAL)
2781 childRegion = CreateRectRgnIndirect (&emptyRect);
2782 GetWindowRgn (list[i], childRegion);
2783 CombineRgn (region, region, childRegion, RGN_OR);
2784 DeleteObject (childRegion);
2787 SetWindowRgn (win, region, TRUE);
2791 DeleteObject (region);
2795 gdk_window_set_child_shapes (GdkWindow *window)
2797 g_return_if_fail (window != NULL);
2798 g_return_if_fail (GDK_IS_WINDOW (window));
2800 if (GDK_WINDOW_DESTROYED (window))
2803 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2807 gdk_window_merge_child_shapes (GdkWindow *window)
2809 g_return_if_fail (window != NULL);
2810 g_return_if_fail (GDK_IS_WINDOW (window));
2812 if (GDK_WINDOW_DESTROYED (window))
2815 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2819 gdk_window_set_static_gravities (GdkWindow *window,
2820 gboolean use_static)
2822 GdkWindowObject *private = (GdkWindowObject *)window;
2824 g_return_val_if_fail (window != NULL, FALSE);
2825 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2827 if (!use_static == !private->guffaw_gravity)
2833 private->guffaw_gravity = use_static;
2839 gdk_window_begin_resize_drag (GdkWindow *window,
2846 g_return_if_fail (GDK_IS_WINDOW (window));
2848 if (GDK_WINDOW_DESTROYED (window))
2851 /* XXX: isn't all this default on win32 ... */
2855 gdk_window_begin_move_drag (GdkWindow *window,
2861 g_return_if_fail (GDK_IS_WINDOW (window));
2863 if (GDK_WINDOW_DESTROYED (window))
2866 /* XXX: isn't all this default on win32 ... */
2871 * Setting window states
2874 gdk_window_iconify (GdkWindow *window)
2876 HWND old_active_window;
2878 g_return_if_fail (window != NULL);
2879 g_return_if_fail (GDK_IS_WINDOW (window));
2881 if (GDK_WINDOW_DESTROYED (window))
2884 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p: %s\n",
2885 GDK_WINDOW_HWND (window),
2886 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2888 if (GDK_WINDOW_IS_MAPPED (window))
2890 old_active_window = GetActiveWindow ();
2891 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2892 if (old_active_window != GDK_WINDOW_HWND (window))
2893 SetActiveWindow (old_active_window);
2897 gdk_synthesize_window_state (window,
2899 GDK_WINDOW_STATE_ICONIFIED);
2904 gdk_window_deiconify (GdkWindow *window)
2906 g_return_if_fail (window != NULL);
2907 g_return_if_fail (GDK_IS_WINDOW (window));
2909 if (GDK_WINDOW_DESTROYED (window))
2912 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p: %s\n",
2913 GDK_WINDOW_HWND (window),
2914 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2916 if (GDK_WINDOW_IS_MAPPED (window))
2918 show_window_internal (window, FALSE, TRUE);
2922 gdk_synthesize_window_state (window,
2923 GDK_WINDOW_STATE_ICONIFIED,
2929 gdk_window_stick (GdkWindow *window)
2931 g_return_if_fail (GDK_IS_WINDOW (window));
2933 if (GDK_WINDOW_DESTROYED (window))
2936 /* FIXME: Do something? */
2940 gdk_window_unstick (GdkWindow *window)
2942 g_return_if_fail (GDK_IS_WINDOW (window));
2944 if (GDK_WINDOW_DESTROYED (window))
2947 /* FIXME: Do something? */
2951 gdk_window_maximize (GdkWindow *window)
2953 g_return_if_fail (GDK_IS_WINDOW (window));
2955 if (GDK_WINDOW_DESTROYED (window))
2958 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p: %s\n",
2959 GDK_WINDOW_HWND (window),
2960 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2962 if (GDK_WINDOW_IS_MAPPED (window))
2963 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2965 gdk_synthesize_window_state (window,
2967 GDK_WINDOW_STATE_MAXIMIZED);
2971 gdk_window_unmaximize (GdkWindow *window)
2973 g_return_if_fail (GDK_IS_WINDOW (window));
2975 if (GDK_WINDOW_DESTROYED (window))
2978 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p: %s\n",
2979 GDK_WINDOW_HWND (window),
2980 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2982 if (GDK_WINDOW_IS_MAPPED (window))
2983 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2985 gdk_synthesize_window_state (window,
2986 GDK_WINDOW_STATE_MAXIMIZED,
2990 typedef struct _FullscreenInfo FullscreenInfo;
2992 struct _FullscreenInfo
3000 gdk_window_fullscreen (GdkWindow *window)
3004 GdkWindowObject *private = (GdkWindowObject *) window;
3006 g_return_if_fail (GDK_IS_WINDOW (window));
3008 fi = g_new (FullscreenInfo, 1);
3010 if (!GetWindowRect (GDK_WINDOW_HWND (window), &(fi->r)))
3014 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3016 width = GetSystemMetrics (SM_CXSCREEN);
3017 height = GetSystemMetrics (SM_CYSCREEN);
3019 /* remember for restoring */
3020 fi->hint_flags = impl->hint_flags;
3021 impl->hint_flags &= ~GDK_HINT_MAX_SIZE;
3022 g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
3023 fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
3025 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3026 (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
3027 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP /*not MOST, taskswitch!*/,
3028 0, 0, width, height,
3029 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
3030 WIN32_API_FAILED ("SetWindowPos");
3032 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
3037 gdk_window_unfullscreen (GdkWindow *window)
3040 GdkWindowObject *private = (GdkWindowObject *) window;
3042 g_return_if_fail (GDK_IS_WINDOW (window));
3044 fi = g_object_get_data (G_OBJECT(window), "fullscreen-info");
3047 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3049 impl->hint_flags = fi->hint_flags;
3050 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
3051 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
3052 fi->r.left, fi->r.top, fi->r.right - fi->r.left, fi->r.bottom - fi->r.top,
3053 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
3054 WIN32_API_FAILED ("SetWindowPos");
3056 g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
3059 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
3064 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
3066 g_return_if_fail (GDK_IS_WINDOW (window));
3068 if (GDK_WINDOW_DESTROYED (window))
3071 if (GDK_WINDOW_IS_MAPPED (window))
3073 if (!SetWindowPos(GDK_WINDOW_HWND (window), setting ? HWND_TOPMOST : HWND_NOTOPMOST,
3074 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE))
3075 WIN32_API_FAILED ("SetWindowPos");
3078 gdk_synthesize_window_state (window,
3079 setting ? GDK_WINDOW_STATE_BELOW : GDK_WINDOW_STATE_ABOVE,
3080 setting ? GDK_WINDOW_STATE_ABOVE : 0);
3084 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
3086 g_return_if_fail (GDK_IS_WINDOW (window));
3088 if (GDK_WINDOW_DESTROYED (window))
3091 if (GDK_WINDOW_IS_MAPPED (window))
3093 if (!SetWindowPos(GDK_WINDOW_HWND (window), setting ? HWND_BOTTOM : HWND_NOTOPMOST,
3094 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE))
3095 WIN32_API_FAILED ("SetWindowPos");
3098 gdk_synthesize_window_state (window,
3099 setting ? GDK_WINDOW_STATE_ABOVE : GDK_WINDOW_STATE_BELOW,
3100 setting ? GDK_WINDOW_STATE_BELOW : 0);
3104 gdk_window_focus (GdkWindow *window,
3107 g_return_if_fail (GDK_IS_WINDOW (window));
3109 if (GDK_WINDOW_DESTROYED (window))
3112 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p: %s\n",
3113 GDK_WINDOW_HWND (window),
3114 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3116 if (((GdkWindowObject *) window)->state & GDK_WINDOW_STATE_MAXIMIZED)
3117 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
3119 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
3120 SetFocus (GDK_WINDOW_HWND (window));
3124 gdk_window_set_modal_hint (GdkWindow *window,
3127 GdkWindowObject *private;
3129 g_return_if_fail (window != NULL);
3130 g_return_if_fail (GDK_IS_WINDOW (window));
3132 if (GDK_WINDOW_DESTROYED (window))
3135 private = (GdkWindowObject*) window;
3137 private->modal_hint = modal;
3139 if (GDK_WINDOW_IS_MAPPED (window))
3140 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3141 modal ? HWND_TOPMOST : HWND_NOTOPMOST,
3142 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE));
3146 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
3147 gboolean skips_taskbar)
3149 static GdkWindow *owner = NULL;
3152 g_return_if_fail (GDK_IS_WINDOW (window));
3154 GDK_NOTE (MISC, g_print ("gdk_window_set_skip_taskbar_hint: %p: %s\n",
3155 GDK_WINDOW_HWND (window),
3156 skips_taskbar ? "TRUE" : "FALSE"));
3162 wa.window_type = GDK_WINDOW_TEMP;
3163 wa.wclass = GDK_INPUT_OUTPUT;
3164 wa.width = wa.height = 1;
3166 owner = gdk_window_new_internal (NULL, &wa, 0, TRUE);
3169 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT,
3170 (long) GDK_WINDOW_HWND (owner));
3172 #if 0 /* Should we also turn off the minimize and maximize buttons? */
3173 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3174 GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE) & ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU));
3175 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
3176 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
3177 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
3182 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT, 0);
3187 gdk_window_set_skip_pager_hint (GdkWindow *window,
3188 gboolean skips_pager)
3190 g_return_if_fail (GDK_IS_WINDOW (window));
3194 gdk_window_set_type_hint (GdkWindow *window,
3195 GdkWindowTypeHint hint)
3197 g_return_if_fail (window != NULL);
3198 g_return_if_fail (GDK_IS_WINDOW (window));
3200 if (GDK_WINDOW_DESTROYED (window))
3203 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p: %d\n",
3204 GDK_WINDOW_HWND (window), hint));
3207 case GDK_WINDOW_TYPE_HINT_DIALOG:
3209 case GDK_WINDOW_TYPE_HINT_MENU:
3210 gdk_window_set_decorations (window,
3213 GDK_DECOR_MINIMIZE |
3214 GDK_DECOR_MAXIMIZE);
3216 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
3217 gdk_window_set_skip_taskbar_hint (window, TRUE);
3219 case GDK_WINDOW_TYPE_HINT_UTILITY:
3221 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
3222 gdk_window_set_decorations (window,
3226 GDK_DECOR_MINIMIZE |
3227 GDK_DECOR_MAXIMIZE);
3229 case GDK_WINDOW_TYPE_HINT_DOCK:
3231 case GDK_WINDOW_TYPE_HINT_DESKTOP:
3234 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
3236 case GDK_WINDOW_TYPE_HINT_NORMAL:
3242 gdk_window_shape_combine_region (GdkWindow *window,
3243 GdkRegion *shape_region,
3247 g_return_if_fail (GDK_IS_WINDOW (window));
3249 if (GDK_WINDOW_DESTROYED (window))
3252 /* XXX: even on X implemented conditional ... */
3256 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
3258 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
3260 return gdk_window_lookup (anid);
3264 gdk_window_enable_synchronized_configure (GdkWindow *window)
3269 gdk_window_configure_finished (GdkWindow *window)