1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdkevents.h"
31 #include "gdkpixmap.h"
32 #include "gdkwindow.h"
33 #include "gdkinternals.h"
34 #include "gdkprivate-win32.h"
35 #include "gdkinput-win32.h"
37 static gboolean gdk_window_gravity_works (void);
38 static void gdk_window_set_static_win_gravity (GdkWindow *window,
41 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
42 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
44 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
47 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
48 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
49 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
50 static void gdk_window_impl_win32_finalize (GObject *object);
52 static gpointer parent_class = NULL;
55 gdk_window_impl_win32_get_type (void)
57 static GType object_type = 0;
61 static const GTypeInfo object_info =
63 sizeof (GdkWindowImplWin32Class),
65 (GBaseFinalizeFunc) NULL,
66 (GClassInitFunc) gdk_window_impl_win32_class_init,
67 NULL, /* class_finalize */
68 NULL, /* class_data */
69 sizeof (GdkWindowImplWin32),
71 (GInstanceInitFunc) gdk_window_impl_win32_init,
74 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
83 _gdk_window_impl_get_type (void)
85 return gdk_window_impl_win32_get_type ();
89 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
97 impl->extension_events_selected = FALSE;
98 impl->input_locale = GetKeyboardLayout (0);
99 TranslateCharsetInfo ((DWORD FAR *) GetACP (), &impl->charset_info,
104 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
106 GObjectClass *object_class = G_OBJECT_CLASS (klass);
107 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
109 parent_class = g_type_class_peek_parent (klass);
111 object_class->finalize = gdk_window_impl_win32_finalize;
113 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
114 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
115 drawable_class->get_size = gdk_window_impl_win32_get_size;
117 /* Visible and clip regions are the same */
118 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
119 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
123 gdk_window_impl_win32_finalize (GObject *object)
125 GdkWindowObject *wrapper;
126 GdkDrawableImplWin32 *draw_impl;
127 GdkWindowImplWin32 *window_impl;
129 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
131 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
132 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
134 wrapper = (GdkWindowObject*) draw_impl->wrapper;
136 if (!GDK_WINDOW_DESTROYED (wrapper))
138 gdk_win32_handle_table_remove (draw_impl->handle);
141 if (window_impl->hcursor != NULL)
143 if (!DestroyCursor (window_impl->hcursor))
144 WIN32_GDI_FAILED("DestroyCursor");
145 window_impl->hcursor = NULL;
148 G_OBJECT_CLASS (parent_class)->finalize (object);
152 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
154 GdkDrawableImplWin32 *drawable_impl;
155 GdkWindowImplWin32 *window_impl;
157 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
159 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
160 window_impl = GDK_WINDOW_IMPL_WIN32 (drawable);
162 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
163 drawable_impl->colormap == NULL)
165 drawable_impl->colormap = gdk_colormap_get_system ();
168 return drawable_impl->colormap;
172 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
175 GdkWindowImplWin32 *impl;
176 GdkDrawableImplWin32 *draw_impl;
178 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
179 g_return_if_fail (gdk_colormap_get_visual (cmap) != gdk_drawable_get_visual (drawable));
181 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
182 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
184 GDK_DRAWABLE_GET_CLASS (draw_impl)->set_colormap (drawable, cmap);
187 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
191 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
195 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
198 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
200 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
204 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
206 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
207 GdkRectangle result_rect;
211 result_rect.width = impl->width;
212 result_rect.height = impl->height;
214 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
216 return gdk_region_rectangle (&result_rect);
220 _gdk_windowing_window_init (void)
222 GdkWindowObject *private;
223 GdkWindowImplWin32 *impl;
224 GdkDrawableImplWin32 *draw_impl;
229 g_assert (gdk_parent_root == NULL);
231 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
232 width = rect.right - rect.left;
233 height = rect.bottom - rect.top;
235 gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
236 private = (GdkWindowObject *)gdk_parent_root;
237 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
238 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
240 draw_impl->handle = gdk_root_window;
241 draw_impl->wrapper = GDK_DRAWABLE (private);
243 private->window_type = GDK_WINDOW_ROOT;
244 private->depth = gdk_visual_get_system ()->depth;
246 impl->height = height;
248 gdk_win32_handle_table_insert (&gdk_root_window, gdk_parent_root);
251 /* The Win API function AdjustWindowRect may return negative values
252 * resulting in obscured title bars. This helper function is coreccting it.
255 SafeAdjustWindowRectEx (RECT* lpRect,
260 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
262 WIN32_API_FAILED ("AdjustWindowRectEx");
265 if (lpRect->left < 0)
267 lpRect->right -= lpRect->left;
272 lpRect->bottom -= lpRect->top;
279 * is a wrapper function for RegisterWindowClassEx.
280 * It creates at least one unique class for every
281 * GdkWindowType. If support for single window-specific icons
282 * is ever needed (e.g Dialog specific), every such window should
286 RegisterGdkClass (GdkWindowType wtype)
288 static ATOM klassTOPLEVEL = 0;
289 static ATOM klassDIALOG = 0;
290 static ATOM klassCHILD = 0;
291 static ATOM klassTEMP = 0;
292 static HICON hAppIcon = NULL;
293 static WNDCLASSEX wcl;
296 wcl.cbSize = sizeof(WNDCLASSEX);
297 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
298 * on WM_SIZE and WM_MOVE. Flicker, Performance!
300 wcl.lpfnWndProc = gdk_window_procedure;
303 wcl.hInstance = gdk_app_hmodule;
305 /* initialize once! */
308 gchar sLoc [_MAX_PATH+1];
310 if (0 != GetModuleFileName (gdk_app_hmodule, sLoc, _MAX_PATH))
312 hAppIcon = ExtractIcon (gdk_app_hmodule, sLoc, 0);
315 char *gdklibname = g_strdup_printf ("gdk-%s.dll", GDK_VERSION);
317 hAppIcon = ExtractIcon (gdk_app_hmodule, gdklibname, 0);
322 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
326 wcl.lpszMenuName = NULL;
329 /* initialize once per class */
330 #define ONCE_PER_CLASS() \
331 wcl.hIcon = CopyIcon (hAppIcon); \
332 wcl.hIconSm = CopyIcon (hAppIcon); \
333 wcl.hbrBackground = CreateSolidBrush (RGB (0,0,0)); \
334 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
338 case GDK_WINDOW_TOPLEVEL:
339 if (0 == klassTOPLEVEL)
341 wcl.lpszClassName = "gdkWindowToplevel";
344 klassTOPLEVEL = RegisterClassEx (&wcl);
346 klass = klassTOPLEVEL;
349 case GDK_WINDOW_CHILD:
352 wcl.lpszClassName = "gdkWindowChild";
354 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
356 klassCHILD = RegisterClassEx (&wcl);
361 case GDK_WINDOW_DIALOG:
362 if (0 == klassDIALOG)
364 wcl.lpszClassName = "gdkWindowDialog";
365 wcl.style |= CS_SAVEBITS;
367 klassDIALOG = RegisterClassEx (&wcl);
372 case GDK_WINDOW_TEMP:
375 wcl.lpszClassName = "gdkWindowTemp";
376 wcl.style |= CS_SAVEBITS;
378 klassTEMP = RegisterClassEx (&wcl);
384 g_assert_not_reached ();
390 WIN32_API_FAILED ("RegisterClassEx");
391 g_error ("That is a fatal error");
397 gdk_window_new (GdkWindow *parent,
398 GdkWindowAttr *attributes,
399 gint attributes_mask)
402 GdkWindowObject *private;
403 GdkWindowObject *parent_private;
404 GdkWindowImplWin32 *impl;
405 GdkDrawableImplWin32 *draw_impl;
411 DWORD dwStyle, dwExStyle;
420 g_return_val_if_fail (attributes != NULL, NULL);
423 parent = gdk_parent_root;
425 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
428 g_print ("gdk_window_new: %s\n",
429 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
430 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
431 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
432 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
435 parent_private = (GdkWindowObject*) parent;
436 if (GDK_WINDOW_DESTROYED (parent))
439 hparent = GDK_WINDOW_HWND (parent);
441 window = g_object_new (GDK_TYPE_WINDOW, NULL);
442 private = (GdkWindowObject *)window;
443 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
444 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
445 draw_impl->wrapper = GDK_DRAWABLE (window);
447 private->parent = (GdkWindowObject *)parent;
449 if (attributes_mask & GDK_WA_X)
454 if (attributes_mask & GDK_WA_Y)
456 else if (attributes_mask & GDK_WA_X)
457 y = 100; /* ??? We must put it somewhere... */
459 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
463 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
464 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
465 impl->extension_events_selected = FALSE;
466 private->window_type = attributes->window_type;
468 _gdk_window_init_position (GDK_WINDOW (private));
469 if (impl->position_info.big)
470 private->guffaw_gravity = TRUE;
472 if (attributes_mask & GDK_WA_VISUAL)
473 visual = attributes->visual;
475 visual = gdk_visual_get_system ();
476 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
478 if (attributes_mask & GDK_WA_TITLE)
479 title = attributes->title;
481 title = g_get_prgname ();
482 if (!title || !*title)
483 title = "GDK client window";
485 impl->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
487 if (parent_private && parent_private->guffaw_gravity)
492 if (attributes->wclass == GDK_INPUT_OUTPUT)
496 private->input_only = FALSE;
497 private->depth = visual->depth;
499 if (attributes_mask & GDK_WA_COLORMAP)
501 draw_impl->colormap = attributes->colormap;
502 gdk_colormap_ref (attributes->colormap);
506 if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
508 draw_impl->colormap = gdk_colormap_get_system ();
509 gdk_colormap_ref (draw_impl->colormap);
510 GDK_NOTE (MISC, g_print ("...using system colormap %p\n",
511 draw_impl->colormap));
515 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
516 GDK_NOTE (MISC, g_print ("...using new colormap %p\n",
517 draw_impl->colormap));
523 dwExStyle = WS_EX_TRANSPARENT;
525 private->input_only = TRUE;
526 draw_impl->colormap = NULL;
527 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, NULL colormap\n"));
531 parent_private->children = g_list_prepend (parent_private->children, window);
533 switch (private->window_type)
535 case GDK_WINDOW_TOPLEVEL:
536 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
537 hparent = gdk_root_window;
540 case GDK_WINDOW_CHILD:
541 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
544 case GDK_WINDOW_DIALOG:
545 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
547 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
549 hparent = gdk_root_window;
552 case GDK_WINDOW_TEMP:
553 dwStyle = WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
554 dwExStyle |= WS_EX_TOOLWINDOW;
557 case GDK_WINDOW_ROOT:
558 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
562 klass = RegisterGdkClass (private->window_type);
564 if (private->window_type != GDK_WINDOW_CHILD)
566 if (x == CW_USEDEFAULT)
577 rect.right = rect.left + impl->width;
578 rect.bottom = rect.top + impl->height;
580 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
582 if (x != CW_USEDEFAULT)
587 width = rect.right - rect.left;
588 height = rect.bottom - rect.top;
593 height = impl->height;
596 mbtitle = g_locale_from_utf8 (title, NULL);
598 #ifdef WITHOUT_WM_CREATE
599 draw_impl->handle = CreateWindowEx (dwExStyle,
600 MAKEINTRESOURCE(klass),
612 CreateWindowEx (dwExStyle,
613 MAKEINTRESOURCE(klass),
622 if (GDK_WINDOW_HWND (window) != hwndNew)
624 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%#x, %#x) HWND mismatch.",
625 (guint) GDK_WINDOW_HWND (window),
628 /* HB: IHMO due to a race condition the handle was increased by
629 * one, which causes much trouble. Because I can't find the
630 * real bug, try to workaround it ...
631 * To reproduce: compile with MSVC 5, DEBUG=1
634 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
635 GDK_WINDOW_HWND (window) = hwndNew;
636 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
638 /* the old behaviour, but with warning */
639 GDK_WINDOW_HWND (window) = hwndNew;
644 gdk_drawable_ref (window);
645 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
649 g_print ("... \"%s\" %dx%d@+%d+%d %#x = %#x\n"
650 "... locale %#x codepage %d\n",
652 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
654 (guint) GDK_WINDOW_HWND (window),
655 (guint) impl->input_locale,
656 (guint) impl->charset_info.ciACP));
660 if (draw_impl->handle == NULL)
662 WIN32_API_FAILED ("CreateWindowEx");
663 g_object_unref ((GObject *) window);
667 #ifdef WITHOUT_WM_CREATE
668 gdk_drawable_ref (window);
669 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
672 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
673 (attributes->cursor) :
680 gdk_window_foreign_new (GdkNativeWindow anid)
683 GdkWindowObject *private;
684 GdkWindowObject *parent_private;
685 GdkWindowImplWin32 *impl;
686 GdkDrawableImplWin32 *draw_impl;
692 window = g_object_new (GDK_TYPE_WINDOW, NULL);
693 private = (GdkWindowObject *)window;
694 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
695 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
696 draw_impl->wrapper = GDK_DRAWABLE (window);
697 parent = GetParent ((HWND)anid);
699 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
701 parent_private = (GdkWindowObject *)private->parent;
704 parent_private->children = g_list_prepend (parent_private->children, window);
706 draw_impl->handle = (HWND) anid;
707 GetClientRect ((HWND) anid, &rect);
709 point.y = rect.right;
710 ClientToScreen ((HWND) anid, &point);
711 if (parent != gdk_root_window)
712 ScreenToClient (parent, &point);
713 private->x = point.x;
714 private->y = point.y;
715 impl->width = rect.right - rect.left;
716 impl->height = rect.bottom - rect.top;
717 private->window_type = GDK_WINDOW_FOREIGN;
718 private->destroyed = FALSE;
719 private->mapped = IsWindowVisible ((HWND) anid);
720 private->depth = gdk_visual_get_system ()->depth;
722 gdk_drawable_ref (window);
723 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
729 _gdk_windowing_window_destroy (GdkWindow *window,
731 gboolean foreign_destroy)
733 GdkWindowObject *private = (GdkWindowObject *)window;
735 g_return_if_fail (GDK_IS_WINDOW (window));
737 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %#x\n",
738 (guint) GDK_WINDOW_HWND (window)));
740 if (private->extension_events != 0)
741 gdk_input_window_destroy (window);
743 if (private->window_type == GDK_WINDOW_FOREIGN)
745 if (!foreign_destroy && (private->parent != NULL))
747 /* It's somebody else's window, but in our hierarchy,
748 * so reparent it to the root window, and then call
749 * DestroyWindow() on it.
751 gdk_window_hide (window);
752 gdk_window_reparent (window, NULL, 0, 0);
754 /* Is this too drastic? Many (most?) applications
755 * quit if any window receives WM_QUIT I think.
756 * OTOH, I don't think foreign windows are much
757 * used, so the question is maybe academic.
759 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
762 else if (!recursing && !foreign_destroy)
763 DestroyWindow (GDK_WINDOW_HWND (window));
766 /* This function is called when the window really gone.
769 gdk_window_destroy_notify (GdkWindow *window)
771 g_return_if_fail (window != NULL);
772 g_return_if_fail (GDK_IS_WINDOW (window));
775 g_print ("gdk_window_destroy_notify: %#x %s\n",
776 (guint) GDK_WINDOW_HWND (window),
777 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
779 if (!GDK_WINDOW_DESTROYED (window))
781 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
782 g_warning ("window %#x unexpectedly destroyed",
783 (guint) GDK_WINDOW_HWND (window));
785 _gdk_window_destroy (window, TRUE);
788 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
789 gdk_drawable_unref (window);
793 gdk_window_show (GdkWindow *window)
795 GdkWindowObject *private;
797 g_return_if_fail (GDK_IS_WINDOW (window));
799 private = (GdkWindowObject*) window;
800 if (!private->destroyed)
802 GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
803 (guint) GDK_WINDOW_HWND (window)));
805 private->mapped = TRUE;
806 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
808 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
809 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
810 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
812 /* Don't put on toolbar */
813 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
818 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
819 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
820 SetForegroundWindow (GDK_WINDOW_HWND (window));
821 BringWindowToTop (GDK_WINDOW_HWND (window));
823 ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
830 gdk_window_hide (GdkWindow *window)
832 GdkWindowObject *private;
834 g_return_if_fail (window != NULL);
836 private = (GdkWindowObject*) window;
837 if (!private->destroyed)
839 GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
840 (guint) GDK_WINDOW_HWND (window)));
842 private->mapped = FALSE;
843 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
844 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
846 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
851 gdk_window_withdraw (GdkWindow *window)
853 GdkWindowObject *private;
855 g_return_if_fail (window != NULL);
857 private = (GdkWindowObject*) window;
858 if (!private->destroyed)
860 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
861 (guint) GDK_WINDOW_HWND (window)));
863 gdk_window_hide (window); /* ??? */
868 gdk_window_move (GdkWindow *window,
872 GdkWindowObject *private = (GdkWindowObject *)window;
873 GdkWindowImplWin32 *impl;
875 g_return_if_fail (window != NULL);
876 g_return_if_fail (GDK_IS_WINDOW (window));
878 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
880 gdk_window_move_resize (window, x, y, impl->width, impl->height);
884 gdk_window_resize (GdkWindow *window,
888 GdkWindowObject *private = (GdkWindowObject*) window;
889 GdkWindowImplWin32 *impl;
892 g_return_if_fail (window != NULL);
893 g_return_if_fail (GDK_IS_WINDOW (window));
900 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
902 if (!private->destroyed)
904 GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
905 (guint) GDK_WINDOW_HWND (window),
908 if (GDK_WINDOW_TYPE (private) != GDK_WINDOW_CHILD)
917 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
920 rect.right = pt.x + width;
921 rect.bottom = pt.y + height;
923 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
924 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
925 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
926 WIN32_API_FAILED ("AdjustWindowRectEx");
930 width = rect.right - rect.left;
931 height = rect.bottom - rect.top;
938 impl->height = height;
941 private->resize_count += 1;
943 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
944 (guint) GDK_WINDOW_HWND (window),
945 width, height, x, y));
946 if (!MoveWindow (GDK_WINDOW_HWND (window), x, y, width, height, TRUE))
947 WIN32_API_FAILED ("MoveWindow");
952 gdk_window_move_resize (GdkWindow *window,
958 GdkWindowObject *private = (GdkWindowObject*) window;
959 GdkWindowImplWin32 *impl;
961 g_return_if_fail (window != NULL);
962 g_return_if_fail (GDK_IS_WINDOW (window));
969 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
971 if (!private->destroyed)
977 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
978 (guint) GDK_WINDOW_HWND (window),
979 width, height, x, y));
981 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
982 _gdk_window_move_resize_child (window, x, y, width, height);
987 rect.right = x + width;
988 rect.bottom = y + height;
990 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
991 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
992 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
993 WIN32_API_FAILED ("AdjustWindowRectEx");
995 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%ldx%ld@+%ld+%ld)\n",
996 (guint) GDK_WINDOW_HWND (window),
997 rect.right - rect.left, rect.bottom - rect.top,
998 rect.left, rect.top));
999 if (!MoveWindow (GDK_WINDOW_HWND (window),
1000 rect.left, rect.top,
1001 rect.right - rect.left, rect.bottom - rect.top,
1003 WIN32_API_FAILED ("MoveWindow");
1009 gdk_window_reparent (GdkWindow *window,
1010 GdkWindow *new_parent,
1014 GdkWindowObject *window_private;
1015 GdkWindowObject *parent_private;
1016 GdkWindowObject *old_parent_private;
1017 GdkWindowImplWin32 *impl;
1019 g_return_if_fail (window != NULL);
1022 new_parent = gdk_parent_root;
1024 window_private = (GdkWindowObject*) window;
1025 old_parent_private = (GdkWindowObject *) window_private->parent;
1026 parent_private = (GdkWindowObject*) new_parent;
1027 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1029 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1031 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
1032 (guint) GDK_WINDOW_HWND (window),
1033 (guint) GDK_WINDOW_HWND (new_parent)));
1034 if (!SetParent (GDK_WINDOW_HWND (window),
1035 GDK_WINDOW_HWND (new_parent)))
1036 WIN32_API_FAILED ("SetParent");
1038 if (!MoveWindow (GDK_WINDOW_HWND (window),
1039 x, y, impl->width, impl->height, TRUE))
1040 WIN32_API_FAILED ("MoveWindow");
1043 window_private->parent = (GdkWindowObject *)new_parent;
1045 if (old_parent_private)
1046 old_parent_private->children =
1047 g_list_remove (old_parent_private->children, window);
1049 if ((old_parent_private &&
1050 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1051 (!old_parent_private && parent_private->guffaw_gravity))
1052 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1054 parent_private->children = g_list_prepend (parent_private->children, window);
1058 _gdk_windowing_window_clear_area (GdkWindow *window,
1064 GdkWindowImplWin32 *impl;
1066 g_return_if_fail (window != NULL);
1067 g_return_if_fail (GDK_IS_WINDOW (window));
1069 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1071 if (!GDK_WINDOW_DESTROYED (window))
1076 width = impl->width - x;
1078 height = impl->height - y;
1079 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1080 "%#x %dx%d@+%d+%d\n",
1081 (guint) GDK_WINDOW_HWND (window),
1082 width, height, x, y));
1083 hdc = GetDC (GDK_WINDOW_HWND (window));
1084 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1085 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1086 ReleaseDC (GDK_WINDOW_HWND (window), hdc);
1091 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1097 g_return_if_fail (window != NULL);
1098 g_return_if_fail (GDK_IS_WINDOW (window));
1100 if (!GDK_WINDOW_DESTROYED (window))
1104 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1105 "%#x %dx%d@+%d+%d\n",
1106 (guint) GDK_WINDOW_HWND (window),
1107 width, height, x, y));
1110 rect.right = x + width + 1;
1112 rect.bottom = y + height + 1;
1113 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1114 WIN32_GDI_FAILED ("InvalidateRect");
1115 UpdateWindow (GDK_WINDOW_HWND (window));
1120 gdk_window_raise (GdkWindow *window)
1122 g_return_if_fail (window != NULL);
1123 g_return_if_fail (GDK_IS_WINDOW (window));
1125 if (!GDK_WINDOW_DESTROYED (window))
1127 GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
1128 (guint) GDK_WINDOW_HWND (window)));
1130 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1131 WIN32_API_FAILED ("BringWindowToTop");
1136 gdk_window_lower (GdkWindow *window)
1138 g_return_if_fail (window != NULL);
1139 g_return_if_fail (GDK_IS_WINDOW (window));
1141 if (!GDK_WINDOW_DESTROYED (window))
1143 GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
1144 (guint) GDK_WINDOW_HWND (window)));
1146 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1147 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1148 WIN32_API_FAILED ("SetWindowPos");
1153 gdk_window_set_hints (GdkWindow *window,
1162 GdkWindowImplWin32 *impl;
1163 WINDOWPLACEMENT size_hints;
1169 g_return_if_fail (window != NULL);
1170 g_return_if_fail (GDK_IS_WINDOW (window));
1172 if (GDK_WINDOW_DESTROYED (window))
1175 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1177 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
1178 (guint) GDK_WINDOW_HWND (window),
1179 min_width, min_height, max_width, max_height,
1182 impl->hint_flags = flags;
1183 size_hints.length = sizeof (size_hints);
1187 if (flags & GDK_HINT_POS)
1189 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1190 WIN32_API_FAILED ("GetWindowPlacement");
1193 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1194 " (%ld,%ld)--(%ld,%ld)\n",
1195 size_hints.rcNormalPosition.left,
1196 size_hints.rcNormalPosition.top,
1197 size_hints.rcNormalPosition.right,
1198 size_hints.rcNormalPosition.bottom));
1199 /* What are the corresponding window coordinates for client
1200 * area coordinates x, y
1204 rect.right = rect.left + 200; /* dummy */
1205 rect.bottom = rect.top + 200;
1206 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1207 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1208 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1209 size_hints.flags = 0;
1210 size_hints.showCmd = SW_SHOWNA;
1212 /* Set the normal position hint to that location, with unchanged
1215 diff = size_hints.rcNormalPosition.left - rect.left;
1216 size_hints.rcNormalPosition.left = rect.left;
1217 size_hints.rcNormalPosition.right -= diff;
1218 diff = size_hints.rcNormalPosition.top - rect.top;
1219 size_hints.rcNormalPosition.top = rect.top;
1220 size_hints.rcNormalPosition.bottom -= diff;
1221 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1222 size_hints.rcNormalPosition.left,
1223 size_hints.rcNormalPosition.top,
1224 size_hints.rcNormalPosition.right,
1225 size_hints.rcNormalPosition.bottom));
1226 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1227 WIN32_API_FAILED ("SetWindowPlacement");
1228 impl->hint_x = rect.left;
1229 impl->hint_y = rect.top;
1233 if (flags & GDK_HINT_MIN_SIZE)
1237 rect.right = min_width;
1238 rect.bottom = min_height;
1239 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1240 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1241 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1242 impl->hint_min_width = rect.right - rect.left;
1243 impl->hint_min_height = rect.bottom - rect.top;
1245 /* Also chek if he current size of the window is in bounds. */
1246 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1247 if (rect.right < min_width && rect.bottom < min_height)
1248 gdk_window_resize (window, min_width, min_height);
1249 else if (rect.right < min_width)
1250 gdk_window_resize (window, min_width, rect.bottom);
1251 else if (rect.bottom < min_height)
1252 gdk_window_resize (window, rect.right, min_height);
1255 if (flags & GDK_HINT_MAX_SIZE)
1259 rect.right = max_width;
1260 rect.bottom = max_height;
1261 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1262 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1263 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1264 impl->hint_max_width = rect.right - rect.left;
1265 impl->hint_max_height = rect.bottom - rect.top;
1266 /* Again, check if the window is too large currently. */
1267 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1268 if (rect.right > max_width && rect.bottom > max_height)
1269 gdk_window_resize (window, max_width, max_height);
1270 else if (rect.right > max_width)
1271 gdk_window_resize (window, max_width, rect.bottom);
1272 else if (rect.bottom > max_height)
1273 gdk_window_resize (window, rect.right, max_height);
1279 gdk_window_set_geometry_hints (GdkWindow *window,
1280 GdkGeometry *geometry,
1281 GdkWindowHints geom_mask)
1283 GdkWindowImplWin32 *impl;
1284 WINDOWPLACEMENT size_hints;
1289 g_return_if_fail (window != NULL);
1290 g_return_if_fail (GDK_IS_WINDOW (window));
1292 if (GDK_WINDOW_DESTROYED (window))
1295 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1296 size_hints.length = sizeof (size_hints);
1298 impl->hint_flags = geom_mask;
1300 if (geom_mask & GDK_HINT_POS)
1303 if (geom_mask & GDK_HINT_MIN_SIZE)
1307 rect.right = geometry->min_width;
1308 rect.bottom = geometry->min_height;
1309 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1310 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1311 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1312 impl->hint_min_width = rect.right - rect.left;
1313 impl->hint_min_height = rect.bottom - rect.top;
1315 /* Also check if he current size of the window is in bounds */
1316 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1317 if (rect.right < geometry->min_width
1318 && rect.bottom < geometry->min_height)
1319 gdk_window_resize (window, geometry->min_width, geometry->min_height);
1320 else if (rect.right < geometry->min_width)
1321 gdk_window_resize (window, geometry->min_width, rect.bottom);
1322 else if (rect.bottom < geometry->min_height)
1323 gdk_window_resize (window, rect.right, geometry->min_height);
1326 if (geom_mask & GDK_HINT_MAX_SIZE)
1330 rect.right = geometry->max_width;
1331 rect.bottom = geometry->max_height;
1332 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1333 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1334 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1335 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1336 impl->hint_max_width = rect.right - rect.left;
1337 impl->hint_max_height = rect.bottom - rect.top;
1338 /* ... but negative sizes are always wrong */
1339 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1340 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1342 /* Again, check if the window is too large currently. */
1343 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1344 if (rect.right > geometry->max_width
1345 && rect.bottom > geometry->max_height)
1346 gdk_window_resize (window, geometry->max_width, geometry->max_height);
1347 else if (rect.right > geometry->max_width)
1348 gdk_window_resize (window, geometry->max_width, rect.bottom);
1349 else if (rect.bottom > geometry->max_height)
1350 gdk_window_resize (window, rect.right, geometry->max_height);
1353 /* I don't know what to do when called with zero base_width and height. */
1354 if (geom_mask & GDK_HINT_BASE_SIZE
1355 && geometry->base_width > 0
1356 && geometry->base_height > 0)
1358 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1359 WIN32_API_FAILED ("GetWindowPlacement");
1362 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1363 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1364 size_hints.rcNormalPosition.left,
1365 size_hints.rcNormalPosition.top,
1366 size_hints.rcNormalPosition.right,
1367 size_hints.rcNormalPosition.bottom));
1368 size_hints.rcNormalPosition.right =
1369 size_hints.rcNormalPosition.left + geometry->base_width;
1370 size_hints.rcNormalPosition.bottom =
1371 size_hints.rcNormalPosition.top + geometry->base_height;
1372 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1373 size_hints.rcNormalPosition.left,
1374 size_hints.rcNormalPosition.top,
1375 size_hints.rcNormalPosition.right,
1376 size_hints.rcNormalPosition.bottom));
1377 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1378 WIN32_API_FAILED ("SetWindowPlacement");
1382 if (geom_mask & GDK_HINT_RESIZE_INC)
1387 if (geom_mask & GDK_HINT_ASPECT)
1394 gdk_window_set_title (GdkWindow *window,
1399 g_return_if_fail (window != NULL);
1400 g_return_if_fail (GDK_IS_WINDOW (window));
1401 g_return_if_fail (title != NULL);
1403 /* Empty window titles not allowed, so set it to just a period. */
1407 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
1408 (guint) GDK_WINDOW_HWND (window), title));
1410 if (!GDK_WINDOW_DESTROYED (window))
1412 /* As the title is in UTF-8 we must translate it
1413 * to the system codepage.
1415 mbtitle = g_locale_from_utf8 (title, NULL);
1416 if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
1417 WIN32_API_FAILED ("SetWindowText");
1424 gdk_window_set_role (GdkWindow *window,
1427 g_return_if_fail (window != NULL);
1428 g_return_if_fail (GDK_IS_WINDOW (window));
1430 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
1431 (guint) GDK_WINDOW_HWND (window),
1432 (role ? role : "NULL")));
1437 gdk_window_set_transient_for (GdkWindow *window,
1440 g_return_if_fail (window != NULL);
1441 g_return_if_fail (GDK_IS_WINDOW (window));
1443 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
1444 (guint) GDK_WINDOW_HWND (window),
1445 (guint) GDK_WINDOW_HWND (parent)));
1450 gdk_window_set_background (GdkWindow *window,
1453 GdkWindowObject *private = (GdkWindowObject *)window;
1455 g_return_if_fail (window != NULL);
1456 g_return_if_fail (GDK_IS_WINDOW (window));
1458 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
1459 (guint) GDK_WINDOW_HWND (window),
1460 gdk_win32_color_to_string (color)));
1462 private->bg_color = *color;
1464 if (private->bg_pixmap &&
1465 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1466 private->bg_pixmap != GDK_NO_BG)
1468 gdk_drawable_unref (private->bg_pixmap);
1469 private->bg_pixmap = NULL;
1474 gdk_window_set_back_pixmap (GdkWindow *window,
1476 gint parent_relative)
1478 GdkWindowObject *private = (GdkWindowObject *)window;
1480 g_return_if_fail (window != NULL);
1481 g_return_if_fail (GDK_IS_WINDOW (window));
1482 g_return_if_fail (pixmap == NULL || !parent_relative);
1484 if (private->bg_pixmap &&
1485 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1486 private->bg_pixmap != GDK_NO_BG)
1487 gdk_drawable_unref (private->bg_pixmap);
1489 if (parent_relative)
1491 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1497 gdk_drawable_ref (pixmap);
1498 private->bg_pixmap = pixmap;
1502 private->bg_pixmap = GDK_NO_BG;
1508 gdk_window_set_cursor (GdkWindow *window,
1511 GdkWindowImplWin32 *impl;
1512 GdkCursorPrivate *cursor_private;
1516 g_return_if_fail (window != NULL);
1517 g_return_if_fail (GDK_IS_WINDOW (window));
1519 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1520 cursor_private = (GdkCursorPrivate*) cursor;
1522 if (!GDK_WINDOW_DESTROYED (window))
1527 hcursor = cursor_private->hcursor;
1529 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
1530 (guint) GDK_WINDOW_HWND (window),
1532 if (impl->hcursor != NULL)
1534 GDK_NOTE (MISC, g_print ("...DestroyCursor (%#x)\n",
1535 (guint) impl->hcursor));
1537 DestroyCursor (impl->hcursor);
1538 impl->hcursor = NULL;
1540 if (hcursor != NULL)
1542 /* We must copy the cursor as it is OK to destroy the GdkCursor
1543 * while still in use for some window. See for instance
1544 * gimp_change_win_cursor() which calls
1545 * gdk_window_set_cursor (win, cursor), and immediately
1546 * afterwards gdk_cursor_destroy (cursor).
1548 impl->hcursor = CopyCursor (hcursor);
1549 GDK_NOTE (MISC, g_print ("...CopyCursor (%#x) = %#x\n",
1550 (guint) hcursor, (guint) impl->hcursor));
1553 if (ChildWindowFromPoint (GDK_WINDOW_HWND (window), pt) == GDK_WINDOW_HWND (window))
1554 SetCursor (impl->hcursor);
1560 gdk_window_get_geometry (GdkWindow *window,
1567 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1570 window = gdk_parent_root;
1572 if (!GDK_WINDOW_DESTROYED (window))
1576 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1577 WIN32_API_FAILED ("GetClientRect");
1584 *width = rect.right - rect.left;
1586 *height = rect.bottom - rect.top;
1588 *depth = gdk_drawable_get_visual (window)->depth;
1593 gdk_window_get_origin (GdkWindow *window,
1601 g_return_val_if_fail (window != NULL, 0);
1603 if (!GDK_WINDOW_DESTROYED (window))
1609 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1622 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
1623 (guint) GDK_WINDOW_HWND (window),
1629 gdk_window_get_deskrelative_origin (GdkWindow *window,
1633 return gdk_window_get_origin (window, x, y);
1637 gdk_window_get_root_origin (GdkWindow *window,
1641 GdkWindowObject *rover;
1644 g_return_if_fail (window != NULL);
1645 g_return_if_fail (GDK_IS_WINDOW (window));
1647 rover = (GdkWindowObject*) window;
1653 if (GDK_WINDOW_DESTROYED (window))
1656 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1657 rover = (GdkWindowObject *) rover->parent;
1658 if (rover->destroyed)
1663 ClientToScreen (GDK_WINDOW_HWND (rover), &pt);
1669 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%ld+%ld\n",
1670 (guint) GDK_WINDOW_HWND (window),
1671 (guint) GDK_WINDOW_HWND (rover),
1676 gdk_window_get_pointer (GdkWindow *window,
1679 GdkModifierType *mask)
1681 GdkWindow *return_val;
1682 POINT pointc, point;
1685 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1688 window = gdk_parent_root;
1691 GetCursorPos (&pointc);
1693 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1700 hwnd = WindowFromPoint (point);
1702 ScreenToClient (hwnd, &point);
1705 hwndc = ChildWindowFromPoint (hwnd, point);
1706 ClientToScreen (hwnd, &point);
1707 ScreenToClient (hwndc, &point);
1708 } while (hwndc != hwnd && (hwnd = hwndc, 1)); /* Ouch! */
1710 return_val = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1716 GetKeyboardState (kbd);
1718 if (kbd[VK_SHIFT] & 0x80)
1719 *mask |= GDK_SHIFT_MASK;
1720 if (kbd[VK_CAPITAL] & 0x80)
1721 *mask |= GDK_LOCK_MASK;
1722 if (kbd[VK_CONTROL] & 0x80)
1723 *mask |= GDK_CONTROL_MASK;
1724 if (kbd[VK_MENU] & 0x80)
1725 *mask |= GDK_MOD1_MASK;
1726 if (kbd[VK_LBUTTON] & 0x80)
1727 *mask |= GDK_BUTTON1_MASK;
1728 if (kbd[VK_MBUTTON] & 0x80)
1729 *mask |= GDK_BUTTON2_MASK;
1730 if (kbd[VK_RBUTTON] & 0x80)
1731 *mask |= GDK_BUTTON3_MASK;
1738 gdk_window_at_pointer (gint *win_x,
1742 POINT point, pointc;
1746 GetCursorPos (&pointc);
1748 hwnd = WindowFromPoint (point);
1752 window = gdk_parent_root;
1760 ScreenToClient (hwnd, &point);
1763 hwndc = ChildWindowFromPoint (hwnd, point);
1764 ClientToScreen (hwnd, &point);
1765 ScreenToClient (hwndc, &point);
1766 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1768 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1770 if (window && (win_x || win_y))
1772 GetClientRect (hwnd, &rect);
1774 *win_x = point.x - rect.left;
1776 *win_y = point.y - rect.top;
1779 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %#x%s\n",
1782 (window == NULL ? " NULL" : "")));
1788 gdk_window_get_events (GdkWindow *window)
1790 g_return_val_if_fail (window != NULL, 0);
1791 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1793 if (GDK_WINDOW_DESTROYED (window))
1796 return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask;
1800 gdk_window_set_events (GdkWindow *window,
1801 GdkEventMask event_mask)
1803 g_return_if_fail (window != NULL);
1804 g_return_if_fail (GDK_IS_WINDOW (window));
1806 if (GDK_WINDOW_DESTROYED (window))
1809 GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask = event_mask;
1813 gdk_window_shape_combine_mask (GdkWindow *window,
1817 g_return_if_fail (window != NULL);
1818 g_return_if_fail (GDK_IS_WINDOW (window));
1822 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
1823 (guint) GDK_WINDOW_HWND (window)));
1824 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
1833 /* Convert mask bitmap to region */
1834 hrgn = BitmapToRegion (GDK_WINDOW_HWND (mask));
1836 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
1837 (guint) GDK_WINDOW_HWND (window),
1838 (guint) GDK_WINDOW_HWND (mask)));
1840 /* SetWindowRgn wants window (not client) coordinates */
1841 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1842 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1843 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1844 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1845 OffsetRgn (hrgn, -rect.left, -rect.top);
1847 OffsetRgn (hrgn, x, y);
1849 /* If this is a top-level window, add the title bar to the region */
1850 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1852 CombineRgn (hrgn, hrgn,
1853 CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
1857 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
1862 gdk_window_set_override_redirect (GdkWindow *window,
1863 gboolean override_redirect)
1865 g_return_if_fail (window != NULL);
1866 g_return_if_fail (GDK_IS_WINDOW (window));
1868 g_warning ("gdk_window_set_override_redirect not implemented");
1872 gdk_window_set_icon (GdkWindow *window,
1873 GdkWindow *icon_window,
1877 g_return_if_fail (window != NULL);
1878 g_return_if_fail (GDK_IS_WINDOW (window));
1880 if (GDK_WINDOW_DESTROYED (window))
1883 /* Nothing to do, really. As we share window classes between windows
1884 * we can't have window-specific icons, sorry. Don't print any warning
1890 gdk_window_set_icon_name (GdkWindow *window,
1893 g_return_if_fail (window != NULL);
1894 g_return_if_fail (GDK_IS_WINDOW (window));
1896 if (GDK_WINDOW_DESTROYED (window))
1899 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
1900 WIN32_API_FAILED ("SetWindowText");
1904 gdk_window_set_group (GdkWindow *window,
1907 g_return_if_fail (window != NULL);
1908 g_return_if_fail (GDK_IS_WINDOW (window));
1909 g_return_if_fail (leader != NULL);
1910 g_return_if_fail (GDK_IS_WINDOW (leader));
1912 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
1915 g_warning ("gdk_window_set_group not implemented");
1919 gdk_window_set_decorations (GdkWindow *window,
1920 GdkWMDecoration decorations)
1922 LONG style, exstyle;
1924 g_return_if_fail (window != NULL);
1925 g_return_if_fail (GDK_IS_WINDOW (window));
1927 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1928 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1930 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1931 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
1933 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1935 if (decorations & GDK_DECOR_ALL)
1936 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1937 if (decorations & GDK_DECOR_BORDER)
1938 style |= (WS_BORDER);
1939 if (decorations & GDK_DECOR_RESIZEH)
1940 style |= (WS_THICKFRAME);
1941 if (decorations & GDK_DECOR_TITLE)
1942 style |= (WS_CAPTION);
1943 if (decorations & GDK_DECOR_MENU)
1944 style |= (WS_SYSMENU);
1945 if (decorations & GDK_DECOR_MINIMIZE)
1946 style |= (WS_MINIMIZEBOX);
1947 if (decorations & GDK_DECOR_MAXIMIZE)
1948 style |= (WS_MAXIMIZEBOX);
1950 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1954 gdk_window_set_functions (GdkWindow *window,
1955 GdkWMFunction functions)
1957 LONG style, exstyle;
1959 g_return_if_fail (window != NULL);
1960 g_return_if_fail (GDK_IS_WINDOW (window));
1962 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1963 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1965 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1966 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
1969 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1971 if (functions & GDK_FUNC_ALL)
1972 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1973 if (functions & GDK_FUNC_RESIZE)
1974 style |= (WS_THICKFRAME);
1975 if (functions & GDK_FUNC_MOVE)
1976 style |= (WS_THICKFRAME);
1977 if (functions & GDK_FUNC_MINIMIZE)
1978 style |= (WS_MINIMIZEBOX);
1979 if (functions & GDK_FUNC_MAXIMIZE)
1980 style |= (WS_MAXIMIZEBOX);
1982 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1986 * propagate the shapes from all child windows of a GDK window to the parent
1987 * window. Shamelessly ripped from Enlightenment's code
1993 QueryTree (HWND hwnd,
2003 child = GetWindow (hwnd, GW_CHILD);
2005 child = GetWindow (child, GW_HWNDNEXT);
2008 } while (child != NULL);
2012 *children = g_new (HWND, n);
2013 for (i = 0; i < n; i++)
2016 child = GetWindow (hwnd, GW_CHILD);
2018 child = GetWindow (child, GW_HWNDNEXT);
2019 *children[i] = child;
2025 gdk_propagate_shapes (HANDLE win,
2029 HRGN region, childRegion;
2033 SetRectEmpty (&emptyRect);
2034 region = CreateRectRgnIndirect (&emptyRect);
2036 GetWindowRgn (win, region);
2038 QueryTree (win, &list, &num);
2041 WINDOWPLACEMENT placement;
2043 placement.length = sizeof (WINDOWPLACEMENT);
2044 /* go through all child windows and combine regions */
2045 for (i = 0; i < num; i++)
2047 GetWindowPlacement (list[i], &placement);
2048 if (placement.showCmd == SW_SHOWNORMAL)
2050 childRegion = CreateRectRgnIndirect (&emptyRect);
2051 GetWindowRgn (list[i], childRegion);
2052 CombineRgn (region, region, childRegion, RGN_OR);
2053 DeleteObject (childRegion);
2056 SetWindowRgn (win, region, TRUE);
2059 DeleteObject (region);
2063 gdk_window_set_child_shapes (GdkWindow *window)
2065 g_return_if_fail (window != NULL);
2066 g_return_if_fail (GDK_IS_WINDOW (window));
2068 if (GDK_WINDOW_DESTROYED (window))
2071 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2075 gdk_window_merge_child_shapes (GdkWindow *window)
2077 g_return_if_fail (window != NULL);
2078 g_return_if_fail (GDK_IS_WINDOW (window));
2080 if (GDK_WINDOW_DESTROYED (window))
2083 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2086 /* Support for windows that can be guffaw-scrolled
2087 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2091 gdk_window_gravity_works (void)
2093 enum { UNKNOWN, NO, YES };
2094 static gint gravity_works = UNKNOWN;
2096 if (gravity_works == UNKNOWN)
2103 attr.window_type = GDK_WINDOW_TEMP;
2104 attr.wclass = GDK_INPUT_OUTPUT;
2109 attr.event_mask = 0;
2111 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2113 attr.window_type = GDK_WINDOW_CHILD;
2114 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2116 gdk_window_set_static_win_gravity (child, TRUE);
2118 gdk_window_resize (parent, 100, 110);
2119 gdk_window_move (parent, 0, -10);
2120 gdk_window_move_resize (parent, 0, 0, 100, 100);
2122 gdk_window_resize (parent, 100, 110);
2123 gdk_window_move (parent, 0, -10);
2124 gdk_window_move_resize (parent, 0, 0, 100, 100);
2126 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2128 gdk_window_destroy (parent);
2129 gdk_window_destroy (child);
2131 gravity_works = ((y == -20) ? YES : NO);
2134 return (gravity_works == YES);
2138 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2140 g_return_if_fail (window != NULL);
2142 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2146 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2148 g_return_if_fail (window != NULL);
2151 g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2154 /*************************************************************
2155 * gdk_window_set_static_gravities:
2156 * Set the bit gravity of the given window to static,
2157 * and flag it so all children get static subwindow
2160 * window: window for which to set static gravity
2161 * use_static: Whether to turn static gravity on or off.
2163 * Does the XServer support static gravity?
2164 *************************************************************/
2167 gdk_window_set_static_gravities (GdkWindow *window,
2168 gboolean use_static)
2170 GdkWindowObject *private = (GdkWindowObject *)window;
2173 g_return_val_if_fail (window != NULL, FALSE);
2174 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2176 if (!use_static == !private->guffaw_gravity)
2179 if (use_static && !gdk_window_gravity_works ())
2182 private->guffaw_gravity = use_static;
2184 if (!GDK_WINDOW_DESTROYED (window))
2186 gdk_window_set_static_bit_gravity (window, use_static);
2188 tmp_list = private->children;
2191 gdk_window_set_static_win_gravity (window, use_static);
2193 tmp_list = tmp_list->next;