1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-2002 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdk.h" /* gdk_rectangle_intersect */
31 #include "gdkevents.h"
32 #include "gdkpixmap.h"
33 #include "gdkwindow.h"
34 #include "gdkdisplay.h"
35 #include "gdkprivate-win32.h"
36 #include "gdkinput-win32.h"
38 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
39 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
41 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
44 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
45 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
46 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
47 static void gdk_window_impl_win32_finalize (GObject *object);
49 static gpointer parent_class = NULL;
52 _gdk_window_impl_win32_get_type (void)
54 static GType object_type = 0;
58 static const GTypeInfo object_info =
60 sizeof (GdkWindowImplWin32Class),
62 (GBaseFinalizeFunc) NULL,
63 (GClassInitFunc) gdk_window_impl_win32_class_init,
64 NULL, /* class_finalize */
65 NULL, /* class_data */
66 sizeof (GdkWindowImplWin32),
68 (GInstanceInitFunc) gdk_window_impl_win32_init,
71 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
80 _gdk_window_impl_get_type (void)
82 return _gdk_window_impl_win32_get_type ();
86 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
93 impl->extension_events_selected = FALSE;
97 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
99 GObjectClass *object_class = G_OBJECT_CLASS (klass);
100 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
102 parent_class = g_type_class_peek_parent (klass);
104 object_class->finalize = gdk_window_impl_win32_finalize;
106 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
107 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
108 drawable_class->get_size = gdk_window_impl_win32_get_size;
110 /* Visible and clip regions are the same */
111 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
112 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
116 gdk_window_impl_win32_finalize (GObject *object)
118 GdkWindowObject *wrapper;
119 GdkDrawableImplWin32 *draw_impl;
120 GdkWindowImplWin32 *window_impl;
122 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
124 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
125 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
127 wrapper = (GdkWindowObject*) draw_impl->wrapper;
129 if (!GDK_WINDOW_DESTROYED (wrapper))
131 gdk_win32_handle_table_remove (draw_impl->handle);
134 if (window_impl->hcursor != NULL)
136 if (GetCursor () == window_impl->hcursor)
138 if (!DestroyCursor (window_impl->hcursor))
139 WIN32_GDI_FAILED("DestroyCursor");
140 window_impl->hcursor = NULL;
143 G_OBJECT_CLASS (parent_class)->finalize (object);
147 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
149 GdkDrawableImplWin32 *drawable_impl;
151 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
153 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
155 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
156 drawable_impl->colormap == NULL)
158 drawable_impl->colormap = gdk_colormap_get_system ();
159 gdk_colormap_ref (drawable_impl->colormap);
162 return drawable_impl->colormap;
166 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
169 GdkWindowImplWin32 *impl;
170 GdkDrawableImplWin32 *draw_impl;
172 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
174 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
175 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
178 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
183 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
188 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
192 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
195 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
197 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
201 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
203 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
204 GdkRectangle result_rect;
208 result_rect.width = impl->width;
209 result_rect.height = impl->height;
211 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
213 return gdk_region_rectangle (&result_rect);
217 _gdk_windowing_window_init (void)
219 GdkWindowObject *private;
220 GdkWindowImplWin32 *impl;
221 GdkDrawableImplWin32 *draw_impl;
226 g_assert (_gdk_parent_root == NULL);
228 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
229 width = rect.right - rect.left;
230 height = rect.bottom - rect.top;
232 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
233 private = (GdkWindowObject *)_gdk_parent_root;
234 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
235 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
237 draw_impl->handle = _gdk_root_window;
238 draw_impl->wrapper = GDK_DRAWABLE (private);
239 draw_impl->colormap = gdk_colormap_get_system ();
240 gdk_colormap_ref (draw_impl->colormap);
242 private->window_type = GDK_WINDOW_ROOT;
243 private->depth = gdk_visual_get_system ()->depth;
245 impl->height = height;
247 _gdk_window_init_position (GDK_WINDOW (private));
249 gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
253 get_default_title (void)
256 title = g_get_application_name ();
258 title = g_get_prgname ();
263 /* The Win API function AdjustWindowRect may return negative values
264 * resulting in obscured title bars. This helper function is coreccting it.
267 SafeAdjustWindowRectEx (RECT* lpRect,
272 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
274 WIN32_API_FAILED ("AdjustWindowRectEx");
277 if (lpRect->left < 0)
279 lpRect->right -= lpRect->left;
284 lpRect->bottom -= lpRect->top;
291 * is a wrapper function for RegisterWindowClassEx.
292 * It creates at least one unique class for every
293 * GdkWindowType. If support for single window-specific icons
294 * is ever needed (e.g Dialog specific), every such window should
298 RegisterGdkClass (GdkWindowType wtype)
300 static ATOM klassTOPLEVEL = 0;
301 static ATOM klassDIALOG = 0;
302 static ATOM klassCHILD = 0;
303 static ATOM klassTEMP = 0;
304 static HICON hAppIcon = NULL;
305 static WNDCLASSEX wcl;
308 wcl.cbSize = sizeof (WNDCLASSEX);
309 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
310 * on WM_SIZE and WM_MOVE. Flicker, Performance!
312 wcl.lpfnWndProc = _gdk_win32_window_procedure;
315 wcl.hInstance = _gdk_app_hmodule;
317 /* initialize once! */
320 gchar sLoc [MAX_PATH+1];
322 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
324 hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
327 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
328 hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
332 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
335 wcl.lpszMenuName = NULL;
338 /* initialize once per class */
340 * HB: Setting the background brush leads to flicker, because we
341 * don't get asked how to clear the background. This is not what
342 * we want, at least not for input_only windows ...
344 #define ONCE_PER_CLASS() \
345 wcl.hIcon = CopyIcon (hAppIcon); \
346 wcl.hIconSm = CopyIcon (hAppIcon); \
347 wcl.hbrBackground = NULL; \
348 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
352 case GDK_WINDOW_TOPLEVEL:
353 if (0 == klassTOPLEVEL)
355 wcl.lpszClassName = "gdkWindowToplevel";
358 klassTOPLEVEL = RegisterClassEx (&wcl);
360 klass = klassTOPLEVEL;
363 case GDK_WINDOW_CHILD:
366 wcl.lpszClassName = "gdkWindowChild";
368 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
370 klassCHILD = RegisterClassEx (&wcl);
375 case GDK_WINDOW_DIALOG:
376 if (0 == klassDIALOG)
378 wcl.lpszClassName = "gdkWindowDialog";
379 wcl.style |= CS_SAVEBITS;
381 klassDIALOG = RegisterClassEx (&wcl);
386 case GDK_WINDOW_TEMP:
389 wcl.lpszClassName = "gdkWindowTemp";
390 wcl.style |= CS_SAVEBITS;
392 klassTEMP = RegisterClassEx (&wcl);
398 g_assert_not_reached ();
404 WIN32_API_FAILED ("RegisterClassEx");
405 g_error ("That is a fatal error");
411 gdk_window_new (GdkWindow *parent,
412 GdkWindowAttr *attributes,
413 gint attributes_mask)
417 DWORD dwStyle, dwExStyle;
420 GdkWindowObject *private;
421 GdkWindowImplWin32 *impl;
422 GdkDrawableImplWin32 *draw_impl;
429 g_return_val_if_fail (attributes != NULL, NULL);
432 parent = _gdk_parent_root;
434 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
437 g_print ("gdk_window_new: %s\n",
438 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
439 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
440 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
441 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
444 if (GDK_WINDOW_DESTROYED (parent))
447 hparent = GDK_WINDOW_HWND (parent);
449 window = g_object_new (GDK_TYPE_WINDOW, NULL);
450 private = (GdkWindowObject *)window;
451 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
452 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
453 draw_impl->wrapper = GDK_DRAWABLE (window);
455 /* Windows with a foreign parent are treated as if they are children
456 * of the root window, except for actual creation.
458 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
459 parent = _gdk_parent_root;
461 private->parent = (GdkWindowObject *)parent;
463 if (attributes_mask & GDK_WA_X)
468 if (attributes_mask & GDK_WA_Y)
470 else if (attributes_mask & GDK_WA_X)
471 y = 100; /* ??? We must put it somewhere... */
473 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
477 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
478 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
479 impl->extension_events_selected = FALSE;
480 private->window_type = attributes->window_type;
482 _gdk_window_init_position (GDK_WINDOW (private));
483 if (impl->position_info.big)
484 private->guffaw_gravity = TRUE;
486 if (attributes_mask & GDK_WA_VISUAL)
487 visual = attributes->visual;
489 visual = gdk_visual_get_system ();
491 if (attributes_mask & GDK_WA_TITLE)
492 title = attributes->title;
494 title = get_default_title ();
495 if (!title || !*title)
496 title = "GDK client window";
498 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
500 if (private->parent && private->parent->guffaw_gravity)
505 if (attributes->wclass == GDK_INPUT_OUTPUT)
509 private->input_only = FALSE;
510 private->depth = visual->depth;
512 if (attributes_mask & GDK_WA_COLORMAP)
514 draw_impl->colormap = attributes->colormap;
515 gdk_colormap_ref (attributes->colormap);
519 draw_impl->colormap = gdk_colormap_get_system ();
524 dwExStyle = WS_EX_TRANSPARENT;
526 private->input_only = TRUE;
527 draw_impl->colormap = gdk_colormap_get_system ();
528 gdk_colormap_ref (draw_impl->colormap);
529 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n"));
533 private->parent->children = g_list_prepend (private->parent->children, window);
535 switch (private->window_type)
537 case GDK_WINDOW_TOPLEVEL:
538 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
539 hparent = _gdk_root_window;
542 case GDK_WINDOW_CHILD:
543 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
546 case GDK_WINDOW_DIALOG:
547 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
549 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
551 hparent = _gdk_root_window;
554 case GDK_WINDOW_TEMP:
555 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
556 /* a temp window is not necessarily a top level window */
557 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
558 dwExStyle |= WS_EX_TOOLWINDOW;
561 case GDK_WINDOW_ROOT:
562 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
566 klass = RegisterGdkClass (private->window_type);
568 if (private->window_type != GDK_WINDOW_CHILD)
570 if (x == CW_USEDEFAULT)
581 rect.right = rect.left + impl->width;
582 rect.bottom = rect.top + impl->height;
584 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
586 if (x != CW_USEDEFAULT)
591 width = rect.right - rect.left;
592 height = rect.bottom - rect.top;
597 height = impl->height;
600 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
602 #ifdef WITHOUT_WM_CREATE
603 draw_impl->handle = CreateWindowEx (dwExStyle,
604 MAKEINTRESOURCE(klass),
607 impl->position_info.x, impl->position_info.y,
608 impl->position_info.width, impl->position_info.height,
616 CreateWindowEx (dwExStyle,
617 MAKEINTRESOURCE(klass),
620 impl->position_info.x, impl->position_info.y,
621 impl->position_info.width, impl->position_info.height,
626 if (GDK_WINDOW_HWND (window) != hwndNew)
628 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
629 GDK_WINDOW_HWND (window),
632 /* HB: IHMO due to a race condition the handle was increased by
633 * one, which causes much trouble. Because I can't find the
634 * real bug, try to workaround it ...
635 * To reproduce: compile with MSVC 5, DEBUG=1
638 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
639 GDK_WINDOW_HWND (window) = hwndNew;
640 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
642 /* the old behaviour, but with warning */
643 GDK_WINDOW_HWND (window) = hwndNew;
648 gdk_drawable_ref (window);
649 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
653 g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
655 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
657 GDK_WINDOW_HWND (window)));
661 if (draw_impl->handle == NULL)
663 WIN32_API_FAILED ("CreateWindowEx");
664 g_object_unref ((GObject *) window);
668 #ifdef WITHOUT_WM_CREATE
669 gdk_drawable_ref (window);
670 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
673 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
674 (attributes->cursor) :
681 gdk_window_foreign_new_for_display (GdkDisplay *display,
682 GdkNativeWindow anid)
685 GdkWindowObject *private;
686 GdkWindowImplWin32 *impl;
687 GdkDrawableImplWin32 *draw_impl;
693 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
695 window = g_object_new (GDK_TYPE_WINDOW, NULL);
696 private = (GdkWindowObject *)window;
697 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
698 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
699 draw_impl->wrapper = GDK_DRAWABLE (window);
700 parent = GetParent ((HWND)anid);
702 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
703 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
704 private->parent = (GdkWindowObject *)_gdk_parent_root;
706 private->parent->children = g_list_prepend (private->parent->children, window);
708 draw_impl->handle = (HWND) anid;
709 GetClientRect ((HWND) anid, &rect);
711 point.y = rect.right;
712 ClientToScreen ((HWND) anid, &point);
713 if (parent != _gdk_root_window)
714 ScreenToClient (parent, &point);
715 private->x = point.x;
716 private->y = point.y;
717 impl->width = rect.right - rect.left;
718 impl->height = rect.bottom - rect.top;
719 private->window_type = GDK_WINDOW_FOREIGN;
720 private->destroyed = FALSE;
721 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
722 if (IsWindowVisible ((HWND) anid))
723 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
725 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
726 private->depth = gdk_visual_get_system ()->depth;
728 _gdk_window_init_position (GDK_WINDOW (private));
730 gdk_drawable_ref (window);
731 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
737 gdk_window_lookup (GdkNativeWindow hwnd)
739 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
743 _gdk_windowing_window_destroy (GdkWindow *window,
745 gboolean foreign_destroy)
747 GdkWindowObject *private = (GdkWindowObject *)window;
749 g_return_if_fail (GDK_IS_WINDOW (window));
751 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %p\n",
752 GDK_WINDOW_HWND (window)));
754 if (private->extension_events != 0)
755 _gdk_input_window_destroy (window);
757 if (private->window_type == GDK_WINDOW_FOREIGN)
759 if (!foreign_destroy && (private->parent != NULL))
761 /* It's somebody else's window, but in our hierarchy,
762 * so reparent it to the root window, and then call
763 * DestroyWindow() on it.
765 gdk_window_hide (window);
766 gdk_window_reparent (window, NULL, 0, 0);
768 /* Is this too drastic? Many (most?) applications
769 * quit if any window receives WM_QUIT I think.
770 * OTOH, I don't think foreign windows are much
771 * used, so the question is maybe academic.
773 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
776 else if (!recursing && !foreign_destroy)
778 private->destroyed = TRUE;
779 DestroyWindow (GDK_WINDOW_HWND (window));
783 /* This function is called when the window really gone.
786 gdk_window_destroy_notify (GdkWindow *window)
788 g_return_if_fail (window != NULL);
789 g_return_if_fail (GDK_IS_WINDOW (window));
792 g_print ("gdk_window_destroy_notify: %p %s\n",
793 GDK_WINDOW_HWND (window),
794 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
796 if (!GDK_WINDOW_DESTROYED (window))
798 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
799 g_warning ("window %p unexpectedly destroyed",
800 GDK_WINDOW_HWND (window));
802 _gdk_window_destroy (window, TRUE);
805 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
806 gdk_drawable_unref (window);
810 show_window_internal (GdkWindow *window,
814 GdkWindowObject *private;
815 HWND old_active_window;
817 private = GDK_WINDOW_OBJECT (window);
819 if (private->destroyed)
822 GDK_NOTE (MISC, g_print ("show_window_internal: %p %s%s%s\n",
823 GDK_WINDOW_HWND (window),
824 _gdk_win32_window_state_to_string (private->state),
825 (raise ? " raise" : ""),
826 (deiconify ? " deiconify" : "")));
828 /* If asked to show (not deiconify) an withdrawn and iconified
832 !GDK_WINDOW_IS_MAPPED (window) &&
833 (private->state & GDK_WINDOW_STATE_ICONIFIED))
835 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
839 /* If asked to just show an iconified window, do nothing. */
840 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
843 /* If asked to deiconify an already noniconified window, do
844 * nothing. (Especially, don't cause the window to rise and
845 * activate. There are different calls for that.)
847 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
850 /* If asked to show (but not raise) a window that is already
851 * visible, do nothing.
853 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
858 if (!GDK_WINDOW_IS_MAPPED (window))
859 gdk_synthesize_window_state (window,
860 GDK_WINDOW_STATE_WITHDRAWN,
862 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
864 /* Don't really know if this makes sense, can't remember whether
865 * this case is handled like this because it is necessary, or
866 * if this is just old crap.
868 SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
869 SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
873 old_active_window = GetActiveWindow ();
875 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
876 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
877 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
878 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
880 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
883 BringWindowToTop (GDK_WINDOW_HWND (window));
884 else if (old_active_window != GDK_WINDOW_HWND (window))
885 SetActiveWindow (old_active_window);
889 gdk_window_show_unraised (GdkWindow *window)
891 g_return_if_fail (GDK_IS_WINDOW (window));
893 show_window_internal (window, FALSE, FALSE);
897 gdk_window_show (GdkWindow *window)
899 g_return_if_fail (GDK_IS_WINDOW (window));
901 show_window_internal (window, TRUE, FALSE);
905 gdk_window_hide (GdkWindow *window)
907 GdkWindowObject *private;
909 g_return_if_fail (window != NULL);
911 private = (GdkWindowObject*) window;
912 if (!private->destroyed)
914 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p %s\n",
915 GDK_WINDOW_HWND (window),
916 _gdk_win32_window_state_to_string (private->state)));
918 if (GDK_WINDOW_IS_MAPPED (window))
919 gdk_synthesize_window_state (window,
921 GDK_WINDOW_STATE_WITHDRAWN);
923 _gdk_window_clear_update_area (window);
925 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
926 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
928 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
930 SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
931 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
935 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
941 gdk_window_withdraw (GdkWindow *window)
943 GdkWindowObject *private;
945 g_return_if_fail (window != NULL);
947 private = (GdkWindowObject*) window;
948 if (!private->destroyed)
950 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p %s\n",
951 GDK_WINDOW_HWND (window),
952 _gdk_win32_window_state_to_string (private->state)));
954 gdk_window_hide (window); /* ??? */
959 gdk_window_move (GdkWindow *window,
963 GdkWindowObject *private = (GdkWindowObject *)window;
964 GdkWindowImplWin32 *impl;
966 g_return_if_fail (window != NULL);
967 g_return_if_fail (GDK_IS_WINDOW (window));
969 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
971 if (!GDK_WINDOW_DESTROYED (window))
973 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
974 _gdk_window_move_resize_child (window, x, y,
975 impl->width, impl->height);
978 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
979 x, y, impl->width, impl->height,
980 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
981 WIN32_API_FAILED ("SetWindowPos");
987 gdk_window_resize (GdkWindow *window,
991 GdkWindowObject *private = (GdkWindowObject*) window;
992 GdkWindowImplWin32 *impl;
995 g_return_if_fail (window != NULL);
996 g_return_if_fail (GDK_IS_WINDOW (window));
1003 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1005 if (!GDK_WINDOW_DESTROYED (window))
1007 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1008 _gdk_window_move_resize_child (window, private->x, private->y,
1019 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1022 rect.right = pt.x + width;
1023 rect.bottom = pt.y + height;
1025 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1026 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1027 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1028 WIN32_API_FAILED ("AdjustWindowRectEx");
1032 width = rect.right - rect.left;
1033 height = rect.bottom - rect.top;
1034 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1035 x, y, width, height,
1036 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER))
1037 WIN32_API_FAILED ("SetWindowPos");
1039 private->resize_count += 1;
1044 gdk_window_move_resize (GdkWindow *window,
1050 GdkWindowObject *private = (GdkWindowObject*) window;
1051 GdkWindowImplWin32 *impl;
1053 g_return_if_fail (window != NULL);
1054 g_return_if_fail (GDK_IS_WINDOW (window));
1061 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1063 if (!private->destroyed)
1069 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p %dx%d@+%d+%d\n",
1070 GDK_WINDOW_HWND (window),
1071 width, height, x, y));
1073 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1074 _gdk_window_move_resize_child (window, x, y, width, height);
1079 rect.right = x + width;
1080 rect.bottom = y + height;
1082 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1083 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1084 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1085 WIN32_API_FAILED ("AdjustWindowRectEx");
1087 GDK_NOTE (MISC, g_print ("...SetWindowPos(%p,%ldx%ld@+%ld+%ld)\n",
1088 GDK_WINDOW_HWND (window),
1089 rect.right - rect.left, rect.bottom - rect.top,
1090 rect.left, rect.top));
1091 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1092 rect.left, rect.top,
1093 rect.right - rect.left, rect.bottom - rect.top,
1094 SWP_NOACTIVATE | SWP_NOZORDER))
1095 WIN32_API_FAILED ("SetWindowPos");
1101 gdk_window_reparent (GdkWindow *window,
1102 GdkWindow *new_parent,
1106 GdkWindowObject *window_private;
1107 GdkWindowObject *parent_private;
1108 GdkWindowObject *old_parent_private;
1109 GdkWindowImplWin32 *impl;
1111 g_return_if_fail (window != NULL);
1112 g_return_if_fail (GDK_IS_WINDOW (window));
1113 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1114 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1117 new_parent = _gdk_parent_root;
1119 window_private = (GdkWindowObject*) window;
1120 old_parent_private = (GdkWindowObject *) window_private->parent;
1121 parent_private = (GdkWindowObject*) new_parent;
1122 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1124 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1126 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p %p\n",
1127 GDK_WINDOW_HWND (window),
1128 GDK_WINDOW_HWND (new_parent)));
1129 if (!SetParent (GDK_WINDOW_HWND (window),
1130 GDK_WINDOW_HWND (new_parent)))
1131 WIN32_API_FAILED ("SetParent");
1133 if (!MoveWindow (GDK_WINDOW_HWND (window),
1134 x, y, impl->width, impl->height, TRUE))
1135 WIN32_API_FAILED ("MoveWindow");
1138 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1141 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1142 new_parent = _gdk_parent_root;
1144 window_private->parent = (GdkWindowObject *)new_parent;
1146 if (old_parent_private)
1147 old_parent_private->children =
1148 g_list_remove (old_parent_private->children, window);
1151 if ((old_parent_private &&
1152 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1153 (!old_parent_private && parent_private->guffaw_gravity))
1154 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1157 parent_private->children = g_list_prepend (parent_private->children, window);
1158 _gdk_window_init_position (GDK_WINDOW (window_private));
1162 _gdk_windowing_window_clear_area (GdkWindow *window,
1168 GdkWindowImplWin32 *impl;
1170 g_return_if_fail (window != NULL);
1171 g_return_if_fail (GDK_IS_WINDOW (window));
1173 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1175 if (!GDK_WINDOW_DESTROYED (window))
1180 width = impl->width - x;
1182 height = impl->height - y;
1183 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1184 "%p %dx%d@+%d+%d\n",
1185 GDK_WINDOW_HWND (window),
1186 width, height, x, y));
1187 hdc = GetDC (GDK_WINDOW_HWND (window));
1188 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1189 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1190 if (!ReleaseDC (GDK_WINDOW_HWND (window), hdc))
1191 WIN32_GDI_FAILED ("ReleaseDC");
1196 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1202 g_return_if_fail (window != NULL);
1203 g_return_if_fail (GDK_IS_WINDOW (window));
1205 if (!GDK_WINDOW_DESTROYED (window))
1209 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1210 "%p %dx%d@+%d+%d\n",
1211 GDK_WINDOW_HWND (window),
1212 width, height, x, y));
1215 rect.right = x + width + 1;
1217 rect.bottom = y + height + 1;
1218 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1219 WIN32_GDI_FAILED ("InvalidateRect");
1220 UpdateWindow (GDK_WINDOW_HWND (window));
1225 gdk_window_raise (GdkWindow *window)
1227 g_return_if_fail (window != NULL);
1228 g_return_if_fail (GDK_IS_WINDOW (window));
1230 if (!GDK_WINDOW_DESTROYED (window))
1232 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1233 GDK_WINDOW_HWND (window)));
1235 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1236 WIN32_API_FAILED ("BringWindowToTop");
1241 gdk_window_lower (GdkWindow *window)
1243 g_return_if_fail (window != NULL);
1244 g_return_if_fail (GDK_IS_WINDOW (window));
1246 if (!GDK_WINDOW_DESTROYED (window))
1248 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1249 GDK_WINDOW_HWND (window)));
1251 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1252 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1253 WIN32_API_FAILED ("SetWindowPos");
1258 gdk_window_set_hints (GdkWindow *window,
1267 GdkWindowImplWin32 *impl;
1268 WINDOWPLACEMENT size_hints;
1274 g_return_if_fail (window != NULL);
1275 g_return_if_fail (GDK_IS_WINDOW (window));
1277 if (GDK_WINDOW_DESTROYED (window))
1280 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1282 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p %dx%d..%dx%d @+%d+%d\n",
1283 GDK_WINDOW_HWND (window),
1284 min_width, min_height, max_width, max_height,
1287 impl->hint_flags = flags;
1288 size_hints.length = sizeof (size_hints);
1295 geom.min_width = min_width;
1296 geom.min_height = min_height;
1297 geom.max_width = max_width;
1298 geom.max_height = max_height;
1300 if (flags & GDK_HINT_POS)
1302 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1303 WIN32_API_FAILED ("GetWindowPlacement");
1306 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1307 " (%ld,%ld)--(%ld,%ld)\n",
1308 size_hints.rcNormalPosition.left,
1309 size_hints.rcNormalPosition.top,
1310 size_hints.rcNormalPosition.right,
1311 size_hints.rcNormalPosition.bottom));
1312 /* What are the corresponding window coordinates for client
1313 * area coordinates x, y
1317 rect.right = rect.left + 200; /* dummy */
1318 rect.bottom = rect.top + 200;
1319 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1320 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1321 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1322 size_hints.flags = 0;
1323 size_hints.showCmd = SW_SHOWNA;
1325 /* Set the normal position hint to that location, with unchanged
1328 diff = size_hints.rcNormalPosition.left - rect.left;
1329 size_hints.rcNormalPosition.left = rect.left;
1330 size_hints.rcNormalPosition.right -= diff;
1331 diff = size_hints.rcNormalPosition.top - rect.top;
1332 size_hints.rcNormalPosition.top = rect.top;
1333 size_hints.rcNormalPosition.bottom -= diff;
1334 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1335 size_hints.rcNormalPosition.left,
1336 size_hints.rcNormalPosition.top,
1337 size_hints.rcNormalPosition.right,
1338 size_hints.rcNormalPosition.bottom));
1339 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1340 WIN32_API_FAILED ("SetWindowPlacement");
1341 impl->hint_x = rect.left;
1342 impl->hint_y = rect.top;
1346 if (flags & GDK_HINT_MIN_SIZE)
1347 geom_mask |= GDK_HINT_MIN_SIZE;
1349 if (flags & GDK_HINT_MAX_SIZE)
1350 geom_mask |= GDK_HINT_MAX_SIZE;
1352 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1357 gdk_window_set_geometry_hints (GdkWindow *window,
1358 GdkGeometry *geometry,
1359 GdkWindowHints geom_mask)
1361 GdkWindowImplWin32 *impl;
1362 WINDOWPLACEMENT size_hints;
1366 gint new_width = 0, new_height = 0;
1368 g_return_if_fail (window != NULL);
1369 g_return_if_fail (GDK_IS_WINDOW (window));
1371 if (GDK_WINDOW_DESTROYED (window))
1374 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1375 size_hints.length = sizeof (size_hints);
1377 impl->hint_flags = geom_mask;
1379 if (geom_mask & GDK_HINT_POS)
1380 ; /* even the X11 mplementation doesn't care */
1382 if (geom_mask & GDK_HINT_MIN_SIZE)
1386 rect.right = geometry->min_width;
1387 rect.bottom = geometry->min_height;
1388 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1389 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1390 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1391 impl->hint_min_width = rect.right - rect.left;
1392 impl->hint_min_height = rect.bottom - rect.top;
1394 /* Also check if he current size of the window is in bounds */
1395 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1397 if (rect.right < geometry->min_width
1398 && rect.bottom < geometry->min_height)
1400 new_width = geometry->min_width; new_height = geometry->min_height;
1402 else if (rect.right < geometry->min_width)
1404 new_width = geometry->min_width; new_height = rect.bottom;
1406 else if (rect.bottom < geometry->min_height)
1408 new_width = rect.right; new_height = geometry->min_height;
1412 if (geom_mask & GDK_HINT_MAX_SIZE)
1416 rect.right = geometry->max_width;
1417 rect.bottom = geometry->max_height;
1418 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1419 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1420 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1421 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1422 impl->hint_max_width = rect.right - rect.left;
1423 impl->hint_max_height = rect.bottom - rect.top;
1424 /* ... but negative sizes are always wrong */
1425 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1426 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1428 /* Again, check if the window is too large currently. */
1429 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1430 if (rect.right > geometry->max_width
1431 && rect.bottom > geometry->max_height)
1433 new_width = geometry->max_width; new_height = geometry->max_height;
1435 else if (rect.right > geometry->max_width)
1437 new_width = geometry->max_width; new_height = rect.bottom;
1439 else if (rect.bottom > geometry->max_height)
1441 new_width = rect.right; new_height = geometry->max_height;
1445 /* finally apply new size constraints */
1446 if (new_width != 0 && new_height != 0)
1447 gdk_window_resize (window, new_width, new_height);
1449 /* I don't know what to do when called with zero base_width and height. */
1450 if (geom_mask & GDK_HINT_BASE_SIZE
1451 && geometry->base_width > 0
1452 && geometry->base_height > 0)
1454 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1455 WIN32_API_FAILED ("GetWindowPlacement");
1458 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1459 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1460 size_hints.rcNormalPosition.left,
1461 size_hints.rcNormalPosition.top,
1462 size_hints.rcNormalPosition.right,
1463 size_hints.rcNormalPosition.bottom));
1464 size_hints.rcNormalPosition.right =
1465 size_hints.rcNormalPosition.left + geometry->base_width;
1466 size_hints.rcNormalPosition.bottom =
1467 size_hints.rcNormalPosition.top + geometry->base_height;
1468 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1469 size_hints.rcNormalPosition.left,
1470 size_hints.rcNormalPosition.top,
1471 size_hints.rcNormalPosition.right,
1472 size_hints.rcNormalPosition.bottom));
1473 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1474 WIN32_API_FAILED ("SetWindowPlacement");
1478 if (geom_mask & GDK_HINT_RESIZE_INC)
1483 if (geom_mask & GDK_HINT_ASPECT)
1490 gdk_window_set_title (GdkWindow *window,
1495 g_return_if_fail (window != NULL);
1496 g_return_if_fail (GDK_IS_WINDOW (window));
1497 g_return_if_fail (title != NULL);
1499 /* Empty window titles not allowed, so set it to just a period. */
1503 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p %s\n",
1504 GDK_WINDOW_HWND (window), title));
1506 if (!GDK_WINDOW_DESTROYED (window))
1508 /* As the title is in UTF-8 we must translate it
1509 * to the system codepage.
1511 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1512 if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
1513 WIN32_API_FAILED ("SetWindowText");
1520 gdk_window_set_role (GdkWindow *window,
1523 g_return_if_fail (window != NULL);
1524 g_return_if_fail (GDK_IS_WINDOW (window));
1526 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p %s\n",
1527 GDK_WINDOW_HWND (window),
1528 (role ? role : "NULL")));
1533 gdk_window_set_transient_for (GdkWindow *window,
1536 HWND window_id, parent_id;
1538 g_return_if_fail (window != NULL);
1539 g_return_if_fail (GDK_IS_WINDOW (window));
1541 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p %p\n",
1542 GDK_WINDOW_HWND (window),
1543 GDK_WINDOW_HWND (parent)));
1545 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1548 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1550 GDK_NOTE (MISC, g_print ("...a child window!\n"));
1554 window_id = GDK_WINDOW_HWND (window);
1555 parent_id = GDK_WINDOW_HWND (parent);
1557 /* This changes the *owner* of the window, despite the misleading
1558 * name. (Owner and parent are unrelated concepts.) At least that's
1559 * what people who seem to know what they talk about say on
1560 * USENET. Search on Google.
1563 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1564 GetLastError () != 0)
1565 WIN32_API_FAILED ("SetWindowLong");
1569 gdk_window_set_background (GdkWindow *window,
1572 GdkWindowObject *private = (GdkWindowObject *)window;
1574 g_return_if_fail (window != NULL);
1575 g_return_if_fail (GDK_IS_WINDOW (window));
1577 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p %s\n",
1578 GDK_WINDOW_HWND (window),
1579 _gdk_win32_color_to_string (color)));
1581 private->bg_color = *color;
1583 if (private->bg_pixmap &&
1584 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1585 private->bg_pixmap != GDK_NO_BG)
1587 gdk_drawable_unref (private->bg_pixmap);
1588 private->bg_pixmap = NULL;
1593 gdk_window_set_back_pixmap (GdkWindow *window,
1595 gint parent_relative)
1597 GdkWindowObject *private = (GdkWindowObject *)window;
1599 g_return_if_fail (window != NULL);
1600 g_return_if_fail (GDK_IS_WINDOW (window));
1601 g_return_if_fail (pixmap == NULL || !parent_relative);
1602 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1604 if (private->bg_pixmap &&
1605 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1606 private->bg_pixmap != GDK_NO_BG)
1607 gdk_drawable_unref (private->bg_pixmap);
1609 if (parent_relative)
1611 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1612 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1618 gdk_drawable_ref (pixmap);
1619 private->bg_pixmap = pixmap;
1623 private->bg_pixmap = GDK_NO_BG;
1629 gdk_window_set_cursor (GdkWindow *window,
1632 GdkWindowImplWin32 *impl;
1633 GdkCursorPrivate *cursor_private;
1634 GdkWindowObject *parent_window;
1636 HCURSOR hprevcursor;
1638 g_return_if_fail (window != NULL);
1639 g_return_if_fail (GDK_IS_WINDOW (window));
1641 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1642 cursor_private = (GdkCursorPrivate*) cursor;
1644 if (GDK_WINDOW_DESTROYED (window))
1650 hcursor = cursor_private->hcursor;
1652 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p %p\n",
1653 GDK_WINDOW_HWND (window),
1656 /* First get the old cursor, if any (we wait to free the old one
1657 * since it may be the current cursor set in the Win32 API right
1660 hprevcursor = impl->hcursor;
1662 if (hcursor == NULL)
1663 impl->hcursor = NULL;
1666 /* We must copy the cursor as it is OK to destroy the GdkCursor
1667 * while still in use for some window. See for instance
1668 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1669 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1672 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1673 WIN32_API_FAILED ("CopyCursor");
1674 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1675 hcursor, impl->hcursor));
1678 /* If the pointer is over our window, set new cursor if given */
1679 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1680 if (impl->hcursor != NULL)
1681 SetCursor (impl->hcursor);
1683 /* Destroy the previous cursor: Need to make sure it's no longer in
1684 * use before we destroy it, in case we're not over our window but
1685 * the cursor is still set to our old one.
1687 if (hprevcursor != NULL)
1689 if (GetCursor() == hprevcursor)
1691 /* Look for a suitable cursor to use instead */
1693 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1694 while (hcursor == NULL)
1698 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1699 hcursor = impl->hcursor;
1700 parent_window = parent_window->parent;
1704 hcursor = LoadCursor (NULL, IDC_ARROW);
1707 SetCursor (hcursor);
1710 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1713 if (!DestroyCursor (hprevcursor))
1714 WIN32_API_FAILED ("DestroyCursor");
1719 gdk_window_get_geometry (GdkWindow *window,
1726 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1729 window = _gdk_parent_root;
1731 if (!GDK_WINDOW_DESTROYED (window))
1735 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1736 WIN32_API_FAILED ("GetClientRect");
1738 if (window != _gdk_parent_root)
1741 GdkWindow *parent = gdk_window_get_parent (window);
1745 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1746 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1752 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1753 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1763 *width = rect.right - rect.left;
1765 *height = rect.bottom - rect.top;
1767 *depth = gdk_drawable_get_visual (window)->depth;
1772 gdk_window_get_origin (GdkWindow *window,
1780 g_return_val_if_fail (window != NULL, 0);
1782 if (!GDK_WINDOW_DESTROYED (window))
1788 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1801 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1802 GDK_WINDOW_HWND (window),
1808 gdk_window_get_deskrelative_origin (GdkWindow *window,
1812 return gdk_window_get_origin (window, x, y);
1816 gdk_window_get_root_origin (GdkWindow *window,
1822 g_return_if_fail (GDK_IS_WINDOW (window));
1824 gdk_window_get_frame_extents (window, &rect);
1834 gdk_window_get_frame_extents (GdkWindow *window,
1837 GdkWindowObject *private;
1841 g_return_if_fail (GDK_IS_WINDOW (window));
1842 g_return_if_fail (rect != NULL);
1844 private = GDK_WINDOW_OBJECT (window);
1851 if (GDK_WINDOW_DESTROYED (window))
1854 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
1855 private = (GdkWindowObject*) private->parent;
1857 hwnd = GDK_WINDOW_HWND (window);
1859 /* find the frame window */
1860 while (HWND_DESKTOP != GetParent (hwnd))
1862 hwnd = GetParent (hwnd);
1863 g_return_if_fail (NULL != hwnd);
1866 if (!GetWindowRect (hwnd, &r))
1867 WIN32_API_FAILED ("GetWindowRect");
1871 rect->width = r.right - r.left;
1872 rect->height = r.bottom - r.top;
1876 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1880 GdkModifierType *mask)
1882 GdkWindow *return_val;
1883 POINT screen_point, point;
1887 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1890 GetCursorPos (&screen_point);
1891 point = screen_point;
1892 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1897 hwnd = WindowFromPoint (point);
1900 gboolean done = FALSE;
1904 point = screen_point;
1905 ScreenToClient (hwnd, &point);
1906 hwndc = ChildWindowFromPoint (hwnd, point);
1909 else if (hwndc == hwnd)
1915 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
1920 GetKeyboardState (kbd);
1922 if (kbd[VK_SHIFT] & 0x80)
1923 *mask |= GDK_SHIFT_MASK;
1924 if (kbd[VK_CAPITAL] & 0x80)
1925 *mask |= GDK_LOCK_MASK;
1926 if (kbd[VK_CONTROL] & 0x80)
1927 *mask |= GDK_CONTROL_MASK;
1928 if (kbd[VK_MENU] & 0x80)
1929 *mask |= GDK_MOD1_MASK;
1930 if (kbd[VK_LBUTTON] & 0x80)
1931 *mask |= GDK_BUTTON1_MASK;
1932 if (kbd[VK_MBUTTON] & 0x80)
1933 *mask |= GDK_BUTTON2_MASK;
1934 if (kbd[VK_RBUTTON] & 0x80)
1935 *mask |= GDK_BUTTON3_MASK;
1941 _gdk_windowing_get_pointer (GdkDisplay *display,
1945 GdkModifierType *mask)
1947 GdkScreen *default_screen = gdk_display_get_default_screen (display);
1948 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
1950 *screen = default_screen;
1951 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
1955 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1960 POINT point, pointc;
1964 GetCursorPos (&pointc);
1966 hwnd = WindowFromPoint (point);
1970 window = _gdk_parent_root;
1976 ScreenToClient (hwnd, &point);
1979 hwndc = ChildWindowFromPoint (hwnd, point);
1980 ClientToScreen (hwnd, &point);
1981 ScreenToClient (hwndc, &point);
1982 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1984 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1986 if (window && (win_x || win_y))
1988 GetClientRect (hwnd, &rect);
1989 *win_x = point.x - rect.left;
1990 *win_y = point.y - rect.top;
1993 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %p%s\n",
1996 (window == NULL ? " NULL" : "")));
2002 gdk_window_get_events (GdkWindow *window)
2004 g_return_val_if_fail (window != NULL, 0);
2005 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2007 if (GDK_WINDOW_DESTROYED (window))
2010 return GDK_WINDOW_OBJECT (window)->event_mask;
2014 gdk_window_set_events (GdkWindow *window,
2015 GdkEventMask event_mask)
2017 g_return_if_fail (window != NULL);
2018 g_return_if_fail (GDK_IS_WINDOW (window));
2020 if (GDK_WINDOW_DESTROYED (window))
2023 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2024 * set it here, too. Not that I know or remember why it is
2025 * necessary, will have to test some day.
2027 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2031 gdk_window_shape_combine_mask (GdkWindow *window,
2035 g_return_if_fail (window != NULL);
2036 g_return_if_fail (GDK_IS_WINDOW (window));
2040 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p none\n",
2041 GDK_WINDOW_HWND (window)));
2042 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2051 /* Convert mask bitmap to region */
2052 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2054 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p %p\n",
2055 GDK_WINDOW_HWND (window),
2056 GDK_WINDOW_HWND (mask)));
2058 /* SetWindowRgn wants window (not client) coordinates */
2059 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2060 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2061 GetClientRect (GDK_WINDOW_HWND (window), &rect);
2062 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
2063 OffsetRgn (hrgn, -rect.left, -rect.top);
2065 OffsetRgn (hrgn, x, y);
2067 /* If this is a top-level window, add the title bar to the region */
2068 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2070 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2071 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2075 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2080 gdk_window_set_override_redirect (GdkWindow *window,
2081 gboolean override_redirect)
2083 g_return_if_fail (window != NULL);
2084 g_return_if_fail (GDK_IS_WINDOW (window));
2086 g_warning ("gdk_window_set_override_redirect not implemented");
2090 gdk_window_set_icon_list (GdkWindow *window,
2093 g_return_if_fail (GDK_IS_WINDOW (window));
2095 if (GDK_WINDOW_DESTROYED (window))
2098 /* We could convert it to a hIcon and DrawIcon () it when getting
2099 * a WM_PAINT with IsIconic, but is it worth it ? Same probably
2100 * goes for gdk_window_set_icon (). Patches accepted :-) --hb
2101 * Or do we only need to deliver the Icon on WM_GETICON ?
2106 gdk_window_set_icon (GdkWindow *window,
2107 GdkWindow *icon_window,
2111 g_return_if_fail (window != NULL);
2112 g_return_if_fail (GDK_IS_WINDOW (window));
2114 if (GDK_WINDOW_DESTROYED (window))
2117 /* Nothing to do, really. As we share window classes between windows
2118 * we can't have window-specific icons, sorry. Don't print any warning
2124 gdk_window_set_icon_name (GdkWindow *window,
2127 g_return_if_fail (window != NULL);
2128 g_return_if_fail (GDK_IS_WINDOW (window));
2130 if (GDK_WINDOW_DESTROYED (window))
2133 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
2134 WIN32_API_FAILED ("SetWindowText");
2138 gdk_window_set_group (GdkWindow *window,
2141 g_return_if_fail (window != NULL);
2142 g_return_if_fail (GDK_IS_WINDOW (window));
2143 g_return_if_fail (leader != NULL);
2144 g_return_if_fail (GDK_IS_WINDOW (leader));
2146 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2149 g_warning ("gdk_window_set_group not implemented");
2153 gdk_window_set_decorations (GdkWindow *window,
2154 GdkWMDecoration decorations)
2158 g_return_if_fail (window != NULL);
2159 g_return_if_fail (GDK_IS_WINDOW (window));
2161 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p %s%s%s%s%s%s%s\n",
2162 GDK_WINDOW_HWND (window),
2163 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2164 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2165 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2166 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2167 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2168 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2169 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2171 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2173 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2174 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
2176 if (decorations & GDK_DECOR_ALL)
2177 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2178 if (decorations & GDK_DECOR_BORDER)
2179 style |= (WS_BORDER);
2180 if (decorations & GDK_DECOR_RESIZEH)
2181 style |= (WS_THICKFRAME);
2182 if (decorations & GDK_DECOR_TITLE)
2183 style |= (WS_CAPTION);
2184 if (decorations & GDK_DECOR_MENU)
2185 style |= (WS_SYSMENU);
2186 if (decorations & GDK_DECOR_MINIMIZE)
2187 style |= (WS_MINIMIZEBOX);
2188 if (decorations & GDK_DECOR_MAXIMIZE)
2189 style |= (WS_MAXIMIZEBOX);
2191 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2192 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2193 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2194 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2198 gdk_window_set_functions (GdkWindow *window,
2199 GdkWMFunction functions)
2203 g_return_if_fail (window != NULL);
2204 g_return_if_fail (GDK_IS_WINDOW (window));
2206 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p %s%s%s%s%s%s\n",
2207 GDK_WINDOW_HWND (window),
2208 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2209 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2210 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2211 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2212 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2213 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2215 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2217 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2218 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
2221 if (functions & GDK_FUNC_ALL)
2222 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2223 if (functions & GDK_FUNC_RESIZE)
2224 style |= (WS_THICKFRAME);
2225 if (functions & GDK_FUNC_MOVE)
2226 style |= (WS_THICKFRAME);
2227 if (functions & GDK_FUNC_MINIMIZE)
2228 style |= (WS_MINIMIZEBOX);
2229 if (functions & GDK_FUNC_MAXIMIZE)
2230 style |= (WS_MAXIMIZEBOX);
2232 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2233 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2234 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2235 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2239 QueryTree (HWND hwnd,
2249 child = GetWindow (hwnd, GW_CHILD);
2251 child = GetWindow (child, GW_HWNDNEXT);
2254 } while (child != NULL);
2258 *children = g_new (HWND, n);
2259 for (i = 0; i < n; i++)
2262 child = GetWindow (hwnd, GW_CHILD);
2264 child = GetWindow (child, GW_HWNDNEXT);
2265 *children[i] = child;
2271 gdk_propagate_shapes (HANDLE win,
2275 HRGN region, childRegion;
2279 SetRectEmpty (&emptyRect);
2280 region = CreateRectRgnIndirect (&emptyRect);
2282 GetWindowRgn (win, region);
2284 QueryTree (win, &list, &num);
2287 WINDOWPLACEMENT placement;
2289 placement.length = sizeof (WINDOWPLACEMENT);
2290 /* go through all child windows and combine regions */
2291 for (i = 0; i < num; i++)
2293 GetWindowPlacement (list[i], &placement);
2294 if (placement.showCmd == SW_SHOWNORMAL)
2296 childRegion = CreateRectRgnIndirect (&emptyRect);
2297 GetWindowRgn (list[i], childRegion);
2298 CombineRgn (region, region, childRegion, RGN_OR);
2299 DeleteObject (childRegion);
2302 SetWindowRgn (win, region, TRUE);
2306 DeleteObject (region);
2310 gdk_window_set_child_shapes (GdkWindow *window)
2312 g_return_if_fail (window != NULL);
2313 g_return_if_fail (GDK_IS_WINDOW (window));
2315 if (GDK_WINDOW_DESTROYED (window))
2318 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2322 gdk_window_merge_child_shapes (GdkWindow *window)
2324 g_return_if_fail (window != NULL);
2325 g_return_if_fail (GDK_IS_WINDOW (window));
2327 if (GDK_WINDOW_DESTROYED (window))
2330 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2334 gdk_window_set_static_gravities (GdkWindow *window,
2335 gboolean use_static)
2337 GdkWindowObject *private = (GdkWindowObject *)window;
2339 g_return_val_if_fail (window != NULL, FALSE);
2340 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2342 if (!use_static == !private->guffaw_gravity)
2348 private->guffaw_gravity = use_static;
2354 * Setting window states
2357 gdk_window_iconify (GdkWindow *window)
2359 HWND old_active_window;
2361 g_return_if_fail (window != NULL);
2362 g_return_if_fail (GDK_IS_WINDOW (window));
2364 if (GDK_WINDOW_DESTROYED (window))
2367 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p %s\n",
2368 GDK_WINDOW_HWND (window),
2369 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2371 if (GDK_WINDOW_IS_MAPPED (window))
2373 old_active_window = GetActiveWindow ();
2374 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2375 if (old_active_window != GDK_WINDOW_HWND (window))
2376 SetActiveWindow (old_active_window);
2380 gdk_synthesize_window_state (window,
2382 GDK_WINDOW_STATE_ICONIFIED);
2387 gdk_window_deiconify (GdkWindow *window)
2389 g_return_if_fail (window != NULL);
2390 g_return_if_fail (GDK_IS_WINDOW (window));
2392 if (GDK_WINDOW_DESTROYED (window))
2395 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p %s\n",
2396 GDK_WINDOW_HWND (window),
2397 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2399 if (GDK_WINDOW_IS_MAPPED (window))
2401 show_window_internal (window, FALSE, TRUE);
2405 gdk_synthesize_window_state (window,
2406 GDK_WINDOW_STATE_ICONIFIED,
2412 gdk_window_stick (GdkWindow *window)
2414 g_return_if_fail (GDK_IS_WINDOW (window));
2416 if (GDK_WINDOW_DESTROYED (window))
2419 /* FIXME: Do something? */
2423 gdk_window_unstick (GdkWindow *window)
2425 g_return_if_fail (GDK_IS_WINDOW (window));
2427 if (GDK_WINDOW_DESTROYED (window))
2430 /* FIXME: Do something? */
2434 gdk_window_maximize (GdkWindow *window)
2436 g_return_if_fail (GDK_IS_WINDOW (window));
2438 if (GDK_WINDOW_DESTROYED (window))
2441 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p %s\n",
2442 GDK_WINDOW_HWND (window),
2443 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2445 if (GDK_WINDOW_IS_MAPPED (window))
2446 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2448 gdk_synthesize_window_state (window,
2450 GDK_WINDOW_STATE_MAXIMIZED);
2454 gdk_window_unmaximize (GdkWindow *window)
2456 g_return_if_fail (GDK_IS_WINDOW (window));
2458 if (GDK_WINDOW_DESTROYED (window))
2461 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p %s\n",
2462 GDK_WINDOW_HWND (window),
2463 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2465 if (GDK_WINDOW_IS_MAPPED (window))
2466 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2468 gdk_synthesize_window_state (window,
2469 GDK_WINDOW_STATE_MAXIMIZED,
2474 gdk_window_fullscreen (GdkWindow *window)
2476 g_return_if_fail (GDK_IS_WINDOW (window));
2478 g_warning ("gdk_window_fullscreen() not implemented.\n");
2482 gdk_window_unfullscreen (GdkWindow *window)
2484 g_return_if_fail (GDK_IS_WINDOW (window));
2488 gdk_window_focus (GdkWindow *window,
2491 g_return_if_fail (GDK_IS_WINDOW (window));
2493 if (GDK_WINDOW_DESTROYED (window))
2496 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p %s\n",
2497 GDK_WINDOW_HWND (window),
2498 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2500 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
2501 SetFocus (GDK_WINDOW_HWND (window));
2505 gdk_window_set_modal_hint (GdkWindow *window,
2508 GdkWindowObject *private;
2510 g_return_if_fail (window != NULL);
2511 g_return_if_fail (GDK_IS_WINDOW (window));
2513 if (GDK_WINDOW_DESTROYED (window))
2516 private = (GdkWindowObject*) window;
2518 private->modal_hint = modal;
2520 if (GDK_WINDOW_IS_MAPPED (window))
2521 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST,
2522 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE))
2523 WIN32_API_FAILED ("SetWindowPos");
2527 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2528 gboolean skips_taskbar)
2530 g_return_if_fail (GDK_IS_WINDOW (window));
2534 gdk_window_set_skip_pager_hint (GdkWindow *window,
2535 gboolean skips_pager)
2537 g_return_if_fail (GDK_IS_WINDOW (window));
2541 gdk_window_set_type_hint (GdkWindow *window,
2542 GdkWindowTypeHint hint)
2544 g_return_if_fail (window != NULL);
2545 g_return_if_fail (GDK_IS_WINDOW (window));
2547 if (GDK_WINDOW_DESTROYED (window))
2552 case GDK_WINDOW_TYPE_HINT_DIALOG:
2554 case GDK_WINDOW_TYPE_HINT_MENU:
2556 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
2559 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
2561 case GDK_WINDOW_TYPE_HINT_NORMAL:
2567 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p\n",
2568 GDK_WINDOW_HWND (window)));
2572 gdk_window_shape_combine_region (GdkWindow *window,
2573 GdkRegion *shape_region,
2577 g_return_if_fail (GDK_IS_WINDOW (window));
2579 if (GDK_WINDOW_DESTROYED (window))
2582 /* XXX: even on X implemented conditional ... */
2586 gdk_window_begin_resize_drag (GdkWindow *window,
2593 g_return_if_fail (GDK_IS_WINDOW (window));
2595 if (GDK_WINDOW_DESTROYED (window))
2598 /* XXX: isn't all this default on win32 ... */
2602 gdk_window_begin_move_drag (GdkWindow *window,
2608 g_return_if_fail (GDK_IS_WINDOW (window));
2610 if (GDK_WINDOW_DESTROYED (window))
2613 /* XXX: isn't all this default on win32 ... */
2617 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2619 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
2621 return gdk_window_lookup (anid);