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 "gdkprivate.h"
37 #include "gdkinputprivate.h"
40 /* The Win API function AdjustWindowRect may return negative values
41 * resulting in obscured title bars. This helper function is coreccting it.
44 SafeAdjustWindowRectEx (RECT* lpRect,
49 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
53 lpRect->right -= lpRect->left;
58 lpRect->bottom -= lpRect->top;
64 /* Forward declarations */
65 static gboolean gdk_window_gravity_works (void);
66 static void gdk_window_set_static_win_gravity (GdkWindow *window,
70 * The following fucntion by The Rasterman <raster@redhat.com>
71 * This function returns the X Window ID in which the x y location is in
72 * (x and y being relative to the root window), excluding any windows listed
73 * in the GList excludes (this is a list of X Window ID's - gpointer being
76 * This is primarily designed for internal gdk use - for DND for example
77 * when using a shaped icon window as the drag object - you exclude the
78 * X Window ID of the "icon" (perhaps more if excludes may be needed) and
79 * You can get back an X Window ID as to what X Window ID is infact under
80 * those X,Y co-ordinates.
83 gdk_window_xid_at_coords (gint x,
89 gboolean warned = FALSE;
93 /* This is probably not correct, just a quick hack */
97 g_warning ("gdk_window_xid_at_coords probably not implemented correctly");
102 return WindowFromPoint (pt);
106 gdk_window_init (void)
112 SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0);
113 width = r.right - r.left;
114 height = r.bottom - r.top;
116 gdk_root_parent = g_new (GdkWindowPrivate, 1);
117 gdk_root_parent->drawable.xwindow = gdk_root_window;
118 gdk_root_parent->drawable.window_type = GDK_WINDOW_ROOT;
119 gdk_root_parent->drawable.drawable.user_data = NULL;
120 gdk_root_parent->drawable.width = width;
121 gdk_root_parent->drawable.height = height;
122 gdk_root_parent->drawable.ref_count = 1;
123 gdk_root_parent->drawable.colormap = NULL;
124 gdk_root_parent->children = NULL;
126 gdk_xid_table_insert (&gdk_root_window, gdk_root_parent);
130 * is a wrapper function for RegisterWindowClassEx.
131 * It creates at least one unique class for every
132 * GdkWindowType. If support for single window-specific icons
133 * is ever needed (e.g Dialog specific), every such window should
137 RegisterGdkClass(GdkWindowType wtype)
139 static ATOM klassTOPLEVEL = 0;
140 static ATOM klassDIALOG = 0;
141 static ATOM klassCHILD = 0;
142 static ATOM klassTEMP = 0;
143 static HICON hAppIcon = NULL;
144 static WNDCLASSEX wcl;
147 wcl.cbSize = sizeof(WNDCLASSEX);
148 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
149 * on WM_SIZE and WM_MOVE. Flicker, Performance!
151 wcl.lpfnWndProc = gdk_WindowProc;
154 wcl.hInstance = gdk_ProgInstance;
156 /* initialize once! */
159 gchar sLoc [_MAX_PATH+1];
160 HINSTANCE hInst = GetModuleHandle(NULL);
162 if (0 != GetModuleFileName(hInst, sLoc, _MAX_PATH))
164 hAppIcon = ExtractIcon(hInst, sLoc, 0);
167 char *gdklibname = g_strdup_printf ("gdk-%s.dll", GDK_VERSION);
169 hAppIcon = ExtractIcon(hInst, gdklibname, 0);
174 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
178 wcl.lpszMenuName = NULL;
181 /* initialize once per class */
182 #define ONCE_PER_CLASS() \
183 wcl.hIcon = CopyIcon (hAppIcon); \
184 wcl.hIconSm = CopyIcon (hAppIcon); \
185 wcl.hbrBackground = CreateSolidBrush( RGB(0,0,0)); \
186 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
190 case GDK_WINDOW_TOPLEVEL:
191 if (0 == klassTOPLEVEL)
193 wcl.lpszClassName = "gdkWindowToplevel";
196 klassTOPLEVEL = RegisterClassEx(&wcl);
198 klass = klassTOPLEVEL;
200 case GDK_WINDOW_CHILD:
203 wcl.lpszClassName = "gdkWindowChild";
205 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
207 klassCHILD = RegisterClassEx(&wcl);
211 case GDK_WINDOW_DIALOG:
212 if (0 == klassDIALOG)
214 wcl.lpszClassName = "gdkWindowDialog";
215 wcl.style |= CS_SAVEBITS;
217 klassDIALOG = RegisterClassEx(&wcl);
221 case GDK_WINDOW_TEMP:
224 wcl.lpszClassName = "gdkWindowTemp";
225 wcl.style |= CS_SAVEBITS;
227 klassTEMP = RegisterClassEx(&wcl);
231 case GDK_WINDOW_ROOT:
232 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
234 case GDK_DRAWABLE_PIXMAP:
235 g_error ("cannot make windows of type GDK_DRAWABLE_PIXMAP (use gdk_pixmap_new)");
240 } /* RegisterGdkClass */
244 gdk_window_new (GdkWindow *parent,
245 GdkWindowAttr *attributes,
246 gint attributes_mask)
249 GdkWindowPrivate *private;
250 GdkWindowPrivate *parent_private;
255 DWORD dwStyle, dwExStyle;
266 g_return_val_if_fail (attributes != NULL, NULL);
269 parent = (GdkWindow*) gdk_root_parent;
271 parent_private = (GdkWindowPrivate*) parent;
272 if (GDK_DRAWABLE_DESTROYED (parent))
275 xparent = parent_private->drawable.xwindow;
277 private = g_new (GdkWindowPrivate, 1);
278 window = (GdkWindow*) private;
280 private->parent = parent;
282 private->drawable.destroyed = FALSE;
283 private->mapped = FALSE;
284 private->guffaw_gravity = FALSE;
285 private->resize_count = 0;
286 private->drawable.ref_count = 1;
288 private->x = (attributes_mask & GDK_WA_X) ? attributes->x : 0;
289 private->y = (attributes_mask & GDK_WA_Y) ? attributes->y : 0;
291 private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1);
292 private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1);
293 private->drawable.window_type = attributes->window_type;
294 private->extension_events = 0;
295 private->extension_events_selected = FALSE;
297 private->filters = NULL;
298 private->children = NULL;
300 window->user_data = NULL;
302 if (attributes_mask & GDK_WA_VISUAL)
303 visual = attributes->visual;
305 visual = gdk_visual_get_system ();
306 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
308 if (attributes_mask & GDK_WA_TITLE)
309 title = attributes->title;
311 title = g_get_prgname ();
313 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
314 private->bg_type = GDK_WIN32_BG_NORMAL;
315 private->hint_flags = 0;
316 private->xcursor = NULL;
318 if (parent_private && parent_private->guffaw_gravity)
323 if (attributes->wclass == GDK_INPUT_OUTPUT)
326 if (attributes_mask & GDK_WA_COLORMAP)
327 private->drawable.colormap = attributes->colormap;
329 private->drawable.colormap = gdk_colormap_get_system ();
333 dwExStyle = WS_EX_TRANSPARENT;
334 private->drawable.colormap = NULL;
335 private->bg_type = GDK_WIN32_BG_TRANSPARENT;
336 private->bg_pixmap = NULL;
339 if (attributes_mask & GDK_WA_X)
344 if (attributes_mask & GDK_WA_Y)
346 else if (attributes_mask & GDK_WA_X)
347 y = 100; /* ??? We must put it somewhere... */
349 y = 500; /* x is CW_USEDEFAULT, y doesn't matter then */
352 parent_private->children = g_list_prepend (parent_private->children, window);
354 switch (private->drawable.window_type)
356 case GDK_WINDOW_TOPLEVEL:
357 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
358 xparent = gdk_root_window;
360 case GDK_WINDOW_CHILD:
361 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
363 case GDK_WINDOW_DIALOG:
364 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
365 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
366 xparent = gdk_root_window;
368 case GDK_WINDOW_TEMP:
369 dwStyle = WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
370 dwExStyle |= WS_EX_TOOLWINDOW;
372 case GDK_WINDOW_ROOT:
373 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
375 case GDK_DRAWABLE_PIXMAP:
376 g_error ("cannot make windows of type GDK_DRAWABLE_PIXMAP (use gdk_pixmap_new)");
380 klass = RegisterGdkClass (private->drawable.window_type);
382 g_error ("RegisterClassEx failed");
384 if (private->drawable.window_type != GDK_WINDOW_CHILD)
386 if (x == CW_USEDEFAULT)
397 rect.right = rect.left + private->drawable.width;
398 rect.bottom = rect.top + private->drawable.height;
400 if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
401 g_warning ("gdk_window_new: AdjustWindowRectEx failed");
403 if (x != CW_USEDEFAULT)
408 width = rect.right - rect.left;
409 height = rect.bottom - rect.top;
413 width = private->drawable.width;
414 height = private->drawable.height;
418 private->input_locale = GetKeyboardLayout (0);
419 TranslateCharsetInfo ((DWORD FAR *) acp,
420 &private->charset_info,
423 titlelen = strlen (title);
424 wctitle = g_new (wchar_t, titlelen + 1);
425 mbtitle = g_new (char, 3*titlelen + 1);
426 wlen = gdk_nmbstowchar_ts (wctitle, title, titlelen, titlelen);
428 WideCharToMultiByte (GetACP (), 0, wctitle, -1,
429 mbtitle, 3*titlelen, NULL, NULL);
431 private->drawable.xwindow =
432 CreateWindowEx (dwExStyle,
433 MAKEINTRESOURCE(klass),
444 g_print ("gdk_window_create: %s %s %dx%d@+%d+%d %#x = %#x\n"
445 "...locale %#x codepage %d\n",
446 (private->drawable.window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
447 (private->drawable.window_type == GDK_WINDOW_CHILD ? "CHILD" :
448 (private->drawable.window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
449 (private->drawable.window_type == GDK_WINDOW_TEMP ? "TEMP" :
452 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
454 private->drawable.xwindow,
455 private->input_locale,
456 private->charset_info.ciACP));
461 if (private->drawable.xwindow == NULL)
463 g_warning ("gdk_window_create: CreateWindowEx failed");
468 gdk_window_ref (window);
469 gdk_xid_table_insert (&private->drawable.xwindow, window);
471 if (private->drawable.colormap)
472 gdk_colormap_ref (private->drawable.colormap);
474 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
475 (attributes->cursor) :
482 gdk_window_foreign_new (guint32 anid)
485 GdkWindowPrivate *private;
486 GdkWindowPrivate *parent_private;
491 private = g_new (GdkWindowPrivate, 1);
492 window = (GdkWindow*) private;
494 parent = GetParent ((HWND) anid);
495 private->parent = gdk_xid_table_lookup (parent);
497 parent_private = (GdkWindowPrivate *)private->parent;
500 parent_private->children = g_list_prepend (parent_private->children, window);
502 private->drawable.xwindow = (HWND) anid;
503 GetClientRect ((HWND) anid, &rect);
505 point.y = rect.right;
506 ClientToScreen ((HWND) anid, &point);
507 if (parent != GetDesktopWindow ())
508 ScreenToClient (parent, &point);
509 private->x = point.x;
510 private->y = point.y;
511 private->drawable.width = rect.right - rect.left;
512 private->drawable.height = rect.bottom - rect.top;
513 private->resize_count = 0;
514 private->drawable.ref_count = 1;
515 private->drawable.window_type = GDK_WINDOW_FOREIGN;
516 private->drawable.destroyed = FALSE;
517 private->mapped = IsWindowVisible (private->drawable.xwindow);
518 private->guffaw_gravity = FALSE;
519 private->extension_events = 0;
520 private->extension_events_selected = FALSE;
522 private->drawable.colormap = NULL;
524 private->filters = NULL;
525 private->children = NULL;
527 window->user_data = NULL;
529 gdk_window_ref (window);
530 gdk_xid_table_insert (&private->drawable.xwindow, window);
535 /* Call this function when you want a window and all its children to
536 * disappear. When xdestroy is true, a request to destroy the XWindow
537 * is sent out. When it is false, it is assumed that the XWindow has
538 * been or will be destroyed by destroying some ancestor of this
542 gdk_window_internal_destroy (GdkWindow *window,
544 gboolean our_destroy)
546 GdkWindowPrivate *private;
547 GdkWindowPrivate *temp_private;
548 GdkWindow *temp_window;
552 g_return_if_fail (window != NULL);
554 private = (GdkWindowPrivate*) window;
556 GDK_NOTE (MISC, g_print ("gdk_window_internal_destroy %#x\n",
557 private->drawable.xwindow));
559 switch (private->drawable.window_type)
561 case GDK_WINDOW_TOPLEVEL:
562 case GDK_WINDOW_CHILD:
563 case GDK_WINDOW_DIALOG:
564 case GDK_WINDOW_TEMP:
565 case GDK_WINDOW_FOREIGN:
566 if (!private->drawable.destroyed)
570 GdkWindowPrivate *parent_private = (GdkWindowPrivate *)private->parent;
571 if (parent_private->children)
572 parent_private->children = g_list_remove (parent_private->children, window);
575 if (GDK_DRAWABLE_TYPE (window) != GDK_WINDOW_FOREIGN)
577 children = tmp = private->children;
578 private->children = NULL;
582 temp_window = tmp->data;
585 temp_private = (GdkWindowPrivate*) temp_window;
587 gdk_window_internal_destroy (temp_window, FALSE,
591 g_list_free (children);
594 if (private->extension_events != 0)
595 gdk_input_window_destroy (window);
597 if (private->filters)
599 tmp = private->filters;
607 g_list_free (private->filters);
608 private->filters = NULL;
611 if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
613 if (our_destroy && (private->parent != NULL))
615 /* It's somebody elses window, but in our hierarchy,
616 * so reparent it to the root window, and then send
617 * it a delete event, as if we were a WM
619 gdk_window_hide (window);
620 gdk_window_reparent (window, NULL, 0, 0);
622 /* Is this too drastic? Many (most?) applications
623 * quit if any window receives WM_QUIT I think.
624 * OTOH, I don't think foreign windows are much
625 * used, so the question is maybe academic.
627 PostMessage (private->drawable.xwindow, WM_QUIT, 0, 0);
631 DestroyWindow (private->drawable.xwindow);
633 if (private->drawable.colormap)
634 gdk_colormap_unref (private->drawable.colormap);
636 private->mapped = FALSE;
637 private->drawable.destroyed = TRUE;
641 case GDK_WINDOW_ROOT:
642 g_error ("attempted to destroy root window");
645 case GDK_DRAWABLE_PIXMAP:
646 g_error ("called gdk_window_destroy on a pixmap (use gdk_pixmap_unref)");
651 /* Like internal_destroy, but also destroys the reference created by
655 gdk_window_destroy (GdkWindow *window)
657 gdk_window_internal_destroy (window, TRUE, TRUE);
658 gdk_window_unref (window);
661 /* This function is called when the XWindow is really gone. */
664 gdk_window_destroy_notify (GdkWindow *window)
666 g_return_if_fail (window != NULL);
668 GDK_NOTE (EVENTS, g_print ("gdk_window_destroy_notify: %#x %d\n",
669 GDK_DRAWABLE_XID (window), GDK_DRAWABLE_DESTROYED (window)));
671 if (!GDK_DRAWABLE_DESTROYED (window))
673 if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_FOREIGN)
674 g_warning ("GdkWindow %#lx unexpectedly destroyed", GDK_DRAWABLE_XID (window));
676 gdk_window_internal_destroy (window, FALSE, FALSE);
679 gdk_xid_table_remove (GDK_DRAWABLE_XID (window));
680 gdk_window_unref (window);
684 gdk_window_ref (GdkWindow *window)
686 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
687 g_return_val_if_fail (window != NULL, NULL);
689 private->drawable.ref_count += 1;
691 GDK_NOTE (MISC, g_print ("gdk_window_ref %#x %d\n",
692 GDK_DRAWABLE_XID (window),
693 private->drawable.ref_count));
699 gdk_window_unref (GdkWindow *window)
701 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
702 g_return_if_fail (window != NULL);
704 private->drawable.ref_count -= 1;
706 GDK_NOTE (MISC, g_print ("gdk_window_unref %#x %d%s\n",
707 private->drawable.xwindow,
708 private->drawable.ref_count,
709 (private->drawable.ref_count == 0 ? " freeing" : "")));
711 if (private->drawable.ref_count == 0)
713 if (private->bg_type == GDK_WIN32_BG_PIXMAP
714 && private->bg_pixmap != NULL)
715 gdk_pixmap_unref (private->bg_pixmap);
717 if (!private->drawable.destroyed)
719 if (private->drawable.window_type == GDK_WINDOW_FOREIGN)
720 gdk_xid_table_remove (private->drawable.xwindow);
722 g_warning ("losing last reference to undestroyed window");
724 g_dataset_destroy (window);
730 gdk_window_show (GdkWindow *window)
732 GdkWindowPrivate *private;
734 g_return_if_fail (window != NULL);
736 private = (GdkWindowPrivate*) window;
737 if (!private->drawable.destroyed)
739 GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
740 private->drawable.xwindow));
742 private->mapped = TRUE;
743 if (private->drawable.window_type == GDK_WINDOW_TEMP)
745 ShowWindow (private->drawable.xwindow, SW_SHOWNOACTIVATE);
746 SetWindowPos (private->drawable.xwindow, HWND_TOPMOST, 0, 0, 0, 0,
747 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
749 ShowWindow (private->drawable.xwindow, SW_HIDE); /* Don't put on toolbar */
754 ShowWindow (private->drawable.xwindow, SW_SHOWNORMAL);
755 ShowWindow (private->drawable.xwindow, SW_RESTORE);
756 SetForegroundWindow (private->drawable.xwindow);
757 BringWindowToTop (private->drawable.xwindow);
759 ShowOwnedPopups (private->drawable.xwindow, TRUE);
766 gdk_window_hide (GdkWindow *window)
768 GdkWindowPrivate *private;
770 g_return_if_fail (window != NULL);
772 private = (GdkWindowPrivate*) window;
773 if (!private->drawable.destroyed)
775 GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
776 private->drawable.xwindow));
778 private->mapped = FALSE;
779 if (private->drawable.window_type == GDK_WINDOW_TOPLEVEL)
780 ShowOwnedPopups (private->drawable.xwindow, FALSE);
782 ShowWindow (private->drawable.xwindow, SW_HIDE);
784 ShowWindow (private->drawable.xwindow, SW_MINIMIZE);
786 CloseWindow (private->drawable.xwindow);
792 gdk_window_withdraw (GdkWindow *window)
794 GdkWindowPrivate *private;
796 g_return_if_fail (window != NULL);
798 private = (GdkWindowPrivate*) window;
799 if (!private->drawable.destroyed)
801 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
802 private->drawable.xwindow));
804 gdk_window_hide (window); /* XXX */
809 gdk_window_move (GdkWindow *window,
813 GdkWindowPrivate *private;
815 g_return_if_fail (window != NULL);
817 private = (GdkWindowPrivate*) window;
818 if (!private->drawable.destroyed)
822 GDK_NOTE (MISC, g_print ("gdk_window_move: %#x +%d+%d\n",
823 private->drawable.xwindow, x, y));
825 GetClientRect (private->drawable.xwindow, &rect);
827 if (private->drawable.window_type != GDK_WINDOW_CHILD)
835 ClientToScreen (private->drawable.xwindow, &ptTL);
840 ptBR.y = rect.bottom;
841 ClientToScreen (private->drawable.xwindow, &ptBR);
842 rect.right = x + ptBR.x - ptTL.x;
843 rect.bottom = y + ptBR.y - ptTL.y;
845 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
846 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
847 if (!SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
848 g_warning ("gdk_window_move: AdjustWindowRectEx failed");
858 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
859 private->drawable.xwindow,
860 rect.right - rect.left, rect.bottom - rect.top,
862 if (!MoveWindow (private->drawable.xwindow,
863 x, y, rect.right - rect.left, rect.bottom - rect.top,
865 g_warning ("gdk_window_move: MoveWindow failed");
870 gdk_window_resize (GdkWindow *window,
874 GdkWindowPrivate *private;
876 g_return_if_fail (window != NULL);
878 if ((gint16) width < 1)
880 if ((gint16) height < 1)
883 private = (GdkWindowPrivate*) window;
885 if (!private->drawable.destroyed &&
886 ((private->resize_count > 0) ||
887 (private->drawable.width != (guint16) width) ||
888 (private->drawable.height != (guint16) height)))
892 GDK_NOTE (MISC, g_print ("gdk_window_resize: %#x %dx%d\n",
893 private->drawable.xwindow, width, height));
895 if (private->drawable.window_type != GDK_WINDOW_CHILD)
904 ClientToScreen (private->drawable.xwindow, &pt);
907 rect.right = pt.x + width;
908 rect.bottom = pt.y + height;
910 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
911 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
912 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
913 g_warning ("gdk_window_resize: AdjustWindowRectEx failed");
917 width = rect.right - rect.left;
918 height = rect.bottom - rect.top;
924 private->drawable.width = width;
925 private->drawable.height = height;
928 private->resize_count += 1;
930 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
931 private->drawable.xwindow, width, height, x, y));
932 if (!MoveWindow (private->drawable.xwindow,
935 g_warning ("gdk_window_resize: MoveWindow failed");
940 gdk_window_move_resize (GdkWindow *window,
946 GdkWindowPrivate *private;
948 g_return_if_fail (window != NULL);
950 if ((gint16) width < 1)
952 if ((gint16) height < 1)
955 private = (GdkWindowPrivate*) window;
956 if (!private->drawable.destroyed)
962 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
963 private->drawable.xwindow, width, height, x, y));
967 rect.right = x + width;
968 rect.bottom = y + height;
970 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
971 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
972 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
973 g_warning ("gdk_window_move_resize: AdjustWindowRectEx failed");
975 if (private->drawable.window_type == GDK_WINDOW_CHILD)
979 private->drawable.width = width;
980 private->drawable.height = height;
982 GDK_NOTE (MISC, g_print ("...MoveWindow(%#x,%dx%d@+%d+%d)\n",
983 private->drawable.xwindow,
984 rect.right - rect.left, rect.bottom - rect.top,
985 rect.left, rect.top));
986 if (!MoveWindow (private->drawable.xwindow,
988 rect.right - rect.left, rect.bottom - rect.top,
990 g_warning ("gdk_window_move_resize: MoveWindow failed");
992 if (private->guffaw_gravity)
994 GList *tmp_list = private->children;
997 GdkWindowPrivate *child_private = tmp_list->data;
999 child_private->x -= x - private->x;
1000 child_private->y -= y - private->y;
1002 tmp_list = tmp_list->next;
1010 gdk_window_reparent (GdkWindow *window,
1011 GdkWindow *new_parent,
1015 GdkWindowPrivate *window_private;
1016 GdkWindowPrivate *parent_private;
1017 GdkWindowPrivate *old_parent_private;
1019 g_return_if_fail (window != NULL);
1022 new_parent = (GdkWindow*) gdk_root_parent;
1024 window_private = (GdkWindowPrivate*) window;
1025 old_parent_private = (GdkWindowPrivate*)window_private->parent;
1026 parent_private = (GdkWindowPrivate*) new_parent;
1028 if (!window_private->drawable.destroyed && !parent_private->drawable.destroyed)
1030 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
1031 window_private->drawable.xwindow,
1032 parent_private->drawable.xwindow));
1033 if (!SetParent (window_private->drawable.xwindow, parent_private->drawable.xwindow))
1034 g_warning ("gdk_window_reparent: SetParent failed");
1036 if (!MoveWindow (window_private->drawable.xwindow,
1038 window_private->drawable.width, window_private->drawable.height,
1040 g_warning ("gdk_window_reparent: MoveWindow failed");
1043 window_private->parent = new_parent;
1045 if (old_parent_private)
1046 old_parent_private->children = g_list_remove (old_parent_private->children, window);
1048 if ((old_parent_private &&
1049 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1050 (!old_parent_private && parent_private->guffaw_gravity))
1051 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1053 parent_private->children = g_list_prepend (parent_private->children, window);
1057 gdk_window_clear (GdkWindow *window)
1059 g_return_if_fail (window != NULL);
1060 g_return_if_fail (GDK_IS_WINDOW (window));
1062 if (!GDK_DRAWABLE_DESTROYED (window))
1063 gdk_window_clear_area (window, 0, 0, -1, -1);
1068 gdk_window_clear_area (GdkWindow *window,
1074 g_return_if_fail (window != NULL);
1075 g_return_if_fail (GDK_IS_WINDOW (window));
1077 if (!GDK_DRAWABLE_DESTROYED (window))
1082 width = G_MAXSHORT/2; /* Yeah, right */
1084 height = G_MAXSHORT/2;
1085 GDK_NOTE (MISC, g_print ("gdk_window_clear_area: %#x %dx%d@+%d+%d\n",
1086 GDK_DRAWABLE_XID (window), width, height, x, y));
1087 hdc = GetDC (GDK_DRAWABLE_XID (window));
1088 IntersectClipRect (hdc, x, y, x + width, y + height);
1089 SendMessage (GDK_DRAWABLE_XID (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1090 ReleaseDC (GDK_DRAWABLE_XID (window), hdc);
1095 gdk_window_clear_area_e (GdkWindow *window,
1101 g_return_if_fail (window != NULL);
1102 g_return_if_fail (GDK_IS_WINDOW (window));
1104 if (!GDK_DRAWABLE_DESTROYED (window))
1108 GDK_NOTE (MISC, g_print ("gdk_window_clear_area_e: %#x %dx%d@+%d+%d\n",
1109 GDK_DRAWABLE_XID (window), width, height, x, y));
1112 rect.right = x + width;
1114 rect.bottom = y + height;
1115 if (!InvalidateRect (GDK_DRAWABLE_XID (window), &rect, TRUE))
1116 g_warning ("gdk_window_clear_area_e: InvalidateRect failed");
1117 UpdateWindow (GDK_DRAWABLE_XID (window));
1122 gdk_window_raise (GdkWindow *window)
1124 g_return_if_fail (window != NULL);
1125 g_return_if_fail (GDK_IS_WINDOW (window));
1127 if (!GDK_DRAWABLE_DESTROYED (window))
1129 GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
1130 GDK_DRAWABLE_XID (window)));
1132 if (!BringWindowToTop (GDK_DRAWABLE_XID (window)))
1133 g_warning ("gdk_window_raise: BringWindowToTop failed");
1138 gdk_window_lower (GdkWindow *window)
1140 g_return_if_fail (window != NULL);
1141 g_return_if_fail (GDK_IS_WINDOW (window));
1143 if (!GDK_DRAWABLE_DESTROYED (window))
1145 GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
1146 GDK_DRAWABLE_XID (window)));
1148 if (!SetWindowPos (GDK_DRAWABLE_XID (window), HWND_BOTTOM, 0, 0, 0, 0,
1149 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1150 g_warning ("gdk_window_lower: SetWindowPos failed");
1155 gdk_window_set_user_data (GdkWindow *window,
1158 g_return_if_fail (window != NULL);
1160 window->user_data = user_data;
1164 gdk_window_set_hints (GdkWindow *window,
1173 GdkWindowPrivate *private;
1174 WINDOWPLACEMENT size_hints;
1180 g_return_if_fail (window != NULL);
1181 g_return_if_fail (GDK_IS_WINDOW (window));
1183 if (GDK_DRAWABLE_DESTROYED (window))
1186 private = (GdkWindowPrivate*) window;
1188 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
1189 private->drawable.xwindow,
1190 min_width, min_height, max_width, max_height,
1193 private->hint_flags = flags;
1194 size_hints.length = sizeof (size_hints);
1198 if (flags & GDK_HINT_POS)
1199 if (!GetWindowPlacement (private->drawable.xwindow, &size_hints))
1200 g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
1203 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1204 " (%d,%d)--(%d,%d)\n",
1205 size_hints.rcNormalPosition.left,
1206 size_hints.rcNormalPosition.top,
1207 size_hints.rcNormalPosition.right,
1208 size_hints.rcNormalPosition.bottom));
1209 /* What are the corresponding window coordinates for client
1210 * area coordinates x, y
1214 rect.right = rect.left + 200; /* dummy */
1215 rect.bottom = rect.top + 200;
1216 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
1217 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
1218 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1219 size_hints.flags = 0;
1220 size_hints.showCmd = SW_SHOWNA;
1222 /* Set the normal position hint to that location, with unchanged
1225 diff = size_hints.rcNormalPosition.left - rect.left;
1226 size_hints.rcNormalPosition.left = rect.left;
1227 size_hints.rcNormalPosition.right -= diff;
1228 diff = size_hints.rcNormalPosition.top - rect.top;
1229 size_hints.rcNormalPosition.top = rect.top;
1230 size_hints.rcNormalPosition.bottom -= diff;
1231 GDK_NOTE (MISC, g_print ("...setting: (%d,%d)--(%d,%d)\n",
1232 size_hints.rcNormalPosition.left,
1233 size_hints.rcNormalPosition.top,
1234 size_hints.rcNormalPosition.right,
1235 size_hints.rcNormalPosition.bottom));
1236 if (!SetWindowPlacement (private->drawable.xwindow, &size_hints))
1237 g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
1238 private->hint_x = rect.left;
1239 private->hint_y = rect.top;
1242 if (flags & GDK_HINT_MIN_SIZE)
1246 rect.right = min_width;
1247 rect.bottom = min_height;
1248 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
1249 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
1250 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1251 private->hint_min_width = rect.right - rect.left;
1252 private->hint_min_height = rect.bottom - rect.top;
1254 /* Also chek if he current size of the window is in bounds. */
1255 GetClientRect (private->drawable.xwindow, &rect);
1256 if (rect.right < min_width && rect.bottom < min_height)
1257 gdk_window_resize (window, min_width, min_height);
1258 else if (rect.right < min_width)
1259 gdk_window_resize (window, min_width, rect.bottom);
1260 else if (rect.bottom < min_height)
1261 gdk_window_resize (window, rect.right, min_height);
1263 if (flags & GDK_HINT_MAX_SIZE)
1267 rect.right = max_width;
1268 rect.bottom = max_height;
1269 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
1270 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
1271 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1272 private->hint_max_width = rect.right - rect.left;
1273 private->hint_max_height = rect.bottom - rect.top;
1274 /* Again, check if the window is too large currently. */
1275 GetClientRect (private->drawable.xwindow, &rect);
1276 if (rect.right > max_width && rect.bottom > max_height)
1277 gdk_window_resize (window, max_width, max_height);
1278 else if (rect.right > max_width)
1279 gdk_window_resize (window, max_width, rect.bottom);
1280 else if (rect.bottom > max_height)
1281 gdk_window_resize (window, rect.right, max_height);
1287 gdk_window_set_geometry_hints (GdkWindow *window,
1288 GdkGeometry *geometry,
1289 GdkWindowHints geom_mask)
1291 GdkWindowPrivate *private;
1292 WINDOWPLACEMENT size_hints;
1298 g_return_if_fail (window != NULL);
1299 g_return_if_fail (GDK_IS_WINDOW (window));
1301 if (GDK_DRAWABLE_DESTROYED (window))
1304 private = (GdkWindowPrivate*) window;
1306 size_hints.length = sizeof (size_hints);
1308 private->hint_flags = geom_mask;
1310 if (geom_mask & GDK_HINT_POS)
1313 if (geom_mask & GDK_HINT_MIN_SIZE)
1317 rect.right = geometry->min_width;
1318 rect.bottom = geometry->min_height;
1319 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
1320 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
1321 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1322 private->hint_min_width = rect.right - rect.left;
1323 private->hint_min_height = rect.bottom - rect.top;
1325 /* Also check if he current size of the window is in bounds */
1326 GetClientRect (private->drawable.xwindow, &rect);
1327 if (rect.right < geometry->min_width
1328 && rect.bottom < geometry->min_height)
1329 gdk_window_resize (window, geometry->min_width, geometry->min_height);
1330 else if (rect.right < geometry->min_width)
1331 gdk_window_resize (window, geometry->min_width, rect.bottom);
1332 else if (rect.bottom < geometry->min_height)
1333 gdk_window_resize (window, rect.right, geometry->min_height);
1336 if (geom_mask & GDK_HINT_MAX_SIZE)
1340 rect.right = geometry->max_width;
1341 rect.bottom = geometry->max_height;
1342 dwStyle = GetWindowLong (private->drawable.xwindow, GWL_STYLE);
1343 dwExStyle = GetWindowLong (private->drawable.xwindow, GWL_EXSTYLE);
1344 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1345 private->hint_max_width = rect.right - rect.left;
1346 private->hint_max_height = rect.bottom - rect.top;
1348 /* Again, check if the window is too large currently. */
1349 GetClientRect (private->drawable.xwindow, &rect);
1350 if (rect.right > geometry->max_width
1351 && rect.bottom > geometry->max_height)
1352 gdk_window_resize (window, geometry->max_width, geometry->max_height);
1353 else if (rect.right > geometry->max_width)
1354 gdk_window_resize (window, geometry->max_width, rect.bottom);
1355 else if (rect.bottom > geometry->max_height)
1356 gdk_window_resize (window, rect.right, geometry->max_height);
1359 /* I don't know what to do when called with zero base_width and height. */
1360 if (geom_mask & GDK_HINT_BASE_SIZE
1361 && geometry->base_width > 0
1362 && geometry->base_height > 0)
1363 if (!GetWindowPlacement (private->drawable.xwindow, &size_hints))
1364 g_warning ("gdk_window_set_hints: GetWindowPlacement failed");
1367 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1368 " rcNormalPosition: (%d,%d)--(%d,%d)\n",
1369 size_hints.rcNormalPosition.left,
1370 size_hints.rcNormalPosition.top,
1371 size_hints.rcNormalPosition.right,
1372 size_hints.rcNormalPosition.bottom));
1373 size_hints.rcNormalPosition.right =
1374 size_hints.rcNormalPosition.left + geometry->base_width;
1375 size_hints.rcNormalPosition.bottom =
1376 size_hints.rcNormalPosition.top + geometry->base_height;
1377 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%d,%d)--(%d,%d)\n",
1378 size_hints.rcNormalPosition.left,
1379 size_hints.rcNormalPosition.top,
1380 size_hints.rcNormalPosition.right,
1381 size_hints.rcNormalPosition.bottom));
1382 if (!SetWindowPlacement (private->drawable.xwindow, &size_hints))
1383 g_warning ("gdk_window_set_hints: SetWindowPlacement failed");
1386 if (geom_mask & GDK_HINT_RESIZE_INC)
1391 if (geom_mask & GDK_HINT_ASPECT)
1398 gdk_window_set_title (GdkWindow *window,
1406 g_return_if_fail (window != NULL);
1407 g_return_if_fail (GDK_IS_WINDOW (window));
1409 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
1410 GDK_DRAWABLE_XID (window), title));
1411 if (!GDK_DRAWABLE_DESTROYED (window))
1413 /* As the title most is in UTF-8 we must translate it
1414 * to the system codepage.
1416 titlelen = strlen (title);
1417 wcstr = g_new (wchar_t, titlelen + 1);
1418 mbstr = g_new (char, 3*titlelen + 1);
1419 wlen = gdk_nmbstowchar_ts (wcstr, title, titlelen, titlelen);
1421 WideCharToMultiByte (GetACP (), 0, wcstr, -1,
1422 mbstr, 3*titlelen, NULL, NULL);
1424 if (!SetWindowText (GDK_DRAWABLE_XID (window), mbstr))
1425 g_warning ("gdk_window_set_title: SetWindowText failed");
1433 gdk_window_set_role (GdkWindow *window,
1436 g_return_if_fail (window != NULL);
1437 g_return_if_fail (GDK_IS_WINDOW (window));
1439 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
1440 GDK_DRAWABLE_XID (window), (role ? role : "NULL")));
1445 gdk_window_set_transient_for (GdkWindow *window,
1448 g_return_if_fail (window != NULL);
1449 g_return_if_fail (GDK_IS_WINDOW (window));
1451 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
1452 GDK_DRAWABLE_XID (window),
1453 GDK_DRAWABLE_XID (parent)));
1458 gdk_window_set_background (GdkWindow *window,
1461 GdkWindowPrivate *private;
1463 g_return_if_fail (window != NULL);
1464 g_return_if_fail (GDK_IS_WINDOW (window));
1466 private = (GdkWindowPrivate*) window;
1467 if (!GDK_DRAWABLE_DESTROYED (window))
1469 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
1470 private->drawable.xwindow,
1471 gdk_color_to_string (color)));
1473 if (private->bg_type == GDK_WIN32_BG_PIXMAP)
1475 if (private->bg_pixmap != NULL)
1477 gdk_pixmap_unref (private->bg_pixmap);
1478 private->bg_pixmap = NULL;
1480 private->bg_type = GDK_WIN32_BG_NORMAL;
1482 private->bg_type = GDK_WIN32_BG_PIXEL;
1483 private->bg_pixel = *color;
1488 gdk_window_set_back_pixmap (GdkWindow *window,
1490 gint parent_relative)
1492 GdkWindowPrivate *private;
1494 g_return_if_fail (window != NULL);
1495 g_return_if_fail (GDK_IS_WINDOW (window));
1497 private = (GdkWindowPrivate*) window;
1499 if (!GDK_DRAWABLE_DESTROYED (window))
1501 if (private->bg_type == GDK_WIN32_BG_PIXMAP)
1503 if (private->bg_pixmap != NULL)
1505 gdk_pixmap_unref (private->bg_pixmap);
1506 private->bg_pixmap = NULL;
1508 private->bg_type = GDK_WIN32_BG_NORMAL;
1510 if (parent_relative)
1512 private->bg_type = GDK_WIN32_BG_PARENT_RELATIVE;
1520 /* We must cache the pixmap in the WindowPrivate and
1521 * paint it each time we get WM_ERASEBKGND
1523 private->bg_type = GDK_WIN32_BG_PIXMAP;
1524 private->bg_pixmap = pixmap;
1525 gdk_pixmap_ref (pixmap);
1531 gdk_window_set_cursor (GdkWindow *window,
1534 GdkWindowPrivate *window_private;
1535 GdkCursorPrivate *cursor_private;
1538 g_return_if_fail (window != NULL);
1539 g_return_if_fail (GDK_IS_WINDOW (window));
1541 window_private = (GdkWindowPrivate*) window;
1542 cursor_private = (GdkCursorPrivate*) cursor;
1544 if (!GDK_DRAWABLE_DESTROYED (window))
1547 xcursor = LoadCursor (NULL, IDC_ARROW);
1549 xcursor = cursor_private->xcursor;
1551 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
1552 window_private->drawable.xwindow, xcursor));
1553 window_private->xcursor = xcursor;
1558 gdk_window_get_user_data (GdkWindow *window,
1561 g_return_if_fail (window != NULL);
1563 *data = window->user_data;
1567 gdk_window_get_geometry (GdkWindow *window,
1574 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1577 window = (GdkWindow*) gdk_root_parent;
1579 if (!GDK_DRAWABLE_DESTROYED (window))
1583 if (!GetClientRect (GDK_DRAWABLE_XID (window), &rect))
1584 g_warning ("gdk_window_get_geometry: GetClientRect failed");
1591 *width = rect.right - rect.left;
1593 *height = rect.bottom - rect.top;
1595 *depth = gdk_drawable_get_visual (window)->depth;
1600 gdk_window_get_position (GdkWindow *window,
1604 GdkWindowPrivate *window_private;
1606 g_return_if_fail (window != NULL);
1607 g_return_if_fail (GDK_IS_WINDOW (window));
1609 window_private = (GdkWindowPrivate*) window;
1612 *x = window_private->x;
1614 *y = window_private->y;
1618 gdk_window_get_origin (GdkWindow *window,
1626 g_return_val_if_fail (window != NULL, 0);
1628 if (!GDK_DRAWABLE_DESTROYED (window))
1634 ClientToScreen (GDK_DRAWABLE_XID (window), &pt);
1647 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
1648 GDK_DRAWABLE_XID (window), tx, ty));
1653 gdk_window_get_deskrelative_origin (GdkWindow *window,
1657 return gdk_window_get_origin (window, x, y);
1661 gdk_window_get_root_origin (GdkWindow *window,
1665 GdkWindowPrivate *private;
1668 g_return_if_fail (window != NULL);
1669 g_return_if_fail (GDK_IS_WINDOW (window));
1671 private = (GdkWindowPrivate*) window;
1676 if (GDK_DRAWABLE_DESTROYED (window))
1679 while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
1680 private = (GdkWindowPrivate*) private->parent;
1681 if (private->drawable.destroyed)
1686 ClientToScreen (private->drawable.xwindow, &pt);
1692 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%d+%d\n",
1693 GDK_DRAWABLE_XID (window),
1694 private->drawable.xwindow, pt.x, pt.y));
1698 gdk_window_get_pointer (GdkWindow *window,
1701 GdkModifierType *mask)
1703 GdkWindow *return_val;
1704 POINT pointc, point;
1707 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1710 window = (GdkWindow*) gdk_root_parent;
1713 GetCursorPos (&pointc);
1715 ScreenToClient (GDK_DRAWABLE_XID (window), &point);
1722 hwnd = WindowFromPoint (point);
1724 ScreenToClient (hwnd, &point);
1727 hwndc = ChildWindowFromPoint (hwnd, point);
1728 ClientToScreen (hwnd, &point);
1729 ScreenToClient (hwndc, &point);
1730 } while (hwndc != hwnd && (hwnd = hwndc, 1)); /* Ouch! */
1732 return_val = gdk_window_lookup (hwnd);
1738 GetKeyboardState (kbd);
1740 if (kbd[VK_SHIFT] & 0x80)
1741 *mask |= GDK_SHIFT_MASK;
1742 if (kbd[VK_CAPITAL] & 0x80)
1743 *mask |= GDK_LOCK_MASK;
1744 if (kbd[VK_CONTROL] & 0x80)
1745 *mask |= GDK_CONTROL_MASK;
1746 if (kbd[VK_MENU] & 0x80)
1747 *mask |= GDK_MOD1_MASK;
1748 if (kbd[VK_LBUTTON] & 0x80)
1749 *mask |= GDK_BUTTON1_MASK;
1750 if (kbd[VK_MBUTTON] & 0x80)
1751 *mask |= GDK_BUTTON2_MASK;
1752 if (kbd[VK_RBUTTON] & 0x80)
1753 *mask |= GDK_BUTTON3_MASK;
1760 gdk_window_at_pointer (gint *win_x,
1764 POINT point, pointc;
1768 GetCursorPos (&pointc);
1770 hwnd = WindowFromPoint (point);
1774 window = (GdkWindow *) gdk_root_parent;
1782 ScreenToClient (hwnd, &point);
1785 hwndc = ChildWindowFromPoint (hwnd, point);
1786 ClientToScreen (hwnd, &point);
1787 ScreenToClient (hwndc, &point);
1788 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1790 window = gdk_window_lookup (hwnd);
1792 if (window && (win_x || win_y))
1794 GetClientRect (hwnd, &rect);
1796 *win_x = point.x - rect.left;
1798 *win_y = point.y - rect.top;
1801 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%d+%d %#x%s\n",
1802 point.x, point.y, hwnd,
1803 (window == NULL ? " NULL" : "")));
1809 gdk_window_get_parent (GdkWindow *window)
1811 g_return_val_if_fail (window != NULL, NULL);
1812 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1814 return ((GdkWindowPrivate*) window)->parent;
1818 gdk_window_get_toplevel (GdkWindow *window)
1820 g_return_val_if_fail (window != NULL, NULL);
1821 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1823 while (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_CHILD)
1824 window = ((GdkWindowPrivate*) window)->parent;
1830 gdk_window_get_children (GdkWindow *window)
1832 GdkWindowPrivate *private;
1835 g_return_val_if_fail (window != NULL, NULL);
1836 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1838 if (GDK_DRAWABLE_DESTROYED (window))
1842 g_warning ("gdk_window_get_children not implemented");
1849 gdk_window_get_events (GdkWindow *window)
1851 GdkWindowPrivate *private;
1853 g_return_val_if_fail (window != NULL, 0);
1854 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1856 private = (GdkWindowPrivate*) window;
1857 if (GDK_DRAWABLE_DESTROYED (window))
1860 return private->event_mask;
1864 gdk_window_set_events (GdkWindow *window,
1865 GdkEventMask event_mask)
1867 GdkWindowPrivate *private;
1869 g_return_if_fail (window != NULL);
1870 g_return_if_fail (GDK_IS_WINDOW (window));
1872 private = (GdkWindowPrivate*) window;
1873 if (GDK_DRAWABLE_DESTROYED (window))
1876 private->event_mask = event_mask;
1880 gdk_window_add_colormap_windows (GdkWindow *window)
1882 g_warning ("gdk_window_add_colormap_windows not implemented");
1886 gdk_window_shape_combine_mask (GdkWindow *window,
1890 g_return_if_fail (window != NULL);
1891 g_return_if_fail (GDK_IS_WINDOW (window));
1895 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
1896 GDK_DRAWABLE_XID (window)));
1897 SetWindowRgn (GDK_DRAWABLE_XID (window), NULL, TRUE);
1901 GdkDrawablePrivate *pixmap_private;
1907 /* Convert mask bitmap to region */
1908 pixmap_private = (GdkDrawablePrivate*) mask;
1909 hrgn = BitmapToRegion (pixmap_private->xwindow);
1911 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
1912 GDK_DRAWABLE_XID (window),
1913 pixmap_private->xwindow));
1915 /* SetWindowRgn wants window (not client) coordinates */
1916 dwStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
1917 dwExStyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
1918 GetClientRect (GDK_DRAWABLE_XID (window), &rect);
1919 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1920 OffsetRgn (hrgn, -rect.left, -rect.top);
1922 OffsetRgn (hrgn, x, y);
1924 /* If this is a top-level window, add the title bar to the region */
1925 if (GDK_DRAWABLE_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1927 CombineRgn (hrgn, hrgn,
1928 CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
1932 SetWindowRgn (GDK_DRAWABLE_XID (window), hrgn, TRUE);
1937 gdk_window_add_filter (GdkWindow *window,
1938 GdkFilterFunc function,
1941 GdkWindowPrivate *private;
1943 GdkEventFilter *filter;
1945 g_return_if_fail (window != NULL);
1946 g_return_if_fail (GDK_IS_WINDOW (window));
1948 private = (GdkWindowPrivate*) window;
1949 if (private && GDK_DRAWABLE_DESTROYED (window))
1952 tmp_list = private->filters;
1956 filter = (GdkEventFilter *)tmp_list->data;
1957 if ((filter->function == function) && (filter->data == data))
1959 tmp_list = tmp_list->next;
1962 filter = g_new (GdkEventFilter, 1);
1963 filter->function = function;
1964 filter->data = data;
1966 private->filters = g_list_append (private->filters, filter);
1970 gdk_window_remove_filter (GdkWindow *window,
1971 GdkFilterFunc function,
1974 GdkWindowPrivate *private;
1975 GList *tmp_list, *node;
1976 GdkEventFilter *filter;
1978 g_return_if_fail (window != NULL);
1979 g_return_if_fail (GDK_IS_WINDOW (window));
1981 private = (GdkWindowPrivate*) window;
1983 tmp_list = private->filters;
1987 filter = (GdkEventFilter *)tmp_list->data;
1989 tmp_list = tmp_list->next;
1991 if ((filter->function == function) && (filter->data == data))
1993 private->filters = g_list_remove_link (private->filters, node);
1995 g_list_free_1 (node);
2004 gdk_window_set_override_redirect (GdkWindow *window,
2005 gboolean override_redirect)
2007 g_return_if_fail (window != NULL);
2008 g_return_if_fail (GDK_IS_WINDOW (window));
2010 g_warning ("gdk_window_set_override_redirect not implemented");
2014 gdk_window_set_icon (GdkWindow *window,
2015 GdkWindow *icon_window,
2019 g_return_if_fail (window != NULL);
2020 g_return_if_fail (GDK_IS_WINDOW (window));
2022 if (GDK_DRAWABLE_DESTROYED (window))
2025 g_warning ("gdk_window_set_icon not implemented");
2029 gdk_window_set_icon_name (GdkWindow *window,
2032 g_return_if_fail (window != NULL);
2033 g_return_if_fail (GDK_IS_WINDOW (window));
2035 if (GDK_DRAWABLE_DESTROYED (window))
2038 if (!SetWindowText (GDK_DRAWABLE_XID (window), name))
2039 g_warning ("gdk_window_set_icon_name: SetWindowText failed");
2043 gdk_window_set_group (GdkWindow *window,
2046 g_return_if_fail (window != NULL);
2047 g_return_if_fail (GDK_IS_WINDOW (window));
2048 g_return_if_fail (leader != NULL);
2049 g_return_if_fail (GDK_IS_WINDOW (leader));
2051 if (GDK_DRAWABLE_DESTROYED (window) || GDK_DRAWABLE_DESTROYED (leader))
2054 g_warning ("gdk_window_set_group not implemented");
2058 gdk_window_set_decorations (GdkWindow *window,
2059 GdkWMDecoration decorations)
2061 LONG style, exstyle;
2063 g_return_if_fail (window != NULL);
2064 g_return_if_fail (GDK_IS_WINDOW (window));
2066 style = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
2067 exstyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
2069 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2070 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
2072 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2074 if (decorations & GDK_DECOR_ALL)
2075 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2076 if (decorations & GDK_DECOR_BORDER)
2077 style |= (WS_BORDER);
2078 if (decorations & GDK_DECOR_RESIZEH)
2079 style |= (WS_THICKFRAME);
2080 if (decorations & GDK_DECOR_TITLE)
2081 style |= (WS_CAPTION);
2082 if (decorations & GDK_DECOR_MENU)
2083 style |= (WS_SYSMENU);
2084 if (decorations & GDK_DECOR_MINIMIZE)
2085 style |= (WS_MINIMIZEBOX);
2086 if (decorations & GDK_DECOR_MAXIMIZE)
2087 style |= (WS_MAXIMIZEBOX);
2089 SetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE, style);
2093 gdk_window_set_functions (GdkWindow *window,
2094 GdkWMFunction functions)
2096 LONG style, exstyle;
2098 g_return_if_fail (window != NULL);
2099 g_return_if_fail (GDK_IS_WINDOW (window));
2101 style = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE);
2102 exstyle = GetWindowLong (GDK_DRAWABLE_XID (window), GWL_EXSTYLE);
2104 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2105 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
2108 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2110 if (functions & GDK_FUNC_ALL)
2111 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2112 if (functions & GDK_FUNC_RESIZE)
2113 style |= (WS_THICKFRAME);
2114 if (functions & GDK_FUNC_MOVE)
2115 style |= (WS_THICKFRAME);
2116 if (functions & GDK_FUNC_MINIMIZE)
2117 style |= (WS_MINIMIZEBOX);
2118 if (functions & GDK_FUNC_MAXIMIZE)
2119 style |= (WS_MAXIMIZEBOX);
2121 SetWindowLong (GDK_DRAWABLE_XID (window), GWL_STYLE, style);
2125 gdk_window_get_toplevels (void)
2127 GList *new_list = NULL;
2130 tmp_list = gdk_root_parent->children;
2133 new_list = g_list_prepend (new_list, tmp_list->data);
2134 tmp_list = tmp_list->next;
2141 * propagate the shapes from all child windows of a GDK window to the parent
2142 * window. Shamelessly ripped from Enlightenment's code
2148 QueryTree (HWND hwnd,
2158 child = GetWindow (hwnd, GW_CHILD);
2160 child = GetWindow (child, GW_HWNDNEXT);
2163 } while (child != NULL);
2167 *children = g_new (HWND, n);
2168 for (i = 0; i < n; i++)
2171 child = GetWindow (hwnd, GW_CHILD);
2173 child = GetWindow (child, GW_HWNDNEXT);
2174 *children[i] = child;
2180 gdk_propagate_shapes (HANDLE win,
2184 HRGN region, childRegion;
2189 SetRectEmpty (&emptyRect);
2190 region = CreateRectRgnIndirect (&emptyRect);
2192 GetWindowRgn (win, region);
2194 QueryTree (win, &list, &num);
2197 WINDOWPLACEMENT placement;
2199 placement.length = sizeof (WINDOWPLACEMENT);
2200 /* go through all child windows and combine regions */
2201 for (i = 0; i < num; i++)
2203 GetWindowPlacement (list[i], &placement);
2204 if (placement.showCmd = SW_SHOWNORMAL)
2206 childRegion = CreateRectRgnIndirect (&emptyRect);
2207 GetWindowRgn (list[i], childRegion);
2208 CombineRgn (region, region, childRegion, RGN_OR);
2209 DeleteObject (childRegion);
2212 SetWindowRgn (win, region, TRUE);
2215 DeleteObject (region);
2219 gdk_window_set_child_shapes (GdkWindow *window)
2221 g_return_if_fail (window != NULL);
2222 g_return_if_fail (GDK_IS_WINDOW (window));
2224 if (GDK_DRAWABLE_DESTROYED (window))
2227 gdk_propagate_shapes (GDK_DRAWABLE_XID (window), FALSE);
2231 gdk_window_merge_child_shapes (GdkWindow *window)
2233 g_return_if_fail (window != NULL);
2234 g_return_if_fail (GDK_IS_WINDOW (window));
2236 if (GDK_DRAWABLE_DESTROYED (window))
2239 gdk_propagate_shapes (GDK_DRAWABLE_XID (window), TRUE);
2242 /*************************************************************
2243 * gdk_window_is_visible:
2244 * Check if the given window is mapped.
2248 * is the window mapped
2249 *************************************************************/
2252 gdk_window_is_visible (GdkWindow *window)
2254 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
2256 g_return_val_if_fail (window != NULL, FALSE);
2257 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2259 return private->mapped;
2262 /*************************************************************
2263 * gdk_window_is_viewable:
2264 * Check if the window and all ancestors of the window
2265 * are mapped. (This is not necessarily "viewable" in
2266 * the X sense, since we only check as far as we have
2267 * GDK window parents, not to the root window)
2271 * is the window viewable
2272 *************************************************************/
2275 gdk_window_is_viewable (GdkWindow *window)
2277 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
2279 g_return_val_if_fail (window != NULL, FALSE);
2280 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2283 (private != gdk_root_parent) &&
2284 (private->drawable.window_type != GDK_WINDOW_FOREIGN))
2286 if (!private->mapped)
2289 private = (GdkWindowPrivate *)private->parent;
2295 /* Support for windows that can be guffaw-scrolled
2296 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2300 gdk_window_gravity_works (void)
2302 enum { UNKNOWN, NO, YES };
2303 static gint gravity_works = UNKNOWN;
2305 if (gravity_works == UNKNOWN)
2312 attr.window_type = GDK_WINDOW_TEMP;
2313 attr.wclass = GDK_INPUT_OUTPUT;
2318 attr.event_mask = 0;
2320 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2322 attr.window_type = GDK_WINDOW_CHILD;
2323 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2325 gdk_window_set_static_win_gravity (child, TRUE);
2327 gdk_window_resize (parent, 100, 110);
2328 gdk_window_move (parent, 0, -10);
2329 gdk_window_move_resize (parent, 0, 0, 100, 100);
2331 gdk_window_resize (parent, 100, 110);
2332 gdk_window_move (parent, 0, -10);
2333 gdk_window_move_resize (parent, 0, 0, 100, 100);
2335 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2337 gdk_window_destroy (parent);
2338 gdk_window_destroy (child);
2340 gravity_works = ((y == -20) ? YES : NO);
2343 return (gravity_works == YES);
2347 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2349 g_return_if_fail (window != NULL);
2351 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2355 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2357 g_return_if_fail (window != NULL);
2360 g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2363 /*************************************************************
2364 * gdk_window_set_static_gravities:
2365 * Set the bit gravity of the given window to static,
2366 * and flag it so all children get static subwindow
2369 * window: window for which to set static gravity
2370 * use_static: Whether to turn static gravity on or off.
2372 * Does the XServer support static gravity?
2373 *************************************************************/
2376 gdk_window_set_static_gravities (GdkWindow *window,
2377 gboolean use_static)
2379 GdkWindowPrivate *private = (GdkWindowPrivate *)window;
2382 g_return_val_if_fail (window != NULL, FALSE);
2383 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2385 if (!use_static == !private->guffaw_gravity)
2388 if (use_static && !gdk_window_gravity_works ())
2391 private->guffaw_gravity = use_static;
2393 if (!GDK_DRAWABLE_DESTROYED (window))
2395 gdk_window_set_static_bit_gravity (window, use_static);
2397 tmp_list = private->children;
2400 gdk_window_set_static_win_gravity (window, use_static);
2402 tmp_list = tmp_list->next;