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 void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
48 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
49 static void gdk_window_impl_win32_finalize (GObject *object);
51 static gpointer parent_class = NULL;
54 gdk_window_impl_win32_get_type (void)
56 static GType object_type = 0;
60 static const GTypeInfo object_info =
62 sizeof (GdkWindowImplWin32Class),
64 (GBaseFinalizeFunc) NULL,
65 (GClassInitFunc) gdk_window_impl_win32_class_init,
66 NULL, /* class_finalize */
67 NULL, /* class_data */
68 sizeof (GdkWindowImplWin32),
70 (GInstanceInitFunc) gdk_window_impl_win32_init,
73 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
82 _gdk_window_impl_get_type (void)
84 return gdk_window_impl_win32_get_type ();
88 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
96 impl->extension_events_selected = FALSE;
97 impl->input_locale = GetKeyboardLayout (0);
98 TranslateCharsetInfo ((DWORD FAR *) GetACP (), &impl->charset_info,
103 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
105 GObjectClass *object_class = G_OBJECT_CLASS (klass);
106 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
108 parent_class = g_type_class_peek_parent (klass);
110 object_class->finalize = gdk_window_impl_win32_finalize;
112 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
113 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
114 drawable_class->get_size = gdk_window_impl_win32_get_size;
118 gdk_window_impl_win32_finalize (GObject *object)
120 GdkWindowObject *wrapper;
121 GdkDrawableImplWin32 *draw_impl;
122 GdkWindowImplWin32 *window_impl;
124 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
126 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
127 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
129 wrapper = (GdkWindowObject*) draw_impl->wrapper;
131 if (!GDK_WINDOW_DESTROYED (wrapper))
133 gdk_win32_handle_table_remove (draw_impl->handle);
136 if (window_impl->hcursor != NULL)
138 if (!DestroyCursor (window_impl->hcursor))
139 WIN32_GDI_FAILED("DestroyCursor");
140 window_impl->hcursor = NULL;
143 G_OBJECT_CLASS (parent_class)->finalize (object);
147 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
149 GdkDrawableImplWin32 *drawable_impl;
150 GdkWindowImplWin32 *window_impl;
152 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
154 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
155 window_impl = GDK_WINDOW_IMPL_WIN32 (drawable);
157 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
158 drawable_impl->colormap == NULL)
160 drawable_impl->colormap = gdk_colormap_get_system ();
163 return drawable_impl->colormap;
167 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
170 GdkWindowImplWin32 *impl;
171 GdkDrawableImplWin32 *draw_impl;
173 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
174 g_return_if_fail (gdk_colormap_get_visual (cmap) != gdk_drawable_get_visual (drawable));
176 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
177 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
179 GDK_DRAWABLE_GET_CLASS (draw_impl)->set_colormap (drawable, cmap);
182 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
186 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
190 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
193 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
195 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
199 _gdk_windowing_window_init (void)
201 GdkWindowObject *private;
202 GdkWindowImplWin32 *impl;
203 GdkDrawableImplWin32 *draw_impl;
208 g_assert (gdk_parent_root == NULL);
210 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
211 width = rect.right - rect.left;
212 height = rect.bottom - rect.top;
214 gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
215 private = (GdkWindowObject *)gdk_parent_root;
216 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
217 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
219 draw_impl->handle = gdk_root_window;
220 draw_impl->wrapper = GDK_DRAWABLE (private);
222 private->window_type = GDK_WINDOW_ROOT;
223 private->depth = gdk_visual_get_system ()->depth;
225 impl->height = height;
227 gdk_win32_handle_table_insert (&gdk_root_window, gdk_parent_root);
230 /* The Win API function AdjustWindowRect may return negative values
231 * resulting in obscured title bars. This helper function is coreccting it.
234 SafeAdjustWindowRectEx (RECT* lpRect,
239 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
241 WIN32_API_FAILED ("AdjustWindowRectEx");
244 if (lpRect->left < 0)
246 lpRect->right -= lpRect->left;
251 lpRect->bottom -= lpRect->top;
258 * is a wrapper function for RegisterWindowClassEx.
259 * It creates at least one unique class for every
260 * GdkWindowType. If support for single window-specific icons
261 * is ever needed (e.g Dialog specific), every such window should
265 RegisterGdkClass (GdkWindowType wtype)
267 static ATOM klassTOPLEVEL = 0;
268 static ATOM klassDIALOG = 0;
269 static ATOM klassCHILD = 0;
270 static ATOM klassTEMP = 0;
271 static HICON hAppIcon = NULL;
272 static WNDCLASSEX wcl;
275 wcl.cbSize = sizeof(WNDCLASSEX);
276 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
277 * on WM_SIZE and WM_MOVE. Flicker, Performance!
279 wcl.lpfnWndProc = gdk_window_procedure;
282 wcl.hInstance = gdk_app_hmodule;
284 /* initialize once! */
287 gchar sLoc [_MAX_PATH+1];
289 if (0 != GetModuleFileName (gdk_app_hmodule, sLoc, _MAX_PATH))
291 hAppIcon = ExtractIcon (gdk_app_hmodule, sLoc, 0);
294 char *gdklibname = g_strdup_printf ("gdk-%s.dll", GDK_VERSION);
296 hAppIcon = ExtractIcon (gdk_app_hmodule, gdklibname, 0);
301 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
305 wcl.lpszMenuName = NULL;
308 /* initialize once per class */
309 #define ONCE_PER_CLASS() \
310 wcl.hIcon = CopyIcon (hAppIcon); \
311 wcl.hIconSm = CopyIcon (hAppIcon); \
312 wcl.hbrBackground = CreateSolidBrush (RGB (0,0,0)); \
313 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
317 case GDK_WINDOW_TOPLEVEL:
318 if (0 == klassTOPLEVEL)
320 wcl.lpszClassName = "gdkWindowToplevel";
323 klassTOPLEVEL = RegisterClassEx (&wcl);
325 klass = klassTOPLEVEL;
328 case GDK_WINDOW_CHILD:
331 wcl.lpszClassName = "gdkWindowChild";
333 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
335 klassCHILD = RegisterClassEx (&wcl);
340 case GDK_WINDOW_DIALOG:
341 if (0 == klassDIALOG)
343 wcl.lpszClassName = "gdkWindowDialog";
344 wcl.style |= CS_SAVEBITS;
346 klassDIALOG = RegisterClassEx (&wcl);
351 case GDK_WINDOW_TEMP:
354 wcl.lpszClassName = "gdkWindowTemp";
355 wcl.style |= CS_SAVEBITS;
357 klassTEMP = RegisterClassEx (&wcl);
363 g_assert_not_reached ();
369 WIN32_API_FAILED ("RegisterClassEx");
370 g_error ("That is a fatal error");
376 gdk_window_new (GdkWindow *parent,
377 GdkWindowAttr *attributes,
378 gint attributes_mask)
381 GdkWindowObject *private;
382 GdkWindowObject *parent_private;
383 GdkWindowImplWin32 *impl;
384 GdkDrawableImplWin32 *draw_impl;
390 DWORD dwStyle, dwExStyle;
402 g_return_val_if_fail (attributes != NULL, NULL);
405 parent = gdk_parent_root;
407 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
409 parent_private = (GdkWindowObject*) parent;
410 if (GDK_WINDOW_DESTROYED (parent))
413 hparent = GDK_WINDOW_HWND (parent);
415 window = g_object_new (GDK_TYPE_WINDOW, NULL);
416 private = (GdkWindowObject *)window;
417 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
418 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
419 draw_impl->wrapper = GDK_DRAWABLE (window);
421 private->parent = (GdkWindowObject *)parent;
423 if (attributes_mask & GDK_WA_X)
428 if (attributes_mask & GDK_WA_Y)
430 else if (attributes_mask & GDK_WA_X)
431 y = 100; /* ??? We must put it somewhere... */
433 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
437 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
438 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
439 impl->extension_events_selected = FALSE;
440 private->window_type = attributes->window_type;
442 _gdk_window_init_position (GDK_WINDOW (private));
443 if (impl->position_info.big)
444 private->guffaw_gravity = TRUE;
446 if (attributes_mask & GDK_WA_VISUAL)
447 visual = attributes->visual;
449 visual = gdk_visual_get_system ();
450 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
452 if (attributes_mask & GDK_WA_TITLE)
453 title = attributes->title;
455 title = g_get_prgname ();
457 title = "GDK client window";
459 impl->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
461 if (parent_private && parent_private->guffaw_gravity)
466 if (attributes->wclass == GDK_INPUT_OUTPUT)
470 private->input_only = FALSE;
471 private->depth = visual->depth;
473 if (attributes_mask & GDK_WA_COLORMAP)
475 draw_impl->colormap = attributes->colormap;
476 gdk_colormap_ref (attributes->colormap);
480 if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
482 draw_impl->colormap =
483 gdk_colormap_get_system ();
484 gdk_colormap_ref (draw_impl->colormap);
488 draw_impl->colormap =
489 gdk_colormap_new (visual, FALSE);
495 dwExStyle = WS_EX_TRANSPARENT;
497 private->input_only = TRUE;
498 draw_impl->colormap = NULL;
502 parent_private->children = g_list_prepend (parent_private->children, window);
504 switch (private->window_type)
506 case GDK_WINDOW_TOPLEVEL:
507 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
508 hparent = gdk_root_window;
511 case GDK_WINDOW_CHILD:
512 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
515 case GDK_WINDOW_DIALOG:
516 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
518 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
520 hparent = gdk_root_window;
523 case GDK_WINDOW_TEMP:
524 dwStyle = WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
525 dwExStyle |= WS_EX_TOOLWINDOW;
528 case GDK_WINDOW_ROOT:
529 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
533 klass = RegisterGdkClass (private->window_type);
535 if (private->window_type != GDK_WINDOW_CHILD)
537 if (x == CW_USEDEFAULT)
548 rect.right = rect.left + impl->width;
549 rect.bottom = rect.top + impl->height;
551 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
553 if (x != CW_USEDEFAULT)
558 width = rect.right - rect.left;
559 height = rect.bottom - rect.top;
564 height = impl->height;
567 titlelen = strlen (title);
568 wctitle = g_new (wchar_t, titlelen + 1);
569 mbtitle = g_new (char, 3*titlelen + 1);
570 wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
572 WideCharToMultiByte (GetACP (), 0, wctitle, -1,
573 mbtitle, 3*titlelen, NULL, NULL);
575 #ifdef WITHOUT_WM_CREATE
576 draw_impl->handle = CreateWindowEx (dwExStyle,
577 MAKEINTRESOURCE(klass),
589 CreateWindowEx (dwExStyle,
590 MAKEINTRESOURCE(klass),
599 if (GDK_WINDOW_HWND (window) != hwndNew)
601 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%#x, %#x) HWND mismatch.",
602 (guint) GDK_WINDOW_HWND (window),
605 /* HB: IHMO due to a race condition the handle was increased by
606 * one, which causes much trouble. Because I can't find the
607 * real bug, try to workaround it ...
608 * To reproduce: compile with MSVC 5, DEBUG=1
611 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
612 GDK_WINDOW_HWND (window) = hwndNew;
613 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
615 /* the old behaviour, but with warning */
616 GDK_WINDOW_HWND (window) = hwndNew;
621 gdk_drawable_ref (window);
622 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
626 g_print ("gdk_window_new: %s %s %dx%d@+%d+%d %#x = %#x\n"
627 "...locale %#x codepage %d\n",
628 (private->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
629 (private->window_type == GDK_WINDOW_CHILD ? "CHILD" :
630 (private->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
631 (private->window_type == GDK_WINDOW_TEMP ? "TEMP" :
634 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
636 (guint) GDK_WINDOW_HWND (window),
637 (guint) impl->input_locale,
638 (guint) impl->charset_info.ciACP));
643 if (draw_impl->handle == NULL)
645 WIN32_API_FAILED ("CreateWindowEx");
646 g_object_unref ((GObject *) window);
650 #ifdef WITHOUT_WM_CREATE
651 gdk_drawable_ref (window);
652 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
655 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
656 (attributes->cursor) :
663 gdk_window_foreign_new (GdkNativeWindow anid)
666 GdkWindowObject *private;
667 GdkWindowObject *parent_private;
668 GdkWindowImplWin32 *impl;
669 GdkDrawableImplWin32 *draw_impl;
675 window = g_object_new (GDK_TYPE_WINDOW, NULL);
676 private = (GdkWindowObject *)window;
677 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
678 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
679 draw_impl->wrapper = GDK_DRAWABLE (window);
680 parent = GetParent ((HWND)anid);
682 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
684 parent_private = (GdkWindowObject *)private->parent;
687 parent_private->children = g_list_prepend (parent_private->children, window);
689 draw_impl->handle = (HWND) anid;
690 GetClientRect ((HWND) anid, &rect);
692 point.y = rect.right;
693 ClientToScreen ((HWND) anid, &point);
694 if (parent != gdk_root_window)
695 ScreenToClient (parent, &point);
696 private->x = point.x;
697 private->y = point.y;
698 impl->width = rect.right - rect.left;
699 impl->height = rect.bottom - rect.top;
700 private->window_type = GDK_WINDOW_FOREIGN;
701 private->destroyed = FALSE;
702 private->mapped = IsWindowVisible ((HWND) anid);
703 private->depth = gdk_visual_get_system ()->depth;
705 gdk_drawable_ref (window);
706 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
712 _gdk_windowing_window_destroy (GdkWindow *window,
714 gboolean foreign_destroy)
716 GdkWindowObject *private = (GdkWindowObject *)window;
718 g_return_if_fail (GDK_IS_WINDOW (window));
720 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %#x\n",
721 (guint) GDK_WINDOW_HWND (window)));
723 if (private->extension_events != 0)
724 gdk_input_window_destroy (window);
726 if (private->window_type == GDK_WINDOW_FOREIGN)
728 if (!foreign_destroy && (private->parent != NULL))
730 /* It's somebody else's window, but in our hierarchy,
731 * so reparent it to the root window, and then call
732 * DestroyWindow() on it.
734 gdk_window_hide (window);
735 gdk_window_reparent (window, NULL, 0, 0);
737 /* Is this too drastic? Many (most?) applications
738 * quit if any window receives WM_QUIT I think.
739 * OTOH, I don't think foreign windows are much
740 * used, so the question is maybe academic.
742 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
745 else if (!recursing && !foreign_destroy)
746 DestroyWindow (GDK_WINDOW_HWND (window));
749 /* This function is called when the window really gone.
752 gdk_window_destroy_notify (GdkWindow *window)
754 g_return_if_fail (window != NULL);
755 g_return_if_fail (GDK_IS_WINDOW (window));
758 g_print ("gdk_window_destroy_notify: %#x %s\n",
759 (guint) GDK_WINDOW_HWND (window),
760 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
762 if (!GDK_WINDOW_DESTROYED (window))
764 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
765 g_warning ("window %#x unexpectedly destroyed",
766 (guint) GDK_WINDOW_HWND (window));
768 _gdk_window_destroy (window, TRUE);
771 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
772 gdk_drawable_unref (window);
776 gdk_window_show (GdkWindow *window)
778 GdkWindowObject *private;
780 g_return_if_fail (GDK_IS_WINDOW (window));
782 private = (GdkWindowObject*) window;
783 if (!private->destroyed)
785 GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
786 (guint) GDK_WINDOW_HWND (window)));
788 private->mapped = TRUE;
789 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
791 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
792 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
793 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
795 /* Don't put on toolbar */
796 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
801 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
802 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
803 SetForegroundWindow (GDK_WINDOW_HWND (window));
804 BringWindowToTop (GDK_WINDOW_HWND (window));
806 ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
813 gdk_window_hide (GdkWindow *window)
815 GdkWindowObject *private;
817 g_return_if_fail (window != NULL);
819 private = (GdkWindowObject*) window;
820 if (!private->destroyed)
822 GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
823 (guint) GDK_WINDOW_HWND (window)));
825 private->mapped = FALSE;
826 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
827 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
829 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
834 gdk_window_withdraw (GdkWindow *window)
836 GdkWindowObject *private;
838 g_return_if_fail (window != NULL);
840 private = (GdkWindowObject*) window;
841 if (!private->destroyed)
843 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
844 (guint) GDK_WINDOW_HWND (window)));
846 gdk_window_hide (window); /* ??? */
851 gdk_window_move (GdkWindow *window,
855 GdkWindowObject *private = (GdkWindowObject *)window;
856 GdkWindowImplWin32 *impl;
858 g_return_if_fail (window != NULL);
859 g_return_if_fail (GDK_IS_WINDOW (window));
861 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
863 gdk_window_move_resize (window, x, y, impl->width, impl->height);
867 gdk_window_resize (GdkWindow *window,
871 GdkWindowObject *private = (GdkWindowObject*) window;
872 GdkWindowImplWin32 *impl;
875 g_return_if_fail (window != NULL);
876 g_return_if_fail (GDK_IS_WINDOW (window));
883 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
885 if (!private->destroyed)
887 GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
888 (guint) GDK_WINDOW_HWND (window),
891 if (GDK_WINDOW_TYPE (private) != GDK_WINDOW_CHILD)
900 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
903 rect.right = pt.x + width;
904 rect.bottom = pt.y + height;
906 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
907 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
908 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
909 WIN32_API_FAILED ("AdjustWindowRectEx");
913 width = rect.right - rect.left;
914 height = rect.bottom - rect.top;
921 impl->height = height;
924 private->resize_count += 1;
926 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
927 (guint) GDK_WINDOW_HWND (window),
928 width, height, x, y));
929 if (!MoveWindow (GDK_WINDOW_HWND (window), x, y, width, height, TRUE))
930 WIN32_API_FAILED ("MoveWindow");
935 gdk_window_move_resize (GdkWindow *window,
941 GdkWindowObject *private = (GdkWindowObject*) window;
942 GdkWindowImplWin32 *impl;
944 g_return_if_fail (window != NULL);
945 g_return_if_fail (GDK_IS_WINDOW (window));
952 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
954 if (!private->destroyed)
960 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
961 (guint) GDK_WINDOW_HWND (window),
962 width, height, x, y));
964 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
965 _gdk_window_move_resize_child (window, x, y, width, height);
970 rect.right = x + width;
971 rect.bottom = y + height;
973 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
974 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
975 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
976 WIN32_API_FAILED ("AdjustWindowRectEx");
978 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%ldx%ld@+%ld+%ld)\n",
979 (guint) GDK_WINDOW_HWND (window),
980 rect.right - rect.left, rect.bottom - rect.top,
981 rect.left, rect.top));
982 if (!MoveWindow (GDK_WINDOW_HWND (window),
984 rect.right - rect.left, rect.bottom - rect.top,
986 WIN32_API_FAILED ("MoveWindow");
992 gdk_window_reparent (GdkWindow *window,
993 GdkWindow *new_parent,
997 GdkWindowObject *window_private;
998 GdkWindowObject *parent_private;
999 GdkWindowObject *old_parent_private;
1000 GdkWindowImplWin32 *impl;
1002 g_return_if_fail (window != NULL);
1005 new_parent = gdk_parent_root;
1007 window_private = (GdkWindowObject*) window;
1008 old_parent_private = (GdkWindowObject *) window_private->parent;
1009 parent_private = (GdkWindowObject*) new_parent;
1010 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1012 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1014 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
1015 (guint) GDK_WINDOW_HWND (window),
1016 (guint) GDK_WINDOW_HWND (new_parent)));
1017 if (!SetParent (GDK_WINDOW_HWND (window),
1018 GDK_WINDOW_HWND (new_parent)))
1019 WIN32_API_FAILED ("SetParent");
1021 if (!MoveWindow (GDK_WINDOW_HWND (window),
1022 x, y, impl->width, impl->height, TRUE))
1023 WIN32_API_FAILED ("MoveWindow");
1026 window_private->parent = (GdkWindowObject *)new_parent;
1028 if (old_parent_private)
1029 old_parent_private->children =
1030 g_list_remove (old_parent_private->children, window);
1032 if ((old_parent_private &&
1033 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1034 (!old_parent_private && parent_private->guffaw_gravity))
1035 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1037 parent_private->children = g_list_prepend (parent_private->children, window);
1041 _gdk_windowing_window_clear_area (GdkWindow *window,
1047 GdkWindowImplWin32 *impl;
1049 g_return_if_fail (window != NULL);
1050 g_return_if_fail (GDK_IS_WINDOW (window));
1052 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1054 if (!GDK_WINDOW_DESTROYED (window))
1059 width = impl->width - x;
1061 height = impl->height - y;
1062 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1063 "%#x %dx%d@+%d+%d\n",
1064 (guint) GDK_WINDOW_HWND (window),
1065 width, height, x, y));
1066 hdc = GetDC (GDK_WINDOW_HWND (window));
1067 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1068 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1069 ReleaseDC (GDK_WINDOW_HWND (window), hdc);
1074 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1080 g_return_if_fail (window != NULL);
1081 g_return_if_fail (GDK_IS_WINDOW (window));
1083 if (!GDK_WINDOW_DESTROYED (window))
1087 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1088 "%#x %dx%d@+%d+%d\n",
1089 (guint) GDK_WINDOW_HWND (window),
1090 width, height, x, y));
1093 rect.right = x + width + 1;
1095 rect.bottom = y + height + 1;
1096 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1097 WIN32_GDI_FAILED ("InvalidateRect");
1098 UpdateWindow (GDK_WINDOW_HWND (window));
1103 gdk_window_raise (GdkWindow *window)
1105 g_return_if_fail (window != NULL);
1106 g_return_if_fail (GDK_IS_WINDOW (window));
1108 if (!GDK_WINDOW_DESTROYED (window))
1110 GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
1111 (guint) GDK_WINDOW_HWND (window)));
1113 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1114 WIN32_API_FAILED ("BringWindowToTop");
1119 gdk_window_lower (GdkWindow *window)
1121 g_return_if_fail (window != NULL);
1122 g_return_if_fail (GDK_IS_WINDOW (window));
1124 if (!GDK_WINDOW_DESTROYED (window))
1126 GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
1127 (guint) GDK_WINDOW_HWND (window)));
1129 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1130 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1131 WIN32_API_FAILED ("SetWindowPos");
1136 gdk_window_set_hints (GdkWindow *window,
1145 GdkWindowImplWin32 *impl;
1146 WINDOWPLACEMENT size_hints;
1152 g_return_if_fail (window != NULL);
1153 g_return_if_fail (GDK_IS_WINDOW (window));
1155 if (GDK_WINDOW_DESTROYED (window))
1158 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1160 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
1161 (guint) GDK_WINDOW_HWND (window),
1162 min_width, min_height, max_width, max_height,
1165 impl->hint_flags = flags;
1166 size_hints.length = sizeof (size_hints);
1170 if (flags & GDK_HINT_POS)
1172 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1173 WIN32_API_FAILED ("GetWindowPlacement");
1176 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1177 " (%ld,%ld)--(%ld,%ld)\n",
1178 size_hints.rcNormalPosition.left,
1179 size_hints.rcNormalPosition.top,
1180 size_hints.rcNormalPosition.right,
1181 size_hints.rcNormalPosition.bottom));
1182 /* What are the corresponding window coordinates for client
1183 * area coordinates x, y
1187 rect.right = rect.left + 200; /* dummy */
1188 rect.bottom = rect.top + 200;
1189 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1190 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1191 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1192 size_hints.flags = 0;
1193 size_hints.showCmd = SW_SHOWNA;
1195 /* Set the normal position hint to that location, with unchanged
1198 diff = size_hints.rcNormalPosition.left - rect.left;
1199 size_hints.rcNormalPosition.left = rect.left;
1200 size_hints.rcNormalPosition.right -= diff;
1201 diff = size_hints.rcNormalPosition.top - rect.top;
1202 size_hints.rcNormalPosition.top = rect.top;
1203 size_hints.rcNormalPosition.bottom -= diff;
1204 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1205 size_hints.rcNormalPosition.left,
1206 size_hints.rcNormalPosition.top,
1207 size_hints.rcNormalPosition.right,
1208 size_hints.rcNormalPosition.bottom));
1209 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1210 WIN32_API_FAILED ("SetWindowPlacement");
1211 impl->hint_x = rect.left;
1212 impl->hint_y = rect.top;
1216 if (flags & GDK_HINT_MIN_SIZE)
1220 rect.right = min_width;
1221 rect.bottom = min_height;
1222 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1223 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1224 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1225 impl->hint_min_width = rect.right - rect.left;
1226 impl->hint_min_height = rect.bottom - rect.top;
1228 /* Also chek if he current size of the window is in bounds. */
1229 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1230 if (rect.right < min_width && rect.bottom < min_height)
1231 gdk_window_resize (window, min_width, min_height);
1232 else if (rect.right < min_width)
1233 gdk_window_resize (window, min_width, rect.bottom);
1234 else if (rect.bottom < min_height)
1235 gdk_window_resize (window, rect.right, min_height);
1238 if (flags & GDK_HINT_MAX_SIZE)
1242 rect.right = max_width;
1243 rect.bottom = max_height;
1244 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1245 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1246 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1247 impl->hint_max_width = rect.right - rect.left;
1248 impl->hint_max_height = rect.bottom - rect.top;
1249 /* Again, check if the window is too large currently. */
1250 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1251 if (rect.right > max_width && rect.bottom > max_height)
1252 gdk_window_resize (window, max_width, max_height);
1253 else if (rect.right > max_width)
1254 gdk_window_resize (window, max_width, rect.bottom);
1255 else if (rect.bottom > max_height)
1256 gdk_window_resize (window, rect.right, max_height);
1262 gdk_window_set_geometry_hints (GdkWindow *window,
1263 GdkGeometry *geometry,
1264 GdkWindowHints geom_mask)
1266 GdkWindowImplWin32 *impl;
1267 WINDOWPLACEMENT size_hints;
1272 g_return_if_fail (window != NULL);
1273 g_return_if_fail (GDK_IS_WINDOW (window));
1275 if (GDK_WINDOW_DESTROYED (window))
1278 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1279 size_hints.length = sizeof (size_hints);
1281 impl->hint_flags = geom_mask;
1283 if (geom_mask & GDK_HINT_POS)
1286 if (geom_mask & GDK_HINT_MIN_SIZE)
1290 rect.right = geometry->min_width;
1291 rect.bottom = geometry->min_height;
1292 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1293 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1294 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1295 impl->hint_min_width = rect.right - rect.left;
1296 impl->hint_min_height = rect.bottom - rect.top;
1298 /* Also check if he current size of the window is in bounds */
1299 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1300 if (rect.right < geometry->min_width
1301 && rect.bottom < geometry->min_height)
1302 gdk_window_resize (window, geometry->min_width, geometry->min_height);
1303 else if (rect.right < geometry->min_width)
1304 gdk_window_resize (window, geometry->min_width, rect.bottom);
1305 else if (rect.bottom < geometry->min_height)
1306 gdk_window_resize (window, rect.right, geometry->min_height);
1309 if (geom_mask & GDK_HINT_MAX_SIZE)
1313 rect.right = geometry->max_width;
1314 rect.bottom = geometry->max_height;
1315 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1316 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1317 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1318 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1319 impl->hint_max_width = rect.right - rect.left;
1320 impl->hint_max_height = rect.bottom - rect.top;
1321 /* ... but negative sizes are always wrong */
1322 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1323 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1325 /* Again, check if the window is too large currently. */
1326 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1327 if (rect.right > geometry->max_width
1328 && rect.bottom > geometry->max_height)
1329 gdk_window_resize (window, geometry->max_width, geometry->max_height);
1330 else if (rect.right > geometry->max_width)
1331 gdk_window_resize (window, geometry->max_width, rect.bottom);
1332 else if (rect.bottom > geometry->max_height)
1333 gdk_window_resize (window, rect.right, geometry->max_height);
1336 /* I don't know what to do when called with zero base_width and height. */
1337 if (geom_mask & GDK_HINT_BASE_SIZE
1338 && geometry->base_width > 0
1339 && geometry->base_height > 0)
1341 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1342 WIN32_API_FAILED ("GetWindowPlacement");
1345 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1346 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1347 size_hints.rcNormalPosition.left,
1348 size_hints.rcNormalPosition.top,
1349 size_hints.rcNormalPosition.right,
1350 size_hints.rcNormalPosition.bottom));
1351 size_hints.rcNormalPosition.right =
1352 size_hints.rcNormalPosition.left + geometry->base_width;
1353 size_hints.rcNormalPosition.bottom =
1354 size_hints.rcNormalPosition.top + geometry->base_height;
1355 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1356 size_hints.rcNormalPosition.left,
1357 size_hints.rcNormalPosition.top,
1358 size_hints.rcNormalPosition.right,
1359 size_hints.rcNormalPosition.bottom));
1360 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1361 WIN32_API_FAILED ("SetWindowPlacement");
1365 if (geom_mask & GDK_HINT_RESIZE_INC)
1370 if (geom_mask & GDK_HINT_ASPECT)
1377 gdk_window_set_title (GdkWindow *window,
1385 g_return_if_fail (window != NULL);
1386 g_return_if_fail (GDK_IS_WINDOW (window));
1387 g_return_if_fail (title != NULL);
1389 /* Empty window titles not allowed, so set it to just a period. */
1393 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
1394 (guint) GDK_WINDOW_HWND (window), title));
1396 if (!GDK_WINDOW_DESTROYED (window))
1398 /* As the title is in UTF-8 we must translate it
1399 * to the system codepage.
1401 titlelen = strlen (title);
1402 wcstr = g_new (wchar_t, titlelen + 1);
1403 mbstr = g_new (char, 3*titlelen + 1);
1404 wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
1406 WideCharToMultiByte (GetACP (), 0, wcstr, -1,
1407 mbstr, 3*titlelen, NULL, NULL);
1409 if (!SetWindowText (GDK_WINDOW_HWND (window), mbstr))
1410 WIN32_API_FAILED ("SetWindowText");
1418 gdk_window_set_role (GdkWindow *window,
1421 g_return_if_fail (window != NULL);
1422 g_return_if_fail (GDK_IS_WINDOW (window));
1424 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
1425 (guint) GDK_WINDOW_HWND (window),
1426 (role ? role : "NULL")));
1431 gdk_window_set_transient_for (GdkWindow *window,
1434 g_return_if_fail (window != NULL);
1435 g_return_if_fail (GDK_IS_WINDOW (window));
1437 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
1438 (guint) GDK_WINDOW_HWND (window),
1439 (guint) GDK_WINDOW_HWND (parent)));
1444 gdk_window_set_background (GdkWindow *window,
1447 GdkWindowObject *private = (GdkWindowObject *)window;
1449 g_return_if_fail (window != NULL);
1450 g_return_if_fail (GDK_IS_WINDOW (window));
1452 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
1453 (guint) GDK_WINDOW_HWND (window),
1454 gdk_win32_color_to_string (color)));
1456 private->bg_color = *color;
1458 if (private->bg_pixmap &&
1459 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1460 private->bg_pixmap != GDK_NO_BG)
1462 gdk_drawable_unref (private->bg_pixmap);
1463 private->bg_pixmap = NULL;
1468 gdk_window_set_back_pixmap (GdkWindow *window,
1470 gint parent_relative)
1472 GdkWindowObject *private = (GdkWindowObject *)window;
1474 g_return_if_fail (window != NULL);
1475 g_return_if_fail (GDK_IS_WINDOW (window));
1476 g_return_if_fail (pixmap == NULL || !parent_relative);
1478 if (private->bg_pixmap &&
1479 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1480 private->bg_pixmap != GDK_NO_BG)
1481 gdk_drawable_unref (private->bg_pixmap);
1483 if (parent_relative)
1485 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1491 gdk_drawable_ref (pixmap);
1492 private->bg_pixmap = pixmap;
1496 private->bg_pixmap = GDK_NO_BG;
1502 gdk_window_set_cursor (GdkWindow *window,
1505 GdkWindowImplWin32 *impl;
1506 GdkCursorPrivate *cursor_private;
1510 g_return_if_fail (window != NULL);
1511 g_return_if_fail (GDK_IS_WINDOW (window));
1513 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1514 cursor_private = (GdkCursorPrivate*) cursor;
1516 if (!GDK_WINDOW_DESTROYED (window))
1521 hcursor = cursor_private->hcursor;
1523 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
1524 (guint) GDK_WINDOW_HWND (window),
1526 if (impl->hcursor != NULL)
1528 GDK_NOTE (MISC, g_print ("...DestroyCursor (%#x)\n",
1529 (guint) impl->hcursor));
1531 DestroyCursor (impl->hcursor);
1532 impl->hcursor = NULL;
1534 if (hcursor != NULL)
1536 /* We must copy the cursor as it is OK to destroy the GdkCursor
1537 * while still in use for some window. See for instance
1538 * gimp_change_win_cursor() which calls
1539 * gdk_window_set_cursor (win, cursor), and immediately
1540 * afterwards gdk_cursor_destroy (cursor).
1542 impl->hcursor = CopyCursor (hcursor);
1543 GDK_NOTE (MISC, g_print ("...CopyCursor (%#x) = %#x\n",
1544 (guint) hcursor, (guint) impl->hcursor));
1547 if (ChildWindowFromPoint (GDK_WINDOW_HWND (window), pt) == GDK_WINDOW_HWND (window))
1548 SetCursor (impl->hcursor);
1554 gdk_window_get_geometry (GdkWindow *window,
1561 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1564 window = gdk_parent_root;
1566 if (!GDK_WINDOW_DESTROYED (window))
1570 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1571 WIN32_API_FAILED ("GetClientRect");
1578 *width = rect.right - rect.left;
1580 *height = rect.bottom - rect.top;
1582 *depth = gdk_drawable_get_visual (window)->depth;
1587 gdk_window_get_origin (GdkWindow *window,
1595 g_return_val_if_fail (window != NULL, 0);
1597 if (!GDK_WINDOW_DESTROYED (window))
1603 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1616 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
1617 (guint) GDK_WINDOW_HWND (window),
1623 gdk_window_get_deskrelative_origin (GdkWindow *window,
1627 return gdk_window_get_origin (window, x, y);
1631 gdk_window_get_root_origin (GdkWindow *window,
1635 GdkWindowObject *rover;
1638 g_return_if_fail (window != NULL);
1639 g_return_if_fail (GDK_IS_WINDOW (window));
1641 rover = (GdkWindowObject*) window;
1647 if (GDK_WINDOW_DESTROYED (window))
1650 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1651 rover = (GdkWindowObject *) rover->parent;
1652 if (rover->destroyed)
1657 ClientToScreen (GDK_WINDOW_HWND (rover), &pt);
1663 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%ld+%ld\n",
1664 (guint) GDK_WINDOW_HWND (window),
1665 (guint) GDK_WINDOW_HWND (rover),
1670 gdk_window_get_pointer (GdkWindow *window,
1673 GdkModifierType *mask)
1675 GdkWindow *return_val;
1676 POINT pointc, point;
1679 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1682 window = gdk_parent_root;
1685 GetCursorPos (&pointc);
1687 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1694 hwnd = WindowFromPoint (point);
1696 ScreenToClient (hwnd, &point);
1699 hwndc = ChildWindowFromPoint (hwnd, point);
1700 ClientToScreen (hwnd, &point);
1701 ScreenToClient (hwndc, &point);
1702 } while (hwndc != hwnd && (hwnd = hwndc, 1)); /* Ouch! */
1704 return_val = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1710 GetKeyboardState (kbd);
1712 if (kbd[VK_SHIFT] & 0x80)
1713 *mask |= GDK_SHIFT_MASK;
1714 if (kbd[VK_CAPITAL] & 0x80)
1715 *mask |= GDK_LOCK_MASK;
1716 if (kbd[VK_CONTROL] & 0x80)
1717 *mask |= GDK_CONTROL_MASK;
1718 if (kbd[VK_MENU] & 0x80)
1719 *mask |= GDK_MOD1_MASK;
1720 if (kbd[VK_LBUTTON] & 0x80)
1721 *mask |= GDK_BUTTON1_MASK;
1722 if (kbd[VK_MBUTTON] & 0x80)
1723 *mask |= GDK_BUTTON2_MASK;
1724 if (kbd[VK_RBUTTON] & 0x80)
1725 *mask |= GDK_BUTTON3_MASK;
1732 gdk_window_at_pointer (gint *win_x,
1736 POINT point, pointc;
1740 GetCursorPos (&pointc);
1742 hwnd = WindowFromPoint (point);
1746 window = gdk_parent_root;
1754 ScreenToClient (hwnd, &point);
1757 hwndc = ChildWindowFromPoint (hwnd, point);
1758 ClientToScreen (hwnd, &point);
1759 ScreenToClient (hwndc, &point);
1760 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1762 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1764 if (window && (win_x || win_y))
1766 GetClientRect (hwnd, &rect);
1768 *win_x = point.x - rect.left;
1770 *win_y = point.y - rect.top;
1773 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %#x%s\n",
1776 (window == NULL ? " NULL" : "")));
1782 gdk_window_get_events (GdkWindow *window)
1784 g_return_val_if_fail (window != NULL, 0);
1785 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1787 if (GDK_WINDOW_DESTROYED (window))
1790 return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask;
1794 gdk_window_set_events (GdkWindow *window,
1795 GdkEventMask event_mask)
1797 g_return_if_fail (window != NULL);
1798 g_return_if_fail (GDK_IS_WINDOW (window));
1800 if (GDK_WINDOW_DESTROYED (window))
1803 GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask = event_mask;
1807 gdk_window_shape_combine_mask (GdkWindow *window,
1811 g_return_if_fail (window != NULL);
1812 g_return_if_fail (GDK_IS_WINDOW (window));
1816 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
1817 (guint) GDK_WINDOW_HWND (window)));
1818 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
1827 /* Convert mask bitmap to region */
1828 hrgn = BitmapToRegion (GDK_WINDOW_HWND (mask));
1830 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
1831 (guint) GDK_WINDOW_HWND (window),
1832 (guint) GDK_WINDOW_HWND (mask)));
1834 /* SetWindowRgn wants window (not client) coordinates */
1835 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1836 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1837 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1838 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1839 OffsetRgn (hrgn, -rect.left, -rect.top);
1841 OffsetRgn (hrgn, x, y);
1843 /* If this is a top-level window, add the title bar to the region */
1844 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1846 CombineRgn (hrgn, hrgn,
1847 CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
1851 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
1856 gdk_window_set_override_redirect (GdkWindow *window,
1857 gboolean override_redirect)
1859 g_return_if_fail (window != NULL);
1860 g_return_if_fail (GDK_IS_WINDOW (window));
1862 g_warning ("gdk_window_set_override_redirect not implemented");
1866 gdk_window_set_icon (GdkWindow *window,
1867 GdkWindow *icon_window,
1871 g_return_if_fail (window != NULL);
1872 g_return_if_fail (GDK_IS_WINDOW (window));
1874 if (GDK_WINDOW_DESTROYED (window))
1877 /* Nothing to do, really. As we share window classes between windows
1878 * we can't have window-specific icons, sorry. Don't print any warning
1884 gdk_window_set_icon_name (GdkWindow *window,
1887 g_return_if_fail (window != NULL);
1888 g_return_if_fail (GDK_IS_WINDOW (window));
1890 if (GDK_WINDOW_DESTROYED (window))
1893 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
1894 WIN32_API_FAILED ("SetWindowText");
1898 gdk_window_set_group (GdkWindow *window,
1901 g_return_if_fail (window != NULL);
1902 g_return_if_fail (GDK_IS_WINDOW (window));
1903 g_return_if_fail (leader != NULL);
1904 g_return_if_fail (GDK_IS_WINDOW (leader));
1906 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
1909 g_warning ("gdk_window_set_group not implemented");
1913 gdk_window_set_decorations (GdkWindow *window,
1914 GdkWMDecoration decorations)
1916 LONG style, exstyle;
1918 g_return_if_fail (window != NULL);
1919 g_return_if_fail (GDK_IS_WINDOW (window));
1921 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1922 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1924 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1925 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
1927 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1929 if (decorations & GDK_DECOR_ALL)
1930 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1931 if (decorations & GDK_DECOR_BORDER)
1932 style |= (WS_BORDER);
1933 if (decorations & GDK_DECOR_RESIZEH)
1934 style |= (WS_THICKFRAME);
1935 if (decorations & GDK_DECOR_TITLE)
1936 style |= (WS_CAPTION);
1937 if (decorations & GDK_DECOR_MENU)
1938 style |= (WS_SYSMENU);
1939 if (decorations & GDK_DECOR_MINIMIZE)
1940 style |= (WS_MINIMIZEBOX);
1941 if (decorations & GDK_DECOR_MAXIMIZE)
1942 style |= (WS_MAXIMIZEBOX);
1944 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1948 gdk_window_set_functions (GdkWindow *window,
1949 GdkWMFunction functions)
1951 LONG style, exstyle;
1953 g_return_if_fail (window != NULL);
1954 g_return_if_fail (GDK_IS_WINDOW (window));
1956 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1957 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1959 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1960 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
1963 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1965 if (functions & GDK_FUNC_ALL)
1966 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1967 if (functions & GDK_FUNC_RESIZE)
1968 style |= (WS_THICKFRAME);
1969 if (functions & GDK_FUNC_MOVE)
1970 style |= (WS_THICKFRAME);
1971 if (functions & GDK_FUNC_MINIMIZE)
1972 style |= (WS_MINIMIZEBOX);
1973 if (functions & GDK_FUNC_MAXIMIZE)
1974 style |= (WS_MAXIMIZEBOX);
1976 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
1980 * propagate the shapes from all child windows of a GDK window to the parent
1981 * window. Shamelessly ripped from Enlightenment's code
1987 QueryTree (HWND hwnd,
1997 child = GetWindow (hwnd, GW_CHILD);
1999 child = GetWindow (child, GW_HWNDNEXT);
2002 } while (child != NULL);
2006 *children = g_new (HWND, n);
2007 for (i = 0; i < n; i++)
2010 child = GetWindow (hwnd, GW_CHILD);
2012 child = GetWindow (child, GW_HWNDNEXT);
2013 *children[i] = child;
2019 gdk_propagate_shapes (HANDLE win,
2023 HRGN region, childRegion;
2027 SetRectEmpty (&emptyRect);
2028 region = CreateRectRgnIndirect (&emptyRect);
2030 GetWindowRgn (win, region);
2032 QueryTree (win, &list, &num);
2035 WINDOWPLACEMENT placement;
2037 placement.length = sizeof (WINDOWPLACEMENT);
2038 /* go through all child windows and combine regions */
2039 for (i = 0; i < num; i++)
2041 GetWindowPlacement (list[i], &placement);
2042 if (placement.showCmd == SW_SHOWNORMAL)
2044 childRegion = CreateRectRgnIndirect (&emptyRect);
2045 GetWindowRgn (list[i], childRegion);
2046 CombineRgn (region, region, childRegion, RGN_OR);
2047 DeleteObject (childRegion);
2050 SetWindowRgn (win, region, TRUE);
2053 DeleteObject (region);
2057 gdk_window_set_child_shapes (GdkWindow *window)
2059 g_return_if_fail (window != NULL);
2060 g_return_if_fail (GDK_IS_WINDOW (window));
2062 if (GDK_WINDOW_DESTROYED (window))
2065 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2069 gdk_window_merge_child_shapes (GdkWindow *window)
2071 g_return_if_fail (window != NULL);
2072 g_return_if_fail (GDK_IS_WINDOW (window));
2074 if (GDK_WINDOW_DESTROYED (window))
2077 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2080 /* Support for windows that can be guffaw-scrolled
2081 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2085 gdk_window_gravity_works (void)
2087 enum { UNKNOWN, NO, YES };
2088 static gint gravity_works = UNKNOWN;
2090 if (gravity_works == UNKNOWN)
2097 attr.window_type = GDK_WINDOW_TEMP;
2098 attr.wclass = GDK_INPUT_OUTPUT;
2103 attr.event_mask = 0;
2105 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2107 attr.window_type = GDK_WINDOW_CHILD;
2108 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2110 gdk_window_set_static_win_gravity (child, TRUE);
2112 gdk_window_resize (parent, 100, 110);
2113 gdk_window_move (parent, 0, -10);
2114 gdk_window_move_resize (parent, 0, 0, 100, 100);
2116 gdk_window_resize (parent, 100, 110);
2117 gdk_window_move (parent, 0, -10);
2118 gdk_window_move_resize (parent, 0, 0, 100, 100);
2120 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2122 gdk_window_destroy (parent);
2123 gdk_window_destroy (child);
2125 gravity_works = ((y == -20) ? YES : NO);
2128 return (gravity_works == YES);
2132 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2134 g_return_if_fail (window != NULL);
2136 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2140 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2142 g_return_if_fail (window != NULL);
2145 g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2148 /*************************************************************
2149 * gdk_window_set_static_gravities:
2150 * Set the bit gravity of the given window to static,
2151 * and flag it so all children get static subwindow
2154 * window: window for which to set static gravity
2155 * use_static: Whether to turn static gravity on or off.
2157 * Does the XServer support static gravity?
2158 *************************************************************/
2161 gdk_window_set_static_gravities (GdkWindow *window,
2162 gboolean use_static)
2164 GdkWindowObject *private = (GdkWindowObject *)window;
2167 g_return_val_if_fail (window != NULL, FALSE);
2168 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2170 if (!use_static == !private->guffaw_gravity)
2173 if (use_static && !gdk_window_gravity_works ())
2176 private->guffaw_gravity = use_static;
2178 if (!GDK_WINDOW_DESTROYED (window))
2180 gdk_window_set_static_bit_gravity (window, use_static);
2182 tmp_list = private->children;
2185 gdk_window_set_static_win_gravity (window, use_static);
2187 tmp_list = tmp_list->next;