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 "gdkwindowimpl.h"
27 #include "gdkprivate-quartz.h"
29 static gpointer parent_class;
31 static GSList *update_nswindows;
32 static gboolean in_process_all_updates = FALSE;
34 static GSList *main_window_stack;
36 #define FULLSCREEN_DATA "fullscreen-data"
42 GdkWMDecoration decor;
43 } FullscreenSavedGeometry;
46 static void update_toplevel_order (void);
47 static void clear_toplevel_order (void);
49 static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window);
51 #define WINDOW_IS_TOPLEVEL(window) \
52 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
53 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
54 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
56 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
59 gdk_quartz_window_get_nsview (GdkWindow *window)
61 GdkWindowObject *private = (GdkWindowObject *)window;
63 if (GDK_WINDOW_DESTROYED (window))
66 return ((GdkWindowImplQuartz *)private->impl)->view;
70 gdk_quartz_window_get_nswindow (GdkWindow *window)
72 GdkWindowObject *private = (GdkWindowObject *)window;
74 if (GDK_WINDOW_DESTROYED (window))
77 return ((GdkWindowImplQuartz *)private->impl)->toplevel;
81 gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
84 GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
85 GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
86 CGContextRef cg_context;
88 if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
91 /* Lock focus when not called as part of a drawRect call. This
92 * is needed when called from outside "real" expose events, for
93 * example for synthesized expose events when realizing windows
94 * and for widgets that send fake expose events like the arrow
95 * buttons in spinbuttons or the position marker in rulers.
97 if (window_impl->in_paint_rect_count == 0)
99 if (![window_impl->view lockFocusIfCanDraw])
103 cg_context = [[NSGraphicsContext currentContext] graphicsPort];
104 CGContextSaveGState (cg_context);
105 CGContextSetAllowsAntialiasing (cg_context, antialias);
107 /* We'll emulate the clipping caused by double buffering here */
108 if (window_impl->begin_paint_count != 0)
115 gdk_region_get_rectangles (window_impl->paint_clip_region,
121 cg_rects = g_new (CGRect, n_rects);
123 for (i = 0; i < n_rects; i++)
125 cg_rects[i].origin.x = rects[i].x;
126 cg_rects[i].origin.y = rects[i].y;
127 cg_rects[i].size.width = rects[i].width;
128 cg_rects[i].size.height = rects[i].height;
131 CGContextClipToRects (cg_context, cg_rects, n_rects);
134 if (cg_rects != &rect)
142 check_grab_unmap (GdkWindow *window)
144 GdkDisplay *display = gdk_drawable_get_display (window);
146 _gdk_display_end_pointer_grab (display, 0, window, TRUE);
148 if (display->keyboard_grab.window)
150 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
151 GdkWindowObject *tmp = GDK_WINDOW_OBJECT (display->keyboard_grab.window);
153 while (tmp && tmp != private)
157 _gdk_display_unset_has_keyboard_grab (display, TRUE);
162 check_grab_destroy (GdkWindow *window)
164 GdkDisplay *display = gdk_drawable_get_display (window);
165 GdkPointerGrabInfo *grab;
167 /* Make sure there is no lasting grab in this native window */
168 grab = _gdk_display_get_last_pointer_grab (display);
169 if (grab && grab->native_window == window)
171 /* Serials are always 0 in quartz, but for clarity: */
172 grab->serial_end = grab->serial_start;
173 grab->implicit_ungrab = TRUE;
176 if (window == display->keyboard_grab.native_window &&
177 display->keyboard_grab.window != NULL)
178 _gdk_display_unset_has_keyboard_grab (display, TRUE);
182 gdk_window_impl_quartz_finalize (GObject *object)
184 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
186 check_grab_destroy (GDK_DRAWABLE_IMPL_QUARTZ (object)->wrapper);
188 if (impl->paint_clip_region)
189 gdk_region_destroy (impl->paint_clip_region);
191 if (impl->transient_for)
192 g_object_unref (impl->transient_for);
194 G_OBJECT_CLASS (parent_class)->finalize (object);
198 gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
200 GObjectClass *object_class = G_OBJECT_CLASS (klass);
201 GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
203 parent_class = g_type_class_peek_parent (klass);
205 object_class->finalize = gdk_window_impl_quartz_finalize;
207 drawable_quartz_class->get_context = gdk_window_impl_quartz_get_context;
211 gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
213 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
217 gdk_window_impl_quartz_begin_paint_region (GdkPaintable *paintable,
219 const GdkRegion *region)
221 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
222 GdkWindowObject *private = (GdkWindowObject*)window;
224 GdkRectangle *rects = NULL;
225 GdkPixmap *bg_pixmap;
226 GdkRegion *clipped_and_offset_region;
227 gboolean free_clipped_and_offset_region = TRUE;
229 bg_pixmap = private->bg_pixmap;
231 clipped_and_offset_region = gdk_region_copy (region);
233 gdk_region_intersect (clipped_and_offset_region,
234 private->clip_region_with_children);
235 gdk_region_offset (clipped_and_offset_region,
236 private->abs_x, private->abs_y);
238 if (impl->begin_paint_count == 0)
240 impl->paint_clip_region = clipped_and_offset_region;
241 free_clipped_and_offset_region = FALSE;
244 gdk_region_union (impl->paint_clip_region, clipped_and_offset_region);
246 impl->begin_paint_count++;
248 if (bg_pixmap == GDK_NO_BG)
251 gdk_region_get_rectangles (clipped_and_offset_region, &rects, &n_rects);
253 if (bg_pixmap == NULL)
255 CGContextRef cg_context;
259 cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
260 _gdk_quartz_colormap_get_rgba_from_pixel (gdk_drawable_get_colormap (window),
261 private->bg_color.pixel,
263 CGContextSetRGBFillColor (cg_context, r, g, b, a);
265 for (i = 0; i < n_rects; i++)
267 CGContextFillRect (cg_context,
268 CGRectMake (rects[i].x, rects[i].y,
269 rects[i].width, rects[i].height));
272 gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), cg_context);
277 int x_offset, y_offset;
281 x_offset = y_offset = 0;
283 while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
285 /* If this window should have the same background as the parent,
286 * fetch the parent. (And if the same goes for the parent, fetch
287 * the grandparent, etc.)
289 x_offset += ((GdkWindowObject *) window)->x;
290 y_offset += ((GdkWindowObject *) window)->y;
291 window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
292 bg_pixmap = ((GdkWindowObject *) window)->bg_pixmap;
295 if (bg_pixmap == NULL || bg_pixmap == GDK_NO_BG || bg_pixmap == GDK_PARENT_RELATIVE_BG)
297 /* Parent relative background but the parent doesn't have a
303 /* Note: There should be a CG API to draw tiled images, we might
304 * want to look into that for this.
306 gc = gdk_gc_new (GDK_DRAWABLE (impl));
308 gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
311 while (x < (rects[0].x + rects[0].width))
313 if (x + width >= rects[0].x)
316 while (y < (rects[0].y + rects[0].height))
318 if (y + height >= rects[0].y)
319 gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
331 if (free_clipped_and_offset_region)
332 gdk_region_destroy (clipped_and_offset_region);
337 gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
339 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
341 impl->begin_paint_count--;
343 if (impl->begin_paint_count == 0)
345 gdk_region_destroy (impl->paint_clip_region);
346 impl->paint_clip_region = NULL;
351 _gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
354 GdkWindowObject *private;
355 GdkWindowImplQuartz *impl;
357 private = GDK_WINDOW_OBJECT (window);
358 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
360 if (!impl->needs_display_region)
361 impl->needs_display_region = gdk_region_new ();
363 gdk_region_union_with_rect (impl->needs_display_region, rect);
365 [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
366 rect->width, rect->height)];
371 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
377 /* Make sure to only flush each toplevel at most once if we're called
378 * from process_all_updates.
380 if (in_process_all_updates)
384 toplevel = gdk_window_get_toplevel (window);
387 GdkWindowObject *toplevel_private;
388 GdkWindowImplQuartz *toplevel_impl;
391 toplevel_private = (GdkWindowObject *)toplevel;
392 toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
393 nswindow = toplevel_impl->toplevel;
395 /* In theory, we could skip the flush disabling, since we only
398 if (nswindow && ![nswindow isFlushWindowDisabled])
401 [nswindow disableFlushWindow];
402 update_nswindows = g_slist_prepend (update_nswindows, nswindow);
407 gdk_region_get_rectangles (region, &rects, &n_rects);
409 for (i = 0; i < n_rects; i++)
410 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
414 /* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
415 * lot (since it triggers the beam syncing) and things seem to work
421 _gdk_windowing_before_process_all_updates (void)
423 in_process_all_updates = TRUE;
425 NSDisableScreenUpdates ();
429 _gdk_windowing_after_process_all_updates (void)
431 GSList *old_update_nswindows = update_nswindows;
432 GSList *tmp_list = update_nswindows;
434 update_nswindows = NULL;
438 NSWindow *nswindow = tmp_list->data;
440 [[nswindow contentView] displayIfNeeded];
442 _gdk_quartz_drawable_flush (NULL);
444 [nswindow enableFlushWindow];
445 [nswindow flushWindow];
448 tmp_list = tmp_list->next;
451 g_slist_free (old_update_nswindows);
453 in_process_all_updates = FALSE;
455 NSEnableScreenUpdates ();
459 gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
461 iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
462 iface->end_paint = gdk_window_impl_quartz_end_paint;
466 _gdk_window_impl_quartz_get_type (void)
468 static GType object_type = 0;
472 const GTypeInfo object_info =
474 sizeof (GdkWindowImplQuartzClass),
475 (GBaseInitFunc) NULL,
476 (GBaseFinalizeFunc) NULL,
477 (GClassInitFunc) gdk_window_impl_quartz_class_init,
478 NULL, /* class_finalize */
479 NULL, /* class_data */
480 sizeof (GdkWindowImplQuartz),
482 (GInstanceInitFunc) gdk_window_impl_quartz_init,
485 const GInterfaceInfo paintable_info =
487 (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
492 const GInterfaceInfo window_impl_info =
494 (GInterfaceInitFunc) gdk_window_impl_iface_init,
499 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
500 "GdkWindowImplQuartz",
502 g_type_add_interface_static (object_type,
505 g_type_add_interface_static (object_type,
506 GDK_TYPE_WINDOW_IMPL,
514 _gdk_window_impl_get_type (void)
516 return _gdk_window_impl_quartz_get_type ();
520 get_default_title (void)
524 title = g_get_application_name ();
526 title = g_get_prgname ();
532 get_ancestor_coordinates_from_child (GdkWindow *child_window,
535 GdkWindow *ancestor_window,
539 GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
540 GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
542 while (child_private != ancestor_private)
544 child_x += child_private->x;
545 child_y += child_private->y;
547 child_private = child_private->parent;
550 *ancestor_x = child_x;
551 *ancestor_y = child_y;
555 _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
557 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
561 static NSWindow *debug_window[10];
562 static NSRect old_rect[10];
566 g_return_if_fail (number >= 0 && number <= 9);
568 if (window == _gdk_root)
573 if (debug_window[number])
574 [debug_window[number] close];
575 debug_window[number] = NULL;
580 toplevel = gdk_window_get_toplevel (window);
581 get_ancestor_coordinates_from_child (window, 0, 0, toplevel, &x, &y);
583 gdk_window_get_origin (toplevel, &tx, &ty);
587 rect = NSMakeRect (x,
588 _gdk_quartz_window_get_inverted_screen_y (y + private->height),
589 private->width, private->height);
591 if (debug_window[number] && NSEqualRects (rect, old_rect[number]))
594 old_rect[number] = rect;
596 if (debug_window[number])
597 [debug_window[number] close];
599 debug_window[number] = [[NSWindow alloc] initWithContentRect:rect
600 styleMask:NSBorderlessWindowMask
601 backing:NSBackingStoreBuffered
607 color = [NSColor redColor];
610 color = [NSColor blueColor];
613 color = [NSColor greenColor];
616 color = [NSColor yellowColor];
619 color = [NSColor brownColor];
622 color = [NSColor purpleColor];
625 color = [NSColor blackColor];
629 [debug_window[number] setBackgroundColor:color];
630 [debug_window[number] setAlphaValue:0.4];
631 [debug_window[number] setOpaque:NO];
632 [debug_window[number] setReleasedWhenClosed:YES];
633 [debug_window[number] setIgnoresMouseEvents:YES];
634 [debug_window[number] setLevel:NSFloatingWindowLevel];
636 [debug_window[number] orderFront:nil];
640 _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
643 if (ancestor == NULL || window == NULL)
646 return (gdk_window_get_parent (window) == ancestor ||
647 _gdk_quartz_window_is_ancestor (ancestor,
648 gdk_window_get_parent (window)));
651 /* FIXME: It would be nice to have one function that takes an NSPoint
652 * and flips the coords for any window.
655 _gdk_quartz_window_get_inverted_screen_y (gint y)
657 NSRect rect = [[NSScreen mainScreen] frame];
659 return rect.size.height - y;
663 find_child_window_helper (GdkWindow *window,
669 GdkWindowImplQuartz *impl;
672 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
674 if (window == _gdk_root)
675 update_toplevel_order ();
677 for (l = impl->sorted_children; l; l = l->next)
679 GdkWindowObject *child_private = l->data;
680 GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
683 if (!GDK_WINDOW_IS_MAPPED (child_private))
686 temp_x = x_offset + child_private->x;
687 temp_y = y_offset + child_private->y;
689 /* Special-case the root window. We have to include the title
690 * bar in the checks, otherwise the window below the title bar
691 * will be found i.e. events punch through. (If we can find a
692 * better way to deal with the events in gdkevents-quartz, this
693 * might not be needed.)
695 if (window == _gdk_root)
697 NSRect frame = NSMakeRect (0, 0, 100, 100);
702 mask = [child_impl->toplevel styleMask];
704 /* Get the title bar height. */
705 content = [NSWindow contentRectForFrameRect:frame
707 titlebar_height = frame.size.height - content.size.height;
709 if (titlebar_height > 0 &&
710 x >= temp_x && y >= temp_y - titlebar_height &&
711 x < temp_x + child_private->width && y < temp_y)
713 /* The root means "unknown" i.e. a window not managed by
716 return (GdkWindow *)_gdk_root;
720 if (x >= temp_x && y >= temp_y &&
721 x < temp_x + child_private->width && y < temp_y + child_private->height)
723 /* Look for child windows. */
724 return find_child_window_helper (l->data,
733 /* Given a GdkWindow and coordinates relative to it, returns the
734 * innermost subwindow that contains the point. If the coordinates are
735 * outside the passed in window, NULL is returned.
738 _gdk_quartz_window_find_child (GdkWindow *window,
742 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
744 if (x >= 0 && y >= 0 && x < private->width && y < private->height)
745 return find_child_window_helper (window, x, y, 0, 0);
752 generate_motion_event (GdkWindow *window)
755 NSPoint screen_point;
758 GdkWindowObject *private;
760 gint x, y, x_root, y_root;
763 GdkWindow *pointer_window;
765 event = gdk_event_new (GDK_MOTION_NOTIFY);
766 event->any.window = NULL;
767 event->any.send_event = TRUE;
769 private = (GdkWindowObject *)window;
770 nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
771 view = (GdkQuartzView *)[nswindow contentView];
773 screen_point = [NSEvent mouseLocation];
775 x_root = screen_point.x;
776 y_root = _gdk_quartz_window_get_inverted_screen_y (screen_point.y);
778 point = [nswindow convertScreenToBase:screen_point];
781 y = private->height - point.y;
783 pointer_window = _gdk_window_find_descendant_at (window, x, y,
786 event->any.type = GDK_MOTION_NOTIFY;
787 event->motion.window = window;
788 event->motion.time = GDK_CURRENT_TIME;
791 event->motion.x_root = x_root;
792 event->motion.y_root = y_root;
793 /* FIXME event->axes */
794 event->motion.state = 0;
795 event->motion.is_hint = FALSE;
796 event->motion.device = _gdk_display->core_pointer;
798 if (event->any.window)
799 g_object_ref (event->any.window);
801 node = _gdk_event_queue_append (gdk_display_get_default (), event);
802 _gdk_windowing_got_event (gdk_display_get_default (), node, event, 0);
806 _gdk_quartz_window_did_become_main (GdkWindow *window)
808 main_window_stack = g_slist_remove (main_window_stack, window);
810 if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
812 main_window_stack = g_slist_prepend (main_window_stack, window);
814 /* We just became the active window, send a motion-notify
815 * event so things like highlights get set up correctly.
816 * This motion-notify is sent to the key window.
818 generate_motion_event (window);
821 clear_toplevel_order ();
825 _gdk_quartz_window_did_resign_main (GdkWindow *window)
827 GdkWindow *new_window = NULL;
829 if (main_window_stack)
830 new_window = main_window_stack->data;
835 toplevels = gdk_window_get_toplevels ();
837 new_window = toplevels->data;
838 g_list_free (toplevels);
842 new_window != window &&
843 GDK_WINDOW_IS_MAPPED (new_window) &&
844 GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
846 GdkWindowObject *private = (GdkWindowObject *) new_window;
847 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
849 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
852 clear_toplevel_order ();
856 _gdk_window_impl_new (GdkWindow *window,
857 GdkWindow *real_parent,
860 GdkEventMask event_mask,
861 GdkWindowAttr *attributes,
862 gint attributes_mask)
864 GdkWindowObject *private;
865 GdkWindowImplQuartz *impl;
866 GdkDrawableImplQuartz *draw_impl;
867 GdkWindowImplQuartz *parent_impl;
869 GDK_QUARTZ_ALLOC_POOL;
871 private = (GdkWindowObject *)window;
873 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
874 private->impl = (GdkDrawable *)impl;
875 draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
876 draw_impl->wrapper = GDK_DRAWABLE (window);
878 parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
880 switch (private->window_type)
882 case GDK_WINDOW_TOPLEVEL:
883 case GDK_WINDOW_DIALOG:
884 case GDK_WINDOW_TEMP:
885 if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
887 /* The common code warns for this case */
888 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
892 if (!private->input_only)
894 if (attributes_mask & GDK_WA_COLORMAP)
896 draw_impl->colormap = attributes->colormap;
897 g_object_ref (attributes->colormap);
901 if (visual == gdk_screen_get_system_visual (_gdk_screen))
903 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
904 g_object_ref (draw_impl->colormap);
906 else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
908 draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
909 g_object_ref (draw_impl->colormap);
913 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
919 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
920 g_object_ref (draw_impl->colormap);
923 /* Maintain the z-ordered list of children. */
924 if (private->parent != (GdkWindowObject *)_gdk_root)
925 parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
927 clear_toplevel_order ();
929 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
930 (attributes->cursor) :
933 switch (attributes->window_type)
935 case GDK_WINDOW_TOPLEVEL:
936 case GDK_WINDOW_DIALOG:
937 case GDK_WINDOW_TEMP:
943 content_rect = NSMakeRect (private->x,
944 _gdk_quartz_window_get_inverted_screen_y (private->y) - private->height,
948 if (attributes->window_type == GDK_WINDOW_TEMP ||
949 attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
951 style_mask = NSBorderlessWindowMask;
955 style_mask = (NSTitledWindowMask |
956 NSClosableWindowMask |
957 NSMiniaturizableWindowMask |
958 NSResizableWindowMask);
961 impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
963 backing:NSBackingStoreBuffered
966 if (attributes_mask & GDK_WA_TITLE)
967 title = attributes->title;
969 title = get_default_title ();
971 gdk_window_set_title (window, title);
973 if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
975 [impl->toplevel setOpaque:NO];
976 [impl->toplevel setBackgroundColor:[NSColor clearColor]];
979 content_rect.origin.x = 0;
980 content_rect.origin.y = 0;
982 impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
983 [impl->view setGdkWindow:window];
984 [impl->toplevel setContentView:impl->view];
988 case GDK_WINDOW_CHILD:
990 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (private->parent)->impl);
992 if (!private->input_only)
994 NSRect frame_rect = NSMakeRect (private->x + private->parent->abs_x,
995 private->y + private->parent->abs_y,
999 impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
1001 [impl->view setGdkWindow:window];
1003 /* GdkWindows should be hidden by default */
1004 [impl->view setHidden:YES];
1005 [parent_impl->view addSubview:impl->view];
1011 g_assert_not_reached ();
1014 GDK_QUARTZ_RELEASE_POOL;
1016 if (attributes_mask & GDK_WA_TYPE_HINT)
1017 gdk_window_set_type_hint (window, attributes->type_hint);
1021 _gdk_windowing_window_init (void)
1023 GdkWindowObject *private;
1024 GdkWindowImplQuartz *impl;
1025 GdkDrawableImplQuartz *drawable_impl;
1028 g_assert (_gdk_root == NULL);
1030 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
1032 private = (GdkWindowObject *)_gdk_root;
1033 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
1034 private->impl_window = private;
1036 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
1038 /* The size of the root window should be the same as the size of
1039 * the screen it belongs to.
1041 * FIXME: Of course this needs to be updated when you change the monitor
1042 * configuration (add another one, remove one, etc).
1048 private->width = gdk_screen_get_width (_gdk_screen);
1049 private->height = gdk_screen_get_height (_gdk_screen);
1051 private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
1052 private->window_type = GDK_WINDOW_ROOT;
1053 private->depth = 24;
1054 private->viewable = TRUE;
1056 drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
1058 drawable_impl->wrapper = GDK_DRAWABLE (private);
1059 drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
1060 g_object_ref (drawable_impl->colormap);
1064 _gdk_quartz_window_destroy (GdkWindow *window,
1066 gboolean foreign_destroy)
1068 GdkWindowObject *private;
1069 GdkWindowImplQuartz *impl;
1070 GdkWindowObject *parent;
1072 private = GDK_WINDOW_OBJECT (window);
1073 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1075 main_window_stack = g_slist_remove (main_window_stack, window);
1077 g_list_free (impl->sorted_children);
1078 impl->sorted_children = NULL;
1080 parent = private->parent;
1083 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
1085 parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
1088 _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
1090 if (!recursing && !foreign_destroy)
1092 GDK_QUARTZ_ALLOC_POOL;
1095 [impl->toplevel close];
1096 else if (impl->view)
1097 [impl->view removeFromSuperview];
1099 GDK_QUARTZ_RELEASE_POOL;
1104 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
1106 /* Foreign windows aren't supported in OSX. */
1109 /* FIXME: This might be possible to simplify with client-side windows. Also
1110 * note that already_mapped is not used yet, see the x11 backend.
1113 gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
1115 GdkWindowObject *private = (GdkWindowObject *)window;
1116 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1117 gboolean focus_on_map;
1119 GDK_QUARTZ_ALLOC_POOL;
1121 if (!GDK_WINDOW_IS_MAPPED (window))
1122 focus_on_map = private->focus_on_map;
1124 focus_on_map = TRUE;
1130 make_key = (private->accept_focus && focus_on_map &&
1131 private->window_type != GDK_WINDOW_TEMP);
1133 [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
1134 clear_toplevel_order ();
1136 _gdk_quartz_events_send_map_event (window);
1140 [impl->view setHidden:NO];
1143 [impl->view setNeedsDisplay:YES];
1145 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
1147 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1148 gdk_window_maximize (window);
1150 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1151 gdk_window_iconify (window);
1153 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1154 _gdk_quartz_window_attach_to_parent (window);
1156 GDK_QUARTZ_RELEASE_POOL;
1159 /* Temporarily unsets the parent window, if the window is a
1163 _gdk_quartz_window_detach_from_parent (GdkWindow *window)
1165 GdkWindowImplQuartz *impl;
1167 g_return_if_fail (GDK_IS_WINDOW (window));
1169 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1171 g_return_if_fail (impl->toplevel != NULL);
1173 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1175 GdkWindowImplQuartz *parent_impl;
1177 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1178 [parent_impl->toplevel removeChildWindow:impl->toplevel];
1179 clear_toplevel_order ();
1183 /* Re-sets the parent window, if the window is a transient. */
1185 _gdk_quartz_window_attach_to_parent (GdkWindow *window)
1187 GdkWindowImplQuartz *impl;
1189 g_return_if_fail (GDK_IS_WINDOW (window));
1191 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1193 g_return_if_fail (impl->toplevel != NULL);
1195 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1197 GdkWindowImplQuartz *parent_impl;
1199 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1200 [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
1201 clear_toplevel_order ();
1206 gdk_window_quartz_hide (GdkWindow *window)
1208 GdkWindowObject *private = (GdkWindowObject *)window;
1209 GdkWindowImplQuartz *impl;
1211 /* Make sure we're not stuck in fullscreen mode. */
1212 if (get_fullscreen_geometry (window))
1213 SetSystemUIMode (kUIModeNormal, 0);
1215 check_grab_unmap (window);
1217 _gdk_window_clear_update_area (window);
1219 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1223 /* Update main window. */
1224 main_window_stack = g_slist_remove (main_window_stack, window);
1225 if ([NSApp mainWindow] == impl->toplevel)
1226 _gdk_quartz_window_did_resign_main (window);
1228 if (impl->transient_for)
1229 _gdk_quartz_window_detach_from_parent (window);
1231 [(GdkQuartzWindow*)impl->toplevel hide];
1233 else if (impl->view)
1235 [impl->view setHidden:YES];
1240 gdk_window_quartz_withdraw (GdkWindow *window)
1242 gdk_window_hide (window);
1246 move_resize_window_internal (GdkWindow *window,
1252 GdkWindowObject *private = (GdkWindowObject *)window;
1253 GdkWindowImplQuartz *impl;
1254 GdkRectangle old_visible;
1255 GdkRectangle new_visible;
1256 GdkRectangle scroll_rect;
1257 GdkRegion *old_region;
1258 GdkRegion *expose_region;
1261 if (GDK_WINDOW_DESTROYED (window))
1264 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1266 if ((x == -1 || (x == private->x)) &&
1267 (y == -1 || (y == private->y)) &&
1268 (width == -1 || (width == private->width)) &&
1269 (height == -1 || (height == private->height)))
1274 if (!impl->toplevel)
1276 /* The previously visible area of this window in a coordinate
1277 * system rooted at the origin of this window.
1279 old_visible.x = -private->x;
1280 old_visible.y = -private->y;
1282 gdk_window_get_size (GDK_DRAWABLE (private->parent),
1284 &old_visible.height);
1289 delta.width = x - private->x;
1299 delta.height = y - private->y;
1308 private->width = width;
1311 private->height = height;
1313 GDK_QUARTZ_ALLOC_POOL;
1317 NSRect content_rect;
1320 content_rect = NSMakeRect (private->x,
1321 _gdk_quartz_window_get_inverted_screen_y (private->y + private->height),
1322 private->width, private->height);
1324 frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
1325 [impl->toplevel setFrame:frame_rect display:YES];
1329 if (!private->input_only)
1333 nsrect = NSMakeRect (private->x, private->y, private->width, private->height);
1335 /* The newly visible area of this window in a coordinate
1336 * system rooted at the origin of this window.
1338 new_visible.x = -private->x;
1339 new_visible.y = -private->y;
1340 new_visible.width = old_visible.width; /* parent has not changed size */
1341 new_visible.height = old_visible.height; /* parent has not changed size */
1343 expose_region = gdk_region_rectangle (&new_visible);
1344 old_region = gdk_region_rectangle (&old_visible);
1345 gdk_region_subtract (expose_region, old_region);
1347 /* Determine what (if any) part of the previously visible
1348 * part of the window can be copied without a redraw
1350 scroll_rect = old_visible;
1351 scroll_rect.x -= delta.width;
1352 scroll_rect.y -= delta.height;
1353 gdk_rectangle_intersect (&scroll_rect, &old_visible, &scroll_rect);
1355 if (!gdk_region_empty (expose_region))
1357 GdkRectangle* rects;
1361 if (scroll_rect.width != 0 && scroll_rect.height != 0)
1363 [impl->view scrollRect:NSMakeRect (scroll_rect.x,
1370 [impl->view setFrame:nsrect];
1372 gdk_region_get_rectangles (expose_region, &rects, &n_rects);
1374 for (n = 0; n < n_rects; ++n)
1375 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
1381 [impl->view setFrame:nsrect];
1382 [impl->view setNeedsDisplay:YES];
1385 gdk_region_destroy (expose_region);
1386 gdk_region_destroy (old_region);
1390 GDK_QUARTZ_RELEASE_POOL;
1394 window_quartz_move (GdkWindow *window,
1398 g_return_if_fail (GDK_IS_WINDOW (window));
1400 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1403 move_resize_window_internal (window, x, y, -1, -1);
1407 window_quartz_resize (GdkWindow *window,
1411 g_return_if_fail (GDK_IS_WINDOW (window));
1413 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1421 move_resize_window_internal (window, -1, -1, width, height);
1425 window_quartz_move_resize (GdkWindow *window,
1436 move_resize_window_internal (window, x, y, width, height);
1440 gdk_window_quartz_move_resize (GdkWindow *window,
1447 if (with_move && (width < 0 && height < 0))
1448 window_quartz_move (window, x, y);
1452 window_quartz_move_resize (window, x, y, width, height);
1454 window_quartz_resize (window, width, height);
1458 /* FIXME: This might need fixing (reparenting didn't work before client-side
1462 gdk_window_quartz_reparent (GdkWindow *window,
1463 GdkWindow *new_parent,
1467 GdkWindowObject *private, *old_parent_private, *new_parent_private;
1468 GdkWindowImplQuartz *impl, *old_parent_impl, *new_parent_impl;
1469 NSView *view, *new_parent_view;
1471 if (new_parent == _gdk_root)
1473 /* Could be added, just needs implementing. */
1474 g_warning ("Reparenting to root window is not supported yet in the Mac OS X backend");
1478 private = GDK_WINDOW_OBJECT (window);
1479 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1482 new_parent_private = GDK_WINDOW_OBJECT (new_parent);
1483 new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent_private->impl);
1484 new_parent_view = new_parent_impl->view;
1486 old_parent_private = GDK_WINDOW_OBJECT (private->parent);
1487 old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent_private->impl);
1491 [view removeFromSuperview];
1492 [new_parent_view addSubview:view];
1496 private->parent = new_parent_private;
1498 if (old_parent_private)
1500 old_parent_impl->sorted_children = g_list_remove (old_parent_impl->sorted_children, window);
1503 new_parent_impl->sorted_children = g_list_prepend (new_parent_impl->sorted_children, window);
1508 /* Get the toplevel ordering from NSApp and update our own list. We do
1509 * this on demand since the NSApp's list is not up to date directly
1510 * after we get windowDidBecomeMain.
1513 update_toplevel_order (void)
1515 GdkWindowObject *root;
1516 GdkWindowImplQuartz *root_impl;
1517 NSEnumerator *enumerator;
1519 GList *toplevels = NULL;
1521 root = GDK_WINDOW_OBJECT (_gdk_root);
1522 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1524 if (root_impl->sorted_children)
1527 GDK_QUARTZ_ALLOC_POOL;
1529 enumerator = [[NSApp orderedWindows] objectEnumerator];
1530 while ((nswindow = [enumerator nextObject]))
1534 if (![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
1537 window = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
1538 toplevels = g_list_prepend (toplevels, window);
1541 GDK_QUARTZ_RELEASE_POOL;
1543 root_impl->sorted_children = g_list_reverse (toplevels);
1547 clear_toplevel_order (void)
1549 GdkWindowObject *root;
1550 GdkWindowImplQuartz *root_impl;
1552 root = GDK_WINDOW_OBJECT (_gdk_root);
1553 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1555 g_list_free (root_impl->sorted_children);
1556 root_impl->sorted_children = NULL;
1560 gdk_window_quartz_raise (GdkWindow *window)
1562 if (GDK_WINDOW_DESTROYED (window))
1565 if (WINDOW_IS_TOPLEVEL (window))
1567 GdkWindowImplQuartz *impl;
1569 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1570 [impl->toplevel orderFront:impl->toplevel];
1572 clear_toplevel_order ();
1576 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1580 GdkWindowImplQuartz *impl;
1582 impl = (GdkWindowImplQuartz *)parent->impl;
1584 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1585 impl->sorted_children = g_list_prepend (impl->sorted_children, window);
1591 gdk_window_quartz_lower (GdkWindow *window)
1593 if (GDK_WINDOW_DESTROYED (window))
1596 if (WINDOW_IS_TOPLEVEL (window))
1598 GdkWindowImplQuartz *impl;
1600 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1601 [impl->toplevel orderBack:impl->toplevel];
1603 clear_toplevel_order ();
1607 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1611 GdkWindowImplQuartz *impl;
1613 impl = (GdkWindowImplQuartz *)parent->impl;
1615 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1616 impl->sorted_children = g_list_append (impl->sorted_children, window);
1622 gdk_window_quartz_restack_toplevel (GdkWindow *window,
1626 /* FIXME: Implement this */
1630 gdk_window_quartz_set_background (GdkWindow *window,
1631 const GdkColor *color)
1633 /* FIXME: We could theoretically set the background color for toplevels
1634 * here. (Currently we draw the background before emitting expose events)
1639 gdk_window_quartz_set_back_pixmap (GdkWindow *window,
1642 /* FIXME: Could theoretically set some background image here. (Currently
1643 * the back pixmap is drawn before emitting expose events.
1648 gdk_window_quartz_set_cursor (GdkWindow *window,
1651 GdkCursorPrivate *cursor_private;
1654 cursor_private = (GdkCursorPrivate *)cursor;
1656 if (GDK_WINDOW_DESTROYED (window))
1660 nscursor = [NSCursor arrowCursor];
1662 nscursor = cursor_private->nscursor;
1668 gdk_window_quartz_get_geometry (GdkWindow *window,
1675 GdkWindowImplQuartz *impl;
1676 GdkWindowObject *private;
1679 if (GDK_WINDOW_DESTROYED (window))
1682 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1683 private = GDK_WINDOW_OBJECT (window);
1684 if (window == _gdk_root)
1692 *width = private->width;
1694 *height = private->height;
1696 else if (WINDOW_IS_TOPLEVEL (window))
1698 ns_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1700 /* This doesn't work exactly as in X. There doesn't seem to be a
1701 * way to get the coords relative to the parent window (usually
1702 * the window frame), but that seems useless except for
1703 * borderless windows where it's relative to the root window. So
1704 * we return (0, 0) (should be something like (0, 22)) for
1705 * windows with borders and the root relative coordinates
1708 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
1711 *x = ns_rect.origin.x;
1713 *y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
1724 *width = ns_rect.size.width;
1726 *height = ns_rect.size.height;
1730 ns_rect = [impl->view frame];
1733 *x = ns_rect.origin.x;
1735 *y = ns_rect.origin.y;
1737 *width = ns_rect.size.width;
1739 *height = ns_rect.size.height;
1743 *depth = gdk_drawable_get_depth (window);
1747 gdk_window_quartz_get_root_coords (GdkWindow *window,
1753 GdkWindowObject *private;
1754 int tmp_x = 0, tmp_y = 0;
1755 GdkWindow *toplevel;
1756 NSRect content_rect;
1757 GdkWindowImplQuartz *impl;
1759 if (GDK_WINDOW_DESTROYED (window))
1769 if (window == _gdk_root)
1779 private = GDK_WINDOW_OBJECT (window);
1781 toplevel = gdk_window_get_toplevel (window);
1782 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1784 content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1786 tmp_x = x + content_rect.origin.x;
1787 tmp_y = y + _gdk_quartz_window_get_inverted_screen_y (content_rect.origin.y + content_rect.size.height);
1789 while (private != GDK_WINDOW_OBJECT (toplevel))
1791 if (_gdk_window_has_impl ((GdkWindow *)private))
1793 tmp_x += private->x;
1794 tmp_y += private->y;
1797 private = private->parent;
1809 gdk_window_quartz_get_deskrelative_origin (GdkWindow *window,
1813 return gdk_window_get_origin (window, x, y);
1817 gdk_window_get_root_origin (GdkWindow *window,
1826 gdk_window_get_frame_extents (window, &rect);
1835 /* Returns coordinates relative to the passed in window. */
1837 gdk_window_quartz_get_pointer_helper (GdkWindow *window,
1840 GdkModifierType *mask)
1842 GdkWindowObject *toplevel;
1843 GdkWindowObject *private;
1846 GdkWindow *found_window;
1848 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1850 if (GDK_WINDOW_DESTROYED (window))
1858 toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
1860 *mask = _gdk_quartz_events_get_current_event_mask ();
1862 /* Get the y coordinate, needs to be flipped. */
1863 if (window == _gdk_root)
1865 point = [NSEvent mouseLocation];
1867 y_tmp = _gdk_quartz_window_get_inverted_screen_y (point.y);
1871 GdkWindowImplQuartz *impl;
1874 impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
1875 private = GDK_WINDOW_OBJECT (toplevel);
1876 nswindow = impl->toplevel;
1878 point = [nswindow mouseLocationOutsideOfEventStream];
1881 y_tmp = private->height - point.y;
1883 window = (GdkWindow *)toplevel;
1886 found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp);
1888 /* We never return the root window. */
1889 if (found_window == _gdk_root)
1890 found_window = NULL;
1895 return found_window;
1899 gdk_window_quartz_get_pointer (GdkWindow *window,
1902 GdkModifierType *mask)
1904 return gdk_window_quartz_get_pointer_helper (window, x, y, mask) != NULL;
1907 /* Returns coordinates relative to the root. */
1909 _gdk_windowing_get_pointer (GdkDisplay *display,
1913 GdkModifierType *mask)
1915 g_return_if_fail (display == _gdk_display);
1917 *screen = _gdk_screen;
1918 gdk_window_quartz_get_pointer_helper (_gdk_root, x, y, mask);
1922 gdk_display_warp_pointer (GdkDisplay *display,
1927 CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
1930 /* Returns coordinates relative to the found window. */
1932 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1935 GdkModifierType *mask)
1937 GdkWindow *found_window;
1939 GdkModifierType tmp_mask = 0;
1941 found_window = gdk_window_quartz_get_pointer_helper (_gdk_root,
1946 GdkWindowObject *private;
1948 /* The coordinates returned above are relative the root, we want
1949 * coordinates relative the window here.
1951 private = GDK_WINDOW_OBJECT (found_window);
1952 while (private != GDK_WINDOW_OBJECT (_gdk_root))
1957 private = private->parent;
1965 /* Mimic the X backend here, -1,-1 for unknown windows. */
1973 return found_window;
1977 gdk_window_quartz_get_events (GdkWindow *window)
1979 if (GDK_WINDOW_DESTROYED (window))
1982 return GDK_WINDOW_OBJECT (window)->event_mask;
1986 gdk_window_quartz_set_events (GdkWindow *window,
1987 GdkEventMask event_mask)
1989 /* The mask is set in the common code. */
1993 gdk_window_set_urgency_hint (GdkWindow *window,
1996 if (GDK_WINDOW_DESTROYED (window) ||
1997 !WINDOW_IS_TOPLEVEL (window))
2000 /* FIXME: Implement */
2004 gdk_window_set_geometry_hints (GdkWindow *window,
2005 const GdkGeometry *geometry,
2006 GdkWindowHints geom_mask)
2008 GdkWindowImplQuartz *impl;
2010 g_return_if_fail (geometry != NULL);
2012 if (GDK_WINDOW_DESTROYED (window) ||
2013 !WINDOW_IS_TOPLEVEL (window))
2016 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2017 if (!impl->toplevel)
2020 if (geom_mask & GDK_HINT_POS)
2022 /* FIXME: Implement */
2025 if (geom_mask & GDK_HINT_USER_POS)
2027 /* FIXME: Implement */
2030 if (geom_mask & GDK_HINT_USER_SIZE)
2032 /* FIXME: Implement */
2035 if (geom_mask & GDK_HINT_MIN_SIZE)
2039 size.width = geometry->min_width;
2040 size.height = geometry->min_height;
2042 [impl->toplevel setContentMinSize:size];
2045 if (geom_mask & GDK_HINT_MAX_SIZE)
2049 size.width = geometry->max_width;
2050 size.height = geometry->max_height;
2052 [impl->toplevel setContentMaxSize:size];
2055 if (geom_mask & GDK_HINT_BASE_SIZE)
2057 /* FIXME: Implement */
2060 if (geom_mask & GDK_HINT_RESIZE_INC)
2064 size.width = geometry->width_inc;
2065 size.height = geometry->height_inc;
2067 [impl->toplevel setContentResizeIncrements:size];
2070 if (geom_mask & GDK_HINT_ASPECT)
2072 /* FIXME: Implement */
2075 if (geom_mask & GDK_HINT_WIN_GRAVITY)
2077 /* FIXME: Implement */
2082 gdk_window_set_title (GdkWindow *window,
2085 GdkWindowImplQuartz *impl;
2087 g_return_if_fail (title != NULL);
2089 if (GDK_WINDOW_DESTROYED (window) ||
2090 !WINDOW_IS_TOPLEVEL (window))
2093 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
2097 GDK_QUARTZ_ALLOC_POOL;
2098 [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
2099 GDK_QUARTZ_RELEASE_POOL;
2104 gdk_window_set_role (GdkWindow *window,
2107 if (GDK_WINDOW_DESTROYED (window) ||
2108 WINDOW_IS_TOPLEVEL (window))
2111 /* FIXME: Implement */
2115 gdk_window_set_transient_for (GdkWindow *window,
2118 GdkWindowImplQuartz *window_impl;
2119 GdkWindowImplQuartz *parent_impl;
2121 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent) ||
2122 !WINDOW_IS_TOPLEVEL (window))
2125 window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2126 if (!window_impl->toplevel)
2129 GDK_QUARTZ_ALLOC_POOL;
2131 if (window_impl->transient_for)
2133 _gdk_quartz_window_detach_from_parent (window);
2135 g_object_unref (window_impl->transient_for);
2136 window_impl->transient_for = NULL;
2139 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
2140 if (parent_impl->toplevel)
2142 /* We save the parent because it needs to be unset/reset when
2143 * hiding and showing the window.
2146 /* We don't set transients for tooltips, they are already
2147 * handled by the window level being the top one. If we do, then
2148 * the parent window will be brought to the top just because the
2149 * tooltip is, which is not what we want.
2151 if (gdk_window_get_type_hint (window) != GDK_WINDOW_TYPE_HINT_TOOLTIP)
2153 window_impl->transient_for = g_object_ref (parent);
2155 /* We only add the window if it is shown, otherwise it will
2156 * be shown unconditionally here. If it is not shown, the
2157 * window will be added in show() instead.
2159 if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
2160 _gdk_quartz_window_attach_to_parent (window);
2164 GDK_QUARTZ_RELEASE_POOL;
2168 gdk_window_quartz_shape_combine_region (GdkWindow *window,
2169 const GdkRegion *shape,
2173 /* FIXME: Implement */
2177 gdk_window_quartz_input_shape_combine_region (GdkWindow *window,
2178 const GdkRegion *shape_region,
2182 /* FIXME: Implement */
2186 gdk_window_set_override_redirect (GdkWindow *window,
2187 gboolean override_redirect)
2189 /* FIXME: Implement */
2193 gdk_window_set_accept_focus (GdkWindow *window,
2194 gboolean accept_focus)
2196 GdkWindowObject *private;
2198 private = (GdkWindowObject *)window;
2200 private->accept_focus = accept_focus != FALSE;
2204 gdk_window_quartz_set_static_gravities (GdkWindow *window,
2205 gboolean use_static)
2207 if (GDK_WINDOW_DESTROYED (window) ||
2208 !WINDOW_IS_TOPLEVEL (window))
2211 /* FIXME: Implement */
2216 gdk_window_set_focus_on_map (GdkWindow *window,
2217 gboolean focus_on_map)
2219 GdkWindowObject *private;
2221 private = (GdkWindowObject *)window;
2223 private->focus_on_map = focus_on_map != FALSE;
2227 gdk_window_set_icon (GdkWindow *window,
2228 GdkWindow *icon_window,
2232 /* FIXME: Implement */
2236 gdk_window_set_icon_name (GdkWindow *window,
2239 /* FIXME: Implement */
2243 gdk_window_focus (GdkWindow *window,
2246 GdkWindowObject *private;
2247 GdkWindowImplQuartz *impl;
2249 private = (GdkWindowObject*) window;
2250 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2252 if (GDK_WINDOW_DESTROYED (window) ||
2253 !WINDOW_IS_TOPLEVEL (window))
2256 if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
2258 GDK_QUARTZ_ALLOC_POOL;
2259 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
2260 clear_toplevel_order ();
2261 GDK_QUARTZ_RELEASE_POOL;
2266 gdk_window_set_hints (GdkWindow *window,
2275 /* FIXME: Implement */
2279 gint window_type_hint_to_level (GdkWindowTypeHint hint)
2283 case GDK_WINDOW_TYPE_HINT_DOCK:
2284 case GDK_WINDOW_TYPE_HINT_UTILITY:
2285 return NSFloatingWindowLevel;
2287 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2288 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2289 return NSTornOffMenuWindowLevel;
2291 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2292 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2293 return NSStatusWindowLevel;
2295 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2296 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2297 case GDK_WINDOW_TYPE_HINT_COMBO:
2298 case GDK_WINDOW_TYPE_HINT_DND:
2299 return NSPopUpMenuWindowLevel;
2301 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2302 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2303 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2304 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2311 return NSNormalWindowLevel;
2315 window_type_hint_to_shadow (GdkWindowTypeHint hint)
2319 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2320 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2321 case GDK_WINDOW_TYPE_HINT_DOCK:
2322 case GDK_WINDOW_TYPE_HINT_UTILITY:
2323 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2324 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2325 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2326 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2327 case GDK_WINDOW_TYPE_HINT_COMBO:
2328 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2329 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2332 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2333 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2334 case GDK_WINDOW_TYPE_HINT_DND:
2346 gdk_window_set_type_hint (GdkWindow *window,
2347 GdkWindowTypeHint hint)
2349 GdkWindowImplQuartz *impl;
2351 if (GDK_WINDOW_DESTROYED (window) ||
2352 !WINDOW_IS_TOPLEVEL (window))
2355 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2357 impl->type_hint = hint;
2359 /* Match the documentation, only do something if we're not mapped yet. */
2360 if (GDK_WINDOW_IS_MAPPED (window))
2363 [impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
2364 [impl->toplevel setLevel: window_type_hint_to_level (hint)];
2368 gdk_window_get_type_hint (GdkWindow *window)
2370 if (GDK_WINDOW_DESTROYED (window) ||
2371 !WINDOW_IS_TOPLEVEL (window))
2372 return GDK_WINDOW_TYPE_HINT_NORMAL;
2374 return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
2378 gdk_window_set_modal_hint (GdkWindow *window,
2381 if (GDK_WINDOW_DESTROYED (window) ||
2382 !WINDOW_IS_TOPLEVEL (window))
2385 /* FIXME: Implement */
2389 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2390 gboolean skips_taskbar)
2392 if (GDK_WINDOW_DESTROYED (window) ||
2393 !WINDOW_IS_TOPLEVEL (window))
2396 /* FIXME: Implement */
2400 gdk_window_set_skip_pager_hint (GdkWindow *window,
2401 gboolean skips_pager)
2403 if (GDK_WINDOW_DESTROYED (window) ||
2404 !WINDOW_IS_TOPLEVEL (window))
2407 /* FIXME: Implement */
2411 gdk_window_begin_resize_drag (GdkWindow *window,
2418 GdkWindowObject *private;
2419 GdkWindowImplQuartz *impl;
2421 g_return_if_fail (GDK_IS_WINDOW (window));
2423 if (edge != GDK_WINDOW_EDGE_SOUTH_EAST)
2425 g_warning ("Resizing is only implemented for GDK_WINDOW_EDGE_SOUTH_EAST on Mac OS");
2429 if (GDK_WINDOW_DESTROYED (window))
2432 private = GDK_WINDOW_OBJECT (window);
2433 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2435 if (!impl->toplevel)
2437 g_warning ("Can't call gdk_window_begin_resize_drag on non-toplevel window");
2441 [(GdkQuartzWindow *)impl->toplevel beginManualResize];
2445 gdk_window_begin_move_drag (GdkWindow *window,
2451 GdkWindowObject *private;
2452 GdkWindowImplQuartz *impl;
2454 if (GDK_WINDOW_DESTROYED (window) ||
2455 !WINDOW_IS_TOPLEVEL (window))
2458 private = GDK_WINDOW_OBJECT (window);
2459 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2461 if (!impl->toplevel)
2463 g_warning ("Can't call gdk_window_begin_move_drag on non-toplevel window");
2467 [(GdkQuartzWindow *)impl->toplevel beginManualMove];
2471 gdk_window_set_icon_list (GdkWindow *window,
2474 /* FIXME: Implement */
2478 gdk_window_get_frame_extents (GdkWindow *window,
2481 GdkWindowObject *private;
2482 GdkWindow *toplevel;
2483 GdkWindowImplQuartz *impl;
2486 g_return_if_fail (rect != NULL);
2488 private = GDK_WINDOW_OBJECT (window);
2495 toplevel = gdk_window_get_toplevel (window);
2496 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
2498 ns_rect = [impl->toplevel frame];
2500 rect->x = ns_rect.origin.x;
2501 rect->y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
2502 rect->width = ns_rect.size.width;
2503 rect->height = ns_rect.size.height;
2507 gdk_window_set_decorations (GdkWindow *window,
2508 GdkWMDecoration decorations)
2510 GdkWindowImplQuartz *impl;
2511 int old_mask, new_mask;
2514 if (GDK_WINDOW_DESTROYED (window) ||
2515 !WINDOW_IS_TOPLEVEL (window))
2518 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2520 if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP ||
2521 impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN )
2523 new_mask = NSBorderlessWindowMask;
2527 /* FIXME: Honor other GDK_DECOR_* flags. */
2528 new_mask = (NSTitledWindowMask | NSClosableWindowMask |
2529 NSMiniaturizableWindowMask | NSResizableWindowMask);
2532 GDK_QUARTZ_ALLOC_POOL;
2534 old_mask = [impl->toplevel styleMask];
2536 /* Note, there doesn't seem to be a way to change this without
2537 * recreating the toplevel. There might be bad side-effects of doing
2538 * that, but it seems alright.
2540 if (old_mask != new_mask)
2544 old_view = [impl->toplevel contentView];
2546 rect = [impl->toplevel frame];
2548 /* Properly update the size of the window when the titlebar is
2551 if (old_mask == NSBorderlessWindowMask &&
2552 new_mask != NSBorderlessWindowMask)
2554 rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
2557 else if (old_mask != NSBorderlessWindowMask &&
2558 new_mask == NSBorderlessWindowMask)
2560 rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask];
2563 impl->toplevel = [impl->toplevel initWithContentRect:rect
2565 backing:NSBackingStoreBuffered
2568 [impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)];
2569 [impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)];
2571 [impl->toplevel setContentView:old_view];
2572 [impl->toplevel setFrame:rect display:YES];
2574 /* Invalidate the window shadow for non-opaque views that have shadow
2575 * enabled, to get the shadow shape updated.
2577 if (![old_view isOpaque] && [impl->toplevel hasShadow])
2578 [(GdkQuartzView*)old_view setNeedsInvalidateShadow:YES];
2581 GDK_QUARTZ_RELEASE_POOL;
2585 gdk_window_get_decorations (GdkWindow *window,
2586 GdkWMDecoration *decorations)
2588 GdkWindowImplQuartz *impl;
2590 if (GDK_WINDOW_DESTROYED (window) ||
2591 !WINDOW_IS_TOPLEVEL (window))
2594 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2598 /* Borderless is 0, so we can't check it as a bit being set. */
2599 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
2605 /* FIXME: Honor the other GDK_DECOR_* flags. */
2606 *decorations = GDK_DECOR_ALL;
2614 gdk_window_set_functions (GdkWindow *window,
2615 GdkWMFunction functions)
2617 g_return_if_fail (GDK_IS_WINDOW (window));
2619 /* FIXME: Implement */
2623 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
2630 gdk_window_stick (GdkWindow *window)
2632 if (GDK_WINDOW_DESTROYED (window) ||
2633 !WINDOW_IS_TOPLEVEL (window))
2638 gdk_window_unstick (GdkWindow *window)
2640 if (GDK_WINDOW_DESTROYED (window) ||
2641 !WINDOW_IS_TOPLEVEL (window))
2646 gdk_window_maximize (GdkWindow *window)
2648 GdkWindowImplQuartz *impl;
2650 if (GDK_WINDOW_DESTROYED (window) ||
2651 !WINDOW_IS_TOPLEVEL (window))
2654 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2656 if (GDK_WINDOW_IS_MAPPED (window))
2658 GDK_QUARTZ_ALLOC_POOL;
2660 if (impl->toplevel && ![impl->toplevel isZoomed])
2661 [impl->toplevel zoom:nil];
2663 GDK_QUARTZ_RELEASE_POOL;
2667 gdk_synthesize_window_state (window,
2669 GDK_WINDOW_STATE_MAXIMIZED);
2674 gdk_window_unmaximize (GdkWindow *window)
2676 GdkWindowImplQuartz *impl;
2678 if (GDK_WINDOW_DESTROYED (window) ||
2679 !WINDOW_IS_TOPLEVEL (window))
2682 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2684 if (GDK_WINDOW_IS_MAPPED (window))
2686 GDK_QUARTZ_ALLOC_POOL;
2688 if (impl->toplevel && [impl->toplevel isZoomed])
2689 [impl->toplevel zoom:nil];
2691 GDK_QUARTZ_RELEASE_POOL;
2695 gdk_synthesize_window_state (window,
2696 GDK_WINDOW_STATE_MAXIMIZED,
2702 gdk_window_iconify (GdkWindow *window)
2704 GdkWindowImplQuartz *impl;
2706 if (GDK_WINDOW_DESTROYED (window) ||
2707 !WINDOW_IS_TOPLEVEL (window))
2710 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2712 if (GDK_WINDOW_IS_MAPPED (window))
2714 GDK_QUARTZ_ALLOC_POOL;
2717 [impl->toplevel miniaturize:nil];
2719 GDK_QUARTZ_RELEASE_POOL;
2723 gdk_synthesize_window_state (window,
2725 GDK_WINDOW_STATE_ICONIFIED);
2730 gdk_window_deiconify (GdkWindow *window)
2732 GdkWindowImplQuartz *impl;
2734 if (GDK_WINDOW_DESTROYED (window) ||
2735 !WINDOW_IS_TOPLEVEL (window))
2738 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2740 if (GDK_WINDOW_IS_MAPPED (window))
2742 GDK_QUARTZ_ALLOC_POOL;
2745 [impl->toplevel deminiaturize:nil];
2747 GDK_QUARTZ_RELEASE_POOL;
2751 gdk_synthesize_window_state (window,
2752 GDK_WINDOW_STATE_ICONIFIED,
2757 static FullscreenSavedGeometry *
2758 get_fullscreen_geometry (GdkWindow *window)
2760 return g_object_get_data (G_OBJECT (window), FULLSCREEN_DATA);
2764 gdk_window_fullscreen (GdkWindow *window)
2766 FullscreenSavedGeometry *geometry;
2767 GdkWindowObject *private = (GdkWindowObject *) window;
2770 if (GDK_WINDOW_DESTROYED (window) ||
2771 !WINDOW_IS_TOPLEVEL (window))
2774 geometry = get_fullscreen_geometry (window);
2777 geometry = g_new (FullscreenSavedGeometry, 1);
2779 geometry->x = private->x;
2780 geometry->y = private->y;
2781 geometry->width = private->width;
2782 geometry->height = private->height;
2784 if (!gdk_window_get_decorations (window, &geometry->decor))
2785 geometry->decor = GDK_DECOR_ALL;
2787 g_object_set_data_full (G_OBJECT (window),
2788 FULLSCREEN_DATA, geometry,
2791 gdk_window_set_decorations (window, 0);
2793 frame = [[NSScreen mainScreen] frame];
2794 move_resize_window_internal (window,
2796 frame.size.width, frame.size.height);
2799 SetSystemUIMode (kUIModeAllHidden, kUIOptionAutoShowMenuBar);
2801 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
2805 gdk_window_unfullscreen (GdkWindow *window)
2807 FullscreenSavedGeometry *geometry;
2809 if (GDK_WINDOW_DESTROYED (window) ||
2810 !WINDOW_IS_TOPLEVEL (window))
2813 geometry = get_fullscreen_geometry (window);
2816 SetSystemUIMode (kUIModeNormal, 0);
2818 move_resize_window_internal (window,
2824 gdk_window_set_decorations (window, geometry->decor);
2826 g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL);
2828 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
2833 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2835 GdkWindowObject *private = (GdkWindowObject *) window;
2836 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2839 g_return_if_fail (GDK_IS_WINDOW (window));
2841 if (GDK_WINDOW_DESTROYED (window) ||
2842 !WINDOW_IS_TOPLEVEL (window))
2845 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2847 /* Adjust normal window level by one if necessary. */
2848 [impl->toplevel setLevel: level + (setting ? 1 : 0)];
2852 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2854 GdkWindowObject *private = (GdkWindowObject *) window;
2855 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2858 g_return_if_fail (GDK_IS_WINDOW (window));
2860 if (GDK_WINDOW_DESTROYED (window) ||
2861 !WINDOW_IS_TOPLEVEL (window))
2864 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2866 /* Adjust normal window level by one if necessary. */
2867 [impl->toplevel setLevel: level - (setting ? 1 : 0)];
2871 gdk_window_get_group (GdkWindow *window)
2873 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2875 if (GDK_WINDOW_DESTROYED (window) ||
2876 !WINDOW_IS_TOPLEVEL (window))
2879 /* FIXME: Implement */
2885 gdk_window_set_group (GdkWindow *window,
2888 /* FIXME: Implement */
2892 gdk_window_foreign_new_for_display (GdkDisplay *display,
2893 GdkNativeWindow anid)
2895 /* Foreign windows aren't supported in Mac OS X */
2900 gdk_window_lookup (GdkNativeWindow anid)
2902 /* Foreign windows aren't supported in Mac OS X */
2907 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2909 /* Foreign windows aren't supported in Mac OS X */
2914 gdk_window_enable_synchronized_configure (GdkWindow *window)
2919 gdk_window_configure_finished (GdkWindow *window)
2924 gdk_window_destroy_notify (GdkWindow *window)
2926 check_grab_destroy (window);
2930 _gdk_windowing_window_beep (GdkWindow *window)
2932 g_return_if_fail (GDK_IS_WINDOW (window));
2934 gdk_display_beep (_gdk_display);
2938 gdk_window_set_opacity (GdkWindow *window,
2941 GdkWindowObject *private = (GdkWindowObject *) window;
2942 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2944 g_return_if_fail (GDK_IS_WINDOW (window));
2945 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2947 if (GDK_WINDOW_DESTROYED (window) ||
2948 !WINDOW_IS_TOPLEVEL (window))
2953 else if (opacity > 1)
2956 [impl->toplevel setAlphaValue: opacity];
2960 _gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)
2965 _gdk_windowing_get_shape_for_mask (GdkBitmap *mask)
2967 /* FIXME: implement */
2972 _gdk_windowing_window_get_shape (GdkWindow *window)
2974 /* FIXME: implement */
2979 _gdk_windowing_window_get_input_shape (GdkWindow *window)
2981 /* FIXME: implement */
2986 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
2988 iface->show = gdk_window_quartz_show;
2989 iface->hide = gdk_window_quartz_hide;
2990 iface->withdraw = gdk_window_quartz_withdraw;
2991 iface->set_events = gdk_window_quartz_set_events;
2992 iface->get_events = gdk_window_quartz_get_events;
2993 iface->raise = gdk_window_quartz_raise;
2994 iface->lower = gdk_window_quartz_lower;
2995 iface->restack_toplevel = gdk_window_quartz_restack_toplevel;
2996 iface->move_resize = gdk_window_quartz_move_resize;
2997 iface->set_background = gdk_window_quartz_set_background;
2998 iface->set_back_pixmap = gdk_window_quartz_set_back_pixmap;
2999 iface->reparent = gdk_window_quartz_reparent;
3000 iface->set_cursor = gdk_window_quartz_set_cursor;
3001 iface->get_geometry = gdk_window_quartz_get_geometry;
3002 iface->get_root_coords = gdk_window_quartz_get_root_coords;
3003 iface->get_pointer = gdk_window_quartz_get_pointer;
3004 iface->get_deskrelative_origin = gdk_window_quartz_get_deskrelative_origin;
3005 iface->shape_combine_region = gdk_window_quartz_shape_combine_region;
3006 iface->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
3007 iface->set_static_gravities = gdk_window_quartz_set_static_gravities;
3008 iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
3009 iface->queue_translation = _gdk_quartz_window_queue_translation;
3010 iface->destroy = _gdk_quartz_window_destroy;