3 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * Copyright (C) 2005-2007 Imendio AB
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 #include <Carbon/Carbon.h>
26 #include "gdkprivate-quartz.h"
28 static gpointer parent_class;
30 static GSList *update_windows;
31 static guint update_idle;
33 static GSList *main_window_stack;
35 static void update_toplevel_order (void);
36 static void clear_toplevel_order (void);
38 #define WINDOW_IS_TOPLEVEL(window) \
39 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
40 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
43 gdk_quartz_window_get_nsview (GdkWindow *window)
45 GdkWindowObject *private = (GdkWindowObject *)window;
47 if (GDK_WINDOW_DESTROYED (window))
50 return ((GdkWindowImplQuartz *)private->impl)->view;
54 gdk_quartz_window_get_nswindow (GdkWindow *window)
56 GdkWindowObject *private = (GdkWindowObject *)window;
58 if (GDK_WINDOW_DESTROYED (window))
61 return ((GdkWindowImplQuartz *)private->impl)->toplevel;
65 gdk_window_impl_quartz_get_size (GdkDrawable *drawable,
69 g_return_if_fail (GDK_IS_WINDOW_IMPL_QUARTZ (drawable));
72 *width = GDK_WINDOW_IMPL_QUARTZ (drawable)->width;
74 *height = GDK_WINDOW_IMPL_QUARTZ (drawable)->height;
78 gdk_window_impl_quartz_get_visible_region (GdkDrawable *drawable)
80 GdkWindowObject *private = GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_QUARTZ (drawable)->wrapper);
82 GdkWindowImplQuartz *impl;
83 GList *windows = NULL, *l;
85 /* FIXME: The clip rectangle should really be cached
86 * and recalculated when the window rectangle changes.
90 windows = g_list_prepend (windows, private);
92 if (private->parent == GDK_WINDOW_OBJECT (_gdk_root))
95 private = private->parent;
98 /* Get rectangle for toplevel window */
99 private = GDK_WINDOW_OBJECT (windows->data);
100 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
104 rect.width = impl->width;
105 rect.height = impl->height;
107 /* Skip toplevel window since we have its rect */
108 for (l = windows->next; l; l = l->next)
110 private = GDK_WINDOW_OBJECT (l->data);
111 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
112 GdkRectangle tmp_rect;
114 tmp_rect.x = -MIN (0, private->x - rect.x);
115 tmp_rect.y = -MIN (0, private->y - rect.y);
116 tmp_rect.width = MIN (rect.width, impl->width + private->x - rect.x) - MAX (0, private->x - rect.x);
117 tmp_rect.height = MIN (rect.height, impl->height + private->y - rect.y) - MAX (0, private->y - rect.y);
122 g_list_free (windows);
124 return gdk_region_rectangle (&rect);
128 gdk_window_impl_quartz_finalize (GObject *object)
130 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
133 [impl->nscursor release];
135 if (impl->paint_clip_region)
136 gdk_region_destroy (impl->paint_clip_region);
138 if (impl->transient_for)
139 g_object_unref (impl->transient_for);
141 G_OBJECT_CLASS (parent_class)->finalize (object);
145 gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
147 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
148 GObjectClass *object_class = G_OBJECT_CLASS (klass);
150 parent_class = g_type_class_peek_parent (klass);
152 object_class->finalize = gdk_window_impl_quartz_finalize;
154 drawable_class->get_size = gdk_window_impl_quartz_get_size;
156 /* Visible and clip regions are the same */
157 drawable_class->get_clip_region = gdk_window_impl_quartz_get_visible_region;
158 drawable_class->get_visible_region = gdk_window_impl_quartz_get_visible_region;
162 gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
166 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
170 gdk_window_impl_quartz_begin_paint_region (GdkPaintable *paintable,
173 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
174 GdkDrawableImplQuartz *drawable_impl;
177 GdkPixmap *bg_pixmap;
180 drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
181 bg_pixmap = GDK_WINDOW_OBJECT (drawable_impl->wrapper)->bg_pixmap;
183 if (impl->begin_paint_count == 0)
184 impl->paint_clip_region = gdk_region_copy (region);
186 gdk_region_union (impl->paint_clip_region, region);
188 impl->begin_paint_count++;
190 if (bg_pixmap == GDK_NO_BG)
193 gdk_region_get_rectangles (region, &rects, &n_rects);
195 if (bg_pixmap == NULL)
197 CGContextRef cg_context;
201 cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
202 _gdk_quartz_colormap_get_rgba_from_pixel (gdk_drawable_get_colormap (drawable_impl->wrapper),
203 GDK_WINDOW_OBJECT (drawable_impl->wrapper)->bg_color.pixel,
206 for (i = 0; i < n_rects; i++)
208 CGContextSetRGBFillColor (cg_context, r, g, b, a);
209 CGContextFillRect (cg_context,
210 CGRectMake (rects[i].x, rects[i].y,
211 rects[i].width, rects[i].height));
214 gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), cg_context);
219 int x_offset, y_offset;
223 x_offset = y_offset = 0;
225 window = GDK_WINDOW (drawable_impl->wrapper);
226 while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
228 /* If this window should have the same background as the parent,
229 * fetch the parent. (And if the same goes for the parent, fetch
230 * the grandparent, etc.)
232 x_offset += ((GdkWindowObject *) window)->x;
233 y_offset += ((GdkWindowObject *) window)->y;
234 window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
235 bg_pixmap = ((GdkWindowObject *) window)->bg_pixmap;
238 if (bg_pixmap == NULL || bg_pixmap == GDK_NO_BG || bg_pixmap == GDK_PARENT_RELATIVE_BG)
240 /* Parent relative background but the parent doesn't have a
247 /* Note: There should be a CG API to draw tiled images, we might
248 * want to look into that for this.
250 gc = gdk_gc_new (GDK_DRAWABLE (impl));
252 gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
255 while (x < (rects[0].x + rects[0].width))
257 if (x + width >= rects[0].x)
260 while (y < (rects[0].y + rects[0].height))
262 if (y + height >= rects[0].y)
263 gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
278 gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
280 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
282 impl->begin_paint_count--;
284 if (impl->begin_paint_count == 0)
286 gdk_region_destroy (impl->paint_clip_region);
287 impl->paint_clip_region = NULL;
292 gdk_window_quartz_process_updates_internal (GdkWindow *window)
294 GdkWindowObject *private = (GdkWindowObject *) window;
295 GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *) private->impl;
297 if (private->update_area)
302 gdk_region_get_rectangles (private->update_area, &rects, &n_rects);
304 gdk_region_destroy (private->update_area);
305 private->update_area = NULL;
307 for (i = 0; i < n_rects; i++)
309 [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
310 rects[i].width, rects[i].height)];
313 [impl->view displayIfNeeded];
320 gdk_window_quartz_process_all_updates (void)
322 GSList *old_update_windows = update_windows;
323 GSList *tmp_list = update_windows;
326 update_windows = NULL;
328 g_slist_foreach (old_update_windows, (GFunc) g_object_ref, NULL);
330 GDK_QUARTZ_ALLOC_POOL;
334 gdk_window_quartz_process_updates_internal (tmp_list->data);
336 g_object_unref (tmp_list->data);
337 tmp_list = tmp_list->next;
340 GDK_QUARTZ_RELEASE_POOL;
342 g_slist_free (old_update_windows);
346 gdk_window_quartz_update_idle (gpointer data)
348 GDK_THREADS_ENTER ();
349 gdk_window_quartz_process_all_updates ();
350 GDK_THREADS_LEAVE ();
356 gdk_window_impl_quartz_invalidate_maybe_recurse (GdkPaintable *paintable,
358 gboolean (*child_func) (GdkWindow *, gpointer),
361 GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
362 GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) window_impl;
363 GdkWindow *window = (GdkWindow *) drawable_impl->wrapper;
364 GdkWindowObject *private = (GdkWindowObject *) window;
365 GdkRegion *visible_region;
367 visible_region = gdk_drawable_get_visible_region (window);
368 gdk_region_intersect (visible_region, region);
370 if (private->update_area)
372 gdk_region_union (private->update_area, visible_region);
373 gdk_region_destroy (visible_region);
377 update_windows = g_slist_prepend (update_windows, window);
378 private->update_area = visible_region;
380 if (update_idle == 0)
381 update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
382 gdk_window_quartz_update_idle, NULL, NULL);
387 gdk_window_impl_quartz_process_updates (GdkPaintable *paintable,
388 gboolean update_children)
390 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
391 GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) impl;
392 GdkWindowObject *private = (GdkWindowObject *) drawable_impl->wrapper;
394 if (private->update_area)
396 GDK_QUARTZ_ALLOC_POOL;
397 gdk_window_quartz_process_updates_internal ((GdkWindow *) private);
398 update_windows = g_slist_remove (update_windows, private);
399 GDK_QUARTZ_RELEASE_POOL;
404 gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
406 iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
407 iface->end_paint = gdk_window_impl_quartz_end_paint;
409 iface->invalidate_maybe_recurse = gdk_window_impl_quartz_invalidate_maybe_recurse;
410 iface->process_updates = gdk_window_impl_quartz_process_updates;
414 _gdk_window_impl_quartz_get_type (void)
416 static GType object_type = 0;
420 const GTypeInfo object_info =
422 sizeof (GdkWindowImplQuartzClass),
423 (GBaseInitFunc) NULL,
424 (GBaseFinalizeFunc) NULL,
425 (GClassInitFunc) gdk_window_impl_quartz_class_init,
426 NULL, /* class_finalize */
427 NULL, /* class_data */
428 sizeof (GdkWindowImplQuartz),
430 (GInstanceInitFunc) gdk_window_impl_quartz_init,
433 const GInterfaceInfo paintable_info =
435 (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
440 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
441 "GdkWindowImplQuartz",
443 g_type_add_interface_static (object_type,
452 _gdk_window_impl_get_type (void)
454 return _gdk_window_impl_quartz_get_type ();
458 get_default_title (void)
462 title = g_get_application_name ();
464 title = g_get_prgname ();
470 _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
473 if (ancestor == NULL || window == NULL)
476 return (gdk_window_get_parent (window) == ancestor ||
477 _gdk_quartz_window_is_ancestor (ancestor,
478 gdk_window_get_parent (window)));
481 /* FIXME: It would be nice to have one function that takes an NSPoint
482 * and flips the coords for any window.
485 _gdk_quartz_window_get_inverted_screen_y (gint y)
487 NSRect rect = [[NSScreen mainScreen] frame];
489 return rect.size.height - y;
493 find_child_window_helper (GdkWindow *window,
499 GdkWindowImplQuartz *impl;
502 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
504 if (window == _gdk_root)
505 update_toplevel_order ();
507 for (l = impl->sorted_children; l; l = l->next)
509 GdkWindowObject *child_private = l->data;
510 GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
513 if (!GDK_WINDOW_IS_MAPPED (child_private))
516 temp_x = x_offset + child_private->x;
517 temp_y = y_offset + child_private->y;
519 /* Special-case the root window. We have to include the title
520 * bar in the checks, otherwise the window below the title bar
521 * will be found i.e. events punch through. (If we can find a
522 * better way to deal with the events in gdkevents-quartz, this
523 * might not be needed.)
525 if (window == _gdk_root)
527 NSRect frame = NSMakeRect (0, 0, 100, 100);
532 mask = [child_impl->toplevel styleMask];
534 /* Get the title bar height. */
535 content = [NSWindow contentRectForFrameRect:frame
537 titlebar_height = frame.size.height - content.size.height;
539 if (titlebar_height > 0 &&
540 x >= temp_x && y >= temp_y - titlebar_height &&
541 x < temp_x + child_impl->width && y < temp_y)
543 /* The root means "unknown" i.e. a window not managed by
546 return (GdkWindow *)_gdk_root;
550 if (x >= temp_x && y >= temp_y &&
551 x < temp_x + child_impl->width && y < temp_y + child_impl->height)
553 /* Look for child windows. */
554 return find_child_window_helper (l->data,
563 /* Given a GdkWindow and coordinates relative to it, returns the
564 * innermost subwindow that contains the point. If the coordinates are
565 * outside the passed in window, NULL is returned.
568 _gdk_quartz_window_find_child (GdkWindow *window,
572 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
573 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
575 if (x >= 0 && y >= 0 && x < impl->width && y < impl->height)
576 return find_child_window_helper (window, x, y, 0, 0);
582 _gdk_quartz_window_did_become_main (GdkWindow *window)
584 main_window_stack = g_slist_remove (main_window_stack, window);
586 if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
587 main_window_stack = g_slist_prepend (main_window_stack, window);
589 clear_toplevel_order ();
593 _gdk_quartz_window_did_resign_main (GdkWindow *window)
595 GdkWindow *new_window = NULL;
597 if (main_window_stack)
598 new_window = main_window_stack->data;
603 toplevels = gdk_window_get_toplevels ();
605 new_window = toplevels->data;
606 g_list_free (toplevels);
610 new_window != window &&
611 GDK_WINDOW_IS_MAPPED (new_window) &&
612 GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
614 GdkWindowObject *private = (GdkWindowObject *) new_window;
615 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
617 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
620 clear_toplevel_order ();
624 gdk_window_new (GdkWindow *parent,
625 GdkWindowAttr *attributes,
626 gint attributes_mask)
629 GdkWindowObject *private;
630 GdkWindowImplQuartz *impl;
631 GdkDrawableImplQuartz *draw_impl;
633 GdkWindowImplQuartz *parent_impl;
635 if (parent && GDK_WINDOW_DESTROYED (parent))
638 GDK_QUARTZ_ALLOC_POOL;
643 window = g_object_new (GDK_TYPE_WINDOW, NULL);
644 private = (GdkWindowObject *)window;
645 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
646 draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
647 draw_impl->wrapper = GDK_DRAWABLE (window);
649 private->parent = (GdkWindowObject *)parent;
650 parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
652 private->accept_focus = TRUE;
653 private->focus_on_map = TRUE;
655 if (attributes_mask & GDK_WA_X)
656 private->x = attributes->x;
660 if (attributes_mask & GDK_WA_Y)
661 private->y = attributes->y;
662 else if (attributes_mask & GDK_WA_X)
667 private->event_mask = attributes->event_mask;
669 impl->width = attributes->width > 1 ? attributes->width : 1;
670 impl->height = attributes->height > 1 ? attributes->height : 1;
672 if (attributes_mask & GDK_WA_VISUAL)
673 visual = attributes->visual;
675 visual = gdk_screen_get_system_visual (_gdk_screen);
677 if (attributes->wclass == GDK_INPUT_ONLY)
679 /* Backwards compatiblity - we've always ignored
680 * attributes->window_type for input-only windows
683 if (parent == _gdk_root)
684 private->window_type = GDK_WINDOW_TEMP;
686 private->window_type = GDK_WINDOW_CHILD;
689 private->window_type = attributes->window_type;
692 switch (private->window_type)
694 case GDK_WINDOW_TOPLEVEL:
695 case GDK_WINDOW_DIALOG:
696 case GDK_WINDOW_TEMP:
697 if (GDK_WINDOW_TYPE (parent) != GDK_WINDOW_ROOT)
699 g_warning (G_STRLOC "Toplevel windows must be created as children of\n"
700 "of a window of type GDK_WINDOW_ROOT or GDK_WINDOW_FOREIGN");
702 case GDK_WINDOW_CHILD:
705 g_warning (G_STRLOC "cannot make windows of type %d", private->window_type);
706 GDK_QUARTZ_RELEASE_POOL;
710 if (attributes->wclass == GDK_INPUT_OUTPUT)
712 private->input_only = FALSE;
713 private->depth = visual->depth;
715 if (attributes_mask & GDK_WA_COLORMAP)
717 draw_impl->colormap = attributes->colormap;
718 g_object_ref (attributes->colormap);
722 if (visual == gdk_screen_get_system_visual (_gdk_screen))
724 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
725 g_object_ref (draw_impl->colormap);
727 else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
729 draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
730 g_object_ref (draw_impl->colormap);
734 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
738 private->bg_color.pixel = 0;
739 private->bg_color.red = private->bg_color.green = private->bg_color.blue = 0;
744 private->input_only = TRUE;
745 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
746 g_object_ref (draw_impl->colormap);
749 private->parent->children = g_list_prepend (private->parent->children, window);
751 /* Maintain the z-ordered list of children. */
752 if (parent != _gdk_root)
753 parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
755 clear_toplevel_order ();
757 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
758 (attributes->cursor) :
761 switch (attributes->window_type)
763 case GDK_WINDOW_TOPLEVEL:
764 case GDK_WINDOW_DIALOG:
765 case GDK_WINDOW_TEMP:
771 /* Big hack: We start out outside the screen and move the
772 * window in before showing it. This makes the initial
773 * MouseEntered event work if the window ends up right under
774 * the mouse pointer, bad quartz.
776 content_rect = NSMakeRect (-500 - impl->width, -500 - impl->height,
777 impl->width, impl->height);
779 switch (attributes->window_type)
781 case GDK_WINDOW_TEMP:
782 style_mask = NSBorderlessWindowMask;
785 style_mask = (NSTitledWindowMask |
786 NSClosableWindowMask |
787 NSMiniaturizableWindowMask |
788 NSResizableWindowMask);
791 impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
793 backing:NSBackingStoreBuffered
796 if (attributes_mask & GDK_WA_TITLE)
797 title = attributes->title;
799 title = get_default_title ();
801 gdk_window_set_title (window, title);
803 if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
805 [impl->toplevel setOpaque:NO];
806 [impl->toplevel setBackgroundColor:[NSColor clearColor]];
809 impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
810 [impl->view setGdkWindow:window];
811 [impl->toplevel setContentView:impl->view];
815 case GDK_WINDOW_CHILD:
817 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
819 if (attributes->wclass == GDK_INPUT_OUTPUT)
821 NSRect frame_rect = NSMakeRect (private->x, private->y, impl->width, impl->height);
823 impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
825 [impl->view setGdkWindow:window];
827 /* GdkWindows should be hidden by default */
828 [impl->view setHidden:YES];
829 [parent_impl->view addSubview:impl->view];
835 g_assert_not_reached ();
838 GDK_QUARTZ_RELEASE_POOL;
840 if (attributes_mask & GDK_WA_TYPE_HINT)
841 gdk_window_set_type_hint (window, attributes->type_hint);
847 _gdk_windowing_window_init (void)
849 GdkWindowObject *private;
850 GdkWindowImplQuartz *impl;
851 GdkDrawableImplQuartz *drawable_impl;
854 g_assert (_gdk_root == NULL);
856 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
858 /* Note: This needs to be reworked for multi-screen support. */
859 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
860 rect = [[NSScreen mainScreen] frame];
861 impl->width = rect.size.width;
862 impl->height = rect.size.height;
864 private = (GdkWindowObject *)_gdk_root;
866 private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
867 private->window_type = GDK_WINDOW_ROOT;
870 drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
872 drawable_impl->wrapper = GDK_DRAWABLE (private);
873 drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
874 g_object_ref (drawable_impl->colormap);
878 _gdk_windowing_window_destroy (GdkWindow *window,
880 gboolean foreign_destroy)
882 GdkWindowObject *private;
883 GdkWindowImplQuartz *impl;
884 GdkWindowObject *parent;
885 GdkWindow *mouse_window;
887 private = GDK_WINDOW_OBJECT (window);
888 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
890 update_windows = g_slist_remove (update_windows, window);
891 main_window_stack = g_slist_remove (main_window_stack, window);
893 g_list_free (impl->sorted_children);
894 impl->sorted_children = NULL;
896 parent = private->parent;
899 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
901 parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
904 /* If the destroyed window was targeted for a pointer or keyboard
905 * grab, release the grab.
907 if (window == _gdk_quartz_pointer_grab_window)
908 gdk_pointer_ungrab (0);
910 if (window == _gdk_quartz_keyboard_grab_window)
911 gdk_keyboard_ungrab (0);
913 _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
915 mouse_window = _gdk_quartz_events_get_mouse_window (FALSE);
916 if (window == mouse_window ||
917 _gdk_quartz_window_is_ancestor (window, mouse_window))
918 _gdk_quartz_events_update_mouse_window (_gdk_root);
920 if (!recursing && !foreign_destroy)
922 GDK_QUARTZ_ALLOC_POOL;
925 [impl->toplevel close];
927 [impl->view removeFromSuperview];
929 GDK_QUARTZ_RELEASE_POOL;
934 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
936 /* Foreign windows aren't supported in OSX. */
940 all_parents_shown (GdkWindowObject *private)
942 while (GDK_WINDOW_IS_MAPPED (private))
945 private = (GdkWindowObject *)private->parent;
953 /* Note: the raise argument is not really used, it doesn't seem
954 * possible to show a window without raising it?
957 show_window_internal (GdkWindow *window,
960 GdkWindowObject *private;
961 GdkWindowImplQuartz *impl;
962 gboolean focus_on_map;
964 if (GDK_WINDOW_DESTROYED (window))
967 GDK_QUARTZ_ALLOC_POOL;
969 private = (GdkWindowObject *)window;
970 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
972 if (!GDK_WINDOW_IS_MAPPED (window))
973 focus_on_map = private->focus_on_map;
981 /* Move the window into place, to guarantee that we get the
982 * initial MouseEntered event.
984 make_key = (private->accept_focus && focus_on_map && raise &&
985 private->window_type != GDK_WINDOW_TEMP);
987 [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
991 [impl->view setHidden:NO];
994 [impl->view setNeedsDisplay:YES];
996 if (all_parents_shown (private->parent))
997 _gdk_quartz_events_send_map_events (window);
999 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
1001 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1002 gdk_window_maximize (window);
1004 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1005 gdk_window_iconify (window);
1007 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1008 _gdk_quartz_window_attach_to_parent (window);
1010 GDK_QUARTZ_RELEASE_POOL;
1013 /* Temporarily unsets the parent window, if the window is a
1017 _gdk_quartz_window_detach_from_parent (GdkWindow *window)
1019 GdkWindowImplQuartz *impl;
1021 g_return_if_fail (GDK_IS_WINDOW (window));
1023 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1025 g_return_if_fail (impl->toplevel != NULL);
1027 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1029 GdkWindowImplQuartz *parent_impl;
1031 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1032 [parent_impl->toplevel removeChildWindow:impl->toplevel];
1036 /* Re-sets the parent window, if the window is a transient. */
1038 _gdk_quartz_window_attach_to_parent (GdkWindow *window)
1040 GdkWindowImplQuartz *impl;
1042 g_return_if_fail (GDK_IS_WINDOW (window));
1044 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1046 g_return_if_fail (impl->toplevel != NULL);
1048 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1050 GdkWindowImplQuartz *parent_impl;
1052 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1053 [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
1058 gdk_window_show_unraised (GdkWindow *window)
1060 g_return_if_fail (GDK_IS_WINDOW (window));
1062 show_window_internal (window, FALSE);
1066 gdk_window_show (GdkWindow *window)
1068 g_return_if_fail (GDK_IS_WINDOW (window));
1070 show_window_internal (window, TRUE);
1074 gdk_window_hide (GdkWindow *window)
1076 GdkWindowObject *private = (GdkWindowObject *)window;
1077 GdkWindowImplQuartz *impl;
1078 GdkWindow *mouse_window;
1080 g_return_if_fail (GDK_IS_WINDOW (window));
1082 if (GDK_WINDOW_DESTROYED (window))
1085 mouse_window = _gdk_quartz_events_get_mouse_window (FALSE);
1086 if (window == mouse_window ||
1087 _gdk_quartz_window_is_ancestor (window, mouse_window))
1088 _gdk_quartz_events_update_mouse_window (_gdk_root);
1090 if (GDK_WINDOW_IS_MAPPED (window))
1091 gdk_synthesize_window_state (window,
1093 GDK_WINDOW_STATE_WITHDRAWN);
1095 _gdk_window_clear_update_area (window);
1097 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1101 NSRect content_rect;
1104 /* Update main window. */
1105 main_window_stack = g_slist_remove (main_window_stack, window);
1106 if ([NSApp mainWindow] == impl->toplevel)
1107 _gdk_quartz_window_did_resign_main (window);
1109 if (impl->transient_for)
1110 _gdk_quartz_window_detach_from_parent (window);
1112 [(GdkQuartzWindow*)impl->toplevel hide];
1114 else if (impl->view)
1116 [impl->view setHidden:YES];
1119 if (window == _gdk_quartz_pointer_grab_window)
1120 gdk_pointer_ungrab (0);
1122 if (window == _gdk_quartz_keyboard_grab_window)
1123 gdk_keyboard_ungrab (0);
1127 gdk_window_withdraw (GdkWindow *window)
1129 gdk_window_hide (window);
1133 move_resize_window_internal (GdkWindow *window,
1139 GdkWindowObject *private = (GdkWindowObject *)window;
1140 GdkWindowImplQuartz *impl;
1141 GdkRectangle old_visible;
1142 GdkRectangle new_visible;
1143 GdkRectangle scroll_rect;
1144 GdkRegion *old_region;
1145 GdkRegion *expose_region;
1148 if (GDK_WINDOW_DESTROYED (window))
1151 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1153 if ((x == -1 || (x == private->x)) &&
1154 (y == -1 || (y == private->y)) &&
1155 (width == -1 || (width == impl->width)) &&
1156 (height == -1 || (height == impl->height)))
1161 if (!impl->toplevel)
1163 /* The previously visible area of this window in a coordinate
1164 * system rooted at the origin of this window.
1166 old_visible.x = -private->x;
1167 old_visible.y = -private->y;
1169 gdk_window_get_size (GDK_DRAWABLE (private->parent),
1171 &old_visible.height);
1176 delta.width = x - private->x;
1186 delta.height = y - private->y;
1195 impl->width = width;
1198 impl->height = height;
1200 GDK_QUARTZ_ALLOC_POOL;
1204 NSRect content_rect;
1207 /* We don't update the NSWindow while unmapped, since we move windows
1208 * off-screen when hiding in order for MouseEntered to be triggered
1209 * reliably when showing windows and they appear under the mouse.
1211 if (GDK_WINDOW_IS_MAPPED (window))
1213 content_rect = NSMakeRect (private->x,
1214 _gdk_quartz_window_get_inverted_screen_y (private->y + impl->height),
1215 impl->width, impl->height);
1217 frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
1218 [impl->toplevel setFrame:frame_rect display:YES];
1223 if (!private->input_only)
1227 nsrect = NSMakeRect (private->x, private->y, impl->width, impl->height);
1229 /* The newly visible area of this window in a coordinate
1230 * system rooted at the origin of this window.
1232 new_visible.x = -private->x;
1233 new_visible.y = -private->y;
1234 new_visible.width = old_visible.width; /* parent has not changed size */
1235 new_visible.height = old_visible.height; /* parent has not changed size */
1237 expose_region = gdk_region_rectangle (&new_visible);
1238 old_region = gdk_region_rectangle (&old_visible);
1239 gdk_region_subtract (expose_region, old_region);
1241 /* Determine what (if any) part of the previously visible
1242 * part of the window can be copied without a redraw
1244 scroll_rect = old_visible;
1245 scroll_rect.x -= delta.width;
1246 scroll_rect.y -= delta.height;
1247 gdk_rectangle_intersect (&scroll_rect, &old_visible, &scroll_rect);
1249 if (!gdk_region_empty (expose_region))
1251 GdkRectangle* rects;
1255 if (scroll_rect.width != 0 && scroll_rect.height != 0)
1257 [impl->view scrollRect:NSMakeRect (scroll_rect.x,
1264 [impl->view setFrame:nsrect];
1266 gdk_region_get_rectangles (expose_region, &rects, &n_rects);
1268 for (n = 0; n < n_rects; ++n)
1270 [impl->view setNeedsDisplayInRect:NSMakeRect (rects[n].x,
1280 [impl->view setFrame:nsrect];
1281 [impl->view setNeedsDisplay:YES];
1284 gdk_region_destroy (expose_region);
1285 gdk_region_destroy (old_region);
1289 GDK_QUARTZ_RELEASE_POOL;
1293 gdk_window_move (GdkWindow *window,
1297 g_return_if_fail (GDK_IS_WINDOW (window));
1299 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1302 move_resize_window_internal (window, x, y, -1, -1);
1306 gdk_window_resize (GdkWindow *window,
1310 g_return_if_fail (GDK_IS_WINDOW (window));
1312 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1320 move_resize_window_internal (window, -1, -1, width, height);
1324 gdk_window_move_resize (GdkWindow *window,
1335 move_resize_window_internal (window, x, y, width, height);
1339 gdk_window_reparent (GdkWindow *window,
1340 GdkWindow *new_parent,
1344 g_warning ("gdk_window_reparent: %p %p (%d, %d)",
1345 window, new_parent, x, y);
1347 /* FIXME: Implement */
1351 _gdk_windowing_window_clear_area (GdkWindow *window,
1357 /* FIXME: Implement */
1361 _gdk_windowing_window_clear_area_e (GdkWindow *window,
1367 /* FIXME: Implement */
1370 /* Get the toplevel ordering from NSApp and update our own list. We do
1371 * this on demand since the NSApp's list is not up to date directly
1372 * after we get windowDidBecomeMain.
1375 update_toplevel_order (void)
1377 GdkWindowObject *root;
1378 GdkWindowImplQuartz *root_impl;
1379 NSEnumerator *enumerator;
1381 GList *toplevels = NULL;
1383 root = GDK_WINDOW_OBJECT (_gdk_root);
1384 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1386 if (root_impl->sorted_children)
1389 GDK_QUARTZ_ALLOC_POOL;
1391 enumerator = [[NSApp orderedWindows] objectEnumerator];
1392 while ((nswindow = [enumerator nextObject]))
1396 if (![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
1399 window = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
1400 toplevels = g_list_prepend (toplevels, window);
1403 GDK_QUARTZ_RELEASE_POOL;
1405 root_impl->sorted_children = g_list_reverse (toplevels);
1409 clear_toplevel_order (void)
1411 GdkWindowObject *root;
1412 GdkWindowImplQuartz *root_impl;
1414 root = GDK_WINDOW_OBJECT (_gdk_root);
1415 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1417 g_list_free (root_impl->sorted_children);
1418 root_impl->sorted_children = NULL;
1422 gdk_window_raise (GdkWindow *window)
1424 g_return_if_fail (GDK_IS_WINDOW (window));
1426 if (GDK_WINDOW_DESTROYED (window))
1429 if (WINDOW_IS_TOPLEVEL (window))
1431 GdkWindowImplQuartz *impl;
1433 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1434 [impl->toplevel orderFront:impl->toplevel];
1436 clear_toplevel_order ();
1440 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1444 GdkWindowImplQuartz *impl;
1446 impl = (GdkWindowImplQuartz *)parent->impl;
1448 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1449 impl->sorted_children = g_list_prepend (impl->sorted_children, window);
1455 gdk_window_lower (GdkWindow *window)
1457 g_return_if_fail (GDK_IS_WINDOW (window));
1459 if (GDK_WINDOW_DESTROYED (window))
1462 if (WINDOW_IS_TOPLEVEL (window))
1464 GdkWindowImplQuartz *impl;
1466 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1467 [impl->toplevel orderBack:impl->toplevel];
1469 clear_toplevel_order ();
1473 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1477 GdkWindowImplQuartz *impl;
1479 impl = (GdkWindowImplQuartz *)parent->impl;
1481 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1482 impl->sorted_children = g_list_append (impl->sorted_children, window);
1488 gdk_window_set_background (GdkWindow *window,
1489 const GdkColor *color)
1491 GdkWindowObject *private = (GdkWindowObject *)window;
1492 GdkWindowImplQuartz *impl;
1494 g_return_if_fail (GDK_IS_WINDOW (window));
1496 if (GDK_WINDOW_DESTROYED (window))
1499 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1501 private->bg_color = *color;
1503 if (private->bg_pixmap &&
1504 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1505 private->bg_pixmap != GDK_NO_BG)
1506 g_object_unref (private->bg_pixmap);
1508 private->bg_pixmap = NULL;
1512 gdk_window_set_back_pixmap (GdkWindow *window,
1514 gboolean parent_relative)
1516 GdkWindowObject *private = (GdkWindowObject *)window;
1518 g_return_if_fail (GDK_IS_WINDOW (window));
1519 g_return_if_fail (pixmap == NULL || !parent_relative);
1520 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1522 if (GDK_WINDOW_DESTROYED (window))
1525 if (private->bg_pixmap &&
1526 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1527 private->bg_pixmap != GDK_NO_BG)
1528 g_object_unref (private->bg_pixmap);
1530 if (parent_relative)
1532 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1533 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1539 g_object_ref (pixmap);
1540 private->bg_pixmap = pixmap;
1544 private->bg_pixmap = GDK_NO_BG;
1550 gdk_window_set_cursor (GdkWindow *window,
1553 GdkWindowImplQuartz *impl;
1554 GdkCursorPrivate *cursor_private;
1557 g_return_if_fail (GDK_IS_WINDOW (window));
1559 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1560 cursor_private = (GdkCursorPrivate *)cursor;
1562 if (GDK_WINDOW_DESTROYED (window))
1565 GDK_QUARTZ_ALLOC_POOL;
1570 nscursor = [cursor_private->nscursor retain];
1573 [impl->nscursor release];
1575 impl->nscursor = nscursor;
1577 GDK_QUARTZ_RELEASE_POOL;
1579 _gdk_quartz_events_update_cursor (_gdk_quartz_events_get_mouse_window (TRUE));
1583 gdk_window_get_geometry (GdkWindow *window,
1590 GdkWindowImplQuartz *impl;
1593 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1598 if (GDK_WINDOW_DESTROYED (window))
1601 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1602 if (window == _gdk_root)
1610 *width = impl->width;
1612 *height = impl->height;
1614 else if (WINDOW_IS_TOPLEVEL (window))
1616 ns_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1618 /* This doesn't work exactly as in X. There doesn't seem to be a
1619 * way to get the coords relative to the parent window (usually
1620 * the window frame), but that seems useless except for
1621 * borderless windows where it's relative to the root window. So
1622 * we return (0, 0) (should be something like (0, 22)) for
1623 * windows with borders and the root relative coordinates
1626 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
1629 *x = ns_rect.origin.x;
1631 *y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
1642 *width = ns_rect.size.width;
1644 *height = ns_rect.size.height;
1648 ns_rect = [impl->view frame];
1651 *x = ns_rect.origin.x;
1653 *y = ns_rect.origin.y;
1655 *width = ns_rect.size.width;
1657 *height = ns_rect.size.height;
1661 *depth = gdk_drawable_get_depth (window);
1665 gdk_window_get_origin (GdkWindow *window,
1669 GdkWindowObject *private;
1670 int tmp_x = 0, tmp_y = 0;
1671 GdkWindow *toplevel;
1672 NSRect content_rect;
1673 GdkWindowImplQuartz *impl;
1675 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1677 if (GDK_WINDOW_DESTROYED (window))
1687 if (window == _gdk_root)
1694 private = GDK_WINDOW_OBJECT (window);
1696 toplevel = gdk_window_get_toplevel (window);
1697 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1699 content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1701 tmp_x = content_rect.origin.x;
1702 tmp_y = _gdk_quartz_window_get_inverted_screen_y (content_rect.origin.y + content_rect.size.height);
1704 while (private != GDK_WINDOW_OBJECT (toplevel))
1706 tmp_x += private->x;
1707 tmp_y += private->y;
1709 private = private->parent;
1721 gdk_window_get_deskrelative_origin (GdkWindow *window,
1725 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1727 return gdk_window_get_origin (window, x, y);
1731 gdk_window_get_root_origin (GdkWindow *window,
1737 g_return_if_fail (GDK_IS_WINDOW (window));
1742 gdk_window_get_frame_extents (window, &rect);
1751 /* Returns coordinates relative to the root. */
1753 _gdk_windowing_get_pointer (GdkDisplay *display,
1757 GdkModifierType *mask)
1759 g_return_if_fail (display == _gdk_display);
1761 *screen = _gdk_screen;
1762 _gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
1765 /* Returns coordinates relative to the passed in window. */
1767 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1771 GdkModifierType *mask)
1773 GdkWindowObject *toplevel;
1774 GdkWindowObject *private;
1777 GdkWindow *found_window;
1779 if (GDK_WINDOW_DESTROYED (window))
1787 toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
1789 *mask = _gdk_quartz_events_get_current_event_mask ();
1791 /* Get the y coordinate, needs to be flipped. */
1792 if (window == _gdk_root)
1794 point = [NSEvent mouseLocation];
1796 y_tmp = _gdk_quartz_window_get_inverted_screen_y (point.y);
1800 GdkWindowImplQuartz *impl;
1803 impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
1804 nswindow = impl->toplevel;
1806 point = [nswindow mouseLocationOutsideOfEventStream];
1808 y_tmp = impl->height - point.y;
1811 /* The coords are relative to the toplevel of the passed in window
1812 * at this point, make them relative to the passed in window:
1814 private = GDK_WINDOW_OBJECT (window);
1815 while (private != toplevel)
1817 x_tmp -= private->x;
1818 y_tmp -= private->y;
1820 private = private->parent;
1823 found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp);
1825 /* We never return the root window. */
1826 if (found_window == _gdk_root)
1827 found_window = NULL;
1832 return found_window;
1836 gdk_display_warp_pointer (GdkDisplay *display,
1841 CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
1844 /* Returns coordinates relative to the found window. */
1846 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1850 GdkModifierType mask;
1851 GdkWindow *found_window;
1854 found_window = _gdk_windowing_window_get_pointer (display,
1860 GdkWindowObject *private;
1862 /* The coordinates returned above are relative the root, we want
1863 * coordinates relative the window here.
1865 private = GDK_WINDOW_OBJECT (found_window);
1866 while (private != GDK_WINDOW_OBJECT (_gdk_root))
1871 private = private->parent;
1879 /* Mimic the X backend here, -1,-1 for unknown windows. */
1884 return found_window;
1888 gdk_window_get_events (GdkWindow *window)
1890 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1892 if (GDK_WINDOW_DESTROYED (window))
1895 return GDK_WINDOW_OBJECT (window)->event_mask;
1899 gdk_window_set_events (GdkWindow *window,
1900 GdkEventMask event_mask)
1902 g_return_if_fail (GDK_IS_WINDOW (window));
1904 if (!GDK_WINDOW_DESTROYED (window))
1906 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
1911 gdk_window_set_urgency_hint (GdkWindow *window,
1914 /* FIXME: Implement */
1918 gdk_window_set_geometry_hints (GdkWindow *window,
1919 const GdkGeometry *geometry,
1920 GdkWindowHints geom_mask)
1922 GdkWindowImplQuartz *impl;
1924 g_return_if_fail (GDK_IS_WINDOW (window));
1925 g_return_if_fail (geometry != NULL);
1927 if (GDK_WINDOW_DESTROYED (window))
1930 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
1931 if (!impl->toplevel)
1934 if (geom_mask & GDK_HINT_POS)
1936 /* FIXME: Implement */
1939 if (geom_mask & GDK_HINT_USER_POS)
1941 /* FIXME: Implement */
1944 if (geom_mask & GDK_HINT_USER_SIZE)
1946 /* FIXME: Implement */
1949 if (geom_mask & GDK_HINT_MIN_SIZE)
1953 size.width = geometry->min_width;
1954 size.height = geometry->min_height;
1956 [impl->toplevel setContentMinSize:size];
1959 if (geom_mask & GDK_HINT_MAX_SIZE)
1963 size.width = geometry->max_width;
1964 size.height = geometry->max_height;
1966 [impl->toplevel setContentMaxSize:size];
1969 if (geom_mask & GDK_HINT_BASE_SIZE)
1971 /* FIXME: Implement */
1974 if (geom_mask & GDK_HINT_RESIZE_INC)
1978 size.width = geometry->width_inc;
1979 size.height = geometry->height_inc;
1981 [impl->toplevel setContentResizeIncrements:size];
1984 if (geom_mask & GDK_HINT_ASPECT)
1986 /* FIXME: Implement */
1989 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1991 /* FIXME: Implement */
1996 gdk_window_set_title (GdkWindow *window,
1999 GdkWindowImplQuartz *impl;
2001 g_return_if_fail (GDK_IS_WINDOW (window));
2002 g_return_if_fail (title != NULL);
2004 if (GDK_WINDOW_DESTROYED (window))
2007 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
2011 GDK_QUARTZ_ALLOC_POOL;
2012 [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
2013 GDK_QUARTZ_RELEASE_POOL;
2018 gdk_window_set_role (GdkWindow *window,
2021 /* FIXME: Implement */
2025 gdk_window_set_transient_for (GdkWindow *window,
2028 GdkWindowImplQuartz *window_impl;
2029 GdkWindowImplQuartz *parent_impl;
2031 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent))
2034 window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2035 if (!window_impl->toplevel)
2038 GDK_QUARTZ_ALLOC_POOL;
2040 if (window_impl->transient_for)
2042 _gdk_quartz_window_detach_from_parent (window);
2044 g_object_unref (window_impl->transient_for);
2045 window_impl->transient_for = NULL;
2048 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
2049 if (parent_impl->toplevel)
2051 /* We save the parent because it needs to be unset/reset when
2052 * hiding and showing the window.
2055 /* We don't set transients for tooltips, they are already
2056 * handled by the window level being the top one. If we do, then
2057 * the parent window will be brought to the top just because the
2058 * tooltip is, which is not what we want.
2060 if (gdk_window_get_type_hint (window) != GDK_WINDOW_TYPE_HINT_TOOLTIP)
2062 window_impl->transient_for = g_object_ref (parent);
2064 /* We only add the window if it is shown, otherwise it will
2065 * be shown unconditionally here. If it is not shown, the
2066 * window will be added in show() instead.
2068 if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
2069 _gdk_quartz_window_attach_to_parent (window);
2073 GDK_QUARTZ_RELEASE_POOL;
2077 gdk_window_shape_combine_region (GdkWindow *window,
2078 const GdkRegion *shape,
2082 g_return_if_fail (GDK_IS_WINDOW (window));
2084 /* FIXME: Implement */
2088 gdk_window_shape_combine_mask (GdkWindow *window,
2092 /* FIXME: Implement */
2096 gdk_window_input_shape_combine_mask (GdkWindow *window,
2101 /* FIXME: Implement */
2105 gdk_window_input_shape_combine_region (GdkWindow *window,
2106 const GdkRegion *shape_region,
2110 /* FIXME: Implement */
2114 gdk_window_set_child_input_shapes (GdkWindow *window)
2116 /* FIXME: IMplement */
2120 gdk_window_set_override_redirect (GdkWindow *window,
2121 gboolean override_redirect)
2123 /* FIXME: Implement */
2127 gdk_window_set_accept_focus (GdkWindow *window,
2128 gboolean accept_focus)
2130 GdkWindowObject *private;
2132 g_return_if_fail (GDK_IS_WINDOW (window));
2134 private = (GdkWindowObject *)window;
2136 private->accept_focus = accept_focus != FALSE;
2140 gdk_window_set_child_shapes (GdkWindow *window)
2142 g_return_if_fail (GDK_IS_WINDOW (window));
2144 /* FIXME: Implement */
2148 gdk_window_merge_child_shapes (GdkWindow *window)
2150 g_return_if_fail (GDK_IS_WINDOW (window));
2152 /* FIXME: Implement */
2156 gdk_window_merge_child_input_shapes (GdkWindow *window)
2158 /* FIXME: Implement */
2162 gdk_window_set_static_gravities (GdkWindow *window,
2163 gboolean use_static)
2165 /* FIXME: Implement */
2170 gdk_window_set_focus_on_map (GdkWindow *window,
2171 gboolean focus_on_map)
2173 GdkWindowObject *private;
2175 g_return_if_fail (GDK_IS_WINDOW (window));
2177 private = (GdkWindowObject *)window;
2179 private->focus_on_map = focus_on_map != FALSE;
2183 gdk_window_set_icon (GdkWindow *window,
2184 GdkWindow *icon_window,
2188 g_return_if_fail (GDK_IS_WINDOW (window));
2190 /* FIXME: Implement */
2194 gdk_window_set_icon_name (GdkWindow *window,
2197 g_return_if_fail (GDK_IS_WINDOW (window));
2199 /* FIXME: Implement */
2203 gdk_window_focus (GdkWindow *window,
2206 GdkWindowObject *private;
2207 GdkWindowImplQuartz *impl;
2209 g_return_if_fail (GDK_IS_WINDOW (window));
2211 private = (GdkWindowObject*) window;
2212 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2216 if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
2218 GDK_QUARTZ_ALLOC_POOL;
2219 [impl->toplevel makeKeyWindow];
2220 GDK_QUARTZ_RELEASE_POOL;
2226 gdk_window_set_hints (GdkWindow *window,
2235 /* FIXME: Implement */
2239 gint window_type_hint_to_level (GdkWindowTypeHint hint)
2243 case GDK_WINDOW_TYPE_HINT_DOCK:
2244 case GDK_WINDOW_TYPE_HINT_UTILITY:
2245 return NSFloatingWindowLevel;
2247 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2248 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2249 return NSTornOffMenuWindowLevel;
2251 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2252 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2253 return NSStatusWindowLevel;
2255 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2256 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2257 case GDK_WINDOW_TYPE_HINT_COMBO:
2258 case GDK_WINDOW_TYPE_HINT_DND:
2259 return NSPopUpMenuWindowLevel;
2261 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2262 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2263 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2264 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2271 return NSNormalWindowLevel;
2275 window_type_hint_to_shadow (GdkWindowTypeHint hint)
2279 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2280 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2281 case GDK_WINDOW_TYPE_HINT_DOCK:
2282 case GDK_WINDOW_TYPE_HINT_UTILITY:
2283 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2284 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2285 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2286 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2287 case GDK_WINDOW_TYPE_HINT_COMBO:
2288 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2289 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2292 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2293 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2294 case GDK_WINDOW_TYPE_HINT_DND:
2306 gdk_window_set_type_hint (GdkWindow *window,
2307 GdkWindowTypeHint hint)
2309 GdkWindowImplQuartz *impl;
2311 g_return_if_fail (GDK_IS_WINDOW (window));
2313 if (GDK_WINDOW_DESTROYED (window))
2316 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2318 impl->type_hint = hint;
2320 /* Match the documentation, only do something if we're not mapped yet. */
2321 if (GDK_WINDOW_IS_MAPPED (window))
2324 [impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
2325 [impl->toplevel setLevel: window_type_hint_to_level (hint)];
2329 gdk_window_get_type_hint (GdkWindow *window)
2331 if (GDK_WINDOW_DESTROYED (window))
2332 return GDK_WINDOW_TYPE_HINT_NORMAL;
2334 return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
2338 gdk_window_set_modal_hint (GdkWindow *window,
2341 g_return_if_fail (GDK_IS_WINDOW (window));
2343 /* FIXME: Implement */
2347 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2348 gboolean skips_taskbar)
2350 g_return_if_fail (GDK_IS_WINDOW (window));
2352 /* FIXME: Implement */
2356 gdk_window_set_skip_pager_hint (GdkWindow *window,
2357 gboolean skips_pager)
2359 g_return_if_fail (GDK_IS_WINDOW (window));
2361 /* FIXME: Implement */
2365 gdk_window_begin_resize_drag (GdkWindow *window,
2372 GdkWindowObject *private;
2373 GdkWindowImplQuartz *impl;
2375 g_return_if_fail (GDK_IS_WINDOW (window));
2377 if (edge != GDK_WINDOW_EDGE_SOUTH_EAST)
2379 g_warning ("Resizing is only implemented for GDK_WINDOW_EDGE_SOUTH_EAST on Mac OS");
2383 if (GDK_WINDOW_DESTROYED (window))
2386 private = GDK_WINDOW_OBJECT (window);
2387 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2389 if (!impl->toplevel)
2391 g_warning ("Can't call gdk_window_begin_resize_drag on non-toplevel window");
2395 [(GdkQuartzWindow *)impl->toplevel beginManualResize];
2399 gdk_window_begin_move_drag (GdkWindow *window,
2405 GdkWindowObject *private;
2406 GdkWindowImplQuartz *impl;
2408 g_return_if_fail (GDK_IS_WINDOW (window));
2410 if (GDK_WINDOW_DESTROYED (window))
2413 private = GDK_WINDOW_OBJECT (window);
2414 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2416 if (!impl->toplevel)
2418 g_warning ("Can't call gdk_window_begin_move_drag on non-toplevel window");
2422 [(GdkQuartzWindow *)impl->toplevel beginManualMove];
2426 gdk_window_set_icon_list (GdkWindow *window,
2429 /* FIXME: Implement */
2433 gdk_window_get_frame_extents (GdkWindow *window,
2436 GdkWindowObject *private;
2437 GdkWindow *toplevel;
2438 GdkWindowImplQuartz *impl;
2441 g_return_if_fail (GDK_IS_WINDOW (window));
2442 g_return_if_fail (rect != NULL);
2444 private = GDK_WINDOW_OBJECT (window);
2451 if (GDK_WINDOW_DESTROYED (window))
2454 toplevel = gdk_window_get_toplevel (window);
2455 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
2457 ns_rect = [impl->toplevel frame];
2459 rect->x = ns_rect.origin.x;
2460 rect->y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
2461 rect->width = ns_rect.size.width;
2462 rect->height = ns_rect.size.height;
2466 gdk_window_set_decorations (GdkWindow *window,
2467 GdkWMDecoration decorations)
2469 GdkWindowImplQuartz *impl;
2470 int old_mask, new_mask;
2473 g_return_if_fail (GDK_IS_WINDOW (window));
2474 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2476 if (GDK_WINDOW_DESTROYED (window))
2479 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2481 if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP)
2483 new_mask = NSBorderlessWindowMask;
2487 /* FIXME: Honor other GDK_DECOR_* flags. */
2488 new_mask = (NSTitledWindowMask | NSClosableWindowMask |
2489 NSMiniaturizableWindowMask | NSResizableWindowMask);
2492 GDK_QUARTZ_ALLOC_POOL;
2494 old_mask = [impl->toplevel styleMask];
2496 /* Note, there doesn't seem to be a way to change this without
2497 * recreating the toplevel. There might be bad side-effects of doing
2498 * that, but it seems alright.
2500 if (old_mask != new_mask)
2504 old_view = [impl->toplevel contentView];
2506 rect = [impl->toplevel frame];
2508 /* Properly update the size of the window when the titlebar is
2511 if (old_mask == NSBorderlessWindowMask &&
2512 new_mask != NSBorderlessWindowMask)
2514 rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
2516 else if (old_mask != NSBorderlessWindowMask &&
2517 new_mask == NSBorderlessWindowMask)
2519 rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask];
2522 impl->toplevel = [impl->toplevel initWithContentRect:rect
2524 backing:NSBackingStoreBuffered
2527 [impl->toplevel setContentView:old_view];
2528 [impl->toplevel setFrame:rect display:YES];
2531 GDK_QUARTZ_RELEASE_POOL;
2535 gdk_window_get_decorations (GdkWindow *window,
2536 GdkWMDecoration *decorations)
2538 GdkWindowImplQuartz *impl;
2540 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
2541 g_return_val_if_fail (WINDOW_IS_TOPLEVEL (window), FALSE);
2543 if (GDK_WINDOW_DESTROYED (window))
2546 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2550 /* Borderless is 0, so we can't check it as a bit being set. */
2551 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
2557 /* FIXME: Honor the other GDK_DECOR_* flags. */
2558 *decorations = GDK_DECOR_ALL;
2566 gdk_window_set_functions (GdkWindow *window,
2567 GdkWMFunction functions)
2569 g_return_if_fail (GDK_IS_WINDOW (window));
2571 /* FIXME: Implement */
2575 _gdk_windowing_window_get_offsets (GdkWindow *window,
2579 *x_offset = *y_offset = 0;
2583 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
2590 gdk_window_stick (GdkWindow *window)
2592 g_return_if_fail (GDK_IS_WINDOW (window));
2596 gdk_window_unstick (GdkWindow *window)
2598 g_return_if_fail (GDK_IS_WINDOW (window));
2602 gdk_window_maximize (GdkWindow *window)
2604 GdkWindowImplQuartz *impl;
2606 g_return_if_fail (GDK_IS_WINDOW (window));
2608 if (GDK_WINDOW_DESTROYED (window))
2611 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2613 if (GDK_WINDOW_IS_MAPPED (window))
2615 GDK_QUARTZ_ALLOC_POOL;
2617 if (impl->toplevel && ![impl->toplevel isZoomed])
2618 [impl->toplevel zoom:nil];
2620 GDK_QUARTZ_RELEASE_POOL;
2624 gdk_synthesize_window_state (window,
2626 GDK_WINDOW_STATE_MAXIMIZED);
2631 gdk_window_unmaximize (GdkWindow *window)
2633 GdkWindowImplQuartz *impl;
2635 g_return_if_fail (GDK_IS_WINDOW (window));
2637 if (GDK_WINDOW_DESTROYED (window))
2640 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2642 if (GDK_WINDOW_IS_MAPPED (window))
2644 GDK_QUARTZ_ALLOC_POOL;
2646 if (impl->toplevel && [impl->toplevel isZoomed])
2647 [impl->toplevel zoom:nil];
2649 GDK_QUARTZ_RELEASE_POOL;
2653 gdk_synthesize_window_state (window,
2654 GDK_WINDOW_STATE_MAXIMIZED,
2660 gdk_window_iconify (GdkWindow *window)
2662 GdkWindowImplQuartz *impl;
2664 g_return_if_fail (GDK_IS_WINDOW (window));
2666 if (GDK_WINDOW_DESTROYED (window))
2669 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2671 if (GDK_WINDOW_IS_MAPPED (window))
2673 GDK_QUARTZ_ALLOC_POOL;
2676 [impl->toplevel miniaturize:nil];
2678 GDK_QUARTZ_RELEASE_POOL;
2682 gdk_synthesize_window_state (window,
2684 GDK_WINDOW_STATE_ICONIFIED);
2689 gdk_window_deiconify (GdkWindow *window)
2691 GdkWindowImplQuartz *impl;
2693 g_return_if_fail (GDK_IS_WINDOW (window));
2695 if (GDK_WINDOW_DESTROYED (window))
2698 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2700 if (GDK_WINDOW_IS_MAPPED (window))
2702 GDK_QUARTZ_ALLOC_POOL;
2705 [impl->toplevel deminiaturize:nil];
2707 GDK_QUARTZ_RELEASE_POOL;
2711 gdk_synthesize_window_state (window,
2712 GDK_WINDOW_STATE_ICONIFIED,
2717 #define FULLSCREEN_DATA "fullscreen-data"
2723 GdkWMDecoration decor;
2724 } FullscreenSavedGeometry;
2727 gdk_window_fullscreen (GdkWindow *window)
2729 FullscreenSavedGeometry *geometry;
2730 GdkWindowObject *private = (GdkWindowObject *) window;
2731 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2734 g_return_if_fail (GDK_IS_WINDOW (window));
2735 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2737 geometry = g_new (FullscreenSavedGeometry, 1);
2739 geometry->x = private->x;
2740 geometry->y = private->y;
2741 geometry->width = impl->width;
2742 geometry->height = impl->height;
2744 if (!gdk_window_get_decorations (window, &geometry->decor))
2745 geometry->decor = GDK_DECOR_ALL;
2747 g_object_set_data_full (G_OBJECT (window),
2748 FULLSCREEN_DATA, geometry,
2753 gdk_window_set_decorations (window, 0);
2755 frame = [[NSScreen mainScreen] frame];
2756 move_resize_window_internal (window,
2758 frame.size.width, frame.size.height);
2760 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
2764 gdk_window_unfullscreen (GdkWindow *window)
2766 FullscreenSavedGeometry *geometry;
2768 g_return_if_fail (GDK_IS_WINDOW (window));
2769 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2771 geometry = g_object_get_data (G_OBJECT (window), FULLSCREEN_DATA);
2777 move_resize_window_internal (window,
2783 gdk_window_set_decorations (window, geometry->decor);
2785 g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL);
2787 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
2792 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2794 GdkWindowObject *private = (GdkWindowObject *) window;
2795 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2798 g_return_if_fail (GDK_IS_WINDOW (window));
2799 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2801 if (GDK_WINDOW_DESTROYED (window))
2804 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2806 /* Adjust normal window level by one if necessary. */
2807 [impl->toplevel setLevel: level + (setting ? 1 : 0)];
2811 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2813 GdkWindowObject *private = (GdkWindowObject *) window;
2814 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2817 g_return_if_fail (GDK_IS_WINDOW (window));
2818 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2820 if (GDK_WINDOW_DESTROYED (window))
2823 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2825 /* Adjust normal window level by one if necessary. */
2826 [impl->toplevel setLevel: level - (setting ? 1 : 0)];
2830 gdk_window_get_group (GdkWindow *window)
2832 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
2833 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2835 /* FIXME: Implement */
2841 gdk_window_set_group (GdkWindow *window,
2844 /* FIXME: Implement */
2848 gdk_window_foreign_new_for_display (GdkDisplay *display,
2849 GdkNativeWindow anid)
2851 /* Foreign windows aren't supported in Mac OS X */
2856 gdk_window_lookup (GdkNativeWindow anid)
2858 /* Foreign windows aren't supported in Mac OS X */
2863 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2865 /* Foreign windows aren't supported in Mac OS X */
2870 gdk_window_enable_synchronized_configure (GdkWindow *window)
2875 gdk_window_configure_finished (GdkWindow *window)
2880 gdk_window_destroy_notify (GdkWindow *window)
2885 gdk_window_beep (GdkWindow *window)
2887 gdk_display_beep (_gdk_display);
2891 gdk_window_set_opacity (GdkWindow *window,
2894 GdkWindowObject *private = (GdkWindowObject *) window;
2895 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2897 g_return_if_fail (GDK_IS_WINDOW (window));
2898 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2900 if (GDK_WINDOW_DESTROYED (window))
2905 else if (opacity > 1)
2908 [impl->toplevel setAlphaValue: opacity];
2912 _gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)