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 Library 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 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library 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-1999. 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/.
33 #include "gdkevents.h"
34 #include "gdkpixmap.h"
35 #include "gdkwindow.h"
36 #include "gdkinternals.h"
37 #include "gdkprivate.h"
38 #include "gdkprivate-win32.h"
39 #include "gdkinputprivate.h"
42 static gboolean gdk_window_gravity_works (void);
43 static void gdk_window_set_static_win_gravity (GdkWindow *window,
46 /* The Win API function AdjustWindowRect may return negative values
47 * resulting in obscured title bars. This helper function is coreccting it.
50 SafeAdjustWindowRectEx (RECT* lpRect,
55 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
57 WIN32_API_FAILED ("AdjustWindowRectEx");
62 lpRect->right -= lpRect->left;
67 lpRect->bottom -= lpRect->top;
73 GdkDrawableClass _gdk_windowing_window_class;
76 gdk_win32_window_destroy (GdkDrawable *drawable)
78 if (!GDK_DRAWABLE_DESTROYED (drawable))
80 if (GDK_DRAWABLE_TYPE (drawable) == GDK_WINDOW_FOREIGN)
81 gdk_xid_table_remove (GDK_DRAWABLE_XID (drawable));
83 g_warning ("losing last reference to undestroyed window\n");
86 if (GDK_WINDOW_WIN32DATA (drawable)->bg_type == GDK_WIN32_BG_PIXMAP
87 && GDK_WINDOW_WIN32DATA (drawable)->bg_pixmap != NULL)
88 gdk_drawable_unref (GDK_WINDOW_WIN32DATA (drawable)->bg_pixmap);
90 g_free (GDK_DRAWABLE_WIN32DATA (drawable));
94 gdk_win32_window_alloc (void)
97 GdkWindowPrivate *private;
99 static gboolean initialized = FALSE;
105 _gdk_windowing_window_class = _gdk_win32_drawable_class;
106 _gdk_win32_drawable_class.destroy = gdk_win32_window_destroy;
109 window = _gdk_window_alloc ();
110 private = (GdkWindowPrivate *) window;
112 private->drawable.klass = &_gdk_windowing_window_class;
113 private->drawable.klass_data = g_new (GdkWindowWin32Data, 1);
115 GDK_WINDOW_WIN32DATA (window)->event_mask = 0;
116 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
117 GDK_WINDOW_WIN32DATA (window)->xcursor = NULL;
118 GDK_WINDOW_WIN32DATA (window)->hint_flags = 0;
119 GDK_WINDOW_WIN32DATA (window)->extension_events_selected = FALSE;
121 GDK_WINDOW_WIN32DATA (window)->input_locale = GetKeyboardLayout (0);
122 TranslateCharsetInfo ((DWORD FAR *) GetACP (),
123 &GDK_WINDOW_WIN32DATA (window)->charset_info,
130 gdk_window_init (void)
132 GdkWindowPrivate *private;
137 SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);
138 width = r.right - r.left;
139 height = r.bottom - r.top;
141 gdk_parent_root = gdk_win32_window_alloc ();
142 private = (GdkWindowPrivate *) gdk_parent_root;
144 GDK_DRAWABLE_WIN32DATA (gdk_parent_root)->xid = gdk_root_window;
145 private->drawable.window_type = GDK_WINDOW_ROOT;
146 private->drawable.width = width;
147 private->drawable.height = height;
149 gdk_xid_table_insert (&gdk_root_window, gdk_parent_root);
153 * is a wrapper function for RegisterWindowClassEx.
154 * It creates at least one unique class for every
155 * GdkWindowType. If support for single window-specific icons
156 * is ever needed (e.g Dialog specific), every such window should
160 RegisterGdkClass (GdkDrawableType wtype)
162 static ATOM klassTOPLEVEL = 0;
163 static ATOM klassDIALOG = 0;
164 static ATOM klassCHILD = 0;
165 static ATOM klassTEMP = 0;
166 static HICON hAppIcon = NULL;
167 static WNDCLASSEX wcl;
170 wcl.cbSize = sizeof(WNDCLASSEX);
171 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
172 * on WM_SIZE and WM_MOVE. Flicker, Performance!
174 wcl.lpfnWndProc = gdk_WindowProc;
177 wcl.hInstance = gdk_ProgInstance;
179 /* initialize once! */
182 gchar sLoc [_MAX_PATH+1];
183 HINSTANCE hInst = GetModuleHandle(NULL);
185 if (0 != GetModuleFileName(hInst, sLoc, _MAX_PATH))
187 hAppIcon = ExtractIcon(hInst, sLoc, 0);
190 char *gdklibname = g_strdup_printf ("gdk-%s.dll", GDK_VERSION);
192 hAppIcon = ExtractIcon(hInst, gdklibname, 0);
197 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
201 wcl.lpszMenuName = NULL;
204 /* initialize once per class */
205 #define ONCE_PER_CLASS() \
206 wcl.hIcon = CopyIcon (hAppIcon); \
207 wcl.hIconSm = CopyIcon (hAppIcon); \
208 wcl.hbrBackground = CreateSolidBrush( RGB(0,0,0)); \
209 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
213 case GDK_WINDOW_TOPLEVEL:
214 if (0 == klassTOPLEVEL)
216 wcl.lpszClassName = "gdkWindowToplevel";
219 klassTOPLEVEL = RegisterClassEx(&wcl);
221 klass = klassTOPLEVEL;
223 case GDK_WINDOW_CHILD:
226 wcl.lpszClassName = "gdkWindowChild";
228 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
230 klassCHILD = RegisterClassEx(&wcl);
234 case GDK_WINDOW_DIALOG:
235 if (0 == klassDIALOG)
237 wcl.lpszClassName = "gdkWindowDialog";
238 wcl.style |= CS_SAVEBITS;
240 klassDIALOG = RegisterClassEx(&wcl);
244 case GDK_WINDOW_TEMP:
247 wcl.lpszClassName = "gdkWindowTemp";
248 wcl.style |= CS_SAVEBITS;
250 klassTEMP = RegisterClassEx(&wcl);
254 case GDK_WINDOW_ROOT:
255 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
257 case GDK_DRAWABLE_PIXMAP:
258 g_error ("cannot make windows of type GDK_DRAWABLE_PIXMAP (use gdk_pixmap_new)");
264 WIN32_API_FAILED ("RegisterClassEx");
265 g_error ("That is a fatal error");
271 gdk_window_new (GdkWindow *parent,
272 GdkWindowAttr *attributes,
273 gint attributes_mask)
276 GdkWindowPrivate *private;
277 GdkWindowPrivate *parent_private;
282 DWORD dwStyle, dwExStyle;
292 g_return_val_if_fail (attributes != NULL, NULL);
295 parent = gdk_parent_root;
297 parent_private = (GdkWindowPrivate*) parent;
298 if (GDK_DRAWABLE_DESTROYED (parent))
301 xparent = GDK_DRAWABLE_XID (parent);
303 window = gdk_win32_window_alloc ();
304 private = (GdkWindowPrivate *)window;
306 private->parent = parent;
308 private->x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
309 private->y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
311 private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1);
312 private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1);
313 private->drawable.window_type = attributes->window_type;
314 GDK_WINDOW_WIN32DATA (window)->extension_events_selected = FALSE;
316 if (attributes_mask & GDK_WA_VISUAL)
317 visual = attributes->visual;
319 visual = gdk_visual_get_system ();
320 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
322 if (attributes_mask & GDK_WA_TITLE)
323 title = attributes->title;
325 title = g_get_prgname ();
327 title = "GDK client window";
329 GDK_WINDOW_WIN32DATA (window)->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
331 if (parent_private && parent_private->guffaw_gravity)
336 if (attributes->wclass == GDK_INPUT_OUTPUT)
339 if (attributes_mask & GDK_WA_COLORMAP)
340 private->drawable.colormap = attributes->colormap;
342 private->drawable.colormap = gdk_colormap_get_system ();
346 dwExStyle = WS_EX_TRANSPARENT;
347 private->drawable.colormap = NULL;
348 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_TRANSPARENT;
349 GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
352 if (attributes_mask & GDK_WA_X)
357 if (attributes_mask & GDK_WA_Y)
359 else if (attributes_mask & GDK_WA_X)
360 y = 100; /* ??? We must put it somewhere... */
362 y = 500; /* x is CW_USEDEFAULT, y doesn't matter then */
365 parent_private->children = g_list_prepend (parent_private->children, window);
367 switch (private->drawable.window_type)
369 case GDK_WINDOW_TOPLEVEL:
370 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
371 xparent = gdk_root_window;
373 case GDK_WINDOW_CHILD:
374 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
376 case GDK_WINDOW_DIALOG:
377 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
379 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
381 xparent = gdk_root_window;
383 case GDK_WINDOW_TEMP:
384 dwStyle = WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
385 dwExStyle |= WS_EX_TOOLWINDOW;
387 case GDK_WINDOW_ROOT:
388 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
390 case GDK_DRAWABLE_PIXMAP:
391 g_error ("cannot make windows of type GDK_DRAWABLE_PIXMAP (use gdk_pixmap_new)");
395 klass = RegisterGdkClass (private->drawable.window_type);
397 if (private->drawable.window_type != GDK_WINDOW_CHILD)
399 if (x == CW_USEDEFAULT)
410 rect.right = rect.left + private->drawable.width;
411 rect.bottom = rect.top + private->drawable.height;
413 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
415 if (x != CW_USEDEFAULT)
420 width = rect.right - rect.left;
421 height = rect.bottom - rect.top;
425 width = private->drawable.width;
426 height = private->drawable.height;
429 titlelen = strlen (title);
430 wctitle = g_new (wchar_t, titlelen + 1);
431 mbtitle = g_new (char, 3*titlelen + 1);
432 wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
434 WideCharToMultiByte (GetACP (), 0, wctitle, -1,
435 mbtitle, 3*titlelen, NULL, NULL);
437 GDK_DRAWABLE_WIN32DATA (window)->xid =
438 CreateWindowEx (dwExStyle,
439 MAKEINTRESOURCE(klass),
450 g_print ("gdk_window_new: %s %s %dx%d@+%d+%d %#x = %#x\n"
451 "...locale %#x codepage %d\n",
452 (private->drawable.window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
453 (private->drawable.window_type == GDK_WINDOW_CHILD ? "CHILD" :
454 (private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
455 (private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
458 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
460 GDK_DRAWABLE_XID (window),
461 GDK_WINDOW_WIN32DATA (window)->input_locale,
462 GDK_WINDOW_WIN32DATA (window)->charset_info.ciACP));
467 if (GDK_DRAWABLE_XID (window) == NULL)
469 WIN32_API_FAILED ("CreateWindowEx");
470 g_free (GDK_DRAWABLE_WIN32DATA (window));
475 gdk_drawable_ref (window);
476 gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window);
478 if (private->drawable.colormap)
479 gdk_colormap_ref (private->drawable.colormap);
481 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
482 (attributes->cursor) :
489 gdk_window_foreign_new (guint32 anid)
492 GdkWindowPrivate *private;
493 GdkWindowPrivate *parent_private;
498 window = gdk_win32_window_alloc ();
499 private = (GdkWindowPrivate *)window;
501 parent = GetParent ((HWND) anid);
502 private->parent = gdk_xid_table_lookup (parent);
504 parent_private = (GdkWindowPrivate *)private->parent;
507 parent_private->children = g_list_prepend (parent_private->children, window);
509 GDK_DRAWABLE_WIN32DATA (window)->xid = (HWND) anid;
510 GetClientRect ((HWND) anid, &rect);
512 point.y = rect.right;
513 ClientToScreen ((HWND) anid, &point);
514 if (parent != GetDesktopWindow ())
515 ScreenToClient (parent, &point);
516 private->x = point.x;
517 private->y = point.y;
518 private->drawable.width = rect.right - rect.left;
519 private->drawable.height = rect.bottom - rect.top;
520 private->drawable.window_type = GDK_WINDOW_FOREIGN;
521 private->drawable.destroyed = FALSE;
522 private->mapped = IsWindowVisible (GDK_DRAWABLE_XID (window));
524 private->drawable.colormap = NULL;
526 gdk_drawable_ref (window);
527 gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window);
532 /* Call this function when you want a window and all its children to
533 * disappear. When xdestroy is true, a request to destroy the window
534 * is sent out. When it is false, it is assumed that the window has
535 * been or will be destroyed by destroying some ancestor of this
539 gdk_window_internal_destroy (GdkWindow *window,
541 gboolean our_destroy)
543 GdkWindowPrivate *private;
544 GdkWindowPrivate *temp_private;
545 GdkWindow *temp_window;
549 g_return_if_fail (window != NULL);
551 private = (GdkWindowPrivate *) window;
553 GDK_NOTE (MISC, g_print ("gdk_window_internal_destroy %#x\n",
554 GDK_DRAWABLE_XID (window)));
556 switch (GDK_DRAWABLE_TYPE (window))
558 case GDK_WINDOW_TOPLEVEL:
559 case GDK_WINDOW_CHILD:
560 case GDK_WINDOW_DIALOG:
561 case GDK_WINDOW_TEMP:
562 case GDK_WINDOW_FOREIGN:
563 if (!private->drawable.destroyed)
567 GdkWindowPrivate *parent_private = (GdkWindowPrivate *)private->parent;
568 if (parent_private->children)
569 parent_private->children = g_list_remove (parent_private->children, window);
572 if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_FOREIGN)
574 children = tmp = private->children;
575 private->children = NULL;
579 temp_window = tmp->data;
582 temp_private = (GdkWindowPrivate*) temp_window;
584 gdk_window_internal_destroy (temp_window, FALSE,
588 g_list_free (children);
591 if (private->extension_events != 0)
592 gdk_input_window_destroy (window);
594 if (private->filters)
596 tmp = private->filters;
604 g_list_free (private->filters);
605 private->filters = NULL;
608 if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
610 if (our_destroy && (private->parent != NULL))
612 /* It's somebody elses window, but in our hierarchy,
613 * so reparent it to the root window, and then send
614 * it a delete event, as if we were a WM
616 gdk_window_hide (window);
617 gdk_window_reparent (window, NULL, 0, 0);
619 /* Is this too drastic? Many (most?) applications
620 * quit if any window receives WM_QUIT I think.
621 * OTOH, I don't think foreign windows are much
622 * used, so the question is maybe academic.
624 PostMessage (GDK_DRAWABLE_XID (window), WM_QUIT, 0, 0);
628 DestroyWindow (GDK_DRAWABLE_XID (window));
630 if (private->drawable.colormap)
631 gdk_colormap_unref (private->drawable.colormap);
633 private->mapped = FALSE;
634 private->drawable.destroyed = TRUE;
638 case GDK_WINDOW_ROOT:
639 g_error ("attempted to destroy root window");
642 case GDK_DRAWABLE_PIXMAP:
643 g_error ("called gdk_window_destroy on a pixmap (use gdk_drawable_unref)");
648 /* Like internal_destroy, but also destroys the reference created by
652 gdk_window_destroy (GdkWindow *window)
654 gdk_window_internal_destroy (window, TRUE, TRUE);
655 gdk_drawable_unref (window);
658 /* This function is called when the window really gone. */
661 gdk_window_destroy_notify (GdkWindow *window)
663 g_return_if_fail (window != NULL);
666 g_print ("gdk_window_destroy_notify: %#x %s\n",
667 GDK_DRAWABLE_XID (window),
668 (GDK_DRAWABLE_DESTROYED (window) ? "yes" : "no")));
670 if (!GDK_DRAWABLE_DESTROYED (window))
672 if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_FOREIGN)
673 g_warning ("window %#x unexpectedly destroyed",
674 GDK_DRAWABLE_XID (window));
676 gdk_window_internal_destroy (window, FALSE, FALSE);
679 gdk_xid_table_remove (GDK_DRAWABLE_XID (window));
680 gdk_drawable_unref (window);
684 gdk_window_show (GdkWindow *window)
686 g_return_if_fail (window != NULL);
688 if (!GDK_DRAWABLE_DESTROYED (window))
690 GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
691 GDK_DRAWABLE_XID (window)));
693 ((GdkWindowPrivate *) window)->mapped = TRUE;
694 if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TEMP)
696 ShowWindow (GDK_DRAWABLE_XID (window), SW_SHOWNOACTIVATE);
697 SetWindowPos (GDK_DRAWABLE_XID (window), HWND_TOPMOST, 0, 0, 0, 0,
698 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
700 /* Don't put on toolbar */
701 ShowWindow (GDK_DRAWABLE_XID (window), SW_HIDE);
706 ShowWindow (GDK_DRAWABLE_XID (window), SW_SHOWNORMAL);
707 ShowWindow (GDK_DRAWABLE_XID (window), SW_RESTORE);
708 SetForegroundWindow (GDK_DRAWABLE_XID (window));
709 BringWindowToTop (GDK_DRAWABLE_XID (window));
711 ShowOwnedPopups (GDK_DRAWABLE_XID (window), TRUE);
718 gdk_window_hide (GdkWindow *window)
720 g_return_if_fail (window != NULL);
722 if (!GDK_DRAWABLE_DESTROYED (window))
724 GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
725 GDK_DRAWABLE_XID (window)));
727 ((GdkWindowPrivate *) window)->mapped = FALSE;
728 if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TOPLEVEL)
729 ShowOwnedPopups (GDK_DRAWABLE_XID (window), FALSE);
731 ShowWindow (GDK_DRAWABLE_XID (window), SW_HIDE);
733 ShowWindow (GDK_DRAWABLE_XID (window), SW_MINIMIZE);
735 CloseWindow (GDK_DRAWABLE_XID (window));
741 gdk_window_withdraw (GdkWindow *window)
743 g_return_if_fail (window != NULL);
745 if (!GDK_DRAWABLE_DESTROYED (window))
747 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
748 GDK_DRAWABLE_XID (window)));
750 gdk_window_hide (window); /* XXX */
755 gdk_window_move (GdkWindow *window,
759 GdkWindowPrivate *private;
761 g_return_if_fail (window != NULL);
763 if (!GDK_DRAWABLE_DESTROYED (window))
767 GDK_NOTE (MISC, g_print ("gdk_window_move: %#x +%d+%d\n",
768 GDK_DRAWABLE_XID (window), x, y));
770 private = (GdkWindowPrivate *) window;
771 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
773 if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_CHILD)
781 ClientToScreen (GDK_DRAWABLE_XID (window), &ptTL);
786 ptBR.y = rect.bottom;
787 ClientToScreen (GDK_DRAWABLE_XID (window), &ptBR);
788 rect.right = x + ptBR.x - ptTL.x;
789 rect.bottom = y + ptBR.y - ptTL.y;
791 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
792 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
793 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
803 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
804 GDK_DRAWABLE_XID (window),
805 rect.right - rect.left, rect.bottom - rect.top,
807 if (!MoveWindow (GDK_DRAWABLE_XID (window),
808 x, y, rect.right - rect.left, rect.bottom - rect.top,
810 WIN32_API_FAILED ("MoveWindow");
815 gdk_window_resize (GdkWindow *window,
819 GdkWindowPrivate *private;
821 g_return_if_fail (window != NULL);
823 if ((gint16) width < 1)
825 if ((gint16) height < 1)
828 private = (GdkWindowPrivate*) window;
830 if (!private->drawable.destroyed &&
831 ((private->resize_count > 0) ||
832 (private->drawable.width != (guint16) width) ||
833 (private->drawable.height != (guint16) height)))
837 GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
838 GDK_DRAWABLE_XID (window), width, height));
840 if (private->drawable.window_type != GDK_WINDOW_CHILD)
849 ClientToScreen (GDK_DRAWABLE_XID (window), &pt);
852 rect.right = pt.x + width;
853 rect.bottom = pt.y + height;
855 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
856 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
857 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
858 WIN32_API_FAILED ("AdjustWindowRectEx");
862 width = rect.right - rect.left;
863 height = rect.bottom - rect.top;
869 private->drawable.width = width;
870 private->drawable.height = height;
873 private->resize_count += 1;
876 g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
877 GDK_DRAWABLE_XID (window), width, height, x, y));
878 if (!MoveWindow (GDK_DRAWABLE_XID (window),
881 WIN32_API_FAILED ("MoveWindow");
886 gdk_window_move_resize (GdkWindow *window,
892 GdkWindowPrivate *private;
894 g_return_if_fail (window != NULL);
896 if ((gint16) width < 1)
898 if ((gint16) height < 1)
901 if (!GDK_DRAWABLE_DESTROYED (window))
907 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
908 GDK_DRAWABLE_XID (window), width, height, x, y));
910 private = (GdkWindowPrivate*) window;
913 rect.right = x + width;
914 rect.bottom = y + height;
916 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
917 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
918 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
919 WIN32_API_FAILED ("AdjustWindowRectEx");
921 if (private->drawable.window_type == GDK_WINDOW_CHILD)
925 private->drawable.width = width;
926 private->drawable.height = height;
928 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
929 GDK_DRAWABLE_XID (window),
930 rect.right - rect.left, rect.bottom - rect.top,
931 rect.left, rect.top));
932 if (!MoveWindow (GDK_DRAWABLE_XID (window),
934 rect.right - rect.left, rect.bottom - rect.top,
936 WIN32_API_FAILED ("MoveWindow");
938 if (private->guffaw_gravity)
940 GList *tmp_list = private->children;
943 GdkWindowPrivate *child_private = tmp_list->data;
945 child_private->x -= x - private->x;
946 child_private->y -= y - private->y;
948 tmp_list = tmp_list->next;
956 gdk_window_reparent (GdkWindow *window,
957 GdkWindow *new_parent,
961 GdkWindowPrivate *window_private;
962 GdkWindowPrivate *parent_private;
963 GdkWindowPrivate *old_parent_private;
965 g_return_if_fail (window != NULL);
968 new_parent = gdk_parent_root;
970 window_private = (GdkWindowPrivate*) window;
971 old_parent_private = (GdkWindowPrivate *) window_private->parent;
972 parent_private = (GdkWindowPrivate*) new_parent;
974 if (!GDK_DRAWABLE_DESTROYED (window)
975 && !GDK_DRAWABLE_DESTROYED (new_parent))
977 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
978 GDK_DRAWABLE_XID (window),
979 GDK_DRAWABLE_XID (new_parent)));
980 if (!SetParent (GDK_DRAWABLE_XID (window),
981 GDK_DRAWABLE_XID (new_parent)))
982 WIN32_API_FAILED ("SetParent");
984 if (!MoveWindow (GDK_DRAWABLE_XID (window),
986 window_private->drawable.width,
987 window_private->drawable.height,
989 WIN32_API_FAILED ("MoveWindow");
992 window_private->parent = new_parent;
994 if (old_parent_private)
995 old_parent_private->children =
996 g_list_remove (old_parent_private->children, window);
998 if ((old_parent_private &&
999 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1000 (!old_parent_private && parent_private->guffaw_gravity))
1001 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1003 parent_private->children = g_list_prepend (parent_private->children, window);
1007 gdk_window_clear (GdkWindow *window)
1009 g_return_if_fail (window != NULL);
1010 g_return_if_fail (GDK_IS_WINDOW (window));
1012 if (!GDK_DRAWABLE_DESTROYED (window))
1013 gdk_window_clear_area (window, 0, 0, 0, 0);
1018 _gdk_windowing_window_clear_area (GdkWindow *window,
1024 g_return_if_fail (window != NULL);
1025 g_return_if_fail (GDK_IS_WINDOW (window));
1027 if (!GDK_DRAWABLE_DESTROYED (window))
1032 width = ((GdkDrawablePrivate *) window)->width - x;
1034 height = ((GdkDrawablePrivate *) window)->height - y;
1035 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1036 "%#x %dx%d@+%d+%d\n",
1037 GDK_DRAWABLE_XID (window), width, height, x, y));
1038 hdc = GetDC (GDK_DRAWABLE_XID (window));
1039 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1040 SendMessage (GDK_DRAWABLE_XID (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1041 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
1046 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1052 g_return_if_fail (window != NULL);
1053 g_return_if_fail (GDK_IS_WINDOW (window));
1055 if (!GDK_DRAWABLE_DESTROYED (window))
1059 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1060 "%#x %dx%d@+%d+%d\n",
1061 GDK_DRAWABLE_XID (window), width, height, x, y));
1064 rect.right = x + width + 1;
1066 rect.bottom = y + height + 1;
1067 if (!InvalidateRect (GDK_DRAWABLE_XID (window), &rect, TRUE))
1068 WIN32_GDI_FAILED ("InvalidateRect");
1069 UpdateWindow (GDK_DRAWABLE_XID (window));
1074 gdk_window_raise (GdkWindow *window)
1076 g_return_if_fail (window != NULL);
1077 g_return_if_fail (GDK_IS_WINDOW (window));
1079 if (!GDK_DRAWABLE_DESTROYED (window))
1081 GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
1082 GDK_DRAWABLE_XID (window)));
1084 if (!BringWindowToTop (GDK_DRAWABLE_XID (window)))
1085 WIN32_API_FAILED ("BringWindowToTop");
1090 gdk_window_lower (GdkWindow *window)
1092 g_return_if_fail (window != NULL);
1093 g_return_if_fail (GDK_IS_WINDOW (window));
1095 if (!GDK_DRAWABLE_DESTROYED (window))
1097 GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
1098 GDK_DRAWABLE_XID (window)));
1100 if (!SetWindowPos (GDK_DRAWABLE_XID (window), HWND_BOTTOM, 0, 0, 0, 0,
1101 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1102 WIN32_API_FAILED ("SetWindowPos");
1107 gdk_window_set_hints (GdkWindow *window,
1116 WINDOWPLACEMENT size_hints;
1122 g_return_if_fail (window != NULL);
1123 g_return_if_fail (GDK_IS_WINDOW (window));
1125 if (GDK_DRAWABLE_DESTROYED (window))
1128 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
1129 GDK_DRAWABLE_XID (window),
1130 min_width, min_height, max_width, max_height,
1133 GDK_WINDOW_WIN32DATA (window)->hint_flags = flags;
1134 size_hints.length = sizeof (size_hints);
1138 if (flags & GDK_HINT_POS)
1139 if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
1140 WIN32_API_FAILED ("GetWindowPlacement");
1143 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1144 " (%d,%d)--(%d,%d)\n",
1145 size_hints.rcNormalPosition.left,
1146 size_hints.rcNormalPosition.top,
1147 size_hints.rcNormalPosition.right,
1148 size_hints.rcNormalPosition.bottom));
1149 /* What are the corresponding window coordinates for client
1150 * area coordinates x, y
1154 rect.right = rect.left + 200; /* dummy */
1155 rect.bottom = rect.top + 200;
1156 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1157 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1158 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1159 size_hints.flags = 0;
1160 size_hints.showCmd = SW_SHOWNA;
1162 /* Set the normal position hint to that location, with unchanged
1165 diff = size_hints.rcNormalPosition.left - rect.left;
1166 size_hints.rcNormalPosition.left = rect.left;
1167 size_hints.rcNormalPosition.right -= diff;
1168 diff = size_hints.rcNormalPosition.top - rect.top;
1169 size_hints.rcNormalPosition.top = rect.top;
1170 size_hints.rcNormalPosition.bottom -= diff;
1171 GDK_NOTE (MISC, g_print ("...setting: (%d,%d)--(%d,%d)\n",
1172 size_hints.rcNormalPosition.left,
1173 size_hints.rcNormalPosition.top,
1174 size_hints.rcNormalPosition.right,
1175 size_hints.rcNormalPosition.bottom));
1176 if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
1177 WIN32_API_FAILED ("SetWindowPlacement");
1178 GDK_WINDOW_WIN32DATA (window)->hint_x = rect.left;
1179 GDK_WINDOW_WIN32DATA (window)->hint_y = rect.top;
1182 if (flags & GDK_HINT_MIN_SIZE)
1186 rect.right = min_width;
1187 rect.bottom = min_height;
1188 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1189 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1190 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1191 GDK_WINDOW_WIN32DATA (window)->hint_min_width =
1192 rect.right - rect.left;
1193 GDK_WINDOW_WIN32DATA (window)->hint_min_height =
1194 rect.bottom - rect.top;
1196 /* Also chek if he current size of the window is in bounds. */
1197 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1198 if (rect.right < min_width && rect.bottom < min_height)
1199 gdk_window_resize (window, min_width, min_height);
1200 else if (rect.right < min_width)
1201 gdk_window_resize (window, min_width, rect.bottom);
1202 else if (rect.bottom < min_height)
1203 gdk_window_resize (window, rect.right, min_height);
1206 if (flags & GDK_HINT_MAX_SIZE)
1210 rect.right = max_width;
1211 rect.bottom = max_height;
1212 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1213 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1214 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1215 GDK_WINDOW_WIN32DATA (window)->hint_max_width =
1216 rect.right - rect.left;
1217 GDK_WINDOW_WIN32DATA (window)->hint_max_height =
1218 rect.bottom - rect.top;
1219 /* Again, check if the window is too large currently. */
1220 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1221 if (rect.right > max_width && rect.bottom > max_height)
1222 gdk_window_resize (window, max_width, max_height);
1223 else if (rect.right > max_width)
1224 gdk_window_resize (window, max_width, rect.bottom);
1225 else if (rect.bottom > max_height)
1226 gdk_window_resize (window, rect.right, max_height);
1232 gdk_window_set_geometry_hints (GdkWindow *window,
1233 GdkGeometry *geometry,
1234 GdkWindowHints geom_mask)
1236 WINDOWPLACEMENT size_hints;
1242 g_return_if_fail (window != NULL);
1243 g_return_if_fail (GDK_IS_WINDOW (window));
1245 if (GDK_DRAWABLE_DESTROYED (window))
1248 size_hints.length = sizeof (size_hints);
1250 GDK_WINDOW_WIN32DATA (window)->hint_flags = geom_mask;
1252 if (geom_mask & GDK_HINT_POS)
1255 if (geom_mask & GDK_HINT_MIN_SIZE)
1259 rect.right = geometry->min_width;
1260 rect.bottom = geometry->min_height;
1261 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1262 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1263 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1264 GDK_WINDOW_WIN32DATA (window)->hint_min_width = rect.right - rect.left;
1265 GDK_WINDOW_WIN32DATA (window)->hint_min_height = rect.bottom - rect.top;
1267 /* Also check if he current size of the window is in bounds */
1268 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1269 if (rect.right < geometry->min_width
1270 && rect.bottom < geometry->min_height)
1271 gdk_window_resize (window, geometry->min_width, geometry->min_height);
1272 else if (rect.right < geometry->min_width)
1273 gdk_window_resize (window, geometry->min_width, rect.bottom);
1274 else if (rect.bottom < geometry->min_height)
1275 gdk_window_resize (window, rect.right, geometry->min_height);
1278 if (geom_mask & GDK_HINT_MAX_SIZE)
1282 rect.right = geometry->max_width;
1283 rect.bottom = geometry->max_height;
1284 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1285 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1286 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1287 GDK_WINDOW_WIN32DATA (window)->hint_max_width = rect.right - rect.left;
1288 GDK_WINDOW_WIN32DATA (window)->hint_max_height = rect.bottom - rect.top;
1290 /* Again, check if the window is too large currently. */
1291 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1292 if (rect.right > geometry->max_width
1293 && rect.bottom > geometry->max_height)
1294 gdk_window_resize (window, geometry->max_width, geometry->max_height);
1295 else if (rect.right > geometry->max_width)
1296 gdk_window_resize (window, geometry->max_width, rect.bottom);
1297 else if (rect.bottom > geometry->max_height)
1298 gdk_window_resize (window, rect.right, geometry->max_height);
1301 /* I don't know what to do when called with zero base_width and height. */
1302 if (geom_mask & GDK_HINT_BASE_SIZE
1303 && geometry->base_width > 0
1304 && geometry->base_height > 0)
1305 if (!GetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
1306 WIN32_API_FAILED ("GetWindowPlacement");
1309 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1310 " rcNormalPosition: (%d,%d)--(%d,%d)\n",
1311 size_hints.rcNormalPosition.left,
1312 size_hints.rcNormalPosition.top,
1313 size_hints.rcNormalPosition.right,
1314 size_hints.rcNormalPosition.bottom));
1315 size_hints.rcNormalPosition.right =
1316 size_hints.rcNormalPosition.left + geometry->base_width;
1317 size_hints.rcNormalPosition.bottom =
1318 size_hints.rcNormalPosition.top + geometry->base_height;
1319 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%d,%d)--(%d,%d)\n",
1320 size_hints.rcNormalPosition.left,
1321 size_hints.rcNormalPosition.top,
1322 size_hints.rcNormalPosition.right,
1323 size_hints.rcNormalPosition.bottom));
1324 if (!SetWindowPlacement (GDK_DRAWABLE_XID (window), &size_hints))
1325 WIN32_API_FAILED ("SetWindowPlacement");
1328 if (geom_mask & GDK_HINT_RESIZE_INC)
1333 if (geom_mask & GDK_HINT_ASPECT)
1340 gdk_window_set_title (GdkWindow *window,
1348 g_return_if_fail (window != NULL);
1349 g_return_if_fail (GDK_IS_WINDOW (window));
1350 g_return_if_fail (title != NULL);
1351 g_return_if_fail (strlen (title) > 0);
1353 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
1354 GDK_DRAWABLE_XID (window), title));
1355 if (!GDK_DRAWABLE_DESTROYED (window))
1357 /* As the title is in UTF-8 we must translate it
1358 * to the system codepage.
1360 titlelen = strlen (title);
1361 wcstr = g_new (wchar_t, titlelen + 1);
1362 mbstr = g_new (char, 3*titlelen + 1);
1363 wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
1365 WideCharToMultiByte (GetACP (), 0, wcstr, -1,
1366 mbstr, 3*titlelen, NULL, NULL);
1368 if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
1369 WIN32_API_FAILED ("SetWindowText");
1377 gdk_window_set_role (GdkWindow *window,
1380 g_return_if_fail (window != NULL);
1381 g_return_if_fail (GDK_IS_WINDOW (window));
1383 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
1384 GDK_DRAWABLE_XID (window), (role ? role : "NULL")));
1389 gdk_window_set_transient_for (GdkWindow *window,
1392 g_return_if_fail (window != NULL);
1393 g_return_if_fail (GDK_IS_WINDOW (window));
1395 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
1396 GDK_DRAWABLE_XID (window),
1397 GDK_DRAWABLE_XID (parent)));
1402 gdk_window_set_background (GdkWindow *window,
1405 g_return_if_fail (window != NULL);
1406 g_return_if_fail (GDK_IS_WINDOW (window));
1408 if (!GDK_DRAWABLE_DESTROYED (window))
1410 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
1411 GDK_DRAWABLE_XID (window),
1412 gdk_color_to_string (color)));
1414 if (GDK_WINDOW_WIN32DATA (window)->bg_type == GDK_WIN32_BG_PIXMAP)
1416 if (GDK_WINDOW_WIN32DATA (window)->bg_pixmap != NULL)
1418 gdk_drawable_unref (GDK_WINDOW_WIN32DATA (window)->bg_pixmap);
1419 GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
1421 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
1423 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_PIXEL;
1424 GDK_WINDOW_WIN32DATA (window)->bg_pixel = color->pixel;
1429 gdk_window_set_back_pixmap (GdkWindow *window,
1431 gint parent_relative)
1433 g_return_if_fail (window != NULL);
1434 g_return_if_fail (GDK_IS_WINDOW (window));
1436 if (!GDK_DRAWABLE_DESTROYED (window))
1438 if (GDK_WINDOW_WIN32DATA (window)->bg_type == GDK_WIN32_BG_PIXMAP)
1440 if (GDK_WINDOW_WIN32DATA (window)->bg_pixmap != NULL)
1442 gdk_drawable_unref (GDK_WINDOW_WIN32DATA (window)->bg_pixmap);
1443 GDK_WINDOW_WIN32DATA (window)->bg_pixmap = NULL;
1445 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_NORMAL;
1447 if (parent_relative)
1449 GDK_WINDOW_WIN32DATA (window)->bg_type =
1450 GDK_WIN32_BG_PARENT_RELATIVE;
1458 /* We must cache the pixmap in the GdkWindowWin32Data and
1459 * paint it each time we get WM_ERASEBKGND
1461 GDK_WINDOW_WIN32DATA (window)->bg_type = GDK_WIN32_BG_PIXMAP;
1462 GDK_WINDOW_WIN32DATA (window)->bg_pixmap = pixmap;
1463 gdk_drawable_ref (pixmap);
1469 gdk_window_set_cursor (GdkWindow *window,
1472 GdkCursorPrivate *cursor_private;
1476 g_return_if_fail (window != NULL);
1477 g_return_if_fail (GDK_IS_WINDOW (window));
1479 cursor_private = (GdkCursorPrivate*) cursor;
1481 if (!GDK_DRAWABLE_DESTROYED (window))
1484 xcursor = LoadCursor (NULL, IDC_ARROW);
1486 xcursor = cursor_private->xcursor;
1488 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
1489 GDK_DRAWABLE_XID (window), xcursor));
1490 GDK_WINDOW_WIN32DATA (window)->xcursor = xcursor;
1493 if (ChildWindowFromPoint (GDK_DRAWABLE_XID (window), pt) == GDK_DRAWABLE_XID (window))
1494 SetCursor (xcursor);
1499 gdk_window_get_geometry (GdkWindow *window,
1506 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1509 window = gdk_parent_root;
1511 if (!GDK_DRAWABLE_DESTROYED (window))
1515 if (!GetClientRect (GDK_DRAWABLE_XID (window), &rect))
1516 WIN32_API_FAILED ("GetClientRect");
1523 *width = rect.right - rect.left;
1525 *height = rect.bottom - rect.top;
1527 *depth = gdk_drawable_get_visual (window)->depth;
1532 gdk_window_get_origin (GdkWindow *window,
1540 g_return_val_if_fail (window != NULL, 0);
1542 if (!GDK_DRAWABLE_DESTROYED (window))
1548 ClientToScreen (GDK_DRAWABLE_XID (window), &pt);
1561 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
1562 GDK_DRAWABLE_XID (window), tx, ty));
1567 gdk_window_get_deskrelative_origin (GdkWindow *window,
1571 return gdk_window_get_origin (window, x, y);
1575 gdk_window_get_root_origin (GdkWindow *window,
1579 GdkWindowPrivate *rover;
1582 g_return_if_fail (window != NULL);
1583 g_return_if_fail (GDK_IS_WINDOW (window));
1585 rover = (GdkWindowPrivate*) window;
1590 if (GDK_DRAWABLE_DESTROYED (window))
1593 while (rover->parent && ((GdkWindowPrivate*) rover->parent)->parent)
1594 rover = (GdkWindowPrivate *) rover->parent;
1595 if (rover->drawable.destroyed)
1600 ClientToScreen (GDK_DRAWABLE_XID (rover), &pt);
1606 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%d+%d\n",
1607 GDK_DRAWABLE_XID (window),
1608 GDK_DRAWABLE_XID (rover), pt.x, pt.y));
1612 gdk_window_get_pointer (GdkWindow *window,
1615 GdkModifierType *mask)
1617 GdkWindow *return_val;
1618 POINT pointc, point;
1621 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1624 window = gdk_parent_root;
1627 GetCursorPos (&pointc);
1629 ScreenToClient (GDK_DRAWABLE_XID (window), &point);
1636 hwnd = WindowFromPoint (point);
1638 ScreenToClient (hwnd, &point);
1641 hwndc = ChildWindowFromPoint (hwnd, point);
1642 ClientToScreen (hwnd, &point);
1643 ScreenToClient (hwndc, &point);
1644 } while (hwndc != hwnd && (hwnd = hwndc, 1)); /* Ouch! */
1646 return_val = gdk_window_lookup (hwnd);
1652 GetKeyboardState (kbd);
1654 if (kbd[VK_SHIFT] & 0x80)
1655 *mask |= GDK_SHIFT_MASK;
1656 if (kbd[VK_CAPITAL] & 0x80)
1657 *mask |= GDK_LOCK_MASK;
1658 if (kbd[VK_CONTROL] & 0x80)
1659 *mask |= GDK_CONTROL_MASK;
1660 if (kbd[VK_MENU] & 0x80)
1661 *mask |= GDK_MOD1_MASK;
1662 if (kbd[VK_LBUTTON] & 0x80)
1663 *mask |= GDK_BUTTON1_MASK;
1664 if (kbd[VK_MBUTTON] & 0x80)
1665 *mask |= GDK_BUTTON2_MASK;
1666 if (kbd[VK_RBUTTON] & 0x80)
1667 *mask |= GDK_BUTTON3_MASK;
1674 gdk_window_at_pointer (gint *win_x,
1678 POINT point, pointc;
1682 GetCursorPos (&pointc);
1684 hwnd = WindowFromPoint (point);
1688 window = gdk_parent_root;
1696 ScreenToClient (hwnd, &point);
1699 hwndc = ChildWindowFromPoint (hwnd, point);
1700 ClientToScreen (hwnd, &point);
1701 ScreenToClient (hwndc, &point);
1702 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1704 window = gdk_window_lookup (hwnd);
1706 if (window && (win_x || win_y))
1708 GetClientRect (hwnd, &rect);
1710 *win_x = point.x - rect.left;
1712 *win_y = point.y - rect.top;
1715 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%d+%d %#x%s\n",
1716 point.x, point.y, hwnd,
1717 (window == NULL ? " NULL" : "")));
1723 gdk_window_get_children (GdkWindow *window)
1725 GdkWindowPrivate *private;
1728 g_return_val_if_fail (window != NULL, NULL);
1729 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1731 if (GDK_DRAWABLE_DESTROYED (window))
1735 g_warning ("gdk_window_get_children not implemented");
1742 gdk_window_get_events (GdkWindow *window)
1744 g_return_val_if_fail (window != NULL, 0);
1745 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1747 if (GDK_DRAWABLE_DESTROYED (window))
1750 return GDK_WINDOW_WIN32DATA (window)->event_mask;
1754 gdk_window_set_events (GdkWindow *window,
1755 GdkEventMask event_mask)
1757 g_return_if_fail (window != NULL);
1758 g_return_if_fail (GDK_IS_WINDOW (window));
1760 if (GDK_DRAWABLE_DESTROYED (window))
1763 GDK_WINDOW_WIN32DATA (window)->event_mask = event_mask;
1767 gdk_window_add_colormap_windows (GdkWindow *window)
1769 g_warning ("gdk_window_add_colormap_windows not implemented");
1773 gdk_window_shape_combine_mask (GdkWindow *window,
1777 g_return_if_fail (window != NULL);
1778 g_return_if_fail (GDK_IS_WINDOW (window));
1782 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
1783 GDK_DRAWABLE_XID (window)));
1784 SetWindowRgn (GDK_DRAWABLE_XID (window), NULL, TRUE);
1793 /* Convert mask bitmap to region */
1794 hrgn = BitmapToRegion (GDK_DRAWABLE_XID (mask));
1796 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
1797 GDK_DRAWABLE_XID (window),
1798 GDK_DRAWABLE_XID (mask)));
1800 /* SetWindowRgn wants window (not client) coordinates */
1801 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1802 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1803 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1804 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1805 OffsetRgn (hrgn, -rect.left, -rect.top);
1807 OffsetRgn (hrgn, x, y);
1809 /* If this is a top-level window, add the title bar to the region */
1810 if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1812 CombineRgn (hrgn, hrgn,
1813 CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
1817 SetWindowRgn (GDK_DRAWABLE_XID (window), hrgn, TRUE);
1822 gdk_window_set_override_redirect (GdkWindow *window,
1823 gboolean override_redirect)
1825 g_return_if_fail (window != NULL);
1826 g_return_if_fail (GDK_IS_WINDOW (window));
1828 g_warning ("gdk_window_set_override_redirect not implemented");
1832 gdk_window_set_icon (GdkWindow *window,
1833 GdkWindow *icon_window,
1837 g_return_if_fail (window != NULL);
1838 g_return_if_fail (GDK_IS_WINDOW (window));
1840 if (GDK_DRAWABLE_DESTROYED (window))
1843 /* Nothing to do, really. As we share window classes between windows
1844 * we can't have window-specific icons, sorry. Don't print any warning
1850 gdk_window_set_icon_name (GdkWindow *window,
1853 g_return_if_fail (window != NULL);
1854 g_return_if_fail (GDK_IS_WINDOW (window));
1856 if (GDK_DRAWABLE_DESTROYED (window))
1859 if (!SetWindowText (GDK_DRAWABLE_XID (window), name))
1860 WIN32_API_FAILED ("SetWindowText");
1864 gdk_window_set_group (GdkWindow *window,
1867 g_return_if_fail (window != NULL);
1868 g_return_if_fail (GDK_IS_WINDOW (window));
1869 g_return_if_fail (leader != NULL);
1870 g_return_if_fail (GDK_IS_WINDOW (leader));
1872 if (GDK_DRAWABLE_DESTROYED (window) || GDK_DRAWABLE_DESTROYED (leader))
1875 g_warning ("gdk_window_set_group not implemented");
1879 gdk_window_set_decorations (GdkWindow *window,
1880 GdkWMDecoration decorations)
1882 LONG style, exstyle;
1884 g_return_if_fail (window != NULL);
1885 g_return_if_fail (GDK_IS_WINDOW (window));
1887 style = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1888 exstyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1890 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1891 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
1893 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1895 if (decorations & GDK_DECOR_ALL)
1896 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1897 if (decorations & GDK_DECOR_BORDER)
1898 style |= (WS_BORDER);
1899 if (decorations & GDK_DECOR_RESIZEH)
1900 style |= (WS_THICKFRAME);
1901 if (decorations & GDK_DECOR_TITLE)
1902 style |= (WS_CAPTION);
1903 if (decorations & GDK_DECOR_MENU)
1904 style |= (WS_SYSMENU);
1905 if (decorations & GDK_DECOR_MINIMIZE)
1906 style |= (WS_MINIMIZEBOX);
1907 if (decorations & GDK_DECOR_MAXIMIZE)
1908 style |= (WS_MAXIMIZEBOX);
1910 SetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE, style);
1914 gdk_window_set_functions (GdkWindow *window,
1915 GdkWMFunction functions)
1917 LONG style, exstyle;
1919 g_return_if_fail (window != NULL);
1920 g_return_if_fail (GDK_IS_WINDOW (window));
1922 style = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1923 exstyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1925 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
1926 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
1929 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
1931 if (functions & GDK_FUNC_ALL)
1932 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
1933 if (functions & GDK_FUNC_RESIZE)
1934 style |= (WS_THICKFRAME);
1935 if (functions & GDK_FUNC_MOVE)
1936 style |= (WS_THICKFRAME);
1937 if (functions & GDK_FUNC_MINIMIZE)
1938 style |= (WS_MINIMIZEBOX);
1939 if (functions & GDK_FUNC_MAXIMIZE)
1940 style |= (WS_MAXIMIZEBOX);
1942 SetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE, style);
1946 * propagate the shapes from all child windows of a GDK window to the parent
1947 * window. Shamelessly ripped from Enlightenment's code
1953 QueryTree (HWND hwnd,
1963 child = GetWindow (hwnd, GW_CHILD);
1965 child = GetWindow (child, GW_HWNDNEXT);
1968 } while (child != NULL);
1972 *children = g_new (HWND, n);
1973 for (i = 0; i < n; i++)
1976 child = GetWindow (hwnd, GW_CHILD);
1978 child = GetWindow (child, GW_HWNDNEXT);
1979 *children[i] = child;
1985 gdk_propagate_shapes (HANDLE win,
1989 HRGN region, childRegion;
1994 SetRectEmpty (&emptyRect);
1995 region = CreateRectRgnIndirect (&emptyRect);
1997 GetWindowRgn (win, region);
1999 QueryTree (win, &list, &num);
2002 WINDOWPLACEMENT placement;
2004 placement.length = sizeof (WINDOWPLACEMENT);
2005 /* go through all child windows and combine regions */
2006 for (i = 0; i < num; i++)
2008 GetWindowPlacement (list[i], &placement);
2009 if (placement.showCmd == SW_SHOWNORMAL)
2011 childRegion = CreateRectRgnIndirect (&emptyRect);
2012 GetWindowRgn (list[i], childRegion);
2013 CombineRgn (region, region, childRegion, RGN_OR);
2014 DeleteObject (childRegion);
2017 SetWindowRgn (win, region, TRUE);
2020 DeleteObject (region);
2024 gdk_window_set_child_shapes (GdkWindow *window)
2026 g_return_if_fail (window != NULL);
2027 g_return_if_fail (GDK_IS_WINDOW (window));
2029 if (GDK_DRAWABLE_DESTROYED (window))
2032 gdk_propagate_shapes (GDK_DRAWABLE_XID (window), FALSE);
2036 gdk_window_merge_child_shapes (GdkWindow *window)
2038 g_return_if_fail (window != NULL);
2039 g_return_if_fail (GDK_IS_WINDOW (window));
2041 if (GDK_DRAWABLE_DESTROYED (window))
2044 gdk_propagate_shapes (GDK_DRAWABLE_XID (window), TRUE);
2047 /* Support for windows that can be guffaw-scrolled
2048 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2052 gdk_window_gravity_works (void)
2054 enum { UNKNOWN, NO, YES };
2055 static gint gravity_works = UNKNOWN;
2057 if (gravity_works == UNKNOWN)
2064 attr.window_type = GDK_WINDOW_TEMP;
2065 attr.wclass = GDK_INPUT_OUTPUT;
2070 attr.event_mask = 0;
2072 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2074 attr.window_type = GDK_WINDOW_CHILD;
2075 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2077 gdk_window_set_static_win_gravity (child, TRUE);
2079 gdk_window_resize (parent, 100, 110);
2080 gdk_window_move (parent, 0, -10);
2081 gdk_window_move_resize (parent, 0, 0, 100, 100);
2083 gdk_window_resize (parent, 100, 110);
2084 gdk_window_move (parent, 0, -10);
2085 gdk_window_move_resize (parent, 0, 0, 100, 100);
2087 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2089 gdk_window_destroy (parent);
2090 gdk_window_destroy (child);
2092 gravity_works = ((y == -20) ? YES : NO);
2095 return (gravity_works == YES);
2099 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2101 g_return_if_fail (window != NULL);
2103 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2107 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2109 g_return_if_fail (window != NULL);
2112 g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2115 /*************************************************************
2116 * gdk_window_set_static_gravities:
2117 * Set the bit gravity of the given window to static,
2118 * and flag it so all children get static subwindow
2121 * window: window for which to set static gravity
2122 * use_static: Whether to turn static gravity on or off.
2124 * Does the XServer support static gravity?
2125 *************************************************************/
2128 gdk_window_set_static_gravities (GdkWindow *window,
2129 gboolean use_static)
2131 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
2134 g_return_val_if_fail (window != NULL, FALSE);
2135 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2137 if (!use_static == !private->guffaw_gravity)
2140 if (use_static && !gdk_window_gravity_works ())
2143 private->guffaw_gravity = use_static;
2145 if (!GDK_DRAWABLE_DESTROYED (window))
2147 gdk_window_set_static_bit_gravity (window, use_static);
2149 tmp_list = private->children;
2152 gdk_window_set_static_win_gravity (window, use_static);
2154 tmp_list = tmp_list->next;