1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-1999 Tor Lillqvist
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
23 * file for a list of people on the GTK+ Team. See the ChangeLog
24 * files for a list of changes. These files are distributed with
25 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdk.h" /* gdk_rectangle_intersect */
31 #include "gdkevents.h"
32 #include "gdkpixmap.h"
33 #include "gdkwindow.h"
34 #include "gdkinternals.h"
35 #include "gdkprivate-win32.h"
36 #include "gdkinput-win32.h"
38 static gboolean gdk_window_gravity_works (void);
39 static void gdk_window_set_static_win_gravity (GdkWindow *window,
42 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
43 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
45 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
48 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
49 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
50 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
51 static void gdk_window_impl_win32_finalize (GObject *object);
53 static gpointer parent_class = NULL;
56 _gdk_window_impl_win32_get_type (void)
58 static GType object_type = 0;
62 static const GTypeInfo object_info =
64 sizeof (GdkWindowImplWin32Class),
66 (GBaseFinalizeFunc) NULL,
67 (GClassInitFunc) gdk_window_impl_win32_class_init,
68 NULL, /* class_finalize */
69 NULL, /* class_data */
70 sizeof (GdkWindowImplWin32),
72 (GInstanceInitFunc) gdk_window_impl_win32_init,
75 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
84 _gdk_window_impl_get_type (void)
86 return _gdk_window_impl_win32_get_type ();
90 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
98 impl->extension_events_selected = FALSE;
99 impl->input_locale = GetKeyboardLayout (0);
100 TranslateCharsetInfo ((DWORD FAR *) GetACP (), &impl->charset_info,
105 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
107 GObjectClass *object_class = G_OBJECT_CLASS (klass);
108 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
110 parent_class = g_type_class_peek_parent (klass);
112 object_class->finalize = gdk_window_impl_win32_finalize;
114 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
115 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
116 drawable_class->get_size = gdk_window_impl_win32_get_size;
118 /* Visible and clip regions are the same */
119 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
120 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
124 gdk_window_impl_win32_finalize (GObject *object)
126 GdkWindowObject *wrapper;
127 GdkDrawableImplWin32 *draw_impl;
128 GdkWindowImplWin32 *window_impl;
130 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
132 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
133 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
135 wrapper = (GdkWindowObject*) draw_impl->wrapper;
137 if (!GDK_WINDOW_DESTROYED (wrapper))
139 gdk_win32_handle_table_remove (draw_impl->handle);
142 if (window_impl->hcursor != NULL)
144 if (!DestroyCursor (window_impl->hcursor))
145 WIN32_GDI_FAILED("DestroyCursor");
146 window_impl->hcursor = NULL;
149 G_OBJECT_CLASS (parent_class)->finalize (object);
153 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
155 GdkDrawableImplWin32 *drawable_impl;
156 GdkWindowImplWin32 *window_impl;
158 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
160 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
161 window_impl = GDK_WINDOW_IMPL_WIN32 (drawable);
163 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
164 drawable_impl->colormap == NULL)
166 drawable_impl->colormap = gdk_colormap_get_system ();
167 gdk_colormap_ref (drawable_impl->colormap);
170 return drawable_impl->colormap;
174 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
177 GdkWindowImplWin32 *impl;
178 GdkDrawableImplWin32 *draw_impl;
180 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
181 g_return_if_fail (gdk_colormap_get_visual (cmap) != gdk_drawable_get_visual (drawable));
183 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
184 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
186 GDK_DRAWABLE_GET_CLASS (draw_impl)->set_colormap (drawable, cmap);
189 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
193 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
197 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
200 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
202 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
206 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
208 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
209 GdkRectangle result_rect;
213 result_rect.width = impl->width;
214 result_rect.height = impl->height;
216 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
218 return gdk_region_rectangle (&result_rect);
222 _gdk_windowing_window_init (void)
224 GdkWindowObject *private;
225 GdkWindowImplWin32 *impl;
226 GdkDrawableImplWin32 *draw_impl;
231 g_assert (_gdk_parent_root == NULL);
233 SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
234 width = rect.right - rect.left;
235 height = rect.bottom - rect.top;
237 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
238 private = (GdkWindowObject *)_gdk_parent_root;
239 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
240 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
242 draw_impl->handle = gdk_root_window;
243 draw_impl->wrapper = GDK_DRAWABLE (private);
245 private->window_type = GDK_WINDOW_ROOT;
246 private->depth = gdk_visual_get_system ()->depth;
248 impl->height = height;
250 gdk_win32_handle_table_insert (&gdk_root_window, _gdk_parent_root);
253 /* The Win API function AdjustWindowRect may return negative values
254 * resulting in obscured title bars. This helper function is coreccting it.
257 SafeAdjustWindowRectEx (RECT* lpRect,
262 if (!AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle))
264 WIN32_API_FAILED ("AdjustWindowRectEx");
267 if (lpRect->left < 0)
269 lpRect->right -= lpRect->left;
274 lpRect->bottom -= lpRect->top;
281 * is a wrapper function for RegisterWindowClassEx.
282 * It creates at least one unique class for every
283 * GdkWindowType. If support for single window-specific icons
284 * is ever needed (e.g Dialog specific), every such window should
288 RegisterGdkClass (GdkWindowType wtype)
290 static ATOM klassTOPLEVEL = 0;
291 static ATOM klassDIALOG = 0;
292 static ATOM klassCHILD = 0;
293 static ATOM klassTEMP = 0;
294 static HICON hAppIcon = NULL;
295 static WNDCLASSEX wcl;
298 wcl.cbSize = sizeof(WNDCLASSEX);
299 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
300 * on WM_SIZE and WM_MOVE. Flicker, Performance!
302 wcl.lpfnWndProc = _gdk_win32_window_procedure;
305 wcl.hInstance = gdk_app_hmodule;
307 /* initialize once! */
310 gchar sLoc [_MAX_PATH+1];
312 if (0 != GetModuleFileName (gdk_app_hmodule, sLoc, _MAX_PATH))
314 hAppIcon = ExtractIcon (gdk_app_hmodule, sLoc, 0);
317 char *gdklibname = g_strdup_printf ("gdk-%s.dll", GDK_VERSION);
319 hAppIcon = ExtractIcon (gdk_app_hmodule, gdklibname, 0);
324 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
328 wcl.lpszMenuName = NULL;
331 /* initialize once per class */
333 * HB: Setting the background brush leads to flicker, because we
334 * don't get asked how to clear the background. This is not what
335 * we want, at least not for input_only windows ...
337 #define ONCE_PER_CLASS() \
338 wcl.hIcon = CopyIcon (hAppIcon); \
339 wcl.hIconSm = CopyIcon (hAppIcon); \
340 wcl.hbrBackground = NULL; /* CreateSolidBrush (RGB (0,0,0)); */ \
341 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
345 case GDK_WINDOW_TOPLEVEL:
346 if (0 == klassTOPLEVEL)
348 wcl.lpszClassName = "gdkWindowToplevel";
351 klassTOPLEVEL = RegisterClassEx (&wcl);
353 klass = klassTOPLEVEL;
356 case GDK_WINDOW_CHILD:
359 wcl.lpszClassName = "gdkWindowChild";
361 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
363 klassCHILD = RegisterClassEx (&wcl);
368 case GDK_WINDOW_DIALOG:
369 if (0 == klassDIALOG)
371 wcl.lpszClassName = "gdkWindowDialog";
372 wcl.style |= CS_SAVEBITS;
374 klassDIALOG = RegisterClassEx (&wcl);
379 case GDK_WINDOW_TEMP:
382 wcl.lpszClassName = "gdkWindowTemp";
383 wcl.style |= CS_SAVEBITS;
385 klassTEMP = RegisterClassEx (&wcl);
391 g_assert_not_reached ();
397 WIN32_API_FAILED ("RegisterClassEx");
398 g_error ("That is a fatal error");
404 gdk_window_new (GdkWindow *parent,
405 GdkWindowAttr *attributes,
406 gint attributes_mask)
409 GdkWindowObject *private;
410 GdkWindowImplWin32 *impl;
411 GdkDrawableImplWin32 *draw_impl;
417 DWORD dwStyle, dwExStyle;
426 g_return_val_if_fail (attributes != NULL, NULL);
429 parent = _gdk_parent_root;
431 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
434 g_print ("gdk_window_new: %s\n",
435 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
436 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
437 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
438 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
441 if (GDK_WINDOW_DESTROYED (parent))
444 hparent = GDK_WINDOW_HWND (parent);
446 window = g_object_new (GDK_TYPE_WINDOW, NULL);
447 private = (GdkWindowObject *)window;
448 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
449 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
450 draw_impl->wrapper = GDK_DRAWABLE (window);
452 /* Windows with a foreign parent are treated as if they are children
453 * of the root window, except for actual creation.
455 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
456 parent = _gdk_parent_root;
458 private->parent = (GdkWindowObject *)parent;
460 if (attributes_mask & GDK_WA_X)
465 if (attributes_mask & GDK_WA_Y)
467 else if (attributes_mask & GDK_WA_X)
468 y = 100; /* ??? We must put it somewhere... */
470 y = 0; /* x is CW_USEDEFAULT, y doesn't matter then */
474 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
475 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
476 impl->extension_events_selected = FALSE;
477 private->window_type = attributes->window_type;
479 _gdk_window_init_position (GDK_WINDOW (private));
480 if (impl->position_info.big)
481 private->guffaw_gravity = TRUE;
483 if (attributes_mask & GDK_WA_VISUAL)
484 visual = attributes->visual;
486 visual = gdk_visual_get_system ();
487 xvisual = ((GdkVisualPrivate*) visual)->xvisual;
489 if (attributes_mask & GDK_WA_TITLE)
490 title = attributes->title;
492 title = g_get_prgname ();
493 if (!title || !*title)
494 title = "GDK client window";
496 impl->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
498 if (private->parent && private->parent->guffaw_gravity)
503 if (attributes->wclass == GDK_INPUT_OUTPUT)
507 private->input_only = FALSE;
508 private->depth = visual->depth;
510 if (attributes_mask & GDK_WA_COLORMAP)
512 draw_impl->colormap = attributes->colormap;
513 gdk_colormap_ref (attributes->colormap);
517 if ((((GdkVisualPrivate*)gdk_visual_get_system ())->xvisual) == xvisual)
519 draw_impl->colormap = gdk_colormap_get_system ();
520 gdk_colormap_ref (draw_impl->colormap);
521 GDK_NOTE (MISC, g_print ("...using system colormap %p\n",
522 draw_impl->colormap));
526 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
527 GDK_NOTE (MISC, g_print ("...using new colormap %p\n",
528 draw_impl->colormap));
534 dwExStyle = WS_EX_TRANSPARENT;
536 private->input_only = TRUE;
537 draw_impl->colormap = gdk_colormap_get_system ();
538 gdk_colormap_ref (draw_impl->colormap);
539 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap\n"));
543 private->parent->children = g_list_prepend (private->parent->children, window);
545 switch (private->window_type)
547 case GDK_WINDOW_TOPLEVEL:
548 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
549 hparent = gdk_root_window;
552 case GDK_WINDOW_CHILD:
553 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
556 case GDK_WINDOW_DIALOG:
557 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
559 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
561 hparent = gdk_root_window;
564 case GDK_WINDOW_TEMP:
565 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
566 /* a temp window is not necessarily a top level window */
567 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
568 dwExStyle |= WS_EX_TOOLWINDOW;
571 case GDK_WINDOW_ROOT:
572 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
576 klass = RegisterGdkClass (private->window_type);
578 if (private->window_type != GDK_WINDOW_CHILD)
580 if (x == CW_USEDEFAULT)
591 rect.right = rect.left + impl->width;
592 rect.bottom = rect.top + impl->height;
594 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
596 if (x != CW_USEDEFAULT)
601 width = rect.right - rect.left;
602 height = rect.bottom - rect.top;
607 height = impl->height;
610 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
612 #ifdef WITHOUT_WM_CREATE
613 draw_impl->handle = CreateWindowEx (dwExStyle,
614 MAKEINTRESOURCE(klass),
617 impl->position_info.x, impl->position_info.y,
618 impl->position_info.width, impl->position_info.height,
626 CreateWindowEx (dwExStyle,
627 MAKEINTRESOURCE(klass),
630 impl->position_info.x, impl->position_info.y,
631 impl->position_info.width, impl->position_info.height,
636 if (GDK_WINDOW_HWND (window) != hwndNew)
638 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%#x, %#x) HWND mismatch.",
639 (guint) GDK_WINDOW_HWND (window),
642 /* HB: IHMO due to a race condition the handle was increased by
643 * one, which causes much trouble. Because I can't find the
644 * real bug, try to workaround it ...
645 * To reproduce: compile with MSVC 5, DEBUG=1
648 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
649 GDK_WINDOW_HWND (window) = hwndNew;
650 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
652 /* the old behaviour, but with warning */
653 GDK_WINDOW_HWND (window) = hwndNew;
658 gdk_drawable_ref (window);
659 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
663 g_print ("... \"%s\" %dx%d@+%d+%d %#x = %#x\n"
664 "... locale %#x codepage %d\n",
666 width, height, (x == CW_USEDEFAULT ? -9999 : x), y,
668 (guint) GDK_WINDOW_HWND (window),
669 (guint) impl->input_locale,
670 (guint) impl->charset_info.ciACP));
674 if (draw_impl->handle == NULL)
676 WIN32_API_FAILED ("CreateWindowEx");
677 g_object_unref ((GObject *) window);
681 #ifdef WITHOUT_WM_CREATE
682 gdk_drawable_ref (window);
683 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
686 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
687 (attributes->cursor) :
694 gdk_window_foreign_new (GdkNativeWindow anid)
697 GdkWindowObject *private;
698 GdkWindowImplWin32 *impl;
699 GdkDrawableImplWin32 *draw_impl;
705 window = g_object_new (GDK_TYPE_WINDOW, NULL);
706 private = (GdkWindowObject *)window;
707 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
708 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
709 draw_impl->wrapper = GDK_DRAWABLE (window);
710 parent = GetParent ((HWND)anid);
712 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
713 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
714 private->parent = (GdkWindowObject *)_gdk_parent_root;
716 private->parent->children = g_list_prepend (private->parent->children, window);
718 draw_impl->handle = (HWND) anid;
719 GetClientRect ((HWND) anid, &rect);
721 point.y = rect.right;
722 ClientToScreen ((HWND) anid, &point);
723 if (parent != gdk_root_window)
724 ScreenToClient (parent, &point);
725 private->x = point.x;
726 private->y = point.y;
727 impl->width = rect.right - rect.left;
728 impl->height = rect.bottom - rect.top;
729 private->window_type = GDK_WINDOW_FOREIGN;
730 private->destroyed = FALSE;
731 if (IsWindowVisible ((HWND) anid))
732 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
734 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
735 private->depth = gdk_visual_get_system ()->depth;
737 gdk_drawable_ref (window);
738 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
744 gdk_window_lookup (GdkNativeWindow hwnd)
746 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
750 _gdk_windowing_window_destroy (GdkWindow *window,
752 gboolean foreign_destroy)
754 GdkWindowObject *private = (GdkWindowObject *)window;
756 g_return_if_fail (GDK_IS_WINDOW (window));
758 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy %#x\n",
759 (guint) GDK_WINDOW_HWND (window)));
761 if (private->extension_events != 0)
762 gdk_input_window_destroy (window);
764 if (private->window_type == GDK_WINDOW_FOREIGN)
766 if (!foreign_destroy && (private->parent != NULL))
768 /* It's somebody else's window, but in our hierarchy,
769 * so reparent it to the root window, and then call
770 * DestroyWindow() on it.
772 gdk_window_hide (window);
773 gdk_window_reparent (window, NULL, 0, 0);
775 /* Is this too drastic? Many (most?) applications
776 * quit if any window receives WM_QUIT I think.
777 * OTOH, I don't think foreign windows are much
778 * used, so the question is maybe academic.
780 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
783 else if (!recursing && !foreign_destroy)
785 private->destroyed = TRUE;
786 DestroyWindow (GDK_WINDOW_HWND (window));
790 /* This function is called when the window really gone.
793 gdk_window_destroy_notify (GdkWindow *window)
795 g_return_if_fail (window != NULL);
796 g_return_if_fail (GDK_IS_WINDOW (window));
799 g_print ("gdk_window_destroy_notify: %#x %s\n",
800 (guint) GDK_WINDOW_HWND (window),
801 (GDK_WINDOW_DESTROYED (window) ? "(destroyed)" : "")));
803 if (!GDK_WINDOW_DESTROYED (window))
805 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
806 g_warning ("window %#x unexpectedly destroyed",
807 (guint) GDK_WINDOW_HWND (window));
809 _gdk_window_destroy (window, TRUE);
812 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
813 gdk_drawable_unref (window);
817 show_window_internal (GdkWindow *window,
820 GdkWindowObject *private;
822 private = GDK_WINDOW_OBJECT (window);
824 if (!private->destroyed)
826 GDK_NOTE (MISC, g_print ("gdk_window_show: %#x\n",
827 (guint) GDK_WINDOW_HWND (window)));
829 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
830 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
832 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
833 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
834 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
836 /* Don't put on toolbar */
837 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
842 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
844 SetWindowPos(GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0,
845 SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE);
849 GdkWindow *parent = GDK_WINDOW (private->parent);
851 /* Todo: GDK_WINDOW_STATE_STICKY */
852 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
853 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMINIMIZED);
854 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
855 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
858 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
859 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
861 if (parent == _gdk_parent_root)
862 SetForegroundWindow (GDK_WINDOW_HWND (window));
864 BringWindowToTop (GDK_WINDOW_HWND (window));
866 ShowOwnedPopups (GDK_WINDOW_HWND (window), TRUE);
874 gdk_window_show_unraised (GdkWindow *window)
876 g_return_if_fail (GDK_IS_WINDOW (window));
878 show_window_internal (window, FALSE);
882 gdk_window_show (GdkWindow *window)
884 g_return_if_fail (GDK_IS_WINDOW (window));
886 show_window_internal (window, TRUE);
890 gdk_window_hide (GdkWindow *window)
892 GdkWindowObject *private;
894 g_return_if_fail (window != NULL);
896 private = (GdkWindowObject*) window;
897 if (!private->destroyed)
899 GDK_NOTE (MISC, g_print ("gdk_window_hide: %#x\n",
900 (guint) GDK_WINDOW_HWND (window)));
902 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
903 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
904 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
906 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
908 SetWindowPos(GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
909 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
913 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
919 gdk_window_withdraw (GdkWindow *window)
921 GdkWindowObject *private;
923 g_return_if_fail (window != NULL);
925 private = (GdkWindowObject*) window;
926 if (!private->destroyed)
928 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %#x\n",
929 (guint) GDK_WINDOW_HWND (window)));
931 gdk_window_hide (window); /* ??? */
936 gdk_window_move (GdkWindow *window,
940 GdkWindowObject *private = (GdkWindowObject *)window;
941 GdkWindowImplWin32 *impl;
943 g_return_if_fail (window != NULL);
944 g_return_if_fail (GDK_IS_WINDOW (window));
946 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
948 if (!GDK_WINDOW_DESTROYED (window))
950 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
951 _gdk_window_move_resize_child (window, x, y,
952 impl->width, impl->height);
955 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
956 x, y, impl->width, impl->height,
957 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER))
958 WIN32_API_FAILED ("SetWindowPos");
964 gdk_window_resize (GdkWindow *window,
968 GdkWindowObject *private = (GdkWindowObject*) window;
969 GdkWindowImplWin32 *impl;
972 g_return_if_fail (window != NULL);
973 g_return_if_fail (GDK_IS_WINDOW (window));
980 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
982 if (!GDK_WINDOW_DESTROYED (window))
984 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
985 _gdk_window_move_resize_child (window, private->x, private->y,
996 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
999 rect.right = pt.x + width;
1000 rect.bottom = pt.y + height;
1002 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1003 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1004 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1005 WIN32_API_FAILED ("AdjustWindowRectEx");
1009 width = rect.right - rect.left;
1010 height = rect.bottom - rect.top;
1011 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1012 x, y, width, height,
1013 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER))
1014 WIN32_API_FAILED ("SetWindowPos");
1016 private->resize_count += 1;
1021 gdk_window_move_resize (GdkWindow *window,
1027 GdkWindowObject *private = (GdkWindowObject*) window;
1028 GdkWindowImplWin32 *impl;
1030 g_return_if_fail (window != NULL);
1031 g_return_if_fail (GDK_IS_WINDOW (window));
1038 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1040 if (!private->destroyed)
1046 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %#x %dx%d@+%d+%d\n",
1047 (guint) GDK_WINDOW_HWND (window),
1048 width, height, x, y));
1050 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1051 _gdk_window_move_resize_child (window, x, y, width, height);
1056 rect.right = x + width;
1057 rect.bottom = y + height;
1059 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1060 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1061 if (!AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle))
1062 WIN32_API_FAILED ("AdjustWindowRectEx");
1064 GDK_NOTE (MISC, g_print ("...SetWindowPos(%#x,%ldx%ld@+%ld+%ld)\n",
1065 (guint) GDK_WINDOW_HWND (window),
1066 rect.right - rect.left, rect.bottom - rect.top,
1067 rect.left, rect.top));
1068 if (!SetWindowPos (GDK_WINDOW_HWND (window), NULL,
1069 rect.left, rect.top,
1070 rect.right - rect.left, rect.bottom - rect.top,
1071 SWP_NOACTIVATE | SWP_NOZORDER))
1072 WIN32_API_FAILED ("SetWindowPos");
1078 gdk_window_reparent (GdkWindow *window,
1079 GdkWindow *new_parent,
1083 GdkWindowObject *window_private;
1084 GdkWindowObject *parent_private;
1085 GdkWindowObject *old_parent_private;
1086 GdkWindowImplWin32 *impl;
1088 g_return_if_fail (window != NULL);
1091 new_parent = _gdk_parent_root;
1093 window_private = (GdkWindowObject*) window;
1094 old_parent_private = (GdkWindowObject *) window_private->parent;
1095 parent_private = (GdkWindowObject*) new_parent;
1096 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1098 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1100 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %#x %#x\n",
1101 (guint) GDK_WINDOW_HWND (window),
1102 (guint) GDK_WINDOW_HWND (new_parent)));
1103 if (!SetParent (GDK_WINDOW_HWND (window),
1104 GDK_WINDOW_HWND (new_parent)))
1105 WIN32_API_FAILED ("SetParent");
1107 if (!MoveWindow (GDK_WINDOW_HWND (window),
1108 x, y, impl->width, impl->height, TRUE))
1109 WIN32_API_FAILED ("MoveWindow");
1112 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1115 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1116 new_parent = _gdk_parent_root;
1118 window_private->parent = (GdkWindowObject *)new_parent;
1120 if (old_parent_private)
1121 old_parent_private->children =
1122 g_list_remove (old_parent_private->children, window);
1124 if ((old_parent_private &&
1125 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1126 (!old_parent_private && parent_private->guffaw_gravity))
1127 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1129 parent_private->children = g_list_prepend (parent_private->children, window);
1133 _gdk_windowing_window_clear_area (GdkWindow *window,
1139 GdkWindowImplWin32 *impl;
1141 g_return_if_fail (window != NULL);
1142 g_return_if_fail (GDK_IS_WINDOW (window));
1144 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1146 if (!GDK_WINDOW_DESTROYED (window))
1151 width = impl->width - x;
1153 height = impl->height - y;
1154 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: "
1155 "%#x %dx%d@+%d+%d\n",
1156 (guint) GDK_WINDOW_HWND (window),
1157 width, height, x, y));
1158 hdc = GetDC (GDK_WINDOW_HWND (window));
1159 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1160 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1161 ReleaseDC (GDK_WINDOW_HWND (window), hdc);
1166 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1172 g_return_if_fail (window != NULL);
1173 g_return_if_fail (GDK_IS_WINDOW (window));
1175 if (!GDK_WINDOW_DESTROYED (window))
1179 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: "
1180 "%#x %dx%d@+%d+%d\n",
1181 (guint) GDK_WINDOW_HWND (window),
1182 width, height, x, y));
1185 rect.right = x + width + 1;
1187 rect.bottom = y + height + 1;
1188 if (!InvalidateRect (GDK_WINDOW_HWND (window), &rect, TRUE))
1189 WIN32_GDI_FAILED ("InvalidateRect");
1190 UpdateWindow (GDK_WINDOW_HWND (window));
1195 gdk_window_raise (GdkWindow *window)
1197 g_return_if_fail (window != NULL);
1198 g_return_if_fail (GDK_IS_WINDOW (window));
1200 if (!GDK_WINDOW_DESTROYED (window))
1202 GDK_NOTE (MISC, g_print ("gdk_window_raise: %#x\n",
1203 (guint) GDK_WINDOW_HWND (window)));
1205 if (!BringWindowToTop (GDK_WINDOW_HWND (window)))
1206 WIN32_API_FAILED ("BringWindowToTop");
1211 gdk_window_lower (GdkWindow *window)
1213 g_return_if_fail (window != NULL);
1214 g_return_if_fail (GDK_IS_WINDOW (window));
1216 if (!GDK_WINDOW_DESTROYED (window))
1218 GDK_NOTE (MISC, g_print ("gdk_window_lower: %#x\n",
1219 (guint) GDK_WINDOW_HWND (window)));
1221 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1222 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE))
1223 WIN32_API_FAILED ("SetWindowPos");
1228 gdk_window_set_hints (GdkWindow *window,
1237 GdkWindowImplWin32 *impl;
1238 WINDOWPLACEMENT size_hints;
1244 g_return_if_fail (window != NULL);
1245 g_return_if_fail (GDK_IS_WINDOW (window));
1247 if (GDK_WINDOW_DESTROYED (window))
1250 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1252 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %#x %dx%d..%dx%d @+%d+%d\n",
1253 (guint) GDK_WINDOW_HWND (window),
1254 min_width, min_height, max_width, max_height,
1257 impl->hint_flags = flags;
1258 size_hints.length = sizeof (size_hints);
1262 if (flags & GDK_HINT_POS)
1264 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1265 WIN32_API_FAILED ("GetWindowPlacement");
1268 GDK_NOTE (MISC, g_print ("...rcNormalPosition:"
1269 " (%ld,%ld)--(%ld,%ld)\n",
1270 size_hints.rcNormalPosition.left,
1271 size_hints.rcNormalPosition.top,
1272 size_hints.rcNormalPosition.right,
1273 size_hints.rcNormalPosition.bottom));
1274 /* What are the corresponding window coordinates for client
1275 * area coordinates x, y
1279 rect.right = rect.left + 200; /* dummy */
1280 rect.bottom = rect.top + 200;
1281 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1282 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1283 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1284 size_hints.flags = 0;
1285 size_hints.showCmd = SW_SHOWNA;
1287 /* Set the normal position hint to that location, with unchanged
1290 diff = size_hints.rcNormalPosition.left - rect.left;
1291 size_hints.rcNormalPosition.left = rect.left;
1292 size_hints.rcNormalPosition.right -= diff;
1293 diff = size_hints.rcNormalPosition.top - rect.top;
1294 size_hints.rcNormalPosition.top = rect.top;
1295 size_hints.rcNormalPosition.bottom -= diff;
1296 GDK_NOTE (MISC, g_print ("...setting: (%ld,%ld)--(%ld,%ld)\n",
1297 size_hints.rcNormalPosition.left,
1298 size_hints.rcNormalPosition.top,
1299 size_hints.rcNormalPosition.right,
1300 size_hints.rcNormalPosition.bottom));
1301 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1302 WIN32_API_FAILED ("SetWindowPlacement");
1303 impl->hint_x = rect.left;
1304 impl->hint_y = rect.top;
1308 if (flags & GDK_HINT_MIN_SIZE)
1312 rect.right = min_width;
1313 rect.bottom = min_height;
1314 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1315 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1316 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1317 impl->hint_min_width = rect.right - rect.left;
1318 impl->hint_min_height = rect.bottom - rect.top;
1320 /* Also check if he current size of the window is in bounds. */
1321 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1322 if (rect.right < min_width && rect.bottom < min_height)
1323 gdk_window_resize (window, min_width, min_height);
1324 else if (rect.right < min_width)
1325 gdk_window_resize (window, min_width, rect.bottom);
1326 else if (rect.bottom < min_height)
1327 gdk_window_resize (window, rect.right, min_height);
1330 if (flags & GDK_HINT_MAX_SIZE)
1334 rect.right = max_width;
1335 rect.bottom = max_height;
1336 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1337 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1338 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1339 impl->hint_max_width = rect.right - rect.left;
1340 impl->hint_max_height = rect.bottom - rect.top;
1341 /* Again, check if the window is too large currently. */
1342 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1343 if (rect.right > max_width && rect.bottom > max_height)
1344 gdk_window_resize (window, max_width, max_height);
1345 else if (rect.right > max_width)
1346 gdk_window_resize (window, max_width, rect.bottom);
1347 else if (rect.bottom > max_height)
1348 gdk_window_resize (window, rect.right, max_height);
1354 gdk_window_set_geometry_hints (GdkWindow *window,
1355 GdkGeometry *geometry,
1356 GdkWindowHints geom_mask)
1358 GdkWindowImplWin32 *impl;
1359 WINDOWPLACEMENT size_hints;
1364 g_return_if_fail (window != NULL);
1365 g_return_if_fail (GDK_IS_WINDOW (window));
1367 if (GDK_WINDOW_DESTROYED (window))
1370 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1371 size_hints.length = sizeof (size_hints);
1373 impl->hint_flags = geom_mask;
1375 if (geom_mask & GDK_HINT_POS)
1376 ; /* even the X11 mplementation doesn't care */
1378 if (geom_mask & GDK_HINT_MIN_SIZE)
1382 rect.right = geometry->min_width;
1383 rect.bottom = geometry->min_height;
1384 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1385 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1386 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1387 impl->hint_min_width = rect.right - rect.left;
1388 impl->hint_min_height = rect.bottom - rect.top;
1390 /* Also check if he current size of the window is in bounds */
1391 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1392 if (rect.right < geometry->min_width
1393 && rect.bottom < geometry->min_height)
1394 gdk_window_resize (window, geometry->min_width, geometry->min_height);
1395 else if (rect.right < geometry->min_width)
1396 gdk_window_resize (window, geometry->min_width, rect.bottom);
1397 else if (rect.bottom < geometry->min_height)
1398 gdk_window_resize (window, rect.right, geometry->min_height);
1401 if (geom_mask & GDK_HINT_MAX_SIZE)
1405 rect.right = geometry->max_width;
1406 rect.bottom = geometry->max_height;
1407 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1408 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1409 /* HB: dont' know why AdjustWindowRectEx is called here, ... */
1410 SafeAdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1411 impl->hint_max_width = rect.right - rect.left;
1412 impl->hint_max_height = rect.bottom - rect.top;
1413 /* ... but negative sizes are always wrong */
1414 if (impl->hint_max_width < 0) impl->hint_max_width = G_MAXSHORT;
1415 if (impl->hint_max_height < 0) impl->hint_max_height = G_MAXSHORT;
1417 /* Again, check if the window is too large currently. */
1418 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1419 if (rect.right > geometry->max_width
1420 && rect.bottom > geometry->max_height)
1421 gdk_window_resize (window, geometry->max_width, geometry->max_height);
1422 else if (rect.right > geometry->max_width)
1423 gdk_window_resize (window, geometry->max_width, rect.bottom);
1424 else if (rect.bottom > geometry->max_height)
1425 gdk_window_resize (window, rect.right, geometry->max_height);
1428 /* I don't know what to do when called with zero base_width and height. */
1429 if (geom_mask & GDK_HINT_BASE_SIZE
1430 && geometry->base_width > 0
1431 && geometry->base_height > 0)
1433 if (!GetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1434 WIN32_API_FAILED ("GetWindowPlacement");
1437 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints:"
1438 " rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1439 size_hints.rcNormalPosition.left,
1440 size_hints.rcNormalPosition.top,
1441 size_hints.rcNormalPosition.right,
1442 size_hints.rcNormalPosition.bottom));
1443 size_hints.rcNormalPosition.right =
1444 size_hints.rcNormalPosition.left + geometry->base_width;
1445 size_hints.rcNormalPosition.bottom =
1446 size_hints.rcNormalPosition.top + geometry->base_height;
1447 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1448 size_hints.rcNormalPosition.left,
1449 size_hints.rcNormalPosition.top,
1450 size_hints.rcNormalPosition.right,
1451 size_hints.rcNormalPosition.bottom));
1452 if (!SetWindowPlacement (GDK_WINDOW_HWND (window), &size_hints))
1453 WIN32_API_FAILED ("SetWindowPlacement");
1457 if (geom_mask & GDK_HINT_RESIZE_INC)
1462 if (geom_mask & GDK_HINT_ASPECT)
1469 gdk_window_set_title (GdkWindow *window,
1474 g_return_if_fail (window != NULL);
1475 g_return_if_fail (GDK_IS_WINDOW (window));
1476 g_return_if_fail (title != NULL);
1478 /* Empty window titles not allowed, so set it to just a period. */
1482 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %#x %s\n",
1483 (guint) GDK_WINDOW_HWND (window), title));
1485 if (!GDK_WINDOW_DESTROYED (window))
1487 /* As the title is in UTF-8 we must translate it
1488 * to the system codepage.
1490 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1491 if (!SetWindowText (GDK_WINDOW_HWND (window), mbtitle))
1492 WIN32_API_FAILED ("SetWindowText");
1499 gdk_window_set_role (GdkWindow *window,
1502 g_return_if_fail (window != NULL);
1503 g_return_if_fail (GDK_IS_WINDOW (window));
1505 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %#x %s\n",
1506 (guint) GDK_WINDOW_HWND (window),
1507 (role ? role : "NULL")));
1512 gdk_window_set_transient_for (GdkWindow *window,
1515 HWND window_id, parent_id;
1518 g_return_if_fail (window != NULL);
1519 g_return_if_fail (GDK_IS_WINDOW (window));
1521 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %#x %#x\n",
1522 (guint) GDK_WINDOW_HWND (window),
1523 (guint) GDK_WINDOW_HWND (parent)));
1525 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1528 window_id = GDK_WINDOW_HWND (window);
1529 parent_id = GDK_WINDOW_HWND (parent);
1531 if ((style = GetWindowLong (window_id, GWL_STYLE)) == 0)
1532 WIN32_API_FAILED ("GetWindowLong");
1535 #if 0 /* not sure if we want to do this */
1536 style &= ~(WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);
1539 if (!SetWindowLong (window_id, GWL_STYLE, style))
1540 WIN32_API_FAILED ("SetWindowLong");
1541 #if 0 /* not sure if we want to do this, clipping to parent size! */
1542 if (!SetParent (window_id, parent_id))
1543 WIN32_API_FAILED ("SetParent");
1544 #else /* make the modal window topmost instead */
1545 if (!SetWindowPos (window_id, HWND_TOPMOST, 0, 0, 0, 0,
1546 SWP_NOMOVE | SWP_NOSIZE))
1547 WIN32_API_FAILED ("SetWindowPos");
1550 if (!RedrawWindow (window_id, NULL, NULL,
1551 RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW))
1552 WIN32_API_FAILED ("RedrawWindow");
1556 gdk_window_set_background (GdkWindow *window,
1559 GdkWindowObject *private = (GdkWindowObject *)window;
1561 g_return_if_fail (window != NULL);
1562 g_return_if_fail (GDK_IS_WINDOW (window));
1564 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %#x %s\n",
1565 (guint) GDK_WINDOW_HWND (window),
1566 gdk_win32_color_to_string (color)));
1568 private->bg_color = *color;
1570 if (private->bg_pixmap &&
1571 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1572 private->bg_pixmap != GDK_NO_BG)
1574 gdk_drawable_unref (private->bg_pixmap);
1575 private->bg_pixmap = NULL;
1580 gdk_window_set_back_pixmap (GdkWindow *window,
1582 gint parent_relative)
1584 GdkWindowObject *private = (GdkWindowObject *)window;
1586 g_return_if_fail (window != NULL);
1587 g_return_if_fail (GDK_IS_WINDOW (window));
1588 g_return_if_fail (pixmap == NULL || !parent_relative);
1590 if (private->bg_pixmap &&
1591 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1592 private->bg_pixmap != GDK_NO_BG)
1593 gdk_drawable_unref (private->bg_pixmap);
1595 if (parent_relative)
1597 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1603 gdk_drawable_ref (pixmap);
1604 private->bg_pixmap = pixmap;
1608 private->bg_pixmap = GDK_NO_BG;
1614 gdk_window_set_cursor (GdkWindow *window,
1617 GdkWindowImplWin32 *impl;
1618 GdkCursorPrivate *cursor_private;
1620 HCURSOR hprevcursor;
1623 g_return_if_fail (window != NULL);
1624 g_return_if_fail (GDK_IS_WINDOW (window));
1626 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1627 cursor_private = (GdkCursorPrivate*) cursor;
1629 if (!GDK_WINDOW_DESTROYED (window))
1634 hcursor = cursor_private->hcursor;
1636 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %#x %#x\n",
1637 (guint) GDK_WINDOW_HWND (window),
1639 hprevcursor = impl->hcursor;
1640 if (hcursor == NULL)
1641 impl->hcursor = NULL;
1644 /* We must copy the cursor as it is OK to destroy the GdkCursor
1645 * while still in use for some window. See for instance
1646 * gimp_change_win_cursor() which calls
1647 * gdk_window_set_cursor (win, cursor), and immediately
1648 * afterwards gdk_cursor_destroy (cursor).
1650 impl->hcursor = CopyCursor (hcursor);
1651 GDK_NOTE (MISC, g_print ("...CopyCursor (%#x) = %#x\n",
1652 (guint) hcursor, (guint) impl->hcursor));
1654 if (hprevcursor != NULL && GetCursor () == hprevcursor)
1655 SetCursor (impl->hcursor);
1657 if (hprevcursor != NULL)
1659 GDK_NOTE (MISC, g_print ("...DestroyCursor (%#x)\n",
1660 (guint) hprevcursor));
1662 if (!DestroyCursor (hprevcursor))
1663 WIN32_API_FAILED ("DestroyCursor");
1670 gdk_window_get_geometry (GdkWindow *window,
1677 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1680 window = _gdk_parent_root;
1682 if (!GDK_WINDOW_DESTROYED (window))
1686 if (!GetClientRect (GDK_WINDOW_HWND (window), &rect))
1687 WIN32_API_FAILED ("GetClientRect");
1694 *width = rect.right - rect.left;
1696 *height = rect.bottom - rect.top;
1698 *depth = gdk_drawable_get_visual (window)->depth;
1703 gdk_window_get_origin (GdkWindow *window,
1711 g_return_val_if_fail (window != NULL, 0);
1713 if (!GDK_WINDOW_DESTROYED (window))
1719 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1732 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %#x: +%d+%d\n",
1733 (guint) GDK_WINDOW_HWND (window),
1739 gdk_window_get_deskrelative_origin (GdkWindow *window,
1743 return gdk_window_get_origin (window, x, y);
1747 gdk_window_get_root_origin (GdkWindow *window,
1751 GdkWindowObject *rover;
1754 g_return_if_fail (window != NULL);
1755 g_return_if_fail (GDK_IS_WINDOW (window));
1757 rover = (GdkWindowObject*) window;
1763 if (GDK_WINDOW_DESTROYED (window))
1766 while (rover->parent && ((GdkWindowObject*) rover->parent)->parent)
1767 rover = (GdkWindowObject *) rover->parent;
1768 if (rover->destroyed)
1773 ClientToScreen (GDK_WINDOW_HWND (rover), &pt);
1779 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %#x: (%#x) +%ld+%ld\n",
1780 (guint) GDK_WINDOW_HWND (window),
1781 (guint) GDK_WINDOW_HWND (rover),
1786 gdk_window_get_frame_extents (GdkWindow *window,
1789 GdkWindowObject *private;
1793 g_return_if_fail (GDK_IS_WINDOW (window));
1794 g_return_if_fail (rect != NULL);
1796 private = GDK_WINDOW_OBJECT (window);
1803 if (GDK_WINDOW_DESTROYED (window))
1806 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
1807 private = (GdkWindowObject*) private->parent;
1809 hwnd = GDK_WINDOW_HWND (window);
1810 /* find the frame window */
1811 while (HWND_DESKTOP != GetParent (hwnd))
1813 hwnd = GetParent (hwnd);
1814 g_return_if_fail (NULL != hwnd);
1817 if (!GetWindowRect (hwnd, &r))
1818 WIN32_API_FAILED ("GetWindowRect");
1822 rect->width = r.right - r.left;
1823 rect->height = r.bottom - r.top;
1827 _gdk_windowing_window_get_pointer (GdkWindow *window,
1830 GdkModifierType *mask)
1832 GdkWindow *return_val;
1833 POINT pointc, point;
1836 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1839 window = _gdk_parent_root;
1842 GetCursorPos (&pointc);
1844 ScreenToClient (GDK_WINDOW_HWND (window), &point);
1851 hwnd = WindowFromPoint (point);
1853 ScreenToClient (hwnd, &point);
1856 hwndc = ChildWindowFromPoint (hwnd, point);
1857 ClientToScreen (hwnd, &point);
1858 ScreenToClient (hwndc, &point);
1859 } while (hwndc != hwnd && (hwnd = hwndc, 1)); /* Ouch! */
1861 return_val = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1867 GetKeyboardState (kbd);
1869 if (kbd[VK_SHIFT] & 0x80)
1870 *mask |= GDK_SHIFT_MASK;
1871 if (kbd[VK_CAPITAL] & 0x80)
1872 *mask |= GDK_LOCK_MASK;
1873 if (kbd[VK_CONTROL] & 0x80)
1874 *mask |= GDK_CONTROL_MASK;
1875 if (kbd[VK_MENU] & 0x80)
1876 *mask |= GDK_MOD1_MASK;
1877 if (kbd[VK_LBUTTON] & 0x80)
1878 *mask |= GDK_BUTTON1_MASK;
1879 if (kbd[VK_MBUTTON] & 0x80)
1880 *mask |= GDK_BUTTON2_MASK;
1881 if (kbd[VK_RBUTTON] & 0x80)
1882 *mask |= GDK_BUTTON3_MASK;
1889 _gdk_windowing_window_at_pointer (gint *win_x,
1893 POINT point, pointc;
1897 GetCursorPos (&pointc);
1899 hwnd = WindowFromPoint (point);
1903 window = _gdk_parent_root;
1911 ScreenToClient (hwnd, &point);
1914 hwndc = ChildWindowFromPoint (hwnd, point);
1915 ClientToScreen (hwnd, &point);
1916 ScreenToClient (hwndc, &point);
1917 } while (hwndc != hwnd && (hwnd = hwndc, 1));
1919 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
1921 if (window && (win_x || win_y))
1923 GetClientRect (hwnd, &rect);
1925 *win_x = point.x - rect.left;
1927 *win_y = point.y - rect.top;
1930 GDK_NOTE (MISC, g_print ("gdk_window_at_pointer: +%ld+%ld %#x%s\n",
1933 (window == NULL ? " NULL" : "")));
1939 gdk_window_get_events (GdkWindow *window)
1941 g_return_val_if_fail (window != NULL, 0);
1942 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1944 if (GDK_WINDOW_DESTROYED (window))
1947 return GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask;
1951 gdk_window_set_events (GdkWindow *window,
1952 GdkEventMask event_mask)
1954 g_return_if_fail (window != NULL);
1955 g_return_if_fail (GDK_IS_WINDOW (window));
1957 if (GDK_WINDOW_DESTROYED (window))
1960 GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl)->event_mask = event_mask;
1964 gdk_window_shape_combine_mask (GdkWindow *window,
1968 g_return_if_fail (window != NULL);
1969 g_return_if_fail (GDK_IS_WINDOW (window));
1973 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x none\n",
1974 (guint) GDK_WINDOW_HWND (window)));
1975 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
1984 /* Convert mask bitmap to region */
1985 hrgn = BitmapToRegion (GDK_WINDOW_HWND (mask));
1987 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %#x %#x\n",
1988 (guint) GDK_WINDOW_HWND (window),
1989 (guint) GDK_WINDOW_HWND (mask)));
1991 /* SetWindowRgn wants window (not client) coordinates */
1992 dwStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
1993 dwExStyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1994 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1995 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
1996 OffsetRgn (hrgn, -rect.left, -rect.top);
1998 OffsetRgn (hrgn, x, y);
2000 /* If this is a top-level window, add the title bar to the region */
2001 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2003 CombineRgn (hrgn, hrgn,
2004 CreateRectRgn (0, 0, rect.right - rect.left, -rect.top),
2008 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2013 gdk_window_set_override_redirect (GdkWindow *window,
2014 gboolean override_redirect)
2016 g_return_if_fail (window != NULL);
2017 g_return_if_fail (GDK_IS_WINDOW (window));
2019 g_warning ("gdk_window_set_override_redirect not implemented");
2023 gdk_window_set_icon_list (GdkWindow *window,
2026 g_return_if_fail (GDK_IS_WINDOW (window));
2028 if (GDK_WINDOW_DESTROYED (window))
2031 /* We could convert it to a hIcon and DrawIcon () it when getting
2032 * a WM_PAINT with IsIconic, but is it worth it ? Same probably
2033 * goes for gdk_window_set_icon (). Patches accepted :-) --hb
2034 * Or do we only need to deliver the Icon on WM_GETICON ?
2039 gdk_window_set_icon (GdkWindow *window,
2040 GdkWindow *icon_window,
2044 g_return_if_fail (window != NULL);
2045 g_return_if_fail (GDK_IS_WINDOW (window));
2047 if (GDK_WINDOW_DESTROYED (window))
2050 /* Nothing to do, really. As we share window classes between windows
2051 * we can't have window-specific icons, sorry. Don't print any warning
2057 gdk_window_set_icon_name (GdkWindow *window,
2060 g_return_if_fail (window != NULL);
2061 g_return_if_fail (GDK_IS_WINDOW (window));
2063 if (GDK_WINDOW_DESTROYED (window))
2066 if (!SetWindowText (GDK_WINDOW_HWND (window), name))
2067 WIN32_API_FAILED ("SetWindowText");
2071 gdk_window_set_group (GdkWindow *window,
2074 g_return_if_fail (window != NULL);
2075 g_return_if_fail (GDK_IS_WINDOW (window));
2076 g_return_if_fail (leader != NULL);
2077 g_return_if_fail (GDK_IS_WINDOW (leader));
2079 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2082 g_warning ("gdk_window_set_group not implemented");
2086 gdk_window_set_decorations (GdkWindow *window,
2087 GdkWMDecoration decorations)
2089 LONG style, exstyle;
2091 g_return_if_fail (window != NULL);
2092 g_return_if_fail (GDK_IS_WINDOW (window));
2094 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2095 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2097 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2098 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE);
2100 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2102 if (decorations & GDK_DECOR_ALL)
2103 style |= (WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2104 if (decorations & GDK_DECOR_BORDER)
2105 style |= (WS_BORDER);
2106 if (decorations & GDK_DECOR_RESIZEH)
2107 style |= (WS_THICKFRAME);
2108 if (decorations & GDK_DECOR_TITLE)
2109 style |= (WS_CAPTION);
2110 if (decorations & GDK_DECOR_MENU)
2111 style |= (WS_SYSMENU);
2112 if (decorations & GDK_DECOR_MINIMIZE)
2113 style |= (WS_MINIMIZEBOX);
2114 if (decorations & GDK_DECOR_MAXIMIZE)
2115 style |= (WS_MAXIMIZEBOX);
2117 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2121 gdk_window_set_functions (GdkWindow *window,
2122 GdkWMFunction functions)
2124 LONG style, exstyle;
2126 g_return_if_fail (window != NULL);
2127 g_return_if_fail (GDK_IS_WINDOW (window));
2129 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2130 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
2132 style &= (WS_OVERLAPPED|WS_POPUP|WS_CHILD|WS_MINIMIZE|WS_VISIBLE|WS_DISABLED
2133 |WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZE|WS_CAPTION|WS_BORDER
2136 exstyle &= (WS_EX_TOPMOST|WS_EX_TRANSPARENT);
2138 if (functions & GDK_FUNC_ALL)
2139 style |= (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
2140 if (functions & GDK_FUNC_RESIZE)
2141 style |= (WS_THICKFRAME);
2142 if (functions & GDK_FUNC_MOVE)
2143 style |= (WS_THICKFRAME);
2144 if (functions & GDK_FUNC_MINIMIZE)
2145 style |= (WS_MINIMIZEBOX);
2146 if (functions & GDK_FUNC_MAXIMIZE)
2147 style |= (WS_MAXIMIZEBOX);
2149 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2153 * propagate the shapes from all child windows of a GDK window to the parent
2154 * window. Shamelessly ripped from Enlightenment's code
2160 QueryTree (HWND hwnd,
2170 child = GetWindow (hwnd, GW_CHILD);
2172 child = GetWindow (child, GW_HWNDNEXT);
2175 } while (child != NULL);
2179 *children = g_new (HWND, n);
2180 for (i = 0; i < n; i++)
2183 child = GetWindow (hwnd, GW_CHILD);
2185 child = GetWindow (child, GW_HWNDNEXT);
2186 *children[i] = child;
2192 gdk_propagate_shapes (HANDLE win,
2196 HRGN region, childRegion;
2200 SetRectEmpty (&emptyRect);
2201 region = CreateRectRgnIndirect (&emptyRect);
2203 GetWindowRgn (win, region);
2205 QueryTree (win, &list, &num);
2208 WINDOWPLACEMENT placement;
2210 placement.length = sizeof (WINDOWPLACEMENT);
2211 /* go through all child windows and combine regions */
2212 for (i = 0; i < num; i++)
2214 GetWindowPlacement (list[i], &placement);
2215 if (placement.showCmd == SW_SHOWNORMAL)
2217 childRegion = CreateRectRgnIndirect (&emptyRect);
2218 GetWindowRgn (list[i], childRegion);
2219 CombineRgn (region, region, childRegion, RGN_OR);
2220 DeleteObject (childRegion);
2223 SetWindowRgn (win, region, TRUE);
2226 DeleteObject (region);
2230 gdk_window_set_child_shapes (GdkWindow *window)
2232 g_return_if_fail (window != NULL);
2233 g_return_if_fail (GDK_IS_WINDOW (window));
2235 if (GDK_WINDOW_DESTROYED (window))
2238 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2242 gdk_window_merge_child_shapes (GdkWindow *window)
2244 g_return_if_fail (window != NULL);
2245 g_return_if_fail (GDK_IS_WINDOW (window));
2247 if (GDK_WINDOW_DESTROYED (window))
2250 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2253 /* Support for windows that can be guffaw-scrolled
2254 * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt)
2258 gdk_window_gravity_works (void)
2260 enum { UNKNOWN, NO, YES };
2261 static gint gravity_works = UNKNOWN;
2263 if (gravity_works == UNKNOWN)
2270 attr.window_type = GDK_WINDOW_TEMP;
2271 attr.wclass = GDK_INPUT_OUTPUT;
2276 attr.event_mask = 0;
2278 parent = gdk_window_new (NULL, &attr, GDK_WA_X | GDK_WA_Y);
2280 attr.window_type = GDK_WINDOW_CHILD;
2281 child = gdk_window_new (parent, &attr, GDK_WA_X | GDK_WA_Y);
2283 gdk_window_set_static_win_gravity (child, TRUE);
2285 gdk_window_resize (parent, 100, 110);
2286 gdk_window_move (parent, 0, -10);
2287 gdk_window_move_resize (parent, 0, 0, 100, 100);
2289 gdk_window_resize (parent, 100, 110);
2290 gdk_window_move (parent, 0, -10);
2291 gdk_window_move_resize (parent, 0, 0, 100, 100);
2293 gdk_window_get_geometry (child, NULL, &y, NULL, NULL, NULL);
2295 gdk_window_destroy (parent);
2296 gdk_window_destroy (child);
2298 gravity_works = ((y == -20) ? YES : NO);
2301 return (gravity_works == YES);
2305 gdk_window_set_static_bit_gravity (GdkWindow *window, gboolean on)
2307 g_return_if_fail (window != NULL);
2309 GDK_NOTE (MISC, g_print ("gdk_window_set_static_bit_gravity: Not implemented\n"));
2313 gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on)
2315 g_return_if_fail (window != NULL);
2318 g_print ("gdk_window_set_static_win_gravity: Not implemented\n"));
2321 /*************************************************************
2322 * gdk_window_set_static_gravities:
2323 * Set the bit gravity of the given window to static,
2324 * and flag it so all children get static subwindow
2327 * window: window for which to set static gravity
2328 * use_static: Whether to turn static gravity on or off.
2330 * Does the XServer support static gravity?
2331 *************************************************************/
2334 gdk_window_set_static_gravities (GdkWindow *window,
2335 gboolean use_static)
2337 GdkWindowObject *private = (GdkWindowObject *)window;
2340 g_return_val_if_fail (window != NULL, FALSE);
2341 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2343 if (!use_static == !private->guffaw_gravity)
2346 if (use_static && !gdk_window_gravity_works ())
2349 private->guffaw_gravity = use_static;
2351 if (!GDK_WINDOW_DESTROYED (window))
2353 gdk_window_set_static_bit_gravity (window, use_static);
2355 tmp_list = private->children;
2358 gdk_window_set_static_win_gravity (window, use_static);
2360 tmp_list = tmp_list->next;
2368 * Setting window states
2371 gdk_window_iconify (GdkWindow *window)
2373 g_return_if_fail (window != NULL);
2374 g_return_if_fail (GDK_IS_WINDOW (window));
2376 if (GDK_WINDOW_DESTROYED (window))
2379 if (GDK_WINDOW_IS_MAPPED (window))
2381 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2385 /* Flip our client side flag, the real work happens on map. */
2386 gdk_synthesize_window_state (window,
2388 GDK_WINDOW_STATE_ICONIFIED);
2393 gdk_window_deiconify (GdkWindow *window)
2395 g_return_if_fail (window != NULL);
2396 g_return_if_fail (GDK_IS_WINDOW (window));
2398 if (GDK_WINDOW_DESTROYED (window))
2401 if (GDK_WINDOW_IS_MAPPED (window))
2403 gdk_window_show (window);
2407 /* Flip our client side flag, the real work happens on map. */
2408 gdk_synthesize_window_state (window,
2409 GDK_WINDOW_STATE_ICONIFIED,
2415 gdk_window_stick (GdkWindow *window)
2417 g_return_if_fail (GDK_IS_WINDOW (window));
2419 if (GDK_WINDOW_DESTROYED (window))
2422 if (GDK_WINDOW_IS_MAPPED (window))
2424 /* "stick" means stick to all desktops _and_ do not scroll with the
2425 * viewport. i.e. glue to the monitor glass in all cases.
2427 g_warning ("gdk_window_stick (0x%X) ???", GDK_WINDOW_HWND (window));
2431 /* Flip our client side flag, the real work happens on map. */
2432 gdk_synthesize_window_state (window,
2434 GDK_WINDOW_STATE_STICKY);
2439 gdk_window_unstick (GdkWindow *window)
2441 g_return_if_fail (GDK_IS_WINDOW (window));
2443 if (GDK_WINDOW_DESTROYED (window))
2446 if (GDK_WINDOW_IS_MAPPED (window))
2448 g_warning ("gdk_window_unstick (0x%X) ???", GDK_WINDOW_HWND (window));
2452 /* Flip our client side flag, the real work happens on map. */
2453 gdk_synthesize_window_state (window,
2454 GDK_WINDOW_STATE_STICKY,
2461 gdk_window_maximize (GdkWindow *window)
2463 g_return_if_fail (GDK_IS_WINDOW (window));
2465 if (GDK_WINDOW_DESTROYED (window))
2468 if (GDK_WINDOW_IS_MAPPED (window))
2469 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
2471 gdk_synthesize_window_state (window,
2473 GDK_WINDOW_STATE_MAXIMIZED);
2477 gdk_window_unmaximize (GdkWindow *window)
2479 g_return_if_fail (GDK_IS_WINDOW (window));
2481 if (GDK_WINDOW_DESTROYED (window))
2484 if (GDK_WINDOW_IS_MAPPED (window))
2485 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
2487 gdk_synthesize_window_state (window,
2488 GDK_WINDOW_STATE_MAXIMIZED,
2493 gdk_window_focus (GdkWindow *window,
2496 g_return_if_fail (GDK_IS_WINDOW (window));
2498 if (GDK_WINDOW_DESTROYED (window))
2501 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
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_type_hint (GdkWindow *window,
2528 GdkWindowTypeHint hint)
2532 g_return_if_fail (window != NULL);
2533 g_return_if_fail (GDK_IS_WINDOW (window));
2535 if (GDK_WINDOW_DESTROYED (window))
2540 case GDK_WINDOW_TYPE_HINT_DIALOG:
2541 atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_DIALOG", FALSE);
2543 case GDK_WINDOW_TYPE_HINT_MENU:
2544 atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_MENU", FALSE);
2546 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
2547 atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_TOOLBAR", FALSE);
2550 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
2552 case GDK_WINDOW_TYPE_HINT_NORMAL:
2553 atom = gdk_atom_intern ("_NET_WM_WINDOW_TYPE_NORMAL", FALSE);
2560 g_print ("gdk_window_set_type_hint (0x%0X)\n",
2561 GDK_WINDOW_HWND (window)));
2565 gdk_window_shape_combine_region (GdkWindow *window,
2566 GdkRegion *shape_region,
2570 gint xoffset, yoffset;
2572 g_return_if_fail (GDK_IS_WINDOW (window));
2574 if (GDK_WINDOW_DESTROYED (window))
2577 /* XXX: even on X implemented conditional ... */
2581 gdk_window_begin_resize_drag (GdkWindow *window,
2588 g_return_if_fail (GDK_IS_WINDOW (window));
2590 if (GDK_WINDOW_DESTROYED (window))
2593 /* XXX: isn't all this default on win32 ... */
2597 gdk_window_begin_move_drag (GdkWindow *window,
2603 g_return_if_fail (GDK_IS_WINDOW (window));
2605 if (GDK_WINDOW_DESTROYED (window))
2608 /* XXX: isn't all this default on win32 ... */