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"
28 #include "gdkinputprivate.h"
30 static gpointer parent_class;
32 static GSList *update_nswindows;
33 static gboolean in_process_all_updates = FALSE;
35 static GSList *main_window_stack;
37 #define FULLSCREEN_DATA "fullscreen-data"
43 GdkWMDecoration decor;
44 } FullscreenSavedGeometry;
47 static void update_toplevel_order (void);
48 static void clear_toplevel_order (void);
50 static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window);
52 #define WINDOW_IS_TOPLEVEL(window) \
53 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
54 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
55 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
57 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
60 gdk_quartz_window_get_nsview (GdkWindow *window)
62 GdkWindowObject *private = (GdkWindowObject *)window;
64 if (GDK_WINDOW_DESTROYED (window))
67 return ((GdkWindowImplQuartz *)private->impl)->view;
71 gdk_quartz_window_get_nswindow (GdkWindow *window)
73 GdkWindowObject *private = (GdkWindowObject *)window;
75 if (GDK_WINDOW_DESTROYED (window))
78 return ((GdkWindowImplQuartz *)private->impl)->toplevel;
82 gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
85 GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
86 GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
87 CGContextRef cg_context;
89 if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
92 /* Lock focus when not called as part of a drawRect call. This
93 * is needed when called from outside "real" expose events, for
94 * example for synthesized expose events when realizing windows
95 * and for widgets that send fake expose events like the arrow
96 * buttons in spinbuttons or the position marker in rulers.
98 if (window_impl->in_paint_rect_count == 0)
100 if (![window_impl->view lockFocusIfCanDraw])
104 cg_context = [[NSGraphicsContext currentContext] graphicsPort];
105 CGContextSaveGState (cg_context);
106 CGContextSetAllowsAntialiasing (cg_context, antialias);
108 /* We'll emulate the clipping caused by double buffering here */
109 if (window_impl->begin_paint_count != 0)
116 gdk_region_get_rectangles (window_impl->paint_clip_region,
122 cg_rects = g_new (CGRect, n_rects);
124 for (i = 0; i < n_rects; i++)
126 cg_rects[i].origin.x = rects[i].x;
127 cg_rects[i].origin.y = rects[i].y;
128 cg_rects[i].size.width = rects[i].width;
129 cg_rects[i].size.height = rects[i].height;
132 CGContextClipToRects (cg_context, cg_rects, n_rects);
135 if (cg_rects != &rect)
143 check_grab_unmap (GdkWindow *window)
145 GdkDisplay *display = gdk_drawable_get_display (window);
147 _gdk_display_end_pointer_grab (display, 0, window, TRUE);
149 if (display->keyboard_grab.window)
151 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
152 GdkWindowObject *tmp = GDK_WINDOW_OBJECT (display->keyboard_grab.window);
154 while (tmp && tmp != private)
158 _gdk_display_unset_has_keyboard_grab (display, TRUE);
163 check_grab_destroy (GdkWindow *window)
165 GdkDisplay *display = gdk_drawable_get_display (window);
166 GdkPointerGrabInfo *grab;
168 /* Make sure there is no lasting grab in this native window */
169 grab = _gdk_display_get_last_pointer_grab (display);
170 if (grab && grab->native_window == window)
172 /* Serials are always 0 in quartz, but for clarity: */
173 grab->serial_end = grab->serial_start;
174 grab->implicit_ungrab = TRUE;
177 if (window == display->keyboard_grab.native_window &&
178 display->keyboard_grab.window != NULL)
179 _gdk_display_unset_has_keyboard_grab (display, TRUE);
183 gdk_window_impl_quartz_finalize (GObject *object)
185 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
187 check_grab_destroy (GDK_DRAWABLE_IMPL_QUARTZ (object)->wrapper);
189 if (impl->paint_clip_region)
190 gdk_region_destroy (impl->paint_clip_region);
192 if (impl->transient_for)
193 g_object_unref (impl->transient_for);
195 G_OBJECT_CLASS (parent_class)->finalize (object);
199 gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
201 GObjectClass *object_class = G_OBJECT_CLASS (klass);
202 GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
204 parent_class = g_type_class_peek_parent (klass);
206 object_class->finalize = gdk_window_impl_quartz_finalize;
208 drawable_quartz_class->get_context = gdk_window_impl_quartz_get_context;
212 gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
214 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
218 gdk_window_impl_quartz_begin_paint_region (GdkPaintable *paintable,
220 const GdkRegion *region)
222 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
223 GdkWindowObject *private = (GdkWindowObject*)window;
225 GdkRectangle *rects = NULL;
226 GdkPixmap *bg_pixmap;
227 GdkRegion *clipped_and_offset_region;
228 gboolean free_clipped_and_offset_region = TRUE;
230 bg_pixmap = private->bg_pixmap;
232 clipped_and_offset_region = gdk_region_copy (region);
234 gdk_region_intersect (clipped_and_offset_region,
235 private->clip_region_with_children);
236 gdk_region_offset (clipped_and_offset_region,
237 private->abs_x, private->abs_y);
239 if (impl->begin_paint_count == 0)
241 impl->paint_clip_region = clipped_and_offset_region;
242 free_clipped_and_offset_region = FALSE;
245 gdk_region_union (impl->paint_clip_region, clipped_and_offset_region);
247 impl->begin_paint_count++;
249 if (bg_pixmap == GDK_NO_BG)
252 gdk_region_get_rectangles (clipped_and_offset_region, &rects, &n_rects);
254 if (bg_pixmap == NULL)
256 CGContextRef cg_context;
260 cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
261 _gdk_quartz_colormap_get_rgba_from_pixel (gdk_drawable_get_colormap (window),
262 private->bg_color.pixel,
264 CGContextSetRGBFillColor (cg_context, r, g, b, a);
266 for (i = 0; i < n_rects; i++)
268 CGContextFillRect (cg_context,
269 CGRectMake (rects[i].x, rects[i].y,
270 rects[i].width, rects[i].height));
273 gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), cg_context);
278 int x_offset, y_offset;
282 x_offset = y_offset = 0;
284 while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
286 /* If this window should have the same background as the parent,
287 * fetch the parent. (And if the same goes for the parent, fetch
288 * the grandparent, etc.)
290 x_offset += ((GdkWindowObject *) window)->x;
291 y_offset += ((GdkWindowObject *) window)->y;
292 window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
293 bg_pixmap = ((GdkWindowObject *) window)->bg_pixmap;
296 if (bg_pixmap == NULL || bg_pixmap == GDK_NO_BG || bg_pixmap == GDK_PARENT_RELATIVE_BG)
298 /* Parent relative background but the parent doesn't have a
304 /* Note: There should be a CG API to draw tiled images, we might
305 * want to look into that for this.
307 gc = gdk_gc_new (GDK_DRAWABLE (impl));
309 gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
312 while (x < (rects[0].x + rects[0].width))
314 if (x + width >= rects[0].x)
317 while (y < (rects[0].y + rects[0].height))
319 if (y + height >= rects[0].y)
320 gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
332 if (free_clipped_and_offset_region)
333 gdk_region_destroy (clipped_and_offset_region);
338 gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
340 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
342 impl->begin_paint_count--;
344 if (impl->begin_paint_count == 0)
346 gdk_region_destroy (impl->paint_clip_region);
347 impl->paint_clip_region = NULL;
352 _gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
355 GdkWindowObject *private;
356 GdkWindowImplQuartz *impl;
358 private = GDK_WINDOW_OBJECT (window);
359 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
361 if (!impl->needs_display_region)
362 impl->needs_display_region = gdk_region_new ();
364 gdk_region_union_with_rect (impl->needs_display_region, rect);
366 [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
367 rect->width, rect->height)];
372 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
378 /* Make sure to only flush each toplevel at most once if we're called
379 * from process_all_updates.
381 if (in_process_all_updates)
385 toplevel = gdk_window_get_toplevel (window);
388 GdkWindowObject *toplevel_private;
389 GdkWindowImplQuartz *toplevel_impl;
392 toplevel_private = (GdkWindowObject *)toplevel;
393 toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
394 nswindow = toplevel_impl->toplevel;
396 /* In theory, we could skip the flush disabling, since we only
399 if (nswindow && ![nswindow isFlushWindowDisabled])
402 [nswindow disableFlushWindow];
403 update_nswindows = g_slist_prepend (update_nswindows, nswindow);
408 gdk_region_get_rectangles (region, &rects, &n_rects);
410 for (i = 0; i < n_rects; i++)
411 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
415 /* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
416 * lot (since it triggers the beam syncing) and things seem to work
422 _gdk_windowing_before_process_all_updates (void)
424 in_process_all_updates = TRUE;
426 NSDisableScreenUpdates ();
430 _gdk_windowing_after_process_all_updates (void)
432 GSList *old_update_nswindows = update_nswindows;
433 GSList *tmp_list = update_nswindows;
435 update_nswindows = NULL;
439 NSWindow *nswindow = tmp_list->data;
441 [[nswindow contentView] displayIfNeeded];
443 _gdk_quartz_drawable_flush (NULL);
445 [nswindow enableFlushWindow];
446 [nswindow flushWindow];
449 tmp_list = tmp_list->next;
452 g_slist_free (old_update_nswindows);
454 in_process_all_updates = FALSE;
456 NSEnableScreenUpdates ();
460 gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
462 iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
463 iface->end_paint = gdk_window_impl_quartz_end_paint;
467 _gdk_window_impl_quartz_get_type (void)
469 static GType object_type = 0;
473 const GTypeInfo object_info =
475 sizeof (GdkWindowImplQuartzClass),
476 (GBaseInitFunc) NULL,
477 (GBaseFinalizeFunc) NULL,
478 (GClassInitFunc) gdk_window_impl_quartz_class_init,
479 NULL, /* class_finalize */
480 NULL, /* class_data */
481 sizeof (GdkWindowImplQuartz),
483 (GInstanceInitFunc) gdk_window_impl_quartz_init,
486 const GInterfaceInfo paintable_info =
488 (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
493 const GInterfaceInfo window_impl_info =
495 (GInterfaceInitFunc) gdk_window_impl_iface_init,
500 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
501 "GdkWindowImplQuartz",
503 g_type_add_interface_static (object_type,
506 g_type_add_interface_static (object_type,
507 GDK_TYPE_WINDOW_IMPL,
515 _gdk_window_impl_get_type (void)
517 return _gdk_window_impl_quartz_get_type ();
521 get_default_title (void)
525 title = g_get_application_name ();
527 title = g_get_prgname ();
533 get_ancestor_coordinates_from_child (GdkWindow *child_window,
536 GdkWindow *ancestor_window,
540 GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
541 GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
543 while (child_private != ancestor_private)
545 child_x += child_private->x;
546 child_y += child_private->y;
548 child_private = child_private->parent;
551 *ancestor_x = child_x;
552 *ancestor_y = child_y;
556 _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
558 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
562 static NSWindow *debug_window[10];
563 static NSRect old_rect[10];
567 g_return_if_fail (number >= 0 && number <= 9);
569 if (window == _gdk_root)
574 if (debug_window[number])
575 [debug_window[number] close];
576 debug_window[number] = NULL;
581 toplevel = gdk_window_get_toplevel (window);
582 get_ancestor_coordinates_from_child (window, 0, 0, toplevel, &x, &y);
584 gdk_window_get_origin (toplevel, &tx, &ty);
588 rect = NSMakeRect (x,
589 _gdk_quartz_window_get_inverted_screen_y (y + private->height),
590 private->width, private->height);
592 if (debug_window[number] && NSEqualRects (rect, old_rect[number]))
595 old_rect[number] = rect;
597 if (debug_window[number])
598 [debug_window[number] close];
600 debug_window[number] = [[NSWindow alloc] initWithContentRect:rect
601 styleMask:NSBorderlessWindowMask
602 backing:NSBackingStoreBuffered
608 color = [NSColor redColor];
611 color = [NSColor blueColor];
614 color = [NSColor greenColor];
617 color = [NSColor yellowColor];
620 color = [NSColor brownColor];
623 color = [NSColor purpleColor];
626 color = [NSColor blackColor];
630 [debug_window[number] setBackgroundColor:color];
631 [debug_window[number] setAlphaValue:0.4];
632 [debug_window[number] setOpaque:NO];
633 [debug_window[number] setReleasedWhenClosed:YES];
634 [debug_window[number] setIgnoresMouseEvents:YES];
635 [debug_window[number] setLevel:NSFloatingWindowLevel];
637 [debug_window[number] orderFront:nil];
641 _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
644 if (ancestor == NULL || window == NULL)
647 return (gdk_window_get_parent (window) == ancestor ||
648 _gdk_quartz_window_is_ancestor (ancestor,
649 gdk_window_get_parent (window)));
652 /* FIXME: It would be nice to have one function that takes an NSPoint
653 * and flips the coords for any window.
656 _gdk_quartz_window_get_inverted_screen_y (gint y)
659 GdkRectangle gdk_rect;
660 NSScreen *main_screen = [NSScreen mainScreen];
661 NSRect rect = [main_screen frame];
663 index = [[NSScreen screens] indexOfObject:main_screen];
665 gdk_screen_get_monitor_geometry (_gdk_screen, index, &gdk_rect);
667 return gdk_rect.height - y + rect.origin.y + gdk_rect.y;
671 find_child_window_helper (GdkWindow *window,
677 GdkWindowImplQuartz *impl;
680 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
682 if (window == _gdk_root)
683 update_toplevel_order ();
685 for (l = impl->sorted_children; l; l = l->next)
687 GdkWindowObject *child_private = l->data;
688 GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
691 if (!GDK_WINDOW_IS_MAPPED (child_private))
694 temp_x = x_offset + child_private->x;
695 temp_y = y_offset + child_private->y;
697 /* Special-case the root window. We have to include the title
698 * bar in the checks, otherwise the window below the title bar
699 * will be found i.e. events punch through. (If we can find a
700 * better way to deal with the events in gdkevents-quartz, this
701 * might not be needed.)
703 if (window == _gdk_root)
705 NSRect frame = NSMakeRect (0, 0, 100, 100);
710 mask = [child_impl->toplevel styleMask];
712 /* Get the title bar height. */
713 content = [NSWindow contentRectForFrameRect:frame
715 titlebar_height = frame.size.height - content.size.height;
717 if (titlebar_height > 0 &&
718 x >= temp_x && y >= temp_y - titlebar_height &&
719 x < temp_x + child_private->width && y < temp_y)
721 /* The root means "unknown" i.e. a window not managed by
724 return (GdkWindow *)_gdk_root;
728 if (x >= temp_x && y >= temp_y &&
729 x < temp_x + child_private->width && y < temp_y + child_private->height)
731 /* Look for child windows. */
732 return find_child_window_helper (l->data,
741 /* Given a GdkWindow and coordinates relative to it, returns the
742 * innermost subwindow that contains the point. If the coordinates are
743 * outside the passed in window, NULL is returned.
746 _gdk_quartz_window_find_child (GdkWindow *window,
750 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
752 if (x >= 0 && y >= 0 && x < private->width && y < private->height)
753 return find_child_window_helper (window, x, y, 0, 0);
760 generate_motion_event (GdkWindow *window)
763 NSPoint screen_point;
766 GdkWindowObject *private;
768 gint x, y, x_root, y_root;
771 GdkWindow *pointer_window;
773 event = gdk_event_new (GDK_MOTION_NOTIFY);
774 event->any.window = NULL;
775 event->any.send_event = TRUE;
777 private = (GdkWindowObject *)window;
778 nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
779 view = (GdkQuartzView *)[nswindow contentView];
781 screen_point = [NSEvent mouseLocation];
783 x_root = screen_point.x;
784 y_root = _gdk_quartz_window_get_inverted_screen_y (screen_point.y);
786 point = [nswindow convertScreenToBase:screen_point];
789 y = private->height - point.y;
791 pointer_window = _gdk_window_find_descendant_at (window, x, y,
794 event->any.type = GDK_MOTION_NOTIFY;
795 event->motion.window = window;
796 event->motion.time = GDK_CURRENT_TIME;
799 event->motion.x_root = x_root;
800 event->motion.y_root = y_root;
801 /* FIXME event->axes */
802 event->motion.state = 0;
803 event->motion.is_hint = FALSE;
804 event->motion.device = _gdk_display->core_pointer;
806 if (event->any.window)
807 g_object_ref (event->any.window);
809 node = _gdk_event_queue_append (gdk_display_get_default (), event);
810 _gdk_windowing_got_event (gdk_display_get_default (), node, event, 0);
814 _gdk_quartz_window_did_become_main (GdkWindow *window)
816 main_window_stack = g_slist_remove (main_window_stack, window);
818 if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
820 main_window_stack = g_slist_prepend (main_window_stack, window);
822 /* We just became the active window, send a motion-notify
823 * event so things like highlights get set up correctly.
824 * This motion-notify is sent to the key window.
826 generate_motion_event (window);
829 clear_toplevel_order ();
833 _gdk_quartz_window_did_resign_main (GdkWindow *window)
835 GdkWindow *new_window = NULL;
837 if (main_window_stack)
838 new_window = main_window_stack->data;
843 toplevels = gdk_window_get_toplevels ();
845 new_window = toplevels->data;
846 g_list_free (toplevels);
850 new_window != window &&
851 GDK_WINDOW_IS_MAPPED (new_window) &&
852 GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
854 GdkWindowObject *private = (GdkWindowObject *) new_window;
855 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
857 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
860 clear_toplevel_order ();
864 _gdk_window_impl_new (GdkWindow *window,
865 GdkWindow *real_parent,
868 GdkEventMask event_mask,
869 GdkWindowAttr *attributes,
870 gint attributes_mask)
872 GdkWindowObject *private;
873 GdkWindowImplQuartz *impl;
874 GdkDrawableImplQuartz *draw_impl;
875 GdkWindowImplQuartz *parent_impl;
877 GDK_QUARTZ_ALLOC_POOL;
879 private = (GdkWindowObject *)window;
881 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
882 private->impl = (GdkDrawable *)impl;
883 draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
884 draw_impl->wrapper = GDK_DRAWABLE (window);
886 parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
888 switch (private->window_type)
890 case GDK_WINDOW_TOPLEVEL:
891 case GDK_WINDOW_DIALOG:
892 case GDK_WINDOW_TEMP:
893 if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
895 /* The common code warns for this case */
896 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
900 if (!private->input_only)
902 if (attributes_mask & GDK_WA_COLORMAP)
904 draw_impl->colormap = attributes->colormap;
905 g_object_ref (attributes->colormap);
909 if (visual == gdk_screen_get_system_visual (_gdk_screen))
911 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
912 g_object_ref (draw_impl->colormap);
914 else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
916 draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
917 g_object_ref (draw_impl->colormap);
921 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
927 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
928 g_object_ref (draw_impl->colormap);
931 /* Maintain the z-ordered list of children. */
932 if (private->parent != (GdkWindowObject *)_gdk_root)
933 parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
935 clear_toplevel_order ();
937 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
938 (attributes->cursor) :
941 switch (attributes->window_type)
943 case GDK_WINDOW_TOPLEVEL:
944 case GDK_WINDOW_DIALOG:
945 case GDK_WINDOW_TEMP:
951 content_rect = NSMakeRect (private->x,
952 _gdk_quartz_window_get_inverted_screen_y (private->y) - private->height,
956 if (attributes->window_type == GDK_WINDOW_TEMP ||
957 attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
959 style_mask = NSBorderlessWindowMask;
963 style_mask = (NSTitledWindowMask |
964 NSClosableWindowMask |
965 NSMiniaturizableWindowMask |
966 NSResizableWindowMask);
969 impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
971 backing:NSBackingStoreBuffered
974 if (attributes_mask & GDK_WA_TITLE)
975 title = attributes->title;
977 title = get_default_title ();
979 gdk_window_set_title (window, title);
981 if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
983 [impl->toplevel setOpaque:NO];
984 [impl->toplevel setBackgroundColor:[NSColor clearColor]];
987 content_rect.origin.x = 0;
988 content_rect.origin.y = 0;
990 impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
991 [impl->view setGdkWindow:window];
992 [impl->toplevel setContentView:impl->view];
996 case GDK_WINDOW_CHILD:
998 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (private->parent)->impl);
1000 if (!private->input_only)
1002 NSRect frame_rect = NSMakeRect (private->x + private->parent->abs_x,
1003 private->y + private->parent->abs_y,
1007 impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
1009 [impl->view setGdkWindow:window];
1011 /* GdkWindows should be hidden by default */
1012 [impl->view setHidden:YES];
1013 [parent_impl->view addSubview:impl->view];
1019 g_assert_not_reached ();
1022 GDK_QUARTZ_RELEASE_POOL;
1024 if (attributes_mask & GDK_WA_TYPE_HINT)
1025 gdk_window_set_type_hint (window, attributes->type_hint);
1029 _gdk_windowing_window_init (void)
1031 GdkWindowObject *private;
1032 GdkWindowImplQuartz *impl;
1033 GdkDrawableImplQuartz *drawable_impl;
1035 g_assert (_gdk_root == NULL);
1037 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
1039 private = (GdkWindowObject *)_gdk_root;
1040 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
1041 private->impl_window = private;
1043 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
1045 /* The size of the root window should be the same as the size of
1046 * the screen it belongs to.
1048 * FIXME: Of course this needs to be updated when you change the monitor
1049 * configuration (add another one, remove one, etc).
1055 private->width = gdk_screen_get_width (_gdk_screen);
1056 private->height = gdk_screen_get_height (_gdk_screen);
1058 private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
1059 private->window_type = GDK_WINDOW_ROOT;
1060 private->depth = 24;
1061 private->viewable = TRUE;
1063 drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
1065 drawable_impl->wrapper = GDK_DRAWABLE (private);
1066 drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
1067 g_object_ref (drawable_impl->colormap);
1071 _gdk_quartz_window_destroy (GdkWindow *window,
1073 gboolean foreign_destroy)
1075 GdkWindowObject *private;
1076 GdkWindowImplQuartz *impl;
1077 GdkWindowObject *parent;
1079 private = GDK_WINDOW_OBJECT (window);
1080 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1082 main_window_stack = g_slist_remove (main_window_stack, window);
1084 g_list_free (impl->sorted_children);
1085 impl->sorted_children = NULL;
1087 parent = private->parent;
1090 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
1092 parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
1095 _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
1097 if (!recursing && !foreign_destroy)
1099 GDK_QUARTZ_ALLOC_POOL;
1102 [impl->toplevel close];
1103 else if (impl->view)
1104 [impl->view removeFromSuperview];
1106 GDK_QUARTZ_RELEASE_POOL;
1111 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
1113 /* Foreign windows aren't supported in OSX. */
1116 /* FIXME: This might be possible to simplify with client-side windows. Also
1117 * note that already_mapped is not used yet, see the x11 backend.
1120 gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
1122 GdkWindowObject *private = (GdkWindowObject *)window;
1123 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1124 gboolean focus_on_map;
1126 GDK_QUARTZ_ALLOC_POOL;
1128 if (!GDK_WINDOW_IS_MAPPED (window))
1129 focus_on_map = private->focus_on_map;
1131 focus_on_map = TRUE;
1137 make_key = (private->accept_focus && focus_on_map &&
1138 private->window_type != GDK_WINDOW_TEMP);
1140 [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
1141 clear_toplevel_order ();
1143 _gdk_quartz_events_send_map_event (window);
1147 [impl->view setHidden:NO];
1150 [impl->view setNeedsDisplay:YES];
1152 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
1154 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1155 gdk_window_maximize (window);
1157 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1158 gdk_window_iconify (window);
1160 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1161 _gdk_quartz_window_attach_to_parent (window);
1163 GDK_QUARTZ_RELEASE_POOL;
1166 /* Temporarily unsets the parent window, if the window is a
1170 _gdk_quartz_window_detach_from_parent (GdkWindow *window)
1172 GdkWindowImplQuartz *impl;
1174 g_return_if_fail (GDK_IS_WINDOW (window));
1176 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1178 g_return_if_fail (impl->toplevel != NULL);
1180 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1182 GdkWindowImplQuartz *parent_impl;
1184 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1185 [parent_impl->toplevel removeChildWindow:impl->toplevel];
1186 clear_toplevel_order ();
1190 /* Re-sets the parent window, if the window is a transient. */
1192 _gdk_quartz_window_attach_to_parent (GdkWindow *window)
1194 GdkWindowImplQuartz *impl;
1196 g_return_if_fail (GDK_IS_WINDOW (window));
1198 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1200 g_return_if_fail (impl->toplevel != NULL);
1202 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1204 GdkWindowImplQuartz *parent_impl;
1206 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1207 [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
1208 clear_toplevel_order ();
1213 gdk_window_quartz_hide (GdkWindow *window)
1215 GdkWindowObject *private = (GdkWindowObject *)window;
1216 GdkWindowImplQuartz *impl;
1218 /* Make sure we're not stuck in fullscreen mode. */
1219 if (get_fullscreen_geometry (window))
1220 SetSystemUIMode (kUIModeNormal, 0);
1222 check_grab_unmap (window);
1224 _gdk_window_clear_update_area (window);
1226 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1230 /* Update main window. */
1231 main_window_stack = g_slist_remove (main_window_stack, window);
1232 if ([NSApp mainWindow] == impl->toplevel)
1233 _gdk_quartz_window_did_resign_main (window);
1235 if (impl->transient_for)
1236 _gdk_quartz_window_detach_from_parent (window);
1238 [(GdkQuartzWindow*)impl->toplevel hide];
1240 else if (impl->view)
1242 [impl->view setHidden:YES];
1247 gdk_window_quartz_withdraw (GdkWindow *window)
1249 gdk_window_hide (window);
1253 move_resize_window_internal (GdkWindow *window,
1259 GdkWindowObject *private = (GdkWindowObject *)window;
1260 GdkWindowImplQuartz *impl;
1261 GdkRectangle old_visible;
1262 GdkRectangle new_visible;
1263 GdkRectangle scroll_rect;
1264 GdkRegion *old_region;
1265 GdkRegion *expose_region;
1268 if (GDK_WINDOW_DESTROYED (window))
1271 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1273 if ((x == -1 || (x == private->x)) &&
1274 (y == -1 || (y == private->y)) &&
1275 (width == -1 || (width == private->width)) &&
1276 (height == -1 || (height == private->height)))
1281 if (!impl->toplevel)
1283 /* The previously visible area of this window in a coordinate
1284 * system rooted at the origin of this window.
1286 old_visible.x = -private->x;
1287 old_visible.y = -private->y;
1289 gdk_window_get_size (GDK_DRAWABLE (private->parent),
1291 &old_visible.height);
1296 delta.width = x - private->x;
1306 delta.height = y - private->y;
1315 private->width = width;
1318 private->height = height;
1320 GDK_QUARTZ_ALLOC_POOL;
1324 NSRect content_rect;
1327 content_rect = NSMakeRect (private->x,
1328 _gdk_quartz_window_get_inverted_screen_y (private->y + private->height),
1329 private->width, private->height);
1331 frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
1332 [impl->toplevel setFrame:frame_rect display:YES];
1336 if (!private->input_only)
1340 nsrect = NSMakeRect (private->x, private->y, private->width, private->height);
1342 /* The newly visible area of this window in a coordinate
1343 * system rooted at the origin of this window.
1345 new_visible.x = -private->x;
1346 new_visible.y = -private->y;
1347 new_visible.width = old_visible.width; /* parent has not changed size */
1348 new_visible.height = old_visible.height; /* parent has not changed size */
1350 expose_region = gdk_region_rectangle (&new_visible);
1351 old_region = gdk_region_rectangle (&old_visible);
1352 gdk_region_subtract (expose_region, old_region);
1354 /* Determine what (if any) part of the previously visible
1355 * part of the window can be copied without a redraw
1357 scroll_rect = old_visible;
1358 scroll_rect.x -= delta.width;
1359 scroll_rect.y -= delta.height;
1360 gdk_rectangle_intersect (&scroll_rect, &old_visible, &scroll_rect);
1362 if (!gdk_region_empty (expose_region))
1364 GdkRectangle* rects;
1368 if (scroll_rect.width != 0 && scroll_rect.height != 0)
1370 [impl->view scrollRect:NSMakeRect (scroll_rect.x,
1377 [impl->view setFrame:nsrect];
1379 gdk_region_get_rectangles (expose_region, &rects, &n_rects);
1381 for (n = 0; n < n_rects; ++n)
1382 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
1388 [impl->view setFrame:nsrect];
1389 [impl->view setNeedsDisplay:YES];
1392 gdk_region_destroy (expose_region);
1393 gdk_region_destroy (old_region);
1397 GDK_QUARTZ_RELEASE_POOL;
1401 window_quartz_move (GdkWindow *window,
1405 g_return_if_fail (GDK_IS_WINDOW (window));
1407 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1410 move_resize_window_internal (window, x, y, -1, -1);
1414 window_quartz_resize (GdkWindow *window,
1418 g_return_if_fail (GDK_IS_WINDOW (window));
1420 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1428 move_resize_window_internal (window, -1, -1, width, height);
1432 window_quartz_move_resize (GdkWindow *window,
1443 move_resize_window_internal (window, x, y, width, height);
1447 gdk_window_quartz_move_resize (GdkWindow *window,
1454 if (with_move && (width < 0 && height < 0))
1455 window_quartz_move (window, x, y);
1459 window_quartz_move_resize (window, x, y, width, height);
1461 window_quartz_resize (window, width, height);
1465 /* FIXME: This might need fixing (reparenting didn't work before client-side
1469 gdk_window_quartz_reparent (GdkWindow *window,
1470 GdkWindow *new_parent,
1474 GdkWindowObject *private, *old_parent_private, *new_parent_private;
1475 GdkWindowImplQuartz *impl, *old_parent_impl, *new_parent_impl;
1476 NSView *view, *new_parent_view;
1478 if (new_parent == _gdk_root)
1480 /* Could be added, just needs implementing. */
1481 g_warning ("Reparenting to root window is not supported yet in the Mac OS X backend");
1485 private = GDK_WINDOW_OBJECT (window);
1486 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1489 new_parent_private = GDK_WINDOW_OBJECT (new_parent);
1490 new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent_private->impl);
1491 new_parent_view = new_parent_impl->view;
1493 old_parent_private = GDK_WINDOW_OBJECT (private->parent);
1494 old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent_private->impl);
1498 [view removeFromSuperview];
1499 [new_parent_view addSubview:view];
1503 private->parent = new_parent_private;
1505 if (old_parent_private)
1507 old_parent_impl->sorted_children = g_list_remove (old_parent_impl->sorted_children, window);
1510 new_parent_impl->sorted_children = g_list_prepend (new_parent_impl->sorted_children, window);
1515 /* Get the toplevel ordering from NSApp and update our own list. We do
1516 * this on demand since the NSApp's list is not up to date directly
1517 * after we get windowDidBecomeMain.
1520 update_toplevel_order (void)
1522 GdkWindowObject *root;
1523 GdkWindowImplQuartz *root_impl;
1524 NSEnumerator *enumerator;
1526 GList *toplevels = NULL;
1528 root = GDK_WINDOW_OBJECT (_gdk_root);
1529 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1531 if (root_impl->sorted_children)
1534 GDK_QUARTZ_ALLOC_POOL;
1536 enumerator = [[NSApp orderedWindows] objectEnumerator];
1537 while ((nswindow = [enumerator nextObject]))
1541 if (![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
1544 window = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
1545 toplevels = g_list_prepend (toplevels, window);
1548 GDK_QUARTZ_RELEASE_POOL;
1550 root_impl->sorted_children = g_list_reverse (toplevels);
1554 clear_toplevel_order (void)
1556 GdkWindowObject *root;
1557 GdkWindowImplQuartz *root_impl;
1559 root = GDK_WINDOW_OBJECT (_gdk_root);
1560 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1562 g_list_free (root_impl->sorted_children);
1563 root_impl->sorted_children = NULL;
1567 gdk_window_quartz_raise (GdkWindow *window)
1569 if (GDK_WINDOW_DESTROYED (window))
1572 if (WINDOW_IS_TOPLEVEL (window))
1574 GdkWindowImplQuartz *impl;
1576 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1577 [impl->toplevel orderFront:impl->toplevel];
1579 clear_toplevel_order ();
1583 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1587 GdkWindowImplQuartz *impl;
1589 impl = (GdkWindowImplQuartz *)parent->impl;
1591 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1592 impl->sorted_children = g_list_prepend (impl->sorted_children, window);
1598 gdk_window_quartz_lower (GdkWindow *window)
1600 if (GDK_WINDOW_DESTROYED (window))
1603 if (WINDOW_IS_TOPLEVEL (window))
1605 GdkWindowImplQuartz *impl;
1607 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1608 [impl->toplevel orderBack:impl->toplevel];
1610 clear_toplevel_order ();
1614 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1618 GdkWindowImplQuartz *impl;
1620 impl = (GdkWindowImplQuartz *)parent->impl;
1622 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1623 impl->sorted_children = g_list_append (impl->sorted_children, window);
1629 gdk_window_quartz_restack_toplevel (GdkWindow *window,
1633 /* FIXME: Implement this */
1637 gdk_window_quartz_set_background (GdkWindow *window,
1638 const GdkColor *color)
1640 /* FIXME: We could theoretically set the background color for toplevels
1641 * here. (Currently we draw the background before emitting expose events)
1646 gdk_window_quartz_set_back_pixmap (GdkWindow *window,
1649 /* FIXME: Could theoretically set some background image here. (Currently
1650 * the back pixmap is drawn before emitting expose events.
1655 gdk_window_quartz_set_cursor (GdkWindow *window,
1658 GdkCursorPrivate *cursor_private;
1661 cursor_private = (GdkCursorPrivate *)cursor;
1663 if (GDK_WINDOW_DESTROYED (window))
1667 nscursor = [NSCursor arrowCursor];
1669 nscursor = cursor_private->nscursor;
1675 gdk_window_quartz_get_geometry (GdkWindow *window,
1682 GdkWindowImplQuartz *impl;
1683 GdkWindowObject *private;
1686 if (GDK_WINDOW_DESTROYED (window))
1689 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1690 private = GDK_WINDOW_OBJECT (window);
1691 if (window == _gdk_root)
1699 *width = private->width;
1701 *height = private->height;
1703 else if (WINDOW_IS_TOPLEVEL (window))
1705 ns_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1707 /* This doesn't work exactly as in X. There doesn't seem to be a
1708 * way to get the coords relative to the parent window (usually
1709 * the window frame), but that seems useless except for
1710 * borderless windows where it's relative to the root window. So
1711 * we return (0, 0) (should be something like (0, 22)) for
1712 * windows with borders and the root relative coordinates
1715 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
1718 *x = ns_rect.origin.x;
1720 *y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
1731 *width = ns_rect.size.width;
1733 *height = ns_rect.size.height;
1737 ns_rect = [impl->view frame];
1740 *x = ns_rect.origin.x;
1742 *y = ns_rect.origin.y;
1744 *width = ns_rect.size.width;
1746 *height = ns_rect.size.height;
1750 *depth = gdk_drawable_get_depth (window);
1754 gdk_window_quartz_get_root_coords (GdkWindow *window,
1760 GdkWindowObject *private;
1761 int tmp_x = 0, tmp_y = 0;
1762 GdkWindow *toplevel;
1763 NSRect content_rect;
1764 GdkWindowImplQuartz *impl;
1766 if (GDK_WINDOW_DESTROYED (window))
1776 if (window == _gdk_root)
1786 private = GDK_WINDOW_OBJECT (window);
1788 toplevel = gdk_window_get_toplevel (window);
1789 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1791 content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1793 tmp_x = x + content_rect.origin.x;
1794 tmp_y = y + _gdk_quartz_window_get_inverted_screen_y (content_rect.origin.y + content_rect.size.height);
1796 while (private != GDK_WINDOW_OBJECT (toplevel))
1798 if (_gdk_window_has_impl ((GdkWindow *)private))
1800 tmp_x += private->x;
1801 tmp_y += private->y;
1804 private = private->parent;
1816 gdk_window_quartz_get_deskrelative_origin (GdkWindow *window,
1820 return gdk_window_get_origin (window, x, y);
1824 gdk_window_get_root_origin (GdkWindow *window,
1833 gdk_window_get_frame_extents (window, &rect);
1842 /* Returns coordinates relative to the passed in window. */
1844 gdk_window_quartz_get_pointer_helper (GdkWindow *window,
1847 GdkModifierType *mask)
1849 GdkWindowObject *toplevel;
1850 GdkWindowObject *private;
1853 GdkWindow *found_window;
1855 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1857 if (GDK_WINDOW_DESTROYED (window))
1865 toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
1867 *mask = _gdk_quartz_events_get_current_event_mask ();
1869 /* Get the y coordinate, needs to be flipped. */
1870 if (window == _gdk_root)
1872 point = [NSEvent mouseLocation];
1874 y_tmp = _gdk_quartz_window_get_inverted_screen_y (point.y);
1878 GdkWindowImplQuartz *impl;
1881 impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
1882 private = GDK_WINDOW_OBJECT (toplevel);
1883 nswindow = impl->toplevel;
1885 point = [nswindow mouseLocationOutsideOfEventStream];
1888 y_tmp = private->height - point.y;
1890 window = (GdkWindow *)toplevel;
1893 found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp);
1895 /* We never return the root window. */
1896 if (found_window == _gdk_root)
1897 found_window = NULL;
1902 return found_window;
1906 gdk_window_quartz_get_pointer (GdkWindow *window,
1909 GdkModifierType *mask)
1911 return gdk_window_quartz_get_pointer_helper (window, x, y, mask) != NULL;
1914 /* Returns coordinates relative to the root. */
1916 _gdk_windowing_get_pointer (GdkDisplay *display,
1920 GdkModifierType *mask)
1922 g_return_if_fail (display == _gdk_display);
1924 *screen = _gdk_screen;
1925 gdk_window_quartz_get_pointer_helper (_gdk_root, x, y, mask);
1929 gdk_display_warp_pointer (GdkDisplay *display,
1934 CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
1937 /* Returns coordinates relative to the found window. */
1939 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1942 GdkModifierType *mask,
1943 gboolean get_toplevel)
1945 GdkWindow *found_window;
1947 GdkModifierType tmp_mask = 0;
1949 found_window = gdk_window_quartz_get_pointer_helper (_gdk_root,
1954 GdkWindowObject *private;
1956 /* The coordinates returned above are relative the root, we want
1957 * coordinates relative the window here.
1959 private = GDK_WINDOW_OBJECT (found_window);
1960 while (private != GDK_WINDOW_OBJECT (_gdk_root))
1965 private = private->parent;
1973 /* Mimic the X backend here, -1,-1 for unknown windows. */
1983 GdkWindowObject *w = (GdkWindowObject *)found_window;
1984 /* Requested toplevel, find it. */
1985 /* TODO: This can be implemented more efficient by never
1986 recursing into children in the first place */
1989 /* Convert to toplevel */
1990 while (w->parent != NULL &&
1991 w->parent->window_type != GDK_WINDOW_ROOT)
1997 found_window = (GdkWindow *)w;
2001 return found_window;
2005 gdk_window_quartz_get_events (GdkWindow *window)
2007 if (GDK_WINDOW_DESTROYED (window))
2010 return GDK_WINDOW_OBJECT (window)->event_mask;
2014 gdk_window_quartz_set_events (GdkWindow *window,
2015 GdkEventMask event_mask)
2017 /* The mask is set in the common code. */
2021 gdk_window_set_urgency_hint (GdkWindow *window,
2024 if (GDK_WINDOW_DESTROYED (window) ||
2025 !WINDOW_IS_TOPLEVEL (window))
2028 /* FIXME: Implement */
2032 gdk_window_set_geometry_hints (GdkWindow *window,
2033 const GdkGeometry *geometry,
2034 GdkWindowHints geom_mask)
2036 GdkWindowImplQuartz *impl;
2038 g_return_if_fail (geometry != NULL);
2040 if (GDK_WINDOW_DESTROYED (window) ||
2041 !WINDOW_IS_TOPLEVEL (window))
2044 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2045 if (!impl->toplevel)
2048 if (geom_mask & GDK_HINT_POS)
2050 /* FIXME: Implement */
2053 if (geom_mask & GDK_HINT_USER_POS)
2055 /* FIXME: Implement */
2058 if (geom_mask & GDK_HINT_USER_SIZE)
2060 /* FIXME: Implement */
2063 if (geom_mask & GDK_HINT_MIN_SIZE)
2067 size.width = geometry->min_width;
2068 size.height = geometry->min_height;
2070 [impl->toplevel setContentMinSize:size];
2073 if (geom_mask & GDK_HINT_MAX_SIZE)
2077 size.width = geometry->max_width;
2078 size.height = geometry->max_height;
2080 [impl->toplevel setContentMaxSize:size];
2083 if (geom_mask & GDK_HINT_BASE_SIZE)
2085 /* FIXME: Implement */
2088 if (geom_mask & GDK_HINT_RESIZE_INC)
2092 size.width = geometry->width_inc;
2093 size.height = geometry->height_inc;
2095 [impl->toplevel setContentResizeIncrements:size];
2098 if (geom_mask & GDK_HINT_ASPECT)
2100 /* FIXME: Implement */
2103 if (geom_mask & GDK_HINT_WIN_GRAVITY)
2105 /* FIXME: Implement */
2110 gdk_window_set_title (GdkWindow *window,
2113 GdkWindowImplQuartz *impl;
2115 g_return_if_fail (title != NULL);
2117 if (GDK_WINDOW_DESTROYED (window) ||
2118 !WINDOW_IS_TOPLEVEL (window))
2121 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
2125 GDK_QUARTZ_ALLOC_POOL;
2126 [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
2127 GDK_QUARTZ_RELEASE_POOL;
2132 gdk_window_set_role (GdkWindow *window,
2135 if (GDK_WINDOW_DESTROYED (window) ||
2136 WINDOW_IS_TOPLEVEL (window))
2139 /* FIXME: Implement */
2143 gdk_window_set_transient_for (GdkWindow *window,
2146 GdkWindowImplQuartz *window_impl;
2147 GdkWindowImplQuartz *parent_impl;
2149 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent) ||
2150 !WINDOW_IS_TOPLEVEL (window))
2153 window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2154 if (!window_impl->toplevel)
2157 GDK_QUARTZ_ALLOC_POOL;
2159 if (window_impl->transient_for)
2161 _gdk_quartz_window_detach_from_parent (window);
2163 g_object_unref (window_impl->transient_for);
2164 window_impl->transient_for = NULL;
2167 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
2168 if (parent_impl->toplevel)
2170 /* We save the parent because it needs to be unset/reset when
2171 * hiding and showing the window.
2174 /* We don't set transients for tooltips, they are already
2175 * handled by the window level being the top one. If we do, then
2176 * the parent window will be brought to the top just because the
2177 * tooltip is, which is not what we want.
2179 if (gdk_window_get_type_hint (window) != GDK_WINDOW_TYPE_HINT_TOOLTIP)
2181 window_impl->transient_for = g_object_ref (parent);
2183 /* We only add the window if it is shown, otherwise it will
2184 * be shown unconditionally here. If it is not shown, the
2185 * window will be added in show() instead.
2187 if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
2188 _gdk_quartz_window_attach_to_parent (window);
2192 GDK_QUARTZ_RELEASE_POOL;
2196 gdk_window_quartz_shape_combine_region (GdkWindow *window,
2197 const GdkRegion *shape,
2201 /* FIXME: Implement */
2205 gdk_window_quartz_input_shape_combine_region (GdkWindow *window,
2206 const GdkRegion *shape_region,
2210 /* FIXME: Implement */
2214 gdk_window_set_override_redirect (GdkWindow *window,
2215 gboolean override_redirect)
2217 /* FIXME: Implement */
2221 gdk_window_set_accept_focus (GdkWindow *window,
2222 gboolean accept_focus)
2224 GdkWindowObject *private;
2226 private = (GdkWindowObject *)window;
2228 private->accept_focus = accept_focus != FALSE;
2232 gdk_window_quartz_set_static_gravities (GdkWindow *window,
2233 gboolean use_static)
2235 if (GDK_WINDOW_DESTROYED (window) ||
2236 !WINDOW_IS_TOPLEVEL (window))
2239 /* FIXME: Implement */
2244 gdk_window_set_focus_on_map (GdkWindow *window,
2245 gboolean focus_on_map)
2247 GdkWindowObject *private;
2249 private = (GdkWindowObject *)window;
2251 private->focus_on_map = focus_on_map != FALSE;
2255 gdk_window_set_icon (GdkWindow *window,
2256 GdkWindow *icon_window,
2260 /* FIXME: Implement */
2264 gdk_window_set_icon_name (GdkWindow *window,
2267 /* FIXME: Implement */
2271 gdk_window_focus (GdkWindow *window,
2274 GdkWindowObject *private;
2275 GdkWindowImplQuartz *impl;
2277 private = (GdkWindowObject*) window;
2278 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2280 if (GDK_WINDOW_DESTROYED (window) ||
2281 !WINDOW_IS_TOPLEVEL (window))
2284 if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
2286 GDK_QUARTZ_ALLOC_POOL;
2287 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
2288 clear_toplevel_order ();
2289 GDK_QUARTZ_RELEASE_POOL;
2294 gdk_window_set_hints (GdkWindow *window,
2303 /* FIXME: Implement */
2307 gint window_type_hint_to_level (GdkWindowTypeHint hint)
2311 case GDK_WINDOW_TYPE_HINT_DOCK:
2312 case GDK_WINDOW_TYPE_HINT_UTILITY:
2313 return NSFloatingWindowLevel;
2315 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2316 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2317 return NSTornOffMenuWindowLevel;
2319 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2320 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2321 return NSStatusWindowLevel;
2323 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2324 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2325 case GDK_WINDOW_TYPE_HINT_COMBO:
2326 case GDK_WINDOW_TYPE_HINT_DND:
2327 return NSPopUpMenuWindowLevel;
2329 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2330 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2331 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2332 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2339 return NSNormalWindowLevel;
2343 window_type_hint_to_shadow (GdkWindowTypeHint hint)
2347 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2348 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2349 case GDK_WINDOW_TYPE_HINT_DOCK:
2350 case GDK_WINDOW_TYPE_HINT_UTILITY:
2351 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2352 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2353 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2354 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2355 case GDK_WINDOW_TYPE_HINT_COMBO:
2356 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2357 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2360 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2361 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2362 case GDK_WINDOW_TYPE_HINT_DND:
2374 gdk_window_set_type_hint (GdkWindow *window,
2375 GdkWindowTypeHint hint)
2377 GdkWindowImplQuartz *impl;
2379 if (GDK_WINDOW_DESTROYED (window) ||
2380 !WINDOW_IS_TOPLEVEL (window))
2383 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2385 impl->type_hint = hint;
2387 /* Match the documentation, only do something if we're not mapped yet. */
2388 if (GDK_WINDOW_IS_MAPPED (window))
2391 [impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
2392 [impl->toplevel setLevel: window_type_hint_to_level (hint)];
2396 gdk_window_get_type_hint (GdkWindow *window)
2398 if (GDK_WINDOW_DESTROYED (window) ||
2399 !WINDOW_IS_TOPLEVEL (window))
2400 return GDK_WINDOW_TYPE_HINT_NORMAL;
2402 return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
2406 gdk_window_set_modal_hint (GdkWindow *window,
2409 if (GDK_WINDOW_DESTROYED (window) ||
2410 !WINDOW_IS_TOPLEVEL (window))
2413 /* FIXME: Implement */
2417 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2418 gboolean skips_taskbar)
2420 if (GDK_WINDOW_DESTROYED (window) ||
2421 !WINDOW_IS_TOPLEVEL (window))
2424 /* FIXME: Implement */
2428 gdk_window_set_skip_pager_hint (GdkWindow *window,
2429 gboolean skips_pager)
2431 if (GDK_WINDOW_DESTROYED (window) ||
2432 !WINDOW_IS_TOPLEVEL (window))
2435 /* FIXME: Implement */
2439 gdk_window_begin_resize_drag (GdkWindow *window,
2446 GdkWindowObject *private;
2447 GdkWindowImplQuartz *impl;
2449 g_return_if_fail (GDK_IS_WINDOW (window));
2451 if (edge != GDK_WINDOW_EDGE_SOUTH_EAST)
2453 g_warning ("Resizing is only implemented for GDK_WINDOW_EDGE_SOUTH_EAST on Mac OS");
2457 if (GDK_WINDOW_DESTROYED (window))
2460 private = GDK_WINDOW_OBJECT (window);
2461 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2463 if (!impl->toplevel)
2465 g_warning ("Can't call gdk_window_begin_resize_drag on non-toplevel window");
2469 [(GdkQuartzWindow *)impl->toplevel beginManualResize];
2473 gdk_window_begin_move_drag (GdkWindow *window,
2479 GdkWindowObject *private;
2480 GdkWindowImplQuartz *impl;
2482 if (GDK_WINDOW_DESTROYED (window) ||
2483 !WINDOW_IS_TOPLEVEL (window))
2486 private = GDK_WINDOW_OBJECT (window);
2487 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2489 if (!impl->toplevel)
2491 g_warning ("Can't call gdk_window_begin_move_drag on non-toplevel window");
2495 [(GdkQuartzWindow *)impl->toplevel beginManualMove];
2499 gdk_window_set_icon_list (GdkWindow *window,
2502 /* FIXME: Implement */
2506 gdk_window_get_frame_extents (GdkWindow *window,
2509 GdkWindowObject *private;
2510 GdkWindow *toplevel;
2511 GdkWindowImplQuartz *impl;
2514 g_return_if_fail (rect != NULL);
2516 private = GDK_WINDOW_OBJECT (window);
2523 toplevel = gdk_window_get_toplevel (window);
2524 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
2526 ns_rect = [impl->toplevel frame];
2528 rect->x = ns_rect.origin.x;
2529 rect->y = _gdk_quartz_window_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
2530 rect->width = ns_rect.size.width;
2531 rect->height = ns_rect.size.height;
2535 gdk_window_set_decorations (GdkWindow *window,
2536 GdkWMDecoration decorations)
2538 GdkWindowImplQuartz *impl;
2539 int old_mask, new_mask;
2542 if (GDK_WINDOW_DESTROYED (window) ||
2543 !WINDOW_IS_TOPLEVEL (window))
2546 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2548 if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP ||
2549 impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN )
2551 new_mask = NSBorderlessWindowMask;
2555 /* FIXME: Honor other GDK_DECOR_* flags. */
2556 new_mask = (NSTitledWindowMask | NSClosableWindowMask |
2557 NSMiniaturizableWindowMask | NSResizableWindowMask);
2560 GDK_QUARTZ_ALLOC_POOL;
2562 old_mask = [impl->toplevel styleMask];
2564 /* Note, there doesn't seem to be a way to change this without
2565 * recreating the toplevel. There might be bad side-effects of doing
2566 * that, but it seems alright.
2568 if (old_mask != new_mask)
2572 old_view = [impl->toplevel contentView];
2574 rect = [impl->toplevel frame];
2576 /* Properly update the size of the window when the titlebar is
2579 if (old_mask == NSBorderlessWindowMask &&
2580 new_mask != NSBorderlessWindowMask)
2582 rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
2585 else if (old_mask != NSBorderlessWindowMask &&
2586 new_mask == NSBorderlessWindowMask)
2588 rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask];
2591 impl->toplevel = [impl->toplevel initWithContentRect:rect
2593 backing:NSBackingStoreBuffered
2596 [impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)];
2597 [impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)];
2599 [impl->toplevel setContentView:old_view];
2600 [impl->toplevel setFrame:rect display:YES];
2602 /* Invalidate the window shadow for non-opaque views that have shadow
2603 * enabled, to get the shadow shape updated.
2605 if (![old_view isOpaque] && [impl->toplevel hasShadow])
2606 [(GdkQuartzView*)old_view setNeedsInvalidateShadow:YES];
2609 GDK_QUARTZ_RELEASE_POOL;
2613 gdk_window_get_decorations (GdkWindow *window,
2614 GdkWMDecoration *decorations)
2616 GdkWindowImplQuartz *impl;
2618 if (GDK_WINDOW_DESTROYED (window) ||
2619 !WINDOW_IS_TOPLEVEL (window))
2622 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2626 /* Borderless is 0, so we can't check it as a bit being set. */
2627 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
2633 /* FIXME: Honor the other GDK_DECOR_* flags. */
2634 *decorations = GDK_DECOR_ALL;
2642 gdk_window_set_functions (GdkWindow *window,
2643 GdkWMFunction functions)
2645 g_return_if_fail (GDK_IS_WINDOW (window));
2647 /* FIXME: Implement */
2651 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
2658 gdk_window_stick (GdkWindow *window)
2660 if (GDK_WINDOW_DESTROYED (window) ||
2661 !WINDOW_IS_TOPLEVEL (window))
2666 gdk_window_unstick (GdkWindow *window)
2668 if (GDK_WINDOW_DESTROYED (window) ||
2669 !WINDOW_IS_TOPLEVEL (window))
2674 gdk_window_maximize (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,
2697 GDK_WINDOW_STATE_MAXIMIZED);
2702 gdk_window_unmaximize (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;
2716 if (impl->toplevel && [impl->toplevel isZoomed])
2717 [impl->toplevel zoom:nil];
2719 GDK_QUARTZ_RELEASE_POOL;
2723 gdk_synthesize_window_state (window,
2724 GDK_WINDOW_STATE_MAXIMIZED,
2730 gdk_window_iconify (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 miniaturize:nil];
2747 GDK_QUARTZ_RELEASE_POOL;
2751 gdk_synthesize_window_state (window,
2753 GDK_WINDOW_STATE_ICONIFIED);
2758 gdk_window_deiconify (GdkWindow *window)
2760 GdkWindowImplQuartz *impl;
2762 if (GDK_WINDOW_DESTROYED (window) ||
2763 !WINDOW_IS_TOPLEVEL (window))
2766 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2768 if (GDK_WINDOW_IS_MAPPED (window))
2770 GDK_QUARTZ_ALLOC_POOL;
2773 [impl->toplevel deminiaturize:nil];
2775 GDK_QUARTZ_RELEASE_POOL;
2779 gdk_synthesize_window_state (window,
2780 GDK_WINDOW_STATE_ICONIFIED,
2785 static FullscreenSavedGeometry *
2786 get_fullscreen_geometry (GdkWindow *window)
2788 return g_object_get_data (G_OBJECT (window), FULLSCREEN_DATA);
2792 gdk_window_fullscreen (GdkWindow *window)
2794 FullscreenSavedGeometry *geometry;
2795 GdkWindowObject *private = (GdkWindowObject *) window;
2798 if (GDK_WINDOW_DESTROYED (window) ||
2799 !WINDOW_IS_TOPLEVEL (window))
2802 geometry = get_fullscreen_geometry (window);
2805 geometry = g_new (FullscreenSavedGeometry, 1);
2807 geometry->x = private->x;
2808 geometry->y = private->y;
2809 geometry->width = private->width;
2810 geometry->height = private->height;
2812 if (!gdk_window_get_decorations (window, &geometry->decor))
2813 geometry->decor = GDK_DECOR_ALL;
2815 g_object_set_data_full (G_OBJECT (window),
2816 FULLSCREEN_DATA, geometry,
2819 gdk_window_set_decorations (window, 0);
2821 frame = [[NSScreen mainScreen] frame];
2822 move_resize_window_internal (window,
2824 frame.size.width, frame.size.height);
2827 SetSystemUIMode (kUIModeAllHidden, kUIOptionAutoShowMenuBar);
2829 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
2833 gdk_window_unfullscreen (GdkWindow *window)
2835 FullscreenSavedGeometry *geometry;
2837 if (GDK_WINDOW_DESTROYED (window) ||
2838 !WINDOW_IS_TOPLEVEL (window))
2841 geometry = get_fullscreen_geometry (window);
2844 SetSystemUIMode (kUIModeNormal, 0);
2846 move_resize_window_internal (window,
2852 gdk_window_set_decorations (window, geometry->decor);
2854 g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL);
2856 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
2861 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2863 GdkWindowObject *private = (GdkWindowObject *) window;
2864 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2867 g_return_if_fail (GDK_IS_WINDOW (window));
2869 if (GDK_WINDOW_DESTROYED (window) ||
2870 !WINDOW_IS_TOPLEVEL (window))
2873 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2875 /* Adjust normal window level by one if necessary. */
2876 [impl->toplevel setLevel: level + (setting ? 1 : 0)];
2880 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2882 GdkWindowObject *private = (GdkWindowObject *) window;
2883 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2886 g_return_if_fail (GDK_IS_WINDOW (window));
2888 if (GDK_WINDOW_DESTROYED (window) ||
2889 !WINDOW_IS_TOPLEVEL (window))
2892 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2894 /* Adjust normal window level by one if necessary. */
2895 [impl->toplevel setLevel: level - (setting ? 1 : 0)];
2899 gdk_window_get_group (GdkWindow *window)
2901 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2903 if (GDK_WINDOW_DESTROYED (window) ||
2904 !WINDOW_IS_TOPLEVEL (window))
2907 /* FIXME: Implement */
2913 gdk_window_set_group (GdkWindow *window,
2916 /* FIXME: Implement */
2920 gdk_window_foreign_new_for_display (GdkDisplay *display,
2921 GdkNativeWindow anid)
2923 /* Foreign windows aren't supported in Mac OS X */
2928 gdk_window_lookup (GdkNativeWindow anid)
2930 /* Foreign windows aren't supported in Mac OS X */
2935 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
2937 /* Foreign windows aren't supported in Mac OS X */
2942 gdk_window_enable_synchronized_configure (GdkWindow *window)
2947 gdk_window_configure_finished (GdkWindow *window)
2952 gdk_window_destroy_notify (GdkWindow *window)
2954 check_grab_destroy (window);
2958 _gdk_windowing_window_beep (GdkWindow *window)
2960 g_return_if_fail (GDK_IS_WINDOW (window));
2962 gdk_display_beep (_gdk_display);
2966 gdk_window_set_opacity (GdkWindow *window,
2969 GdkWindowObject *private = (GdkWindowObject *) window;
2970 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2972 g_return_if_fail (GDK_IS_WINDOW (window));
2973 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
2975 if (GDK_WINDOW_DESTROYED (window) ||
2976 !WINDOW_IS_TOPLEVEL (window))
2981 else if (opacity > 1)
2984 [impl->toplevel setAlphaValue: opacity];
2988 _gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)
2993 _gdk_windowing_get_shape_for_mask (GdkBitmap *mask)
2995 /* FIXME: implement */
3000 _gdk_windowing_window_get_shape (GdkWindow *window)
3002 /* FIXME: implement */
3007 _gdk_windowing_window_get_input_shape (GdkWindow *window)
3009 /* FIXME: implement */
3014 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
3016 iface->show = gdk_window_quartz_show;
3017 iface->hide = gdk_window_quartz_hide;
3018 iface->withdraw = gdk_window_quartz_withdraw;
3019 iface->set_events = gdk_window_quartz_set_events;
3020 iface->get_events = gdk_window_quartz_get_events;
3021 iface->raise = gdk_window_quartz_raise;
3022 iface->lower = gdk_window_quartz_lower;
3023 iface->restack_toplevel = gdk_window_quartz_restack_toplevel;
3024 iface->move_resize = gdk_window_quartz_move_resize;
3025 iface->set_background = gdk_window_quartz_set_background;
3026 iface->set_back_pixmap = gdk_window_quartz_set_back_pixmap;
3027 iface->reparent = gdk_window_quartz_reparent;
3028 iface->set_cursor = gdk_window_quartz_set_cursor;
3029 iface->get_geometry = gdk_window_quartz_get_geometry;
3030 iface->get_root_coords = gdk_window_quartz_get_root_coords;
3031 iface->get_pointer = gdk_window_quartz_get_pointer;
3032 iface->get_deskrelative_origin = gdk_window_quartz_get_deskrelative_origin;
3033 iface->shape_combine_region = gdk_window_quartz_shape_combine_region;
3034 iface->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
3035 iface->set_static_gravities = gdk_window_quartz_set_static_gravities;
3036 iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
3037 iface->queue_translation = _gdk_quartz_window_queue_translation;
3038 iface->destroy = _gdk_quartz_window_destroy;
3039 iface->input_window_destroy = _gdk_input_window_destroy;
3040 iface->input_window_crossing = _gdk_input_window_crossing;