1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3 * Copyright (C) 1998-2004 Tor Lillqvist
4 * Copyright (C) 2001-2004 Hans Breuer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
23 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
24 * file for a list of people on the GTK+ Team. See the ChangeLog
25 * files for a list of changes. These files are distributed with
26 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
32 #include "gdk.h" /* gdk_rectangle_intersect */
33 #include "gdkevents.h"
34 #include "gdkpixmap.h"
35 #include "gdkwindow.h"
36 #include "gdkdisplay.h"
37 #include "gdkprivate-win32.h"
38 #include "gdkinput-win32.h"
40 #if defined __MINGW32__ || (WINVER < 0x0500)
49 LONG bV5XPelsPerMeter;
50 LONG bV5YPelsPerMeter;
52 DWORD bV5ClrImportant;
58 CIEXYZTRIPLE bV5Endpoints;
71 #include <gdk-pixbuf/gdk-pixbuf.h>
75 static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable);
76 static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
78 static void gdk_window_impl_win32_get_size (GdkDrawable *drawable,
81 static GdkRegion* gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable);
82 static void gdk_window_impl_win32_init (GdkWindowImplWin32 *window);
83 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
84 static void gdk_window_impl_win32_finalize (GObject *object);
86 static gpointer parent_class = NULL;
89 _gdk_window_impl_win32_get_type (void)
91 static GType object_type = 0;
95 static const GTypeInfo object_info =
97 sizeof (GdkWindowImplWin32Class),
99 (GBaseFinalizeFunc) NULL,
100 (GClassInitFunc) gdk_window_impl_win32_class_init,
101 NULL, /* class_finalize */
102 NULL, /* class_data */
103 sizeof (GdkWindowImplWin32),
105 (GInstanceInitFunc) gdk_window_impl_win32_init,
108 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_WIN32,
109 "GdkWindowImplWin32",
117 _gdk_window_impl_get_type (void)
119 return _gdk_window_impl_win32_get_type ();
123 gdk_window_impl_win32_init (GdkWindowImplWin32 *impl)
128 impl->hcursor = NULL;
129 impl->hicon_big = NULL;
130 impl->hicon_small = NULL;
131 impl->hint_flags = 0;
132 impl->extension_events_selected = FALSE;
136 gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass)
138 GObjectClass *object_class = G_OBJECT_CLASS (klass);
139 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
141 parent_class = g_type_class_peek_parent (klass);
143 object_class->finalize = gdk_window_impl_win32_finalize;
145 drawable_class->set_colormap = gdk_window_impl_win32_set_colormap;
146 drawable_class->get_colormap = gdk_window_impl_win32_get_colormap;
147 drawable_class->get_size = gdk_window_impl_win32_get_size;
149 /* Visible and clip regions are the same */
150 drawable_class->get_clip_region = gdk_window_impl_win32_get_visible_region;
151 drawable_class->get_visible_region = gdk_window_impl_win32_get_visible_region;
155 gdk_window_impl_win32_finalize (GObject *object)
157 GdkWindowObject *wrapper;
158 GdkDrawableImplWin32 *draw_impl;
159 GdkWindowImplWin32 *window_impl;
161 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (object));
163 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (object);
164 window_impl = GDK_WINDOW_IMPL_WIN32 (object);
166 wrapper = (GdkWindowObject*) draw_impl->wrapper;
168 if (!GDK_WINDOW_DESTROYED (wrapper))
170 gdk_win32_handle_table_remove (draw_impl->handle);
173 if (window_impl->hcursor != NULL)
175 if (GetCursor () == window_impl->hcursor)
177 GDI_CALL (DestroyCursor, (window_impl->hcursor));
178 window_impl->hcursor = NULL;
180 if (window_impl->hicon_big != NULL)
182 GDI_CALL (DestroyIcon, (window_impl->hicon_big));
183 window_impl->hicon_big = NULL;
185 if (window_impl->hicon_small != NULL)
187 GDI_CALL (DestroyIcon, (window_impl->hicon_small));
188 window_impl->hicon_small = NULL;
191 G_OBJECT_CLASS (parent_class)->finalize (object);
195 _gdk_win32_adjust_client_rect (GdkWindow *window,
200 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
201 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
202 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
206 _gdk_win32_get_adjusted_client_rect (GdkWindow *window,
209 GetClientRect (GDK_WINDOW_HWND (window), rect);
210 _gdk_win32_adjust_client_rect (window, rect);
214 gdk_window_impl_win32_get_colormap (GdkDrawable *drawable)
216 GdkDrawableImplWin32 *drawable_impl;
218 g_return_val_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable), NULL);
220 drawable_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
222 if (!((GdkWindowObject *) drawable_impl->wrapper)->input_only &&
223 drawable_impl->colormap == NULL)
225 drawable_impl->colormap =
226 gdk_screen_get_system_colormap (gdk_drawable_get_screen (drawable));
227 g_object_ref (drawable_impl->colormap);
230 return drawable_impl->colormap;
234 gdk_window_impl_win32_set_colormap (GdkDrawable *drawable,
237 GdkWindowImplWin32 *impl;
238 GdkDrawableImplWin32 *draw_impl;
240 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
242 impl = GDK_WINDOW_IMPL_WIN32 (drawable);
243 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (drawable);
246 GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
251 g_print("gdk_window_impl_win32_set_colormap: XXX\n");
256 gdk_window_impl_win32_get_size (GdkDrawable *drawable,
260 g_return_if_fail (GDK_IS_WINDOW_IMPL_WIN32 (drawable));
263 *width = GDK_WINDOW_IMPL_WIN32 (drawable)->width;
265 *height = GDK_WINDOW_IMPL_WIN32 (drawable)->height;
269 gdk_window_impl_win32_get_visible_region (GdkDrawable *drawable)
271 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (drawable);
272 GdkRectangle result_rect;
277 result_rect.width = impl->width;
278 result_rect.height = impl->height;
280 gdk_rectangle_intersect (&result_rect, &impl->position_info.clip_rect, &result_rect);
282 /* take this win32 specific part into account (smaller when obscured) */
283 hdc = GetDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (impl));
287 if (SIMPLEREGION == GetClipBox (hdc, &r))
293 gr.width = r.right - r.left;
294 gr.height = r.bottom - r.top;
296 gdk_rectangle_intersect (&result_rect, &gr, &result_rect);
298 ReleaseDC (GDK_DRAWABLE_IMPL_WIN32_HANDLE (drawable), hdc);
301 return gdk_region_rectangle (&result_rect);
305 _gdk_root_window_size_init (void)
307 GdkWindowImplWin32 *impl;
311 impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) _gdk_parent_root)->impl);
312 rect = _gdk_monitors[0];
313 for (i = 1; i < _gdk_num_monitors; i++)
314 gdk_rectangle_union (&rect, _gdk_monitors+i, &rect);
316 impl->width = rect.width;
317 impl->height = rect.height;
321 _gdk_windowing_window_init (void)
323 GdkWindowObject *private;
324 GdkDrawableImplWin32 *draw_impl;
326 g_assert (_gdk_parent_root == NULL);
328 _gdk_parent_root = g_object_new (GDK_TYPE_WINDOW, NULL);
329 private = (GdkWindowObject *)_gdk_parent_root;
330 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
332 draw_impl->handle = _gdk_root_window;
333 draw_impl->wrapper = GDK_DRAWABLE (private);
334 draw_impl->colormap = gdk_colormap_get_system ();
335 g_object_ref (draw_impl->colormap);
337 private->window_type = GDK_WINDOW_ROOT;
338 private->depth = gdk_visual_get_system ()->depth;
340 _gdk_root_window_size_init ();
342 _gdk_window_init_position (GDK_WINDOW (private));
344 gdk_win32_handle_table_insert (&_gdk_root_window, _gdk_parent_root);
346 GDK_NOTE (MISC, g_print ("_gdk_parent_root=%p\n", GDK_WINDOW_HWND (_gdk_parent_root)));
350 get_default_title (void)
353 title = g_get_application_name ();
355 title = g_get_prgname ();
361 * is a wrapper function for RegisterWindowClassEx.
362 * It creates at least one unique class for every
363 * GdkWindowType. If support for single window-specific icons
364 * is ever needed (e.g Dialog specific), every such window should
368 RegisterGdkClass (GdkWindowType wtype)
370 static ATOM klassTOPLEVEL = 0;
371 static ATOM klassDIALOG = 0;
372 static ATOM klassCHILD = 0;
373 static ATOM klassTEMP = 0;
374 static HICON hAppIcon = NULL;
375 static WNDCLASSEX wcl;
378 wcl.cbSize = sizeof (WNDCLASSEX);
379 wcl.style = 0; /* DON'T set CS_<H,V>REDRAW. It causes total redraw
380 * on WM_SIZE and WM_MOVE. Flicker, Performance!
382 wcl.lpfnWndProc = _gdk_win32_window_procedure;
385 wcl.hInstance = _gdk_app_hmodule;
387 /* initialize once! */
390 gchar sLoc [MAX_PATH+1];
392 if (0 != GetModuleFileName (_gdk_app_hmodule, sLoc, MAX_PATH))
394 hAppIcon = ExtractIcon (_gdk_app_hmodule, sLoc, 0);
397 if (0 != GetModuleFileName (_gdk_dll_hinstance, sLoc, MAX_PATH))
398 hAppIcon = ExtractIcon (_gdk_dll_hinstance, sLoc, 0);
402 hAppIcon = LoadIcon (NULL, IDI_APPLICATION);
405 wcl.lpszMenuName = NULL;
408 /* initialize once per class */
410 * HB: Setting the background brush leads to flicker, because we
411 * don't get asked how to clear the background. This is not what
412 * we want, at least not for input_only windows ...
414 #define ONCE_PER_CLASS() \
415 wcl.hIcon = CopyIcon (hAppIcon); \
416 wcl.hIconSm = CopyIcon (hAppIcon); \
417 wcl.hbrBackground = NULL; \
418 wcl.hCursor = LoadCursor (NULL, IDC_ARROW);
422 case GDK_WINDOW_TOPLEVEL:
423 if (0 == klassTOPLEVEL)
425 wcl.lpszClassName = "gdkWindowToplevel";
428 klassTOPLEVEL = RegisterClassEx (&wcl);
430 klass = klassTOPLEVEL;
433 case GDK_WINDOW_CHILD:
436 wcl.lpszClassName = "gdkWindowChild";
438 wcl.style |= CS_PARENTDC; /* MSDN: ... enhances system performance. */
440 klassCHILD = RegisterClassEx (&wcl);
445 case GDK_WINDOW_DIALOG:
446 if (0 == klassDIALOG)
448 wcl.lpszClassName = "gdkWindowDialog";
449 wcl.style |= CS_SAVEBITS;
451 klassDIALOG = RegisterClassEx (&wcl);
456 case GDK_WINDOW_TEMP:
459 wcl.lpszClassName = "gdkWindowTemp";
460 wcl.style |= CS_SAVEBITS;
462 klassTEMP = RegisterClassEx (&wcl);
468 g_assert_not_reached ();
474 WIN32_API_FAILED ("RegisterClassEx");
475 g_error ("That is a fatal error");
481 gdk_window_new_internal (GdkWindow *parent,
482 GdkWindowAttr *attributes,
483 gint attributes_mask,
484 gboolean from_set_skip_taskbar_hint)
488 DWORD dwStyle = 0, dwExStyle;
491 GdkWindowObject *private;
492 GdkWindowImplWin32 *impl;
493 GdkDrawableImplWin32 *draw_impl;
498 gint window_width, window_height;
499 gint offset_x = 0, offset_y = 0;
501 g_return_val_if_fail (attributes != NULL, NULL);
505 screen = gdk_screen_get_default ();
506 parent = gdk_screen_get_root_window (screen);
509 screen = gdk_drawable_get_screen (parent);
511 g_return_val_if_fail (GDK_IS_WINDOW (parent), NULL);
514 g_print ("gdk_window_new: %s\n",
515 (attributes->window_type == GDK_WINDOW_TOPLEVEL ? "TOPLEVEL" :
516 (attributes->window_type == GDK_WINDOW_CHILD ? "CHILD" :
517 (attributes->window_type == GDK_WINDOW_DIALOG ? "DIALOG" :
518 (attributes->window_type == GDK_WINDOW_TEMP ? "TEMP" :
521 if (GDK_WINDOW_DESTROYED (parent))
524 hparent = GDK_WINDOW_HWND (parent);
526 window = g_object_new (GDK_TYPE_WINDOW, NULL);
527 private = (GdkWindowObject *)window;
528 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
529 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
530 draw_impl->wrapper = GDK_DRAWABLE (window);
532 /* Windows with a foreign parent are treated as if they are children
533 * of the root window, except for actual creation.
535 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_FOREIGN)
536 parent = _gdk_parent_root;
538 private->parent = (GdkWindowObject *)parent;
540 private->accept_focus = TRUE;
541 private->focus_on_map = TRUE;
543 if (attributes_mask & GDK_WA_X)
544 private->x = attributes->x;
548 if (attributes_mask & GDK_WA_Y)
549 private->y = attributes->y;
550 else if (attributes_mask & GDK_WA_X)
551 private->y = 100; /* ??? We must put it somewhere... */
555 if (attributes_mask & GDK_WA_VISUAL)
556 visual = attributes->visual;
558 visual = gdk_visual_get_system ();
560 impl->width = (attributes->width > 1) ? (attributes->width) : (1);
561 impl->height = (attributes->height > 1) ? (attributes->height) : (1);
562 impl->extension_events_selected = FALSE;
563 if (attributes->wclass == GDK_INPUT_ONLY)
565 /* Backwards compatiblity - we've always ignored
566 * attributes->window_type for input-only windows
569 if (GDK_WINDOW_TYPE (parent) == GDK_WINDOW_ROOT)
570 private->window_type = GDK_WINDOW_TEMP;
572 private->window_type = GDK_WINDOW_CHILD;
575 private->window_type = attributes->window_type;
577 if (attributes->wclass == GDK_INPUT_OUTPUT)
581 private->input_only = FALSE;
582 private->depth = visual->depth;
584 if (attributes_mask & GDK_WA_COLORMAP)
586 draw_impl->colormap = attributes->colormap;
587 g_object_ref (attributes->colormap);
591 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
592 g_object_ref (draw_impl->colormap);
597 dwExStyle = WS_EX_TRANSPARENT;
599 private->input_only = TRUE;
600 draw_impl->colormap = gdk_screen_get_system_colormap (screen);
601 g_object_ref (draw_impl->colormap);
602 GDK_NOTE (MISC, g_print ("...GDK_INPUT_ONLY, system colormap"));
605 switch (private->window_type)
607 case GDK_WINDOW_TOPLEVEL:
608 dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
609 hparent = _gdk_root_window;
610 offset_x = _gdk_offset_x;
611 offset_y = _gdk_offset_y;
614 case GDK_WINDOW_CHILD:
615 dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
618 case GDK_WINDOW_DIALOG:
619 dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN;
621 dwExStyle |= WS_EX_TOPMOST; /* //HB: want this? */
623 hparent = _gdk_root_window;
624 offset_x = _gdk_offset_x;
625 offset_y = _gdk_offset_y;
628 case GDK_WINDOW_TEMP:
629 dwStyle = WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
630 /* a temp window is not necessarily a top level window */
631 dwStyle |= (_gdk_parent_root == parent ? WS_POPUP : WS_CHILDWINDOW);
632 dwExStyle |= WS_EX_TOOLWINDOW;
633 offset_x = _gdk_offset_x;
634 offset_y = _gdk_offset_y;
637 case GDK_WINDOW_ROOT:
638 g_error ("cannot make windows of type GDK_WINDOW_ROOT");
642 g_assert_not_reached ();
645 _gdk_window_init_position (GDK_WINDOW (private));
647 if (private->window_type != GDK_WINDOW_CHILD)
649 rect.left = rect.top = 0;
650 rect.right = impl->position_info.width;
651 rect.bottom = impl->position_info.height;
653 AdjustWindowRectEx (&rect, dwStyle, FALSE, dwExStyle);
655 window_width = rect.right - rect.left;
656 window_height = rect.bottom - rect.top;
660 window_width = impl->position_info.width;
661 window_height = impl->position_info.height;
664 if (impl->position_info.big)
665 private->guffaw_gravity = TRUE;
667 if (attributes_mask & GDK_WA_TITLE)
668 title = attributes->title;
670 title = get_default_title ();
671 if (!title || !*title)
672 title = "GDK client window";
674 private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask;
676 if (private->parent && private->parent->guffaw_gravity)
682 private->parent->children = g_list_prepend (private->parent->children, window);
684 klass = RegisterGdkClass (private->window_type);
686 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
690 CreateWindowEx (dwExStyle,
691 MAKEINTRESOURCE(klass),
694 ((attributes_mask & GDK_WA_X) ?
695 impl->position_info.x - offset_x: CW_USEDEFAULT),
696 impl->position_info.y - offset_y,
697 window_width, window_height,
702 if (GDK_WINDOW_HWND (window) != hwndNew)
704 g_warning("gdk_window_new: gdk_event_translate::WM_CREATE (%p, %p) HWND mismatch.",
705 GDK_WINDOW_HWND (window),
708 /* HB: IHMO due to a race condition the handle was increased by
709 * one, which causes much trouble. Because I can't find the
710 * real bug, try to workaround it ...
711 * To reproduce: compile with MSVC 5, DEBUG=1
714 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
715 GDK_WINDOW_HWND (window) = hwndNew;
716 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
718 /* the old behaviour, but with warning */
719 draw_impl->handle = hwndNew;
724 g_object_ref (window);
725 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
727 GDK_NOTE (MISC, g_print ("... \"%s\" %dx%d@+%d+%d %p = %p\n",
729 window_width, window_height,
730 ((attributes_mask & GDK_WA_X) ?
731 impl->position_info.x - offset_x: CW_USEDEFAULT),
732 impl->position_info.y - offset_y,
734 GDK_WINDOW_HWND (window)));
738 if (draw_impl->handle == NULL)
740 WIN32_API_FAILED ("CreateWindowEx");
741 g_object_unref (window);
745 if (!from_set_skip_taskbar_hint && private->window_type == GDK_WINDOW_TEMP)
746 gdk_window_set_skip_taskbar_hint (window, TRUE);
748 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
749 (attributes->cursor) :
756 gdk_window_new (GdkWindow *parent,
757 GdkWindowAttr *attributes,
758 gint attributes_mask)
760 return gdk_window_new_internal (parent, attributes, attributes_mask, FALSE);
764 gdk_window_foreign_new_for_display (GdkDisplay *display,
765 GdkNativeWindow anid)
768 GdkWindowObject *private;
769 GdkWindowImplWin32 *impl;
770 GdkDrawableImplWin32 *draw_impl;
776 g_return_val_if_fail (display == gdk_display_get_default (), NULL);
778 window = g_object_new (GDK_TYPE_WINDOW, NULL);
779 private = (GdkWindowObject *)window;
780 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
781 draw_impl = GDK_DRAWABLE_IMPL_WIN32 (private->impl);
782 draw_impl->wrapper = GDK_DRAWABLE (window);
783 parent = GetParent ((HWND)anid);
785 private->parent = gdk_win32_handle_table_lookup ((GdkNativeWindow) parent);
786 if (!private->parent || GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_FOREIGN)
787 private->parent = (GdkWindowObject *)_gdk_parent_root;
789 private->parent->children = g_list_prepend (private->parent->children, window);
791 draw_impl->handle = (HWND) anid;
792 GetClientRect ((HWND) anid, &rect);
794 point.y = rect.right;
795 ClientToScreen ((HWND) anid, &point);
796 if (parent != _gdk_root_window)
797 ScreenToClient (parent, &point);
798 private->x = point.x;
799 private->y = point.y;
800 impl->width = rect.right - rect.left;
801 impl->height = rect.bottom - rect.top;
802 private->window_type = GDK_WINDOW_FOREIGN;
803 private->destroyed = FALSE;
804 private->event_mask = GDK_ALL_EVENTS_MASK; /* XXX */
805 if (IsWindowVisible ((HWND) anid))
806 private->state &= (~GDK_WINDOW_STATE_WITHDRAWN);
808 private->state |= GDK_WINDOW_STATE_WITHDRAWN;
809 if (GetWindowLong ((HWND)anid, GWL_EXSTYLE) & WS_EX_TOPMOST)
810 private->state |= GDK_WINDOW_STATE_ABOVE;
812 private->state &= (~GDK_WINDOW_STATE_ABOVE);
813 private->state &= (~GDK_WINDOW_STATE_BELOW);
815 private->depth = gdk_visual_get_system ()->depth;
817 _gdk_window_init_position (GDK_WINDOW (private));
819 g_object_ref (window);
820 gdk_win32_handle_table_insert (&GDK_WINDOW_HWND (window), window);
826 gdk_window_lookup (GdkNativeWindow hwnd)
828 return (GdkWindow*) gdk_win32_handle_table_lookup (hwnd);
832 _gdk_windowing_window_destroy (GdkWindow *window,
834 gboolean foreign_destroy)
836 GdkWindowObject *private = (GdkWindowObject *)window;
838 g_return_if_fail (GDK_IS_WINDOW (window));
840 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_destroy: %p\n",
841 GDK_WINDOW_HWND (window)));
843 if (private->extension_events != 0)
844 _gdk_input_window_destroy (window);
847 if (!recursing && !foreign_destroy)
849 private->destroyed = TRUE;
850 DestroyWindow (GDK_WINDOW_HWND (window));
852 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
856 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
858 /* It's somebody else's window, but in our hierarchy,
859 * so reparent it to the root window, and then call
860 * DestroyWindow() on it.
862 gdk_window_hide (window);
863 gdk_window_reparent (window, NULL, 0, 0);
865 /* Is this too drastic? Many (most?) applications
866 * quit if any window receives WM_QUIT I think.
867 * OTOH, I don't think foreign windows are much
868 * used, so the question is maybe academic.
870 PostMessage (GDK_WINDOW_HWND (window), WM_QUIT, 0, 0);
873 /* This function is called when the window really gone.
876 gdk_window_destroy_notify (GdkWindow *window)
878 g_return_if_fail (window != NULL);
879 g_return_if_fail (GDK_IS_WINDOW (window));
882 g_print ("gdk_window_destroy_notify: %p%s\n",
883 GDK_WINDOW_HWND (window),
884 (GDK_WINDOW_DESTROYED (window) ? " (destroyed)" : "")));
886 if (!GDK_WINDOW_DESTROYED (window))
888 if (GDK_WINDOW_TYPE(window) != GDK_WINDOW_FOREIGN)
889 g_warning ("window %p unexpectedly destroyed",
890 GDK_WINDOW_HWND (window));
892 _gdk_window_destroy (window, TRUE);
895 gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
896 g_object_unref (window);
900 get_outer_rect (GdkWindow *window,
907 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
908 exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
910 rect->left = rect->top = 0;
912 rect->bottom = height;
914 API_CALL (AdjustWindowRectEx, (rect, style, FALSE, exstyle));
918 adjust_for_gravity_hints (GdkWindowImplWin32 *impl,
923 if (impl->hint_flags & GDK_HINT_WIN_GRAVITY)
925 gint orig_x = *x, orig_y = *y;
927 switch (impl->hints.win_gravity)
929 case GDK_GRAVITY_NORTH:
930 case GDK_GRAVITY_CENTER:
931 case GDK_GRAVITY_SOUTH:
932 *x -= (outer_rect->right - outer_rect->left) / 2;
933 *x += impl->width / 2;
936 case GDK_GRAVITY_SOUTH_EAST:
937 case GDK_GRAVITY_EAST:
938 case GDK_GRAVITY_NORTH_EAST:
939 *x -= outer_rect->right - outer_rect->left;
943 case GDK_GRAVITY_STATIC:
944 *x += outer_rect->left;
951 switch (impl->hints.win_gravity)
953 case GDK_GRAVITY_WEST:
954 case GDK_GRAVITY_CENTER:
955 case GDK_GRAVITY_EAST:
956 *y -= (outer_rect->bottom - outer_rect->top) / 2;
957 *y += impl->height / 2;
960 case GDK_GRAVITY_SOUTH_WEST:
961 case GDK_GRAVITY_SOUTH:
962 case GDK_GRAVITY_SOUTH_EAST:
963 *y -= outer_rect->bottom - outer_rect->top;
967 case GDK_GRAVITY_STATIC:
968 *y += outer_rect->top;
975 (orig_x != *x || orig_y != *y) ?
976 g_print ("adjust_for_gravity_hints: x: %d->%d, y: %d->%d\n",
977 orig_x, *x, orig_y, *y)
983 show_window_internal (GdkWindow *window,
987 GdkWindowObject *private;
988 HWND old_active_window;
989 gboolean focus_on_map = TRUE;
991 private = (GdkWindowObject *) window;
993 if (private->destroyed)
996 GDK_NOTE (MISC, g_print ("show_window_internal: %p: %s%s%s\n",
997 GDK_WINDOW_HWND (window),
998 _gdk_win32_window_state_to_string (private->state),
999 (raise ? " raise" : ""),
1000 (deiconify ? " deiconify" : "")));
1002 /* If asked to show (not deiconify) an withdrawn and iconified
1006 !GDK_WINDOW_IS_MAPPED (window) &&
1007 (private->state & GDK_WINDOW_STATE_ICONIFIED))
1009 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
1013 /* If asked to just show an iconified window, do nothing. */
1014 if (!deiconify && (private->state & GDK_WINDOW_STATE_ICONIFIED))
1017 /* If asked to deiconify an already noniconified window, do
1018 * nothing. (Especially, don't cause the window to rise and
1019 * activate. There are different calls for that.)
1021 if (deiconify && !(private->state & GDK_WINDOW_STATE_ICONIFIED))
1024 /* If asked to show (but not raise) a window that is already
1025 * visible, do nothing.
1027 if (!deiconify && !raise && IsWindowVisible (GDK_WINDOW_HWND (window)))
1032 if (!GDK_WINDOW_IS_MAPPED (window))
1034 gdk_synthesize_window_state (window,
1035 GDK_WINDOW_STATE_WITHDRAWN,
1037 focus_on_map = private->focus_on_map;
1040 /* Use SetWindowPos to show transparent windows so automatic redraws
1041 * in other windows can be suppressed.
1043 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1045 UINT flags = SWP_SHOWWINDOW | SWP_NOREDRAW | SWP_NOMOVE | SWP_NOSIZE;
1047 flags |= SWP_NOZORDER;
1048 if (!raise || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1049 flags |= SWP_NOACTIVATE;
1051 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP, 0, 0, 0, 0, flags);
1055 old_active_window = GetActiveWindow ();
1057 if (private->state & (GDK_WINDOW_STATE_BELOW | GDK_WINDOW_STATE_ABOVE))
1059 DWORD exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
1061 if (private->state & GDK_WINDOW_STATE_BELOW)
1062 exstyle &= (~WS_EX_TOPMOST);
1063 if (private->state & GDK_WINDOW_STATE_ABOVE)
1064 exstyle |= WS_EX_TOPMOST;
1066 if (!SetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE, exstyle))
1067 WIN32_API_FAILED ("SetWindowLong");
1070 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1071 gdk_window_fullscreen (window);
1072 else if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1073 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
1074 else if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1075 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
1076 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP || !focus_on_map)
1077 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNOACTIVATE);
1079 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
1083 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
1084 SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOPMOST, 0, 0, 0, 0,
1085 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
1086 else if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL
1087 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_DIALOG)
1088 SetForegroundWindow (GDK_WINDOW_HWND (window));
1090 BringWindowToTop (GDK_WINDOW_HWND (window));
1092 else if (old_active_window != GDK_WINDOW_HWND (window))
1093 SetActiveWindow (old_active_window);
1097 gdk_window_show_unraised (GdkWindow *window)
1099 g_return_if_fail (GDK_IS_WINDOW (window));
1101 show_window_internal (window, FALSE, FALSE);
1105 gdk_window_show (GdkWindow *window)
1107 g_return_if_fail (GDK_IS_WINDOW (window));
1109 show_window_internal (window, TRUE, FALSE);
1113 gdk_window_hide (GdkWindow *window)
1115 GdkWindowObject *private;
1117 g_return_if_fail (window != NULL);
1119 private = (GdkWindowObject*) window;
1120 if (private->destroyed)
1123 GDK_NOTE (MISC, g_print ("gdk_window_hide: %p: %s\n",
1124 GDK_WINDOW_HWND (window),
1125 _gdk_win32_window_state_to_string (private->state)));
1127 if (GDK_WINDOW_IS_MAPPED (window))
1128 gdk_synthesize_window_state (window,
1130 GDK_WINDOW_STATE_WITHDRAWN);
1132 _gdk_window_clear_update_area (window);
1134 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
1135 ShowOwnedPopups (GDK_WINDOW_HWND (window), FALSE);
1137 if (GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE) & WS_EX_TRANSPARENT)
1139 SetWindowPos (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1140 SWP_HIDEWINDOW | SWP_NOREDRAW | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE);
1144 ShowWindow (GDK_WINDOW_HWND (window), SW_HIDE);
1149 gdk_window_withdraw (GdkWindow *window)
1151 GdkWindowObject *private;
1153 g_return_if_fail (window != NULL);
1155 private = (GdkWindowObject*) window;
1156 if (private->destroyed)
1159 GDK_NOTE (MISC, g_print ("gdk_window_withdraw: %p: %s\n",
1160 GDK_WINDOW_HWND (window),
1161 _gdk_win32_window_state_to_string (private->state)));
1163 gdk_window_hide (window); /* ??? */
1167 gdk_window_move (GdkWindow *window,
1171 GdkWindowObject *private = (GdkWindowObject *)window;
1172 GdkWindowImplWin32 *impl;
1174 g_return_if_fail (window != NULL);
1175 g_return_if_fail (GDK_IS_WINDOW (window));
1177 if (GDK_WINDOW_DESTROYED (window))
1180 GDK_NOTE (MISC, g_print ("gdk_window_move: %p: +%d+%d\n",
1181 GDK_WINDOW_HWND (window), x, y));
1183 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1185 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1188 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1189 _gdk_window_move_resize_child (window, x, y, impl->width, impl->height);
1194 get_outer_rect (window, impl->width, impl->height, &outer_rect);
1196 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1198 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1199 x - _gdk_offset_x, y - _gdk_offset_y, 0, 0,
1200 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER));
1205 gdk_window_resize (GdkWindow *window,
1209 GdkWindowObject *private = (GdkWindowObject*) window;
1210 GdkWindowImplWin32 *impl;
1212 g_return_if_fail (window != NULL);
1213 g_return_if_fail (GDK_IS_WINDOW (window));
1215 if (GDK_WINDOW_DESTROYED (window))
1223 GDK_NOTE (MISC, g_print ("gdk_window_resize: %p: %dx%d\n",
1224 GDK_WINDOW_HWND (window), width, height));
1226 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1228 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1231 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1232 _gdk_window_move_resize_child (window, private->x, private->y, width, height);
1236 get_outer_rect (window, width, height, &outer_rect);
1238 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1240 outer_rect.right - outer_rect.left,
1241 outer_rect.bottom - outer_rect.top,
1242 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
1243 private->resize_count += 1;
1248 gdk_window_move_resize (GdkWindow *window,
1254 GdkWindowObject *private = (GdkWindowObject*) window;
1255 GdkWindowImplWin32 *impl;
1257 g_return_if_fail (window != NULL);
1258 g_return_if_fail (GDK_IS_WINDOW (window));
1260 if (GDK_WINDOW_DESTROYED (window))
1268 impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
1270 if (private->state & GDK_WINDOW_STATE_FULLSCREEN)
1273 GDK_NOTE (MISC, g_print ("gdk_window_move_resize: %p: %dx%d@+%d+%d\n",
1274 GDK_WINDOW_HWND (window),
1275 width, height, x, y));
1277 if (GDK_WINDOW_TYPE (private) == GDK_WINDOW_CHILD)
1278 _gdk_window_move_resize_child (window, x, y, width, height);
1283 get_outer_rect (window, width, height, &outer_rect);
1285 adjust_for_gravity_hints (impl, &outer_rect, &x, &y);
1287 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), NULL,
1288 x - _gdk_offset_x, y - _gdk_offset_y,
1289 outer_rect.right - outer_rect.left,
1290 outer_rect.bottom - outer_rect.top,
1291 SWP_NOACTIVATE | SWP_NOZORDER));
1296 gdk_window_reparent (GdkWindow *window,
1297 GdkWindow *new_parent,
1301 GdkWindowObject *window_private;
1302 GdkWindowObject *parent_private;
1303 GdkWindowObject *old_parent_private;
1304 GdkWindowImplWin32 *impl;
1306 g_return_if_fail (window != NULL);
1307 g_return_if_fail (GDK_IS_WINDOW (window));
1308 g_return_if_fail (new_parent == NULL || GDK_IS_WINDOW (new_parent));
1309 g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT);
1311 if (GDK_WINDOW_DESTROYED (window) ||
1312 (new_parent && GDK_WINDOW_DESTROYED (new_parent)))
1318 new_parent = _gdk_parent_root;
1320 window_private = (GdkWindowObject*) window;
1321 old_parent_private = (GdkWindowObject *) window_private->parent;
1322 parent_private = (GdkWindowObject*) new_parent;
1323 impl = GDK_WINDOW_IMPL_WIN32 (window_private->impl);
1325 if (!GDK_WINDOW_DESTROYED (window) && !GDK_WINDOW_DESTROYED (new_parent))
1327 GDK_NOTE (MISC, g_print ("gdk_window_reparent: %p: %p\n",
1328 GDK_WINDOW_HWND (window),
1329 GDK_WINDOW_HWND (new_parent)));
1331 API_CALL (SetParent, (GDK_WINDOW_HWND (window),
1332 GDK_WINDOW_HWND (new_parent)));
1334 API_CALL (MoveWindow, (GDK_WINDOW_HWND (window),
1335 x, y, impl->width, impl->height, TRUE));
1338 /* From here on, we treat parents of type GDK_WINDOW_FOREIGN like
1341 if (GDK_WINDOW_TYPE (new_parent) == GDK_WINDOW_FOREIGN)
1342 new_parent = _gdk_parent_root;
1344 window_private->parent = (GdkWindowObject *)new_parent;
1346 if (old_parent_private)
1347 old_parent_private->children =
1348 g_list_remove (old_parent_private->children, window);
1351 if ((old_parent_private &&
1352 (!old_parent_private->guffaw_gravity != !parent_private->guffaw_gravity)) ||
1353 (!old_parent_private && parent_private->guffaw_gravity))
1354 gdk_window_set_static_win_gravity (window, parent_private->guffaw_gravity);
1357 parent_private->children = g_list_prepend (parent_private->children, window);
1358 _gdk_window_init_position (GDK_WINDOW (window_private));
1362 _gdk_windowing_window_clear_area (GdkWindow *window,
1368 GdkWindowImplWin32 *impl;
1370 g_return_if_fail (window != NULL);
1371 g_return_if_fail (GDK_IS_WINDOW (window));
1373 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1375 if (!GDK_WINDOW_DESTROYED (window))
1380 width = impl->width - x;
1382 height = impl->height - y;
1383 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area: %p: "
1385 GDK_WINDOW_HWND (window),
1386 width, height, x, y));
1387 hdc = GetDC (GDK_WINDOW_HWND (window));
1388 IntersectClipRect (hdc, x, y, x + width + 1, y + height + 1);
1389 SendMessage (GDK_WINDOW_HWND (window), WM_ERASEBKGND, (WPARAM) hdc, 0);
1390 GDI_CALL (ReleaseDC, (GDK_WINDOW_HWND (window), hdc));
1395 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1401 g_return_if_fail (window != NULL);
1402 g_return_if_fail (GDK_IS_WINDOW (window));
1404 if (!GDK_WINDOW_DESTROYED (window))
1408 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_clear_area_e: %p: "
1410 GDK_WINDOW_HWND (window),
1411 width, height, x, y));
1414 rect.right = x + width + 1;
1416 rect.bottom = y + height + 1;
1417 GDI_CALL (InvalidateRect, (GDK_WINDOW_HWND (window), &rect, TRUE));
1418 UpdateWindow (GDK_WINDOW_HWND (window));
1423 gdk_window_raise (GdkWindow *window)
1425 g_return_if_fail (window != NULL);
1426 g_return_if_fail (GDK_IS_WINDOW (window));
1428 if (!GDK_WINDOW_DESTROYED (window))
1430 GDK_NOTE (MISC, g_print ("gdk_window_raise: %p\n",
1431 GDK_WINDOW_HWND (window)));
1433 API_CALL (BringWindowToTop, (GDK_WINDOW_HWND (window)));
1438 gdk_window_lower (GdkWindow *window)
1440 g_return_if_fail (window != NULL);
1441 g_return_if_fail (GDK_IS_WINDOW (window));
1443 if (!GDK_WINDOW_DESTROYED (window))
1445 GDK_NOTE (MISC, g_print ("gdk_window_lower: %p\n",
1446 GDK_WINDOW_HWND (window)));
1448 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window), HWND_BOTTOM, 0, 0, 0, 0,
1449 SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE));
1454 gdk_window_set_hints (GdkWindow *window,
1463 /* Note that this function is obsolete */
1465 GdkWindowImplWin32 *impl;
1467 g_return_if_fail (window != NULL);
1468 g_return_if_fail (GDK_IS_WINDOW (window));
1470 if (GDK_WINDOW_DESTROYED (window))
1473 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1475 GDK_NOTE (MISC, g_print ("gdk_window_set_hints: %p: %dx%d..%dx%d @+%d+%d\n",
1476 GDK_WINDOW_HWND (window),
1477 min_width, min_height, max_width, max_height,
1485 geom.min_width = min_width;
1486 geom.min_height = min_height;
1487 geom.max_width = max_width;
1488 geom.max_height = max_height;
1490 if (flags & GDK_HINT_MIN_SIZE)
1491 geom_mask |= GDK_HINT_MIN_SIZE;
1493 if (flags & GDK_HINT_MAX_SIZE)
1494 geom_mask |= GDK_HINT_MAX_SIZE;
1496 gdk_window_set_geometry_hints (window, &geom, geom_mask);
1501 gdk_window_set_geometry_hints (GdkWindow *window,
1502 GdkGeometry *geometry,
1503 GdkWindowHints geom_mask)
1505 GdkWindowImplWin32 *impl;
1507 WINDOWPLACEMENT size_hints;
1509 gint new_width = 0, new_height = 0;
1512 g_return_if_fail (window != NULL);
1513 g_return_if_fail (GDK_IS_WINDOW (window));
1515 if (GDK_WINDOW_DESTROYED (window))
1518 GDK_NOTE (MISC, g_print ("gdk_window_set_geometry_hints: %p\n",
1519 GDK_WINDOW_HWND (window)));
1521 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1523 impl->hint_flags = geom_mask;
1524 impl->hints = *geometry;
1526 if (geom_mask & GDK_HINT_POS)
1527 ; /* even the X11 mplementation doesn't care */
1529 if (geom_mask & GDK_HINT_MIN_SIZE)
1531 GDK_NOTE (MISC, g_print ("... MIN_SIZE: %dx%d\n",
1532 geometry->min_width, geometry->min_height));
1535 /* Check if the current size of the window is in bounds */
1536 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1538 if (rect.right < geometry->min_width &&
1539 rect.bottom < geometry->min_height)
1541 new_width = geometry->min_width;
1542 new_height = geometry->min_height;
1544 else if (rect.right < geometry->min_width)
1546 new_width = geometry->min_width;
1547 new_height = rect.bottom;
1549 else if (rect.bottom < geometry->min_height)
1551 new_width = rect.right;
1552 new_height = geometry->min_height;
1557 if (geom_mask & GDK_HINT_MAX_SIZE)
1559 GDK_NOTE (MISC, g_print ("... MAX_SIZE: %dx%d\n",
1560 geometry->max_width, geometry->max_height));
1563 /* Check if the current size of the window is in bounds */
1564 GetClientRect (GDK_WINDOW_HWND (window), &rect);
1566 if (rect.right > geometry->max_width &&
1567 rect.bottom > geometry->max_height)
1569 new_width = geometry->max_width;
1570 new_height = geometry->max_height;
1572 else if (rect.right > geometry->max_width)
1574 new_width = geometry->max_width;
1575 new_height = rect.bottom;
1577 else if (rect.bottom > geometry->max_height)
1579 new_width = rect.right;
1580 new_height = geometry->max_height;
1586 /* Apply new size constraints */
1587 if (new_width != 0 && new_height != 0)
1588 gdk_window_resize (window, new_width, new_height);
1591 if (geom_mask & GDK_HINT_BASE_SIZE)
1593 GDK_NOTE (MISC, g_print ("... BASE_SIZE: %dx%d\n",
1594 geometry->base_width, geometry->base_height));
1597 size_hints.length = sizeof (size_hints);
1599 if (API_CALL (GetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints)))
1602 g_print ("... rcNormalPosition: (%ld,%ld)--(%ld,%ld)\n",
1603 size_hints.rcNormalPosition.left,
1604 size_hints.rcNormalPosition.top,
1605 size_hints.rcNormalPosition.right,
1606 size_hints.rcNormalPosition.bottom));
1607 size_hints.rcNormalPosition.right =
1608 size_hints.rcNormalPosition.left + geometry->base_width;
1609 size_hints.rcNormalPosition.bottom =
1610 size_hints.rcNormalPosition.top + geometry->base_height;
1611 GDK_NOTE (MISC, g_print ("...setting: rcNormal: (%ld,%ld)--(%ld,%ld)\n",
1612 size_hints.rcNormalPosition.left,
1613 size_hints.rcNormalPosition.top,
1614 size_hints.rcNormalPosition.right,
1615 size_hints.rcNormalPosition.bottom));
1616 API_CALL (SetWindowPlacement, (GDK_WINDOW_HWND (window), &size_hints));
1621 if (geom_mask & GDK_HINT_RESIZE_INC)
1623 GDK_NOTE (MISC, g_print ("... RESIZE_INC: (%d,%d)\n",
1624 geometry->width_inc, geometry->height_inc));
1627 if (geom_mask & GDK_HINT_ASPECT)
1629 GDK_NOTE (MISC, g_print ("... ASPECT: %g--%g\n",
1630 geometry->min_aspect, geometry->max_aspect));
1633 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1635 GDK_NOTE (MISC, g_print ("... GRAVITY: %d\n", geometry->win_gravity));
1640 gdk_window_set_title (GdkWindow *window,
1645 g_return_if_fail (window != NULL);
1646 g_return_if_fail (GDK_IS_WINDOW (window));
1647 g_return_if_fail (title != NULL);
1649 /* Empty window titles not allowed, so set it to just a period. */
1653 GDK_NOTE (MISC, g_print ("gdk_window_set_title: %p: %s\n",
1654 GDK_WINDOW_HWND (window), title));
1656 if (!GDK_WINDOW_DESTROYED (window))
1658 /* As the title is in UTF-8 we must translate it
1659 * to the system codepage.
1661 mbtitle = g_locale_from_utf8 (title, -1, NULL, NULL, NULL);
1662 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), mbtitle));
1668 gdk_window_set_role (GdkWindow *window,
1671 g_return_if_fail (window != NULL);
1672 g_return_if_fail (GDK_IS_WINDOW (window));
1674 GDK_NOTE (MISC, g_print ("gdk_window_set_role: %p: %s\n",
1675 GDK_WINDOW_HWND (window),
1676 (role ? role : "NULL")));
1681 gdk_window_set_transient_for (GdkWindow *window,
1684 HWND window_id, parent_id;
1686 g_return_if_fail (window != NULL);
1687 g_return_if_fail (GDK_IS_WINDOW (window));
1689 GDK_NOTE (MISC, g_print ("gdk_window_set_transient_for: %p: %p\n",
1690 GDK_WINDOW_HWND (window),
1691 GDK_WINDOW_HWND (parent)));
1693 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
1696 if (((GdkWindowObject *) window)->window_type == GDK_WINDOW_CHILD)
1698 GDK_NOTE (MISC, g_print ("...a child window!\n"));
1702 window_id = GDK_WINDOW_HWND (window);
1703 parent_id = GDK_WINDOW_HWND (parent);
1705 /* This changes the *owner* of the window, despite the misleading
1706 * name. (Owner and parent are unrelated concepts.) At least that's
1707 * what people who seem to know what they talk about say on
1708 * USENET. Search on Google.
1711 if (SetWindowLong (window_id, GWL_HWNDPARENT, (long) parent_id) == 0 &&
1712 GetLastError () != 0)
1713 WIN32_API_FAILED ("SetWindowLong");
1717 gdk_window_set_background (GdkWindow *window,
1718 const GdkColor *color)
1720 GdkWindowObject *private = (GdkWindowObject *)window;
1722 g_return_if_fail (window != NULL);
1723 g_return_if_fail (GDK_IS_WINDOW (window));
1725 GDK_NOTE (MISC, g_print ("gdk_window_set_background: %p: %s\n",
1726 GDK_WINDOW_HWND (window),
1727 _gdk_win32_color_to_string (color)));
1729 private->bg_color = *color;
1731 if (private->bg_pixmap &&
1732 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1733 private->bg_pixmap != GDK_NO_BG)
1735 g_object_unref (private->bg_pixmap);
1736 private->bg_pixmap = NULL;
1741 gdk_window_set_back_pixmap (GdkWindow *window,
1743 gint parent_relative)
1745 GdkWindowObject *private = (GdkWindowObject *)window;
1747 g_return_if_fail (window != NULL);
1748 g_return_if_fail (GDK_IS_WINDOW (window));
1749 g_return_if_fail (pixmap == NULL || !parent_relative);
1750 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1752 if (private->bg_pixmap &&
1753 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1754 private->bg_pixmap != GDK_NO_BG)
1755 g_object_unref (private->bg_pixmap);
1757 if (parent_relative)
1759 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1760 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1766 g_object_ref (pixmap);
1767 private->bg_pixmap = pixmap;
1771 private->bg_pixmap = GDK_NO_BG;
1777 gdk_window_set_cursor (GdkWindow *window,
1780 GdkWindowImplWin32 *impl;
1781 GdkCursorPrivate *cursor_private;
1782 GdkWindowObject *parent_window;
1784 HCURSOR hprevcursor;
1786 g_return_if_fail (window != NULL);
1787 g_return_if_fail (GDK_IS_WINDOW (window));
1789 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
1790 cursor_private = (GdkCursorPrivate*) cursor;
1792 if (GDK_WINDOW_DESTROYED (window))
1798 hcursor = cursor_private->hcursor;
1800 GDK_NOTE (MISC, g_print ("gdk_window_set_cursor: %p: %p\n",
1801 GDK_WINDOW_HWND (window),
1804 /* First get the old cursor, if any (we wait to free the old one
1805 * since it may be the current cursor set in the Win32 API right
1808 hprevcursor = impl->hcursor;
1810 if (hcursor == NULL)
1811 impl->hcursor = NULL;
1814 /* We must copy the cursor as it is OK to destroy the GdkCursor
1815 * while still in use for some window. See for instance
1816 * gimp_change_win_cursor() which calls gdk_window_set_cursor
1817 * (win, cursor), and immediately afterwards gdk_cursor_destroy
1820 if ((impl->hcursor = CopyCursor (hcursor)) == NULL)
1821 WIN32_API_FAILED ("CopyCursor");
1822 GDK_NOTE (MISC, g_print ("...CopyCursor (%p) = %p\n",
1823 hcursor, impl->hcursor));
1826 /* If the pointer is over our window, set new cursor if given */
1827 if (gdk_window_get_pointer(window, NULL, NULL, NULL) == window)
1828 if (impl->hcursor != NULL)
1829 SetCursor (impl->hcursor);
1831 /* Destroy the previous cursor: Need to make sure it's no longer in
1832 * use before we destroy it, in case we're not over our window but
1833 * the cursor is still set to our old one.
1835 if (hprevcursor != NULL)
1837 if (GetCursor() == hprevcursor)
1839 /* Look for a suitable cursor to use instead */
1841 parent_window = GDK_WINDOW_OBJECT (window)->parent;
1842 while (hcursor == NULL)
1846 impl = GDK_WINDOW_IMPL_WIN32 (parent_window->impl);
1847 hcursor = impl->hcursor;
1848 parent_window = parent_window->parent;
1852 hcursor = LoadCursor (NULL, IDC_ARROW);
1855 SetCursor (hcursor);
1858 GDK_NOTE (MISC, g_print ("...DestroyCursor (%p)\n",
1861 API_CALL (DestroyCursor, (hprevcursor));
1866 gdk_window_get_geometry (GdkWindow *window,
1873 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1876 window = _gdk_parent_root;
1878 if (!GDK_WINDOW_DESTROYED (window))
1882 API_CALL (GetClientRect, (GDK_WINDOW_HWND (window), &rect));
1884 if (window != _gdk_parent_root)
1887 GdkWindow *parent = gdk_window_get_parent (window);
1891 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1892 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1898 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1899 ScreenToClient (GDK_WINDOW_HWND (parent), &pt);
1903 if (parent == _gdk_parent_root)
1905 rect.left += _gdk_offset_x;
1906 rect.top += _gdk_offset_y;
1907 rect.right += _gdk_offset_x;
1908 rect.bottom += _gdk_offset_y;
1917 *width = rect.right - rect.left;
1919 *height = rect.bottom - rect.top;
1921 *depth = gdk_drawable_get_visual (window)->depth;
1923 GDK_NOTE (MISC, g_print ("gdk_window_get_geometry: %p: %ldx%ldx%d@+%ld+%ld\n",
1924 GDK_WINDOW_HWND (window),
1925 rect.right - rect.left, rect.bottom - rect.top,
1926 gdk_drawable_get_visual (window)->depth,
1927 rect.left, rect.top));
1932 gdk_window_get_origin (GdkWindow *window,
1940 g_return_val_if_fail (window != NULL, 0);
1942 if (!GDK_WINDOW_DESTROYED (window))
1948 ClientToScreen (GDK_WINDOW_HWND (window), &pt);
1957 *x = tx + _gdk_offset_x;
1959 *y = ty + _gdk_offset_y;
1961 GDK_NOTE (MISC, g_print ("gdk_window_get_origin: %p: +%d+%d\n",
1962 GDK_WINDOW_HWND (window),
1968 gdk_window_get_deskrelative_origin (GdkWindow *window,
1972 return gdk_window_get_origin (window, x, y);
1976 gdk_window_get_root_origin (GdkWindow *window,
1982 g_return_if_fail (GDK_IS_WINDOW (window));
1984 gdk_window_get_frame_extents (window, &rect);
1992 GDK_NOTE (MISC, g_print ("gdk_window_get_root_origin: %p: +%d+%d\n",
1993 GDK_WINDOW_HWND (window), rect.x, rect.y));
1997 gdk_window_get_frame_extents (GdkWindow *window,
2000 GdkWindowObject *private;
2004 g_return_if_fail (GDK_IS_WINDOW (window));
2005 g_return_if_fail (rect != NULL);
2007 private = GDK_WINDOW_OBJECT (window);
2014 if (GDK_WINDOW_DESTROYED (window))
2017 /* FIXME: window is documented to be a toplevel GdkWindow, so is it really
2018 * necessary to walk its parent chain?
2020 while (private->parent && ((GdkWindowObject*) private->parent)->parent)
2021 private = (GdkWindowObject*) private->parent;
2023 hwnd = GDK_WINDOW_HWND (window);
2024 API_CALL (GetWindowRect, (hwnd, &r));
2026 rect->x = r.left + _gdk_offset_x;
2027 rect->y = r.top + _gdk_offset_y;
2028 rect->width = r.right - r.left;
2029 rect->height = r.bottom - r.top;
2031 GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@+%ld+%ld\n",
2032 GDK_WINDOW_HWND (window),
2033 r.right - r.left, r.bottom - r.top,
2038 _gdk_windowing_window_get_pointer (GdkDisplay *display,
2042 GdkModifierType *mask)
2044 GdkWindow *return_val;
2045 POINT screen_point, point;
2049 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
2052 GetCursorPos (&screen_point);
2053 point = screen_point;
2054 ScreenToClient (GDK_WINDOW_HWND (window), &point);
2059 if (window == _gdk_parent_root)
2061 *x += _gdk_offset_x;
2062 *y += _gdk_offset_y;
2065 hwnd = WindowFromPoint (screen_point);
2068 gboolean done = FALSE;
2072 point = screen_point;
2073 ScreenToClient (hwnd, &point);
2074 hwndc = ChildWindowFromPoint (hwnd, point);
2077 else if (hwndc == hwnd)
2083 return_val = gdk_window_lookup ((GdkNativeWindow) hwnd);
2088 GetKeyboardState (kbd);
2090 if (kbd[VK_SHIFT] & 0x80)
2091 *mask |= GDK_SHIFT_MASK;
2092 if (kbd[VK_CAPITAL] & 0x80)
2093 *mask |= GDK_LOCK_MASK;
2094 if (kbd[VK_CONTROL] & 0x80)
2095 *mask |= GDK_CONTROL_MASK;
2096 if (kbd[VK_MENU] & 0x80)
2097 *mask |= GDK_MOD1_MASK;
2098 if (kbd[VK_LBUTTON] & 0x80)
2099 *mask |= GDK_BUTTON1_MASK;
2100 if (kbd[VK_MBUTTON] & 0x80)
2101 *mask |= GDK_BUTTON2_MASK;
2102 if (kbd[VK_RBUTTON] & 0x80)
2103 *mask |= GDK_BUTTON3_MASK;
2109 _gdk_windowing_get_pointer (GdkDisplay *display,
2113 GdkModifierType *mask)
2115 GdkScreen *default_screen = gdk_display_get_default_screen (display);
2116 GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
2118 *screen = default_screen;
2119 _gdk_windowing_window_get_pointer (display, root_window, x, y, mask);
2123 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2128 POINT point, pointc;
2132 GetCursorPos (&pointc);
2134 hwnd = WindowFromPoint (point);
2138 window = _gdk_parent_root;
2139 *win_x = pointc.x + _gdk_offset_x;
2140 *win_y = pointc.y + _gdk_offset_y;
2144 ScreenToClient (hwnd, &point);
2147 hwndc = ChildWindowFromPoint (hwnd, point);
2148 ClientToScreen (hwnd, &point);
2149 ScreenToClient (hwndc, &point);
2150 } while (hwndc != hwnd && (hwnd = hwndc, 1));
2152 window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
2154 if (window && (win_x || win_y))
2156 GetClientRect (hwnd, &rect);
2157 *win_x = point.x - rect.left;
2158 *win_y = point.y - rect.top;
2161 GDK_NOTE (MISC, g_print ("_gdk_windowing_window_at_pointer: +%d+%d %p%s\n",
2164 (window == NULL ? " NULL" : "")));
2170 gdk_window_get_events (GdkWindow *window)
2172 g_return_val_if_fail (window != NULL, 0);
2173 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
2175 if (GDK_WINDOW_DESTROYED (window))
2178 return GDK_WINDOW_OBJECT (window)->event_mask;
2182 gdk_window_set_events (GdkWindow *window,
2183 GdkEventMask event_mask)
2185 g_return_if_fail (window != NULL);
2186 g_return_if_fail (GDK_IS_WINDOW (window));
2188 if (GDK_WINDOW_DESTROYED (window))
2191 /* gdk_window_new() always sets the GDK_STRUCTURE_MASK, so better
2192 * set it here, too. Not that I know or remember why it is
2193 * necessary, will have to test some day.
2195 GDK_WINDOW_OBJECT (window)->event_mask = GDK_STRUCTURE_MASK | event_mask;
2199 gdk_window_shape_combine_mask (GdkWindow *window,
2203 g_return_if_fail (window != NULL);
2204 g_return_if_fail (GDK_IS_WINDOW (window));
2208 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: none\n",
2209 GDK_WINDOW_HWND (window)));
2210 SetWindowRgn (GDK_WINDOW_HWND (window), NULL, TRUE);
2217 /* Convert mask bitmap to region */
2218 hrgn = _gdk_win32_bitmap_to_hrgn (mask);
2220 GDK_NOTE (MISC, g_print ("gdk_window_shape_combine_mask: %p: %p\n",
2221 GDK_WINDOW_HWND (window),
2222 GDK_WINDOW_HWND (mask)));
2224 _gdk_win32_get_adjusted_client_rect (window, &rect);
2226 OffsetRgn (hrgn, -rect.left, -rect.top);
2227 OffsetRgn (hrgn, x, y);
2229 /* If this is a top-level window, add the title bar to the region */
2230 if (GDK_WINDOW_TYPE (window) == GDK_WINDOW_TOPLEVEL)
2232 HRGN tmp = CreateRectRgn (0, 0, rect.right - rect.left, -rect.top);
2233 CombineRgn (hrgn, hrgn, tmp, RGN_OR);
2237 SetWindowRgn (GDK_WINDOW_HWND (window), hrgn, TRUE);
2242 gdk_window_set_override_redirect (GdkWindow *window,
2243 gboolean override_redirect)
2245 g_return_if_fail (window != NULL);
2246 g_return_if_fail (GDK_IS_WINDOW (window));
2248 g_warning ("gdk_window_set_override_redirect not implemented");
2252 gdk_window_set_accept_focus (GdkWindow *window,
2253 gboolean accept_focus)
2255 GdkWindowObject *private;
2256 g_return_if_fail (window != NULL);
2257 g_return_if_fail (GDK_IS_WINDOW (window));
2259 private = (GdkWindowObject *)window;
2261 accept_focus = accept_focus != FALSE;
2263 if (private->accept_focus != accept_focus)
2264 private->accept_focus = accept_focus;
2268 gdk_window_set_focus_on_map (GdkWindow *window,
2269 gboolean focus_on_map)
2271 GdkWindowObject *private;
2272 g_return_if_fail (window != NULL);
2273 g_return_if_fail (GDK_IS_WINDOW (window));
2275 private = (GdkWindowObject *)window;
2277 focus_on_map = focus_on_map != FALSE;
2279 if (private->focus_on_map != focus_on_map)
2280 private->focus_on_map = focus_on_map;
2284 pixbuf_to_hicon_alpha_winxp (GdkWindow *window,
2287 /* Based on code from
2288 * http://www.dotnet247.com/247reference/msgs/13/66301.aspx
2292 HBITMAP hBitmap, hMonoBitmap;
2293 guchar *indata, *inrow;
2294 guchar *outdata, *outrow;
2295 HICON hAlphaIcon = NULL;
2297 gint width, height, i, j, rowstride;
2302 width = gdk_pixbuf_get_width (pixbuf); /* width of icon */
2303 height = gdk_pixbuf_get_height (pixbuf); /* height of icon */
2305 ZeroMemory (&bi, sizeof (BITMAPV5HEADER));
2306 bi.bV5Size = sizeof (BITMAPV5HEADER);
2307 bi.bV5Width = width;
2308 bi.bV5Height = height;
2310 bi.bV5BitCount = 32;
2311 bi.bV5Compression = BI_BITFIELDS;
2312 /* The following mask specification specifies a supported 32 BPP
2313 * alpha format for Windows XP (BGRA format).
2315 bi.bV5RedMask = 0x00FF0000;
2316 bi.bV5GreenMask = 0x0000FF00;
2317 bi.bV5BlueMask = 0x000000FF;
2318 bi.bV5AlphaMask = 0xFF000000;
2320 /* Create the DIB section with an alpha channel. */
2322 hBitmap = CreateDIBSection (hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS,
2323 (void **)&outdata, NULL, (DWORD)0);
2324 ReleaseDC (NULL, hdc);
2326 /* Draw something on the DIB section */
2327 indata = gdk_pixbuf_get_pixels (pixbuf);
2328 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
2329 for (j=0; j<height; j++)
2331 outrow = outdata + 4*j*width;
2332 inrow = indata + (height-j-1)*rowstride;
2333 for (i=0; i<width; i++)
2335 outrow[4*i+0] = inrow[4*i+2];
2336 outrow[4*i+1] = inrow[4*i+1];
2337 outrow[4*i+2] = inrow[4*i+0];
2338 outrow[4*i+3] = inrow[4*i+3];
2342 /* Create an empty mask bitmap */
2343 hMonoBitmap = CreateBitmap (width, height, 1, 1, NULL);
2348 ii.hbmMask = hMonoBitmap;
2349 ii.hbmColor = hBitmap;
2351 /* Create the alpha cursor with the alpha DIB section */
2352 hAlphaIcon = CreateIconIndirect (&ii);
2354 GDI_CALL (DeleteObject, (hBitmap));
2355 GDI_CALL (DeleteObject, (hMonoBitmap));
2361 pixbuf_to_hicon_normal (GdkWindow *window,
2366 HBITMAP hbmmask = NULL;
2374 /* create a normal icon with a bitmap mask */
2375 w = gdk_pixbuf_get_width (pixbuf);
2376 h = gdk_pixbuf_get_height (pixbuf);
2377 gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf,
2378 gdk_drawable_get_colormap (window),
2383 /* we need the inverted mask for the XOR op */
2385 HDC hdc1 = CreateCompatibleDC (NULL);
2388 hbmmask = CreateCompatibleBitmap (hdc1, w, h);
2389 hbmold1 = SelectObject (hdc1, hbmmask);
2392 HDC hdc2 = CreateCompatibleDC (NULL);
2393 HBITMAP hbmold2 = SelectObject (hdc2, GDK_PIXMAP_HBITMAP (mask));
2394 GDI_CALL (BitBlt, (hdc1, 0,0,w,h, hdc2, 0,0, NOTSRCCOPY));
2395 GDI_CALL (SelectObject, (hdc2, hbmold2));
2396 GDI_CALL (DeleteDC, (hdc2));
2401 GetClipBox (hdc1, &rect);
2402 GDI_CALL (FillRect, (hdc1, &rect, GetStockObject (BLACK_BRUSH)));
2404 GDI_CALL (SelectObject, (hdc1, hbmold1));
2405 GDI_CALL (DeleteDC, (hdc1));
2409 ii.xHotspot = ii.yHotspot = 0; /* ignored for icons */
2410 ii.hbmMask = hbmmask;
2411 ii.hbmColor = GDK_PIXMAP_HBITMAP (pixmap);
2412 hIcon = CreateIconIndirect (&ii);
2414 WIN32_API_FAILED ("CreateIconIndirect");
2415 GDI_CALL (DeleteObject, (hbmmask));
2417 #if 0 /* to debug pixmap and mask setting */
2420 GdkPixbuf* pixbuf = NULL;
2423 pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, w, h);
2426 num = (num + 1) % 999; /* restrict maximim number */
2427 sprintf (name, "c:\\temp\\ico%03dpixm.png", num);
2428 gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL);
2429 gdk_pixbuf_unref (pixbuf);
2435 g_object_unref (G_OBJECT (pixmap));
2437 g_object_unref (G_OBJECT (mask));
2443 pixbuf_to_hicon (GdkWindow *window,
2446 static gboolean is_win_xp=FALSE, is_win_xp_checked=FALSE;
2448 if (!is_win_xp_checked)
2450 OSVERSIONINFO version;
2452 is_win_xp_checked = TRUE;
2453 memset (&version, 0, sizeof (version));
2454 version.dwOSVersionInfoSize = sizeof (version);
2455 is_win_xp = GetVersionEx (&version)
2456 && version.dwPlatformId == VER_PLATFORM_WIN32_NT
2457 && (version.dwMajorVersion > 5
2458 || (version.dwMajorVersion == 5 && version.dwMinorVersion >= 1));
2464 if (is_win_xp && gdk_pixbuf_get_has_alpha (pixbuf))
2465 return pixbuf_to_hicon_alpha_winxp (window, pixbuf);
2467 return pixbuf_to_hicon_normal (window, pixbuf);
2471 gdk_window_set_icon_list (GdkWindow *window,
2474 GdkPixbuf *pixbuf, *big_pixbuf, *small_pixbuf;
2475 gint big_diff, small_diff;
2476 gint big_w, big_h, small_w, small_h;
2479 HICON small_hicon, big_hicon;
2480 GdkWindowImplWin32 *impl;
2481 gint i, big_i, small_i;
2483 g_return_if_fail (GDK_IS_WINDOW (window));
2485 if (GDK_WINDOW_DESTROYED (window))
2488 impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl);
2490 /* ideal sizes for small and large icons */
2491 big_w = GetSystemMetrics (SM_CXICON);
2492 big_h = GetSystemMetrics (SM_CYICON);
2493 small_w = GetSystemMetrics (SM_CXSMICON);
2494 small_h = GetSystemMetrics (SM_CYSMICON);
2496 /* find closest sized icons in the list */
2498 small_pixbuf = NULL;
2504 pixbuf = (GdkPixbuf*) pixbufs->data;
2505 w = gdk_pixbuf_get_width (pixbuf);
2506 h = gdk_pixbuf_get_height (pixbuf);
2508 dw = ABS (w - big_w);
2509 dh = ABS (h - big_h);
2510 diff = dw*dw + dh*dh;
2511 if (big_pixbuf == NULL || diff < big_diff)
2513 big_pixbuf = pixbuf;
2518 dw = ABS(w - small_w);
2519 dh = ABS(h - small_h);
2520 diff = dw*dw + dh*dh;
2521 if (small_pixbuf == NULL || diff < small_diff)
2523 small_pixbuf = pixbuf;
2528 pixbufs = g_list_next (pixbufs);
2532 /* Create the icons */
2533 big_hicon = pixbuf_to_hicon (window, big_pixbuf);
2534 small_hicon = pixbuf_to_hicon (window, small_pixbuf);
2537 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG,
2539 SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_SMALL,
2540 (LPARAM)small_hicon);
2542 /* Store the icons, destroying any previous icons */
2543 if (impl->hicon_big)
2544 GDI_CALL (DestroyIcon, (impl->hicon_big));
2545 impl->hicon_big = big_hicon;
2546 if (impl->hicon_small)
2547 GDI_CALL (DestroyIcon, (impl->hicon_small));
2548 impl->hicon_small = small_hicon;
2552 gdk_window_set_icon (GdkWindow *window,
2553 GdkWindow *icon_window,
2557 g_return_if_fail (window != NULL);
2558 g_return_if_fail (GDK_IS_WINDOW (window));
2560 /* do nothing, use gdk_window_set_icon_list instead */
2564 gdk_window_set_icon_name (GdkWindow *window,
2567 g_return_if_fail (window != NULL);
2568 g_return_if_fail (GDK_IS_WINDOW (window));
2570 if (GDK_WINDOW_DESTROYED (window))
2573 API_CALL (SetWindowText, (GDK_WINDOW_HWND (window), name));
2577 gdk_window_get_group (GdkWindow *window)
2579 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
2580 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2582 if (GDK_WINDOW_DESTROYED (window))
2585 g_warning ("gdk_window_get_group not yet implemented");
2591 gdk_window_set_group (GdkWindow *window,
2594 g_return_if_fail (window != NULL);
2595 g_return_if_fail (GDK_IS_WINDOW (window));
2596 g_return_if_fail (leader != NULL);
2597 g_return_if_fail (GDK_IS_WINDOW (leader));
2599 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
2602 g_warning ("gdk_window_set_group not implemented");
2606 gdk_window_set_decorations (GdkWindow *window,
2607 GdkWMDecoration decorations)
2610 const LONG settable_bits = WS_BORDER|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
2612 g_return_if_fail (window != NULL);
2613 g_return_if_fail (GDK_IS_WINDOW (window));
2615 GDK_NOTE (MISC, g_print ("gdk_window_set_decorations: %p: %s%s%s%s%s%s%s\n",
2616 GDK_WINDOW_HWND (window),
2617 (decorations & GDK_DECOR_ALL ? "ALL " : ""),
2618 (decorations & GDK_DECOR_BORDER ? "BORDER " : ""),
2619 (decorations & GDK_DECOR_RESIZEH ? "RESIZEH " : ""),
2620 (decorations & GDK_DECOR_TITLE ? "TITLE " : ""),
2621 (decorations & GDK_DECOR_MENU ? "MENU " : ""),
2622 (decorations & GDK_DECOR_MINIMIZE ? "MINIMIZE " : ""),
2623 (decorations & GDK_DECOR_MAXIMIZE ? "MAXIMIZE " : "")));
2625 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2629 if (decorations & GDK_DECOR_BORDER)
2631 if (decorations & GDK_DECOR_RESIZEH)
2632 bits |= WS_THICKFRAME;
2633 if (decorations & GDK_DECOR_TITLE)
2635 if (decorations & GDK_DECOR_MENU)
2637 if (decorations & GDK_DECOR_MINIMIZE)
2638 bits |= WS_MINIMIZEBOX;
2639 if (decorations & GDK_DECOR_MAXIMIZE)
2640 bits |= WS_MAXIMIZEBOX;
2642 if (decorations & GDK_DECOR_ALL)
2643 style |= settable_bits, style &= ~bits;
2645 style &= ~settable_bits, style |= bits;
2647 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2648 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2649 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2650 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2654 gdk_window_get_decorations(GdkWindow *window,
2655 GdkWMDecoration *decorations)
2657 LONG style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2661 if (style & WS_BORDER)
2662 *decorations |= GDK_DECOR_BORDER;
2663 if (style & WS_THICKFRAME)
2664 *decorations |= GDK_DECOR_RESIZEH;
2665 if (style & WS_CAPTION)
2666 *decorations |= GDK_DECOR_TITLE;
2667 if (style & WS_SYSMENU)
2668 *decorations |= GDK_DECOR_MENU;
2669 if (style & WS_MINIMIZEBOX)
2670 *decorations |= GDK_DECOR_MINIMIZE;
2671 if (style & WS_MAXIMIZEBOX)
2672 *decorations |= GDK_DECOR_MAXIMIZE;
2674 return *decorations != 0;
2678 gdk_window_set_functions (GdkWindow *window,
2679 GdkWMFunction functions)
2682 const LONG settable_bits = (WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU);
2684 g_return_if_fail (window != NULL);
2685 g_return_if_fail (GDK_IS_WINDOW (window));
2687 GDK_NOTE (MISC, g_print ("gdk_window_set_functions: %p: %s%s%s%s%s%s\n",
2688 GDK_WINDOW_HWND (window),
2689 (functions & GDK_FUNC_ALL ? "ALL " : ""),
2690 (functions & GDK_FUNC_RESIZE ? "RESIZE " : ""),
2691 (functions & GDK_FUNC_MOVE ? "MOVE " : ""),
2692 (functions & GDK_FUNC_MINIMIZE ? "MINIMIZE " : ""),
2693 (functions & GDK_FUNC_MAXIMIZE ? "MAXIMIZE " : ""),
2694 (functions & GDK_FUNC_CLOSE ? "CLOSE " : "")));
2696 style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
2700 if (functions & GDK_FUNC_RESIZE)
2701 bits |= WS_THICKFRAME;
2702 if (functions & GDK_FUNC_MOVE)
2703 bits |= (WS_THICKFRAME|WS_SYSMENU);
2704 if (functions & GDK_FUNC_MINIMIZE)
2705 bits |= WS_MINIMIZEBOX;
2706 if (functions & GDK_FUNC_MAXIMIZE)
2707 bits |= WS_MAXIMIZEBOX;
2708 if (functions & GDK_FUNC_CLOSE)
2711 if (functions & GDK_FUNC_ALL)
2712 style |= settable_bits, style &= ~bits;
2714 style &= ~settable_bits, style |= bits;
2716 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, style);
2717 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
2718 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
2719 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
2723 QueryTree (HWND hwnd,
2733 child = GetWindow (hwnd, GW_CHILD);
2735 child = GetWindow (child, GW_HWNDNEXT);
2738 } while (child != NULL);
2742 *children = g_new (HWND, n);
2743 for (i = 0; i < n; i++)
2746 child = GetWindow (hwnd, GW_CHILD);
2748 child = GetWindow (child, GW_HWNDNEXT);
2749 *children[i] = child;
2755 gdk_propagate_shapes (HANDLE win,
2759 HRGN region, childRegion;
2763 SetRectEmpty (&emptyRect);
2764 region = CreateRectRgnIndirect (&emptyRect);
2766 GetWindowRgn (win, region);
2768 QueryTree (win, &list, &num);
2771 WINDOWPLACEMENT placement;
2773 placement.length = sizeof (WINDOWPLACEMENT);
2774 /* go through all child windows and combine regions */
2775 for (i = 0; i < num; i++)
2777 GetWindowPlacement (list[i], &placement);
2778 if (placement.showCmd == SW_SHOWNORMAL)
2780 childRegion = CreateRectRgnIndirect (&emptyRect);
2781 GetWindowRgn (list[i], childRegion);
2782 CombineRgn (region, region, childRegion, RGN_OR);
2783 DeleteObject (childRegion);
2786 SetWindowRgn (win, region, TRUE);
2790 DeleteObject (region);
2794 gdk_window_set_child_shapes (GdkWindow *window)
2796 g_return_if_fail (window != NULL);
2797 g_return_if_fail (GDK_IS_WINDOW (window));
2799 if (GDK_WINDOW_DESTROYED (window))
2802 gdk_propagate_shapes (GDK_WINDOW_HWND (window), FALSE);
2806 gdk_window_merge_child_shapes (GdkWindow *window)
2808 g_return_if_fail (window != NULL);
2809 g_return_if_fail (GDK_IS_WINDOW (window));
2811 if (GDK_WINDOW_DESTROYED (window))
2814 gdk_propagate_shapes (GDK_WINDOW_HWND (window), TRUE);
2818 gdk_window_set_static_gravities (GdkWindow *window,
2819 gboolean use_static)
2821 GdkWindowObject *private = (GdkWindowObject *)window;
2823 g_return_val_if_fail (window != NULL, FALSE);
2824 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2826 if (!use_static == !private->guffaw_gravity)
2832 private->guffaw_gravity = use_static;
2838 gdk_window_begin_resize_drag (GdkWindow *window,
2847 g_return_if_fail (GDK_IS_WINDOW (window));
2849 if (GDK_WINDOW_DESTROYED (window))
2852 /* Tell Windows to start interactively resizing the window by pretending that
2853 * the left pointer button was clicked in the suitable edge or corner. This
2854 * will only work if the button is down when this function is called, and
2855 * will only work with button 1 (left), since Windows only allows window
2856 * dragging using the left mouse button */
2860 /* Must break the automatic grab that occured when the button was pressed,
2861 * otherwise it won't work */
2862 gdk_display_pointer_ungrab (gdk_display_get_default (), 0);
2866 case GDK_WINDOW_EDGE_NORTH_WEST:
2867 winedge = HTTOPLEFT;
2870 case GDK_WINDOW_EDGE_NORTH:
2874 case GDK_WINDOW_EDGE_NORTH_EAST:
2875 winedge = HTTOPRIGHT;
2878 case GDK_WINDOW_EDGE_WEST:
2882 case GDK_WINDOW_EDGE_EAST:
2886 case GDK_WINDOW_EDGE_SOUTH_WEST:
2887 winedge = HTBOTTOMLEFT;
2890 case GDK_WINDOW_EDGE_SOUTH:
2894 case GDK_WINDOW_EDGE_SOUTH_EAST:
2896 winedge = HTBOTTOMRIGHT;
2900 DefWindowProc (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, winedge,
2901 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2905 gdk_window_begin_move_drag (GdkWindow *window,
2911 g_return_if_fail (GDK_IS_WINDOW (window));
2913 if (GDK_WINDOW_DESTROYED (window))
2916 /* Tell Windows to start interactively moving the window by pretending that
2917 * the left pointer button was clicked in the titlebar. This will only work
2918 * if the button is down when this function is called, and will only work
2919 * with button 1 (left), since Windows only allows window dragging using the
2920 * left mouse button */
2924 /* Must break the automatic grab that occured when the button was pressed,
2925 * otherwise it won't work */
2926 gdk_display_pointer_ungrab (gdk_display_get_default (), 0);
2928 DefWindowProc (GDK_WINDOW_HWND (window), WM_NCLBUTTONDOWN, HTCAPTION,
2929 MAKELPARAM (root_x - _gdk_offset_x, root_y - _gdk_offset_y));
2934 * Setting window states
2937 gdk_window_iconify (GdkWindow *window)
2939 HWND old_active_window;
2941 g_return_if_fail (window != NULL);
2942 g_return_if_fail (GDK_IS_WINDOW (window));
2944 if (GDK_WINDOW_DESTROYED (window))
2947 GDK_NOTE (MISC, g_print ("gdk_window_iconify: %p: %s\n",
2948 GDK_WINDOW_HWND (window),
2949 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2951 if (GDK_WINDOW_IS_MAPPED (window))
2953 old_active_window = GetActiveWindow ();
2954 ShowWindow (GDK_WINDOW_HWND (window), SW_MINIMIZE);
2955 if (old_active_window != GDK_WINDOW_HWND (window))
2956 SetActiveWindow (old_active_window);
2960 gdk_synthesize_window_state (window,
2962 GDK_WINDOW_STATE_ICONIFIED);
2967 gdk_window_deiconify (GdkWindow *window)
2969 g_return_if_fail (window != NULL);
2970 g_return_if_fail (GDK_IS_WINDOW (window));
2972 if (GDK_WINDOW_DESTROYED (window))
2975 GDK_NOTE (MISC, g_print ("gdk_window_deiconify: %p: %s\n",
2976 GDK_WINDOW_HWND (window),
2977 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
2979 if (GDK_WINDOW_IS_MAPPED (window))
2981 show_window_internal (window, FALSE, TRUE);
2985 gdk_synthesize_window_state (window,
2986 GDK_WINDOW_STATE_ICONIFIED,
2992 gdk_window_stick (GdkWindow *window)
2994 g_return_if_fail (GDK_IS_WINDOW (window));
2996 if (GDK_WINDOW_DESTROYED (window))
2999 /* FIXME: Do something? */
3003 gdk_window_unstick (GdkWindow *window)
3005 g_return_if_fail (GDK_IS_WINDOW (window));
3007 if (GDK_WINDOW_DESTROYED (window))
3010 /* FIXME: Do something? */
3014 gdk_window_maximize (GdkWindow *window)
3016 g_return_if_fail (GDK_IS_WINDOW (window));
3018 if (GDK_WINDOW_DESTROYED (window))
3021 GDK_NOTE (MISC, g_print ("gdk_window_maximize: %p: %s\n",
3022 GDK_WINDOW_HWND (window),
3023 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3025 if (GDK_WINDOW_IS_MAPPED (window))
3026 ShowWindow (GDK_WINDOW_HWND (window), SW_MAXIMIZE);
3028 gdk_synthesize_window_state (window,
3030 GDK_WINDOW_STATE_MAXIMIZED);
3034 gdk_window_unmaximize (GdkWindow *window)
3036 g_return_if_fail (GDK_IS_WINDOW (window));
3038 if (GDK_WINDOW_DESTROYED (window))
3041 GDK_NOTE (MISC, g_print ("gdk_window_unmaximize: %p: %s\n",
3042 GDK_WINDOW_HWND (window),
3043 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3045 if (GDK_WINDOW_IS_MAPPED (window))
3046 ShowWindow (GDK_WINDOW_HWND (window), SW_RESTORE);
3048 gdk_synthesize_window_state (window,
3049 GDK_WINDOW_STATE_MAXIMIZED,
3053 typedef struct _FullscreenInfo FullscreenInfo;
3055 struct _FullscreenInfo
3063 gdk_window_fullscreen (GdkWindow *window)
3067 GdkWindowObject *private = (GdkWindowObject *) window;
3069 g_return_if_fail (GDK_IS_WINDOW (window));
3071 fi = g_new (FullscreenInfo, 1);
3073 if (!GetWindowRect (GDK_WINDOW_HWND (window), &(fi->r)))
3077 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3079 width = GetSystemMetrics (SM_CXSCREEN);
3080 height = GetSystemMetrics (SM_CYSCREEN);
3082 /* remember for restoring */
3083 fi->hint_flags = impl->hint_flags;
3084 impl->hint_flags &= ~GDK_HINT_MAX_SIZE;
3085 g_object_set_data (G_OBJECT (window), "fullscreen-info", fi);
3086 fi->style = GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE);
3088 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3089 (fi->style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP);
3090 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_TOP /*not MOST, taskswitch!*/,
3091 0, 0, width, height,
3092 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
3093 WIN32_API_FAILED ("SetWindowPos");
3095 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
3100 gdk_window_unfullscreen (GdkWindow *window)
3103 GdkWindowObject *private = (GdkWindowObject *) window;
3105 g_return_if_fail (GDK_IS_WINDOW (window));
3107 fi = g_object_get_data (G_OBJECT(window), "fullscreen-info");
3110 GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (private->impl);
3112 impl->hint_flags = fi->hint_flags;
3113 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE, fi->style);
3114 if (!SetWindowPos (GDK_WINDOW_HWND (window), HWND_NOTOPMOST,
3115 fi->r.left, fi->r.top, fi->r.right - fi->r.left, fi->r.bottom - fi->r.top,
3116 SWP_NOCOPYBITS | SWP_SHOWWINDOW))
3117 WIN32_API_FAILED ("SetWindowPos");
3119 g_object_set_data (G_OBJECT (window), "fullscreen-info", NULL);
3122 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
3127 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
3129 g_return_if_fail (GDK_IS_WINDOW (window));
3131 if (GDK_WINDOW_DESTROYED (window))
3134 if (GDK_WINDOW_IS_MAPPED (window))
3136 if (!SetWindowPos(GDK_WINDOW_HWND (window), setting ? HWND_TOPMOST : HWND_NOTOPMOST,
3137 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE))
3138 WIN32_API_FAILED ("SetWindowPos");
3141 gdk_synthesize_window_state (window,
3142 setting ? GDK_WINDOW_STATE_BELOW : GDK_WINDOW_STATE_ABOVE,
3143 setting ? GDK_WINDOW_STATE_ABOVE : 0);
3147 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
3149 g_return_if_fail (GDK_IS_WINDOW (window));
3151 if (GDK_WINDOW_DESTROYED (window))
3154 if (GDK_WINDOW_IS_MAPPED (window))
3156 if (!SetWindowPos(GDK_WINDOW_HWND (window), setting ? HWND_BOTTOM : HWND_NOTOPMOST,
3157 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE))
3158 WIN32_API_FAILED ("SetWindowPos");
3161 gdk_synthesize_window_state (window,
3162 setting ? GDK_WINDOW_STATE_ABOVE : GDK_WINDOW_STATE_BELOW,
3163 setting ? GDK_WINDOW_STATE_BELOW : 0);
3167 gdk_window_focus (GdkWindow *window,
3170 g_return_if_fail (GDK_IS_WINDOW (window));
3172 if (GDK_WINDOW_DESTROYED (window))
3175 GDK_NOTE (MISC, g_print ("gdk_window_focus: %p: %s\n",
3176 GDK_WINDOW_HWND (window),
3177 _gdk_win32_window_state_to_string (((GdkWindowObject *) window)->state)));
3179 if (((GdkWindowObject *) window)->state & GDK_WINDOW_STATE_MAXIMIZED)
3180 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWMAXIMIZED);
3182 ShowWindow (GDK_WINDOW_HWND (window), SW_SHOWNORMAL);
3183 SetFocus (GDK_WINDOW_HWND (window));
3187 gdk_window_set_modal_hint (GdkWindow *window,
3190 GdkWindowObject *private;
3192 g_return_if_fail (window != NULL);
3193 g_return_if_fail (GDK_IS_WINDOW (window));
3195 if (GDK_WINDOW_DESTROYED (window))
3198 private = (GdkWindowObject*) window;
3200 private->modal_hint = modal;
3202 if (GDK_WINDOW_IS_MAPPED (window))
3203 API_CALL (SetWindowPos, (GDK_WINDOW_HWND (window),
3204 modal ? HWND_TOPMOST : HWND_NOTOPMOST,
3205 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE));
3209 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
3210 gboolean skips_taskbar)
3212 static GdkWindow *owner = NULL;
3215 g_return_if_fail (GDK_IS_WINDOW (window));
3217 GDK_NOTE (MISC, g_print ("gdk_window_set_skip_taskbar_hint: %p: %s\n",
3218 GDK_WINDOW_HWND (window),
3219 skips_taskbar ? "TRUE" : "FALSE"));
3225 wa.window_type = GDK_WINDOW_TEMP;
3226 wa.wclass = GDK_INPUT_OUTPUT;
3227 wa.width = wa.height = 1;
3229 owner = gdk_window_new_internal (NULL, &wa, 0, TRUE);
3232 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT,
3233 (long) GDK_WINDOW_HWND (owner));
3235 #if 0 /* Should we also turn off the minimize and maximize buttons? */
3236 SetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE,
3237 GetWindowLong (GDK_WINDOW_HWND (window), GWL_STYLE) & ~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU));
3238 SetWindowPos (GDK_WINDOW_HWND (window), NULL, 0, 0, 0, 0,
3239 SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
3240 SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOZORDER);
3245 SetWindowLong (GDK_WINDOW_HWND (window), GWL_HWNDPARENT, 0);
3250 gdk_window_set_skip_pager_hint (GdkWindow *window,
3251 gboolean skips_pager)
3253 g_return_if_fail (GDK_IS_WINDOW (window));
3257 gdk_window_set_type_hint (GdkWindow *window,
3258 GdkWindowTypeHint hint)
3260 g_return_if_fail (window != NULL);
3261 g_return_if_fail (GDK_IS_WINDOW (window));
3263 if (GDK_WINDOW_DESTROYED (window))
3266 GDK_NOTE (MISC, g_print ("gdk_window_set_type_hint: %p: %d\n",
3267 GDK_WINDOW_HWND (window), hint));
3270 case GDK_WINDOW_TYPE_HINT_DIALOG:
3272 case GDK_WINDOW_TYPE_HINT_MENU:
3273 gdk_window_set_decorations (window,
3276 GDK_DECOR_MINIMIZE |
3277 GDK_DECOR_MAXIMIZE);
3279 case GDK_WINDOW_TYPE_HINT_TOOLBAR:
3280 gdk_window_set_skip_taskbar_hint (window, TRUE);
3282 case GDK_WINDOW_TYPE_HINT_UTILITY:
3284 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
3285 gdk_window_set_decorations (window,
3289 GDK_DECOR_MINIMIZE |
3290 GDK_DECOR_MAXIMIZE);
3292 case GDK_WINDOW_TYPE_HINT_DOCK:
3294 case GDK_WINDOW_TYPE_HINT_DESKTOP:
3297 g_warning ("Unknown hint %d passed to gdk_window_set_type_hint", hint);
3299 case GDK_WINDOW_TYPE_HINT_NORMAL:
3305 gdk_window_shape_combine_region (GdkWindow *window,
3306 GdkRegion *shape_region,
3310 g_return_if_fail (GDK_IS_WINDOW (window));
3312 if (GDK_WINDOW_DESTROYED (window))
3315 /* XXX: even on X implemented conditional ... */
3319 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
3321 g_return_val_if_fail (display == gdk_display_get_default(), NULL);
3323 return gdk_window_lookup (anid);
3327 gdk_window_enable_synchronized_configure (GdkWindow *window)
3332 gdk_window_configure_finished (GdkWindow *window)